@oh-my-pi/pi-tui 18.4.2 → 18.4.4

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 (463) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/types/apps/cleanse-board.d.ts +17 -0
  3. package/dist/types/apps/git/help.d.ts +16 -0
  4. package/dist/types/apps/git/sidebar.d.ts +18 -0
  5. package/dist/types/apps/live-visualizer.d.ts +10 -0
  6. package/dist/types/apps/ps-top.d.ts +15 -0
  7. package/dist/types/apps/standalone-picker.d.ts +3 -0
  8. package/dist/types/autocomplete.d.ts +8 -0
  9. package/dist/types/chat/advisor-message.d.ts +12 -2
  10. package/dist/types/chat/assistant-message.d.ts +20 -0
  11. package/dist/types/chat/bash-execution.d.ts +9 -0
  12. package/dist/types/chat/chat-transcript-builder.d.ts +6 -1
  13. package/dist/types/chat/collab-prompt-message.d.ts +4 -0
  14. package/dist/types/chat/compaction-summary-message.d.ts +15 -0
  15. package/dist/types/chat/eval-execution.d.ts +8 -0
  16. package/dist/types/chat/execution-shared.d.ts +58 -0
  17. package/dist/types/chat/late-diagnostics-message.d.ts +15 -1
  18. package/dist/types/chat/read-tool-group.d.ts +15 -0
  19. package/dist/types/chat/skill-message.d.ts +9 -0
  20. package/dist/types/chat/stripped-tool-calls-placeholder.d.ts +3 -0
  21. package/dist/types/chat/thinking-display.d.ts +2 -0
  22. package/dist/types/chat/todo-reminder.d.ts +4 -1
  23. package/dist/types/chat/tool-execution.d.ts +25 -1
  24. package/dist/types/chat/transcript-actions.d.ts +37 -0
  25. package/dist/types/chat/transcript-entry.d.ts +3 -1
  26. package/dist/types/chat/user-message.d.ts +25 -0
  27. package/dist/types/chrome/collab-qrcode.d.ts +7 -0
  28. package/dist/types/chrome/context-thresholds.d.ts +11 -0
  29. package/dist/types/chrome/countdown-timer.d.ts +9 -3
  30. package/dist/types/chrome/diff.d.ts +12 -0
  31. package/dist/types/chrome/dynamic-border.d.ts +3 -0
  32. package/dist/types/chrome/format.d.ts +6 -0
  33. package/dist/types/chrome/message-divider.d.ts +13 -0
  34. package/dist/types/chrome/message-frame.d.ts +10 -0
  35. package/dist/types/chrome/message-notice.d.ts +23 -0
  36. package/dist/types/chrome/overlay-box.d.ts +11 -2
  37. package/dist/types/chrome/qrcode.d.ts +7 -0
  38. package/dist/types/chrome/segment-track.d.ts +7 -0
  39. package/dist/types/chrome/selector-helpers.d.ts +0 -6
  40. package/dist/types/chrome/status-notice.d.ts +14 -0
  41. package/dist/types/chrome/streaming-panel.d.ts +3 -0
  42. package/dist/types/chrome/tool-activity.d.ts +3 -0
  43. package/dist/types/chrome/transcript-container.d.ts +13 -0
  44. package/dist/types/chrome/transcript-status.d.ts +15 -3
  45. package/dist/types/components/box.d.ts +7 -0
  46. package/dist/types/components/disclosure.d.ts +9 -0
  47. package/dist/types/components/editor.d.ts +42 -0
  48. package/dist/types/components/form.d.ts +14 -0
  49. package/dist/types/components/image.d.ts +7 -0
  50. package/dist/types/components/input.d.ts +20 -1
  51. package/dist/types/components/key-value-list.d.ts +3 -0
  52. package/dist/types/components/layout/geometry.d.ts +16 -0
  53. package/dist/types/components/layout/row.d.ts +7 -0
  54. package/dist/types/components/layout/split-pane.d.ts +8 -0
  55. package/dist/types/components/layout/stack.d.ts +6 -0
  56. package/dist/types/components/loader.d.ts +48 -0
  57. package/dist/types/components/markdown.d.ts +8 -0
  58. package/dist/types/components/metric.d.ts +7 -0
  59. package/dist/types/components/progress-bar.d.ts +3 -0
  60. package/dist/types/components/scroll-view.d.ts +6 -0
  61. package/dist/types/components/section.d.ts +3 -0
  62. package/dist/types/components/select-list.d.ts +33 -0
  63. package/dist/types/components/settings-list.d.ts +68 -0
  64. package/dist/types/components/spacer.d.ts +4 -0
  65. package/dist/types/components/tab-bar.d.ts +9 -0
  66. package/dist/types/components/table.d.ts +7 -0
  67. package/dist/types/components/text.d.ts +6 -0
  68. package/dist/types/components/tree-view.d.ts +9 -0
  69. package/dist/types/components/truncated-text.d.ts +3 -0
  70. package/dist/types/components/wizard-step.d.ts +6 -0
  71. package/dist/types/hotkeys-markdown.d.ts +24 -0
  72. package/dist/types/index.d.ts +5 -0
  73. package/dist/types/latex-block.d.ts +7 -0
  74. package/dist/types/loop-watchdog.d.ts +9 -0
  75. package/dist/types/native/apply.d.ts +39 -0
  76. package/dist/types/native/backend.d.ts +94 -0
  77. package/dist/types/native/blobs.d.ts +29 -0
  78. package/dist/types/native/describe.d.ts +56 -0
  79. package/dist/types/native/encode.d.ts +50 -0
  80. package/dist/types/native/icons.d.ts +18 -0
  81. package/dist/types/native/memo.d.ts +27 -0
  82. package/dist/types/native/node.d.ts +107 -0
  83. package/dist/types/native/overlay.d.ts +64 -0
  84. package/dist/types/native/picker.d.ts +124 -0
  85. package/dist/types/native/reconcile.d.ts +41 -0
  86. package/dist/types/native/settle.d.ts +11 -0
  87. package/dist/types/native/spans.d.ts +21 -0
  88. package/dist/types/native/state.d.ts +6 -0
  89. package/dist/types/native/tone.d.ts +24 -0
  90. package/dist/types/overlays/advisor-config.d.ts +20 -0
  91. package/dist/types/overlays/agent-hub-renderer.d.ts +27 -11
  92. package/dist/types/overlays/agent-hub.d.ts +10 -0
  93. package/dist/types/overlays/agent-transcript-viewer.d.ts +7 -0
  94. package/dist/types/overlays/agents-hub.d.ts +8 -0
  95. package/dist/types/overlays/annotation-overlay.d.ts +3 -0
  96. package/dist/types/overlays/ask-dialog.d.ts +23 -0
  97. package/dist/types/overlays/bordered-loader.d.ts +3 -0
  98. package/dist/types/overlays/btw-history-panel.d.ts +9 -0
  99. package/dist/types/overlays/btw-panel.d.ts +3 -0
  100. package/dist/types/overlays/cleanse-panel.d.ts +5 -2
  101. package/dist/types/overlays/composer-shape-preview.d.ts +7 -1
  102. package/dist/types/overlays/copy-selector.d.ts +38 -0
  103. package/dist/types/overlays/error-banner.d.ts +9 -0
  104. package/dist/types/overlays/extensions/extension-list.d.ts +1 -0
  105. package/dist/types/overlays/history-search.d.ts +18 -0
  106. package/dist/types/overlays/hook-editor.d.ts +28 -1
  107. package/dist/types/overlays/hook-input.d.ts +3 -0
  108. package/dist/types/overlays/hook-selector.d.ts +10 -0
  109. package/dist/types/overlays/hub-frame.d.ts +18 -0
  110. package/dist/types/overlays/jobs-panel.d.ts +24 -0
  111. package/dist/types/overlays/login-dialog.d.ts +10 -0
  112. package/dist/types/overlays/logout-account-selector.d.ts +4 -0
  113. package/dist/types/overlays/mcp-add-wizard.d.ts +4 -0
  114. package/dist/types/overlays/model-browser.d.ts +69 -0
  115. package/dist/types/overlays/model-hub.d.ts +7 -0
  116. package/dist/types/overlays/model-picker.d.ts +9 -1
  117. package/dist/types/overlays/move-overlay.d.ts +3 -0
  118. package/dist/types/overlays/oauth-selector.d.ts +4 -0
  119. package/dist/types/overlays/omfg-panel.d.ts +3 -0
  120. package/dist/types/overlays/pause-screen.d.ts +12 -0
  121. package/dist/types/overlays/plan-review-overlay.d.ts +5 -0
  122. package/dist/types/overlays/plan-save-overlay.d.ts +10 -0
  123. package/dist/types/overlays/plugin-selector.d.ts +4 -0
  124. package/dist/types/overlays/plugin-settings.d.ts +30 -0
  125. package/dist/types/overlays/queue-mode-selector.d.ts +4 -0
  126. package/dist/types/overlays/reset-usage-selector.d.ts +8 -0
  127. package/dist/types/overlays/rewind-selector.d.ts +5 -0
  128. package/dist/types/overlays/session-info-overlay.d.ts +19 -1
  129. package/dist/types/overlays/session-selector.d.ts +64 -1
  130. package/dist/types/overlays/settings-defs.d.ts +14 -0
  131. package/dist/types/overlays/settings-selector.d.ts +21 -0
  132. package/dist/types/overlays/show-images-selector.d.ts +4 -0
  133. package/dist/types/overlays/snapcompact-shape-preview.d.ts +2 -0
  134. package/dist/types/overlays/stats-notice.d.ts +8 -0
  135. package/dist/types/overlays/theme-selector.d.ts +11 -0
  136. package/dist/types/overlays/thinking-selector.d.ts +4 -0
  137. package/dist/types/overlays/tree-selector.d.ts +60 -2
  138. package/dist/types/overlays/usage-dashboard.d.ts +26 -3
  139. package/dist/types/overlays/usage-row.d.ts +36 -2
  140. package/dist/types/prompt/attachment-chips.d.ts +8 -0
  141. package/dist/types/prompt/composer-attachments.d.ts +15 -3
  142. package/dist/types/prompt/composer.d.ts +18 -1
  143. package/dist/types/prompt/custom-editor.d.ts +48 -2
  144. package/dist/types/prompt/editor-top-gap.d.ts +2 -0
  145. package/dist/types/prompt/macos-spelling.d.ts +6 -0
  146. package/dist/types/prompt/magic-keywords.d.ts +9 -0
  147. package/dist/types/prompt/queued-messages.d.ts +23 -0
  148. package/dist/types/prompt/skill-tokens.d.ts +4 -2
  149. package/dist/types/prompt/welcome.d.ts +16 -0
  150. package/dist/types/render/code-cell.d.ts +10 -0
  151. package/dist/types/render/file-list.d.ts +8 -0
  152. package/dist/types/render/hyperlink.d.ts +14 -0
  153. package/dist/types/render/output-block.d.ts +43 -0
  154. package/dist/types/render/output-pane.d.ts +17 -0
  155. package/dist/types/render/tool-card.d.ts +8 -0
  156. package/dist/types/render/tree-list.d.ts +8 -0
  157. package/dist/types/render/width-aware-text.d.ts +7 -0
  158. package/dist/types/setup/scenes/outro.d.ts +7 -0
  159. package/dist/types/setup/scenes/sign-in.d.ts +16 -9
  160. package/dist/types/setup/scenes/splash.d.ts +8 -0
  161. package/dist/types/setup/scenes/types.d.ts +6 -27
  162. package/dist/types/setup/wizard-overlay.d.ts +9 -0
  163. package/dist/types/status-line/component.d.ts +49 -5
  164. package/dist/types/status-line/context-usage.d.ts +20 -0
  165. package/dist/types/status-line/footer.d.ts +8 -0
  166. package/dist/types/status-line/metrics.d.ts +1 -2
  167. package/dist/types/status-line/segments.d.ts +10 -1
  168. package/dist/types/status-line/types.d.ts +40 -1
  169. package/dist/types/stdin-buffer.d.ts +10 -7
  170. package/dist/types/terminal-capabilities.d.ts +1 -1
  171. package/dist/types/terminal.d.ts +36 -0
  172. package/dist/types/theme/defaults/index.d.ts +100 -0
  173. package/dist/types/theme/schema.d.ts +2 -0
  174. package/dist/types/theme/shimmer.d.ts +8 -0
  175. package/dist/types/theme/theme-class.d.ts +2 -0
  176. package/dist/types/theme/theme.d.ts +33 -1
  177. package/dist/types/tools/ask.d.ts +3 -0
  178. package/dist/types/tools/ast-edit.d.ts +10 -1
  179. package/dist/types/tools/ast-grep.d.ts +10 -1
  180. package/dist/types/tools/autoresearch.d.ts +21 -4
  181. package/dist/types/tools/bash.d.ts +30 -1
  182. package/dist/types/tools/cfg-render.d.ts +5 -1
  183. package/dist/types/tools/debug.d.ts +3 -1
  184. package/dist/types/tools/default-renderer.d.ts +6 -1
  185. package/dist/types/tools/edit.d.ts +14 -1
  186. package/dist/types/tools/eval.d.ts +12 -1
  187. package/dist/types/tools/fetch.d.ts +16 -1
  188. package/dist/types/tools/find.d.ts +15 -1
  189. package/dist/types/tools/github.d.ts +3 -0
  190. package/dist/types/tools/glob.d.ts +14 -1
  191. package/dist/types/tools/goal.d.ts +3 -1
  192. package/dist/types/tools/grep.d.ts +14 -1
  193. package/dist/types/tools/grouped-file-output.d.ts +58 -0
  194. package/dist/types/tools/json-tree.d.ts +20 -0
  195. package/dist/types/tools/lsp.d.ts +3 -10
  196. package/dist/types/tools/mcp.d.ts +16 -1
  197. package/dist/types/tools/memory.d.ts +26 -0
  198. package/dist/types/tools/native-view.d.ts +90 -0
  199. package/dist/types/tools/proc-render.d.ts +7 -1
  200. package/dist/types/tools/read.d.ts +23 -1
  201. package/dist/types/tools/renderer.d.ts +57 -0
  202. package/dist/types/tools/report-tool-issue.d.ts +3 -0
  203. package/dist/types/tools/resolve.d.ts +14 -1
  204. package/dist/types/tools/task.d.ts +3 -0
  205. package/dist/types/tools/think.d.ts +3 -0
  206. package/dist/types/tools/todo.d.ts +12 -0
  207. package/dist/types/tools/vibe.d.ts +3 -1
  208. package/dist/types/tools/wait.d.ts +3 -0
  209. package/dist/types/tools/web-search-types.d.ts +90 -0
  210. package/dist/types/tools/web-search.d.ts +9 -168
  211. package/dist/types/tools/write.d.ts +14 -1
  212. package/dist/types/tools/xdev.d.ts +13 -0
  213. package/dist/types/tui.d.ts +49 -0
  214. package/package.json +9 -9
  215. package/src/apps/autoresearch-dashboard.ts +362 -4
  216. package/src/apps/cleanse-board.ts +219 -1
  217. package/src/apps/cleanse-picker.ts +9 -1
  218. package/src/apps/debug/log-viewer.ts +15 -15
  219. package/src/apps/debug/protocol-probe.ts +2 -20
  220. package/src/apps/git/avatar.ts +2 -22
  221. package/src/apps/git/git-tui.ts +406 -59
  222. package/src/apps/git/help.ts +130 -0
  223. package/src/apps/git/sidebar.ts +491 -0
  224. package/src/apps/live-visualizer.ts +65 -0
  225. package/src/apps/ps-top.ts +448 -17
  226. package/src/apps/session-picker.ts +1 -0
  227. package/src/apps/setup-model-picker.ts +5 -1
  228. package/src/apps/standalone-picker.ts +55 -1
  229. package/src/autocomplete.ts +44 -1
  230. package/src/chat/advisor-message.ts +72 -3
  231. package/src/chat/assistant-message.ts +538 -51
  232. package/src/chat/background-tan-message.ts +4 -4
  233. package/src/chat/bash-execution.ts +81 -0
  234. package/src/chat/cache-invalidation-marker.ts +8 -0
  235. package/src/chat/chat-transcript-builder.ts +37 -6
  236. package/src/chat/collab-prompt-message.ts +15 -3
  237. package/src/chat/compaction-summary-message.ts +74 -1
  238. package/src/chat/custom-message.ts +3 -1
  239. package/src/chat/eval-execution.ts +57 -0
  240. package/src/chat/execution-shared.ts +153 -1
  241. package/src/chat/hook-message.ts +1 -0
  242. package/src/chat/late-diagnostics-message.ts +85 -2
  243. package/src/chat/read-tool-group.ts +341 -1
  244. package/src/chat/served-model-marker.ts +8 -0
  245. package/src/chat/skill-message.ts +63 -0
  246. package/src/chat/stripped-tool-calls-placeholder.ts +18 -10
  247. package/src/chat/thinking-display.ts +73 -11
  248. package/src/chat/todo-reminder.ts +34 -4
  249. package/src/chat/tool-execution.ts +385 -10
  250. package/src/chat/transcript-actions.ts +38 -0
  251. package/src/chat/transcript-browser.ts +2 -9
  252. package/src/chat/transcript-entry.ts +10 -1
  253. package/src/chat/transcript-render-helpers.ts +16 -15
  254. package/src/chat/ttsr-notification.ts +38 -1
  255. package/src/chat/user-message.ts +167 -4
  256. package/src/chrome/collab-qrcode.ts +27 -2
  257. package/src/chrome/context-thresholds.ts +34 -0
  258. package/src/chrome/countdown-timer.ts +24 -1
  259. package/src/chrome/diff.ts +60 -1
  260. package/src/chrome/dynamic-border.ts +7 -0
  261. package/src/chrome/format.ts +12 -0
  262. package/src/chrome/message-divider.ts +33 -1
  263. package/src/chrome/message-frame.ts +53 -10
  264. package/src/chrome/message-notice.ts +71 -0
  265. package/src/chrome/overlay-box.ts +45 -2
  266. package/src/chrome/qrcode.ts +28 -0
  267. package/src/chrome/segment-track.ts +26 -0
  268. package/src/chrome/selector-helpers.ts +1 -17
  269. package/src/chrome/status-notice.ts +46 -0
  270. package/src/chrome/streaming-panel.ts +25 -1
  271. package/src/chrome/tool-activity.ts +20 -0
  272. package/src/chrome/transcript-container.ts +139 -17
  273. package/src/chrome/transcript-status.ts +40 -11
  274. package/src/components/box.ts +51 -0
  275. package/src/components/disclosure.ts +33 -0
  276. package/src/components/editor.ts +239 -36
  277. package/src/components/form.ts +93 -9
  278. package/src/components/image.ts +30 -0
  279. package/src/components/input.ts +77 -26
  280. package/src/components/key-value-list.ts +18 -0
  281. package/src/components/layout/geometry.ts +44 -0
  282. package/src/components/layout/row.ts +30 -0
  283. package/src/components/layout/split-pane.ts +65 -0
  284. package/src/components/layout/stack.ts +27 -0
  285. package/src/components/loader.ts +183 -1
  286. package/src/components/markdown.ts +131 -56
  287. package/src/components/metric.ts +39 -0
  288. package/src/components/progress-bar.ts +28 -0
  289. package/src/components/scroll-view.ts +23 -0
  290. package/src/components/section.ts +16 -0
  291. package/src/components/select-list.ts +174 -25
  292. package/src/components/settings-list.ts +264 -7
  293. package/src/components/spacer.ts +17 -0
  294. package/src/components/tab-bar.ts +42 -0
  295. package/src/components/table.ts +34 -0
  296. package/src/components/text.ts +23 -0
  297. package/src/components/tree-view.ts +65 -0
  298. package/src/components/truncated-text.ts +14 -0
  299. package/src/components/wizard-step.ts +18 -9
  300. package/src/debug-server.ts +14 -7
  301. package/src/hotkeys-markdown.ts +251 -69
  302. package/src/index.ts +6 -0
  303. package/src/latex-block.ts +11 -0
  304. package/src/loop-watchdog.ts +38 -10
  305. package/src/native/apply.ts +275 -0
  306. package/src/native/backend.ts +682 -0
  307. package/src/native/blobs.ts +70 -0
  308. package/src/native/describe.ts +124 -0
  309. package/src/native/encode.ts +233 -0
  310. package/src/native/icons.ts +184 -0
  311. package/src/native/memo.ts +64 -0
  312. package/src/native/node.ts +112 -0
  313. package/src/native/overlay.ts +131 -0
  314. package/src/native/picker.ts +333 -0
  315. package/src/native/reconcile.ts +1063 -0
  316. package/src/native/settle.ts +23 -0
  317. package/src/native/spans.ts +308 -0
  318. package/src/native/state.ts +28 -0
  319. package/src/native/tone.ts +79 -0
  320. package/src/overlays/advisor-config.ts +420 -0
  321. package/src/overlays/agent-hub-renderer.ts +155 -18
  322. package/src/overlays/agent-hub.ts +1037 -44
  323. package/src/overlays/agent-transcript-viewer.ts +129 -0
  324. package/src/overlays/agents-hub.ts +688 -53
  325. package/src/overlays/annotation-overlay.ts +391 -52
  326. package/src/overlays/ask-dialog.ts +435 -24
  327. package/src/overlays/bordered-loader.ts +17 -0
  328. package/src/overlays/btw-history-panel.ts +182 -0
  329. package/src/overlays/btw-panel.ts +68 -2
  330. package/src/overlays/cleanse-panel.ts +105 -15
  331. package/src/overlays/codex-reset-fireworks.ts +65 -5
  332. package/src/overlays/composer-shape-preview.ts +26 -1
  333. package/src/overlays/copy-selector.ts +545 -23
  334. package/src/overlays/error-banner.ts +44 -0
  335. package/src/overlays/extensions/extension-list.ts +23 -17
  336. package/src/overlays/history-search.ts +175 -33
  337. package/src/overlays/hook-editor.ts +113 -6
  338. package/src/overlays/hook-input.ts +22 -1
  339. package/src/overlays/hook-selector.ts +311 -22
  340. package/src/overlays/hub-frame.ts +80 -0
  341. package/src/overlays/jobs-panel.ts +112 -0
  342. package/src/overlays/login-dialog.ts +183 -1
  343. package/src/overlays/logout-account-selector.ts +102 -4
  344. package/src/overlays/mcp-add-wizard.ts +232 -53
  345. package/src/overlays/model-browser.ts +681 -22
  346. package/src/overlays/model-hub.ts +1402 -78
  347. package/src/overlays/model-picker.ts +184 -7
  348. package/src/overlays/move-overlay.ts +45 -0
  349. package/src/overlays/oauth-selector.ts +227 -23
  350. package/src/overlays/omfg-panel.ts +86 -2
  351. package/src/overlays/pause-screen.ts +55 -4
  352. package/src/overlays/plan-review-overlay.ts +352 -0
  353. package/src/overlays/plan-save-overlay.ts +45 -0
  354. package/src/overlays/plugin-selector.ts +21 -1
  355. package/src/overlays/plugin-settings.ts +195 -5
  356. package/src/overlays/queue-mode-selector.ts +19 -1
  357. package/src/overlays/reset-usage-selector.ts +110 -40
  358. package/src/overlays/rewind-selector.ts +458 -44
  359. package/src/overlays/session-account-selector.ts +1 -1
  360. package/src/overlays/session-info-overlay.ts +137 -1
  361. package/src/overlays/session-selector.ts +807 -46
  362. package/src/overlays/settings-defs.ts +41 -0
  363. package/src/overlays/settings-selector.ts +585 -33
  364. package/src/overlays/show-images-selector.ts +18 -1
  365. package/src/overlays/snapcompact-shape-preview.ts +48 -3
  366. package/src/overlays/stats-notice.ts +31 -0
  367. package/src/overlays/theme-selector.ts +31 -1
  368. package/src/overlays/thinking-selector.ts +22 -1
  369. package/src/overlays/tree-selector.ts +570 -110
  370. package/src/overlays/usage-dashboard.ts +587 -12
  371. package/src/overlays/usage-row.ts +161 -25
  372. package/src/prompt/attachment-chips.ts +60 -0
  373. package/src/prompt/composer-attachments.ts +31 -9
  374. package/src/prompt/composer.ts +55 -2
  375. package/src/prompt/custom-editor.ts +302 -4
  376. package/src/prompt/editor-top-gap.ts +8 -0
  377. package/src/prompt/macos-spelling.ts +24 -9
  378. package/src/prompt/magic-keywords.ts +22 -1
  379. package/src/prompt/model-mention-autocomplete.ts +1 -0
  380. package/src/prompt/queued-messages.ts +101 -0
  381. package/src/prompt/skill-tokens.ts +5 -3
  382. package/src/prompt/welcome.ts +213 -6
  383. package/src/render/code-cell.ts +103 -2
  384. package/src/render/file-list.ts +29 -0
  385. package/src/render/hyperlink.ts +32 -0
  386. package/src/render/output-block.ts +110 -0
  387. package/src/render/output-pane.ts +37 -0
  388. package/src/render/tool-card.ts +137 -0
  389. package/src/render/tree-list.ts +39 -0
  390. package/src/render/width-aware-text.ts +20 -0
  391. package/src/setup/scenes/composer.ts +29 -0
  392. package/src/setup/scenes/glyph.ts +15 -0
  393. package/src/setup/scenes/model.ts +36 -8
  394. package/src/setup/scenes/outro.ts +28 -1
  395. package/src/setup/scenes/sign-in.ts +138 -24
  396. package/src/setup/scenes/splash.ts +28 -1
  397. package/src/setup/scenes/theme.ts +88 -3
  398. package/src/setup/scenes/types.ts +7 -28
  399. package/src/setup/startup-splash.ts +46 -9
  400. package/src/setup/wizard-overlay.ts +140 -23
  401. package/src/setup/wizard.ts +1 -1
  402. package/src/status-line/component.ts +414 -18
  403. package/src/status-line/context-usage.ts +279 -50
  404. package/src/status-line/footer.ts +94 -1
  405. package/src/status-line/metrics.ts +3 -6
  406. package/src/status-line/segments.ts +463 -97
  407. package/src/status-line/separators.ts +3 -16
  408. package/src/status-line/types.ts +43 -1
  409. package/src/stdin-buffer.ts +27 -21
  410. package/src/terminal-capabilities.ts +7 -0
  411. package/src/terminal.ts +153 -11
  412. package/src/theme/defaults/dark-neon-noir.json +100 -0
  413. package/src/theme/defaults/index.ts +2 -0
  414. package/src/theme/defaults/light-prism.json +5 -5
  415. package/src/theme/defaults/onyx.json +62 -62
  416. package/src/theme/mermaid-cache.ts +10 -1
  417. package/src/theme/schema.ts +15 -0
  418. package/src/theme/shimmer.ts +33 -0
  419. package/src/theme/theme-class.ts +24 -19
  420. package/src/theme/theme.ts +111 -9
  421. package/src/theme/tui-adapters.ts +14 -1
  422. package/src/tools/ask.ts +157 -1
  423. package/src/tools/ast-edit.ts +174 -1
  424. package/src/tools/ast-grep.ts +82 -2
  425. package/src/tools/autoresearch.ts +149 -1
  426. package/src/tools/bash.ts +233 -62
  427. package/src/tools/cfg-render.ts +66 -1
  428. package/src/tools/debug.ts +78 -1
  429. package/src/tools/default-renderer.ts +35 -1
  430. package/src/tools/edit.ts +357 -31
  431. package/src/tools/eval.ts +257 -1
  432. package/src/tools/fetch.ts +102 -3
  433. package/src/tools/find.ts +127 -1
  434. package/src/tools/github.ts +119 -10
  435. package/src/tools/glob.ts +116 -1
  436. package/src/tools/goal.ts +56 -1
  437. package/src/tools/grep.ts +83 -2
  438. package/src/tools/grouped-file-output.ts +205 -0
  439. package/src/tools/json-tree.ts +116 -1
  440. package/src/tools/lsp.ts +318 -1
  441. package/src/tools/mcp.ts +80 -1
  442. package/src/tools/memory.ts +93 -11
  443. package/src/tools/native-view.ts +292 -0
  444. package/src/tools/proc-render.ts +221 -1
  445. package/src/tools/read.ts +199 -4
  446. package/src/tools/renderer.ts +61 -0
  447. package/src/tools/report-tool-issue.ts +7 -1
  448. package/src/tools/resolve.ts +63 -1
  449. package/src/tools/streaming-output.ts +79 -16
  450. package/src/tools/task.ts +406 -4
  451. package/src/tools/think.ts +19 -1
  452. package/src/tools/todo.ts +89 -0
  453. package/src/tools/vibe.ts +230 -2
  454. package/src/tools/wait.ts +181 -1
  455. package/src/tools/web-search-types.ts +99 -0
  456. package/src/tools/web-search.ts +111 -170
  457. package/src/tools/write.ts +144 -5
  458. package/src/tools/xdev.ts +64 -1
  459. package/src/tui.ts +295 -4
  460. package/dist/types/setup/scenes/providers.d.ts +0 -3
  461. package/dist/types/setup/scenes/web-search.d.ts +0 -22
  462. package/src/setup/scenes/providers.ts +0 -110
  463. package/src/setup/scenes/web-search.ts +0 -165
package/src/tools/edit.ts CHANGED
@@ -6,9 +6,22 @@ import { type EditInspection, editInspect } from "@oh-my-pi/pi-natives";
6
6
  import type { Component } from "../tui";
7
7
  import { sliceWithWidth, visibleWidth, wrapTextWithAnsi } from "../utils";
8
8
  import { sanitizeText } from "@oh-my-pi/pi-utils";
9
- import type { RenderResultOptions, ToolRenderer } from "./renderer";
9
+ import type { NativeToolHead, NativeToolView, RenderResultOptions, ToolRenderer } from "./renderer";
10
+ import { code, compact, node, span } from "../native/describe";
11
+ import type { NativeChild, NativeNode } from "../native/node";
12
+ import {
13
+ diagnosticsBadge,
14
+ diagnosticsSection,
15
+ diffStatsMeta,
16
+ displayPath,
17
+ errorText,
18
+ fileDiffSection,
19
+ fileHref,
20
+ noteText,
21
+ resultText,
22
+ } from "./native-view";
10
23
  import type { FileDiagnosticsResult } from "./lsp";
11
- import { renderDiff as renderDiffColored } from "../chrome/diff";
24
+ import { nativeDiff, renderDiff as renderDiffColored } from "../chrome/diff";
12
25
  import { getLanguageFromPath } from "../lang-from-path";
13
26
  import type { Theme } from "../theme/theme";
14
27
  import type { OutputMeta } from "./output-meta";
@@ -239,16 +252,14 @@ function decodePartialJsonStringFragment(fragment: string): string {
239
252
  }
240
253
  }
241
254
 
242
- function extractPartialJsonString(partialJson: string | undefined, key: string): string | undefined {
243
- if (!partialJson) return undefined;
244
- const pattern = new RegExp(`"${key}"\\s*:\\s*"((?:\\\\.|[^"\\\\])*)`, "u");
245
- const match = pattern.exec(partialJson);
246
- if (!match) return undefined;
247
- return decodePartialJsonStringFragment(match[1]);
248
- }
255
+ // `"path": "<possibly unterminated string>` in a raw streamed args buffer.
256
+ const PARTIAL_JSON_PATH_RE = /"path"\s*:\s*"((?:\\.|[^"\\])*)/u;
249
257
 
250
258
  function getPartialJsonEditPath(args: EditRenderArgs): string | undefined {
251
- return filePathFromEditEntry(extractPartialJsonString(args.__partialJson, "path"));
259
+ const partialJson = args.__partialJson;
260
+ if (!partialJson) return undefined;
261
+ const match = PARTIAL_JSON_PATH_RE.exec(partialJson);
262
+ return match ? decodePartialJsonStringFragment(match[1]!) : undefined;
252
263
  }
253
264
 
254
265
  /** Count distinct file paths in an edits array. */
@@ -427,8 +438,33 @@ function hasEditCallPayload(args: EditRenderArgs, renderContext: EditRenderConte
427
438
  return false;
428
439
  }
429
440
 
441
+ /**
442
+ * Head-window preview of streamed replacement text. Only the displayed head is
443
+ * sanitized and split; the hidden-line count comes from a raw newline scan.
444
+ * That matches sanitizing the whole text because, on ESC-free input,
445
+ * `sanitizeText` only deletes individual code units and never a `\n`: the
446
+ * cut sits on a `\n`, so it cannot split a surrogate pair. The one non-local
447
+ * rule — a lone surrogate anywhere drops every U+FFFD — is replayed on the
448
+ * head. ESC-bearing text (ANSI stripping can span lines) takes the full path.
449
+ */
430
450
  function renderPlainTextPreview(text: string, uiTheme: Theme, _filePath?: string): string {
431
- const previewLines = cappedHeadLines(sanitizeText(text).split("\n"), CALL_TEXT_PREVIEW_LINES);
451
+ let previewLines: { lines: readonly string[]; hidden: number };
452
+ let headEnd = -1;
453
+ if (!text.includes("\x1b")) {
454
+ for (let newlines = 0; newlines < CALL_TEXT_PREVIEW_LINES; newlines++) {
455
+ headEnd = text.indexOf("\n", headEnd + 1);
456
+ if (headEnd === -1) break;
457
+ }
458
+ }
459
+ if (headEnd === -1) {
460
+ previewLines = cappedHeadLines(sanitizeText(text).split("\n"), CALL_TEXT_PREVIEW_LINES);
461
+ } else {
462
+ let head = sanitizeText(text.slice(0, headEnd));
463
+ if (head.includes("\ufffd") && !text.isWellFormed()) head = head.replaceAll("\ufffd", "");
464
+ let hidden = 1;
465
+ for (let i = text.indexOf("\n", headEnd + 1); i !== -1; i = text.indexOf("\n", i + 1)) hidden++;
466
+ previewLines = { lines: head.split("\n"), hidden };
467
+ }
432
468
  let preview = "\n\n";
433
469
  for (const line of previewLines.lines) {
434
470
  preview += `${uiTheme.fg("toolOutput", truncateToWidth(replaceTabs(line), CALL_TEXT_PREVIEW_WIDTH))}\n`;
@@ -751,17 +787,30 @@ interface EditCallFacts {
751
787
  * fields tolerate a small lag) or when the payload shrinks (rewind). The
752
788
  * final frame (`isPartial === false`) always recomputes. This turns the
753
789
  * per-frame O(n) stringify+parse+scan into O(n^2/K) total per call.
790
+ *
791
+ * The reveal hands over a fresh args object on every frame, so the gate
792
+ * keys on the streamed raw payload (`__partialJson`) rather than on args
793
+ * identity: a frame reuses the facts only when its payload extends, byte for
794
+ * byte, the payload the facts were derived from, and every direct field the
795
+ * facts read (path, file_path, rename, op, edits) is unchanged. Final args
796
+ * carry no `__partialJson`, so the completed call always derives exact facts.
754
797
  */
755
798
  const EDIT_FACTS_MIN_GROWTH = 512;
756
- let lastFactsCache:
757
- | {
758
- editArgs: EditRenderArgs;
759
- isPartial: boolean;
760
- editMode: EditMode | undefined;
761
- length: number;
762
- facts: EditCallFacts;
763
- }
764
- | undefined;
799
+ interface EditFactsCacheEntry {
800
+ editArgs: EditRenderArgs;
801
+ isPartial: boolean;
802
+ editMode: EditMode | undefined;
803
+ length: number;
804
+ /** Streamed raw payload the facts were derived from; set only for streamed `input` payloads. */
805
+ streamedPayload: string | undefined;
806
+ filePath: unknown;
807
+ path: unknown;
808
+ rename: unknown;
809
+ op: Operation | undefined;
810
+ edits: EditRenderEntry[] | undefined;
811
+ facts: EditCallFacts;
812
+ }
813
+ let lastFactsCache: EditFactsCacheEntry | undefined;
765
814
 
766
815
  function editFactsInputLength(editArgs: EditRenderArgs): number {
767
816
  const input = editArgs.input ?? editArgs._input;
@@ -772,27 +821,72 @@ function editFactsInputLength(editArgs: EditRenderArgs): number {
772
821
  return Array.isArray(editArgs.edits) ? editArgs.edits.length : 0;
773
822
  }
774
823
 
824
+ /**
825
+ * Raw streamed payload of a mid-stream `input` edit, or undefined when the
826
+ * args are final (no `__partialJson`) or carry no `input` string — only the
827
+ * `input` payloads pay the expensive whole-payload inspect per frame.
828
+ */
829
+ function streamedInputPayload(editArgs: EditRenderArgs): string | undefined {
830
+ if (typeof (editArgs.input ?? editArgs._input) !== "string") return undefined;
831
+ const payload = editArgs.__partialJson;
832
+ return typeof payload === "string" ? payload : undefined;
833
+ }
834
+
835
+ /**
836
+ * Whether a fresh streamed frame continues the payload `cached` was derived
837
+ * from within the growth gate. Exact: the cached payload must be a verbatim
838
+ * prefix of the new one, so a rewind or another call's payload never reuses.
839
+ */
840
+ function continuesCachedPayload(cached: EditFactsCacheEntry, editArgs: EditRenderArgs): boolean {
841
+ const base = cached.streamedPayload;
842
+ if (base === undefined) return false;
843
+ const payload = streamedInputPayload(editArgs);
844
+ if (payload === undefined || payload.length < base.length) return false;
845
+ if (payload.length - base.length >= EDIT_FACTS_MIN_GROWTH) return false;
846
+ if (
847
+ editArgs.file_path !== cached.filePath ||
848
+ editArgs.path !== cached.path ||
849
+ editArgs.rename !== cached.rename ||
850
+ editArgs.op !== cached.op ||
851
+ editArgs.edits !== cached.edits
852
+ ) {
853
+ return false;
854
+ }
855
+ return payload.startsWith(base);
856
+ }
857
+
775
858
  function resolveEditCallFacts(
776
859
  editArgs: EditRenderArgs,
777
860
  isPartial: boolean,
778
861
  editMode: EditMode | undefined,
779
862
  ): EditCallFacts {
780
863
  const cached = lastFactsCache;
781
- if (
782
- cached !== undefined &&
783
- cached.editArgs === editArgs &&
784
- cached.isPartial === isPartial &&
785
- cached.editMode === editMode
786
- ) {
787
- const length = editFactsInputLength(editArgs);
788
- // Same args object, still growing gradually: reuse. A rewind
789
- // (shorter), a jump past the gate, or the final frame recomputes.
790
- if (isPartial && length >= cached.length && length - cached.length < EDIT_FACTS_MIN_GROWTH) {
864
+ if (cached !== undefined && isPartial && cached.isPartial && cached.editMode === editMode) {
865
+ if (cached.editArgs === editArgs) {
866
+ const length = editFactsInputLength(editArgs);
867
+ // Same args object, still growing gradually: reuse. A rewind
868
+ // (shorter), a jump past the gate, or the final frame recomputes.
869
+ if (length >= cached.length && length - cached.length < EDIT_FACTS_MIN_GROWTH) {
870
+ return cached.facts;
871
+ }
872
+ } else if (continuesCachedPayload(cached, editArgs)) {
791
873
  return cached.facts;
792
874
  }
793
875
  }
794
876
  const facts = resolveEditCallFactsUncached(editArgs, isPartial, editMode);
795
- lastFactsCache = { editArgs, isPartial, editMode, length: editFactsInputLength(editArgs), facts };
877
+ lastFactsCache = {
878
+ editArgs,
879
+ isPartial,
880
+ editMode,
881
+ length: editFactsInputLength(editArgs),
882
+ streamedPayload: streamedInputPayload(editArgs),
883
+ filePath: editArgs.file_path,
884
+ path: editArgs.path,
885
+ rename: editArgs.rename,
886
+ op: editArgs.op,
887
+ edits: editArgs.edits,
888
+ facts,
889
+ };
796
890
  return facts;
797
891
  }
798
892
 
@@ -1030,6 +1124,116 @@ export const editToolRenderer = {
1030
1124
  });
1031
1125
  },
1032
1126
 
1127
+ describeCall(
1128
+ args: EditRenderArgs,
1129
+ options: RenderResultOptions & { renderContext?: EditRenderContext },
1130
+ ): NativeToolView {
1131
+ const renderContext = options.renderContext;
1132
+ const { rawPath, rename, op, fileCount, applyPatchError } = resolveEditCallFacts(
1133
+ args,
1134
+ options.isPartial,
1135
+ renderContext?.editMode,
1136
+ );
1137
+ const body: NativeChild[] = [];
1138
+ let tool: NativeToolHead;
1139
+ const multi = renderContext?.perFileDiffPreview;
1140
+ if (multi && multi.length > 1 && multi.some(p => p.diff || p.error)) {
1141
+ let added = 0;
1142
+ let removed = 0;
1143
+ for (const preview of multi) {
1144
+ const stats = preview.diff ? getDiffStats(preview.diff) : undefined;
1145
+ added += stats?.added ?? 0;
1146
+ removed += stats?.removed ?? 0;
1147
+ body.push(
1148
+ fileDiffSection(
1149
+ { path: preview.path, added: stats?.added, removed: stats?.removed },
1150
+ [preview.error ? errorText(preview.error) : editDiff(preview.diff ?? "", preview.path)],
1151
+ { role: "omp.tool.edit.file", tone: preview.error ? "error" : undefined },
1152
+ ),
1153
+ );
1154
+ }
1155
+ tool = editToolHead({ op, files: Math.max(fileCount, multi.length), added, removed });
1156
+ } else {
1157
+ let diffText: string | undefined;
1158
+ let firstChangedLine: number | undefined;
1159
+ if (args.previewDiff || (args.diff && args.op)) {
1160
+ diffText = args.previewDiff ?? args.diff ?? "";
1161
+ body.push(editDiff(diffText, rawPath));
1162
+ } else if (args.diff || args.newText || args.patch) {
1163
+ body.push(code(args.diff ?? args.newText ?? args.patch ?? "", { lang: getLanguageFromPath(rawPath) }));
1164
+ } else if (renderContext?.editDiffPreview) {
1165
+ const preview = renderContext.editDiffPreview;
1166
+ if ("error" in preview && preview.error) body.push(errorText(preview.error));
1167
+ else if (preview.diff) {
1168
+ diffText = preview.diff;
1169
+ firstChangedLine = preview.firstChangedLine;
1170
+ body.push(editDiff(preview.diff, rawPath));
1171
+ }
1172
+ }
1173
+ const stats = diffText ? getDiffStats(diffText) : undefined;
1174
+ tool = editToolHead({
1175
+ op,
1176
+ path: rawPath,
1177
+ files: fileCount,
1178
+ line: firstChangedLine,
1179
+ rename,
1180
+ added: stats?.added ?? 0,
1181
+ removed: stats?.removed ?? 0,
1182
+ });
1183
+ }
1184
+ if (applyPatchError) body.push(errorText(applyPatchError));
1185
+ return { tool, body, tone: applyPatchError ? "error" : undefined };
1186
+ },
1187
+
1188
+ describeResult(
1189
+ result: { content: Array<{ type: string; text?: string }>; details?: EditToolDetails; isError?: boolean },
1190
+ options: RenderResultOptions & { renderContext?: EditRenderContext },
1191
+ args?: EditRenderArgs,
1192
+ ): NativeToolView {
1193
+ const edits = Array.isArray(args?.edits) ? args.edits : undefined;
1194
+ const perFileResults = result.details?.perFileResults;
1195
+ const totalFiles = edits ? countEditFiles(edits) : 0;
1196
+ if (perFileResults && (perFileResults.length > 1 || totalFiles > 1)) {
1197
+ const remaining = Math.max(0, totalFiles - perFileResults.length);
1198
+ let added = 0;
1199
+ let removed = 0;
1200
+ // Files are borderless sections inside the one tool frame.
1201
+ const body: NativeChild[] = perFileResults.map(fileResult => {
1202
+ const file = editFileParts({ content: [], details: fileResult, isError: fileResult.isError }, options);
1203
+ added += file.added;
1204
+ removed += file.removed;
1205
+ return fileDiffSection(file, file.body, {
1206
+ role: "omp.tool.edit.file",
1207
+ tone: file.isError ? "error" : undefined,
1208
+ });
1209
+ });
1210
+ if (remaining > 0) {
1211
+ body.push(
1212
+ node("spinner", {
1213
+ label: [span(`${remaining} more file${remaining > 1 ? "s" : ""} pending…`, "muted")],
1214
+ }),
1215
+ );
1216
+ }
1217
+ const failed = perFileResults.some(file => file.isError);
1218
+ return {
1219
+ tool: editToolHead({
1220
+ files: Math.max(totalFiles, perFileResults.length),
1221
+ added,
1222
+ removed,
1223
+ diagnostics: perFileResults.map(file => file.diagnostics),
1224
+ }),
1225
+ body,
1226
+ tone: failed ? "error" : undefined,
1227
+ };
1228
+ }
1229
+ const file = editFileParts(result, options, args);
1230
+ return {
1231
+ tool: editToolHead({ ...file, href: fileHref(file.resolvedPath), diagnostics: [file.fileDiagnostics] }),
1232
+ body: file.body,
1233
+ tone: file.isError ? "error" : undefined,
1234
+ };
1235
+ },
1236
+
1033
1237
  renderResult(
1034
1238
  result: { content: Array<{ type: string; text?: string }>; details?: EditToolDetails; isError?: boolean },
1035
1239
  options: RenderResultOptions & { renderContext?: EditRenderContext },
@@ -1046,6 +1250,128 @@ export const editToolRenderer = {
1046
1250
  },
1047
1251
  } satisfies ToolRenderer<EditRenderArgs, EditToolDetails>;
1048
1252
 
1253
+ /** Facts behind a native edit head: one file (path, first changed line, rename) or a file count. */
1254
+ interface EditHeadFacts {
1255
+ op?: Operation;
1256
+ path?: string;
1257
+ /** Distinct files in the call; more than one heads the call as `N files`. */
1258
+ files?: number;
1259
+ line?: number;
1260
+ href?: string;
1261
+ rename?: string;
1262
+ added: number;
1263
+ removed: number;
1264
+ diagnostics?: readonly (FileDiagnosticsResult | undefined)[];
1265
+ }
1266
+
1267
+ /**
1268
+ * Native edit head (§7.3): `Edit · path:line · +8 −1 · → new/path` for one
1269
+ * file, `Edit · 3 files · +21 −4` for several; a diagnostics chip when LSP reported.
1270
+ */
1271
+ function editToolHead(facts: EditHeadFacts): NativeToolHead {
1272
+ const multi = (facts.files ?? 0) > 1;
1273
+ const meta = compact([
1274
+ diffStatsMeta(facts.added, facts.removed),
1275
+ !multi && facts.rename ? `→ ${displayPath(facts.rename)}` : undefined,
1276
+ ]);
1277
+ const badge = facts.diagnostics && diagnosticsBadge(facts.diagnostics);
1278
+ const target = multi
1279
+ ? `${facts.files} files`
1280
+ : facts.path
1281
+ ? `${displayPath(facts.path)}${facts.line ? `:${facts.line}` : ""}`
1282
+ : undefined;
1283
+ return {
1284
+ title: multi ? "Edit" : getOperationTitle(facts.op),
1285
+ target,
1286
+ targetKind: multi ? "text" : "path",
1287
+ href: multi ? undefined : facts.href,
1288
+ meta: meta.length > 0 ? meta : undefined,
1289
+ badges: badge ? [badge] : undefined,
1290
+ };
1291
+ }
1292
+
1293
+ /** A file's diff: hunks highlighted by the path's language, no path header (the head or section names the file). */
1294
+ function editDiff(diffText: string, filePath: string): NativeNode {
1295
+ return nativeDiff(diffText, { lang: filePath ? getLanguageFromPath(filePath) : undefined });
1296
+ }
1297
+
1298
+ /** One file's edit result for native views: head facts plus its body (diff or error, then diagnostics). */
1299
+ interface EditFileParts extends Omit<EditHeadFacts, "diagnostics"> {
1300
+ path: string;
1301
+ /** Absolute path the edit resolved to, when known. */
1302
+ resolvedPath?: string;
1303
+ isError: boolean;
1304
+ fileDiagnostics?: FileDiagnosticsResult;
1305
+ body: NativeChild[];
1306
+ }
1307
+
1308
+ function editFileParts(
1309
+ result: {
1310
+ content: Array<{ type: string; text?: string }>;
1311
+ details?: EditToolDetails | EditToolPerFileResult;
1312
+ isError?: boolean;
1313
+ },
1314
+ options: RenderResultOptions & { renderContext?: EditRenderContext },
1315
+ args?: EditRenderArgs,
1316
+ ): EditFileParts {
1317
+ const details = result.details;
1318
+ const isError = result.isError ?? (details && "isError" in details ? details.isError : false) ?? false;
1319
+ const firstEdit = Array.isArray(args?.edits) ? args.edits[0] : undefined;
1320
+ const firstHashlineInputEntry = getHashlineInputRenderSummary(args ?? {}, options.renderContext?.editMode)
1321
+ ?.entries[0];
1322
+ const moveSource =
1323
+ details && "sourcePath" in details && typeof details.sourcePath === "string" ? details.sourcePath : undefined;
1324
+ const detailPath = details && "path" in details && typeof details.path === "string" ? details.path : undefined;
1325
+ const rawPath =
1326
+ moveSource ??
1327
+ (typeof args?.file_path === "string"
1328
+ ? args.file_path
1329
+ : typeof args?.path === "string"
1330
+ ? args.path
1331
+ : (filePathFromEditEntry(firstEdit?.path) ?? detailPath ?? firstHashlineInputEntry?.path ?? ""));
1332
+ const op = args?.op || firstEdit?.op || details?.op;
1333
+ const rename =
1334
+ (typeof args?.rename === "string" ? args.rename : undefined) ??
1335
+ filePathFromEditEntry(firstEdit?.rename) ??
1336
+ filePathFromEditEntry(firstEdit?.move) ??
1337
+ (details && "move" in details && typeof details.move === "string" ? details.move : undefined);
1338
+ const editDiffPreview = details ? undefined : options.renderContext?.editDiffPreview;
1339
+ const previewDiff = editDiffPreview && !("error" in editDiffPreview) ? editDiffPreview.diff : undefined;
1340
+ const diffText = isError ? undefined : details?.diff || previewDiff;
1341
+ const firstChangedLine =
1342
+ (editDiffPreview && "firstChangedLine" in editDiffPreview ? editDiffPreview.firstChangedLine : undefined) ||
1343
+ (details && !isError ? details.firstChangedLine : undefined);
1344
+ const shownPath = displayPath(detailPath ?? rawPath);
1345
+ const body: NativeChild[] = [];
1346
+ if (isError) {
1347
+ const displayErrorText = details && "displayErrorText" in details ? details.displayErrorText : undefined;
1348
+ const message =
1349
+ displayErrorText || (details && "errorText" in details && details.errorText) || resultText(result);
1350
+ if (message) body.push(errorText(message));
1351
+ } else if (diffText) {
1352
+ body.push(editDiff(diffText, detailPath ?? rawPath));
1353
+ } else if (editDiffPreview && "error" in editDiffPreview) {
1354
+ body.push(errorText(editDiffPreview.error));
1355
+ } else if (details && op !== "delete" && op !== "create" && !rename) {
1356
+ body.push(noteText(`No changes were made${shownPath ? ` to ${shownPath}` : ""}.`));
1357
+ }
1358
+ const diagnostics = diagnosticsSection(details?.diagnostics);
1359
+ if (diagnostics) body.push(diagnostics);
1360
+ const stats = diffText ? getDiffStats(diffText) : undefined;
1361
+ return {
1362
+ op,
1363
+ path: rawPath,
1364
+ line: firstChangedLine,
1365
+ rename,
1366
+ resolvedPath: detailPath,
1367
+ added: stats?.added ?? 0,
1368
+ removed: stats?.removed ?? 0,
1369
+ isError: Boolean(isError),
1370
+ fileDiagnostics: details?.diagnostics,
1371
+ body,
1372
+ };
1373
+ }
1374
+
1049
1375
  function renderSingleFileResult(
1050
1376
  result: {
1051
1377
  content: Array<{ type: string; text?: string }>;