@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
@@ -5,9 +5,8 @@
5
5
  * - `omp -p "prompt"` - text output
6
6
  * - `omp --mode json "prompt"` - JSON event stream
7
7
  */
8
-
9
8
  import type { AssistantMessage, ImageContent } from "@oh-my-pi/pi-ai";
10
- import type { AgentSession } from "@oh-my-pi/pi-coding-agent/session/agent-session";
9
+ import type { AgentSession } from "../session/agent-session";
11
10
 
12
11
  /**
13
12
  * Options for print mode.
@@ -44,12 +43,12 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
44
43
  // ExtensionActions
45
44
  {
46
45
  sendMessage: (message, options) => {
47
- session.sendCustomMessage(message, options).catch((e) => {
46
+ session.sendCustomMessage(message, options).catch(e => {
48
47
  process.stderr.write(`Extension sendMessage failed: ${e instanceof Error ? e.message : String(e)}\n`);
49
48
  });
50
49
  },
51
50
  sendUserMessage: (content, options) => {
52
- session.sendUserMessage(content, options).catch((e) => {
51
+ session.sendUserMessage(content, options).catch(e => {
53
52
  process.stderr.write(
54
53
  `Extension sendUserMessage failed: ${e instanceof Error ? e.message : String(e)}\n`,
55
54
  );
@@ -64,14 +63,14 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
64
63
  getActiveTools: () => session.getActiveToolNames(),
65
64
  getAllTools: () => session.getAllToolNames(),
66
65
  setActiveTools: (toolNames: string[]) => session.setActiveToolsByName(toolNames),
67
- setModel: async (model) => {
66
+ setModel: async model => {
68
67
  const key = await session.modelRegistry.getApiKey(model);
69
68
  if (!key) return false;
70
69
  await session.setModel(model);
71
70
  return true;
72
71
  },
73
72
  getThinkingLevel: () => session.thinkingLevel,
74
- setThinkingLevel: (level) => session.setThinkingLevel(level),
73
+ setThinkingLevel: level => session.setThinkingLevel(level),
75
74
  },
76
75
  // ExtensionContextActions
77
76
  {
@@ -81,7 +80,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
81
80
  hasPendingMessages: () => session.queuedMessageCount > 0,
82
81
  shutdown: () => {},
83
82
  getContextUsage: () => session.getContextUsage(),
84
- compact: async (instructionsOrOptions) => {
83
+ compact: async instructionsOrOptions => {
85
84
  const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
86
85
  const options =
87
86
  instructionsOrOptions && typeof instructionsOrOptions === "object"
@@ -94,14 +93,14 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
94
93
  {
95
94
  getContextUsage: () => session.getContextUsage(),
96
95
  waitForIdle: () => session.agent.waitForIdle(),
97
- newSession: async (options) => {
96
+ newSession: async options => {
98
97
  const success = await session.newSession({ parentSession: options?.parentSession });
99
98
  if (success && options?.setup) {
100
99
  await options.setup(session.sessionManager);
101
100
  }
102
101
  return { cancelled: !success };
103
102
  },
104
- branch: async (entryId) => {
103
+ branch: async entryId => {
105
104
  const result = await session.branch(entryId);
106
105
  return { cancelled: result.cancelled };
107
106
  },
@@ -109,7 +108,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
109
108
  const result = await session.navigateTree(targetId, { summarize: options?.summarize });
110
109
  return { cancelled: result.cancelled };
111
110
  },
112
- compact: async (instructionsOrOptions) => {
111
+ compact: async instructionsOrOptions => {
113
112
  const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
114
113
  const options =
115
114
  instructionsOrOptions && typeof instructionsOrOptions === "object"
@@ -120,7 +119,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
120
119
  },
121
120
  // No UI context
122
121
  );
123
- extensionRunner.onError((err) => {
122
+ extensionRunner.onError(err => {
124
123
  process.stderr.write(`Extension error (${err.extensionPath}): ${err.error}\n`);
125
124
  });
126
125
  // Emit session_start event
@@ -130,7 +129,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
130
129
  }
131
130
 
132
131
  // Always subscribe to enable session persistence via _handleAgentEvent
133
- session.subscribe((event) => {
132
+ session.subscribe(event => {
134
133
  // In JSON mode, output all events
135
134
  if (mode === "json") {
136
135
  process.stdout.write(`${JSON.stringify(event)}\n`);
@@ -173,7 +172,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
173
172
  // Ensure stdout is fully flushed before returning
174
173
  // This prevents race conditions where the process exits before all output is written
175
174
  await new Promise<void>((resolve, reject) => {
176
- process.stdout.write("", (err) => {
175
+ process.stdout.write("", err => {
177
176
  if (err) reject(err);
178
177
  else resolve();
179
178
  });
@@ -3,13 +3,12 @@
3
3
  *
4
4
  * Spawns the agent in RPC mode and provides a typed API for all operations.
5
5
  */
6
-
7
6
  import type { AgentEvent, AgentMessage, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
8
7
  import type { ImageContent } from "@oh-my-pi/pi-ai";
9
- import type { BashResult } from "@oh-my-pi/pi-coding-agent/exec/bash-executor";
10
- import type { SessionStats } from "@oh-my-pi/pi-coding-agent/session/agent-session";
11
- import type { CompactionResult } from "@oh-my-pi/pi-coding-agent/session/compaction/index";
12
8
  import { createSanitizerStream, createSplitterStream, createTextDecoderStream, ptree } from "@oh-my-pi/pi-utils";
9
+ import type { BashResult } from "../../exec/bash-executor";
10
+ import type { SessionStats } from "../../session/agent-session";
11
+ import type { CompactionResult } from "../../session/compaction";
13
12
  import type { RpcCommand, RpcResponse, RpcSessionState } from "./rpc-types";
14
13
 
15
14
  /** Distributive Omit that works with union types */
@@ -372,7 +371,7 @@ export class RpcClient {
372
371
  waitForIdle(timeout = 60000): Promise<void> {
373
372
  const { promise, resolve, reject } = Promise.withResolvers<void>();
374
373
  let settled = false;
375
- const unsubscribe = this.onEvent((event) => {
374
+ const unsubscribe = this.onEvent(event => {
376
375
  if (event.type === "agent_end") {
377
376
  settled = true;
378
377
  unsubscribe();
@@ -397,7 +396,7 @@ export class RpcClient {
397
396
  const { promise, resolve, reject } = Promise.withResolvers<AgentEvent[]>();
398
397
  const events: AgentEvent[] = [];
399
398
  let settled = false;
400
- const unsubscribe = this.onEvent((event) => {
399
+ const unsubscribe = this.onEvent(event => {
401
400
  events.push(event);
402
401
  if (event.type === "agent_end") {
403
402
  settled = true;
@@ -470,12 +469,12 @@ export class RpcClient {
470
469
  })();
471
470
 
472
471
  this.pendingRequests.set(id, {
473
- resolve: (response) => {
472
+ resolve: response => {
474
473
  if (settled) return;
475
474
  settled = true;
476
475
  resolve(response);
477
476
  },
478
- reject: (error) => {
477
+ reject: error => {
479
478
  if (settled) return;
480
479
  settled = true;
481
480
  reject(error);
@@ -10,15 +10,11 @@
10
10
  * - Events: AgentSessionEvent objects streamed as they occur
11
11
  * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response
12
12
  */
13
-
14
- import type {
15
- ExtensionUIContext,
16
- ExtensionUIDialogOptions,
17
- } from "@oh-my-pi/pi-coding-agent/extensibility/extensions/index";
18
- import { type Theme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
19
- import type { AgentSession } from "@oh-my-pi/pi-coding-agent/session/agent-session";
20
13
  import { readLines } from "@oh-my-pi/pi-utils";
21
14
  import { nanoid } from "nanoid";
15
+ import type { ExtensionUIContext, ExtensionUIDialogOptions } from "../../extensibility/extensions";
16
+ import { type Theme, theme } from "../../modes/theme/theme";
17
+ import type { AgentSession } from "../../session/agent-session";
22
18
  import type {
23
19
  RpcCommand,
24
20
  RpcExtensionUIRequest,
@@ -128,7 +124,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
128
124
  dialogOptions,
129
125
  undefined,
130
126
  { method: "select", title, options, timeout: dialogOptions?.timeout },
131
- (response) =>
127
+ response =>
132
128
  "cancelled" in response && response.cancelled
133
129
  ? undefined
134
130
  : "value" in response
@@ -142,7 +138,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
142
138
  dialogOptions,
143
139
  false,
144
140
  { method: "confirm", title, message, timeout: dialogOptions?.timeout },
145
- (response) =>
141
+ response =>
146
142
  "cancelled" in response && response.cancelled
147
143
  ? false
148
144
  : "confirmed" in response
@@ -160,7 +156,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
160
156
  dialogOptions,
161
157
  undefined,
162
158
  { method: "input", title, placeholder, timeout: dialogOptions?.timeout },
163
- (response) =>
159
+ response =>
164
160
  "cancelled" in response && response.cancelled
165
161
  ? undefined
166
162
  : "value" in response
@@ -274,17 +270,17 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
274
270
  return theme;
275
271
  }
276
272
 
277
- getAllThemes(): { name: string; path: string | undefined }[] {
278
- return [];
273
+ getAllThemes(): Promise<{ name: string; path: string | undefined }[]> {
274
+ return Promise.resolve([]);
279
275
  }
280
276
 
281
- getTheme(_name: string): Theme | undefined {
282
- return undefined;
277
+ getTheme(_name: string): Promise<Theme | undefined> {
278
+ return Promise.resolve(undefined);
283
279
  }
284
280
 
285
- setTheme(_theme: string | Theme): { success: boolean; error?: string } {
281
+ setTheme(_theme: string | Theme): Promise<{ success: boolean; error?: string }> {
286
282
  // Theme switching not supported in RPC mode
287
- return { success: false, error: "Theme switching not supported in RPC mode" };
283
+ return Promise.resolve({ success: false, error: "Theme switching not supported in RPC mode" });
288
284
  }
289
285
 
290
286
  setEditorComponent(): void {
@@ -299,12 +295,12 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
299
295
  // ExtensionActions
300
296
  {
301
297
  sendMessage: (message, options) => {
302
- session.sendCustomMessage(message, options).catch((e) => {
298
+ session.sendCustomMessage(message, options).catch(e => {
303
299
  output(error(undefined, "extension_send", e.message));
304
300
  });
305
301
  },
306
302
  sendUserMessage: (content, options) => {
307
- session.sendUserMessage(content, options).catch((e) => {
303
+ session.sendUserMessage(content, options).catch(e => {
308
304
  output(error(undefined, "extension_send_user", e.message));
309
305
  });
310
306
  },
@@ -317,14 +313,14 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
317
313
  getActiveTools: () => session.getActiveToolNames(),
318
314
  getAllTools: () => session.getAllToolNames(),
319
315
  setActiveTools: (toolNames: string[]) => session.setActiveToolsByName(toolNames),
320
- setModel: async (model) => {
316
+ setModel: async model => {
321
317
  const key = await session.modelRegistry.getApiKey(model);
322
318
  if (!key) return false;
323
319
  await session.setModel(model);
324
320
  return true;
325
321
  },
326
322
  getThinkingLevel: () => session.thinkingLevel,
327
- setThinkingLevel: (level) => session.setThinkingLevel(level),
323
+ setThinkingLevel: level => session.setThinkingLevel(level),
328
324
  },
329
325
  // ExtensionContextActions
330
326
  {
@@ -336,7 +332,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
336
332
  shutdownState.requested = true;
337
333
  },
338
334
  getContextUsage: () => session.getContextUsage(),
339
- compact: async (instructionsOrOptions) => {
335
+ compact: async instructionsOrOptions => {
340
336
  const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
341
337
  const options =
342
338
  instructionsOrOptions && typeof instructionsOrOptions === "object"
@@ -349,7 +345,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
349
345
  {
350
346
  getContextUsage: () => session.getContextUsage(),
351
347
  waitForIdle: () => session.agent.waitForIdle(),
352
- newSession: async (options) => {
348
+ newSession: async options => {
353
349
  const success = await session.newSession({ parentSession: options?.parentSession });
354
350
  // Note: setup callback runs but no UI feedback in RPC mode
355
351
  if (success && options?.setup) {
@@ -357,7 +353,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
357
353
  }
358
354
  return { cancelled: !success };
359
355
  },
360
- branch: async (entryId) => {
356
+ branch: async entryId => {
361
357
  const result = await session.branch(entryId);
362
358
  return { cancelled: result.cancelled };
363
359
  },
@@ -365,7 +361,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
365
361
  const result = await session.navigateTree(targetId, { summarize: options?.summarize });
366
362
  return { cancelled: result.cancelled };
367
363
  },
368
- compact: async (instructionsOrOptions) => {
364
+ compact: async instructionsOrOptions => {
369
365
  const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
370
366
  const options =
371
367
  instructionsOrOptions && typeof instructionsOrOptions === "object"
@@ -376,7 +372,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
376
372
  },
377
373
  new RpcExtensionUIContext(pendingExtensionRequests, output),
378
374
  );
379
- extensionRunner.onError((err) => {
375
+ extensionRunner.onError(err => {
380
376
  output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
381
377
  });
382
378
  // Emit session_start event
@@ -386,7 +382,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
386
382
  }
387
383
 
388
384
  // Output all agent events as JSON
389
- session.subscribe((event) => {
385
+ session.subscribe(event => {
390
386
  output(event);
391
387
  });
392
388
 
@@ -408,7 +404,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
408
404
  images: command.images,
409
405
  streamingBehavior: command.streamingBehavior,
410
406
  })
411
- .catch((e) => output(error(id, "prompt", e.message)));
407
+ .catch(e => output(error(id, "prompt", e.message)));
412
408
  return success(id, "prompt");
413
409
  }
414
410
 
@@ -461,7 +457,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
461
457
 
462
458
  case "set_model": {
463
459
  const models = session.getAvailableModels();
464
- const model = models.find((m) => m.provider === command.provider && m.id === command.modelId);
460
+ const model = models.find(m => m.provider === command.provider && m.id === command.modelId);
465
461
  if (!model) {
466
462
  return error(id, "set_model", `Model not found: ${command.provider}/${command.modelId}`);
467
463
  }
@@ -4,12 +4,11 @@
4
4
  * Commands are sent as JSON lines on stdin.
5
5
  * Responses and events are emitted as JSON lines on stdout.
6
6
  */
7
-
8
7
  import type { AgentMessage, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
9
8
  import type { ImageContent, Model } from "@oh-my-pi/pi-ai";
10
- import type { BashResult } from "@oh-my-pi/pi-coding-agent/exec/bash-executor";
11
- import type { SessionStats } from "@oh-my-pi/pi-coding-agent/session/agent-session";
12
- import type { CompactionResult } from "@oh-my-pi/pi-coding-agent/session/compaction/index";
9
+ import type { BashResult } from "../../exec/bash-executor";
10
+ import type { SessionStats } from "../../session/agent-session";
11
+ import type { CompactionResult } from "../../session/compaction";
13
12
 
14
13
  // ============================================================================
15
14
  // RPC Commands (stdin)
@@ -0,0 +1,89 @@
1
+ import {
2
+ extractMermaidBlocks,
3
+ type MermaidImage,
4
+ type MermaidRenderOptions,
5
+ renderMermaidToPng,
6
+ } from "@oh-my-pi/pi-tui";
7
+
8
+ const cache = new Map<string, MermaidImage>();
9
+ const pending = new Map<string, Promise<MermaidImage | null>>();
10
+
11
+ const defaultOptions: MermaidRenderOptions = {
12
+ theme: "dark",
13
+ backgroundColor: "transparent",
14
+ };
15
+
16
+ let onRenderNeeded: (() => void) | null = null;
17
+
18
+ /**
19
+ * Set callback to trigger TUI re-render when mermaid images become available.
20
+ */
21
+ export function setMermaidRenderCallback(callback: (() => void) | null): void {
22
+ onRenderNeeded = callback;
23
+ }
24
+
25
+ /**
26
+ * Get a pre-rendered mermaid image by hash.
27
+ * Returns null if not cached or rendering failed.
28
+ */
29
+ export function getMermaidImage(hash: string): MermaidImage | null {
30
+ return cache.get(hash) ?? null;
31
+ }
32
+
33
+ /**
34
+ * Pre-render all mermaid blocks in markdown text.
35
+ * Renders in parallel, deduplicates concurrent requests.
36
+ * Calls render callback when new images are cached.
37
+ */
38
+ export async function prerenderMermaid(
39
+ markdown: string,
40
+ options: MermaidRenderOptions = defaultOptions,
41
+ ): Promise<void> {
42
+ const blocks = extractMermaidBlocks(markdown);
43
+ if (blocks.length === 0) return;
44
+
45
+ const promises: Promise<boolean>[] = [];
46
+
47
+ for (const { source, hash } of blocks) {
48
+ if (cache.has(hash)) continue;
49
+
50
+ let promise = pending.get(hash);
51
+ if (!promise) {
52
+ promise = renderMermaidToPng(source, options);
53
+ pending.set(hash, promise);
54
+ }
55
+
56
+ promises.push(
57
+ promise.then(image => {
58
+ pending.delete(hash);
59
+ if (image) {
60
+ cache.set(hash, image);
61
+ return true;
62
+ }
63
+ return false;
64
+ }),
65
+ );
66
+ }
67
+
68
+ const results = await Promise.all(promises);
69
+ const newImages = results.some(added => added);
70
+
71
+ if (newImages && onRenderNeeded) {
72
+ onRenderNeeded();
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Check if markdown contains mermaid blocks that aren't cached yet.
78
+ */
79
+ export function hasPendingMermaid(markdown: string): boolean {
80
+ const blocks = extractMermaidBlocks(markdown);
81
+ return blocks.some(({ hash }) => !cache.has(hash));
82
+ }
83
+
84
+ /**
85
+ * Clear the mermaid cache.
86
+ */
87
+ export function clearMermaidCache(): void {
88
+ cache.clear();
89
+ }