@oh-my-pi/pi-coding-agent 7.0.0 → 8.0.0

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 (501) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/README.md +1 -1
  3. package/docs/hooks.md +2 -2
  4. package/docs/sdk.md +1 -1
  5. package/package.json +10 -10
  6. package/scripts/format-prompts.ts +143 -0
  7. package/scripts/generate-template.ts +1 -1
  8. package/src/cli/args.ts +3 -3
  9. package/src/cli/config-cli.ts +4 -4
  10. package/src/cli/file-processor.ts +3 -3
  11. package/src/cli/list-models.ts +2 -2
  12. package/src/cli/plugin-cli.ts +3 -3
  13. package/src/cli/session-picker.ts +2 -2
  14. package/src/cli/setup-cli.ts +2 -2
  15. package/src/cli/stats-cli.ts +1 -1
  16. package/src/cli/update-cli.ts +2 -2
  17. package/src/{core → config}/keybindings.ts +1 -1
  18. package/src/{core → config}/model-registry.ts +1 -1
  19. package/src/{core → config}/model-resolver.ts +3 -3
  20. package/src/{core → config}/prompt-templates.ts +2 -2
  21. package/src/{core → config}/settings-manager.ts +6 -6
  22. package/src/{core/cursor/exec-bridge.ts → cursor.ts} +4 -4
  23. package/src/discovery/agents-md.ts +4 -4
  24. package/src/discovery/builtin.ts +17 -17
  25. package/src/discovery/claude.ts +12 -12
  26. package/src/discovery/cline.ts +6 -6
  27. package/src/discovery/codex.ts +21 -21
  28. package/src/discovery/cursor.ts +9 -9
  29. package/src/discovery/gemini.ts +9 -9
  30. package/src/discovery/github.ts +6 -6
  31. package/src/discovery/helpers.ts +4 -4
  32. package/src/discovery/index.ts +16 -16
  33. package/src/discovery/mcp-json.ts +4 -4
  34. package/src/discovery/ssh.ts +4 -4
  35. package/src/discovery/vscode.ts +4 -4
  36. package/src/discovery/windsurf.ts +6 -6
  37. package/src/{core/tools/exa → exa}/company.ts +2 -3
  38. package/src/{core/tools/exa → exa}/index.ts +2 -2
  39. package/src/{core/tools/exa → exa}/linkedin.ts +2 -3
  40. package/src/{core/tools/exa → exa}/mcp-client.ts +2 -2
  41. package/src/{core/tools/exa → exa}/render.ts +3 -3
  42. package/src/{core/tools/exa → exa}/researcher.ts +1 -1
  43. package/src/{core/tools/exa → exa}/search.ts +2 -10
  44. package/src/{core/tools/exa → exa}/websets.ts +1 -1
  45. package/src/{core → exec}/bash-executor.ts +22 -6
  46. package/src/{core → export}/custom-share.ts +1 -1
  47. package/src/{core/export-html → export/html}/index.ts +3 -3
  48. package/src/{core → export}/ttsr.ts +2 -2
  49. package/src/{core → extensibility}/custom-commands/bundled/review/index.ts +4 -4
  50. package/src/{core → extensibility}/custom-commands/loader.ts +3 -3
  51. package/src/{core → extensibility}/custom-commands/types.ts +1 -1
  52. package/src/{core → extensibility}/custom-tools/loader.ts +9 -9
  53. package/src/{core → extensibility}/custom-tools/types.ts +6 -6
  54. package/src/{core → extensibility}/custom-tools/wrapper.ts +1 -1
  55. package/src/{core → extensibility}/extensions/loader.ts +8 -8
  56. package/src/{core → extensibility}/extensions/runner.ts +3 -3
  57. package/src/{core → extensibility}/extensions/types.ts +15 -15
  58. package/src/{core → extensibility}/extensions/wrapper.ts +1 -1
  59. package/src/{core → extensibility}/hooks/index.ts +1 -1
  60. package/src/{core → extensibility}/hooks/loader.ts +7 -7
  61. package/src/{core → extensibility}/hooks/runner.ts +4 -4
  62. package/src/{core → extensibility}/hooks/types.ts +9 -9
  63. package/src/{core → extensibility}/plugins/doctor.ts +1 -1
  64. package/src/{core → extensibility}/plugins/installer.ts +2 -3
  65. package/src/{core → extensibility}/plugins/paths.ts +1 -1
  66. package/src/{core → extensibility}/skills.ts +8 -48
  67. package/src/{core → extensibility}/slash-commands.ts +6 -6
  68. package/src/index.ts +127 -128
  69. package/src/internal-urls/agent-protocol.ts +126 -0
  70. package/src/internal-urls/artifact-protocol.ts +93 -0
  71. package/src/internal-urls/index.ts +28 -0
  72. package/src/internal-urls/json-query.ts +126 -0
  73. package/src/internal-urls/router.ts +69 -0
  74. package/src/internal-urls/rule-protocol.ts +56 -0
  75. package/src/internal-urls/skill-protocol.ts +112 -0
  76. package/src/internal-urls/types.ts +48 -0
  77. package/src/{core/python-executor.ts → ipy/executor.ts} +51 -11
  78. package/src/{core/python-gateway-coordinator.ts → ipy/gateway-coordinator.ts} +41 -325
  79. package/src/{core/python-kernel.ts → ipy/kernel.ts} +38 -10
  80. package/src/ipy/prelude.ts +3 -0
  81. package/src/{core/tools/lsp → lsp}/client.ts +7 -6
  82. package/src/{core/tools/lsp → lsp}/clients/biome-client.ts +1 -1
  83. package/src/{core/tools/lsp → lsp}/clients/index.ts +1 -1
  84. package/src/{core/tools/lsp → lsp}/clients/lsp-linter-client.ts +4 -4
  85. package/src/{core/tools/lsp → lsp}/config.ts +1 -1
  86. package/src/{core/tools/lsp → lsp}/index.ts +16 -15
  87. package/src/{core/tools/lsp → lsp}/render.ts +2 -2
  88. package/src/{core/tools/lsp → lsp}/types.ts +14 -16
  89. package/src/{core/tools/lsp → lsp}/utils.ts +1 -1
  90. package/src/main.ts +12 -12
  91. package/src/{core/mcp → mcp}/config.ts +8 -8
  92. package/src/{core/mcp → mcp}/loader.ts +5 -6
  93. package/src/{core/mcp → mcp}/manager.ts +2 -2
  94. package/src/{core/mcp → mcp}/tool-bridge.ts +35 -6
  95. package/src/{core/mcp → mcp}/tool-cache.ts +1 -1
  96. package/src/{core/mcp → mcp}/transports/http.ts +7 -1
  97. package/src/{core/mcp → mcp}/transports/stdio.ts +1 -1
  98. package/src/{core/mcp → mcp}/types.ts +1 -1
  99. package/src/migrations.ts +2 -2
  100. package/src/modes/{interactive/components → components}/armin.ts +1 -1
  101. package/src/modes/{interactive/components → components}/assistant-message.ts +1 -1
  102. package/src/modes/{interactive/components → components}/bash-execution.ts +37 -29
  103. package/src/modes/{interactive/components → components}/bordered-loader.ts +1 -1
  104. package/src/modes/{interactive/components → components}/branch-summary-message.ts +2 -2
  105. package/src/modes/{interactive/components → components}/compaction-summary-message.ts +2 -2
  106. package/src/modes/{interactive/components → components}/custom-message.ts +3 -3
  107. package/src/modes/{interactive/components → components}/diff.ts +1 -1
  108. package/src/modes/{interactive/components → components}/dynamic-border.ts +1 -1
  109. package/src/modes/{interactive/components → components}/extensions/extension-dashboard.ts +3 -3
  110. package/src/modes/{interactive/components → components}/extensions/extension-list.ts +2 -2
  111. package/src/modes/{interactive/components → components}/extensions/inspector-panel.ts +1 -1
  112. package/src/modes/{interactive/components → components}/extensions/state-manager.ts +11 -17
  113. package/src/modes/{interactive/components → components}/extensions/types.ts +1 -1
  114. package/src/modes/{interactive/components → components}/footer.ts +3 -3
  115. package/src/modes/{interactive/components → components}/history-search.ts +2 -2
  116. package/src/modes/{interactive/components → components}/hook-editor.ts +1 -1
  117. package/src/modes/{interactive/components → components}/hook-input.ts +1 -1
  118. package/src/modes/{interactive/components → components}/hook-message.ts +3 -3
  119. package/src/modes/{interactive/components → components}/hook-selector.ts +1 -1
  120. package/src/modes/{interactive/components → components}/keybinding-hints.ts +2 -2
  121. package/src/modes/{interactive/components → components}/login-dialog.ts +1 -1
  122. package/src/modes/{interactive/components → components}/model-selector.ts +5 -5
  123. package/src/modes/{interactive/components → components}/oauth-selector.ts +2 -2
  124. package/src/modes/{interactive/components → components}/plugin-settings.ts +3 -3
  125. package/src/modes/{interactive/components → components}/python-execution.ts +35 -24
  126. package/src/modes/{interactive/components → components}/queue-mode-selector.ts +1 -1
  127. package/src/modes/{interactive/components → components}/read-tool-group.ts +2 -2
  128. package/src/modes/{interactive/components → components}/session-selector.ts +3 -3
  129. package/src/modes/{interactive/components → components}/settings-defs.ts +2 -2
  130. package/src/modes/{interactive/components → components}/settings-selector.ts +2 -2
  131. package/src/modes/{interactive/components → components}/show-images-selector.ts +1 -1
  132. package/src/modes/{interactive/components → components}/status-line/segments.ts +2 -2
  133. package/src/modes/{interactive/components → components}/status-line/separators.ts +1 -1
  134. package/src/modes/{interactive/components → components}/status-line/types.ts +2 -2
  135. package/src/modes/{interactive/components → components}/status-line-segment-editor.ts +2 -2
  136. package/src/modes/{interactive/components → components}/status-line.ts +3 -3
  137. package/src/modes/{interactive/components → components}/theme-selector.ts +1 -1
  138. package/src/modes/{interactive/components → components}/thinking-selector.ts +1 -1
  139. package/src/modes/{interactive/components → components}/todo-display.ts +3 -4
  140. package/src/modes/{interactive/components → components}/todo-reminder.ts +2 -2
  141. package/src/modes/{interactive/components → components}/tool-execution.ts +8 -8
  142. package/src/modes/{interactive/components → components}/tree-selector.ts +3 -3
  143. package/src/modes/{interactive/components → components}/ttsr-notification.ts +2 -2
  144. package/src/modes/{interactive/components → components}/user-message-selector.ts +1 -1
  145. package/src/modes/{interactive/components → components}/user-message.ts +1 -1
  146. package/src/modes/{interactive/components → components}/welcome.ts +2 -2
  147. package/src/modes/{interactive/controllers → controllers}/command-controller.ts +32 -30
  148. package/src/modes/{interactive/controllers → controllers}/event-controller.ts +9 -9
  149. package/src/modes/{interactive/controllers → controllers}/extension-ui-controller.ts +8 -8
  150. package/src/modes/{interactive/controllers → controllers}/input-controller.ts +6 -6
  151. package/src/modes/{interactive/controllers → controllers}/selector-controller.ts +16 -16
  152. package/src/modes/index.ts +1 -1
  153. package/src/modes/{interactive/interactive-mode.ts → interactive-mode.ts} +14 -14
  154. package/src/modes/print-mode.ts +1 -1
  155. package/src/modes/rpc/rpc-client.ts +3 -3
  156. package/src/modes/rpc/rpc-mode.ts +3 -3
  157. package/src/modes/rpc/rpc-types.ts +3 -3
  158. package/src/modes/{interactive/theme → theme}/theme.ts +1 -1
  159. package/src/modes/{interactive/types.ts → types.ts} +8 -9
  160. package/src/modes/{interactive/utils → utils}/ui-helpers.ts +20 -27
  161. package/src/{core/tools/patch → patch}/applicator.ts +1 -1
  162. package/src/{core/tools/patch → patch}/diff.ts +1 -1
  163. package/src/{core/tools/patch → patch}/index.ts +31 -36
  164. package/src/{core/tools/patch → patch}/shared.ts +9 -6
  165. package/src/prompts/agents/explore.md +83 -46
  166. package/src/prompts/agents/init.md +9 -4
  167. package/src/prompts/agents/plan.md +8 -7
  168. package/src/prompts/agents/reviewer.md +36 -18
  169. package/src/prompts/agents/task.md +4 -4
  170. package/src/prompts/compaction/branch-summary-preamble.md +0 -1
  171. package/src/prompts/review-request.md +0 -1
  172. package/src/prompts/system/custom-system-prompt.md +2 -14
  173. package/src/prompts/system/file-operations.md +0 -2
  174. package/src/prompts/system/system-prompt.md +147 -138
  175. package/src/prompts/system/web-search.md +26 -0
  176. package/src/prompts/tools/ask.md +31 -24
  177. package/src/prompts/tools/bash.md +20 -17
  178. package/src/prompts/tools/calculator.md +9 -5
  179. package/src/prompts/tools/fetch.md +16 -0
  180. package/src/prompts/tools/find.md +15 -5
  181. package/src/prompts/tools/gemini-image.md +21 -6
  182. package/src/prompts/tools/grep.md +28 -12
  183. package/src/prompts/tools/lsp.md +35 -14
  184. package/src/prompts/tools/patch.md +39 -41
  185. package/src/prompts/tools/python.md +59 -76
  186. package/src/prompts/tools/read.md +23 -22
  187. package/src/prompts/tools/replace.md +19 -12
  188. package/src/prompts/tools/ssh.md +21 -28
  189. package/src/prompts/tools/task.md +54 -44
  190. package/src/prompts/tools/todo-write.md +52 -163
  191. package/src/prompts/tools/web-search.md +16 -9
  192. package/src/prompts/tools/write.md +13 -2
  193. package/src/{core/sdk.ts → sdk.ts} +65 -34
  194. package/src/{core → session}/agent-session.ts +45 -37
  195. package/src/{core → session}/agent-storage.ts +2 -2
  196. package/src/session/artifacts.ts +110 -0
  197. package/src/{core → session}/auth-storage.ts +1 -1
  198. package/src/{core → session}/compaction/branch-summarization.ts +5 -5
  199. package/src/{core → session}/compaction/compaction.ts +6 -6
  200. package/src/{core → session}/compaction/utils.ts +3 -3
  201. package/src/{core → session}/history-storage.ts +1 -1
  202. package/src/{core → session}/messages.ts +6 -8
  203. package/src/{core → session}/session-manager.ts +2 -2
  204. package/src/{core → session}/storage-migration.ts +2 -2
  205. package/src/session/streaming-output.ts +177 -0
  206. package/src/{core/ssh → ssh}/connection-manager.ts +1 -1
  207. package/src/{core/ssh → ssh}/ssh-executor.ts +19 -4
  208. package/src/{core/ssh → ssh}/sshfs-mount.ts +1 -1
  209. package/src/{core/system-prompt.ts → system-prompt.ts} +8 -37
  210. package/src/{core/tools/task → task}/agents.ts +8 -8
  211. package/src/{core/tools/task → task}/commands.ts +5 -6
  212. package/src/{core/tools/task → task}/discovery.ts +3 -3
  213. package/src/{core/tools/task → task}/executor.ts +34 -44
  214. package/src/{core/tools/task → task}/index.ts +206 -50
  215. package/src/{core/tools/task → task}/render.ts +80 -23
  216. package/src/{core/tools/task → task}/subprocess-tool-registry.ts +1 -1
  217. package/src/task/template.ts +47 -0
  218. package/src/{core/tools/task → task}/types.ts +19 -27
  219. package/src/{core/tools/task → task}/worker-protocol.ts +8 -4
  220. package/src/{core/tools/task → task}/worker.ts +34 -29
  221. package/src/task/worktree.ts +166 -0
  222. package/src/{core/tools → tools}/ask.ts +13 -21
  223. package/src/{core/tools → tools}/bash-interceptor.ts +1 -1
  224. package/src/{core/tools → tools}/bash.ts +61 -63
  225. package/src/{core/tools → tools}/calculator.ts +4 -4
  226. package/src/{core/tools → tools}/complete.ts +1 -1
  227. package/src/{core/tools → tools}/context.ts +2 -2
  228. package/src/{core/tools/web-fetch.ts → tools/fetch.ts} +97 -76
  229. package/src/{core/tools → tools}/find.ts +80 -104
  230. package/src/{core/tools → tools}/gemini-image.ts +420 -29
  231. package/src/{core/tools → tools}/grep.ts +155 -164
  232. package/src/{core/tools → tools}/index.ts +63 -56
  233. package/src/tools/list-limit.ts +40 -0
  234. package/src/{core/tools → tools}/ls.ts +44 -35
  235. package/src/{core/tools → tools}/notebook.ts +3 -3
  236. package/src/tools/output-meta.ts +443 -0
  237. package/src/tools/output-utils.ts +63 -0
  238. package/src/{core/tools → tools}/python.ts +105 -89
  239. package/src/tools/read.ts +882 -0
  240. package/src/{core/tools → tools}/render-utils.ts +1 -1
  241. package/src/{core/tools → tools}/renderers.ts +8 -10
  242. package/src/{core/tools → tools}/review.ts +2 -2
  243. package/src/{core/tools → tools}/ssh.ts +56 -59
  244. package/src/{core/tools → tools}/todo-write.ts +12 -23
  245. package/src/tools/tool-errors.ts +95 -0
  246. package/src/tools/tool-result.ts +92 -0
  247. package/src/{core/tools → tools}/truncate.ts +2 -2
  248. package/src/{core/tools → tools}/write.ts +15 -13
  249. package/src/utils/changelog.ts +1 -1
  250. package/src/{core → utils}/file-mentions.ts +4 -4
  251. package/src/utils/image-convert.ts +1 -1
  252. package/src/utils/image-resize.ts +1 -1
  253. package/src/utils/shell.ts +1 -1
  254. package/src/{core → utils}/title-generator.ts +4 -4
  255. package/src/utils/tools-manager.ts +1 -1
  256. package/src/{core/tools/web-scrapers → web/scrapers}/choosealicense.ts +1 -1
  257. package/src/{core/tools/web-scrapers → web/scrapers}/twitter.ts +3 -2
  258. package/src/{core/tools/web-scrapers → web/scrapers}/types.ts +4 -2
  259. package/src/{core/tools/web-scrapers → web/scrapers}/utils.ts +1 -1
  260. package/src/{core/tools/web-scrapers → web/scrapers}/youtube.ts +14 -13
  261. package/src/{core/tools/web-search → web/search}/auth.ts +4 -4
  262. package/src/{core/tools/web-search → web/search}/index.ts +22 -71
  263. package/src/{core/tools/web-search → web/search}/providers/anthropic.ts +7 -10
  264. package/src/{core/tools/web-search → web/search}/providers/exa.ts +2 -2
  265. package/src/{core/tools/web-search → web/search}/providers/perplexity.ts +4 -16
  266. package/src/{core/tools/web-search → web/search}/render.ts +3 -3
  267. package/scripts/migrate-sessions.sh +0 -93
  268. package/src/core/index.ts +0 -56
  269. package/src/core/python-prelude.ts +0 -3
  270. package/src/core/ssh-executor.ts +0 -5
  271. package/src/core/streaming-output.ts +0 -115
  272. package/src/core/tools/output.ts +0 -519
  273. package/src/core/tools/read.ts +0 -717
  274. package/src/core/tools/task/template.ts +0 -37
  275. package/src/prompts/tools/output.md +0 -47
  276. package/src/prompts/tools/web-fetch.md +0 -9
  277. /package/src/{core/tools/exa → exa}/types.ts +0 -0
  278. /package/src/{core → exec}/exec.ts +0 -0
  279. /package/src/{core/export-html → export/html}/template.css +0 -0
  280. /package/src/{core/export-html → export/html}/template.generated.ts +0 -0
  281. /package/src/{core/export-html → export/html}/template.html +0 -0
  282. /package/src/{core/export-html → export/html}/template.js +0 -0
  283. /package/src/{core/export-html → export/html}/template.macro.ts +0 -0
  284. /package/src/{core/export-html → export/html}/vendor/highlight.min.js +0 -0
  285. /package/src/{core/export-html → export/html}/vendor/marked.min.js +0 -0
  286. /package/src/{core → extensibility}/custom-commands/index.ts +0 -0
  287. /package/src/{core → extensibility}/custom-tools/index.ts +0 -0
  288. /package/src/{core → extensibility}/extensions/index.ts +0 -0
  289. /package/src/{core → extensibility}/hooks/tool-wrapper.ts +0 -0
  290. /package/src/{core → extensibility}/plugins/index.ts +0 -0
  291. /package/src/{core → extensibility}/plugins/loader.ts +0 -0
  292. /package/src/{core → extensibility}/plugins/manager.ts +0 -0
  293. /package/src/{core → extensibility}/plugins/parser.ts +0 -0
  294. /package/src/{core → extensibility}/plugins/types.ts +0 -0
  295. /package/src/{core/python-modules.ts → ipy/modules.ts} +0 -0
  296. /package/src/{core/python-prelude.py → ipy/prelude.py} +0 -0
  297. /package/src/{core/tools/lsp → lsp}/defaults.json +0 -0
  298. /package/src/{core/tools/lsp → lsp}/edits.ts +0 -0
  299. /package/src/{core/tools/lsp → lsp}/lspmux.ts +0 -0
  300. /package/src/{core/tools/lsp → lsp}/rust-analyzer.ts +0 -0
  301. /package/src/{core/mcp → mcp}/client.ts +0 -0
  302. /package/src/{core/mcp → mcp}/index.ts +0 -0
  303. /package/src/{core/mcp → mcp}/json-rpc.ts +0 -0
  304. /package/src/{core/mcp → mcp}/transports/index.ts +0 -0
  305. /package/src/modes/{interactive/components → components}/countdown-timer.ts +0 -0
  306. /package/src/modes/{interactive/components → components}/custom-editor.ts +0 -0
  307. /package/src/modes/{interactive/components → components}/extensions/index.ts +0 -0
  308. /package/src/modes/{interactive/components → components}/index.ts +0 -0
  309. /package/src/modes/{interactive/components → components}/status-line/index.ts +0 -0
  310. /package/src/modes/{interactive/components → components}/status-line/presets.ts +0 -0
  311. /package/src/modes/{interactive/components → components}/visual-truncate.ts +0 -0
  312. /package/src/modes/{interactive/theme → theme}/dark.json +0 -0
  313. /package/src/modes/{interactive/theme → theme}/defaults/alabaster.json +0 -0
  314. /package/src/modes/{interactive/theme → theme}/defaults/amethyst.json +0 -0
  315. /package/src/modes/{interactive/theme → theme}/defaults/anthracite.json +0 -0
  316. /package/src/modes/{interactive/theme → theme}/defaults/basalt.json +0 -0
  317. /package/src/modes/{interactive/theme → theme}/defaults/birch.json +0 -0
  318. /package/src/modes/{interactive/theme → theme}/defaults/dark-abyss.json +0 -0
  319. /package/src/modes/{interactive/theme → theme}/defaults/dark-arctic.json +0 -0
  320. /package/src/modes/{interactive/theme → theme}/defaults/dark-aurora.json +0 -0
  321. /package/src/modes/{interactive/theme → theme}/defaults/dark-catppuccin.json +0 -0
  322. /package/src/modes/{interactive/theme → theme}/defaults/dark-cavern.json +0 -0
  323. /package/src/modes/{interactive/theme → theme}/defaults/dark-copper.json +0 -0
  324. /package/src/modes/{interactive/theme → theme}/defaults/dark-cosmos.json +0 -0
  325. /package/src/modes/{interactive/theme → theme}/defaults/dark-cyberpunk.json +0 -0
  326. /package/src/modes/{interactive/theme → theme}/defaults/dark-dracula.json +0 -0
  327. /package/src/modes/{interactive/theme → theme}/defaults/dark-eclipse.json +0 -0
  328. /package/src/modes/{interactive/theme → theme}/defaults/dark-ember.json +0 -0
  329. /package/src/modes/{interactive/theme → theme}/defaults/dark-equinox.json +0 -0
  330. /package/src/modes/{interactive/theme → theme}/defaults/dark-forest.json +0 -0
  331. /package/src/modes/{interactive/theme → theme}/defaults/dark-github.json +0 -0
  332. /package/src/modes/{interactive/theme → theme}/defaults/dark-gruvbox.json +0 -0
  333. /package/src/modes/{interactive/theme → theme}/defaults/dark-lavender.json +0 -0
  334. /package/src/modes/{interactive/theme → theme}/defaults/dark-lunar.json +0 -0
  335. /package/src/modes/{interactive/theme → theme}/defaults/dark-midnight.json +0 -0
  336. /package/src/modes/{interactive/theme → theme}/defaults/dark-monochrome.json +0 -0
  337. /package/src/modes/{interactive/theme → theme}/defaults/dark-monokai.json +0 -0
  338. /package/src/modes/{interactive/theme → theme}/defaults/dark-nebula.json +0 -0
  339. /package/src/modes/{interactive/theme → theme}/defaults/dark-nord.json +0 -0
  340. /package/src/modes/{interactive/theme → theme}/defaults/dark-ocean.json +0 -0
  341. /package/src/modes/{interactive/theme → theme}/defaults/dark-one.json +0 -0
  342. /package/src/modes/{interactive/theme → theme}/defaults/dark-rainforest.json +0 -0
  343. /package/src/modes/{interactive/theme → theme}/defaults/dark-reef.json +0 -0
  344. /package/src/modes/{interactive/theme → theme}/defaults/dark-retro.json +0 -0
  345. /package/src/modes/{interactive/theme → theme}/defaults/dark-rose-pine.json +0 -0
  346. /package/src/modes/{interactive/theme → theme}/defaults/dark-sakura.json +0 -0
  347. /package/src/modes/{interactive/theme → theme}/defaults/dark-slate.json +0 -0
  348. /package/src/modes/{interactive/theme → theme}/defaults/dark-solarized.json +0 -0
  349. /package/src/modes/{interactive/theme → theme}/defaults/dark-solstice.json +0 -0
  350. /package/src/modes/{interactive/theme → theme}/defaults/dark-starfall.json +0 -0
  351. /package/src/modes/{interactive/theme → theme}/defaults/dark-sunset.json +0 -0
  352. /package/src/modes/{interactive/theme → theme}/defaults/dark-swamp.json +0 -0
  353. /package/src/modes/{interactive/theme → theme}/defaults/dark-synthwave.json +0 -0
  354. /package/src/modes/{interactive/theme → theme}/defaults/dark-taiga.json +0 -0
  355. /package/src/modes/{interactive/theme → theme}/defaults/dark-terminal.json +0 -0
  356. /package/src/modes/{interactive/theme → theme}/defaults/dark-tokyo-night.json +0 -0
  357. /package/src/modes/{interactive/theme → theme}/defaults/dark-tundra.json +0 -0
  358. /package/src/modes/{interactive/theme → theme}/defaults/dark-twilight.json +0 -0
  359. /package/src/modes/{interactive/theme → theme}/defaults/dark-volcanic.json +0 -0
  360. /package/src/modes/{interactive/theme → theme}/defaults/graphite.json +0 -0
  361. /package/src/modes/{interactive/theme → theme}/defaults/index.ts +0 -0
  362. /package/src/modes/{interactive/theme → theme}/defaults/light-arctic.json +0 -0
  363. /package/src/modes/{interactive/theme → theme}/defaults/light-aurora-day.json +0 -0
  364. /package/src/modes/{interactive/theme → theme}/defaults/light-canyon.json +0 -0
  365. /package/src/modes/{interactive/theme → theme}/defaults/light-catppuccin.json +0 -0
  366. /package/src/modes/{interactive/theme → theme}/defaults/light-cirrus.json +0 -0
  367. /package/src/modes/{interactive/theme → theme}/defaults/light-coral.json +0 -0
  368. /package/src/modes/{interactive/theme → theme}/defaults/light-cyberpunk.json +0 -0
  369. /package/src/modes/{interactive/theme → theme}/defaults/light-dawn.json +0 -0
  370. /package/src/modes/{interactive/theme → theme}/defaults/light-dunes.json +0 -0
  371. /package/src/modes/{interactive/theme → theme}/defaults/light-eucalyptus.json +0 -0
  372. /package/src/modes/{interactive/theme → theme}/defaults/light-forest.json +0 -0
  373. /package/src/modes/{interactive/theme → theme}/defaults/light-frost.json +0 -0
  374. /package/src/modes/{interactive/theme → theme}/defaults/light-github.json +0 -0
  375. /package/src/modes/{interactive/theme → theme}/defaults/light-glacier.json +0 -0
  376. /package/src/modes/{interactive/theme → theme}/defaults/light-gruvbox.json +0 -0
  377. /package/src/modes/{interactive/theme → theme}/defaults/light-haze.json +0 -0
  378. /package/src/modes/{interactive/theme → theme}/defaults/light-honeycomb.json +0 -0
  379. /package/src/modes/{interactive/theme → theme}/defaults/light-lagoon.json +0 -0
  380. /package/src/modes/{interactive/theme → theme}/defaults/light-lavender.json +0 -0
  381. /package/src/modes/{interactive/theme → theme}/defaults/light-meadow.json +0 -0
  382. /package/src/modes/{interactive/theme → theme}/defaults/light-mint.json +0 -0
  383. /package/src/modes/{interactive/theme → theme}/defaults/light-monochrome.json +0 -0
  384. /package/src/modes/{interactive/theme → theme}/defaults/light-ocean.json +0 -0
  385. /package/src/modes/{interactive/theme → theme}/defaults/light-one.json +0 -0
  386. /package/src/modes/{interactive/theme → theme}/defaults/light-opal.json +0 -0
  387. /package/src/modes/{interactive/theme → theme}/defaults/light-orchard.json +0 -0
  388. /package/src/modes/{interactive/theme → theme}/defaults/light-paper.json +0 -0
  389. /package/src/modes/{interactive/theme → theme}/defaults/light-prism.json +0 -0
  390. /package/src/modes/{interactive/theme → theme}/defaults/light-retro.json +0 -0
  391. /package/src/modes/{interactive/theme → theme}/defaults/light-sand.json +0 -0
  392. /package/src/modes/{interactive/theme → theme}/defaults/light-savanna.json +0 -0
  393. /package/src/modes/{interactive/theme → theme}/defaults/light-solarized.json +0 -0
  394. /package/src/modes/{interactive/theme → theme}/defaults/light-soleil.json +0 -0
  395. /package/src/modes/{interactive/theme → theme}/defaults/light-sunset.json +0 -0
  396. /package/src/modes/{interactive/theme → theme}/defaults/light-synthwave.json +0 -0
  397. /package/src/modes/{interactive/theme → theme}/defaults/light-tokyo-night.json +0 -0
  398. /package/src/modes/{interactive/theme → theme}/defaults/light-wetland.json +0 -0
  399. /package/src/modes/{interactive/theme → theme}/defaults/light-zenith.json +0 -0
  400. /package/src/modes/{interactive/theme → theme}/defaults/limestone.json +0 -0
  401. /package/src/modes/{interactive/theme → theme}/defaults/mahogany.json +0 -0
  402. /package/src/modes/{interactive/theme → theme}/defaults/marble.json +0 -0
  403. /package/src/modes/{interactive/theme → theme}/defaults/obsidian.json +0 -0
  404. /package/src/modes/{interactive/theme → theme}/defaults/onyx.json +0 -0
  405. /package/src/modes/{interactive/theme → theme}/defaults/pearl.json +0 -0
  406. /package/src/modes/{interactive/theme → theme}/defaults/porcelain.json +0 -0
  407. /package/src/modes/{interactive/theme → theme}/defaults/quartz.json +0 -0
  408. /package/src/modes/{interactive/theme → theme}/defaults/sandstone.json +0 -0
  409. /package/src/modes/{interactive/theme → theme}/defaults/titanium.json +0 -0
  410. /package/src/modes/{interactive/theme → theme}/light.json +0 -0
  411. /package/src/modes/{interactive/theme → theme}/theme-schema.json +0 -0
  412. /package/src/{core/tools/patch → patch}/fuzzy.ts +0 -0
  413. /package/src/{core/tools/patch → patch}/normalize.ts +0 -0
  414. /package/src/{core/tools/patch → patch}/normative.ts +0 -0
  415. /package/src/{core/tools/patch → patch}/parser.ts +0 -0
  416. /package/src/{core/tools/patch → patch}/types.ts +0 -0
  417. /package/src/{core → session}/compaction/index.ts +0 -0
  418. /package/src/{core → session}/session-storage.ts +0 -0
  419. /package/src/{core/tools/task → task}/name-generator.ts +0 -0
  420. /package/src/{core/tools/task → task}/omp-command.ts +0 -0
  421. /package/src/{core/tools/task → task}/parallel.ts +0 -0
  422. /package/src/{core/tools → tools}/jtd-to-json-schema.ts +0 -0
  423. /package/src/{core/tools → tools}/path-utils.ts +0 -0
  424. /package/src/{core → utils}/event-bus.ts +0 -0
  425. /package/src/{core → utils}/frontmatter.ts +0 -0
  426. /package/src/{core → utils}/terminal-notify.ts +0 -0
  427. /package/src/{core → utils}/timings.ts +0 -0
  428. /package/src/{core → utils}/utils.ts +0 -0
  429. /package/src/{core/tools/web-scrapers → web/scrapers}/artifacthub.ts +0 -0
  430. /package/src/{core/tools/web-scrapers → web/scrapers}/arxiv.ts +0 -0
  431. /package/src/{core/tools/web-scrapers → web/scrapers}/aur.ts +0 -0
  432. /package/src/{core/tools/web-scrapers → web/scrapers}/biorxiv.ts +0 -0
  433. /package/src/{core/tools/web-scrapers → web/scrapers}/bluesky.ts +0 -0
  434. /package/src/{core/tools/web-scrapers → web/scrapers}/brew.ts +0 -0
  435. /package/src/{core/tools/web-scrapers → web/scrapers}/cheatsh.ts +0 -0
  436. /package/src/{core/tools/web-scrapers → web/scrapers}/chocolatey.ts +0 -0
  437. /package/src/{core/tools/web-scrapers → web/scrapers}/cisa-kev.ts +0 -0
  438. /package/src/{core/tools/web-scrapers → web/scrapers}/clojars.ts +0 -0
  439. /package/src/{core/tools/web-scrapers → web/scrapers}/coingecko.ts +0 -0
  440. /package/src/{core/tools/web-scrapers → web/scrapers}/crates-io.ts +0 -0
  441. /package/src/{core/tools/web-scrapers → web/scrapers}/crossref.ts +0 -0
  442. /package/src/{core/tools/web-scrapers → web/scrapers}/devto.ts +0 -0
  443. /package/src/{core/tools/web-scrapers → web/scrapers}/discogs.ts +0 -0
  444. /package/src/{core/tools/web-scrapers → web/scrapers}/discourse.ts +0 -0
  445. /package/src/{core/tools/web-scrapers → web/scrapers}/dockerhub.ts +0 -0
  446. /package/src/{core/tools/web-scrapers → web/scrapers}/fdroid.ts +0 -0
  447. /package/src/{core/tools/web-scrapers → web/scrapers}/firefox-addons.ts +0 -0
  448. /package/src/{core/tools/web-scrapers → web/scrapers}/flathub.ts +0 -0
  449. /package/src/{core/tools/web-scrapers → web/scrapers}/github-gist.ts +0 -0
  450. /package/src/{core/tools/web-scrapers → web/scrapers}/github.ts +0 -0
  451. /package/src/{core/tools/web-scrapers → web/scrapers}/gitlab.ts +0 -0
  452. /package/src/{core/tools/web-scrapers → web/scrapers}/go-pkg.ts +0 -0
  453. /package/src/{core/tools/web-scrapers → web/scrapers}/hackage.ts +0 -0
  454. /package/src/{core/tools/web-scrapers → web/scrapers}/hackernews.ts +0 -0
  455. /package/src/{core/tools/web-scrapers → web/scrapers}/hex.ts +0 -0
  456. /package/src/{core/tools/web-scrapers → web/scrapers}/huggingface.ts +0 -0
  457. /package/src/{core/tools/web-scrapers → web/scrapers}/iacr.ts +0 -0
  458. /package/src/{core/tools/web-scrapers → web/scrapers}/index.ts +0 -0
  459. /package/src/{core/tools/web-scrapers → web/scrapers}/jetbrains-marketplace.ts +0 -0
  460. /package/src/{core/tools/web-scrapers → web/scrapers}/lemmy.ts +0 -0
  461. /package/src/{core/tools/web-scrapers → web/scrapers}/lobsters.ts +0 -0
  462. /package/src/{core/tools/web-scrapers → web/scrapers}/mastodon.ts +0 -0
  463. /package/src/{core/tools/web-scrapers → web/scrapers}/maven.ts +0 -0
  464. /package/src/{core/tools/web-scrapers → web/scrapers}/mdn.ts +0 -0
  465. /package/src/{core/tools/web-scrapers → web/scrapers}/metacpan.ts +0 -0
  466. /package/src/{core/tools/web-scrapers → web/scrapers}/musicbrainz.ts +0 -0
  467. /package/src/{core/tools/web-scrapers → web/scrapers}/npm.ts +0 -0
  468. /package/src/{core/tools/web-scrapers → web/scrapers}/nuget.ts +0 -0
  469. /package/src/{core/tools/web-scrapers → web/scrapers}/nvd.ts +0 -0
  470. /package/src/{core/tools/web-scrapers → web/scrapers}/ollama.ts +0 -0
  471. /package/src/{core/tools/web-scrapers → web/scrapers}/open-vsx.ts +0 -0
  472. /package/src/{core/tools/web-scrapers → web/scrapers}/opencorporates.ts +0 -0
  473. /package/src/{core/tools/web-scrapers → web/scrapers}/openlibrary.ts +0 -0
  474. /package/src/{core/tools/web-scrapers → web/scrapers}/orcid.ts +0 -0
  475. /package/src/{core/tools/web-scrapers → web/scrapers}/osv.ts +0 -0
  476. /package/src/{core/tools/web-scrapers → web/scrapers}/packagist.ts +0 -0
  477. /package/src/{core/tools/web-scrapers → web/scrapers}/pub-dev.ts +0 -0
  478. /package/src/{core/tools/web-scrapers → web/scrapers}/pubmed.ts +0 -0
  479. /package/src/{core/tools/web-scrapers → web/scrapers}/pypi.ts +0 -0
  480. /package/src/{core/tools/web-scrapers → web/scrapers}/rawg.ts +0 -0
  481. /package/src/{core/tools/web-scrapers → web/scrapers}/readthedocs.ts +0 -0
  482. /package/src/{core/tools/web-scrapers → web/scrapers}/reddit.ts +0 -0
  483. /package/src/{core/tools/web-scrapers → web/scrapers}/repology.ts +0 -0
  484. /package/src/{core/tools/web-scrapers → web/scrapers}/rfc.ts +0 -0
  485. /package/src/{core/tools/web-scrapers → web/scrapers}/rubygems.ts +0 -0
  486. /package/src/{core/tools/web-scrapers → web/scrapers}/searchcode.ts +0 -0
  487. /package/src/{core/tools/web-scrapers → web/scrapers}/sec-edgar.ts +0 -0
  488. /package/src/{core/tools/web-scrapers → web/scrapers}/semantic-scholar.ts +0 -0
  489. /package/src/{core/tools/web-scrapers → web/scrapers}/snapcraft.ts +0 -0
  490. /package/src/{core/tools/web-scrapers → web/scrapers}/sourcegraph.ts +0 -0
  491. /package/src/{core/tools/web-scrapers → web/scrapers}/spdx.ts +0 -0
  492. /package/src/{core/tools/web-scrapers → web/scrapers}/spotify.ts +0 -0
  493. /package/src/{core/tools/web-scrapers → web/scrapers}/stackoverflow.ts +0 -0
  494. /package/src/{core/tools/web-scrapers → web/scrapers}/terraform.ts +0 -0
  495. /package/src/{core/tools/web-scrapers → web/scrapers}/tldr.ts +0 -0
  496. /package/src/{core/tools/web-scrapers → web/scrapers}/vimeo.ts +0 -0
  497. /package/src/{core/tools/web-scrapers → web/scrapers}/vscode-marketplace.ts +0 -0
  498. /package/src/{core/tools/web-scrapers → web/scrapers}/w3c.ts +0 -0
  499. /package/src/{core/tools/web-scrapers → web/scrapers}/wikidata.ts +0 -0
  500. /package/src/{core/tools/web-scrapers → web/scrapers}/wikipedia.ts +0 -0
  501. /package/src/{core/tools/web-search → web/search}/types.ts +0 -0
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import path from "node:path";
7
- import type { Diagnostic, DiagnosticSeverity, LinterClient, ServerConfig } from "../types";
7
+ import type { Diagnostic, DiagnosticSeverity, LinterClient, ServerConfig } from "$c/lsp/types";
8
8
 
9
9
  // =============================================================================
10
10
  // Biome JSON Output Types
@@ -8,7 +8,7 @@
8
8
  export { BiomeClient } from "./biome-client";
9
9
  export { LspLinterClient } from "./lsp-linter-client";
10
10
 
11
- import type { LinterClient, ServerConfig } from "../types";
11
+ import type { LinterClient, ServerConfig } from "$c/lsp/types";
12
12
  import { LspLinterClient } from "./lsp-linter-client";
13
13
 
14
14
  // Cache of linter clients by server name + cwd
@@ -3,10 +3,10 @@
3
3
  * Uses the Language Server Protocol for formatting and diagnostics.
4
4
  */
5
5
 
6
- import { getOrCreateClient, notifySaved, sendRequest, syncContent } from "../client";
7
- import { applyTextEditsToString } from "../edits";
8
- import type { Diagnostic, LinterClient, LspClient, ServerConfig, TextEdit } from "../types";
9
- import { fileToUri } from "../utils";
6
+ import { getOrCreateClient, notifySaved, sendRequest, syncContent } from "$c/lsp/client";
7
+ import { applyTextEditsToString } from "$c/lsp/edits";
8
+ import type { Diagnostic, LinterClient, LspClient, ServerConfig, TextEdit } from "$c/lsp/types";
9
+ import { fileToUri } from "$c/lsp/utils";
10
10
 
11
11
  /** Default formatting options for LSP */
12
12
  const DEFAULT_FORMAT_OPTIONS = {
@@ -3,7 +3,7 @@ import { basename, extname, join } from "node:path";
3
3
  import { logger } from "@oh-my-pi/pi-utils";
4
4
  import { YAML } from "bun";
5
5
  import { globSync } from "glob";
6
- import { getConfigDirPaths } from "../../../config";
6
+ import { getConfigDirPaths } from "$c/config";
7
7
  import { BiomeClient } from "./clients/biome-client";
8
8
  import DEFAULTS from "./defaults.json" with { type: "json" };
9
9
  import type { ServerConfig } from "./types";
@@ -4,11 +4,12 @@ import path from "node:path";
4
4
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
5
5
  import { logger, once, untilAborted } from "@oh-my-pi/pi-utils";
6
6
  import type { BunFile } from "bun";
7
- import { type Theme, theme } from "../../../modes/interactive/theme/theme";
8
- import lspDescription from "../../../prompts/tools/lsp.md" with { type: "text" };
9
- import { renderPromptTemplate } from "../../prompt-templates";
10
- import type { ToolSession } from "../index";
11
- import { resolveToCwd } from "../path-utils";
7
+ import { renderPromptTemplate } from "$c/config/prompt-templates";
8
+ import { type Theme, theme } from "$c/modes/theme/theme";
9
+ import lspDescription from "$c/prompts/tools/lsp.md" with { type: "text" };
10
+ import type { ToolSession } from "$c/tools/index";
11
+ import { resolveToCwd } from "$c/tools/path-utils";
12
+ import { throwIfAborted } from "$c/tools/tool-errors";
12
13
  import {
13
14
  ensureFileOpen,
14
15
  getActiveClients,
@@ -152,15 +153,15 @@ async function syncFileContent(
152
153
  servers: Array<[string, ServerConfig]>,
153
154
  signal?: AbortSignal,
154
155
  ): Promise<void> {
155
- signal?.throwIfAborted();
156
+ throwIfAborted(signal);
156
157
  await Promise.allSettled(
157
158
  servers.map(async ([_serverName, serverConfig]) => {
158
- signal?.throwIfAborted();
159
+ throwIfAborted(signal);
159
160
  if (serverConfig.createClient) {
160
161
  return;
161
162
  }
162
163
  const client = await getOrCreateClient(serverConfig, cwd);
163
- signal?.throwIfAborted();
164
+ throwIfAborted(signal);
164
165
  await syncContent(client, absolutePath, content, signal);
165
166
  }),
166
167
  );
@@ -180,10 +181,10 @@ async function notifyFileSaved(
180
181
  servers: Array<[string, ServerConfig]>,
181
182
  signal?: AbortSignal,
182
183
  ): Promise<void> {
183
- signal?.throwIfAborted();
184
+ throwIfAborted(signal);
184
185
  await Promise.allSettled(
185
186
  servers.map(async ([_serverName, serverConfig]) => {
186
- signal?.throwIfAborted();
187
+ throwIfAborted(signal);
187
188
  if (serverConfig.createClient) {
188
189
  return;
189
190
  }
@@ -342,7 +343,7 @@ async function waitForDiagnostics(
342
343
  ): Promise<Diagnostic[]> {
343
344
  const start = Date.now();
344
345
  while (Date.now() - start < timeoutMs) {
345
- signal?.throwIfAborted();
346
+ throwIfAborted(signal);
346
347
  const diagnostics = client.diagnostics.get(uri);
347
348
  const versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;
348
349
  if (diagnostics !== undefined && versionOk) return diagnostics;
@@ -521,7 +522,7 @@ async function getDiagnosticsForFile(
521
522
  // Wait for diagnostics from all servers in parallel
522
523
  const results = await Promise.allSettled(
523
524
  servers.map(async ([serverName, serverConfig]) => {
524
- signal?.throwIfAborted();
525
+ throwIfAborted(signal);
525
526
  // Use custom linter client if configured
526
527
  if (serverConfig.createClient) {
527
528
  const linterClient = getLinterClient(serverName, serverConfig, cwd);
@@ -531,7 +532,7 @@ async function getDiagnosticsForFile(
531
532
 
532
533
  // Default: use LSP
533
534
  const client = await getOrCreateClient(serverConfig, cwd);
534
- signal?.throwIfAborted();
535
+ throwIfAborted(signal);
535
536
  // Content already synced + didSave sent, wait for fresh diagnostics
536
537
  const minVersion = minVersions?.get(serverName);
537
538
  const diagnostics = await waitForDiagnostics(client, uri, 3000, signal, minVersion);
@@ -621,7 +622,7 @@ async function formatContent(
621
622
 
622
623
  for (const [serverName, serverConfig] of servers) {
623
624
  try {
624
- signal?.throwIfAborted();
625
+ throwIfAborted(signal);
625
626
  // Use custom linter client if configured
626
627
  if (serverConfig.createClient) {
627
628
  const linterClient = getLinterClient(serverName, serverConfig, cwd);
@@ -630,7 +631,7 @@ async function formatContent(
630
631
 
631
632
  // Default: use LSP
632
633
  const client = await getOrCreateClient(serverConfig, cwd);
633
- signal?.throwIfAborted();
634
+ throwIfAborted(signal);
634
635
 
635
636
  const caps = client.serverCapabilities;
636
637
  if (!caps?.documentFormattingProvider) {
@@ -11,8 +11,8 @@
11
11
  import type { AgentToolResult, RenderResultOptions } from "@oh-my-pi/pi-agent-core";
12
12
  import { Text } from "@oh-my-pi/pi-tui";
13
13
  import { highlight, supportsLanguage } from "cli-highlight";
14
- import { getLanguageFromPath, type Theme } from "../../../modes/interactive/theme/theme";
15
- import { formatExpandHint, formatMoreItems, TRUNCATE_LENGTHS, truncate } from "../render-utils";
14
+ import { getLanguageFromPath, type Theme } from "$c/modes/theme/theme";
15
+ import { formatExpandHint, formatMoreItems, TRUNCATE_LENGTHS, truncate } from "$c/tools/render-utils";
16
16
  import type { LspParams, LspToolDetails } from "./types";
17
17
 
18
18
  // =============================================================================
@@ -30,23 +30,21 @@ export const lspSchema = Type.Object({
30
30
  "related_tests",
31
31
  "reload_workspace",
32
32
  ],
33
- { description: "LSP action to perform" },
34
- ),
35
- files: Type.Optional(Type.Array(Type.String({ description: "File paths for diagnostics" }))),
36
- file: Type.Optional(Type.String({ description: "File path for file-specific actions" })),
37
- line: Type.Optional(Type.Number({ description: "1-based line number" })),
38
- column: Type.Optional(Type.Number({ description: "1-based column number" })),
39
- end_line: Type.Optional(Type.Number({ description: "1-based end line number for ranges" })),
40
- end_character: Type.Optional(Type.Number({ description: "1-based end column number for ranges" })),
41
- query: Type.Optional(Type.String({ description: "Search query for symbols/SSR pattern" })),
42
- new_name: Type.Optional(Type.String({ description: "New name for rename action" })),
43
- replacement: Type.Optional(Type.String({ description: "Replacement for SSR action" })),
44
- kind: Type.Optional(Type.String({ description: "Code action kind filter (quickfix, refactor, source)" })),
45
- apply: Type.Optional(Type.Boolean({ description: "Apply edits instead of preview (default: true)" })),
46
- action_index: Type.Optional(Type.Number({ description: "Index of code action to apply" })),
47
- include_declaration: Type.Optional(
48
- Type.Boolean({ description: "Include declaration in references (default: true)" }),
33
+ { description: "LSP operation" },
49
34
  ),
35
+ files: Type.Optional(Type.Array(Type.String({ description: "File path" }))),
36
+ file: Type.Optional(Type.String({ description: "File path" })),
37
+ line: Type.Optional(Type.Number({ description: "Line number (1-indexed)" })),
38
+ column: Type.Optional(Type.Number({ description: "Column number (1-indexed)" })),
39
+ end_line: Type.Optional(Type.Number({ description: "End line for range (1-indexed)" })),
40
+ end_character: Type.Optional(Type.Number({ description: "End column for range (1-indexed)" })),
41
+ query: Type.Optional(Type.String({ description: "Search query or SSR pattern" })),
42
+ new_name: Type.Optional(Type.String({ description: "New name for rename" })),
43
+ replacement: Type.Optional(Type.String({ description: "Replacement text for SSR" })),
44
+ kind: Type.Optional(Type.String({ description: "Action kind: quickfix, refactor, source" })),
45
+ apply: Type.Optional(Type.Boolean({ description: "Apply edits (default: true)" })),
46
+ action_index: Type.Optional(Type.Number({ description: "Index of action to apply" })),
47
+ include_declaration: Type.Optional(Type.Boolean({ description: "Include declaration in refs (default: true)" })),
50
48
  });
51
49
 
52
50
  export type LspParams = Static<typeof lspSchema>;
@@ -1,5 +1,5 @@
1
1
  import path from "node:path";
2
- import { type Theme, theme } from "../../../modes/interactive/theme/theme";
2
+ import { type Theme, theme } from "$c/modes/theme/theme";
3
3
  import type {
4
4
  Diagnostic,
5
5
  DiagnosticSeverity,
package/src/main.ts CHANGED
@@ -11,6 +11,7 @@ import { createInterface } from "node:readline/promises";
11
11
  import { type ImageContent, supportsXhigh } from "@oh-my-pi/pi-ai";
12
12
  import { postmortem } from "@oh-my-pi/pi-utils";
13
13
  import chalk from "chalk";
14
+ import { initTheme, stopThemeWatcher } from "$c/modes/theme/theme";
14
15
  import { type Args, parseArgs, printHelp } from "./cli/args";
15
16
  import { parseConfigArgs, printConfigHelp, runConfigCommand } from "./cli/config-cli";
16
17
  import { processFileArguments } from "./cli/file-processor";
@@ -21,21 +22,20 @@ import { parseSetupArgs, printSetupHelp, runSetupCommand } from "./cli/setup-cli
21
22
  import { parseStatsArgs, printStatsHelp, runStatsCommand } from "./cli/stats-cli";
22
23
  import { parseUpdateArgs, printUpdateHelp, runUpdateCommand } from "./cli/update-cli";
23
24
  import { findConfigFile, getModelsPath, VERSION } from "./config";
24
- import type { AgentSession } from "./core/agent-session";
25
- import { exportFromFile } from "./core/export-html/index";
26
- import type { ExtensionUIContext } from "./core/index";
27
- import type { ModelRegistry } from "./core/model-registry";
28
- import { parseModelPattern, parseModelString, resolveModelScope, type ScopedModel } from "./core/model-resolver";
29
- import { type CreateAgentSessionOptions, createAgentSession, discoverAuthStorage, discoverModels } from "./core/sdk";
30
- import { type SessionInfo, SessionManager } from "./core/session-manager";
31
- import { SettingsManager } from "./core/settings-manager";
32
- import { resolvePromptInput } from "./core/system-prompt";
33
- import { printTimings, time } from "./core/timings";
25
+ import type { ModelRegistry } from "./config/model-registry";
26
+ import { parseModelPattern, parseModelString, resolveModelScope, type ScopedModel } from "./config/model-resolver";
27
+ import { SettingsManager } from "./config/settings-manager";
34
28
  import { initializeWithSettings } from "./discovery";
29
+ import { exportFromFile } from "./export/html/index";
30
+ import type { ExtensionUIContext } from "./extensibility/extensions/types";
35
31
  import { runMigrations, showDeprecationWarnings } from "./migrations";
36
32
  import { InteractiveMode, runPrintMode, runRpcMode } from "./modes/index";
37
- import { initTheme, stopThemeWatcher } from "./modes/interactive/theme/theme";
33
+ import { type CreateAgentSessionOptions, createAgentSession, discoverAuthStorage, discoverModels } from "./sdk";
34
+ import type { AgentSession } from "./session/agent-session";
35
+ import { type SessionInfo, SessionManager } from "./session/session-manager";
36
+ import { resolvePromptInput } from "./system-prompt";
38
37
  import { getChangelogPath, getNewEntries, parseChangelog } from "./utils/changelog";
38
+ import { printTimings, time } from "./utils/timings";
39
39
 
40
40
  async function checkForNewVersion(currentVersion: string): Promise<string | undefined> {
41
41
  try {
@@ -85,7 +85,7 @@ async function runInteractiveMode(
85
85
  initialMessages: string[],
86
86
  setExtensionUIContext: (uiContext: ExtensionUIContext, hasUI: boolean) => void,
87
87
  lspServers: Array<{ name: string; status: "ready" | "error"; fileTypes: string[] }> | undefined,
88
- mcpManager: import("./core/mcp/index").MCPManager | undefined,
88
+ mcpManager: import("./mcp/index").MCPManager | undefined,
89
89
  initialMessage?: string,
90
90
  initialImages?: ImageContent[],
91
91
  ): Promise<void> {
@@ -4,9 +4,9 @@
4
4
  * Uses the capability system to load MCP servers from multiple sources.
5
5
  */
6
6
 
7
- import { mcpCapability } from "../../capability/mcp";
8
- import type { MCPServer } from "../../discovery";
9
- import { loadCapability } from "../../discovery";
7
+ import { mcpCapability } from "$c/capability/mcp";
8
+ import type { MCPServer } from "$c/discovery";
9
+ import { loadCapability } from "$c/discovery";
10
10
  import type { MCPServerConfig } from "./types";
11
11
 
12
12
  /** Options for loading MCP configs */
@@ -24,7 +24,7 @@ export interface LoadMCPConfigsResult {
24
24
  /** Extracted Exa API keys (if any were filtered) */
25
25
  exaApiKeys: string[];
26
26
  /** Source metadata for each server */
27
- sources: Record<string, import("../../capability/types").SourceMeta>;
27
+ sources: Record<string, import("../capability/types").SourceMeta>;
28
28
  }
29
29
 
30
30
  /**
@@ -90,7 +90,7 @@ export async function loadAllMCPConfigs(cwd: string, options?: LoadMCPConfigsOpt
90
90
 
91
91
  // Convert to legacy format and preserve source metadata
92
92
  const configs: Record<string, MCPServerConfig> = {};
93
- const sources: Record<string, import("../../capability/types").SourceMeta> = {};
93
+ const sources: Record<string, import("../capability/types").SourceMeta> = {};
94
94
  for (const server of servers) {
95
95
  configs[server.name] = convertToLegacyConfig(server);
96
96
  sources[server.name] = server._source;
@@ -180,7 +180,7 @@ export interface ExaFilterResult {
180
180
  /** Extracted Exa API keys (if any) */
181
181
  exaApiKeys: string[];
182
182
  /** Source metadata for remaining servers */
183
- sources: Record<string, import("../../capability/types").SourceMeta>;
183
+ sources: Record<string, import("../capability/types").SourceMeta>;
184
184
  }
185
185
 
186
186
  /**
@@ -189,10 +189,10 @@ export interface ExaFilterResult {
189
189
  */
190
190
  export function filterExaMCPServers(
191
191
  configs: Record<string, MCPServerConfig>,
192
- sources: Record<string, import("../../capability/types").SourceMeta>,
192
+ sources: Record<string, import("../capability/types").SourceMeta>,
193
193
  ): ExaFilterResult {
194
194
  const filtered: Record<string, MCPServerConfig> = {};
195
- const filteredSources: Record<string, import("../../capability/types").SourceMeta> = {};
195
+ const filteredSources: Record<string, import("../capability/types").SourceMeta> = {};
196
196
  const exaApiKeys: string[] = [];
197
197
 
198
198
  for (const [name, config] of Object.entries(configs)) {
@@ -5,10 +5,9 @@
5
5
  */
6
6
 
7
7
  import { logger } from "@oh-my-pi/pi-utils";
8
- import { AgentStorage } from "../agent-storage";
9
- import type { LoadedCustomTool } from "../custom-tools/types";
8
+ import type { LoadedCustomTool } from "$c/extensibility/custom-tools/types";
9
+ import { AgentStorage } from "$c/session/agent-storage";
10
10
  import { type MCPLoadResult, MCPManager } from "./manager";
11
- import { parseMCPToolName } from "./tool-bridge";
12
11
  import { MCPToolCache } from "./tool-cache";
13
12
 
14
13
  /** Result from loading MCP tools */
@@ -80,9 +79,9 @@ export async function discoverAndLoadMCPTools(cwd: string, options?: MCPToolsLoa
80
79
 
81
80
  // Convert MCP tools to LoadedCustomTool format
82
81
  const loadedTools: LoadedCustomTool[] = result.tools.map((tool) => {
83
- // Parse the MCP tool name to get server name
84
- const parsed = parseMCPToolName(tool.name);
85
- const serverName = parsed?.serverName;
82
+ // MCPTool and DeferredMCPTool have these properties
83
+ const mcpTool = tool as { mcpServerName?: string };
84
+ const serverName = mcpTool.mcpServerName;
86
85
 
87
86
  // Get provider info from manager's connection if available
88
87
  const connection = serverName ? manager.getConnection(serverName) : undefined;
@@ -7,7 +7,7 @@
7
7
 
8
8
  import { logger } from "@oh-my-pi/pi-utils";
9
9
  import type { TSchema } from "@sinclair/typebox";
10
- import type { CustomTool } from "../custom-tools/types";
10
+ import type { CustomTool } from "$c/extensibility/custom-tools/types";
11
11
  import { connectToServer, disconnectServer, listTools } from "./client";
12
12
  import { loadAllMCPConfigs, validateServerConfig } from "./config";
13
13
  import type { MCPToolDetails } from "./tool-bridge";
@@ -15,7 +15,7 @@ import { DeferredMCPTool, MCPTool } from "./tool-bridge";
15
15
  import type { MCPToolCache } from "./tool-cache";
16
16
  import type { MCPServerConfig, MCPServerConnection, MCPToolDefinition } from "./types";
17
17
 
18
- type SourceMeta = import("../../capability/types").SourceMeta;
18
+ type SourceMeta = import("../capability/types").SourceMeta;
19
19
 
20
20
  type ToolLoadResult = {
21
21
  connection: MCPServerConnection;
@@ -6,8 +6,8 @@
6
6
 
7
7
  import type { AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
8
8
  import type { TSchema } from "@sinclair/typebox";
9
- import type { SourceMeta } from "../../capability/types";
10
- import type { CustomTool, CustomToolContext, CustomToolResult } from "../custom-tools/types";
9
+ import type { SourceMeta } from "$c/capability/types";
10
+ import type { CustomTool, CustomToolContext, CustomToolResult } from "$c/extensibility/custom-tools/types";
11
11
  import { callTool } from "./client";
12
12
  import type { MCPContent, MCPServerConnection, MCPToolDefinition } from "./types";
13
13
 
@@ -66,21 +66,38 @@ function formatMCPContent(content: MCPContent[]): string {
66
66
 
67
67
  /**
68
68
  * Create a unique tool name for an MCP tool.
69
- * Prefixes with server name to avoid conflicts.
69
+ *
70
+ * Prefixes with server name to avoid conflicts. If the tool name already
71
+ * starts with the server name (e.g., server "puppeteer" with tool
72
+ * "puppeteer_screenshot"), strips the redundant prefix to produce
73
+ * "mcp_puppeteer_screenshot" instead of "mcp_puppeteer_puppeteer_screenshot".
70
74
  */
71
75
  export function createMCPToolName(serverName: string, toolName: string): string {
72
- // Use underscore separator since tool names can't have special chars
73
- return `mcp_${serverName}_${toolName}`;
76
+ // Strip redundant server name prefix from tool name if present
77
+ const prefixWithUnderscore = `${serverName}_`;
78
+ const prefixWithHyphen = `${serverName}-`;
79
+
80
+ let normalizedToolName = toolName;
81
+ if (toolName.startsWith(prefixWithUnderscore)) {
82
+ normalizedToolName = toolName.slice(prefixWithUnderscore.length);
83
+ } else if (toolName.startsWith(prefixWithHyphen)) {
84
+ normalizedToolName = toolName.slice(prefixWithHyphen.length);
85
+ }
86
+
87
+ return `mcp_${serverName}_${normalizedToolName}`;
74
88
  }
75
89
 
76
90
  /**
77
91
  * Parse an MCP tool name back to server and tool components.
92
+ *
93
+ * Note: This returns the normalized tool name (with server prefix stripped).
94
+ * The original MCP tool name may have had the server name as a prefix.
78
95
  */
79
96
  export function parseMCPToolName(name: string): { serverName: string; toolName: string } | null {
80
97
  if (!name.startsWith("mcp_")) return null;
81
98
 
82
99
  const rest = name.slice(4);
83
- const underscoreIdx = rest.lastIndexOf("_");
100
+ const underscoreIdx = rest.indexOf("_");
84
101
  if (underscoreIdx === -1) return null;
85
102
 
86
103
  return {
@@ -97,6 +114,10 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
97
114
  public readonly label: string;
98
115
  public readonly description: string;
99
116
  public readonly parameters: TSchema;
117
+ /** Original MCP tool name (before normalization) */
118
+ public readonly mcpToolName: string;
119
+ /** Server name */
120
+ public readonly mcpServerName: string;
100
121
 
101
122
  /** Create MCPTool instances for all tools from an MCP server connection */
102
123
  static fromTools(connection: MCPServerConnection, tools: MCPToolDefinition[]): MCPTool[] {
@@ -111,6 +132,8 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
111
132
  this.label = `${connection.name}/${tool.name}`;
112
133
  this.description = tool.description ?? `MCP tool from ${connection.name}`;
113
134
  this.parameters = convertSchema(tool.inputSchema);
135
+ this.mcpToolName = tool.name;
136
+ this.mcpServerName = connection.name;
114
137
  }
115
138
 
116
139
  async execute(
@@ -168,6 +191,10 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
168
191
  public readonly label: string;
169
192
  public readonly description: string;
170
193
  public readonly parameters: TSchema;
194
+ /** Original MCP tool name (before normalization) */
195
+ public readonly mcpToolName: string;
196
+ /** Server name */
197
+ public readonly mcpServerName: string;
171
198
  private readonly fallbackProvider: string | undefined;
172
199
  private readonly fallbackProviderName: string | undefined;
173
200
 
@@ -191,6 +218,8 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
191
218
  this.label = `${serverName}/${tool.name}`;
192
219
  this.description = tool.description ?? `MCP tool from ${serverName}`;
193
220
  this.parameters = convertSchema(tool.inputSchema);
221
+ this.mcpToolName = tool.name;
222
+ this.mcpServerName = serverName;
194
223
  this.fallbackProvider = source?.provider;
195
224
  this.fallbackProviderName = source?.providerName;
196
225
  }
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import { logger } from "@oh-my-pi/pi-utils";
8
- import type { AgentStorage } from "../agent-storage";
8
+ import type { AgentStorage } from "$c/session/agent-storage";
9
9
  import type { MCPServerConfig, MCPToolDefinition } from "./types";
10
10
 
11
11
  const CACHE_VERSION = 1;
@@ -5,7 +5,13 @@
5
5
  * Based on MCP spec 2025-03-26.
6
6
  */
7
7
 
8
- import type { JsonRpcMessage, JsonRpcResponse, MCPHttpServerConfig, MCPSseServerConfig, MCPTransport } from "../types";
8
+ import type {
9
+ JsonRpcMessage,
10
+ JsonRpcResponse,
11
+ MCPHttpServerConfig,
12
+ MCPSseServerConfig,
13
+ MCPTransport,
14
+ } from "$c/mcp/types";
9
15
 
10
16
  /** Generate unique request ID */
11
17
  function generateId(): string {
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { type Subprocess, spawn } from "bun";
9
- import type { JsonRpcResponse, MCPStdioServerConfig, MCPTransport } from "../types";
9
+ import type { JsonRpcResponse, MCPStdioServerConfig, MCPTransport } from "$c/mcp/types";
10
10
 
11
11
  /** Generate unique request ID */
12
12
  function generateId(): string {
@@ -218,7 +218,7 @@ export interface MCPServerConnection {
218
218
  /** Cached tools (populated on demand) */
219
219
  tools?: MCPToolDefinition[];
220
220
  /** Source metadata (for display) */
221
- _source?: import("../../capability/types").SourceMeta;
221
+ _source?: import("../capability/types").SourceMeta;
222
222
  }
223
223
 
224
224
  /** MCP tool with server context */
package/src/migrations.ts CHANGED
@@ -6,9 +6,9 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, w
6
6
  import { join } from "node:path";
7
7
  import { logger } from "@oh-my-pi/pi-utils";
8
8
  import chalk from "chalk";
9
+ import { AgentStorage } from "$c/session/agent-storage";
10
+ import type { AuthCredential } from "$c/session/auth-storage";
9
11
  import { getAgentDbPath, getAgentDir, getBinDir } from "./config";
10
- import { AgentStorage } from "./core/agent-storage";
11
- import type { AuthCredential } from "./core/auth-storage";
12
12
 
13
13
  /**
14
14
  * Migrate legacy oauth.json and settings.json apiKeys to agent.db.
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import type { Component, TUI } from "@oh-my-pi/pi-tui";
6
- import { theme } from "../theme/theme";
6
+ import { theme } from "$c/modes/theme/theme";
7
7
 
8
8
  // XBM image: 31x36 pixels, LSB first, 1=background, 0=foreground
9
9
  const WIDTH = 31;
@@ -1,6 +1,6 @@
1
1
  import type { AssistantMessage } from "@oh-my-pi/pi-ai";
2
2
  import { Container, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
3
- import { getMarkdownTheme, theme } from "../theme/theme";
3
+ import { getMarkdownTheme, theme } from "$c/modes/theme/theme";
4
4
 
5
5
  /**
6
6
  * Component that renders a complete assistant message
@@ -4,13 +4,9 @@
4
4
 
5
5
  import { Container, Loader, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
6
6
  import stripAnsi from "strip-ansi";
7
- import {
8
- DEFAULT_MAX_BYTES,
9
- DEFAULT_MAX_LINES,
10
- type TruncationResult,
11
- truncateTail,
12
- } from "../../../core/tools/truncate";
13
- import { getSymbolTheme, theme } from "../theme/theme";
7
+ import { getSymbolTheme, theme } from "$c/modes/theme/theme";
8
+ import type { TruncationMeta } from "$c/tools/output-meta";
9
+ import { formatSize } from "$c/tools/truncate";
14
10
  import { DynamicBorder } from "./dynamic-border";
15
11
  import { truncateToVisualLines } from "./visual-truncate";
16
12
 
@@ -23,8 +19,7 @@ export class BashExecutionComponent extends Container {
23
19
  private status: "running" | "complete" | "cancelled" | "error" = "running";
24
20
  private exitCode: number | undefined = undefined;
25
21
  private loader: Loader;
26
- private truncationResult?: TruncationResult;
27
- private fullOutputPath?: string;
22
+ private truncation?: TruncationMeta;
28
23
  private expanded = false;
29
24
  private contentContainer: Container;
30
25
 
@@ -78,9 +73,7 @@ export class BashExecutionComponent extends Container {
78
73
  }
79
74
 
80
75
  appendOutput(chunk: string): void {
81
- // Strip ANSI codes and normalize line endings
82
- // Note: binary data is already sanitized in tui-renderer.ts executeBashCommand
83
- const clean = stripAnsi(chunk).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
76
+ const clean = this.normalizeOutput(chunk);
84
77
 
85
78
  // Append to output lines
86
79
  const newLines = clean.split("\n");
@@ -98,8 +91,7 @@ export class BashExecutionComponent extends Container {
98
91
  setComplete(
99
92
  exitCode: number | undefined,
100
93
  cancelled: boolean,
101
- truncationResult?: TruncationResult,
102
- fullOutputPath?: string,
94
+ options?: { output?: string; truncation?: TruncationMeta },
103
95
  ): void {
104
96
  this.exitCode = exitCode;
105
97
  this.status = cancelled
@@ -107,8 +99,10 @@ export class BashExecutionComponent extends Container {
107
99
  : exitCode !== 0 && exitCode !== undefined && exitCode !== null
108
100
  ? "error"
109
101
  : "complete";
110
- this.truncationResult = truncationResult;
111
- this.fullOutputPath = fullOutputPath;
102
+ this.truncation = options?.truncation;
103
+ if (options?.output !== undefined) {
104
+ this.setOutput(options.output);
105
+ }
112
106
 
113
107
  // Stop loader
114
108
  this.loader.stop();
@@ -117,15 +111,7 @@ export class BashExecutionComponent extends Container {
117
111
  }
118
112
 
119
113
  private updateDisplay(): void {
120
- // Apply truncation for LLM context limits (same limits as bash tool)
121
- const fullOutput = this.outputLines.join("\n");
122
- const contextTruncation = truncateTail(fullOutput, {
123
- maxLines: DEFAULT_MAX_LINES,
124
- maxBytes: DEFAULT_MAX_BYTES,
125
- });
126
-
127
- // Get the lines to potentially display (after context truncation)
128
- const availableLines = contextTruncation.content ? contextTruncation.content.split("\n") : [];
114
+ const availableLines = this.outputLines;
129
115
 
130
116
  // Apply preview truncation based on expanded state
131
117
  const previewLogicalLines = availableLines.slice(-PREVIEW_LINES);
@@ -177,10 +163,21 @@ export class BashExecutionComponent extends Container {
177
163
  statusParts.push(theme.fg("error", `(exit ${this.exitCode})`));
178
164
  }
179
165
 
180
- // Add truncation warning (context truncation, not preview truncation)
181
- const wasTruncated = this.truncationResult?.truncated || contextTruncation.truncated;
182
- if (wasTruncated && this.fullOutputPath) {
183
- statusParts.push(theme.fg("warning", `Output truncated. Full output: ${this.fullOutputPath}`));
166
+ if (this.truncation) {
167
+ const warnings: string[] = [];
168
+ if (this.truncation.artifactId) {
169
+ warnings.push(`Full output: artifact://${this.truncation.artifactId}`);
170
+ }
171
+ if (this.truncation.truncatedBy === "lines") {
172
+ warnings.push(
173
+ `Truncated: showing ${this.truncation.outputLines} of ${this.truncation.totalLines} lines`,
174
+ );
175
+ } else {
176
+ warnings.push(
177
+ `Truncated: ${this.truncation.outputLines} lines shown (${formatSize(this.truncation.outputBytes)} limit)`,
178
+ );
179
+ }
180
+ statusParts.push(theme.fg("warning", warnings.join(". ")));
184
181
  }
185
182
 
186
183
  if (statusParts.length > 0) {
@@ -189,6 +186,17 @@ export class BashExecutionComponent extends Container {
189
186
  }
190
187
  }
191
188
 
189
+ private normalizeOutput(text: string): string {
190
+ // Strip ANSI codes and normalize line endings
191
+ // Note: binary data is already sanitized in tui-renderer.ts executeBashCommand
192
+ return stripAnsi(text).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
193
+ }
194
+
195
+ private setOutput(output: string): void {
196
+ const clean = this.normalizeOutput(output);
197
+ this.outputLines = clean ? clean.split("\n") : [];
198
+ }
199
+
192
200
  /**
193
201
  * Get the raw output for creating BashExecutionMessage.
194
202
  */
@@ -1,5 +1,5 @@
1
1
  import { CancellableLoader, Container, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
2
- import type { Theme } from "../theme/theme";
2
+ import type { Theme } from "$c/modes/theme/theme";
3
3
  import { DynamicBorder } from "./dynamic-border";
4
4
 
5
5
  /** Loader wrapped with borders for hook UI */