@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
@@ -12,29 +12,23 @@
12
12
  * 4. Worker sends { type: "done", exitCode, ... } on completion
13
13
  * 5. Parent can send { type: "abort" } to request cancellation
14
14
  */
15
-
16
15
  import type { AgentEvent, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
17
16
  import type { Api, Model } from "@oh-my-pi/pi-ai";
18
- import { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
19
- import { parseModelPattern, parseModelString } from "@oh-my-pi/pi-coding-agent/config/model-resolver";
20
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
21
- import { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
22
- import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
23
- import { type LspToolDetails, lspSchema } from "@oh-my-pi/pi-coding-agent/lsp/types";
24
- import lspDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/lsp.md" with { type: "text" };
25
- import { createAgentSession, discoverAuthStorage, discoverModels } from "@oh-my-pi/pi-coding-agent/sdk";
26
- import type { AgentSessionEvent } from "@oh-my-pi/pi-coding-agent/session/agent-session";
27
- import { AuthStorage } from "@oh-my-pi/pi-coding-agent/session/auth-storage";
28
- import { SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
29
- import {
30
- getPythonToolDescription,
31
- type PythonToolDetails,
32
- type PythonToolParams,
33
- pythonSchema,
34
- } from "@oh-my-pi/pi-coding-agent/tools/python";
35
- import { ToolAbortError } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
36
17
  import { logger, postmortem, untilAborted } from "@oh-my-pi/pi-utils";
37
18
  import type { TSchema } from "@sinclair/typebox";
19
+ import { ModelRegistry } from "../config/model-registry";
20
+ import { parseModelPattern, parseModelString } from "../config/model-resolver";
21
+ import { renderPromptTemplate } from "../config/prompt-templates";
22
+ import { SettingsManager } from "../config/settings-manager";
23
+ import type { CustomTool } from "../extensibility/custom-tools/types";
24
+ import { type LspToolDetails, lspSchema } from "../lsp/types";
25
+ import lspDescription from "../prompts/tools/lsp.md" with { type: "text" };
26
+ import { createAgentSession, discoverAuthStorage, discoverModels } from "../sdk";
27
+ import type { AgentSessionEvent } from "../session/agent-session";
28
+ import { AuthStorage } from "../session/auth-storage";
29
+ import { SessionManager } from "../session/session-manager";
30
+ import { getPythonToolDescription, type PythonToolDetails, type PythonToolParams, pythonSchema } from "../tools/python";
31
+ import { ToolAbortError } from "../tools/tool-errors";
38
32
  import type {
39
33
  LspToolCallResponse,
40
34
  MCPToolCallResponse,
@@ -47,7 +41,7 @@ import type {
47
41
 
48
42
  type PostMessageFn = (message: SubagentWorkerResponse) => void;
49
43
 
50
- const postMessageSafe: PostMessageFn = (message) => {
44
+ const postMessageSafe: PostMessageFn = message => {
51
45
  try {
52
46
  (globalThis as typeof globalThis & { postMessage: PostMessageFn }).postMessage(message);
53
47
  } catch {
@@ -132,11 +126,11 @@ function callMCPToolViaParent(
132
126
  }
133
127
 
134
128
  pendingMCPCalls.set(callId, {
135
- resolve: (result) => {
129
+ resolve: result => {
136
130
  cleanup();
137
131
  resolve(result ?? { content: [] });
138
132
  },
139
- reject: (error) => {
133
+ reject: error => {
140
134
  cleanup();
141
135
  reject(error);
142
136
  },
@@ -200,11 +194,11 @@ function callPythonToolViaParent(
200
194
  }
201
195
 
202
196
  pendingPythonCalls.set(callId, {
203
- resolve: (result) => {
197
+ resolve: result => {
204
198
  cleanup();
205
199
  resolve(result ?? { content: [] });
206
200
  },
207
- reject: (error) => {
201
+ reject: error => {
208
202
  cleanup();
209
203
  reject(error);
210
204
  },
@@ -260,11 +254,11 @@ function callLspToolViaParent(
260
254
  }
261
255
 
262
256
  pendingLspCalls.set(callId, {
263
- resolve: (result) => {
257
+ resolve: result => {
264
258
  cleanup();
265
259
  resolve(result ?? { content: [] });
266
260
  },
267
- reject: (error) => {
261
+ reject: error => {
268
262
  cleanup();
269
263
  reject(error);
270
264
  },
@@ -349,7 +343,7 @@ function createMCPProxyTool(metadata: MCPToolMetadata): CustomTool<TSchema> {
349
343
  metadata.timeoutMs,
350
344
  );
351
345
  return {
352
- content: result.content.map((c) =>
346
+ content: result.content.map(c =>
353
347
  c.type === "text"
354
348
  ? { type: "text" as const, text: c.text ?? "" }
355
349
  : { type: "text" as const, text: JSON.stringify(c) },
@@ -391,7 +385,7 @@ function createPythonProxyTool(): CustomTool<typeof pythonSchema> {
391
385
  const result = await callPythonToolViaParent(params as PythonToolParams, signal, timeoutMs);
392
386
  return {
393
387
  content:
394
- result?.content?.map((c) =>
388
+ result?.content?.map(c =>
395
389
  c.type === "text"
396
390
  ? { type: "text" as const, text: c.text ?? "" }
397
391
  : { type: "text" as const, text: JSON.stringify(c) },
@@ -424,7 +418,7 @@ function createLspProxyTool(): CustomTool<typeof lspSchema> {
424
418
  const result = await callLspToolViaParent(params as Record<string, unknown>, signal);
425
419
  return {
426
420
  content:
427
- result?.content?.map((c) =>
421
+ result?.content?.map(c =>
428
422
  c.type === "text"
429
423
  ? { type: "text" as const, text: c.text ?? "" }
430
424
  : { type: "text" as const, text: JSON.stringify(c) },
@@ -606,7 +600,7 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
606
600
  outputSchema: payload.outputSchema,
607
601
  requireCompleteTool: true,
608
602
  // Append system prompt (equivalent to CLI's --append-system-prompt)
609
- systemPrompt: (defaultPrompt) =>
603
+ systemPrompt: defaultPrompt =>
610
604
  `${defaultPrompt}\n\n${payload.systemPrompt}\n\n${worktreeNotice}\n\n${completionInstruction}`,
611
605
  sessionManager,
612
606
  hasUI: false,
@@ -638,14 +632,14 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
638
632
  // ExtensionActions
639
633
  {
640
634
  sendMessage: (message, options) => {
641
- session.sendCustomMessage(message, options).catch((e) => {
635
+ session.sendCustomMessage(message, options).catch(e => {
642
636
  logger.error("Extension sendMessage failed", {
643
637
  error: e instanceof Error ? e.message : String(e),
644
638
  });
645
639
  });
646
640
  },
647
641
  sendUserMessage: (content, options) => {
648
- session.sendUserMessage(content, options).catch((e) => {
642
+ session.sendUserMessage(content, options).catch(e => {
649
643
  logger.error("Extension sendUserMessage failed", {
650
644
  error: e instanceof Error ? e.message : String(e),
651
645
  });
@@ -660,14 +654,14 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
660
654
  getActiveTools: () => session.getActiveToolNames(),
661
655
  getAllTools: () => session.getAllToolNames(),
662
656
  setActiveTools: (toolNames: string[]) => session.setActiveToolsByName(toolNames),
663
- setModel: async (model) => {
657
+ setModel: async model => {
664
658
  const key = await session.modelRegistry.getApiKey(model);
665
659
  if (!key) return false;
666
660
  await session.setModel(model);
667
661
  return true;
668
662
  },
669
663
  getThinkingLevel: () => session.thinkingLevel,
670
- setThinkingLevel: (level) => session.setThinkingLevel(level),
664
+ setThinkingLevel: level => session.setThinkingLevel(level),
671
665
  },
672
666
  // ExtensionContextActions
673
667
  {
@@ -677,7 +671,7 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
677
671
  hasPendingMessages: () => session.queuedMessageCount > 0,
678
672
  shutdown: () => {},
679
673
  getContextUsage: () => session.getContextUsage(),
680
- compact: async (instructionsOrOptions) => {
674
+ compact: async instructionsOrOptions => {
681
675
  const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
682
676
  const options =
683
677
  instructionsOrOptions && typeof instructionsOrOptions === "object"
@@ -687,7 +681,7 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
687
681
  },
688
682
  },
689
683
  );
690
- extensionRunner.onError((err) => {
684
+ extensionRunner.onError(err => {
691
685
  logger.error("Extension error", { path: err.extensionPath, error: err.error });
692
686
  });
693
687
  await extensionRunner.emit({ type: "session_start" });
@@ -844,11 +838,11 @@ declare const self: {
844
838
  addEventListener(type: "messageerror", listener: (event: MessageEvent) => void): void;
845
839
  };
846
840
 
847
- self.addEventListener("error", (event) => {
841
+ self.addEventListener("error", event => {
848
842
  reportFatal(`Uncaught error: ${event.message || "Unknown error"}`);
849
843
  });
850
844
 
851
- self.addEventListener("unhandledrejection", (event) => {
845
+ self.addEventListener("unhandledrejection", event => {
852
846
  const reason = event.reason;
853
847
  const message = reason instanceof Error ? reason.stack || reason.message : String(reason);
854
848
 
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { cp, mkdir, rm } from "node:fs/promises";
3
- import { homedir, tmpdir } from "node:os";
2
+ import * as fs from "node:fs/promises";
3
+ import * as os from "node:os";
4
4
  import path from "node:path";
5
5
  import { $ } from "bun";
6
6
 
@@ -30,10 +30,10 @@ export async function getRepoRoot(cwd: string): Promise<string> {
30
30
  export async function ensureWorktree(baseCwd: string, id: string): Promise<string> {
31
31
  const repoRoot = await getRepoRoot(baseCwd);
32
32
  const encodedProject = getEncodedProjectName(repoRoot);
33
- const worktreeDir = path.join(homedir(), ".omp", "wt", encodedProject, id);
34
- await mkdir(path.dirname(worktreeDir), { recursive: true });
33
+ const worktreeDir = path.join(os.homedir(), ".omp", "wt", encodedProject, id);
34
+ await fs.mkdir(path.dirname(worktreeDir), { recursive: true });
35
35
  await $`git worktree remove -f ${worktreeDir}`.cwd(repoRoot).quiet().nothrow();
36
- await rm(worktreeDir, { recursive: true, force: true });
36
+ await fs.rm(worktreeDir, { recursive: true, force: true });
37
37
  await $`git worktree add --detach ${worktreeDir} HEAD`.cwd(repoRoot).quiet();
38
38
  return worktreeDir;
39
39
  }
@@ -44,8 +44,8 @@ export async function captureBaseline(repoRoot: string): Promise<WorktreeBaselin
44
44
  const untrackedRaw = await $`git ls-files --others --exclude-standard`.cwd(repoRoot).quiet().text();
45
45
  const untracked = untrackedRaw
46
46
  .split("\n")
47
- .map((line) => line.trim())
48
- .filter((line) => line.length > 0);
47
+ .map(line => line.trim())
48
+ .filter(line => line.length > 0);
49
49
 
50
50
  return {
51
51
  repoRoot,
@@ -56,7 +56,7 @@ export async function captureBaseline(repoRoot: string): Promise<WorktreeBaselin
56
56
  }
57
57
 
58
58
  async function writeTempPatchFile(patch: string): Promise<string> {
59
- const tempPath = path.join(tmpdir(), `omp-task-patch-${randomUUID()}.patch`);
59
+ const tempPath = path.join(os.tmpdir(), `omp-task-patch-${randomUUID()}.patch`);
60
60
  await Bun.write(tempPath, patch);
61
61
  return tempPath;
62
62
  }
@@ -76,7 +76,7 @@ async function applyPatch(
76
76
  }
77
77
  await runner;
78
78
  } finally {
79
- await rm(tempPath, { force: true });
79
+ await fs.rm(tempPath, { force: true });
80
80
  }
81
81
  }
82
82
 
@@ -90,8 +90,8 @@ export async function applyBaseline(worktreeDir: string, baseline: WorktreeBasel
90
90
  const destination = path.join(worktreeDir, entry);
91
91
  const exists = await Bun.file(source).exists();
92
92
  if (!exists) continue;
93
- await mkdir(path.dirname(destination), { recursive: true });
94
- await cp(source, destination, { recursive: true });
93
+ await fs.mkdir(path.dirname(destination), { recursive: true });
94
+ await fs.cp(source, destination, { recursive: true });
95
95
  }
96
96
  }
97
97
 
@@ -106,7 +106,7 @@ async function applyPatchToIndex(cwd: string, patch: string, indexFile: string):
106
106
  })
107
107
  .quiet();
108
108
  } finally {
109
- await rm(tempPath, { force: true });
109
+ await fs.rm(tempPath, { force: true });
110
110
  }
111
111
  }
112
112
 
@@ -114,12 +114,12 @@ async function listUntracked(cwd: string): Promise<string[]> {
114
114
  const raw = await $`git ls-files --others --exclude-standard`.cwd(cwd).quiet().text();
115
115
  return raw
116
116
  .split("\n")
117
- .map((line) => line.trim())
118
- .filter((line) => line.length > 0);
117
+ .map(line => line.trim())
118
+ .filter(line => line.length > 0);
119
119
  }
120
120
 
121
121
  export async function captureDeltaPatch(worktreeDir: string, baseline: WorktreeBaseline): Promise<string> {
122
- const tempIndex = path.join(tmpdir(), `omp-task-index-${randomUUID()}`);
122
+ const tempIndex = path.join(os.tmpdir(), `omp-task-index-${randomUUID()}`);
123
123
  try {
124
124
  await $`git read-tree HEAD`.cwd(worktreeDir).env({
125
125
  GIT_INDEX_FILE: tempIndex,
@@ -136,18 +136,18 @@ export async function captureDeltaPatch(worktreeDir: string, baseline: WorktreeB
136
136
 
137
137
  const currentUntracked = await listUntracked(worktreeDir);
138
138
  const baselineUntracked = new Set(baseline.untracked);
139
- const newUntracked = currentUntracked.filter((entry) => !baselineUntracked.has(entry));
139
+ const newUntracked = currentUntracked.filter(entry => !baselineUntracked.has(entry));
140
140
 
141
141
  if (newUntracked.length === 0) return diff;
142
142
 
143
143
  const untrackedDiffs = await Promise.all(
144
- newUntracked.map((entry) =>
144
+ newUntracked.map(entry =>
145
145
  $`git diff --binary --no-index /dev/null ${entry}`.cwd(worktreeDir).quiet().nothrow().text(),
146
146
  ),
147
147
  );
148
148
  return `${diff}${diff && !diff.endsWith("\n") ? "\n" : ""}${untrackedDiffs.join("\n")}`;
149
149
  } finally {
150
- await rm(tempIndex, { force: true });
150
+ await fs.rm(tempIndex, { force: true });
151
151
  }
152
152
  }
153
153
 
@@ -161,6 +161,6 @@ export async function cleanupWorktree(dir: string): Promise<void> {
161
161
  await $`git worktree remove -f ${dir}`.cwd(repoRoot).quiet().nothrow();
162
162
  }
163
163
  } finally {
164
- await rm(dir, { recursive: true, force: true });
164
+ await fs.rm(dir, { recursive: true, force: true });
165
165
  }
166
166
  }
package/src/tools/ask.ts CHANGED
@@ -14,16 +14,15 @@
14
14
  * - If you recommend a specific option, make that the first option in the list
15
15
  * and add "(Recommended)" at the end of the label
16
16
  */
17
-
18
17
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
19
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
20
- import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
21
- import { type Theme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
22
- import askDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/ask.md" with { type: "text" };
23
- import { renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
24
18
  import type { Component } from "@oh-my-pi/pi-tui";
25
19
  import { Text } from "@oh-my-pi/pi-tui";
26
20
  import { Type } from "@sinclair/typebox";
21
+ import { renderPromptTemplate } from "../config/prompt-templates";
22
+ import type { RenderResultOptions } from "../extensibility/custom-tools/types";
23
+ import { type Theme, theme } from "../modes/theme/theme";
24
+ import askDescription from "../prompts/tools/ask.md" with { type: "text" };
25
+ import { renderStatusLine } from "../tui";
27
26
  import type { ToolSession } from ".";
28
27
  import { ToolUIKit } from "./render-utils";
29
28
 
@@ -238,7 +237,7 @@ export class AskTool implements AgentTool<typeof askSchema, AskToolDetails> {
238
237
  const results: QuestionResult[] = [];
239
238
 
240
239
  for (const q of params.questions) {
241
- const optionLabels = q.options.map((o) => o.label);
240
+ const optionLabels = q.options.map(o => o.label);
242
241
  const { selectedOptions, customInput } = await askSingleQuestion(
243
242
  ui,
244
243
  q.question,
@@ -267,7 +266,7 @@ export class AskTool implements AgentTool<typeof askSchema, AskToolDetails> {
267
266
  const question = params.question ?? "";
268
267
  const options = params.options ?? [];
269
268
  const multi = params.multi ?? false;
270
- const optionLabels = options.map((o) => o.label);
269
+ const optionLabels = options.map(o => o.label);
271
270
 
272
271
  if (!question || optionLabels.length === 0) {
273
272
  return {
@@ -391,7 +390,7 @@ export const askToolRenderer = {
391
390
  if (details.results && details.results.length > 0) {
392
391
  const lines: string[] = [];
393
392
  const hasAnySelection = details.results.some(
394
- (r) => r.customInput || (r.selectedOptions && r.selectedOptions.length > 0),
393
+ r => r.customInput || (r.selectedOptions && r.selectedOptions.length > 0),
395
394
  );
396
395
  const header = renderStatusLine(
397
396
  {
@@ -5,11 +5,7 @@
5
5
  * this interceptor provides helpful error messages directing them to use
6
6
  * the specialized tools instead.
7
7
  */
8
-
9
- import {
10
- type BashInterceptorRule,
11
- DEFAULT_BASH_INTERCEPTOR_RULES,
12
- } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
8
+ import { type BashInterceptorRule, DEFAULT_BASH_INTERCEPTOR_RULES } from "../config/settings-manager";
13
9
 
14
10
  export interface InterceptionResult {
15
11
  /** If true, the bash command should be blocked */
package/src/tools/bash.ts CHANGED
@@ -1,22 +1,22 @@
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
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
4
- import { type BashExecutorOptions, executeBash } from "@oh-my-pi/pi-coding-agent/exec/bash-executor";
5
- import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
6
- import { truncateToVisualLines } from "@oh-my-pi/pi-coding-agent/modes/components/visual-truncate";
7
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
8
- import bashDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/bash.md" with { type: "text" };
9
- import type { OutputMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
10
- import { ToolError } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
11
- import { renderOutputBlock, renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
12
3
  import type { Component } from "@oh-my-pi/pi-tui";
13
4
  import { Text } from "@oh-my-pi/pi-tui";
14
5
  import { Type } from "@sinclair/typebox";
6
+ import { renderPromptTemplate } from "../config/prompt-templates";
7
+ import { type BashExecutorOptions, executeBash } from "../exec/bash-executor";
8
+ import type { RenderResultOptions } from "../extensibility/custom-tools/types";
9
+ import { truncateToVisualLines } from "../modes/components/visual-truncate";
10
+ import type { Theme } from "../modes/theme/theme";
11
+ import bashDescription from "../prompts/tools/bash.md" with { type: "text" };
12
+ import { renderOutputBlock, renderStatusLine } from "../tui";
15
13
  import type { ToolSession } from ".";
16
14
  import { checkBashInterception, checkSimpleLsInterception } from "./bash-interceptor";
15
+ import type { OutputMeta } from "./output-meta";
17
16
  import { allocateOutputArtifact, createTailBuffer } from "./output-utils";
18
17
  import { resolveToCwd } from "./path-utils";
19
18
  import { formatBytes, wrapBrackets } from "./render-utils";
19
+ import { ToolError } from "./tool-errors";
20
20
  import { toolResult } from "./tool-result";
21
21
  import { DEFAULT_MAX_BYTES } from "./truncate";
22
22
 
@@ -106,7 +106,7 @@ export class BashTool implements AgentTool<typeof bashSchema, BashToolDetails> {
106
106
  env: extraEnv,
107
107
  artifactPath,
108
108
  artifactId,
109
- onChunk: (chunk) => {
109
+ onChunk: chunk => {
110
110
  tailBuffer.append(chunk);
111
111
  if (onUpdate) {
112
112
  onUpdate({
@@ -165,13 +165,14 @@ function formatBashCommand(args: BashRenderArgs, uiTheme: Theme): string {
165
165
  let displayWorkdir = args.cwd;
166
166
 
167
167
  if (displayWorkdir) {
168
- const resolvedCwd = resolve(cwd);
169
- const resolvedWorkdir = resolve(displayWorkdir);
168
+ const resolvedCwd = path.resolve(cwd);
169
+ const resolvedWorkdir = path.resolve(displayWorkdir);
170
170
  if (resolvedWorkdir === resolvedCwd) {
171
171
  displayWorkdir = undefined;
172
172
  } else {
173
- const relativePath = relative(resolvedCwd, resolvedWorkdir);
174
- const isWithinCwd = relativePath && !relativePath.startsWith("..") && !relativePath.startsWith(`..${sep}`);
173
+ const relativePath = path.relative(resolvedCwd, resolvedWorkdir);
174
+ const isWithinCwd =
175
+ relativePath && !relativePath.startsWith("..") && !relativePath.startsWith(`..${path.sep}`);
175
176
  if (isWithinCwd) {
176
177
  displayWorkdir = relativePath;
177
178
  }
@@ -210,7 +211,7 @@ export const bashToolRenderer = {
210
211
  const previewLines = renderContext?.previewLines ?? BASH_DEFAULT_PREVIEW_LINES;
211
212
 
212
213
  // Get output from context (preferred) or fall back to result content
213
- const output = renderContext?.output ?? result.content?.find((c) => c.type === "text")?.text ?? "";
214
+ const output = renderContext?.output ?? result.content?.find(c => c.type === "text")?.text ?? "";
214
215
  const displayOutput = output.trimEnd();
215
216
  const showingFullOutput = expanded && renderContext?.isFullOutput === true;
216
217
 
@@ -248,11 +249,11 @@ export const bashToolRenderer = {
248
249
  const hasOutput = displayOutput.trim().length > 0;
249
250
  if (hasOutput) {
250
251
  if (expanded) {
251
- outputLines.push(...displayOutput.split("\n").map((line) => uiTheme.fg("toolOutput", line)));
252
+ outputLines.push(...displayOutput.split("\n").map(line => uiTheme.fg("toolOutput", line)));
252
253
  } else {
253
254
  const styledOutput = displayOutput
254
255
  .split("\n")
255
- .map((line) => uiTheme.fg("toolOutput", line))
256
+ .map(line => uiTheme.fg("toolOutput", line))
256
257
  .join("\n");
257
258
  const textContent = styledOutput;
258
259
  const result = truncateToVisualLines(textContent, previewLines, width);
@@ -1,13 +1,13 @@
1
1
  import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
2
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
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 calculatorDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/calculator.md" with { type: "text" };
6
- import { renderStatusLine, renderTreeList } from "@oh-my-pi/pi-coding-agent/tui";
7
2
  import type { Component } from "@oh-my-pi/pi-tui";
8
3
  import { 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 { renderPromptTemplate } from "../config/prompt-templates";
7
+ import type { RenderResultOptions } from "../extensibility/custom-tools/types";
8
+ import type { Theme } from "../modes/theme/theme";
9
+ import calculatorDescription from "../prompts/tools/calculator.md" with { type: "text" };
10
+ import { renderStatusLine, renderTreeList } from "../tui";
11
11
  import type { ToolSession } from ".";
12
12
  import {
13
13
  formatCount,
@@ -417,13 +417,13 @@ export class CalculatorTool implements AgentTool<typeof calculatorSchema, Calcul
417
417
  signal?: AbortSignal,
418
418
  ): Promise<AgentToolResult<CalculatorToolDetails>> {
419
419
  return untilAborted(signal, async () => {
420
- const results = calculations.map((calc) => {
420
+ const results = calculations.map(calc => {
421
421
  const value = evaluateExpression(calc.expression);
422
422
  const output = `${calc.prefix}${formatResult(value)}${calc.suffix}`;
423
423
  return { expression: calc.expression, value, output };
424
424
  });
425
425
 
426
- const outputText = results.map((result) => result.output).join("\n");
426
+ const outputText = results.map(result => result.output).join("\n");
427
427
  return {
428
428
  content: [{ type: "text", text: outputText }],
429
429
  details: { results },
@@ -471,17 +471,17 @@ export const calculatorToolRenderer = {
471
471
  args?: CalculatorRenderArgs,
472
472
  ): Component {
473
473
  const details = result.details;
474
- const textContent = result.content?.find((c) => c.type === "text")?.text ?? "";
474
+ const textContent = result.content?.find(c => c.type === "text")?.text ?? "";
475
475
  if (result.isError) {
476
476
  const header = renderStatusLine({ icon: "error", title: "Calc" }, uiTheme);
477
477
  return new Text([header, formatErrorMessage(textContent, uiTheme)].join("\n"), 0, 0);
478
478
  }
479
479
 
480
480
  // Prefer structured details; fall back to parsing text content
481
- let outputs = details?.results?.map((entry) => `${entry.expression} = ${entry.output}`) ?? [];
481
+ let outputs = details?.results?.map(entry => `${entry.expression} = ${entry.output}`) ?? [];
482
482
  if (outputs.length === 0 && textContent.trim()) {
483
- const rawOutputs = textContent.split("\n").filter((line) => line.trim().length > 0);
484
- const expressions = args?.calculations?.map((calc) => calc.expression) ?? [];
483
+ const rawOutputs = textContent.split("\n").filter(line => line.trim().length > 0);
484
+ const expressions = args?.calculations?.map(calc => calc.expression) ?? [];
485
485
  if (expressions.length === rawOutputs.length && expressions.length > 0) {
486
486
  outputs = rawOutputs.map((output, index) => `${expressions[index]} = ${output}`);
487
487
  } else {
@@ -507,7 +507,7 @@ export const calculatorToolRenderer = {
507
507
  expanded,
508
508
  maxCollapsed: COLLAPSED_LIST_LIMIT,
509
509
  itemType: "result",
510
- renderItem: (output) => uiTheme.fg("toolOutput", output),
510
+ renderItem: output => uiTheme.fg("toolOutput", output),
511
511
  },
512
512
  uiTheme,
513
513
  );
@@ -3,13 +3,12 @@
3
3
  *
4
4
  * Subagents must call this tool to finish and return structured JSON output.
5
5
  */
6
-
7
6
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
8
7
  import { StringEnum } from "@oh-my-pi/pi-ai";
9
- import { subprocessToolRegistry } from "@oh-my-pi/pi-coding-agent/task/subprocess-tool-registry";
10
8
  import type { Static, TObject } from "@sinclair/typebox";
11
9
  import { Type } from "@sinclair/typebox";
12
10
  import Ajv, { type ErrorObject, type ValidateFunction } from "ajv";
11
+ import { subprocessToolRegistry } from "../task/subprocess-tool-registry";
13
12
  import type { ToolSession } from ".";
14
13
  import { jtdToJsonSchema } from "./jtd-to-json-schema";
15
14
 
@@ -46,7 +45,7 @@ function formatSchema(schema: unknown): string {
46
45
  function formatAjvErrors(errors: ErrorObject[] | null | undefined): string {
47
46
  if (!errors || errors.length === 0) return "Unknown schema validation error.";
48
47
  return errors
49
- .map((err) => {
48
+ .map(err => {
50
49
  const path = err.instancePath ? `${err.instancePath}: ` : "";
51
50
  return `${path}${err.message ?? "invalid"}`;
52
51
  })
@@ -137,6 +136,6 @@ export class CompleteTool implements AgentTool<TObject, CompleteDetails> {
137
136
 
138
137
  // Register subprocess tool handler for extraction + termination.
139
138
  subprocessToolRegistry.register<CompleteDetails>("complete", {
140
- extractData: (event) => event.result?.details as CompleteDetails | undefined,
139
+ extractData: event => event.result?.details as CompleteDetails | undefined,
141
140
  shouldTerminate: () => true,
142
141
  });
@@ -1,6 +1,6 @@
1
1
  import type { AgentToolContext, ToolCallContext } from "@oh-my-pi/pi-agent-core";
2
- import type { CustomToolContext } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
3
- import type { ExtensionUIContext } from "@oh-my-pi/pi-coding-agent/extensibility/extensions/types";
2
+ import type { CustomToolContext } from "../extensibility/custom-tools/types";
3
+ import type { ExtensionUIContext } from "../extensibility/extensions/types";
4
4
 
5
5
  declare module "@oh-my-pi/pi-agent-core" {
6
6
  interface AgentToolContext extends CustomToolContext {