@oh-my-pi/pi-coding-agent 8.0.20 → 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 (421) hide show
  1. package/CHANGELOG.md +125 -0
  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 +54 -23
  38. package/scripts/format-prompts.ts +0 -1
  39. package/src/capability/context-file.ts +3 -4
  40. package/src/capability/extension-module.ts +3 -4
  41. package/src/capability/extension.ts +3 -4
  42. package/src/capability/fs.ts +20 -21
  43. package/src/capability/hook.ts +3 -4
  44. package/src/capability/index.ts +15 -16
  45. package/src/capability/instruction.ts +3 -4
  46. package/src/capability/mcp.ts +3 -4
  47. package/src/capability/prompt.ts +3 -4
  48. package/src/capability/rule.ts +3 -4
  49. package/src/capability/settings.ts +2 -3
  50. package/src/capability/skill.ts +3 -4
  51. package/src/capability/slash-command.ts +3 -4
  52. package/src/capability/ssh.ts +3 -4
  53. package/src/capability/system-prompt.ts +3 -4
  54. package/src/capability/tool.ts +3 -4
  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 -25
  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 +307 -0
  66. package/src/commit/agentic/fallback.ts +96 -0
  67. package/src/commit/agentic/index.ts +351 -0
  68. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  69. package/src/commit/agentic/prompts/session-user.md +26 -0
  70. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  71. package/src/commit/agentic/prompts/system.md +40 -0
  72. package/src/commit/agentic/state.ts +69 -0
  73. package/src/commit/agentic/tools/analyze-file.ts +131 -0
  74. package/src/commit/agentic/tools/git-file-diff.ts +194 -0
  75. package/src/commit/agentic/tools/git-hunk.ts +50 -0
  76. package/src/commit/agentic/tools/git-overview.ts +84 -0
  77. package/src/commit/agentic/tools/index.ts +56 -0
  78. package/src/commit/agentic/tools/propose-changelog.ts +128 -0
  79. package/src/commit/agentic/tools/propose-commit.ts +154 -0
  80. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  81. package/src/commit/agentic/tools/split-commit.ts +280 -0
  82. package/src/commit/agentic/topo-sort.ts +44 -0
  83. package/src/commit/agentic/trivial.ts +51 -0
  84. package/src/commit/agentic/validation.ts +200 -0
  85. package/src/commit/analysis/conventional.ts +165 -0
  86. package/src/commit/analysis/index.ts +4 -0
  87. package/src/commit/analysis/scope.ts +242 -0
  88. package/src/commit/analysis/summary.ts +112 -0
  89. package/src/commit/analysis/validation.ts +66 -0
  90. package/src/commit/changelog/detect.ts +36 -0
  91. package/src/commit/changelog/generate.ts +110 -0
  92. package/src/commit/changelog/index.ts +233 -0
  93. package/src/commit/changelog/parse.ts +44 -0
  94. package/src/commit/cli.ts +93 -0
  95. package/src/commit/git/diff.ts +148 -0
  96. package/src/commit/git/errors.ts +11 -0
  97. package/src/commit/git/index.ts +212 -0
  98. package/src/commit/git/operations.ts +53 -0
  99. package/src/commit/index.ts +5 -0
  100. package/src/commit/map-reduce/index.ts +63 -0
  101. package/src/commit/map-reduce/map-phase.ts +178 -0
  102. package/src/commit/map-reduce/reduce-phase.ts +145 -0
  103. package/src/commit/map-reduce/utils.ts +9 -0
  104. package/src/commit/message.ts +11 -0
  105. package/src/commit/model-selection.ts +80 -0
  106. package/src/commit/pipeline.ts +240 -0
  107. package/src/commit/prompts/analysis-system.md +155 -0
  108. package/src/commit/prompts/analysis-user.md +41 -0
  109. package/src/commit/prompts/changelog-system.md +56 -0
  110. package/src/commit/prompts/changelog-user.md +19 -0
  111. package/src/commit/prompts/file-observer-system.md +26 -0
  112. package/src/commit/prompts/file-observer-user.md +9 -0
  113. package/src/commit/prompts/reduce-system.md +60 -0
  114. package/src/commit/prompts/reduce-user.md +17 -0
  115. package/src/commit/prompts/summary-retry.md +4 -0
  116. package/src/commit/prompts/summary-system.md +52 -0
  117. package/src/commit/prompts/summary-user.md +13 -0
  118. package/src/commit/prompts/types-description.md +2 -0
  119. package/src/commit/types.ts +109 -0
  120. package/src/commit/utils/exclusions.ts +42 -0
  121. package/src/config/file-lock.ts +121 -0
  122. package/src/config/keybindings.ts +6 -8
  123. package/src/config/model-registry.ts +65 -38
  124. package/src/config/model-resolver.ts +18 -19
  125. package/src/config/prompt-templates.ts +11 -11
  126. package/src/config/settings-manager.ts +141 -50
  127. package/src/config.ts +64 -66
  128. package/src/cursor.ts +11 -9
  129. package/src/discovery/agents-md.ts +11 -12
  130. package/src/discovery/builtin.ts +68 -73
  131. package/src/discovery/claude.ts +41 -42
  132. package/src/discovery/cline.ts +11 -12
  133. package/src/discovery/codex.ts +52 -53
  134. package/src/discovery/cursor.ts +9 -10
  135. package/src/discovery/gemini.ts +17 -22
  136. package/src/discovery/github.ts +13 -14
  137. package/src/discovery/helpers.ts +35 -34
  138. package/src/discovery/index.ts +22 -24
  139. package/src/discovery/mcp-json.ts +8 -9
  140. package/src/discovery/ssh.ts +8 -9
  141. package/src/discovery/vscode.ts +4 -5
  142. package/src/discovery/windsurf.ts +6 -7
  143. package/src/exa/company.ts +1 -2
  144. package/src/exa/index.ts +2 -3
  145. package/src/exa/linkedin.ts +1 -2
  146. package/src/exa/mcp-client.ts +14 -16
  147. package/src/exa/render.ts +10 -11
  148. package/src/exa/researcher.ts +1 -2
  149. package/src/exa/search.ts +1 -2
  150. package/src/exa/types.ts +0 -1
  151. package/src/exa/websets.ts +1 -2
  152. package/src/exec/bash-executor.ts +3 -4
  153. package/src/exec/exec.ts +0 -1
  154. package/src/export/custom-share.ts +5 -6
  155. package/src/export/html/index.ts +24 -21
  156. package/src/export/ttsr.ts +2 -3
  157. package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
  158. package/src/extensibility/custom-commands/loader.ts +18 -15
  159. package/src/extensibility/custom-commands/types.ts +2 -3
  160. package/src/extensibility/custom-tools/loader.ts +11 -12
  161. package/src/extensibility/custom-tools/types.ts +7 -8
  162. package/src/extensibility/custom-tools/wrapper.ts +2 -3
  163. package/src/extensibility/extensions/loader.ts +76 -54
  164. package/src/extensibility/extensions/runner.ts +11 -12
  165. package/src/extensibility/extensions/types.ts +20 -27
  166. package/src/extensibility/extensions/wrapper.ts +3 -4
  167. package/src/extensibility/hooks/index.ts +1 -1
  168. package/src/extensibility/hooks/loader.ts +9 -10
  169. package/src/extensibility/hooks/runner.ts +7 -8
  170. package/src/extensibility/hooks/tool-wrapper.ts +0 -1
  171. package/src/extensibility/hooks/types.ts +11 -18
  172. package/src/extensibility/plugins/doctor.ts +3 -3
  173. package/src/extensibility/plugins/installer.ts +27 -27
  174. package/src/extensibility/plugins/loader.ts +59 -56
  175. package/src/extensibility/plugins/manager.ts +211 -171
  176. package/src/extensibility/plugins/parser.ts +1 -1
  177. package/src/extensibility/plugins/paths.ts +8 -8
  178. package/src/extensibility/skills.ts +63 -60
  179. package/src/extensibility/slash-commands.ts +10 -10
  180. package/src/index.ts +54 -54
  181. package/src/internal-urls/agent-protocol.ts +21 -11
  182. package/src/internal-urls/artifact-protocol.ts +17 -13
  183. package/src/internal-urls/router.ts +1 -2
  184. package/src/internal-urls/rule-protocol.ts +3 -4
  185. package/src/internal-urls/skill-protocol.ts +3 -4
  186. package/src/ipy/executor.ts +109 -9
  187. package/src/ipy/gateway-coordinator.ts +79 -90
  188. package/src/ipy/kernel.ts +32 -30
  189. package/src/ipy/modules.ts +13 -13
  190. package/src/lsp/client.ts +21 -10
  191. package/src/lsp/clients/biome-client.ts +1 -2
  192. package/src/lsp/clients/index.ts +3 -3
  193. package/src/lsp/clients/lsp-linter-client.ts +4 -5
  194. package/src/lsp/config.ts +15 -15
  195. package/src/lsp/edits.ts +4 -5
  196. package/src/lsp/index.ts +43 -44
  197. package/src/lsp/lspmux.ts +8 -8
  198. package/src/lsp/render.ts +99 -61
  199. package/src/lsp/utils.ts +3 -3
  200. package/src/main.ts +71 -37
  201. package/src/mcp/client.ts +2 -3
  202. package/src/mcp/config.ts +5 -6
  203. package/src/mcp/json-rpc.ts +0 -1
  204. package/src/mcp/loader.ts +6 -7
  205. package/src/mcp/manager.ts +17 -18
  206. package/src/mcp/tool-bridge.ts +4 -9
  207. package/src/mcp/tool-cache.ts +2 -3
  208. package/src/mcp/transports/http.ts +2 -4
  209. package/src/mcp/transports/stdio.ts +1 -2
  210. package/src/migrations.ts +63 -52
  211. package/src/modes/components/armin.ts +4 -5
  212. package/src/modes/components/assistant-message.ts +33 -5
  213. package/src/modes/components/bash-execution.ts +7 -8
  214. package/src/modes/components/bordered-loader.ts +3 -3
  215. package/src/modes/components/branch-summary-message.ts +3 -3
  216. package/src/modes/components/compaction-summary-message.ts +3 -3
  217. package/src/modes/components/countdown-timer.ts +0 -1
  218. package/src/modes/components/custom-message.ts +5 -5
  219. package/src/modes/components/diff.ts +1 -1
  220. package/src/modes/components/dynamic-border.ts +2 -2
  221. package/src/modes/components/extensions/extension-dashboard.ts +6 -7
  222. package/src/modes/components/extensions/extension-list.ts +2 -3
  223. package/src/modes/components/extensions/inspector-panel.ts +3 -4
  224. package/src/modes/components/extensions/state-manager.ts +25 -26
  225. package/src/modes/components/extensions/types.ts +1 -2
  226. package/src/modes/components/footer.ts +47 -43
  227. package/src/modes/components/history-search.ts +2 -2
  228. package/src/modes/components/hook-editor.ts +3 -4
  229. package/src/modes/components/hook-input.ts +2 -3
  230. package/src/modes/components/hook-message.ts +5 -5
  231. package/src/modes/components/hook-selector.ts +2 -3
  232. package/src/modes/components/keybinding-hints.ts +2 -3
  233. package/src/modes/components/login-dialog.ts +2 -2
  234. package/src/modes/components/model-selector.ts +12 -12
  235. package/src/modes/components/oauth-selector.ts +2 -2
  236. package/src/modes/components/plugin-settings.ts +20 -20
  237. package/src/modes/components/python-execution.ts +7 -8
  238. package/src/modes/components/queue-mode-selector.ts +3 -3
  239. package/src/modes/components/read-tool-group.ts +2 -2
  240. package/src/modes/components/session-selector.ts +4 -4
  241. package/src/modes/components/settings-defs.ts +77 -69
  242. package/src/modes/components/settings-selector.ts +16 -16
  243. package/src/modes/components/show-images-selector.ts +2 -2
  244. package/src/modes/components/status-line/segments.ts +4 -4
  245. package/src/modes/components/status-line/separators.ts +1 -1
  246. package/src/modes/components/status-line/types.ts +2 -2
  247. package/src/modes/components/status-line-segment-editor.ts +7 -8
  248. package/src/modes/components/status-line.ts +12 -12
  249. package/src/modes/components/theme-selector.ts +8 -7
  250. package/src/modes/components/thinking-selector.ts +4 -4
  251. package/src/modes/components/todo-display.ts +2 -2
  252. package/src/modes/components/todo-reminder.ts +4 -4
  253. package/src/modes/components/tool-execution.ts +16 -19
  254. package/src/modes/components/tree-selector.ts +12 -12
  255. package/src/modes/components/ttsr-notification.ts +5 -5
  256. package/src/modes/components/user-message-selector.ts +1 -1
  257. package/src/modes/components/user-message.ts +1 -1
  258. package/src/modes/components/visual-truncate.ts +0 -1
  259. package/src/modes/components/welcome.ts +4 -4
  260. package/src/modes/controllers/command-controller.ts +46 -47
  261. package/src/modes/controllers/event-controller.ts +16 -20
  262. package/src/modes/controllers/extension-ui-controller.ts +40 -46
  263. package/src/modes/controllers/input-controller.ts +17 -18
  264. package/src/modes/controllers/selector-controller.ts +103 -91
  265. package/src/modes/index.ts +3 -3
  266. package/src/modes/interactive-mode.ts +31 -31
  267. package/src/modes/print-mode.ts +12 -13
  268. package/src/modes/rpc/rpc-client.ts +7 -8
  269. package/src/modes/rpc/rpc-mode.ts +24 -28
  270. package/src/modes/rpc/rpc-types.ts +3 -4
  271. package/src/modes/theme/mermaid-cache.ts +89 -0
  272. package/src/modes/theme/theme.ts +130 -53
  273. package/src/modes/types.ts +10 -10
  274. package/src/modes/utils/ui-helpers.ts +17 -17
  275. package/src/patch/applicator.ts +18 -19
  276. package/src/patch/diff.ts +1 -2
  277. package/src/patch/fuzzy.ts +1 -2
  278. package/src/patch/index.ts +11 -18
  279. package/src/patch/normalize.ts +4 -4
  280. package/src/patch/normative.ts +1 -2
  281. package/src/patch/parser.ts +8 -9
  282. package/src/patch/shared.ts +43 -16
  283. package/src/prompts/tools/task.md +2 -0
  284. package/src/sdk.ts +100 -65
  285. package/src/session/agent-session.ts +84 -85
  286. package/src/session/agent-storage.ts +43 -39
  287. package/src/session/artifacts.ts +32 -10
  288. package/src/session/auth-storage.ts +50 -39
  289. package/src/session/compaction/branch-summarization.ts +7 -10
  290. package/src/session/compaction/compaction.ts +8 -19
  291. package/src/session/compaction/utils.ts +6 -9
  292. package/src/session/history-storage.ts +10 -10
  293. package/src/session/messages.ts +4 -5
  294. package/src/session/session-manager.ts +76 -65
  295. package/src/session/session-storage.ts +57 -69
  296. package/src/session/storage-migration.ts +14 -56
  297. package/src/session/streaming-output.ts +2 -2
  298. package/src/ssh/connection-manager.ts +43 -50
  299. package/src/ssh/ssh-executor.ts +2 -2
  300. package/src/ssh/sshfs-mount.ts +11 -18
  301. package/src/system-prompt.ts +28 -35
  302. package/src/task/agents.ts +45 -30
  303. package/src/task/commands.ts +6 -7
  304. package/src/task/discovery.ts +39 -76
  305. package/src/task/executor.ts +14 -15
  306. package/src/task/index.ts +40 -34
  307. package/src/task/output-manager.ts +93 -0
  308. package/src/task/parallel.ts +0 -1
  309. package/src/task/render.ts +24 -30
  310. package/src/task/subprocess-tool-registry.ts +1 -2
  311. package/src/task/worker-protocol.ts +3 -3
  312. package/src/task/worker.ts +33 -39
  313. package/src/task/worktree.ts +19 -19
  314. package/src/tools/ask.ts +41 -20
  315. package/src/tools/bash-interceptor.ts +1 -5
  316. package/src/tools/bash.ts +91 -97
  317. package/src/tools/calculator.ts +49 -47
  318. package/src/tools/complete.ts +4 -5
  319. package/src/tools/context.ts +2 -2
  320. package/src/tools/fetch.ts +84 -124
  321. package/src/tools/find.ts +94 -98
  322. package/src/tools/gemini-image.ts +14 -14
  323. package/src/tools/grep.ts +100 -116
  324. package/src/tools/index.ts +80 -55
  325. package/src/tools/list-limit.ts +1 -1
  326. package/src/tools/ls.ts +44 -70
  327. package/src/tools/notebook.ts +51 -67
  328. package/src/tools/output-meta.ts +3 -4
  329. package/src/tools/output-utils.ts +2 -2
  330. package/src/tools/path-utils.ts +5 -5
  331. package/src/tools/python.ts +104 -217
  332. package/src/tools/read.ts +92 -33
  333. package/src/tools/render-utils.ts +8 -23
  334. package/src/tools/renderers.ts +6 -7
  335. package/src/tools/review.ts +8 -11
  336. package/src/tools/ssh.ts +69 -49
  337. package/src/tools/todo-write.ts +37 -25
  338. package/src/tools/tool-errors.ts +3 -3
  339. package/src/tools/tool-result.ts +3 -8
  340. package/src/tools/write.ts +99 -75
  341. package/src/tui/code-cell.ts +109 -0
  342. package/src/tui/file-list.ts +47 -0
  343. package/src/tui/index.ts +11 -0
  344. package/src/tui/output-block.ts +72 -0
  345. package/src/tui/status-line.ts +39 -0
  346. package/src/tui/tree-list.ts +55 -0
  347. package/src/tui/types.ts +16 -0
  348. package/src/tui/utils.ts +48 -0
  349. package/src/utils/changelog.ts +9 -10
  350. package/src/utils/clipboard.ts +11 -11
  351. package/src/utils/file-mentions.ts +4 -10
  352. package/src/utils/frontmatter.ts +6 -3
  353. package/src/utils/fuzzy.ts +2 -2
  354. package/src/utils/image-convert.ts +1 -1
  355. package/src/utils/image-resize.ts +1 -1
  356. package/src/utils/mime.ts +2 -2
  357. package/src/utils/shell-snapshot.ts +11 -13
  358. package/src/utils/shell.ts +4 -5
  359. package/src/utils/title-generator.ts +8 -9
  360. package/src/utils/tools-manager.ts +23 -23
  361. package/src/vendor/photon/index.js +1099 -1059
  362. package/src/vendor/photon/photon_rs_bg.wasm +0 -0
  363. package/src/web/scrapers/artifacthub.ts +1 -1
  364. package/src/web/scrapers/arxiv.ts +2 -2
  365. package/src/web/scrapers/bluesky.ts +2 -2
  366. package/src/web/scrapers/cheatsh.ts +1 -1
  367. package/src/web/scrapers/chocolatey.ts +2 -2
  368. package/src/web/scrapers/choosealicense.ts +5 -5
  369. package/src/web/scrapers/cisa-kev.ts +1 -1
  370. package/src/web/scrapers/crossref.ts +2 -2
  371. package/src/web/scrapers/devto.ts +3 -3
  372. package/src/web/scrapers/discogs.ts +3 -4
  373. package/src/web/scrapers/discourse.ts +1 -1
  374. package/src/web/scrapers/dockerhub.ts +1 -1
  375. package/src/web/scrapers/fdroid.ts +2 -2
  376. package/src/web/scrapers/firefox-addons.ts +3 -3
  377. package/src/web/scrapers/flathub.ts +1 -1
  378. package/src/web/scrapers/github.ts +3 -3
  379. package/src/web/scrapers/gitlab.ts +4 -4
  380. package/src/web/scrapers/hackernews.ts +2 -2
  381. package/src/web/scrapers/huggingface.ts +1 -1
  382. package/src/web/scrapers/iacr.ts +2 -2
  383. package/src/web/scrapers/index.ts +0 -1
  384. package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
  385. package/src/web/scrapers/lemmy.ts +2 -2
  386. package/src/web/scrapers/maven.ts +2 -2
  387. package/src/web/scrapers/mdn.ts +2 -4
  388. package/src/web/scrapers/metacpan.ts +2 -2
  389. package/src/web/scrapers/musicbrainz.ts +1 -2
  390. package/src/web/scrapers/npm.ts +1 -1
  391. package/src/web/scrapers/nuget.ts +2 -2
  392. package/src/web/scrapers/nvd.ts +3 -3
  393. package/src/web/scrapers/ollama.ts +7 -9
  394. package/src/web/scrapers/opencorporates.ts +2 -2
  395. package/src/web/scrapers/openlibrary.ts +6 -6
  396. package/src/web/scrapers/orcid.ts +0 -1
  397. package/src/web/scrapers/osv.ts +2 -2
  398. package/src/web/scrapers/packagist.ts +1 -1
  399. package/src/web/scrapers/pubmed.ts +1 -2
  400. package/src/web/scrapers/rawg.ts +2 -2
  401. package/src/web/scrapers/readthedocs.ts +1 -2
  402. package/src/web/scrapers/repology.ts +2 -2
  403. package/src/web/scrapers/rfc.ts +1 -1
  404. package/src/web/scrapers/searchcode.ts +2 -2
  405. package/src/web/scrapers/semantic-scholar.ts +1 -1
  406. package/src/web/scrapers/snapcraft.ts +2 -2
  407. package/src/web/scrapers/sourcegraph.ts +1 -1
  408. package/src/web/scrapers/spdx.ts +3 -3
  409. package/src/web/scrapers/spotify.ts +0 -1
  410. package/src/web/scrapers/twitter.ts +1 -1
  411. package/src/web/scrapers/types.ts +1 -2
  412. package/src/web/scrapers/utils.ts +5 -5
  413. package/src/web/scrapers/wikidata.ts +3 -3
  414. package/src/web/scrapers/youtube.ts +9 -14
  415. package/src/web/search/auth.ts +5 -10
  416. package/src/web/search/index.ts +11 -21
  417. package/src/web/search/providers/anthropic.ts +3 -9
  418. package/src/web/search/providers/exa.ts +6 -10
  419. package/src/web/search/providers/perplexity.ts +5 -5
  420. package/src/web/search/render.ts +129 -175
  421. package/tsconfig.json +0 -42
@@ -4,19 +4,18 @@
4
4
  * Dependencies (@sinclair/typebox and pi-coding-agent) are injected via the CustomToolAPI
5
5
  * to avoid import resolution issues with custom tools loaded from user directories.
6
6
  */
7
-
8
7
  import * as path from "node:path";
9
- import { toolCapability } from "@oh-my-pi/pi-coding-agent/capability/tool";
10
- import { type CustomTool, loadCapability } from "@oh-my-pi/pi-coding-agent/discovery";
11
- import { expandPath } from "@oh-my-pi/pi-coding-agent/discovery/helpers";
12
- import type { ExecOptions } from "@oh-my-pi/pi-coding-agent/exec/exec";
13
- import { execCommand } from "@oh-my-pi/pi-coding-agent/exec/exec";
14
- import type { HookUIContext } from "@oh-my-pi/pi-coding-agent/extensibility/hooks/types";
15
- import { getAllPluginToolPaths } from "@oh-my-pi/pi-coding-agent/extensibility/plugins/loader";
16
- import * as piCodingAgent from "@oh-my-pi/pi-coding-agent/index";
17
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
8
+ import * as piCodingAgent from "@oh-my-pi/pi-coding-agent";
18
9
  import { logger } from "@oh-my-pi/pi-utils";
19
10
  import * as typebox from "@sinclair/typebox";
11
+ import { toolCapability } from "../../capability/tool";
12
+ import { type CustomTool, loadCapability } from "../../discovery";
13
+ import { expandPath } from "../../discovery/helpers";
14
+ import type { ExecOptions } from "../../exec/exec";
15
+ import { execCommand } from "../../exec/exec";
16
+ import type { HookUIContext } from "../../extensibility/hooks/types";
17
+ import { getAllPluginToolPaths } from "../../extensibility/plugins/loader";
18
+ import { theme } from "../../modes/theme/theme";
20
19
  import type { CustomToolAPI, CustomToolFactory, LoadedCustomTool, ToolLoadError } from "./types";
21
20
 
22
21
  /**
@@ -90,7 +89,7 @@ async function loadTool(
90
89
  const toolResult = await factory(sharedApi);
91
90
  const toolsArray = Array.isArray(toolResult) ? toolResult : [toolResult];
92
91
 
93
- const loadedTools: LoadedCustomTool[] = toolsArray.map((tool) => ({
92
+ const loadedTools: LoadedCustomTool[] = toolsArray.map(tool => ({
94
93
  path: toolPath,
95
94
  resolvedPath,
96
95
  tool,
@@ -223,7 +222,7 @@ export async function discoverAndLoadCustomTools(configuredPaths: string[], cwd:
223
222
  }
224
223
 
225
224
  // 2. Plugin tools: ~/.omp/plugins/node_modules/*/
226
- for (const pluginPath of getAllPluginToolPaths(cwd)) {
225
+ for (const pluginPath of await getAllPluginToolPaths(cwd)) {
227
226
  addPath(pluginPath, { provider: "plugin", providerName: "Plugin", level: "user" });
228
227
  }
229
228
 
@@ -4,16 +4,15 @@
4
4
  * Custom tools are TypeScript modules that define additional tools for the agent.
5
5
  * They can provide custom rendering for tool calls and results in the TUI.
6
6
  */
7
-
8
7
  import type { AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
9
8
  import type { Model } from "@oh-my-pi/pi-ai";
10
- import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
11
- import type { ExecOptions, ExecResult } from "@oh-my-pi/pi-coding-agent/exec/exec";
12
- import type { HookUIContext } from "@oh-my-pi/pi-coding-agent/extensibility/hooks/types";
13
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
14
- import type { ReadonlySessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
15
9
  import type { Component } from "@oh-my-pi/pi-tui";
16
10
  import type { Static, TSchema } from "@sinclair/typebox";
11
+ import type { ModelRegistry } from "../../config/model-registry";
12
+ import type { ExecOptions, ExecResult } from "../../exec/exec";
13
+ import type { HookUIContext } from "../../extensibility/hooks/types";
14
+ import type { Theme } from "../../modes/theme/theme";
15
+ import type { ReadonlySessionManager } from "../../session/session-manager";
17
16
 
18
17
  /** Alias for clarity */
19
18
  export type CustomToolUIContext = HookUIContext;
@@ -22,7 +21,7 @@ export type CustomToolUIContext = HookUIContext;
22
21
  export type { AgentToolResult, AgentToolUpdateCallback };
23
22
 
24
23
  // Re-export for backward compatibility
25
- export type { ExecOptions, ExecResult } from "@oh-my-pi/pi-coding-agent/exec/exec";
24
+ export type { ExecOptions, ExecResult } from "../../exec/exec";
26
25
 
27
26
  /** API passed to custom tool factory (stable across session changes) */
28
27
  export interface CustomToolAPI {
@@ -39,7 +38,7 @@ export interface CustomToolAPI {
39
38
  /** Injected @sinclair/typebox module */
40
39
  typebox: typeof import("@sinclair/typebox");
41
40
  /** Injected pi-coding-agent exports */
42
- pi: typeof import("../../index");
41
+ pi: typeof import("../..");
43
42
  }
44
43
 
45
44
  /**
@@ -1,11 +1,10 @@
1
1
  /**
2
2
  * CustomToolAdapter wraps CustomTool instances into AgentTool for use with the agent.
3
3
  */
4
-
5
4
  import type { AgentTool, AgentToolResult, AgentToolUpdateCallback, RenderResultOptions } from "@oh-my-pi/pi-agent-core";
6
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
7
5
  import type { Component } from "@oh-my-pi/pi-tui";
8
6
  import type { Static, TSchema } from "@sinclair/typebox";
7
+ import type { Theme } from "../../modes/theme/theme";
9
8
  import type { CustomTool, CustomToolContext, LoadedCustomTool } from "./types";
10
9
 
11
10
  export class CustomToolAdapter<TParams extends TSchema = TSchema, TDetails = any, TTheme extends Theme = Theme>
@@ -64,6 +63,6 @@ export class CustomToolAdapter<TParams extends TSchema = TSchema, TDetails = any
64
63
  loadedTools: LoadedCustomTool<TParams, TDetails>[],
65
64
  getContext: () => CustomToolContext,
66
65
  ): AgentTool<TParams, TDetails, TTheme>[] {
67
- return loadedTools.map((lt) => CustomToolAdapter.wrap(lt.tool, getContext));
66
+ return loadedTools.map(lt => CustomToolAdapter.wrap(lt.tool, getContext));
68
67
  }
69
68
  }
@@ -1,23 +1,23 @@
1
1
  /**
2
2
  * Extension loader - loads TypeScript extension modules using native Bun import.
3
3
  */
4
-
5
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
4
+ import type * as fs1 from "node:fs";
5
+ import * as fs from "node:fs/promises";
6
6
  import * as path from "node:path";
7
7
  import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
8
8
  import type { ImageContent, Model, TextContent } from "@oh-my-pi/pi-ai";
9
- import { type ExtensionModule, extensionModuleCapability } from "@oh-my-pi/pi-coding-agent/capability/extension-module";
10
- import { loadCapability } from "@oh-my-pi/pi-coding-agent/discovery";
11
- import { expandPath, getExtensionNameFromPath } from "@oh-my-pi/pi-coding-agent/discovery/helpers";
12
- import type { ExecOptions } from "@oh-my-pi/pi-coding-agent/exec/exec";
13
- import { execCommand } from "@oh-my-pi/pi-coding-agent/exec/exec";
14
- import * as piCodingAgent from "@oh-my-pi/pi-coding-agent/index";
15
- import type { CustomMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
16
- import { EventBus } from "@oh-my-pi/pi-coding-agent/utils/event-bus";
9
+ import * as piCodingAgent from "@oh-my-pi/pi-coding-agent";
17
10
  import type { KeyId } from "@oh-my-pi/pi-tui";
18
- import { logger } from "@oh-my-pi/pi-utils";
11
+ import { hasFsCode, isEacces, isEnoent, logger } from "@oh-my-pi/pi-utils";
19
12
  import type { TSchema } from "@sinclair/typebox";
20
13
  import * as TypeBox from "@sinclair/typebox";
14
+ import { type ExtensionModule, extensionModuleCapability } from "../../capability/extension-module";
15
+ import { loadCapability } from "../../discovery";
16
+ import { expandPath, getExtensionNameFromPath } from "../../discovery/helpers";
17
+ import type { ExecOptions } from "../../exec/exec";
18
+ import { execCommand } from "../../exec/exec";
19
+ import type { CustomMessage } from "../../session/messages";
20
+ import { EventBus } from "../../utils/event-bus";
21
21
  import type {
22
22
  Extension,
23
23
  ExtensionAPI,
@@ -316,16 +316,18 @@ interface ExtensionManifest {
316
316
  skills?: string[];
317
317
  }
318
318
 
319
- function readExtensionManifest(packageJsonPath: string): ExtensionManifest | null {
319
+ async function readExtensionManifest(packageJsonPath: string): Promise<ExtensionManifest | null> {
320
320
  try {
321
- const content = readFileSync(packageJsonPath, "utf-8");
322
- const pkg = JSON.parse(content) as { omp?: ExtensionManifest; pi?: ExtensionManifest };
321
+ const pkg = (await Bun.file(packageJsonPath).json()) as { omp?: ExtensionManifest; pi?: ExtensionManifest };
323
322
  const manifest = pkg.omp ?? pkg.pi;
324
323
  if (manifest && typeof manifest === "object") {
325
324
  return manifest;
326
325
  }
327
326
  return null;
328
327
  } catch (error) {
328
+ if (isEnoent(error) || isEacces(error) || hasFsCode(error, "EPERM")) {
329
+ return null;
330
+ }
329
331
  logger.warn("Failed to read extension manifest", { path: packageJsonPath, error: String(error) });
330
332
  return null;
331
333
  }
@@ -338,31 +340,47 @@ function isExtensionFile(name: string): boolean {
338
340
  /**
339
341
  * Resolve extension entry points from a directory.
340
342
  */
341
- function resolveExtensionEntries(dir: string): string[] | null {
343
+ async function resolveExtensionEntries(dir: string): Promise<string[] | null> {
342
344
  const packageJsonPath = path.join(dir, "package.json");
343
- if (existsSync(packageJsonPath)) {
344
- const manifest = readExtensionManifest(packageJsonPath);
345
- if (manifest?.extensions?.length) {
346
- const entries: string[] = [];
347
- for (const extPath of manifest.extensions) {
348
- const resolvedExtPath = path.resolve(dir, extPath);
349
- if (existsSync(resolvedExtPath)) {
350
- entries.push(resolvedExtPath);
351
- }
352
- }
353
- if (entries.length > 0) {
354
- return entries;
345
+ const manifest = await readExtensionManifest(packageJsonPath);
346
+ if (manifest?.extensions?.length) {
347
+ const entries: string[] = [];
348
+ for (const extPath of manifest.extensions) {
349
+ const resolvedExtPath = path.resolve(dir, extPath);
350
+ try {
351
+ await fs.stat(resolvedExtPath);
352
+ entries.push(resolvedExtPath);
353
+ } catch (err) {
354
+ if (isEnoent(err) || isEacces(err) || hasFsCode(err, "EPERM")) continue;
355
+ throw err;
355
356
  }
356
357
  }
358
+ if (entries.length > 0) {
359
+ return entries;
360
+ }
357
361
  }
358
362
 
359
363
  const indexTs = path.join(dir, "index.ts");
360
364
  const indexJs = path.join(dir, "index.js");
361
- if (existsSync(indexTs)) {
365
+ try {
366
+ await fs.stat(indexTs);
362
367
  return [indexTs];
368
+ } catch (err) {
369
+ if (isEnoent(err) || isEacces(err) || hasFsCode(err, "EPERM")) {
370
+ // Ignore
371
+ } else {
372
+ throw err;
373
+ }
363
374
  }
364
- if (existsSync(indexJs)) {
375
+ try {
376
+ await fs.stat(indexJs);
365
377
  return [indexJs];
378
+ } catch (err) {
379
+ if (isEnoent(err) || isEacces(err) || hasFsCode(err, "EPERM")) {
380
+ // Ignore
381
+ } else {
382
+ throw err;
383
+ }
366
384
  }
367
385
 
368
386
  return null;
@@ -378,36 +396,32 @@ function resolveExtensionEntries(dir: string): string[] | null {
378
396
  *
379
397
  * No recursion beyond one level. Complex packages must use package.json manifest.
380
398
  */
381
- function discoverExtensionsInDir(dir: string): string[] {
382
- if (!existsSync(dir)) {
383
- return [];
384
- }
385
-
399
+ async function discoverExtensionsInDir(dir: string): Promise<string[]> {
386
400
  const discovered: string[] = [];
387
401
 
402
+ let entries: fs1.Dirent[];
388
403
  try {
389
- const entries = readdirSync(dir, { withFileTypes: true });
404
+ entries = await fs.readdir(dir, { withFileTypes: true });
405
+ } catch (err) {
406
+ if (isEnoent(err)) return [];
407
+ logger.warn("Failed to discover extensions in directory", { path: dir, error: String(err) });
408
+ return [];
409
+ }
390
410
 
391
- for (const entry of entries) {
392
- const entryPath = path.join(dir, entry.name);
411
+ for (const entry of entries) {
412
+ const entryPath = path.join(dir, entry.name);
393
413
 
394
- // 1. Direct files: *.ts or *.js
395
- if ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {
396
- discovered.push(entryPath);
397
- continue;
398
- }
414
+ if ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {
415
+ discovered.push(entryPath);
416
+ continue;
417
+ }
399
418
 
400
- // 2 & 3. Subdirectories
401
- if (entry.isDirectory() || entry.isSymbolicLink()) {
402
- const entries = resolveExtensionEntries(entryPath);
403
- if (entries) {
404
- discovered.push(...entries);
405
- }
419
+ if (entry.isDirectory() || entry.isSymbolicLink()) {
420
+ const resolved = await resolveExtensionEntries(entryPath);
421
+ if (resolved) {
422
+ discovered.push(...resolved);
406
423
  }
407
424
  }
408
- } catch (error) {
409
- logger.warn("Failed to discover extensions in directory", { path: dir, error: String(error) });
410
- return [];
411
425
  }
412
426
 
413
427
  return discovered;
@@ -454,14 +468,22 @@ export async function discoverAndLoadExtensions(
454
468
  // 2. Explicitly configured paths
455
469
  for (const configuredPath of configuredPaths) {
456
470
  const resolved = resolvePath(configuredPath, cwd);
457
- if (existsSync(resolved) && statSync(resolved).isDirectory()) {
458
- const entries = resolveExtensionEntries(resolved);
471
+
472
+ let stat: fs1.Stats | null = null;
473
+ try {
474
+ stat = await fs.stat(resolved);
475
+ } catch (err) {
476
+ if (!isEnoent(err)) throw err;
477
+ }
478
+
479
+ if (stat?.isDirectory()) {
480
+ const entries = await resolveExtensionEntries(resolved);
459
481
  if (entries) {
460
482
  addPaths(entries);
461
483
  continue;
462
484
  }
463
485
 
464
- const discovered = discoverExtensionsInDir(resolved);
486
+ const discovered = await discoverExtensionsInDir(resolved);
465
487
  if (discovered.length > 0) {
466
488
  addPaths(discovered);
467
489
  }
@@ -1,14 +1,13 @@
1
1
  /**
2
2
  * Extension runner - executes extensions and manages their lifecycle.
3
3
  */
4
-
5
4
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
6
5
  import type { ImageContent, Model } from "@oh-my-pi/pi-ai";
7
- import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
8
- import { type Theme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
9
- import type { SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
10
6
  import type { KeyId } from "@oh-my-pi/pi-tui";
11
7
  import { logger } from "@oh-my-pi/pi-utils";
8
+ import type { ModelRegistry } from "../../config/model-registry";
9
+ import { type Theme, theme } from "../../modes/theme/theme";
10
+ import type { SessionManager } from "../../session/session-manager";
12
11
  import type {
13
12
  BeforeAgentStartEvent,
14
13
  BeforeAgentStartEventResult,
@@ -98,9 +97,9 @@ const noOpUIContext: ExtensionUIContext = {
98
97
  get theme() {
99
98
  return theme;
100
99
  },
101
- getAllThemes: () => [],
102
- getTheme: () => undefined,
103
- setTheme: (_theme: string | Theme) => ({ success: false, error: "UI not available" }),
100
+ getAllThemes: () => Promise.resolve([]),
101
+ getTheme: () => Promise.resolve(undefined),
102
+ setTheme: (_theme: string | Theme) => Promise.resolve({ success: false, error: "UI not available" }),
104
103
  };
105
104
 
106
105
  export class ExtensionRunner {
@@ -184,7 +183,7 @@ export class ExtensionRunner {
184
183
  }
185
184
 
186
185
  getExtensionPaths(): string[] {
187
- return this.extensions.map((e) => e.path);
186
+ return this.extensions.map(e => e.path);
188
187
  }
189
188
 
190
189
  /** Get all registered tools from all extensions. */
@@ -313,7 +312,7 @@ export class ExtensionRunner {
313
312
  return {
314
313
  ui: this.uiContext,
315
314
  getContextUsage: () => this.getContextUsageFn(),
316
- compact: (instructionsOrOptions) => this.compactFn(instructionsOrOptions),
315
+ compact: instructionsOrOptions => this.compactFn(instructionsOrOptions),
317
316
  hasUI: this.hasUI(),
318
317
  cwd: this.cwd,
319
318
  sessionManager: this.sessionManager,
@@ -341,10 +340,10 @@ export class ExtensionRunner {
341
340
  ...this.createContext(),
342
341
  getContextUsage: () => this.getContextUsageFn(),
343
342
  waitForIdle: () => this.waitForIdleFn(),
344
- newSession: (options) => this.newSessionHandler(options),
345
- branch: (entryId) => this.branchHandler(entryId),
343
+ newSession: options => this.newSessionHandler(options),
344
+ branch: entryId => this.branchHandler(entryId),
346
345
  navigateTree: (targetId, options) => this.navigateTreeHandler(targetId, options),
347
- compact: (instructionsOrOptions) => this.compactFn(instructionsOrOptions),
346
+ compact: instructionsOrOptions => this.compactFn(instructionsOrOptions),
348
347
  };
349
348
  }
350
349
 
@@ -7,39 +7,32 @@
7
7
  * - Register commands, keyboard shortcuts, and CLI flags
8
8
  * - Interact with the user via UI primitives
9
9
  */
10
-
11
10
  import type { AgentMessage, AgentToolResult, AgentToolUpdateCallback, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
12
11
  import type { ImageContent, Model, TextContent, ToolResultMessage } from "@oh-my-pi/pi-ai";
13
- import type { KeybindingsManager } from "@oh-my-pi/pi-coding-agent/config/keybindings";
14
- import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
15
- import type { BashResult } from "@oh-my-pi/pi-coding-agent/exec/bash-executor";
16
- import type { ExecOptions, ExecResult } from "@oh-my-pi/pi-coding-agent/exec/exec";
17
- import type * as piCodingAgent from "@oh-my-pi/pi-coding-agent/index";
18
- import type { PythonResult } from "@oh-my-pi/pi-coding-agent/ipy/executor";
19
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
20
- import type { EditToolDetails } from "@oh-my-pi/pi-coding-agent/patch";
21
- import type { CompactionPreparation, CompactionResult } from "@oh-my-pi/pi-coding-agent/session/compaction";
22
- import type { CustomMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
12
+ import type * as piCodingAgent from "@oh-my-pi/pi-coding-agent";
13
+ import type { AutocompleteItem, Component, EditorComponent, EditorTheme, KeyId, TUI } from "@oh-my-pi/pi-tui";
14
+ import type { Static, TSchema } from "@sinclair/typebox";
15
+ import type { KeybindingsManager } from "../../config/keybindings";
16
+ import type { ModelRegistry } from "../../config/model-registry";
17
+ import type { BashResult } from "../../exec/bash-executor";
18
+ import type { ExecOptions, ExecResult } from "../../exec/exec";
19
+ import type { PythonResult } from "../../ipy/executor";
20
+ import type { Theme } from "../../modes/theme/theme";
21
+ import type { EditToolDetails } from "../../patch";
22
+ import type { CompactionPreparation, CompactionResult } from "../../session/compaction";
23
+ import type { CustomMessage } from "../../session/messages";
23
24
  import type {
24
25
  BranchSummaryEntry,
25
26
  CompactionEntry,
26
27
  ReadonlySessionManager,
27
28
  SessionEntry,
28
29
  SessionManager,
29
- } from "@oh-my-pi/pi-coding-agent/session/session-manager";
30
- import type {
31
- BashToolDetails,
32
- FindToolDetails,
33
- GrepToolDetails,
34
- LsToolDetails,
35
- ReadToolDetails,
36
- } from "@oh-my-pi/pi-coding-agent/tools";
37
- import type { EventBus } from "@oh-my-pi/pi-coding-agent/utils/event-bus";
38
- import type { AutocompleteItem, Component, EditorComponent, EditorTheme, KeyId, TUI } from "@oh-my-pi/pi-tui";
39
- import type { Static, TSchema } from "@sinclair/typebox";
30
+ } from "../../session/session-manager";
31
+ import type { BashToolDetails, FindToolDetails, GrepToolDetails, LsToolDetails, ReadToolDetails } from "../../tools";
32
+ import type { EventBus } from "../../utils/event-bus";
40
33
 
41
- export type { AppAction, KeybindingsManager } from "@oh-my-pi/pi-coding-agent/config/keybindings";
42
- export type { ExecOptions, ExecResult } from "@oh-my-pi/pi-coding-agent/exec/exec";
34
+ export type { AppAction, KeybindingsManager } from "../../config/keybindings";
35
+ export type { ExecOptions, ExecResult } from "../../exec/exec";
43
36
  export type { AgentToolResult, AgentToolUpdateCallback };
44
37
 
45
38
  // ============================================================================
@@ -118,13 +111,13 @@ export interface ExtensionUIContext {
118
111
  readonly theme: Theme;
119
112
 
120
113
  /** Get all available themes with names and paths. */
121
- getAllThemes(): { name: string; path: string | undefined }[];
114
+ getAllThemes(): Promise<{ name: string; path: string | undefined }[]>;
122
115
 
123
116
  /** Load a theme by name without switching to it. */
124
- getTheme(name: string): Theme | undefined;
117
+ getTheme(name: string): Promise<Theme | undefined>;
125
118
 
126
119
  /** Set the current theme by name or Theme object. */
127
- setTheme(theme: string | Theme): { success: boolean; error?: string };
120
+ setTheme(theme: string | Theme): Promise<{ success: boolean; error?: string }>;
128
121
  }
129
122
 
130
123
  // ============================================================================
@@ -1,11 +1,10 @@
1
1
  /**
2
2
  * Tool wrappers for extensions.
3
3
  */
4
-
5
4
  import type { AgentTool, AgentToolContext, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
6
5
  import type { ImageContent, TextContent } from "@oh-my-pi/pi-ai";
7
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
8
6
  import type { Static, TSchema } from "@sinclair/typebox";
7
+ import type { Theme } from "../../modes/theme/theme";
9
8
  import type { ExtensionRunner } from "./runner";
10
9
  import type { RegisteredTool, ToolCallEventResult, ToolResultEventResult } from "./types";
11
10
 
@@ -63,7 +62,7 @@ export function wrapRegisteredTool(registeredTool: RegisteredTool, runner: Exten
63
62
  * Wrap all registered tools into AgentTools.
64
63
  */
65
64
  export function wrapRegisteredTools(registeredTools: RegisteredTool[], runner: ExtensionRunner): AgentTool[] {
66
- return registeredTools.map((rt) => wrapRegisteredTool(rt, runner));
65
+ return registeredTools.map(rt => wrapRegisteredTool(rt, runner));
67
66
  }
68
67
 
69
68
  /**
@@ -156,7 +155,7 @@ export class ExtensionToolWrapper<TParameters extends TSchema = TSchema, TDetail
156
155
  if (resultResult.isError === true && !executionError) {
157
156
  // Extension marks a successful result as error
158
157
  const textBlocks = (modifiedContent ?? []).filter((c): c is TextContent => c.type === "text");
159
- const errorText = textBlocks.map((t) => t.text).join("\n") || "Tool result marked as error by extension";
158
+ const errorText = textBlocks.map(t => t.text).join("\n") || "Tool result marked as error by extension";
160
159
  throw new Error(errorText);
161
160
  }
162
161
  if (resultResult.isError === false && executionError) {
@@ -1,5 +1,5 @@
1
1
  // biome-ignore assist/source/organizeImports: biome is not smart
2
- export type { ReadonlySessionManager, UsageStatistics } from "@oh-my-pi/pi-coding-agent/session/session-manager";
2
+ export type { ReadonlySessionManager, UsageStatistics } from "../../session/session-manager";
3
3
  export {
4
4
  discoverAndLoadHooks,
5
5
  loadHooks,
@@ -1,17 +1,16 @@
1
1
  /**
2
2
  * Hook loader - loads TypeScript hook modules using native Bun import.
3
3
  */
4
-
5
4
  import * as path from "node:path";
6
- import { hookCapability } from "@oh-my-pi/pi-coding-agent/capability/hook";
7
- import type { Hook } from "@oh-my-pi/pi-coding-agent/discovery";
8
- import { loadCapability } from "@oh-my-pi/pi-coding-agent/discovery";
9
- import { expandPath } from "@oh-my-pi/pi-coding-agent/discovery/helpers";
10
- import * as piCodingAgent from "@oh-my-pi/pi-coding-agent/index";
11
- import type { HookMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
12
- import type { SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
5
+ import * as piCodingAgent from "@oh-my-pi/pi-coding-agent";
13
6
  import { logger } from "@oh-my-pi/pi-utils";
14
7
  import * as typebox from "@sinclair/typebox";
8
+ import { hookCapability } from "../../capability/hook";
9
+ import type { Hook } from "../../discovery";
10
+ import { loadCapability } from "../../discovery";
11
+ import { expandPath } from "../../discovery/helpers";
12
+ import type { HookMessage } from "../../session/messages";
13
+ import type { SessionManager } from "../../session/session-manager";
15
14
  import { execCommand } from "./runner";
16
15
  import type { ExecOptions, HookAPI, HookFactory, HookMessageRenderer, RegisteredCommand } from "./types";
17
16
 
@@ -265,10 +264,10 @@ export async function discoverAndLoadHooks(configuredPaths: string[], cwd: strin
265
264
 
266
265
  // 1. Discover hooks via capability API
267
266
  const discovered = await loadCapability<Hook>(hookCapability.id, { cwd });
268
- addPaths(discovered.items.map((hook) => hook.path));
267
+ addPaths(discovered.items.map(hook => hook.path));
269
268
 
270
269
  // 2. Explicitly configured paths (can override/add)
271
- addPaths(configuredPaths.map((p) => resolveHookPath(p, cwd)));
270
+ addPaths(configuredPaths.map(p => resolveHookPath(p, cwd)));
272
271
 
273
272
  return loadHooks(allPaths, cwd);
274
273
  }
@@ -1,12 +1,11 @@
1
1
  /**
2
2
  * Hook runner - executes hooks and manages their lifecycle.
3
3
  */
4
-
5
4
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
6
5
  import type { Model } from "@oh-my-pi/pi-ai";
7
- import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
8
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
9
- import type { SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
6
+ import type { ModelRegistry } from "../../config/model-registry";
7
+ import { theme } from "../../modes/theme/theme";
8
+ import type { SessionManager } from "../../session/session-manager";
10
9
  import type {
11
10
  AppendEntryHandler,
12
11
  BranchHandler,
@@ -40,7 +39,7 @@ import type {
40
39
  export type HookErrorListener = (error: HookError) => void;
41
40
 
42
41
  // Re-export execCommand for backward compatibility
43
- export { execCommand } from "@oh-my-pi/pi-coding-agent/exec/exec";
42
+ export { execCommand } from "../../exec/exec";
44
43
 
45
44
  /** No-op UI context used when no UI is available */
46
45
  const noOpUIContext: HookUIContext = {
@@ -159,7 +158,7 @@ export class HookRunner {
159
158
  * Get the paths of all loaded hooks.
160
159
  */
161
160
  getHookPaths(): string[] {
162
- return this.hooks.map((h) => h.path);
161
+ return this.hooks.map(h => h.path);
163
162
  }
164
163
 
165
164
  /**
@@ -262,8 +261,8 @@ export class HookRunner {
262
261
  return {
263
262
  ...this.createContext(),
264
263
  waitForIdle: () => this.waitForIdleFn(),
265
- newSession: (options) => this.newSessionHandler(options),
266
- branch: (entryId) => this.branchHandler(entryId),
264
+ newSession: options => this.newSessionHandler(options),
265
+ branch: entryId => this.branchHandler(entryId),
267
266
  navigateTree: (targetId, options) => this.navigateTreeHandler(targetId, options),
268
267
  };
269
268
  }
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * Tool wrapper - wraps tools with hook callbacks for interception.
3
3
  */
4
-
5
4
  import type { AgentTool, AgentToolContext, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
6
5
  import type { Static, TSchema } from "@sinclair/typebox";
7
6
  import type { HookRunner } from "./runner";
@@ -4,33 +4,26 @@
4
4
  * Hooks are TypeScript modules that can subscribe to agent lifecycle events
5
5
  * and interact with the user via UI primitives.
6
6
  */
7
-
8
7
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
9
8
  import type { ImageContent, Message, Model, TextContent, ToolResultMessage } from "@oh-my-pi/pi-ai";
10
- import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
11
- import type { ExecOptions, ExecResult } from "@oh-my-pi/pi-coding-agent/exec/exec";
12
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
13
- import type { EditToolDetails } from "@oh-my-pi/pi-coding-agent/patch";
14
- import type { CompactionPreparation, CompactionResult } from "@oh-my-pi/pi-coding-agent/session/compaction/index";
15
- import type { HookMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
9
+ import type { Component, TUI } from "@oh-my-pi/pi-tui";
10
+ import type { ModelRegistry } from "../../config/model-registry";
11
+ import type { ExecOptions, ExecResult } from "../../exec/exec";
12
+ import type { Theme } from "../../modes/theme/theme";
13
+ import type { EditToolDetails } from "../../patch";
14
+ import type { CompactionPreparation, CompactionResult } from "../../session/compaction";
15
+ import type { HookMessage } from "../../session/messages";
16
16
  import type {
17
17
  BranchSummaryEntry,
18
18
  CompactionEntry,
19
19
  ReadonlySessionManager,
20
20
  SessionEntry,
21
21
  SessionManager,
22
- } from "@oh-my-pi/pi-coding-agent/session/session-manager";
23
- import type {
24
- BashToolDetails,
25
- FindToolDetails,
26
- GrepToolDetails,
27
- LsToolDetails,
28
- ReadToolDetails,
29
- } from "@oh-my-pi/pi-coding-agent/tools/index";
30
- import type { Component, TUI } from "@oh-my-pi/pi-tui";
22
+ } from "../../session/session-manager";
23
+ import type { BashToolDetails, FindToolDetails, GrepToolDetails, LsToolDetails, ReadToolDetails } from "../../tools";
31
24
 
32
25
  // Re-export for backward compatibility
33
- export type { ExecOptions, ExecResult } from "@oh-my-pi/pi-coding-agent/exec/exec";
26
+ export type { ExecOptions, ExecResult } from "../../exec/exec";
34
27
 
35
28
  /**
36
29
  * UI context for hooks to request interactive UI from the harness.
@@ -752,7 +745,7 @@ export interface HookAPI {
752
745
  /** Injected @sinclair/typebox module */
753
746
  typebox: typeof import("@sinclair/typebox");
754
747
  /** Injected pi-coding-agent exports */
755
- pi: typeof import("../../index");
748
+ pi: typeof import("../..");
756
749
  }
757
750
 
758
751
  /**
@@ -1,4 +1,4 @@
1
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
1
+ import { theme } from "../../modes/theme/theme";
2
2
  import type { DoctorCheck } from "./types";
3
3
 
4
4
  export async function runDoctorChecks(): Promise<DoctorCheck[]> {
@@ -57,8 +57,8 @@ export function formatDoctorResults(checks: DoctorCheck[]): string {
57
57
  lines.push(`${icon} ${check.name}: ${check.message}`);
58
58
  }
59
59
 
60
- const errors = checks.filter((c) => c.status === "error").length;
61
- const warnings = checks.filter((c) => c.status === "warning").length;
60
+ const errors = checks.filter(c => c.status === "error").length;
61
+ const warnings = checks.filter(c => c.status === "warning").length;
62
62
 
63
63
  lines.push("");
64
64
  lines.push(`Summary: ${checks.length - errors - warnings} ok, ${warnings} warnings, ${errors} errors`);