@oh-my-pi/pi-coding-agent 8.1.0 → 8.2.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 (402) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/docs/session.md +111 -46
  3. package/examples/custom-tools/hello/index.ts +1 -1
  4. package/examples/custom-tools/todo/index.ts +3 -4
  5. package/examples/extensions/api-demo.ts +0 -1
  6. package/examples/extensions/chalk-logger.ts +2 -3
  7. package/examples/extensions/hello.ts +0 -1
  8. package/examples/extensions/pirate.ts +0 -1
  9. package/examples/extensions/plan-mode.ts +15 -16
  10. package/examples/extensions/todo.ts +3 -4
  11. package/examples/extensions/tools.ts +1 -2
  12. package/examples/extensions/with-deps/index.ts +0 -1
  13. package/examples/hooks/auto-commit-on-exit.ts +1 -2
  14. package/examples/hooks/confirm-destructive.ts +0 -1
  15. package/examples/hooks/custom-compaction.ts +1 -2
  16. package/examples/hooks/dirty-repo-guard.ts +0 -1
  17. package/examples/hooks/file-trigger.ts +3 -4
  18. package/examples/hooks/git-checkpoint.ts +0 -1
  19. package/examples/hooks/handoff.ts +3 -4
  20. package/examples/hooks/permission-gate.ts +1 -2
  21. package/examples/hooks/protected-paths.ts +1 -2
  22. package/examples/hooks/qna.ts +2 -3
  23. package/examples/hooks/snake.ts +4 -5
  24. package/examples/hooks/status-line.ts +0 -1
  25. package/examples/sdk/01-minimal.ts +2 -3
  26. package/examples/sdk/02-custom-model.ts +2 -3
  27. package/examples/sdk/03-custom-prompt.ts +3 -4
  28. package/examples/sdk/04-skills.ts +2 -3
  29. package/examples/sdk/06-extensions.ts +1 -2
  30. package/examples/sdk/06-hooks.ts +6 -7
  31. package/examples/sdk/07-context-files.ts +0 -1
  32. package/examples/sdk/08-prompt-templates.ts +0 -1
  33. package/examples/sdk/08-slash-commands.ts +0 -1
  34. package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
  35. package/examples/sdk/10-settings.ts +0 -1
  36. package/examples/sdk/11-sessions.ts +0 -1
  37. package/package.json +51 -23
  38. package/scripts/format-prompts.ts +0 -1
  39. package/src/capability/context-file.ts +2 -3
  40. package/src/capability/extension-module.ts +2 -3
  41. package/src/capability/extension.ts +2 -3
  42. package/src/capability/fs.ts +20 -21
  43. package/src/capability/hook.ts +2 -3
  44. package/src/capability/index.ts +15 -16
  45. package/src/capability/instruction.ts +2 -3
  46. package/src/capability/mcp.ts +2 -3
  47. package/src/capability/prompt.ts +2 -3
  48. package/src/capability/rule.ts +2 -3
  49. package/src/capability/settings.ts +1 -2
  50. package/src/capability/skill.ts +2 -3
  51. package/src/capability/slash-command.ts +2 -3
  52. package/src/capability/ssh.ts +2 -3
  53. package/src/capability/system-prompt.ts +2 -3
  54. package/src/capability/tool.ts +2 -3
  55. package/src/cli/args.ts +5 -6
  56. package/src/cli/config-cli.ts +6 -7
  57. package/src/cli/file-processor.ts +19 -17
  58. package/src/cli/jupyter-cli.ts +105 -0
  59. package/src/cli/list-models.ts +10 -11
  60. package/src/cli/plugin-cli.ts +20 -21
  61. package/src/cli/session-picker.ts +2 -3
  62. package/src/cli/setup-cli.ts +2 -3
  63. package/src/cli/stats-cli.ts +2 -3
  64. package/src/cli/update-cli.ts +25 -22
  65. package/src/commit/agentic/agent.ts +21 -23
  66. package/src/commit/agentic/fallback.ts +9 -9
  67. package/src/commit/agentic/index.ts +30 -38
  68. package/src/commit/agentic/state.ts +1 -6
  69. package/src/commit/agentic/tools/analyze-file.ts +15 -15
  70. package/src/commit/agentic/tools/git-file-diff.ts +3 -3
  71. package/src/commit/agentic/tools/git-hunk.ts +7 -7
  72. package/src/commit/agentic/tools/git-overview.ts +5 -5
  73. package/src/commit/agentic/tools/index.ts +14 -14
  74. package/src/commit/agentic/tools/propose-changelog.ts +6 -6
  75. package/src/commit/agentic/tools/propose-commit.ts +8 -8
  76. package/src/commit/agentic/tools/recent-commits.ts +2 -2
  77. package/src/commit/agentic/tools/split-commit.ts +19 -23
  78. package/src/commit/agentic/topo-sort.ts +1 -1
  79. package/src/commit/agentic/trivial.ts +3 -3
  80. package/src/commit/agentic/validation.ts +12 -12
  81. package/src/commit/analysis/conventional.ts +7 -11
  82. package/src/commit/analysis/index.ts +4 -4
  83. package/src/commit/analysis/scope.ts +4 -4
  84. package/src/commit/analysis/summary.ts +7 -9
  85. package/src/commit/analysis/validation.ts +1 -1
  86. package/src/commit/changelog/detect.ts +6 -6
  87. package/src/commit/changelog/generate.ts +7 -9
  88. package/src/commit/changelog/index.ts +13 -13
  89. package/src/commit/changelog/parse.ts +2 -2
  90. package/src/commit/cli.ts +1 -1
  91. package/src/commit/git/diff.ts +3 -3
  92. package/src/commit/git/index.ts +19 -24
  93. package/src/commit/index.ts +1 -1
  94. package/src/commit/map-reduce/index.ts +9 -9
  95. package/src/commit/map-reduce/map-phase.ts +19 -34
  96. package/src/commit/map-reduce/reduce-phase.ts +9 -11
  97. package/src/commit/message.ts +2 -2
  98. package/src/commit/model-selection.ts +3 -7
  99. package/src/commit/pipeline.ts +20 -22
  100. package/src/commit/utils/exclusions.ts +3 -3
  101. package/src/config/file-lock.ts +17 -7
  102. package/src/config/keybindings.ts +6 -8
  103. package/src/config/model-registry.ts +55 -37
  104. package/src/config/model-resolver.ts +18 -19
  105. package/src/config/prompt-templates.ts +11 -11
  106. package/src/config/settings-manager.ts +50 -34
  107. package/src/config.ts +60 -62
  108. package/src/cursor.ts +11 -9
  109. package/src/discovery/agents-md.ts +11 -12
  110. package/src/discovery/builtin.ts +68 -73
  111. package/src/discovery/claude.ts +41 -42
  112. package/src/discovery/cline.ts +11 -12
  113. package/src/discovery/codex.ts +52 -53
  114. package/src/discovery/cursor.ts +9 -10
  115. package/src/discovery/gemini.ts +17 -22
  116. package/src/discovery/github.ts +13 -14
  117. package/src/discovery/helpers.ts +35 -34
  118. package/src/discovery/index.ts +16 -18
  119. package/src/discovery/mcp-json.ts +8 -9
  120. package/src/discovery/ssh.ts +8 -9
  121. package/src/discovery/vscode.ts +4 -5
  122. package/src/discovery/windsurf.ts +6 -7
  123. package/src/exa/company.ts +1 -2
  124. package/src/exa/index.ts +2 -3
  125. package/src/exa/linkedin.ts +1 -2
  126. package/src/exa/mcp-client.ts +14 -16
  127. package/src/exa/render.ts +10 -11
  128. package/src/exa/researcher.ts +1 -2
  129. package/src/exa/search.ts +1 -2
  130. package/src/exa/types.ts +0 -1
  131. package/src/exa/websets.ts +1 -2
  132. package/src/exec/bash-executor.ts +3 -4
  133. package/src/exec/exec.ts +0 -1
  134. package/src/export/custom-share.ts +5 -6
  135. package/src/export/html/index.ts +24 -21
  136. package/src/export/ttsr.ts +2 -3
  137. package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
  138. package/src/extensibility/custom-commands/loader.ts +17 -14
  139. package/src/extensibility/custom-commands/types.ts +1 -2
  140. package/src/extensibility/custom-tools/loader.ts +10 -11
  141. package/src/extensibility/custom-tools/types.ts +6 -7
  142. package/src/extensibility/custom-tools/wrapper.ts +2 -3
  143. package/src/extensibility/extensions/loader.ts +75 -53
  144. package/src/extensibility/extensions/runner.ts +11 -12
  145. package/src/extensibility/extensions/types.ts +19 -26
  146. package/src/extensibility/extensions/wrapper.ts +3 -4
  147. package/src/extensibility/hooks/index.ts +1 -1
  148. package/src/extensibility/hooks/loader.ts +8 -9
  149. package/src/extensibility/hooks/runner.ts +7 -8
  150. package/src/extensibility/hooks/tool-wrapper.ts +0 -1
  151. package/src/extensibility/hooks/types.ts +10 -17
  152. package/src/extensibility/plugins/doctor.ts +3 -3
  153. package/src/extensibility/plugins/installer.ts +27 -27
  154. package/src/extensibility/plugins/loader.ts +59 -56
  155. package/src/extensibility/plugins/manager.ts +211 -171
  156. package/src/extensibility/plugins/parser.ts +1 -1
  157. package/src/extensibility/plugins/paths.ts +8 -8
  158. package/src/extensibility/skills.ts +63 -60
  159. package/src/extensibility/slash-commands.ts +10 -10
  160. package/src/index.ts +46 -46
  161. package/src/internal-urls/agent-protocol.ts +21 -11
  162. package/src/internal-urls/artifact-protocol.ts +17 -13
  163. package/src/internal-urls/router.ts +1 -2
  164. package/src/internal-urls/rule-protocol.ts +3 -4
  165. package/src/internal-urls/skill-protocol.ts +3 -4
  166. package/src/ipy/executor.ts +14 -10
  167. package/src/ipy/gateway-coordinator.ts +79 -90
  168. package/src/ipy/kernel.ts +32 -30
  169. package/src/ipy/modules.ts +13 -13
  170. package/src/lsp/client.ts +21 -10
  171. package/src/lsp/clients/biome-client.ts +1 -2
  172. package/src/lsp/clients/index.ts +3 -3
  173. package/src/lsp/clients/lsp-linter-client.ts +4 -5
  174. package/src/lsp/config.ts +15 -15
  175. package/src/lsp/edits.ts +4 -5
  176. package/src/lsp/index.ts +43 -44
  177. package/src/lsp/lspmux.ts +8 -8
  178. package/src/lsp/render.ts +10 -16
  179. package/src/lsp/utils.ts +3 -3
  180. package/src/main.ts +55 -34
  181. package/src/mcp/client.ts +2 -3
  182. package/src/mcp/config.ts +5 -6
  183. package/src/mcp/json-rpc.ts +0 -1
  184. package/src/mcp/loader.ts +3 -4
  185. package/src/mcp/manager.ts +17 -18
  186. package/src/mcp/tool-bridge.ts +4 -9
  187. package/src/mcp/tool-cache.ts +2 -3
  188. package/src/mcp/transports/http.ts +2 -4
  189. package/src/mcp/transports/stdio.ts +1 -2
  190. package/src/migrations.ts +60 -49
  191. package/src/modes/components/armin.ts +4 -5
  192. package/src/modes/components/assistant-message.ts +6 -6
  193. package/src/modes/components/bash-execution.ts +7 -8
  194. package/src/modes/components/bordered-loader.ts +3 -3
  195. package/src/modes/components/branch-summary-message.ts +3 -3
  196. package/src/modes/components/compaction-summary-message.ts +3 -3
  197. package/src/modes/components/countdown-timer.ts +0 -1
  198. package/src/modes/components/custom-message.ts +5 -5
  199. package/src/modes/components/diff.ts +1 -1
  200. package/src/modes/components/dynamic-border.ts +2 -2
  201. package/src/modes/components/extensions/extension-dashboard.ts +6 -7
  202. package/src/modes/components/extensions/extension-list.ts +2 -3
  203. package/src/modes/components/extensions/inspector-panel.ts +3 -4
  204. package/src/modes/components/extensions/state-manager.ts +25 -26
  205. package/src/modes/components/extensions/types.ts +1 -2
  206. package/src/modes/components/footer.ts +47 -43
  207. package/src/modes/components/history-search.ts +2 -2
  208. package/src/modes/components/hook-editor.ts +3 -4
  209. package/src/modes/components/hook-input.ts +2 -3
  210. package/src/modes/components/hook-message.ts +5 -5
  211. package/src/modes/components/hook-selector.ts +2 -3
  212. package/src/modes/components/keybinding-hints.ts +2 -3
  213. package/src/modes/components/login-dialog.ts +2 -2
  214. package/src/modes/components/model-selector.ts +12 -12
  215. package/src/modes/components/oauth-selector.ts +2 -2
  216. package/src/modes/components/plugin-settings.ts +20 -20
  217. package/src/modes/components/python-execution.ts +7 -8
  218. package/src/modes/components/queue-mode-selector.ts +3 -3
  219. package/src/modes/components/read-tool-group.ts +2 -2
  220. package/src/modes/components/session-selector.ts +4 -4
  221. package/src/modes/components/settings-defs.ts +77 -69
  222. package/src/modes/components/settings-selector.ts +16 -16
  223. package/src/modes/components/show-images-selector.ts +2 -2
  224. package/src/modes/components/status-line/segments.ts +4 -4
  225. package/src/modes/components/status-line/separators.ts +1 -1
  226. package/src/modes/components/status-line/types.ts +2 -2
  227. package/src/modes/components/status-line-segment-editor.ts +7 -8
  228. package/src/modes/components/status-line.ts +12 -12
  229. package/src/modes/components/theme-selector.ts +8 -7
  230. package/src/modes/components/thinking-selector.ts +4 -4
  231. package/src/modes/components/todo-display.ts +2 -2
  232. package/src/modes/components/todo-reminder.ts +4 -4
  233. package/src/modes/components/tool-execution.ts +11 -16
  234. package/src/modes/components/tree-selector.ts +11 -11
  235. package/src/modes/components/ttsr-notification.ts +5 -5
  236. package/src/modes/components/user-message-selector.ts +1 -1
  237. package/src/modes/components/user-message.ts +1 -1
  238. package/src/modes/components/visual-truncate.ts +0 -1
  239. package/src/modes/components/welcome.ts +4 -4
  240. package/src/modes/controllers/command-controller.ts +46 -47
  241. package/src/modes/controllers/event-controller.ts +16 -20
  242. package/src/modes/controllers/extension-ui-controller.ts +40 -46
  243. package/src/modes/controllers/input-controller.ts +17 -18
  244. package/src/modes/controllers/selector-controller.ts +103 -91
  245. package/src/modes/index.ts +3 -3
  246. package/src/modes/interactive-mode.ts +27 -29
  247. package/src/modes/print-mode.ts +12 -13
  248. package/src/modes/rpc/rpc-client.ts +7 -8
  249. package/src/modes/rpc/rpc-mode.ts +24 -25
  250. package/src/modes/rpc/rpc-types.ts +3 -4
  251. package/src/modes/theme/mermaid-cache.ts +2 -2
  252. package/src/modes/theme/theme.ts +128 -53
  253. package/src/modes/types.ts +10 -10
  254. package/src/modes/utils/ui-helpers.ts +17 -17
  255. package/src/patch/applicator.ts +18 -19
  256. package/src/patch/diff.ts +1 -2
  257. package/src/patch/fuzzy.ts +1 -2
  258. package/src/patch/index.ts +10 -11
  259. package/src/patch/normalize.ts +4 -4
  260. package/src/patch/normative.ts +1 -2
  261. package/src/patch/parser.ts +8 -9
  262. package/src/patch/shared.ts +12 -13
  263. package/src/sdk.ts +60 -63
  264. package/src/session/agent-session.ts +83 -84
  265. package/src/session/agent-storage.ts +11 -11
  266. package/src/session/artifacts.ts +8 -9
  267. package/src/session/auth-storage.ts +25 -29
  268. package/src/session/compaction/branch-summarization.ts +7 -10
  269. package/src/session/compaction/compaction.ts +8 -19
  270. package/src/session/compaction/utils.ts +6 -9
  271. package/src/session/history-storage.ts +10 -10
  272. package/src/session/messages.ts +4 -5
  273. package/src/session/session-manager.ts +76 -65
  274. package/src/session/session-storage.ts +57 -69
  275. package/src/session/storage-migration.ts +2 -3
  276. package/src/session/streaming-output.ts +2 -2
  277. package/src/ssh/connection-manager.ts +43 -50
  278. package/src/ssh/ssh-executor.ts +2 -2
  279. package/src/ssh/sshfs-mount.ts +11 -18
  280. package/src/system-prompt.ts +27 -34
  281. package/src/task/agents.ts +45 -30
  282. package/src/task/commands.ts +6 -7
  283. package/src/task/discovery.ts +39 -76
  284. package/src/task/executor.ts +14 -15
  285. package/src/task/index.ts +33 -36
  286. package/src/task/output-manager.ts +3 -4
  287. package/src/task/parallel.ts +0 -1
  288. package/src/task/render.ts +19 -20
  289. package/src/task/subprocess-tool-registry.ts +1 -2
  290. package/src/task/worker-protocol.ts +3 -3
  291. package/src/task/worker.ts +32 -38
  292. package/src/task/worktree.ts +19 -19
  293. package/src/tools/ask.ts +8 -9
  294. package/src/tools/bash-interceptor.ts +1 -5
  295. package/src/tools/bash.ts +19 -18
  296. package/src/tools/calculator.ts +12 -12
  297. package/src/tools/complete.ts +3 -4
  298. package/src/tools/context.ts +2 -2
  299. package/src/tools/fetch.ts +23 -26
  300. package/src/tools/find.ts +15 -16
  301. package/src/tools/gemini-image.ts +14 -14
  302. package/src/tools/grep.ts +27 -27
  303. package/src/tools/index.ts +78 -56
  304. package/src/tools/list-limit.ts +1 -1
  305. package/src/tools/ls.ts +7 -7
  306. package/src/tools/notebook.ts +5 -5
  307. package/src/tools/output-meta.ts +3 -4
  308. package/src/tools/output-utils.ts +1 -1
  309. package/src/tools/path-utils.ts +5 -5
  310. package/src/tools/python.ts +36 -37
  311. package/src/tools/read.ts +23 -23
  312. package/src/tools/render-utils.ts +8 -9
  313. package/src/tools/renderers.ts +6 -7
  314. package/src/tools/review.ts +8 -11
  315. package/src/tools/ssh.ts +31 -30
  316. package/src/tools/todo-write.ts +13 -13
  317. package/src/tools/tool-errors.ts +3 -3
  318. package/src/tools/tool-result.ts +3 -8
  319. package/src/tools/write.ts +11 -16
  320. package/src/tui/code-cell.ts +3 -9
  321. package/src/tui/file-list.ts +3 -4
  322. package/src/tui/output-block.ts +1 -2
  323. package/src/tui/status-line.ts +2 -3
  324. package/src/tui/tree-list.ts +2 -3
  325. package/src/tui/types.ts +1 -2
  326. package/src/tui/utils.ts +2 -3
  327. package/src/utils/changelog.ts +9 -10
  328. package/src/utils/clipboard.ts +11 -11
  329. package/src/utils/file-mentions.ts +4 -10
  330. package/src/utils/frontmatter.ts +6 -3
  331. package/src/utils/fuzzy.ts +2 -2
  332. package/src/utils/image-convert.ts +1 -1
  333. package/src/utils/image-resize.ts +1 -1
  334. package/src/utils/mime.ts +2 -2
  335. package/src/utils/shell-snapshot.ts +11 -13
  336. package/src/utils/shell.ts +4 -5
  337. package/src/utils/title-generator.ts +8 -9
  338. package/src/utils/tools-manager.ts +23 -23
  339. package/src/vendor/photon/index.js +1099 -1059
  340. package/src/vendor/photon/photon_rs_bg.wasm +0 -0
  341. package/src/web/scrapers/artifacthub.ts +1 -1
  342. package/src/web/scrapers/arxiv.ts +2 -2
  343. package/src/web/scrapers/bluesky.ts +2 -2
  344. package/src/web/scrapers/cheatsh.ts +1 -1
  345. package/src/web/scrapers/chocolatey.ts +2 -2
  346. package/src/web/scrapers/choosealicense.ts +5 -5
  347. package/src/web/scrapers/cisa-kev.ts +1 -1
  348. package/src/web/scrapers/crossref.ts +2 -2
  349. package/src/web/scrapers/devto.ts +3 -3
  350. package/src/web/scrapers/discogs.ts +3 -4
  351. package/src/web/scrapers/discourse.ts +1 -1
  352. package/src/web/scrapers/dockerhub.ts +1 -1
  353. package/src/web/scrapers/fdroid.ts +2 -2
  354. package/src/web/scrapers/firefox-addons.ts +3 -3
  355. package/src/web/scrapers/flathub.ts +1 -1
  356. package/src/web/scrapers/github.ts +3 -3
  357. package/src/web/scrapers/gitlab.ts +4 -4
  358. package/src/web/scrapers/hackernews.ts +2 -2
  359. package/src/web/scrapers/huggingface.ts +1 -1
  360. package/src/web/scrapers/iacr.ts +2 -2
  361. package/src/web/scrapers/index.ts +0 -1
  362. package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
  363. package/src/web/scrapers/lemmy.ts +2 -2
  364. package/src/web/scrapers/maven.ts +2 -2
  365. package/src/web/scrapers/mdn.ts +2 -4
  366. package/src/web/scrapers/metacpan.ts +2 -2
  367. package/src/web/scrapers/musicbrainz.ts +1 -2
  368. package/src/web/scrapers/npm.ts +1 -1
  369. package/src/web/scrapers/nuget.ts +2 -2
  370. package/src/web/scrapers/nvd.ts +3 -3
  371. package/src/web/scrapers/ollama.ts +7 -9
  372. package/src/web/scrapers/opencorporates.ts +2 -2
  373. package/src/web/scrapers/openlibrary.ts +6 -6
  374. package/src/web/scrapers/orcid.ts +0 -1
  375. package/src/web/scrapers/osv.ts +2 -2
  376. package/src/web/scrapers/packagist.ts +1 -1
  377. package/src/web/scrapers/pubmed.ts +1 -2
  378. package/src/web/scrapers/rawg.ts +2 -2
  379. package/src/web/scrapers/readthedocs.ts +1 -2
  380. package/src/web/scrapers/repology.ts +2 -2
  381. package/src/web/scrapers/rfc.ts +1 -1
  382. package/src/web/scrapers/searchcode.ts +2 -2
  383. package/src/web/scrapers/semantic-scholar.ts +1 -1
  384. package/src/web/scrapers/snapcraft.ts +2 -2
  385. package/src/web/scrapers/sourcegraph.ts +1 -1
  386. package/src/web/scrapers/spdx.ts +3 -3
  387. package/src/web/scrapers/spotify.ts +0 -1
  388. package/src/web/scrapers/twitter.ts +1 -1
  389. package/src/web/scrapers/types.ts +1 -2
  390. package/src/web/scrapers/utils.ts +5 -5
  391. package/src/web/scrapers/wikidata.ts +3 -3
  392. package/src/web/scrapers/youtube.ts +9 -14
  393. package/src/web/search/auth.ts +4 -9
  394. package/src/web/search/index.ts +11 -21
  395. package/src/web/search/providers/anthropic.ts +3 -9
  396. package/src/web/search/providers/exa.ts +6 -10
  397. package/src/web/search/providers/perplexity.ts +5 -5
  398. package/src/web/search/render.ts +16 -18
  399. package/scripts/generate-wasm-b64.ts +0 -24
  400. package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
  401. package/src/task/.executor.ts.kate-swp +0 -0
  402. package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
@@ -1,4 +1,4 @@
1
- import type { LimitsMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
1
+ import type { LimitsMeta } from "./output-meta";
2
2
 
3
3
  export interface ListLimitResult<T> {
4
4
  items: T[];
package/src/tools/ls.ts CHANGED
@@ -1,15 +1,14 @@
1
1
  import nodePath from "node:path";
2
2
  import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
3
- import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
4
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
5
- import type { OutputMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
6
- import { ToolError, throwIfAborted } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
7
- import { renderFileList, renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
8
3
  import { type Component, Text } from "@oh-my-pi/pi-tui";
9
4
  import { untilAborted } from "@oh-my-pi/pi-utils";
10
5
  import { Type } from "@sinclair/typebox";
6
+ import type { RenderResultOptions } from "../extensibility/custom-tools/types";
7
+ import type { Theme } from "../modes/theme/theme";
8
+ import { renderFileList, renderStatusLine } from "../tui";
11
9
  import type { ToolSession } from ".";
12
10
  import { applyListLimit } from "./list-limit";
11
+ import type { OutputMeta } from "./output-meta";
13
12
  import { resolveToCwd } from "./path-utils";
14
13
  import {
15
14
  formatAge,
@@ -19,6 +18,7 @@ import {
19
18
  formatErrorMessage,
20
19
  PREVIEW_LIMITS,
21
20
  } from "./render-utils";
21
+ import { ToolError, throwIfAborted } from "./tool-errors";
22
22
  import { toolResult } from "./tool-result";
23
23
  import { type TruncationResult, truncateHead } from "./truncate";
24
24
 
@@ -224,7 +224,7 @@ export const lsToolRenderer = {
224
224
  args?: LsRenderArgs,
225
225
  ): Component {
226
226
  const details = result.details;
227
- const textContent = result.content?.find((c) => c.type === "text")?.text ?? "";
227
+ const textContent = result.content?.find(c => c.type === "text")?.text ?? "";
228
228
 
229
229
  if (result.isError) {
230
230
  const header = renderStatusLine({ icon: "error", title: "Ls", description: args?.path || "." }, uiTheme);
@@ -243,7 +243,7 @@ export const lsToolRenderer = {
243
243
  let rawEntries: string[] | undefined = details?.rawEntries;
244
244
  if (entries.length === 0) {
245
245
  const rawLines = textContent.split("\n").filter((l: string) => l.trim());
246
- entries = rawLines.filter((line) => !/^\[.*\]$/.test(line.trim()));
246
+ entries = rawLines.filter(line => !/^\[.*\]$/.test(line.trim()));
247
247
  rawEntries = undefined; // Can't reliably extract raw paths from text
248
248
  }
249
249
 
@@ -1,13 +1,13 @@
1
1
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
2
2
  import { StringEnum } from "@oh-my-pi/pi-ai";
3
- import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
4
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
5
- import type { ToolSession } from "@oh-my-pi/pi-coding-agent/sdk";
6
- import { renderCodeCell, renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
7
3
  import type { Component } from "@oh-my-pi/pi-tui";
8
4
  import { Text } from "@oh-my-pi/pi-tui";
9
5
  import { untilAborted } from "@oh-my-pi/pi-utils";
10
6
  import { type Static, Type } from "@sinclair/typebox";
7
+ import type { RenderResultOptions } from "../extensibility/custom-tools/types";
8
+ import type { Theme } from "../modes/theme/theme";
9
+ import type { ToolSession } from "../sdk";
10
+ import { renderCodeCell, renderStatusLine } from "../tui";
11
11
  import { resolveToCwd } from "./path-utils";
12
12
  import { formatCount, formatErrorMessage, PREVIEW_LIMITS } from "./render-utils";
13
13
 
@@ -249,7 +249,7 @@ export const notebookToolRenderer = {
249
249
  if (lineCount > 0) summaryParts.push(formatCount("line", lineCount));
250
250
  if (totalCells !== undefined) summaryParts.push(`${totalCells} total`);
251
251
 
252
- const outputLines = summaryParts.map((part) => uiTheme.fg("dim", part));
252
+ const outputLines = summaryParts.map(part => uiTheme.fg("dim", part));
253
253
  const codeText = cellSource.join("");
254
254
  const language = cellType === "markdown" ? "markdown" : undefined;
255
255
 
@@ -4,13 +4,12 @@
4
4
  * Tools populate details.meta using the fluent OutputMetaBuilder.
5
5
  * The tool wrapper automatically formats and appends notices at message boundary.
6
6
  */
7
-
8
7
  import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
9
8
  import type { ImageContent, TextContent } from "@oh-my-pi/pi-ai";
10
- import type { OutputSummary } from "@oh-my-pi/pi-coding-agent/session/streaming-output";
11
- import type { TruncationResult } from "@oh-my-pi/pi-coding-agent/tools/truncate";
12
- import { formatSize } from "@oh-my-pi/pi-coding-agent/tools/truncate";
9
+ import type { OutputSummary } from "../session/streaming-output";
13
10
  import { renderError } from "./tool-errors";
11
+ import type { TruncationResult } from "./truncate";
12
+ import { formatSize } from "./truncate";
14
13
 
15
14
  /**
16
15
  * Truncation metadata for the output notice.
@@ -1,4 +1,4 @@
1
- import { ArtifactManager } from "@oh-my-pi/pi-coding-agent/session/artifacts";
1
+ import { ArtifactManager } from "../session/artifacts";
2
2
  import type { ToolSession } from ".";
3
3
 
4
4
  export interface TailBuffer {
@@ -1,6 +1,6 @@
1
- import { accessSync, constants } from "node:fs";
1
+ import * as fs from "node:fs";
2
2
  import * as os from "node:os";
3
- import { isAbsolute, resolve as resolvePath } from "node:path";
3
+ import * as path from "node:path";
4
4
 
5
5
  const UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;
6
6
  const NARROW_NO_BREAK_SPACE = "\u202F";
@@ -15,7 +15,7 @@ function tryMacOSScreenshotPath(filePath: string): string {
15
15
 
16
16
  function fileExists(filePath: string): boolean {
17
17
  try {
18
- accessSync(filePath, constants.F_OK);
18
+ fs.accessSync(filePath, fs.constants.F_OK);
19
19
  return true;
20
20
  } catch {
21
21
  return false;
@@ -39,10 +39,10 @@ export function expandPath(filePath: string): string {
39
39
  */
40
40
  export function resolveToCwd(filePath: string, cwd: string): string {
41
41
  const expanded = expandPath(filePath);
42
- if (isAbsolute(expanded)) {
42
+ if (path.isAbsolute(expanded)) {
43
43
  return expanded;
44
44
  }
45
- return resolvePath(cwd, expanded);
45
+ return path.resolve(cwd, expanded);
46
46
  }
47
47
 
48
48
  export function resolveReadPath(filePath: string, cwd: string): string {
@@ -1,24 +1,24 @@
1
- import { relative, resolve, sep } from "node:path";
1
+ import * as path from "node:path";
2
2
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
3
3
  import type { ImageContent } from "@oh-my-pi/pi-ai";
4
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
5
- import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
6
- import { executePython, getPreludeDocs, type PythonExecutorOptions } from "@oh-my-pi/pi-coding-agent/ipy/executor";
7
- import type { PreludeHelper, PythonStatusEvent } from "@oh-my-pi/pi-coding-agent/ipy/kernel";
8
- import { truncateToVisualLines } from "@oh-my-pi/pi-coding-agent/modes/components/visual-truncate";
9
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
10
- import pythonDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/python.md" with { type: "text" };
11
- import { OutputSink, type OutputSummary } from "@oh-my-pi/pi-coding-agent/session/streaming-output";
12
- import type { OutputMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
13
- import { ToolAbortError, ToolError } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
14
- import { getTreeBranch, getTreeContinuePrefix, renderCodeCell } from "@oh-my-pi/pi-coding-agent/tui";
15
4
  import type { Component } from "@oh-my-pi/pi-tui";
16
5
  import { Text, truncateToWidth } from "@oh-my-pi/pi-tui";
17
6
  import { type Static, Type } from "@sinclair/typebox";
7
+ import { renderPromptTemplate } from "../config/prompt-templates";
8
+ import type { RenderResultOptions } from "../extensibility/custom-tools/types";
9
+ import { executePython, getPreludeDocs, type PythonExecutorOptions } from "../ipy/executor";
10
+ import type { PreludeHelper, PythonStatusEvent } from "../ipy/kernel";
11
+ import { truncateToVisualLines } from "../modes/components/visual-truncate";
12
+ import type { Theme } from "../modes/theme/theme";
13
+ import pythonDescription from "../prompts/tools/python.md" with { type: "text" };
14
+ import { OutputSink, type OutputSummary } from "../session/streaming-output";
15
+ import { getTreeBranch, getTreeContinuePrefix, renderCodeCell } from "../tui";
18
16
  import type { ToolSession } from ".";
17
+ import type { OutputMeta } from "./output-meta";
19
18
  import { allocateOutputArtifact, createTailBuffer } from "./output-utils";
20
19
  import { resolveToCwd } from "./path-utils";
21
20
  import { shortenPath, ToolUIKit, truncate } from "./render-utils";
21
+ import { ToolAbortError, ToolError } from "./tool-errors";
22
22
  import { toolResult } from "./tool-result";
23
23
  import { DEFAULT_MAX_BYTES } from "./truncate";
24
24
 
@@ -177,9 +177,8 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
177
177
  // Clamp to reasonable range: 1s - 600s (10 min)
178
178
  timeoutSec = Math.max(1, Math.min(600, timeoutSec));
179
179
  const timeoutMs = timeoutSec * 1000;
180
- const controller = new AbortController();
181
- const onAbort = () => controller.abort();
182
- signal?.addEventListener("abort", onAbort, { once: true });
180
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
181
+ const combinedSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
183
182
  let outputSink: OutputSink | undefined;
184
183
  let outputSummary: OutputSummary | undefined;
185
184
  let outputDumped = false;
@@ -226,7 +225,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
226
225
 
227
226
  const buildUpdateDetails = (): PythonToolDetails => {
228
227
  const details: PythonToolDetails = {
229
- cells: cellResults.map((cell) => ({
228
+ cells: cellResults.map(cell => ({
230
229
  ...cell,
231
230
  statusEvents: cell.statusEvents ? [...cell.statusEvents] : undefined,
232
231
  })),
@@ -258,7 +257,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
258
257
  outputSink = new OutputSink({
259
258
  artifactPath,
260
259
  artifactId,
261
- onChunk: (chunk) => {
260
+ onChunk: chunk => {
262
261
  appendTail(chunk);
263
262
  pushUpdate();
264
263
  },
@@ -267,7 +266,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
267
266
  const baseExecutorOptions: Omit<PythonExecutorOptions, "reset"> = {
268
267
  cwd: commandCwd,
269
268
  timeoutMs,
270
- signal: controller.signal,
269
+ signal: combinedSignal,
271
270
  sessionId,
272
271
  kernelMode: this.session.settings?.getPythonKernelMode?.() ?? "session",
273
272
  useSharedGateway: this.session.settings?.getPythonSharedGateway?.() ?? true,
@@ -289,7 +288,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
289
288
  const executorOptions: PythonExecutorOptions = {
290
289
  ...baseExecutorOptions,
291
290
  reset: isFirstCell ? reset : false,
292
- onChunk: async (chunk) => {
291
+ onChunk: async chunk => {
293
292
  await outputSink!.push(chunk);
294
293
  },
295
294
  };
@@ -398,7 +397,6 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
398
397
 
399
398
  return resultBuilder.done();
400
399
  } finally {
401
- signal?.removeEventListener("abort", onAbort);
402
400
  if (!outputDumped) {
403
401
  try {
404
402
  await finalizeOutput();
@@ -640,14 +638,14 @@ function formatStatusEventExpanded(event: PythonStatusEvent, theme: Theme): stri
640
638
  switch (op) {
641
639
  case "find":
642
640
  case "glob":
643
- if (data.matches) addItems(data.matches as unknown[], (m) => String(m));
641
+ if (data.matches) addItems(data.matches as unknown[], m => String(m));
644
642
  break;
645
643
  case "ls":
646
- if (data.items) addItems(data.items as unknown[], (m) => String(m));
644
+ if (data.items) addItems(data.items as unknown[], m => String(m));
647
645
  break;
648
646
  case "grep":
649
647
  if (data.hits) {
650
- addItems(data.hits as unknown[], (h) => {
648
+ addItems(data.hits as unknown[], h => {
651
649
  const hit = h as { line: number; text: string };
652
650
  return `${hit.line}: ${truncate(hit.text, 60, theme.format.ellipsis)}`;
653
651
  });
@@ -655,7 +653,7 @@ function formatStatusEventExpanded(event: PythonStatusEvent, theme: Theme): stri
655
653
  break;
656
654
  case "rgrep":
657
655
  if (data.hits) {
658
- addItems(data.hits as unknown[], (h) => {
656
+ addItems(data.hits as unknown[], h => {
659
657
  const hit = h as { file: string; line: number; text: string };
660
658
  return `${shortenPath(hit.file)}:${hit.line}: ${truncate(hit.text, 50, theme.format.ellipsis)}`;
661
659
  });
@@ -663,28 +661,28 @@ function formatStatusEventExpanded(event: PythonStatusEvent, theme: Theme): stri
663
661
  break;
664
662
  case "rsed":
665
663
  if (data.changed) {
666
- addItems(data.changed as unknown[], (c) => {
664
+ addItems(data.changed as unknown[], c => {
667
665
  const change = c as { file: string; count: number };
668
666
  return `${shortenPath(change.file)}: ${change.count} replacement${change.count !== 1 ? "s" : ""}`;
669
667
  });
670
668
  }
671
669
  break;
672
670
  case "env":
673
- if (data.keys) addItems(data.keys as unknown[], (k) => String(k), 10);
671
+ if (data.keys) addItems(data.keys as unknown[], k => String(k), 10);
674
672
  break;
675
673
  case "git_log":
676
674
  if (data.entries) {
677
- addItems(data.entries as unknown[], (e) => {
675
+ addItems(data.entries as unknown[], e => {
678
676
  const entry = e as { sha: string; subject: string };
679
677
  return `${entry.sha} ${truncate(entry.subject, 50, theme.format.ellipsis)}`;
680
678
  });
681
679
  }
682
680
  break;
683
681
  case "git_status":
684
- if (data.files) addItems(data.files as unknown[], (f) => String(f));
682
+ if (data.files) addItems(data.files as unknown[], f => String(f));
685
683
  break;
686
684
  case "git_branch":
687
- if (data.branches) addItems(data.branches as unknown[], (b) => String(b));
685
+ if (data.branches) addItems(data.branches as unknown[], b => String(b));
688
686
  break;
689
687
  case "read":
690
688
  case "cat":
@@ -750,7 +748,7 @@ function formatCellOutputLines(
750
748
  const rawLines = cell.output ? cell.output.split("\n") : [];
751
749
  const displayLines = expanded ? rawLines : rawLines.slice(-previewLines);
752
750
  const hiddenCount = rawLines.length - displayLines.length;
753
- const outputLines = displayLines.map((line) => theme.fg("toolOutput", line));
751
+ const outputLines = displayLines.map(line => theme.fg("toolOutput", line));
754
752
 
755
753
  if (outputLines.length === 0) {
756
754
  return { lines: [], hiddenCount: 0 };
@@ -767,13 +765,14 @@ export const pythonToolRenderer = {
767
765
  let displayWorkdir = args.cwd;
768
766
 
769
767
  if (displayWorkdir) {
770
- const resolvedCwd = resolve(cwd);
771
- const resolvedWorkdir = resolve(displayWorkdir);
768
+ const resolvedCwd = path.resolve(cwd);
769
+ const resolvedWorkdir = path.resolve(displayWorkdir);
772
770
  if (resolvedWorkdir === resolvedCwd) {
773
771
  displayWorkdir = undefined;
774
772
  } else {
775
- const relativePath = relative(resolvedCwd, resolvedWorkdir);
776
- const isWithinCwd = relativePath && !relativePath.startsWith("..") && !relativePath.startsWith(`..${sep}`);
773
+ const relativePath = path.relative(resolvedCwd, resolvedWorkdir);
774
+ const isWithinCwd =
775
+ relativePath && !relativePath.startsWith("..") && !relativePath.startsWith(`..${path.sep}`);
777
776
  if (isWithinCwd) {
778
777
  displayWorkdir = relativePath;
779
778
  }
@@ -832,7 +831,7 @@ export const pythonToolRenderer = {
832
831
 
833
832
  const expanded = renderContext?.expanded ?? options.expanded;
834
833
  const previewLines = renderContext?.previewLines ?? PYTHON_DEFAULT_PREVIEW_LINES;
835
- const output = renderContext?.output ?? (result.content?.find((c) => c.type === "text")?.text ?? "").trimEnd();
834
+ const output = renderContext?.output ?? (result.content?.find(c => c.type === "text")?.text ?? "").trimEnd();
836
835
 
837
836
  const jsonOutputs = details?.jsonOutputs ?? [];
838
837
  const jsonLines = jsonOutputs.flatMap((value, index) => {
@@ -951,7 +950,7 @@ export const pythonToolRenderer = {
951
950
  if (expanded) {
952
951
  const styledOutput = combinedOutput
953
952
  .split("\n")
954
- .map((line) => uiTheme.fg("toolOutput", line))
953
+ .map(line => uiTheme.fg("toolOutput", line))
955
954
  .join("\n");
956
955
  const lines = [
957
956
  styledOutput,
@@ -964,7 +963,7 @@ export const pythonToolRenderer = {
964
963
 
965
964
  const styledOutput = combinedOutput
966
965
  .split("\n")
967
- .map((line) => uiTheme.fg("toolOutput", line))
966
+ .map(line => uiTheme.fg("toolOutput", line))
968
967
  .join("\n");
969
968
  const textContent = `\n${styledOutput}`;
970
969
 
package/src/tools/read.ts CHANGED
@@ -1,28 +1,28 @@
1
- import { homedir } from "node:os";
1
+ import * as os from "node:os";
2
2
  import path from "node:path";
3
3
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
4
4
  import type { ImageContent, TextContent } from "@oh-my-pi/pi-ai";
5
- import { CONFIG_DIR_NAME } from "@oh-my-pi/pi-coding-agent/config";
6
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
7
- import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
8
- import { getLanguageFromPath, type Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
9
- import readDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/read.md" with { type: "text" };
10
- import type { ToolSession } from "@oh-my-pi/pi-coding-agent/sdk";
11
- import type { OutputMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
12
- import { ToolAbortError, ToolError, throwIfAborted } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
13
- import { renderCodeCell, renderOutputBlock, renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
14
- import { formatDimensionNote, resizeImage } from "@oh-my-pi/pi-coding-agent/utils/image-resize";
15
- import { detectSupportedImageMimeTypeFromFile } from "@oh-my-pi/pi-coding-agent/utils/mime";
16
- import { ensureTool } from "@oh-my-pi/pi-coding-agent/utils/tools-manager";
17
5
  import type { Component } from "@oh-my-pi/pi-tui";
18
6
  import { Text } from "@oh-my-pi/pi-tui";
19
7
  import { ptree } from "@oh-my-pi/pi-utils";
20
8
  import { Type } from "@sinclair/typebox";
9
+ import { CONFIG_DIR_NAME } from "../config";
10
+ import { renderPromptTemplate } from "../config/prompt-templates";
11
+ import type { RenderResultOptions } from "../extensibility/custom-tools/types";
12
+ import { getLanguageFromPath, type Theme } from "../modes/theme/theme";
13
+ import readDescription from "../prompts/tools/read.md" with { type: "text" };
14
+ import type { ToolSession } from "../sdk";
15
+ import { renderCodeCell, renderOutputBlock, renderStatusLine } from "../tui";
16
+ import { formatDimensionNote, resizeImage } from "../utils/image-resize";
17
+ import { detectSupportedImageMimeTypeFromFile } from "../utils/mime";
18
+ import { ensureTool } from "../utils/tools-manager";
21
19
  import { runFd } from "./find";
22
20
  import { applyListLimit } from "./list-limit";
23
21
  import { LsTool } from "./ls";
22
+ import type { OutputMeta } from "./output-meta";
24
23
  import { resolveReadPath, resolveToCwd } from "./path-utils";
25
24
  import { shortenPath, wrapBrackets } from "./render-utils";
25
+ import { ToolAbortError, ToolError, throwIfAborted } from "./tool-errors";
26
26
  import { toolResult } from "./tool-result";
27
27
  import {
28
28
  DEFAULT_MAX_BYTES,
@@ -37,7 +37,7 @@ import {
37
37
  const CONVERTIBLE_EXTENSIONS = new Set([".pdf", ".doc", ".docx", ".ppt", ".pptx", ".xls", ".xlsx", ".rtf", ".epub"]);
38
38
 
39
39
  // Remote mount path prefix (sshfs mounts) - skip fuzzy matching to avoid hangs
40
- const REMOTE_MOUNT_PREFIX = path.join(homedir(), CONFIG_DIR_NAME, "remote") + path.sep;
40
+ const REMOTE_MOUNT_PREFIX = path.join(os.homedir(), CONFIG_DIR_NAME, "remote") + path.sep;
41
41
 
42
42
  function isRemoteMountPath(absolutePath: string): boolean {
43
43
  return absolutePath.startsWith(REMOTE_MOUNT_PREFIX);
@@ -202,8 +202,8 @@ async function listCandidateFiles(
202
202
  if (output) {
203
203
  const nestedGitignores = output
204
204
  .split("\n")
205
- .map((line) => line.replace(/\r$/, "").trim())
206
- .filter((line) => line.length > 0);
205
+ .map(line => line.replace(/\r$/, "").trim())
206
+ .filter(line => line.length > 0);
207
207
  for (const file of nestedGitignores) {
208
208
  const normalized = file.replace(/\\/g, "/");
209
209
  if (normalized.includes("/node_modules/") || normalized.includes("/.git/")) {
@@ -238,8 +238,8 @@ async function listCandidateFiles(
238
238
 
239
239
  const files = output
240
240
  .split("\n")
241
- .map((line) => line.replace(/\r$/, "").trim())
242
- .filter((line) => line.length > 0);
241
+ .map(line => line.replace(/\r$/, "").trim())
242
+ .filter(line => line.length > 0);
243
243
 
244
244
  return { files, truncated: files.length >= MAX_FUZZY_CANDIDATES };
245
245
  }
@@ -337,7 +337,7 @@ async function findReadPathSuggestions(
337
337
  });
338
338
 
339
339
  const listLimit = applyListLimit(matches, { limit: MAX_FUZZY_RESULTS });
340
- const suggestions = listLimit.items.map((match) => match.path);
340
+ const suggestions = listLimit.items.map(match => match.path);
341
341
 
342
342
  return { suggestions, scopeLabel, truncated };
343
343
  }
@@ -446,7 +446,7 @@ export class ReadTool implements AgentTool<typeof readSchema, ReadToolDetails> {
446
446
 
447
447
  if (suggestions?.suggestions.length) {
448
448
  const scopeLabel = suggestions.scopeLabel ? ` in ${suggestions.scopeLabel}` : "";
449
- message += `\n\nClosest matches${scopeLabel}:\n${suggestions.suggestions.map((match) => `- ${match}`).join("\n")}`;
449
+ message += `\n\nClosest matches${scopeLabel}:\n${suggestions.suggestions.map(match => `- ${match}`).join("\n")}`;
450
450
  if (suggestions.truncated) {
451
451
  message += `\n[Search truncated to first ${MAX_FUZZY_CANDIDATES} paths. Refine the path if the match isn't listed.]`;
452
452
  }
@@ -856,8 +856,8 @@ export const readToolRenderer = {
856
856
  args?: ReadRenderArgs,
857
857
  ): Component {
858
858
  const details = result.details;
859
- const contentText = result.content?.find((c) => c.type === "text")?.text ?? "";
860
- const imageContent = result.content?.find((c) => c.type === "image");
859
+ const contentText = result.content?.find(c => c.type === "text")?.text ?? "";
860
+ const imageContent = result.content?.find(c => c.type === "image");
861
861
  const rawPath = args?.file_path || args?.path || "";
862
862
  const filePath = shortenPath(rawPath);
863
863
  const lang = getLanguageFromPath(rawPath);
@@ -892,7 +892,7 @@ export const readToolRenderer = {
892
892
  { icon: "success", title: "Read", description: filePath || rawPath || "image" },
893
893
  uiTheme,
894
894
  );
895
- const detailLines = contentText ? contentText.split("\n").map((line) => uiTheme.fg("toolOutput", line)) : [];
895
+ const detailLines = contentText ? contentText.split("\n").map(line => uiTheme.fg("toolOutput", line)) : [];
896
896
  const lines = [...detailLines, ...warningLines];
897
897
  return {
898
898
  render: (width: number) =>
@@ -4,10 +4,9 @@
4
4
  * Provides consistent formatting, truncation, and display patterns across all
5
5
  * tool renderers to ensure a unified TUI experience.
6
6
  */
7
-
8
- import { homedir } from "node:os";
9
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
10
- import { getTreeBranch } from "@oh-my-pi/pi-coding-agent/tui/utils";
7
+ import * as os from "node:os";
8
+ import type { Theme } from "../modes/theme/theme";
9
+ import { getTreeBranch } from "../tui/utils";
11
10
 
12
11
  // =============================================================================
13
12
  // Standardized Display Constants
@@ -62,8 +61,8 @@ export function truncate(text: string, maxLen: number, ellipsis: string): string
62
61
  * Get first N lines of text as preview, with each line truncated.
63
62
  */
64
63
  export function getPreviewLines(text: string, maxLines: number, maxLineLen: number, ellipsis: string): string[] {
65
- const lines = text.split("\n").filter((l) => l.trim());
66
- return lines.slice(0, maxLines).map((l) => truncate(l.trim(), maxLineLen, ellipsis));
64
+ const lines = text.split("\n").filter(l => l.trim());
65
+ return lines.slice(0, maxLines).map(l => truncate(l.trim(), maxLineLen, ellipsis));
67
66
  }
68
67
 
69
68
  // =============================================================================
@@ -554,7 +553,7 @@ export function truncateDiffByHunk(
554
553
 
555
554
  const segments = parseDiffSegments(lines);
556
555
 
557
- const changeSegments = segments.filter((s) => s.isChange);
556
+ const changeSegments = segments.filter(s => s.isChange);
558
557
  const changeLineCount = changeSegments.reduce((sum, s) => sum + s.lines.length, 0);
559
558
 
560
559
  if (changeLineCount > maxLines) {
@@ -579,7 +578,7 @@ export function truncateDiffByHunk(
579
578
  }
580
579
 
581
580
  const contextBudget = maxLines - changeLineCount;
582
- const contextSegments = segments.filter((s) => !s.isChange && !s.isEllipsis);
581
+ const contextSegments = segments.filter(s => !s.isChange && !s.isEllipsis);
583
582
  const totalContextLines = contextSegments.reduce((sum, s) => sum + s.lines.length, 0);
584
583
 
585
584
  const kept: string[] = [];
@@ -643,7 +642,7 @@ export function truncateDiffByHunk(
643
642
  // =============================================================================
644
643
 
645
644
  export function shortenPath(filePath: string, homeDir?: string): string {
646
- const home = homeDir ?? homedir();
645
+ const home = homeDir ?? os.homedir();
647
646
  if (home && filePath.startsWith(home)) {
648
647
  return `~${filePath.slice(home.length)}`;
649
648
  }
@@ -3,14 +3,13 @@
3
3
  *
4
4
  * These provide rich visualization for tool calls and results in the TUI.
5
5
  */
6
-
7
- import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
8
- import { lspToolRenderer } from "@oh-my-pi/pi-coding-agent/lsp/render";
9
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
10
- import { editToolRenderer } from "@oh-my-pi/pi-coding-agent/patch";
11
- import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/render";
12
- import { webSearchToolRenderer } from "@oh-my-pi/pi-coding-agent/web/search/render";
13
6
  import type { Component } from "@oh-my-pi/pi-tui";
7
+ import type { RenderResultOptions } from "../extensibility/custom-tools/types";
8
+ import { lspToolRenderer } from "../lsp/render";
9
+ import type { Theme } from "../modes/theme/theme";
10
+ import { editToolRenderer } from "../patch";
11
+ import { taskToolRenderer } from "../task/render";
12
+ import { webSearchToolRenderer } from "../web/search/render";
14
13
  import { askToolRenderer } from "./ask";
15
14
  import { bashToolRenderer } from "./bash";
16
15
  import { calculatorToolRenderer } from "./calculator";
@@ -5,12 +5,17 @@
5
5
  * Hidden by default - only enabled when explicitly listed in agent's tools.
6
6
  * Reviewers finish via `complete` tool with SubmitReviewDetails schema.
7
7
  */
8
-
8
+ // ─────────────────────────────────────────────────────────────────────────────
9
+ // Subprocess tool handlers - registered for extraction/rendering in task tool
10
+ // ─────────────────────────────────────────────────────────────────────────────
11
+ import path from "node:path";
9
12
  import type { AgentTool } from "@oh-my-pi/pi-agent-core";
10
- import type { Theme, ThemeColor } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
13
+ import { StringEnum } from "@oh-my-pi/pi-ai";
11
14
  import type { Component } from "@oh-my-pi/pi-tui";
12
15
  import { Container, Text } from "@oh-my-pi/pi-tui";
13
16
  import { Type } from "@sinclair/typebox";
17
+ import type { Theme, ThemeColor } from "../modes/theme/theme";
18
+ import { subprocessToolRegistry } from "../task/subprocess-tool-registry";
14
19
 
15
20
  export type FindingPriority = "P0" | "P1" | "P2" | "P3";
16
21
 
@@ -145,17 +150,9 @@ export interface SubmitReviewDetails {
145
150
  // Re-export types for external use
146
151
  export type { ReportFindingDetails };
147
152
 
148
- // ─────────────────────────────────────────────────────────────────────────────
149
- // Subprocess tool handlers - registered for extraction/rendering in task tool
150
- // ─────────────────────────────────────────────────────────────────────────────
151
-
152
- import path from "node:path";
153
- import { StringEnum } from "@oh-my-pi/pi-ai";
154
- import { subprocessToolRegistry } from "@oh-my-pi/pi-coding-agent/task/subprocess-tool-registry";
155
-
156
153
  // Register report_finding handler
157
154
  subprocessToolRegistry.register<ReportFindingDetails>("report_finding", {
158
- extractData: (event) => event.result?.details as ReportFindingDetails | undefined,
155
+ extractData: event => event.result?.details as ReportFindingDetails | undefined,
159
156
 
160
157
  renderInline: (data, theme) => {
161
158
  const { label, icon, color } = getPriorityDisplay(data.priority, theme);