threadwell 0.0.0 → 0.0.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 (861) hide show
  1. package/CHANGELOG.md +4170 -0
  2. package/README.md +668 -13
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +9 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/bun/restore-sandbox-env.d.ts +13 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +32 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +53 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +341 -0
  18. package/dist/cli/args.js.map +1 -0
  19. package/dist/cli/config-selector.d.ts +14 -0
  20. package/dist/cli/config-selector.d.ts.map +1 -0
  21. package/dist/cli/config-selector.js +31 -0
  22. package/dist/cli/config-selector.js.map +1 -0
  23. package/dist/cli/file-processor.d.ts +15 -0
  24. package/dist/cli/file-processor.d.ts.map +1 -0
  25. package/dist/cli/file-processor.js +83 -0
  26. package/dist/cli/file-processor.js.map +1 -0
  27. package/dist/cli/initial-message.d.ts +18 -0
  28. package/dist/cli/initial-message.d.ts.map +1 -0
  29. package/dist/cli/initial-message.js +22 -0
  30. package/dist/cli/initial-message.js.map +1 -0
  31. package/dist/cli/list-models.d.ts +9 -0
  32. package/dist/cli/list-models.d.ts.map +1 -0
  33. package/dist/cli/list-models.js +98 -0
  34. package/dist/cli/list-models.js.map +1 -0
  35. package/dist/cli/session-picker.d.ts +9 -0
  36. package/dist/cli/session-picker.d.ts.map +1 -0
  37. package/dist/cli/session-picker.js +35 -0
  38. package/dist/cli/session-picker.js.map +1 -0
  39. package/dist/cli.d.ts +3 -0
  40. package/dist/cli.d.ts.map +1 -0
  41. package/dist/cli.js +19 -3
  42. package/dist/cli.js.map +1 -0
  43. package/dist/config.d.ts +93 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +404 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/core/agent-session-runtime.d.ts +117 -0
  48. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  49. package/dist/core/agent-session-runtime.js +300 -0
  50. package/dist/core/agent-session-runtime.js.map +1 -0
  51. package/dist/core/agent-session-services.d.ts +86 -0
  52. package/dist/core/agent-session-services.d.ts.map +1 -0
  53. package/dist/core/agent-session-services.js +117 -0
  54. package/dist/core/agent-session-services.js.map +1 -0
  55. package/dist/core/agent-session.d.ts +659 -0
  56. package/dist/core/agent-session.d.ts.map +1 -0
  57. package/dist/core/agent-session.js +3210 -0
  58. package/dist/core/agent-session.js.map +1 -0
  59. package/dist/core/auth-guidance.d.ts +5 -0
  60. package/dist/core/auth-guidance.d.ts.map +1 -0
  61. package/dist/core/auth-guidance.js +21 -0
  62. package/dist/core/auth-guidance.js.map +1 -0
  63. package/dist/core/auth-storage.d.ts +141 -0
  64. package/dist/core/auth-storage.d.ts.map +1 -0
  65. package/dist/core/auth-storage.js +441 -0
  66. package/dist/core/auth-storage.js.map +1 -0
  67. package/dist/core/bash-executor.d.ts +32 -0
  68. package/dist/core/bash-executor.d.ts.map +1 -0
  69. package/dist/core/bash-executor.js +111 -0
  70. package/dist/core/bash-executor.js.map +1 -0
  71. package/dist/core/compaction/branch-summarization.d.ts +88 -0
  72. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  73. package/dist/core/compaction/branch-summarization.js +243 -0
  74. package/dist/core/compaction/branch-summarization.js.map +1 -0
  75. package/dist/core/compaction/compaction.d.ts +121 -0
  76. package/dist/core/compaction/compaction.d.ts.map +1 -0
  77. package/dist/core/compaction/compaction.js +615 -0
  78. package/dist/core/compaction/compaction.js.map +1 -0
  79. package/dist/core/compaction/index.d.ts +7 -0
  80. package/dist/core/compaction/index.d.ts.map +1 -0
  81. package/dist/core/compaction/index.js +7 -0
  82. package/dist/core/compaction/index.js.map +1 -0
  83. package/dist/core/compaction/utils.d.ts +38 -0
  84. package/dist/core/compaction/utils.d.ts.map +1 -0
  85. package/dist/core/compaction/utils.js +153 -0
  86. package/dist/core/compaction/utils.js.map +1 -0
  87. package/dist/core/continuity/continuity-files.d.ts +79 -0
  88. package/dist/core/continuity/continuity-files.d.ts.map +1 -0
  89. package/dist/core/continuity/continuity-files.js +326 -0
  90. package/dist/core/continuity/continuity-files.js.map +1 -0
  91. package/dist/core/continuity/continuity-intent-router.d.ts +9 -0
  92. package/dist/core/continuity/continuity-intent-router.d.ts.map +1 -0
  93. package/dist/core/continuity/continuity-intent-router.js +96 -0
  94. package/dist/core/continuity/continuity-intent-router.js.map +1 -0
  95. package/dist/core/continuity/continuity-manager.d.ts +28 -0
  96. package/dist/core/continuity/continuity-manager.d.ts.map +1 -0
  97. package/dist/core/continuity/continuity-manager.js +288 -0
  98. package/dist/core/continuity/continuity-manager.js.map +1 -0
  99. package/dist/core/continuity/continuity-service.d.ts +22 -0
  100. package/dist/core/continuity/continuity-service.d.ts.map +1 -0
  101. package/dist/core/continuity/continuity-service.js +34 -0
  102. package/dist/core/continuity/continuity-service.js.map +1 -0
  103. package/dist/core/continuity/index.d.ts +5 -0
  104. package/dist/core/continuity/index.d.ts.map +1 -0
  105. package/dist/core/continuity/index.js +5 -0
  106. package/dist/core/continuity/index.js.map +1 -0
  107. package/dist/core/defaults.d.ts +3 -0
  108. package/dist/core/defaults.d.ts.map +1 -0
  109. package/dist/core/defaults.js +2 -0
  110. package/dist/core/defaults.js.map +1 -0
  111. package/dist/core/diagnostics.d.ts +15 -0
  112. package/dist/core/diagnostics.d.ts.map +1 -0
  113. package/dist/core/diagnostics.js +2 -0
  114. package/dist/core/diagnostics.js.map +1 -0
  115. package/dist/core/event-bus.d.ts +9 -0
  116. package/dist/core/event-bus.d.ts.map +1 -0
  117. package/dist/core/event-bus.js +25 -0
  118. package/dist/core/event-bus.js.map +1 -0
  119. package/dist/core/exec.d.ts +29 -0
  120. package/dist/core/exec.d.ts.map +1 -0
  121. package/dist/core/exec.js +75 -0
  122. package/dist/core/exec.js.map +1 -0
  123. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  124. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  125. package/dist/core/export-html/ansi-to-html.js +249 -0
  126. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  127. package/dist/core/export-html/index.d.ts +37 -0
  128. package/dist/core/export-html/index.d.ts.map +1 -0
  129. package/dist/core/export-html/index.js +224 -0
  130. package/dist/core/export-html/index.js.map +1 -0
  131. package/dist/core/export-html/template.css +1066 -0
  132. package/dist/core/export-html/template.html +55 -0
  133. package/dist/core/export-html/template.js +1834 -0
  134. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  135. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  136. package/dist/core/export-html/tool-renderer.js +108 -0
  137. package/dist/core/export-html/tool-renderer.js.map +1 -0
  138. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  139. package/dist/core/export-html/vendor/marked.min.js +6 -0
  140. package/dist/core/extensions/index.d.ts +12 -0
  141. package/dist/core/extensions/index.d.ts.map +1 -0
  142. package/dist/core/extensions/index.js +9 -0
  143. package/dist/core/extensions/index.js.map +1 -0
  144. package/dist/core/extensions/loader.d.ts +24 -0
  145. package/dist/core/extensions/loader.d.ts.map +1 -0
  146. package/dist/core/extensions/loader.js +485 -0
  147. package/dist/core/extensions/loader.js.map +1 -0
  148. package/dist/core/extensions/runner.d.ts +159 -0
  149. package/dist/core/extensions/runner.d.ts.map +1 -0
  150. package/dist/core/extensions/runner.js +824 -0
  151. package/dist/core/extensions/runner.js.map +1 -0
  152. package/dist/core/extensions/types.d.ts +1173 -0
  153. package/dist/core/extensions/types.d.ts.map +1 -0
  154. package/dist/core/extensions/types.js +45 -0
  155. package/dist/core/extensions/types.js.map +1 -0
  156. package/dist/core/extensions/wrapper.d.ts +20 -0
  157. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  158. package/dist/core/extensions/wrapper.js +22 -0
  159. package/dist/core/extensions/wrapper.js.map +1 -0
  160. package/dist/core/footer-data-provider.d.ts +72 -0
  161. package/dist/core/footer-data-provider.d.ts.map +1 -0
  162. package/dist/core/footer-data-provider.js +374 -0
  163. package/dist/core/footer-data-provider.js.map +1 -0
  164. package/dist/core/identity.d.ts +8 -0
  165. package/dist/core/identity.d.ts.map +1 -0
  166. package/dist/core/identity.js +8 -0
  167. package/dist/core/identity.js.map +1 -0
  168. package/dist/core/index.d.ts +12 -0
  169. package/dist/core/index.d.ts.map +1 -0
  170. package/dist/core/index.js +12 -0
  171. package/dist/core/index.js.map +1 -0
  172. package/dist/core/keybindings.d.ts +353 -0
  173. package/dist/core/keybindings.d.ts.map +1 -0
  174. package/dist/core/keybindings.js +295 -0
  175. package/dist/core/keybindings.js.map +1 -0
  176. package/dist/core/memory/adr/adr-candidates.d.ts +15 -0
  177. package/dist/core/memory/adr/adr-candidates.d.ts.map +1 -0
  178. package/dist/core/memory/adr/adr-candidates.js +63 -0
  179. package/dist/core/memory/adr/adr-candidates.js.map +1 -0
  180. package/dist/core/memory/adr/adr-format.d.ts +31 -0
  181. package/dist/core/memory/adr/adr-format.d.ts.map +1 -0
  182. package/dist/core/memory/adr/adr-format.js +138 -0
  183. package/dist/core/memory/adr/adr-format.js.map +1 -0
  184. package/dist/core/memory/adr/adr-service.d.ts +19 -0
  185. package/dist/core/memory/adr/adr-service.d.ts.map +1 -0
  186. package/dist/core/memory/adr/adr-service.js +63 -0
  187. package/dist/core/memory/adr/adr-service.js.map +1 -0
  188. package/dist/core/memory/adr/index.d.ts +4 -0
  189. package/dist/core/memory/adr/index.d.ts.map +1 -0
  190. package/dist/core/memory/adr/index.js +4 -0
  191. package/dist/core/memory/adr/index.js.map +1 -0
  192. package/dist/core/memory/content-ref.d.ts +22 -0
  193. package/dist/core/memory/content-ref.d.ts.map +1 -0
  194. package/dist/core/memory/content-ref.js +34 -0
  195. package/dist/core/memory/content-ref.js.map +1 -0
  196. package/dist/core/memory/context/context-candidates.d.ts +9 -0
  197. package/dist/core/memory/context/context-candidates.d.ts.map +1 -0
  198. package/dist/core/memory/context/context-candidates.js +64 -0
  199. package/dist/core/memory/context/context-candidates.js.map +1 -0
  200. package/dist/core/memory/context/context-diagnostics.d.ts +12 -0
  201. package/dist/core/memory/context/context-diagnostics.d.ts.map +1 -0
  202. package/dist/core/memory/context/context-diagnostics.js +50 -0
  203. package/dist/core/memory/context/context-diagnostics.js.map +1 -0
  204. package/dist/core/memory/context/context-format.d.ts +41 -0
  205. package/dist/core/memory/context/context-format.d.ts.map +1 -0
  206. package/dist/core/memory/context/context-format.js +199 -0
  207. package/dist/core/memory/context/context-format.js.map +1 -0
  208. package/dist/core/memory/context/index.d.ts +4 -0
  209. package/dist/core/memory/context/index.d.ts.map +1 -0
  210. package/dist/core/memory/context/index.js +4 -0
  211. package/dist/core/memory/context/index.js.map +1 -0
  212. package/dist/core/memory/context-pressure.d.ts +15 -0
  213. package/dist/core/memory/context-pressure.d.ts.map +1 -0
  214. package/dist/core/memory/context-pressure.js +36 -0
  215. package/dist/core/memory/context-pressure.js.map +1 -0
  216. package/dist/core/memory/continuity-import.d.ts +6 -0
  217. package/dist/core/memory/continuity-import.d.ts.map +1 -0
  218. package/dist/core/memory/continuity-import.js +63 -0
  219. package/dist/core/memory/continuity-import.js.map +1 -0
  220. package/dist/core/memory/dedupe.d.ts +10 -0
  221. package/dist/core/memory/dedupe.d.ts.map +1 -0
  222. package/dist/core/memory/dedupe.js +36 -0
  223. package/dist/core/memory/dedupe.js.map +1 -0
  224. package/dist/core/memory/embedding-adapter.d.ts +20 -0
  225. package/dist/core/memory/embedding-adapter.d.ts.map +1 -0
  226. package/dist/core/memory/embedding-adapter.js +11 -0
  227. package/dist/core/memory/embedding-adapter.js.map +1 -0
  228. package/dist/core/memory/event-summary.d.ts +7 -0
  229. package/dist/core/memory/event-summary.d.ts.map +1 -0
  230. package/dist/core/memory/event-summary.js +23 -0
  231. package/dist/core/memory/event-summary.js.map +1 -0
  232. package/dist/core/memory/feature/feature-format.d.ts +30 -0
  233. package/dist/core/memory/feature/feature-format.d.ts.map +1 -0
  234. package/dist/core/memory/feature/feature-format.js +121 -0
  235. package/dist/core/memory/feature/feature-format.js.map +1 -0
  236. package/dist/core/memory/feature/index.d.ts +2 -0
  237. package/dist/core/memory/feature/index.d.ts.map +1 -0
  238. package/dist/core/memory/feature/index.js +2 -0
  239. package/dist/core/memory/feature/index.js.map +1 -0
  240. package/dist/core/memory/ignore.d.ts +5 -0
  241. package/dist/core/memory/ignore.d.ts.map +1 -0
  242. package/dist/core/memory/ignore.js +26 -0
  243. package/dist/core/memory/ignore.js.map +1 -0
  244. package/dist/core/memory/index.d.ts +21 -0
  245. package/dist/core/memory/index.d.ts.map +1 -0
  246. package/dist/core/memory/index.js +20 -0
  247. package/dist/core/memory/index.js.map +1 -0
  248. package/dist/core/memory/memory-anchors.d.ts +11 -0
  249. package/dist/core/memory/memory-anchors.d.ts.map +1 -0
  250. package/dist/core/memory/memory-anchors.js +35 -0
  251. package/dist/core/memory/memory-anchors.js.map +1 -0
  252. package/dist/core/memory/memory-identity.d.ts +11 -0
  253. package/dist/core/memory/memory-identity.d.ts.map +1 -0
  254. package/dist/core/memory/memory-identity.js +19 -0
  255. package/dist/core/memory/memory-identity.js.map +1 -0
  256. package/dist/core/memory/memory-retrieval.d.ts +55 -0
  257. package/dist/core/memory/memory-retrieval.d.ts.map +1 -0
  258. package/dist/core/memory/memory-retrieval.js +128 -0
  259. package/dist/core/memory/memory-retrieval.js.map +1 -0
  260. package/dist/core/memory/memory-schema.d.ts +11 -0
  261. package/dist/core/memory/memory-schema.d.ts.map +1 -0
  262. package/dist/core/memory/memory-schema.js +111 -0
  263. package/dist/core/memory/memory-schema.js.map +1 -0
  264. package/dist/core/memory/memory-service.d.ts +35 -0
  265. package/dist/core/memory/memory-service.d.ts.map +1 -0
  266. package/dist/core/memory/memory-service.js +125 -0
  267. package/dist/core/memory/memory-service.js.map +1 -0
  268. package/dist/core/memory/memory-store.d.ts +37 -0
  269. package/dist/core/memory/memory-store.d.ts.map +1 -0
  270. package/dist/core/memory/memory-store.js +109 -0
  271. package/dist/core/memory/memory-store.js.map +1 -0
  272. package/dist/core/memory/memory-types.d.ts +55 -0
  273. package/dist/core/memory/memory-types.d.ts.map +1 -0
  274. package/dist/core/memory/memory-types.js +2 -0
  275. package/dist/core/memory/memory-types.js.map +1 -0
  276. package/dist/core/memory/redaction.d.ts +4 -0
  277. package/dist/core/memory/redaction.d.ts.map +1 -0
  278. package/dist/core/memory/redaction.js +49 -0
  279. package/dist/core/memory/redaction.js.map +1 -0
  280. package/dist/core/memory/sqlite-memory-store.d.ts +30 -0
  281. package/dist/core/memory/sqlite-memory-store.d.ts.map +1 -0
  282. package/dist/core/memory/sqlite-memory-store.js +300 -0
  283. package/dist/core/memory/sqlite-memory-store.js.map +1 -0
  284. package/dist/core/memory/startup-order.d.ts +9 -0
  285. package/dist/core/memory/startup-order.d.ts.map +1 -0
  286. package/dist/core/memory/startup-order.js +39 -0
  287. package/dist/core/memory/startup-order.js.map +1 -0
  288. package/dist/core/messages.d.ts +77 -0
  289. package/dist/core/messages.d.ts.map +1 -0
  290. package/dist/core/messages.js +123 -0
  291. package/dist/core/messages.js.map +1 -0
  292. package/dist/core/model-registry.d.ts +150 -0
  293. package/dist/core/model-registry.d.ts.map +1 -0
  294. package/dist/core/model-registry.js +727 -0
  295. package/dist/core/model-registry.js.map +1 -0
  296. package/dist/core/model-resolver.d.ts +110 -0
  297. package/dist/core/model-resolver.d.ts.map +1 -0
  298. package/dist/core/model-resolver.js +494 -0
  299. package/dist/core/model-resolver.js.map +1 -0
  300. package/dist/core/output-guard.d.ts +6 -0
  301. package/dist/core/output-guard.d.ts.map +1 -0
  302. package/dist/core/output-guard.js +59 -0
  303. package/dist/core/output-guard.js.map +1 -0
  304. package/dist/core/package-manager.d.ts +198 -0
  305. package/dist/core/package-manager.d.ts.map +1 -0
  306. package/dist/core/package-manager.js +1961 -0
  307. package/dist/core/package-manager.js.map +1 -0
  308. package/dist/core/prompt-templates.d.ts +52 -0
  309. package/dist/core/prompt-templates.d.ts.map +1 -0
  310. package/dist/core/prompt-templates.js +250 -0
  311. package/dist/core/prompt-templates.js.map +1 -0
  312. package/dist/core/provider-display-names.d.ts +2 -0
  313. package/dist/core/provider-display-names.d.ts.map +1 -0
  314. package/dist/core/provider-display-names.js +32 -0
  315. package/dist/core/provider-display-names.js.map +1 -0
  316. package/dist/core/resolve-config-value.d.ts +23 -0
  317. package/dist/core/resolve-config-value.d.ts.map +1 -0
  318. package/dist/core/resolve-config-value.js +126 -0
  319. package/dist/core/resolve-config-value.js.map +1 -0
  320. package/dist/core/resource-loader.d.ts +194 -0
  321. package/dist/core/resource-loader.d.ts.map +1 -0
  322. package/dist/core/resource-loader.js +731 -0
  323. package/dist/core/resource-loader.js.map +1 -0
  324. package/dist/core/sdk.d.ts +107 -0
  325. package/dist/core/sdk.d.ts.map +1 -0
  326. package/dist/core/sdk.js +282 -0
  327. package/dist/core/sdk.js.map +1 -0
  328. package/dist/core/session-cwd.d.ts +19 -0
  329. package/dist/core/session-cwd.d.ts.map +1 -0
  330. package/dist/core/session-cwd.js +38 -0
  331. package/dist/core/session-cwd.js.map +1 -0
  332. package/dist/core/session-manager.d.ts +333 -0
  333. package/dist/core/session-manager.d.ts.map +1 -0
  334. package/dist/core/session-manager.js +1109 -0
  335. package/dist/core/session-manager.js.map +1 -0
  336. package/dist/core/settings-manager.d.ts +295 -0
  337. package/dist/core/settings-manager.d.ts.map +1 -0
  338. package/dist/core/settings-manager.js +842 -0
  339. package/dist/core/settings-manager.js.map +1 -0
  340. package/dist/core/skills.d.ts +60 -0
  341. package/dist/core/skills.d.ts.map +1 -0
  342. package/dist/core/skills.js +404 -0
  343. package/dist/core/skills.js.map +1 -0
  344. package/dist/core/slash-commands.d.ts +14 -0
  345. package/dist/core/slash-commands.d.ts.map +1 -0
  346. package/dist/core/slash-commands.js +32 -0
  347. package/dist/core/slash-commands.js.map +1 -0
  348. package/dist/core/source-info.d.ts +18 -0
  349. package/dist/core/source-info.d.ts.map +1 -0
  350. package/dist/core/source-info.js +19 -0
  351. package/dist/core/source-info.js.map +1 -0
  352. package/dist/core/system-prompt.d.ts +28 -0
  353. package/dist/core/system-prompt.d.ts.map +1 -0
  354. package/dist/core/system-prompt.js +120 -0
  355. package/dist/core/system-prompt.js.map +1 -0
  356. package/dist/core/telemetry.d.ts +3 -0
  357. package/dist/core/telemetry.d.ts.map +1 -0
  358. package/dist/core/telemetry.js +9 -0
  359. package/dist/core/telemetry.js.map +1 -0
  360. package/dist/core/timings.d.ts +8 -0
  361. package/dist/core/timings.d.ts.map +1 -0
  362. package/dist/core/timings.js +31 -0
  363. package/dist/core/timings.js.map +1 -0
  364. package/dist/core/tools/bash.d.ts +68 -0
  365. package/dist/core/tools/bash.d.ts.map +1 -0
  366. package/dist/core/tools/bash.js +335 -0
  367. package/dist/core/tools/bash.js.map +1 -0
  368. package/dist/core/tools/edit-diff.d.ts +85 -0
  369. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  370. package/dist/core/tools/edit-diff.js +338 -0
  371. package/dist/core/tools/edit-diff.js.map +1 -0
  372. package/dist/core/tools/edit.d.ts +49 -0
  373. package/dist/core/tools/edit.d.ts.map +1 -0
  374. package/dist/core/tools/edit.js +324 -0
  375. package/dist/core/tools/edit.js.map +1 -0
  376. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  377. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  378. package/dist/core/tools/file-mutation-queue.js +37 -0
  379. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  380. package/dist/core/tools/find.d.ts +35 -0
  381. package/dist/core/tools/find.d.ts.map +1 -0
  382. package/dist/core/tools/find.js +298 -0
  383. package/dist/core/tools/find.js.map +1 -0
  384. package/dist/core/tools/grep.d.ts +37 -0
  385. package/dist/core/tools/grep.d.ts.map +1 -0
  386. package/dist/core/tools/grep.js +304 -0
  387. package/dist/core/tools/grep.js.map +1 -0
  388. package/dist/core/tools/index.d.ts +40 -0
  389. package/dist/core/tools/index.d.ts.map +1 -0
  390. package/dist/core/tools/index.js +112 -0
  391. package/dist/core/tools/index.js.map +1 -0
  392. package/dist/core/tools/ls.d.ts +37 -0
  393. package/dist/core/tools/ls.d.ts.map +1 -0
  394. package/dist/core/tools/ls.js +169 -0
  395. package/dist/core/tools/ls.js.map +1 -0
  396. package/dist/core/tools/output-accumulator.d.ts +50 -0
  397. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  398. package/dist/core/tools/output-accumulator.js +178 -0
  399. package/dist/core/tools/output-accumulator.js.map +1 -0
  400. package/dist/core/tools/path-utils.d.ts +8 -0
  401. package/dist/core/tools/path-utils.d.ts.map +1 -0
  402. package/dist/core/tools/path-utils.js +81 -0
  403. package/dist/core/tools/path-utils.js.map +1 -0
  404. package/dist/core/tools/read.d.ts +35 -0
  405. package/dist/core/tools/read.d.ts.map +1 -0
  406. package/dist/core/tools/read.js +288 -0
  407. package/dist/core/tools/read.js.map +1 -0
  408. package/dist/core/tools/render-utils.d.ts +21 -0
  409. package/dist/core/tools/render-utils.d.ts.map +1 -0
  410. package/dist/core/tools/render-utils.js +49 -0
  411. package/dist/core/tools/render-utils.js.map +1 -0
  412. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  413. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  414. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  415. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  416. package/dist/core/tools/truncate.d.ts +70 -0
  417. package/dist/core/tools/truncate.d.ts.map +1 -0
  418. package/dist/core/tools/truncate.js +205 -0
  419. package/dist/core/tools/truncate.js.map +1 -0
  420. package/dist/core/tools/write.d.ts +26 -0
  421. package/dist/core/tools/write.d.ts.map +1 -0
  422. package/dist/core/tools/write.js +213 -0
  423. package/dist/core/tools/write.js.map +1 -0
  424. package/dist/index.d.ts +28 -0
  425. package/dist/index.d.ts.map +1 -0
  426. package/dist/index.js +41 -0
  427. package/dist/index.js.map +1 -0
  428. package/dist/main.d.ts +12 -0
  429. package/dist/main.d.ts.map +1 -0
  430. package/dist/main.js +583 -0
  431. package/dist/main.js.map +1 -0
  432. package/dist/migrations.d.ts +31 -0
  433. package/dist/migrations.d.ts.map +1 -0
  434. package/dist/migrations.js +279 -0
  435. package/dist/migrations.js.map +1 -0
  436. package/dist/modes/index.d.ts +9 -0
  437. package/dist/modes/index.d.ts.map +1 -0
  438. package/dist/modes/index.js +8 -0
  439. package/dist/modes/index.js.map +1 -0
  440. package/dist/modes/interactive/assets/clankolas.png +0 -0
  441. package/dist/modes/interactive/components/armin.d.ts +34 -0
  442. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  443. package/dist/modes/interactive/components/armin.js +333 -0
  444. package/dist/modes/interactive/components/armin.js.map +1 -0
  445. package/dist/modes/interactive/components/assistant-message.d.ts +20 -0
  446. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  447. package/dist/modes/interactive/components/assistant-message.js +122 -0
  448. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  449. package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
  450. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  451. package/dist/modes/interactive/components/bash-execution.js +182 -0
  452. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  453. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  454. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  455. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  456. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  457. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  458. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  459. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  460. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  461. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  462. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  463. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  464. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  465. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  466. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  467. package/dist/modes/interactive/components/config-selector.js +481 -0
  468. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  469. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  470. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  471. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  472. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  473. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  474. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  475. package/dist/modes/interactive/components/custom-editor.js +70 -0
  476. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  477. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  478. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  479. package/dist/modes/interactive/components/custom-message.js +79 -0
  480. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  481. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  482. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  483. package/dist/modes/interactive/components/daxnuts.js +140 -0
  484. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  485. package/dist/modes/interactive/components/diff.d.ts +12 -0
  486. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  487. package/dist/modes/interactive/components/diff.js +133 -0
  488. package/dist/modes/interactive/components/diff.js.map +1 -0
  489. package/dist/modes/interactive/components/dynamic-border.d.ts +26 -0
  490. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  491. package/dist/modes/interactive/components/dynamic-border.js +58 -0
  492. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  493. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  494. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  496. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  497. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  498. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/extension-editor.js +111 -0
  500. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  501. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  502. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  503. package/dist/modes/interactive/components/extension-input.js +61 -0
  504. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  505. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  506. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  507. package/dist/modes/interactive/components/extension-selector.js +78 -0
  508. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  509. package/dist/modes/interactive/components/flexible-viewport-spacer.d.ts +10 -0
  510. package/dist/modes/interactive/components/flexible-viewport-spacer.d.ts.map +1 -0
  511. package/dist/modes/interactive/components/flexible-viewport-spacer.js +20 -0
  512. package/dist/modes/interactive/components/flexible-viewport-spacer.js.map +1 -0
  513. package/dist/modes/interactive/components/footer.d.ts +27 -0
  514. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  515. package/dist/modes/interactive/components/footer.js +272 -0
  516. package/dist/modes/interactive/components/footer.js.map +1 -0
  517. package/dist/modes/interactive/components/index.d.ts +32 -0
  518. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  519. package/dist/modes/interactive/components/index.js +33 -0
  520. package/dist/modes/interactive/components/index.js.map +1 -0
  521. package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -0
  522. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  523. package/dist/modes/interactive/components/keybinding-hints.js +22 -0
  524. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  525. package/dist/modes/interactive/components/login-dialog.d.ts +46 -0
  526. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  527. package/dist/modes/interactive/components/login-dialog.js +160 -0
  528. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  529. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  530. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  531. package/dist/modes/interactive/components/model-selector.js +271 -0
  532. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  533. package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
  534. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  535. package/dist/modes/interactive/components/oauth-selector.js +165 -0
  536. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  537. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  538. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  539. package/dist/modes/interactive/components/scoped-models-selector.js +290 -0
  540. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  541. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  542. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  543. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  544. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  545. package/dist/modes/interactive/components/session-selector.d.ts +96 -0
  546. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  547. package/dist/modes/interactive/components/session-selector.js +861 -0
  548. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  549. package/dist/modes/interactive/components/settings-selector.d.ts +73 -0
  550. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  551. package/dist/modes/interactive/components/settings-selector.js +531 -0
  552. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  553. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  554. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  555. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  556. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  557. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  558. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  559. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  560. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  561. package/dist/modes/interactive/components/split-info-card.d.ts +18 -0
  562. package/dist/modes/interactive/components/split-info-card.d.ts.map +1 -0
  563. package/dist/modes/interactive/components/split-info-card.js +82 -0
  564. package/dist/modes/interactive/components/split-info-card.js.map +1 -0
  565. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  566. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  567. package/dist/modes/interactive/components/theme-selector.js +50 -0
  568. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  569. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  570. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  571. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  572. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  573. package/dist/modes/interactive/components/tool-execution.d.ts +66 -0
  574. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  575. package/dist/modes/interactive/components/tool-execution.js +313 -0
  576. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  577. package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
  578. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  579. package/dist/modes/interactive/components/tree-selector.js +1092 -0
  580. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  581. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  582. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  583. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  584. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  585. package/dist/modes/interactive/components/user-message.d.ts +10 -0
  586. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  587. package/dist/modes/interactive/components/user-message.js +29 -0
  588. package/dist/modes/interactive/components/user-message.js.map +1 -0
  589. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  590. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  591. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  592. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  593. package/dist/modes/interactive/interactive-mode.d.ts +369 -0
  594. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  595. package/dist/modes/interactive/interactive-mode.js +4899 -0
  596. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  597. package/dist/modes/interactive/theme/dark.json +85 -0
  598. package/dist/modes/interactive/theme/light.json +84 -0
  599. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  600. package/dist/modes/interactive/theme/theme.d.ts +81 -0
  601. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  602. package/dist/modes/interactive/theme/theme.js +971 -0
  603. package/dist/modes/interactive/theme/theme.js.map +1 -0
  604. package/dist/modes/print-mode.d.ts +28 -0
  605. package/dist/modes/print-mode.d.ts.map +1 -0
  606. package/dist/modes/print-mode.js +131 -0
  607. package/dist/modes/print-mode.js.map +1 -0
  608. package/dist/modes/rpc/jsonl.d.ts +17 -0
  609. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  610. package/dist/modes/rpc/jsonl.js +49 -0
  611. package/dist/modes/rpc/jsonl.js.map +1 -0
  612. package/dist/modes/rpc/rpc-client.d.ts +224 -0
  613. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  614. package/dist/modes/rpc/rpc-client.js +410 -0
  615. package/dist/modes/rpc/rpc-client.js.map +1 -0
  616. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  617. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  618. package/dist/modes/rpc/rpc-mode.js +601 -0
  619. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  620. package/dist/modes/rpc/rpc-types.d.ts +419 -0
  621. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  622. package/dist/modes/rpc/rpc-types.js +8 -0
  623. package/dist/modes/rpc/rpc-types.js.map +1 -0
  624. package/dist/package-manager-cli.d.ts +4 -0
  625. package/dist/package-manager-cli.d.ts.map +1 -0
  626. package/dist/package-manager-cli.js +460 -0
  627. package/dist/package-manager-cli.js.map +1 -0
  628. package/dist/utils/changelog.d.ts +21 -0
  629. package/dist/utils/changelog.d.ts.map +1 -0
  630. package/dist/utils/changelog.js +87 -0
  631. package/dist/utils/changelog.js.map +1 -0
  632. package/dist/utils/child-process.d.ts +12 -0
  633. package/dist/utils/child-process.d.ts.map +1 -0
  634. package/dist/utils/child-process.js +86 -0
  635. package/dist/utils/child-process.js.map +1 -0
  636. package/dist/utils/clipboard-image.d.ts +11 -0
  637. package/dist/utils/clipboard-image.d.ts.map +1 -0
  638. package/dist/utils/clipboard-image.js +245 -0
  639. package/dist/utils/clipboard-image.js.map +1 -0
  640. package/dist/utils/clipboard-native.d.ts +8 -0
  641. package/dist/utils/clipboard-native.d.ts.map +1 -0
  642. package/dist/utils/clipboard-native.js +14 -0
  643. package/dist/utils/clipboard-native.js.map +1 -0
  644. package/dist/utils/clipboard-text.d.ts +4 -0
  645. package/dist/utils/clipboard-text.d.ts.map +1 -0
  646. package/dist/utils/clipboard-text.js +37 -0
  647. package/dist/utils/clipboard-text.js.map +1 -0
  648. package/dist/utils/clipboard.d.ts +2 -0
  649. package/dist/utils/clipboard.d.ts.map +1 -0
  650. package/dist/utils/clipboard.js +117 -0
  651. package/dist/utils/clipboard.js.map +1 -0
  652. package/dist/utils/exif-orientation.d.ts +5 -0
  653. package/dist/utils/exif-orientation.d.ts.map +1 -0
  654. package/dist/utils/exif-orientation.js +158 -0
  655. package/dist/utils/exif-orientation.js.map +1 -0
  656. package/dist/utils/frontmatter.d.ts +8 -0
  657. package/dist/utils/frontmatter.d.ts.map +1 -0
  658. package/dist/utils/frontmatter.js +26 -0
  659. package/dist/utils/frontmatter.js.map +1 -0
  660. package/dist/utils/fs-watch.d.ts +5 -0
  661. package/dist/utils/fs-watch.d.ts.map +1 -0
  662. package/dist/utils/fs-watch.js +25 -0
  663. package/dist/utils/fs-watch.js.map +1 -0
  664. package/dist/utils/git.d.ts +26 -0
  665. package/dist/utils/git.d.ts.map +1 -0
  666. package/dist/utils/git.js +163 -0
  667. package/dist/utils/git.js.map +1 -0
  668. package/dist/utils/image-convert.d.ts +9 -0
  669. package/dist/utils/image-convert.d.ts.map +1 -0
  670. package/dist/utils/image-convert.js +39 -0
  671. package/dist/utils/image-convert.js.map +1 -0
  672. package/dist/utils/image-resize.d.ts +36 -0
  673. package/dist/utils/image-resize.d.ts.map +1 -0
  674. package/dist/utils/image-resize.js +137 -0
  675. package/dist/utils/image-resize.js.map +1 -0
  676. package/dist/utils/mime.d.ts +2 -0
  677. package/dist/utils/mime.d.ts.map +1 -0
  678. package/dist/utils/mime.js +26 -0
  679. package/dist/utils/mime.js.map +1 -0
  680. package/dist/utils/paths.d.ts +14 -0
  681. package/dist/utils/paths.d.ts.map +1 -0
  682. package/dist/utils/paths.js +34 -0
  683. package/dist/utils/paths.js.map +1 -0
  684. package/dist/utils/photon.d.ts +21 -0
  685. package/dist/utils/photon.d.ts.map +1 -0
  686. package/dist/utils/photon.js +121 -0
  687. package/dist/utils/photon.js.map +1 -0
  688. package/dist/utils/shell.d.ts +30 -0
  689. package/dist/utils/shell.d.ts.map +1 -0
  690. package/dist/utils/shell.js +190 -0
  691. package/dist/utils/shell.js.map +1 -0
  692. package/dist/utils/sleep.d.ts +5 -0
  693. package/dist/utils/sleep.d.ts.map +1 -0
  694. package/dist/utils/sleep.js +17 -0
  695. package/dist/utils/sleep.js.map +1 -0
  696. package/dist/utils/threadwell-user-agent.d.ts +2 -0
  697. package/dist/utils/threadwell-user-agent.d.ts.map +1 -0
  698. package/dist/utils/threadwell-user-agent.js +5 -0
  699. package/dist/utils/threadwell-user-agent.js.map +1 -0
  700. package/dist/utils/tools-manager.d.ts +3 -0
  701. package/dist/utils/tools-manager.d.ts.map +1 -0
  702. package/dist/utils/tools-manager.js +256 -0
  703. package/dist/utils/tools-manager.js.map +1 -0
  704. package/dist/utils/version-check.d.ts +14 -0
  705. package/dist/utils/version-check.d.ts.map +1 -0
  706. package/dist/utils/version-check.js +77 -0
  707. package/dist/utils/version-check.js.map +1 -0
  708. package/docs/compaction.md +394 -0
  709. package/docs/custom-provider.md +646 -0
  710. package/docs/development.md +71 -0
  711. package/docs/docs.json +148 -0
  712. package/docs/extensions.md +2596 -0
  713. package/docs/images/doom-extension.png +0 -0
  714. package/docs/images/exy.png +0 -0
  715. package/docs/images/interactive-mode.png +0 -0
  716. package/docs/images/tree-view.png +0 -0
  717. package/docs/index.md +64 -0
  718. package/docs/json.md +82 -0
  719. package/docs/keybindings.md +197 -0
  720. package/docs/memory.md +484 -0
  721. package/docs/models.md +474 -0
  722. package/docs/packages.md +223 -0
  723. package/docs/prompt-templates.md +88 -0
  724. package/docs/providers.md +241 -0
  725. package/docs/quickstart.md +142 -0
  726. package/docs/rpc.md +1407 -0
  727. package/docs/sdk.md +1149 -0
  728. package/docs/session-format.md +412 -0
  729. package/docs/sessions.md +137 -0
  730. package/docs/settings.md +378 -0
  731. package/docs/shell-aliases.md +13 -0
  732. package/docs/skills.md +232 -0
  733. package/docs/terminal-setup.md +106 -0
  734. package/docs/termux.md +127 -0
  735. package/docs/themes.md +295 -0
  736. package/docs/tmux.md +61 -0
  737. package/docs/tui.md +918 -0
  738. package/docs/usage.md +277 -0
  739. package/docs/windows.md +17 -0
  740. package/examples/README.md +25 -0
  741. package/examples/extensions/README.md +208 -0
  742. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  743. package/examples/extensions/bash-spawn-hook.ts +30 -0
  744. package/examples/extensions/bookmark.ts +50 -0
  745. package/examples/extensions/border-status-editor.ts +147 -0
  746. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  747. package/examples/extensions/claude-rules.ts +86 -0
  748. package/examples/extensions/commands.ts +72 -0
  749. package/examples/extensions/confirm-destructive.ts +59 -0
  750. package/examples/extensions/custom-compaction.ts +127 -0
  751. package/examples/extensions/custom-footer.ts +64 -0
  752. package/examples/extensions/custom-header.ts +73 -0
  753. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  754. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  755. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  756. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  757. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  758. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  759. package/examples/extensions/dirty-repo-guard.ts +56 -0
  760. package/examples/extensions/doom-overlay/README.md +46 -0
  761. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  762. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  763. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  764. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  765. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  766. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  767. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  768. package/examples/extensions/doom-overlay/index.ts +74 -0
  769. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  770. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  771. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  772. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  773. package/examples/extensions/dynamic-resources/index.ts +15 -0
  774. package/examples/extensions/dynamic-tools.ts +74 -0
  775. package/examples/extensions/event-bus.ts +43 -0
  776. package/examples/extensions/file-trigger.ts +41 -0
  777. package/examples/extensions/git-checkpoint.ts +53 -0
  778. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  779. package/examples/extensions/handoff.ts +191 -0
  780. package/examples/extensions/hello.ts +26 -0
  781. package/examples/extensions/hidden-thinking-label.ts +53 -0
  782. package/examples/extensions/inline-bash.ts +94 -0
  783. package/examples/extensions/input-transform.ts +43 -0
  784. package/examples/extensions/interactive-shell.ts +196 -0
  785. package/examples/extensions/mac-system-theme.ts +47 -0
  786. package/examples/extensions/message-renderer.ts +59 -0
  787. package/examples/extensions/minimal-mode.ts +426 -0
  788. package/examples/extensions/modal-editor.ts +85 -0
  789. package/examples/extensions/model-status.ts +31 -0
  790. package/examples/extensions/notify.ts +55 -0
  791. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  792. package/examples/extensions/overlay-test.ts +150 -0
  793. package/examples/extensions/permission-gate.ts +34 -0
  794. package/examples/extensions/pirate.ts +47 -0
  795. package/examples/extensions/plan-mode/README.md +65 -0
  796. package/examples/extensions/plan-mode/index.ts +340 -0
  797. package/examples/extensions/plan-mode/utils.ts +168 -0
  798. package/examples/extensions/preset.ts +436 -0
  799. package/examples/extensions/prompt-customizer.ts +97 -0
  800. package/examples/extensions/protected-paths.ts +30 -0
  801. package/examples/extensions/provider-payload.ts +18 -0
  802. package/examples/extensions/qna.ts +122 -0
  803. package/examples/extensions/question.ts +264 -0
  804. package/examples/extensions/questionnaire.ts +427 -0
  805. package/examples/extensions/rainbow-editor.ts +88 -0
  806. package/examples/extensions/reload-runtime.ts +37 -0
  807. package/examples/extensions/rpc-demo.ts +118 -0
  808. package/examples/extensions/sandbox/index.ts +321 -0
  809. package/examples/extensions/sandbox/package-lock.json +92 -0
  810. package/examples/extensions/sandbox/package.json +19 -0
  811. package/examples/extensions/send-user-message.ts +97 -0
  812. package/examples/extensions/session-name.ts +27 -0
  813. package/examples/extensions/shutdown-command.ts +63 -0
  814. package/examples/extensions/snake.ts +343 -0
  815. package/examples/extensions/space-invaders.ts +560 -0
  816. package/examples/extensions/ssh.ts +220 -0
  817. package/examples/extensions/status-line.ts +32 -0
  818. package/examples/extensions/structured-output.ts +65 -0
  819. package/examples/extensions/subagent/README.md +172 -0
  820. package/examples/extensions/subagent/agents/planner.md +37 -0
  821. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  822. package/examples/extensions/subagent/agents/scout.md +50 -0
  823. package/examples/extensions/subagent/agents/worker.md +24 -0
  824. package/examples/extensions/subagent/agents.ts +126 -0
  825. package/examples/extensions/subagent/index.ts +987 -0
  826. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  827. package/examples/extensions/subagent/prompts/implement.md +10 -0
  828. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  829. package/examples/extensions/summarize.ts +206 -0
  830. package/examples/extensions/system-prompt-header.ts +17 -0
  831. package/examples/extensions/tic-tac-toe.ts +1008 -0
  832. package/examples/extensions/timed-confirm.ts +70 -0
  833. package/examples/extensions/titlebar-spinner.ts +58 -0
  834. package/examples/extensions/todo.ts +297 -0
  835. package/examples/extensions/tool-override.ts +144 -0
  836. package/examples/extensions/tools.ts +141 -0
  837. package/examples/extensions/trigger-compact.ts +50 -0
  838. package/examples/extensions/truncated-tool.ts +195 -0
  839. package/examples/extensions/widget-placement.ts +9 -0
  840. package/examples/extensions/with-deps/index.ts +32 -0
  841. package/examples/extensions/with-deps/package-lock.json +31 -0
  842. package/examples/extensions/with-deps/package.json +22 -0
  843. package/examples/extensions/working-indicator.ts +123 -0
  844. package/examples/extensions/working-message-test.ts +25 -0
  845. package/examples/rpc-extension-ui.ts +632 -0
  846. package/examples/sdk/01-minimal.ts +22 -0
  847. package/examples/sdk/02-custom-model.ts +49 -0
  848. package/examples/sdk/03-custom-prompt.ts +62 -0
  849. package/examples/sdk/04-skills.ts +55 -0
  850. package/examples/sdk/05-tools.ts +44 -0
  851. package/examples/sdk/06-extensions.ts +90 -0
  852. package/examples/sdk/07-context-files.ts +42 -0
  853. package/examples/sdk/08-prompt-templates.ts +51 -0
  854. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  855. package/examples/sdk/10-settings.ts +53 -0
  856. package/examples/sdk/11-sessions.ts +48 -0
  857. package/examples/sdk/12-full-control.ts +73 -0
  858. package/examples/sdk/13-session-runtime.ts +67 -0
  859. package/examples/sdk/README.md +147 -0
  860. package/package.json +101 -33
  861. package/LICENSE +0 -21
@@ -0,0 +1,35 @@
1
+ import type { AgentTool } from "@threadwell/agent-core";
2
+ import { type Static, Type } from "typebox";
3
+ import type { ToolDefinition } from "../extensions/types.js";
4
+ import { type TruncationResult } from "./truncate.js";
5
+ declare const readSchema: Type.TObject<{
6
+ path: Type.TString;
7
+ offset: Type.TOptional<Type.TNumber>;
8
+ limit: Type.TOptional<Type.TNumber>;
9
+ }>;
10
+ export type ReadToolInput = Static<typeof readSchema>;
11
+ export interface ReadToolDetails {
12
+ truncation?: TruncationResult;
13
+ }
14
+ /**
15
+ * Pluggable operations for the read tool.
16
+ * Override these to delegate file reading to remote systems (for example SSH).
17
+ */
18
+ export interface ReadOperations {
19
+ /** Read file contents as a Buffer */
20
+ readFile: (absolutePath: string) => Promise<Buffer>;
21
+ /** Check if file is readable (throw if not) */
22
+ access: (absolutePath: string) => Promise<void>;
23
+ /** Detect image MIME type, return null or undefined for non-images */
24
+ detectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;
25
+ }
26
+ export interface ReadToolOptions {
27
+ /** Whether to auto-resize images to 2000x2000 max. Default: true */
28
+ autoResizeImages?: boolean;
29
+ /** Custom operations for file reading. Default: local filesystem */
30
+ operations?: ReadOperations;
31
+ }
32
+ export declare function createReadToolDefinition(cwd: string, options?: ReadToolOptions): ToolDefinition<typeof readSchema, ReadToolDetails | undefined>;
33
+ export declare function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema>;
34
+ export {};
35
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKxD,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAM5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AAItF,OAAO,EAAoD,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEtH,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AASD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,+CAA+C;IAC/C,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACnF;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;CAC5B;AA+ID,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CAsJhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAEnG","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport type { AgentTool } from \"@threadwell/agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"@threadwell/ai\";\nimport { Text } from \"@threadwell/tui\";\nimport { constants } from \"fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.js\";\nimport { keyHint, keyText } from \"../../modes/interactive/components/keybinding-hints.js\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.js\";\nimport { formatDimensionNote, resizeImage } from \"../../utils/image-resize.js\";\nimport { detectSupportedImageMimeTypeFromFile } from \"../../utils/mime.js\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.js\";\nimport { resolveReadPath } from \"./path-utils.js\";\nimport { getTextOutput, invalidArgText, replaceTabs, shortenPath, str } from \"./render-utils.js\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.js\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.js\";\n\nconst readSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to read (relative or absolute)\" }),\n\toffset: Type.Optional(Type.Number({ description: \"Line number to start reading from (1-indexed)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of lines to read\" })),\n});\n\nexport type ReadToolInput = Static<typeof readSchema>;\n\nexport interface ReadToolDetails {\n\ttruncation?: TruncationResult;\n}\n\ninterface CompactReadClassification {\n\tkind: \"docs\" | \"resource\" | \"skill\";\n\tlabel: string;\n}\n\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\n\n/**\n * Pluggable operations for the read tool.\n * Override these to delegate file reading to remote systems (for example SSH).\n */\nexport interface ReadOperations {\n\t/** Read file contents as a Buffer */\n\treadFile: (absolutePath: string) => Promise<Buffer>;\n\t/** Check if file is readable (throw if not) */\n\taccess: (absolutePath: string) => Promise<void>;\n\t/** Detect image MIME type, return null or undefined for non-images */\n\tdetectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;\n}\n\nconst defaultReadOperations: ReadOperations = {\n\treadFile: (path) => fsReadFile(path),\n\taccess: (path) => fsAccess(path, constants.R_OK),\n\tdetectImageMimeType: detectSupportedImageMimeTypeFromFile,\n};\n\nexport interface ReadToolOptions {\n\t/** Whether to auto-resize images to 2000x2000 max. Default: true */\n\tautoResizeImages?: boolean;\n\t/** Custom operations for file reading. Default: local filesystem */\n\toperations?: ReadOperations;\n}\n\ntype ReadRenderArgs = { path?: string; file_path?: string; offset?: number; limit?: number };\n\nfunction formatReadLineRange(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tif (args?.offset === undefined && args?.limit === undefined) return \"\";\n\tconst startLine = args.offset ?? 1;\n\tconst endLine = args.limit !== undefined ? startLine + args.limit - 1 : \"\";\n\treturn theme.fg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n}\n\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tconst rawPath = str(args?.file_path ?? 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}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\tif (!model || model.input.includes(\"image\")) {\n\t\treturn undefined;\n\t}\n\treturn \"[Current model does not support images. The image will be omitted from this request.]\";\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\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\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}\n\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tif (!rawPath) return undefined;\n\n\tconst absolutePath = resolveReadPath(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\n\tconst docsClassification = getPiDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: fileName };\n\t}\n\n\treturn undefined;\n}\n\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst expandHint = theme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\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\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}\n\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: { content: (TextContent | ImageContent)[]; details?: ReadToolDetails },\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\tcwd: string,\n\tisError: boolean,\n): string {\n\tif (!options.expanded && !isError && getCompactReadClassification(args, cwd)) {\n\t\treturn \"\";\n\t}\n\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst output = getTextOutput(result, showImages);\n\tconst lang = rawPath ? 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 += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t}\n\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}\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\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,\n\t\tpromptSnippet: \"Read file contents\",\n\t\tpromptGuidelines: [\"Use read to examine files instead of cat or sed.\"],\n\t\tparameters: readSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ path, offset, limit }: { path: string; offset?: number; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\tctx?,\n\t\t) {\n\t\t\tconst absolutePath = resolveReadPath(path, cwd);\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\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Check if file exists and is readable.\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\tconst mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;\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\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 base64 = buffer.toString(\"base64\");\n\t\t\t\t\t\t\t\tif (autoResizeImages) {\n\t\t\t\t\t\t\t\t\t// Resize image if needed before sending it back to the model.\n\t\t\t\t\t\t\t\t\tconst resized = await resizeImage({ type: \"image\", data: base64, mimeType });\n\t\t\t\t\t\t\t\t\tif (!resized) {\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]\\n[Image omitted: could not be resized below the inline image size limit.]`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: textNote }];\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst dimensionNote = formatDimensionNote(resized);\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${resized.mimeType}]`;\n\t\t\t\t\t\t\t\t\t\tif (dimensionNote) textNote += `\\n${dimensionNote}`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [\n\t\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\t{ type: \"image\", data: resized.data, mimeType: resized.mimeType },\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} else {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]`;\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: base64, 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\t// Read text content.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent = buffer.toString(\"utf-8\");\n\t\t\t\t\t\t\t\tconst allLines = textContent.split(\"\\n\");\n\t\t\t\t\t\t\t\tconst totalFileLines = allLines.length;\n\t\t\t\t\t\t\t\t// Apply offset if specified. Convert from 1-indexed input to 0-indexed array access.\n\t\t\t\t\t\t\t\tconst startLine = offset ? Math.max(0, offset - 1) : 0;\n\t\t\t\t\t\t\t\tconst startLineDisplay = startLine + 1;\n\t\t\t\t\t\t\t\t// Check if offset is out of bounds.\n\t\t\t\t\t\t\t\tif (startLine >= allLines.length) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);\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 userLimitedLines: number | undefined;\n\t\t\t\t\t\t\t\t// If limit is specified by the user, honor it first. Otherwise truncateHead decides.\n\t\t\t\t\t\t\t\tif (limit !== undefined) {\n\t\t\t\t\t\t\t\t\tconst endLine = Math.min(startLine + limit, allLines.length);\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine, endLine).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\tselectedContent = allLines.slice(startLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Apply truncation, respecting both line and byte limits.\n\t\t\t\t\t\t\t\tconst truncation = truncateHead(selectedContent);\n\t\t\t\t\t\t\t\tlet outputText: string;\n\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\t\t\t\t\t\t\t// First line alone exceeds the byte limit. Point the model at a bash fallback.\n\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\toutputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (truncation.truncated) {\n\t\t\t\t\t\t\t\t\t// Truncation occurred. Build an actionable continuation notice.\n\t\t\t\t\t\t\t\t\tconst endLineDisplay = startLineDisplay + truncation.outputLines - 1;\n\t\t\t\t\t\t\t\t\tconst nextOffset = endLineDisplay + 1;\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t\tif (truncation.truncatedBy === \"lines\") {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) {\n\t\t\t\t\t\t\t\t\t// User-specified limit stopped early, but the file still has more content.\n\t\t\t\t\t\t\t\t\tconst remaining = allLines.length - (startLine + userLimitedLines);\n\t\t\t\t\t\t\t\t\tconst nextOffset = startLine + userLimitedLines + 1;\n\t\t\t\t\t\t\t\t\toutputText = `${truncation.content}\\n\\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// No truncation and no remaining user-limited content.\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: outputText }];\n\t\t\t\t\t\t\t}\n\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 });\n\t\t\t\t\t\t} catch (error: any) {\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}\n\nexport function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(cwd, options));\n}\n"]}
@@ -0,0 +1,288 @@
1
+ import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from "node:path";
2
+ import { Text } from "@threadwell/tui";
3
+ import { constants } from "fs";
4
+ import { access as fsAccess, readFile as fsReadFile } from "fs/promises";
5
+ import { Type } from "typebox";
6
+ import { getReadmePath } from "../../config.js";
7
+ import { keyHint, keyText } from "../../modes/interactive/components/keybinding-hints.js";
8
+ import { getLanguageFromPath, highlightCode } from "../../modes/interactive/theme/theme.js";
9
+ import { formatDimensionNote, resizeImage } from "../../utils/image-resize.js";
10
+ import { detectSupportedImageMimeTypeFromFile } from "../../utils/mime.js";
11
+ import { resolveReadPath } from "./path-utils.js";
12
+ import { getTextOutput, invalidArgText, replaceTabs, shortenPath, str } from "./render-utils.js";
13
+ import { wrapToolDefinition } from "./tool-definition-wrapper.js";
14
+ import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead } from "./truncate.js";
15
+ const readSchema = Type.Object({
16
+ path: Type.String({ description: "Path to the file to read (relative or absolute)" }),
17
+ offset: Type.Optional(Type.Number({ description: "Line number to start reading from (1-indexed)" })),
18
+ limit: Type.Optional(Type.Number({ description: "Maximum number of lines to read" })),
19
+ });
20
+ const COMPACT_RESOURCE_FILE_NAMES = new Set(["AGENTS.md", "AGENTS.MD", "CLAUDE.md", "CLAUDE.MD"]);
21
+ const defaultReadOperations = {
22
+ readFile: (path) => fsReadFile(path),
23
+ access: (path) => fsAccess(path, constants.R_OK),
24
+ detectImageMimeType: detectSupportedImageMimeTypeFromFile,
25
+ };
26
+ function formatReadLineRange(args, theme) {
27
+ if (args?.offset === undefined && args?.limit === undefined)
28
+ return "";
29
+ const startLine = args.offset ?? 1;
30
+ const endLine = args.limit !== undefined ? startLine + args.limit - 1 : "";
31
+ return theme.fg("warning", `:${startLine}${endLine ? `-${endLine}` : ""}`);
32
+ }
33
+ function formatReadCall(args, theme) {
34
+ const rawPath = str(args?.file_path ?? args?.path);
35
+ const path = rawPath !== null ? shortenPath(rawPath) : null;
36
+ const invalidArg = invalidArgText(theme);
37
+ const pathDisplay = path === null ? invalidArg : path ? theme.fg("accent", path) : theme.fg("toolOutput", "...");
38
+ return `${theme.fg("toolTitle", theme.bold("read"))} ${pathDisplay}${formatReadLineRange(args, theme)}`;
39
+ }
40
+ function trimTrailingEmptyLines(lines) {
41
+ let end = lines.length;
42
+ while (end > 0 && lines[end - 1] === "") {
43
+ end--;
44
+ }
45
+ return lines.slice(0, end);
46
+ }
47
+ function getNonVisionImageNote(model) {
48
+ if (!model || model.input.includes("image")) {
49
+ return undefined;
50
+ }
51
+ return "[Current model does not support images. The image will be omitted from this request.]";
52
+ }
53
+ function toPosixPath(filePath) {
54
+ return filePath.split(sep).join("/");
55
+ }
56
+ function getPiDocsClassification(absolutePath) {
57
+ const packageRoot = dirname(getReadmePath());
58
+ const relativePath = relative(resolvePath(packageRoot), resolvePath(absolutePath));
59
+ if (relativePath === "" ||
60
+ relativePath === ".." ||
61
+ relativePath.startsWith(`..${sep}`) ||
62
+ isAbsolute(relativePath)) {
63
+ return undefined;
64
+ }
65
+ const label = toPosixPath(relativePath);
66
+ if (label === "README.md" || label.startsWith("docs/") || label.startsWith("examples/")) {
67
+ return { kind: "docs", label };
68
+ }
69
+ return undefined;
70
+ }
71
+ function getCompactReadClassification(args, cwd) {
72
+ const rawPath = str(args?.file_path ?? args?.path);
73
+ if (!rawPath)
74
+ return undefined;
75
+ const absolutePath = resolveReadPath(rawPath, cwd);
76
+ const fileName = basename(absolutePath);
77
+ if (fileName === "SKILL.md") {
78
+ return { kind: "skill", label: basename(dirname(absolutePath)) || fileName };
79
+ }
80
+ const docsClassification = getPiDocsClassification(absolutePath);
81
+ if (docsClassification)
82
+ return docsClassification;
83
+ if (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {
84
+ return { kind: "resource", label: fileName };
85
+ }
86
+ return undefined;
87
+ }
88
+ function formatCompactReadCall(classification, args, theme) {
89
+ const expandHint = theme.fg("dim", ` (${keyText("app.tools.expand")} to expand)`);
90
+ if (classification.kind === "skill") {
91
+ return (theme.fg("customMessageLabel", `\x1b[1m[skill]\x1b[22m `) +
92
+ theme.fg("customMessageText", classification.label) +
93
+ formatReadLineRange(args, theme) +
94
+ expandHint);
95
+ }
96
+ return (theme.fg("toolTitle", theme.bold(`read ${classification.kind}`)) +
97
+ " " +
98
+ theme.fg("accent", classification.label) +
99
+ formatReadLineRange(args, theme) +
100
+ expandHint);
101
+ }
102
+ function formatReadResult(args, result, options, theme, showImages, cwd, isError) {
103
+ if (!options.expanded && !isError && getCompactReadClassification(args, cwd)) {
104
+ return "";
105
+ }
106
+ const rawPath = str(args?.file_path ?? args?.path);
107
+ const output = getTextOutput(result, showImages);
108
+ const lang = rawPath ? getLanguageFromPath(rawPath) : undefined;
109
+ const renderedLines = lang ? highlightCode(replaceTabs(output), lang) : output.split("\n");
110
+ const lines = trimTrailingEmptyLines(renderedLines);
111
+ const maxLines = options.expanded ? lines.length : 10;
112
+ const displayLines = lines.slice(0, maxLines);
113
+ const remaining = lines.length - maxLines;
114
+ let text = `\n${displayLines.map((line) => (lang ? replaceTabs(line) : theme.fg("toolOutput", replaceTabs(line)))).join("\n")}`;
115
+ if (remaining > 0) {
116
+ text += `${theme.fg("muted", `\n... (${remaining} more lines,`)} ${keyHint("app.tools.expand", "to expand")})`;
117
+ }
118
+ const truncation = result.details?.truncation;
119
+ if (truncation?.truncated) {
120
+ if (truncation.firstLineExceedsLimit) {
121
+ text += `\n${theme.fg("warning", `[First line exceeds ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;
122
+ }
123
+ else if (truncation.truncatedBy === "lines") {
124
+ text += `\n${theme.fg("warning", `[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines ?? DEFAULT_MAX_LINES} line limit)]`)}`;
125
+ }
126
+ else {
127
+ text += `\n${theme.fg("warning", `[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)]`)}`;
128
+ }
129
+ }
130
+ return text;
131
+ }
132
+ export function createReadToolDefinition(cwd, options) {
133
+ const autoResizeImages = options?.autoResizeImages ?? true;
134
+ const ops = options?.operations ?? defaultReadOperations;
135
+ return {
136
+ name: "read",
137
+ label: "read",
138
+ description: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,
139
+ promptSnippet: "Read file contents",
140
+ promptGuidelines: ["Use read to examine files instead of cat or sed."],
141
+ parameters: readSchema,
142
+ async execute(_toolCallId, { path, offset, limit }, signal, _onUpdate, ctx) {
143
+ const absolutePath = resolveReadPath(path, cwd);
144
+ return new Promise((resolve, reject) => {
145
+ if (signal?.aborted) {
146
+ reject(new Error("Operation aborted"));
147
+ return;
148
+ }
149
+ let aborted = false;
150
+ const onAbort = () => {
151
+ aborted = true;
152
+ reject(new Error("Operation aborted"));
153
+ };
154
+ signal?.addEventListener("abort", onAbort, { once: true });
155
+ (async () => {
156
+ try {
157
+ // Check if file exists and is readable.
158
+ await ops.access(absolutePath);
159
+ if (aborted)
160
+ return;
161
+ const mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;
162
+ let content;
163
+ let details;
164
+ const nonVisionImageNote = getNonVisionImageNote(ctx?.model);
165
+ if (mimeType) {
166
+ // Read image as binary.
167
+ const buffer = await ops.readFile(absolutePath);
168
+ const base64 = buffer.toString("base64");
169
+ if (autoResizeImages) {
170
+ // Resize image if needed before sending it back to the model.
171
+ const resized = await resizeImage({ type: "image", data: base64, mimeType });
172
+ if (!resized) {
173
+ let textNote = `Read image file [${mimeType}]\n[Image omitted: could not be resized below the inline image size limit.]`;
174
+ if (nonVisionImageNote)
175
+ textNote += `\n${nonVisionImageNote}`;
176
+ content = [{ type: "text", text: textNote }];
177
+ }
178
+ else {
179
+ const dimensionNote = formatDimensionNote(resized);
180
+ let textNote = `Read image file [${resized.mimeType}]`;
181
+ if (dimensionNote)
182
+ textNote += `\n${dimensionNote}`;
183
+ if (nonVisionImageNote)
184
+ textNote += `\n${nonVisionImageNote}`;
185
+ content = [
186
+ { type: "text", text: textNote },
187
+ { type: "image", data: resized.data, mimeType: resized.mimeType },
188
+ ];
189
+ }
190
+ }
191
+ else {
192
+ let textNote = `Read image file [${mimeType}]`;
193
+ if (nonVisionImageNote)
194
+ textNote += `\n${nonVisionImageNote}`;
195
+ content = [
196
+ { type: "text", text: textNote },
197
+ { type: "image", data: base64, mimeType },
198
+ ];
199
+ }
200
+ }
201
+ else {
202
+ // Read text content.
203
+ const buffer = await ops.readFile(absolutePath);
204
+ const textContent = buffer.toString("utf-8");
205
+ const allLines = textContent.split("\n");
206
+ const totalFileLines = allLines.length;
207
+ // Apply offset if specified. Convert from 1-indexed input to 0-indexed array access.
208
+ const startLine = offset ? Math.max(0, offset - 1) : 0;
209
+ const startLineDisplay = startLine + 1;
210
+ // Check if offset is out of bounds.
211
+ if (startLine >= allLines.length) {
212
+ throw new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);
213
+ }
214
+ let selectedContent;
215
+ let userLimitedLines;
216
+ // If limit is specified by the user, honor it first. Otherwise truncateHead decides.
217
+ if (limit !== undefined) {
218
+ const endLine = Math.min(startLine + limit, allLines.length);
219
+ selectedContent = allLines.slice(startLine, endLine).join("\n");
220
+ userLimitedLines = endLine - startLine;
221
+ }
222
+ else {
223
+ selectedContent = allLines.slice(startLine).join("\n");
224
+ }
225
+ // Apply truncation, respecting both line and byte limits.
226
+ const truncation = truncateHead(selectedContent);
227
+ let outputText;
228
+ if (truncation.firstLineExceedsLimit) {
229
+ // First line alone exceeds the byte limit. Point the model at a bash fallback.
230
+ const firstLineSize = formatSize(Buffer.byteLength(allLines[startLine], "utf-8"));
231
+ outputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;
232
+ details = { truncation };
233
+ }
234
+ else if (truncation.truncated) {
235
+ // Truncation occurred. Build an actionable continuation notice.
236
+ const endLineDisplay = startLineDisplay + truncation.outputLines - 1;
237
+ const nextOffset = endLineDisplay + 1;
238
+ outputText = truncation.content;
239
+ if (truncation.truncatedBy === "lines") {
240
+ outputText += `\n\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;
241
+ }
242
+ else {
243
+ outputText += `\n\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;
244
+ }
245
+ details = { truncation };
246
+ }
247
+ else if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) {
248
+ // User-specified limit stopped early, but the file still has more content.
249
+ const remaining = allLines.length - (startLine + userLimitedLines);
250
+ const nextOffset = startLine + userLimitedLines + 1;
251
+ outputText = `${truncation.content}\n\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;
252
+ }
253
+ else {
254
+ // No truncation and no remaining user-limited content.
255
+ outputText = truncation.content;
256
+ }
257
+ content = [{ type: "text", text: outputText }];
258
+ }
259
+ if (aborted)
260
+ return;
261
+ signal?.removeEventListener("abort", onAbort);
262
+ resolve({ content, details });
263
+ }
264
+ catch (error) {
265
+ signal?.removeEventListener("abort", onAbort);
266
+ if (!aborted)
267
+ reject(error);
268
+ }
269
+ })();
270
+ });
271
+ },
272
+ renderCall(args, theme, context) {
273
+ const text = context.lastComponent ?? new Text("", 0, 0);
274
+ const classification = !context.expanded ? getCompactReadClassification(args, context.cwd) : undefined;
275
+ text.setText(classification ? formatCompactReadCall(classification, args, theme) : formatReadCall(args, theme));
276
+ return text;
277
+ },
278
+ renderResult(result, options, theme, context) {
279
+ const text = context.lastComponent ?? new Text("", 0, 0);
280
+ text.setText(formatReadResult(context.args, result, options, theme, context.showImages, context.cwd, context.isError));
281
+ return text;
282
+ },
283
+ };
284
+ }
285
+ export function createReadTool(cwd, options) {
286
+ return wrapToolDefinition(createReadToolDefinition(cwd, options));
287
+ }
288
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,IAAI,WAAW,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGjG,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAc,MAAM,wCAAwC,CAAC;AACxG,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAyB,YAAY,EAAE,MAAM,eAAe,CAAC;AAEtH,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;IACrF,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC,CAAC;IACpG,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC,CAAC;CACrF,CAAC,CAAC;AAaH,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAelG,MAAM,qBAAqB,GAAmB;IAC7C,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC;IAChD,mBAAmB,EAAE,oCAAoC;CACzD,CAAC;AAWF,SAAS,mBAAmB,CAAC,IAAgC,EAAE,KAAY,EAAU;IACpF,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAAA,CAC3E;AAED,SAAS,cAAc,CAAC,IAAgC,EAAE,KAAY,EAAU;IAC/E,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACjH,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,WAAW,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;AAAA,CACxG;AAED,SAAS,sBAAsB,CAAC,KAAe,EAAY;IAC1D,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACzC,GAAG,EAAE,CAAC;IACP,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAAA,CAC3B;AAED,SAAS,qBAAqB,CAAC,KAA6B,EAAsB;IACjF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,uFAAuF,CAAC;AAAA,CAC/F;AAED,SAAS,WAAW,CAAC,QAAgB,EAAU;IAC9C,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAAA,CACrC;AAED,SAAS,uBAAuB,CAAC,YAAoB,EAAyC;IAC7F,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IACnF,IACC,YAAY,KAAK,EAAE;QACnB,YAAY,KAAK,IAAI;QACrB,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;QACnC,UAAU,CAAC,YAAY,CAAC,EACvB,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,4BAA4B,CACpC,IAAgC,EAChC,GAAW,EAC6B;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACjE,IAAI,kBAAkB;QAAE,OAAO,kBAAkB,CAAC;IAElD,IAAI,2BAA2B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,qBAAqB,CAC7B,cAAyC,EACzC,IAAgC,EAChC,KAAY,EACH;IACT,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAClF,IAAI,cAAc,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACrC,OAAO,CACN,KAAK,CAAC,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,CAAC;YACzD,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,cAAc,CAAC,KAAK,CAAC;YACnD,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC;YAChC,UAAU,CACV,CAAC;IACH,CAAC;IAED,OAAO,CACN,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,GAAG;QACH,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC;QACxC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC;QAChC,UAAU,CACV,CAAC;AAAA,CACF;AAED,SAAS,gBAAgB,CACxB,IAAgC,EAChC,MAA8E,EAC9E,OAAgC,EAChC,KAAY,EACZ,UAAmB,EACnB,GAAW,EACX,OAAgB,EACP;IACT,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,IAAI,4BAA4B,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QAC9E,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;IAC1C,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAChI,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,SAAS,cAAc,CAAC,IAAI,OAAO,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,CAAC;IAChH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC;IAC9C,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,qBAAqB,EAAE,CAAC;YACtC,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,uBAAuB,UAAU,CAAC,UAAU,CAAC,QAAQ,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1H,CAAC;aAAM,IAAI,UAAU,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAC/C,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,uBAAuB,UAAU,CAAC,WAAW,OAAO,UAAU,CAAC,UAAU,WAAW,UAAU,CAAC,QAAQ,IAAI,iBAAiB,eAAe,CAAC,EAAE,CAAC;QACjL,CAAC;aAAM,CAAC;YACP,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,UAAU,CAAC,WAAW,iBAAiB,UAAU,CAAC,UAAU,CAAC,QAAQ,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1J,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,wBAAwB,CACvC,GAAW,EACX,OAAyB,EACwC;IACjE,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAC;IAC3D,MAAM,GAAG,GAAG,OAAO,EAAE,UAAU,IAAI,qBAAqB,CAAC;IACzD,OAAO;QACN,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,6JAA6J,iBAAiB,aAAa,iBAAiB,GAAG,IAAI,kIAAkI;QAClW,aAAa,EAAE,oBAAoB;QACnC,gBAAgB,EAAE,CAAC,kDAAkD,CAAC;QACtE,UAAU,EAAE,UAAU;QACtB,KAAK,CAAC,OAAO,CACZ,WAAW,EACX,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAqD,EAC1E,MAAoB,EACpB,SAAU,EACV,GAAI,EACH;YACD,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAChD,OAAO,IAAI,OAAO,CACjB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;gBACpB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBACvC,OAAO;gBACR,CAAC;gBACD,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;oBACrB,OAAO,GAAG,IAAI,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAAA,CACvC,CAAC;gBACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE3D,CAAC,KAAK,IAAI,EAAE,CAAC;oBACZ,IAAI,CAAC;wBACJ,wCAAwC;wBACxC,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;wBAC/B,IAAI,OAAO;4BAAE,OAAO;wBACpB,MAAM,QAAQ,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;wBACnG,IAAI,OAAuC,CAAC;wBAC5C,IAAI,OAAoC,CAAC;wBACzC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;wBAC7D,IAAI,QAAQ,EAAE,CAAC;4BACd,wBAAwB;4BACxB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;4BAChD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;4BACzC,IAAI,gBAAgB,EAAE,CAAC;gCACtB,8DAA8D;gCAC9D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gCAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;oCACd,IAAI,QAAQ,GAAG,oBAAoB,QAAQ,6EAA6E,CAAC;oCACzH,IAAI,kBAAkB;wCAAE,QAAQ,IAAI,KAAK,kBAAkB,EAAE,CAAC;oCAC9D,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gCAC9C,CAAC;qCAAM,CAAC;oCACP,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;oCACnD,IAAI,QAAQ,GAAG,oBAAoB,OAAO,CAAC,QAAQ,GAAG,CAAC;oCACvD,IAAI,aAAa;wCAAE,QAAQ,IAAI,KAAK,aAAa,EAAE,CAAC;oCACpD,IAAI,kBAAkB;wCAAE,QAAQ,IAAI,KAAK,kBAAkB,EAAE,CAAC;oCAC9D,OAAO,GAAG;wCACT,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;wCAChC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;qCACjE,CAAC;gCACH,CAAC;4BACF,CAAC;iCAAM,CAAC;gCACP,IAAI,QAAQ,GAAG,oBAAoB,QAAQ,GAAG,CAAC;gCAC/C,IAAI,kBAAkB;oCAAE,QAAQ,IAAI,KAAK,kBAAkB,EAAE,CAAC;gCAC9D,OAAO,GAAG;oCACT,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;oCAChC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;iCACzC,CAAC;4BACH,CAAC;wBACF,CAAC;6BAAM,CAAC;4BACP,qBAAqB;4BACrB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;4BAChD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;4BAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;4BACvC,qFAAqF;4BACrF,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACvD,MAAM,gBAAgB,GAAG,SAAS,GAAG,CAAC,CAAC;4BACvC,oCAAoC;4BACpC,IAAI,SAAS,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gCAClC,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,2BAA2B,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC;4BAC5F,CAAC;4BACD,IAAI,eAAuB,CAAC;4BAC5B,IAAI,gBAAoC,CAAC;4BACzC,qFAAqF;4BACrF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gCACzB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gCAC7D,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gCAChE,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAC;4BACxC,CAAC;iCAAM,CAAC;gCACP,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BACxD,CAAC;4BACD,0DAA0D;4BAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;4BACjD,IAAI,UAAkB,CAAC;4BACvB,IAAI,UAAU,CAAC,qBAAqB,EAAE,CAAC;gCACtC,+EAA+E;gCAC/E,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gCAClF,UAAU,GAAG,SAAS,gBAAgB,OAAO,aAAa,aAAa,UAAU,CAAC,iBAAiB,CAAC,6BAA6B,gBAAgB,MAAM,IAAI,cAAc,iBAAiB,GAAG,CAAC;gCAC9L,OAAO,GAAG,EAAE,UAAU,EAAE,CAAC;4BAC1B,CAAC;iCAAM,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gCACjC,gEAAgE;gCAChE,MAAM,cAAc,GAAG,gBAAgB,GAAG,UAAU,CAAC,WAAW,GAAG,CAAC,CAAC;gCACrE,MAAM,UAAU,GAAG,cAAc,GAAG,CAAC,CAAC;gCACtC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC;gCAChC,IAAI,UAAU,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;oCACxC,UAAU,IAAI,sBAAsB,gBAAgB,IAAI,cAAc,OAAO,cAAc,gBAAgB,UAAU,gBAAgB,CAAC;gCACvI,CAAC;qCAAM,CAAC;oCACP,UAAU,IAAI,sBAAsB,gBAAgB,IAAI,cAAc,OAAO,cAAc,KAAK,UAAU,CAAC,iBAAiB,CAAC,uBAAuB,UAAU,gBAAgB,CAAC;gCAChL,CAAC;gCACD,OAAO,GAAG,EAAE,UAAU,EAAE,CAAC;4BAC1B,CAAC;iCAAM,IAAI,gBAAgB,KAAK,SAAS,IAAI,SAAS,GAAG,gBAAgB,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;gCAC7F,2EAA2E;gCAC3E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,SAAS,GAAG,gBAAgB,CAAC,CAAC;gCACnE,MAAM,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,CAAC,CAAC;gCACpD,UAAU,GAAG,GAAG,UAAU,CAAC,OAAO,QAAQ,SAAS,mCAAmC,UAAU,gBAAgB,CAAC;4BAClH,CAAC;iCAAM,CAAC;gCACP,uDAAuD;gCACvD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC;4BACjC,CAAC;4BACD,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;wBAChD,CAAC;wBAED,IAAI,OAAO;4BAAE,OAAO;wBACpB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBAC9C,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC/B,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBACrB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBAC9C,IAAI,CAAC,OAAO;4BAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC7B,CAAC;gBAAA,CACD,CAAC,EAAE,CAAC;YAAA,CACL,CACD,CAAC;QAAA,CACF;QACD,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;YAChC,MAAM,IAAI,GAAI,OAAO,CAAC,aAAkC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACvG,IAAI,CAAC,OAAO,CACX,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CACjG,CAAC;YACF,OAAO,IAAI,CAAC;QAAA,CACZ;QACD,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;YAC7C,MAAM,IAAI,GAAI,OAAO,CAAC,aAAkC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,OAAO,CACX,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CACxG,CAAC;YACF,OAAO,IAAI,CAAC;QAAA,CACZ;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,OAAyB,EAAgC;IACpG,OAAO,kBAAkB,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAAA,CAClE","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport type { AgentTool } from \"@threadwell/agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"@threadwell/ai\";\nimport { Text } from \"@threadwell/tui\";\nimport { constants } from \"fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.js\";\nimport { keyHint, keyText } from \"../../modes/interactive/components/keybinding-hints.js\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.js\";\nimport { formatDimensionNote, resizeImage } from \"../../utils/image-resize.js\";\nimport { detectSupportedImageMimeTypeFromFile } from \"../../utils/mime.js\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.js\";\nimport { resolveReadPath } from \"./path-utils.js\";\nimport { getTextOutput, invalidArgText, replaceTabs, shortenPath, str } from \"./render-utils.js\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.js\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.js\";\n\nconst readSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to read (relative or absolute)\" }),\n\toffset: Type.Optional(Type.Number({ description: \"Line number to start reading from (1-indexed)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of lines to read\" })),\n});\n\nexport type ReadToolInput = Static<typeof readSchema>;\n\nexport interface ReadToolDetails {\n\ttruncation?: TruncationResult;\n}\n\ninterface CompactReadClassification {\n\tkind: \"docs\" | \"resource\" | \"skill\";\n\tlabel: string;\n}\n\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\n\n/**\n * Pluggable operations for the read tool.\n * Override these to delegate file reading to remote systems (for example SSH).\n */\nexport interface ReadOperations {\n\t/** Read file contents as a Buffer */\n\treadFile: (absolutePath: string) => Promise<Buffer>;\n\t/** Check if file is readable (throw if not) */\n\taccess: (absolutePath: string) => Promise<void>;\n\t/** Detect image MIME type, return null or undefined for non-images */\n\tdetectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;\n}\n\nconst defaultReadOperations: ReadOperations = {\n\treadFile: (path) => fsReadFile(path),\n\taccess: (path) => fsAccess(path, constants.R_OK),\n\tdetectImageMimeType: detectSupportedImageMimeTypeFromFile,\n};\n\nexport interface ReadToolOptions {\n\t/** Whether to auto-resize images to 2000x2000 max. Default: true */\n\tautoResizeImages?: boolean;\n\t/** Custom operations for file reading. Default: local filesystem */\n\toperations?: ReadOperations;\n}\n\ntype ReadRenderArgs = { path?: string; file_path?: string; offset?: number; limit?: number };\n\nfunction formatReadLineRange(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tif (args?.offset === undefined && args?.limit === undefined) return \"\";\n\tconst startLine = args.offset ?? 1;\n\tconst endLine = args.limit !== undefined ? startLine + args.limit - 1 : \"\";\n\treturn theme.fg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n}\n\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tconst rawPath = str(args?.file_path ?? 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}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\tif (!model || model.input.includes(\"image\")) {\n\t\treturn undefined;\n\t}\n\treturn \"[Current model does not support images. The image will be omitted from this request.]\";\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\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\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}\n\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tif (!rawPath) return undefined;\n\n\tconst absolutePath = resolveReadPath(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\n\tconst docsClassification = getPiDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: fileName };\n\t}\n\n\treturn undefined;\n}\n\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst expandHint = theme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\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\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}\n\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: { content: (TextContent | ImageContent)[]; details?: ReadToolDetails },\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\tcwd: string,\n\tisError: boolean,\n): string {\n\tif (!options.expanded && !isError && getCompactReadClassification(args, cwd)) {\n\t\treturn \"\";\n\t}\n\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst output = getTextOutput(result, showImages);\n\tconst lang = rawPath ? 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 += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t}\n\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}\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\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,\n\t\tpromptSnippet: \"Read file contents\",\n\t\tpromptGuidelines: [\"Use read to examine files instead of cat or sed.\"],\n\t\tparameters: readSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ path, offset, limit }: { path: string; offset?: number; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\tctx?,\n\t\t) {\n\t\t\tconst absolutePath = resolveReadPath(path, cwd);\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\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Check if file exists and is readable.\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\tconst mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;\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\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 base64 = buffer.toString(\"base64\");\n\t\t\t\t\t\t\t\tif (autoResizeImages) {\n\t\t\t\t\t\t\t\t\t// Resize image if needed before sending it back to the model.\n\t\t\t\t\t\t\t\t\tconst resized = await resizeImage({ type: \"image\", data: base64, mimeType });\n\t\t\t\t\t\t\t\t\tif (!resized) {\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]\\n[Image omitted: could not be resized below the inline image size limit.]`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: textNote }];\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst dimensionNote = formatDimensionNote(resized);\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${resized.mimeType}]`;\n\t\t\t\t\t\t\t\t\t\tif (dimensionNote) textNote += `\\n${dimensionNote}`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [\n\t\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\t{ type: \"image\", data: resized.data, mimeType: resized.mimeType },\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} else {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]`;\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: base64, 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\t// Read text content.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent = buffer.toString(\"utf-8\");\n\t\t\t\t\t\t\t\tconst allLines = textContent.split(\"\\n\");\n\t\t\t\t\t\t\t\tconst totalFileLines = allLines.length;\n\t\t\t\t\t\t\t\t// Apply offset if specified. Convert from 1-indexed input to 0-indexed array access.\n\t\t\t\t\t\t\t\tconst startLine = offset ? Math.max(0, offset - 1) : 0;\n\t\t\t\t\t\t\t\tconst startLineDisplay = startLine + 1;\n\t\t\t\t\t\t\t\t// Check if offset is out of bounds.\n\t\t\t\t\t\t\t\tif (startLine >= allLines.length) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);\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 userLimitedLines: number | undefined;\n\t\t\t\t\t\t\t\t// If limit is specified by the user, honor it first. Otherwise truncateHead decides.\n\t\t\t\t\t\t\t\tif (limit !== undefined) {\n\t\t\t\t\t\t\t\t\tconst endLine = Math.min(startLine + limit, allLines.length);\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine, endLine).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\tselectedContent = allLines.slice(startLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Apply truncation, respecting both line and byte limits.\n\t\t\t\t\t\t\t\tconst truncation = truncateHead(selectedContent);\n\t\t\t\t\t\t\t\tlet outputText: string;\n\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\t\t\t\t\t\t\t// First line alone exceeds the byte limit. Point the model at a bash fallback.\n\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\toutputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (truncation.truncated) {\n\t\t\t\t\t\t\t\t\t// Truncation occurred. Build an actionable continuation notice.\n\t\t\t\t\t\t\t\t\tconst endLineDisplay = startLineDisplay + truncation.outputLines - 1;\n\t\t\t\t\t\t\t\t\tconst nextOffset = endLineDisplay + 1;\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t\tif (truncation.truncatedBy === \"lines\") {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) {\n\t\t\t\t\t\t\t\t\t// User-specified limit stopped early, but the file still has more content.\n\t\t\t\t\t\t\t\t\tconst remaining = allLines.length - (startLine + userLimitedLines);\n\t\t\t\t\t\t\t\t\tconst nextOffset = startLine + userLimitedLines + 1;\n\t\t\t\t\t\t\t\t\toutputText = `${truncation.content}\\n\\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// No truncation and no remaining user-limited content.\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: outputText }];\n\t\t\t\t\t\t\t}\n\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 });\n\t\t\t\t\t\t} catch (error: any) {\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}\n\nexport function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(cwd, options));\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { ImageContent, TextContent } from "@threadwell/ai";
2
+ export declare function shortenPath(path: unknown): string;
3
+ export declare function str(value: unknown): string | null;
4
+ export declare function replaceTabs(text: string): string;
5
+ export declare function normalizeDisplayText(text: string): string;
6
+ export declare function getTextOutput(result: {
7
+ content: Array<{
8
+ type: string;
9
+ text?: string;
10
+ data?: string;
11
+ mimeType?: string;
12
+ }>;
13
+ } | undefined, showImages: boolean): string;
14
+ export type ToolRenderResultLike<TDetails> = {
15
+ content: (TextContent | ImageContent)[];
16
+ details: TDetails;
17
+ };
18
+ export declare function invalidArgText(theme: {
19
+ fg: (name: any, text: string) => string;
20
+ }): string;
21
+ //# sourceMappingURL=render-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKhE,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAOjD;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIjD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,aAAa,CAC5B,MAAM,EAAE;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,SAAS,EACzG,UAAU,EAAE,OAAO,GACjB,MAAM,CAsBR;AAED,MAAM,MAAM,oBAAoB,CAAC,QAAQ,IAAI;IAC5C,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACxC,OAAO,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE;IAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GAAG,MAAM,CAEzF","sourcesContent":["import * as os from \"node:os\";\nimport type { ImageContent, TextContent } from \"@threadwell/ai\";\nimport { getCapabilities, getImageDimensions, imageFallback } from \"@threadwell/tui\";\nimport stripAnsi from \"strip-ansi\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.js\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: { fg: (name: any, text: string) => string }): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n"]}
@@ -0,0 +1,49 @@
1
+ import * as os from "node:os";
2
+ import { getCapabilities, getImageDimensions, imageFallback } from "@threadwell/tui";
3
+ import stripAnsi from "strip-ansi";
4
+ import { sanitizeBinaryOutput } from "../../utils/shell.js";
5
+ export function shortenPath(path) {
6
+ if (typeof path !== "string")
7
+ return "";
8
+ const home = os.homedir();
9
+ if (path.startsWith(home)) {
10
+ return `~${path.slice(home.length)}`;
11
+ }
12
+ return path;
13
+ }
14
+ export function str(value) {
15
+ if (typeof value === "string")
16
+ return value;
17
+ if (value == null)
18
+ return "";
19
+ return null;
20
+ }
21
+ export function replaceTabs(text) {
22
+ return text.replace(/\t/g, " ");
23
+ }
24
+ export function normalizeDisplayText(text) {
25
+ return text.replace(/\r/g, "");
26
+ }
27
+ export function getTextOutput(result, showImages) {
28
+ if (!result)
29
+ return "";
30
+ const textBlocks = result.content.filter((c) => c.type === "text");
31
+ const imageBlocks = result.content.filter((c) => c.type === "image");
32
+ let output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || "")).replace(/\r/g, "")).join("\n");
33
+ const caps = getCapabilities();
34
+ if (imageBlocks.length > 0 && (!caps.images || !showImages)) {
35
+ const imageIndicators = imageBlocks
36
+ .map((img) => {
37
+ const mimeType = img.mimeType ?? "image/unknown";
38
+ const dims = img.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;
39
+ return imageFallback(mimeType, dims);
40
+ })
41
+ .join("\n");
42
+ output = output ? `${output}\n${imageIndicators}` : imageIndicators;
43
+ }
44
+ return output;
45
+ }
46
+ export function invalidArgText(theme) {
47
+ return theme.fg("error", "[invalid arg]");
48
+ }
49
+ //# sourceMappingURL=render-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport type { ImageContent, TextContent } from \"@threadwell/ai\";\nimport { getCapabilities, getImageDimensions, imageFallback } from \"@threadwell/tui\";\nimport stripAnsi from \"strip-ansi\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.js\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: { fg: (name: any, text: string) => string }): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import type { AgentTool } from "@threadwell/agent-core";
2
+ import type { ExtensionContext, ToolDefinition } from "../extensions/types.js";
3
+ /** Wrap a ToolDefinition into an AgentTool for the core runtime. */
4
+ export declare function wrapToolDefinition<TDetails = unknown>(definition: ToolDefinition<any, TDetails>, ctxFactory?: () => ExtensionContext): AgentTool<any, TDetails>;
5
+ /** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */
6
+ export declare function wrapToolDefinitions(definitions: ToolDefinition<any, any>[], ctxFactory?: () => ExtensionContext): AgentTool<any>[];
7
+ /**
8
+ * Synthesize a minimal ToolDefinition from an AgentTool.
9
+ *
10
+ * This keeps AgentSession's internal registry definition-first even when a caller
11
+ * provides plain AgentTool overrides that do not include prompt metadata or renderers.
12
+ */
13
+ export declare function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown>;
14
+ //# sourceMappingURL=tool-definition-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-definition-wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE/E,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,QAAQ,GAAG,OAAO,EACpD,UAAU,EAAE,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,EACzC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAW1B;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EACvC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,CAAC,EAAE,CAElB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAUpG","sourcesContent":["import type { AgentTool } from \"@threadwell/agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.js\";\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctxFactory?.() as ExtensionContext),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}
@@ -0,0 +1,34 @@
1
+ /** Wrap a ToolDefinition into an AgentTool for the core runtime. */
2
+ export function wrapToolDefinition(definition, ctxFactory) {
3
+ return {
4
+ name: definition.name,
5
+ label: definition.label,
6
+ description: definition.description,
7
+ parameters: definition.parameters,
8
+ prepareArguments: definition.prepareArguments,
9
+ executionMode: definition.executionMode,
10
+ execute: (toolCallId, params, signal, onUpdate) => definition.execute(toolCallId, params, signal, onUpdate, ctxFactory?.()),
11
+ };
12
+ }
13
+ /** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */
14
+ export function wrapToolDefinitions(definitions, ctxFactory) {
15
+ return definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));
16
+ }
17
+ /**
18
+ * Synthesize a minimal ToolDefinition from an AgentTool.
19
+ *
20
+ * This keeps AgentSession's internal registry definition-first even when a caller
21
+ * provides plain AgentTool overrides that do not include prompt metadata or renderers.
22
+ */
23
+ export function createToolDefinitionFromAgentTool(tool) {
24
+ return {
25
+ name: tool.name,
26
+ label: tool.label,
27
+ description: tool.description,
28
+ parameters: tool.parameters,
29
+ prepareArguments: tool.prepareArguments,
30
+ executionMode: tool.executionMode,
31
+ execute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),
32
+ };
33
+ }
34
+ //# sourceMappingURL=tool-definition-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-definition-wrapper.js","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CACjC,UAAyC,EACzC,UAAmC,EACR;IAC3B,OAAO;QACN,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CACjD,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAsB,CAAC;KAC7F,CAAC;AAAA,CACF;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAClC,WAAuC,EACvC,UAAmC,EAChB;IACnB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAAA,CACnF;AAED;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,IAAoB,EAAgC;IACrG,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAiB;QAClC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;KAC3G,CAAC;AAAA,CACF","sourcesContent":["import type { AgentTool } from \"@threadwell/agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.js\";\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctxFactory?.() as ExtensionContext),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}