@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
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Jupyter CLI command handlers.
3
+ *
4
+ * Handles `omp jupyter` subcommand for managing the shared Python gateway.
5
+ */
6
+ import chalk from "chalk";
7
+ import { APP_NAME } from "../config";
8
+ import { getGatewayStatus, shutdownSharedGateway } from "../ipy/gateway-coordinator";
9
+
10
+ export type JupyterAction = "kill" | "status";
11
+
12
+ export interface JupyterCommandArgs {
13
+ action: JupyterAction;
14
+ }
15
+
16
+ export function parseJupyterArgs(args: string[]): JupyterCommandArgs | undefined {
17
+ if (args.length === 0 || args[0] !== "jupyter") {
18
+ return undefined;
19
+ }
20
+
21
+ const action = args[1] as JupyterAction | undefined;
22
+ if (!action || !["kill", "status"].includes(action)) {
23
+ return { action: "status" };
24
+ }
25
+
26
+ return { action };
27
+ }
28
+
29
+ export async function runJupyterCommand(cmd: JupyterCommandArgs): Promise<void> {
30
+ switch (cmd.action) {
31
+ case "kill":
32
+ await runKill();
33
+ break;
34
+ case "status":
35
+ await runStatus();
36
+ break;
37
+ }
38
+ }
39
+
40
+ async function runKill(): Promise<void> {
41
+ const status = await getGatewayStatus();
42
+
43
+ if (!status.active) {
44
+ console.log(chalk.dim("No Jupyter gateway is running"));
45
+ return;
46
+ }
47
+
48
+ console.log(`Killing Jupyter gateway (PID ${status.pid})...`);
49
+ await shutdownSharedGateway();
50
+ console.log(chalk.green("Jupyter gateway stopped"));
51
+ }
52
+
53
+ async function runStatus(): Promise<void> {
54
+ const status = await getGatewayStatus();
55
+
56
+ if (!status.active) {
57
+ console.log(chalk.dim("No Jupyter gateway is running"));
58
+ return;
59
+ }
60
+
61
+ console.log(chalk.bold("Jupyter Gateway Status\n"));
62
+ console.log(` ${chalk.green("●")} Running`);
63
+ console.log(` PID: ${status.pid}`);
64
+ console.log(` URL: ${status.url}`);
65
+ if (status.uptime !== null) {
66
+ console.log(` Uptime: ${formatUptime(status.uptime)}`);
67
+ }
68
+ if (status.pythonPath) {
69
+ console.log(` Python: ${status.pythonPath}`);
70
+ }
71
+ if (status.venvPath) {
72
+ console.log(` Venv: ${status.venvPath}`);
73
+ }
74
+ }
75
+
76
+ function formatUptime(ms: number): string {
77
+ const seconds = Math.floor(ms / 1000);
78
+ const minutes = Math.floor(seconds / 60);
79
+ const hours = Math.floor(minutes / 60);
80
+
81
+ if (hours > 0) {
82
+ return `${hours}h ${minutes % 60}m`;
83
+ }
84
+ if (minutes > 0) {
85
+ return `${minutes}m ${seconds % 60}s`;
86
+ }
87
+ return `${seconds}s`;
88
+ }
89
+
90
+ export function printJupyterHelp(): void {
91
+ console.log(`${chalk.bold(`${APP_NAME} jupyter`)} - Manage the shared Jupyter gateway
92
+
93
+ ${chalk.bold("Usage:")}
94
+ ${APP_NAME} jupyter <command>
95
+
96
+ ${chalk.bold("Commands:")}
97
+ status Show gateway status (default)
98
+ kill Stop the running gateway
99
+
100
+ ${chalk.bold("Examples:")}
101
+ ${APP_NAME} jupyter # Show status
102
+ ${APP_NAME} jupyter status # Show status
103
+ ${APP_NAME} jupyter kill # Stop the gateway
104
+ `);
105
+ }
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * List available models with optional fuzzy search
3
3
  */
4
-
5
4
  import type { Api, Model } from "@oh-my-pi/pi-ai";
6
- import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
7
- import { fuzzyFilter } from "@oh-my-pi/pi-coding-agent/utils/fuzzy";
5
+ import type { ModelRegistry } from "../config/model-registry";
6
+ import { fuzzyFilter } from "../utils/fuzzy";
8
7
 
9
8
  /**
10
9
  * Format a number as human-readable (e.g., 200000 -> "200K", 1000000 -> "1M")
@@ -35,7 +34,7 @@ export async function listModels(modelRegistry: ModelRegistry, searchPattern?: s
35
34
  // Apply fuzzy filter if search pattern provided
36
35
  let filteredModels: Model<Api>[] = models;
37
36
  if (searchPattern) {
38
- filteredModels = fuzzyFilter(models, searchPattern, (m) => `${m.provider} ${m.id}`);
37
+ filteredModels = fuzzyFilter(models, searchPattern, m => `${m.provider} ${m.id}`);
39
38
  }
40
39
 
41
40
  if (filteredModels.length === 0) {
@@ -51,7 +50,7 @@ export async function listModels(modelRegistry: ModelRegistry, searchPattern?: s
51
50
  });
52
51
 
53
52
  // Calculate column widths
54
- const rows = filteredModels.map((m) => ({
53
+ const rows = filteredModels.map(m => ({
55
54
  provider: m.provider,
56
55
  model: m.id,
57
56
  context: formatTokenCount(m.contextWindow),
@@ -70,12 +69,12 @@ export async function listModels(modelRegistry: ModelRegistry, searchPattern?: s
70
69
  };
71
70
 
72
71
  const widths = {
73
- provider: Math.max(headers.provider.length, ...rows.map((r) => r.provider.length)),
74
- model: Math.max(headers.model.length, ...rows.map((r) => r.model.length)),
75
- context: Math.max(headers.context.length, ...rows.map((r) => r.context.length)),
76
- maxOut: Math.max(headers.maxOut.length, ...rows.map((r) => r.maxOut.length)),
77
- thinking: Math.max(headers.thinking.length, ...rows.map((r) => r.thinking.length)),
78
- images: Math.max(headers.images.length, ...rows.map((r) => r.images.length)),
72
+ provider: Math.max(headers.provider.length, ...rows.map(r => r.provider.length)),
73
+ model: Math.max(headers.model.length, ...rows.map(r => r.model.length)),
74
+ context: Math.max(headers.context.length, ...rows.map(r => r.context.length)),
75
+ maxOut: Math.max(headers.maxOut.length, ...rows.map(r => r.maxOut.length)),
76
+ thinking: Math.max(headers.thinking.length, ...rows.map(r => r.thinking.length)),
77
+ images: Math.max(headers.images.length, ...rows.map(r => r.images.length)),
79
78
  };
80
79
 
81
80
  // Print header
@@ -3,15 +3,10 @@
3
3
  *
4
4
  * Handles `omp plugin <command>` subcommands for plugin lifecycle management.
5
5
  */
6
-
7
- import { APP_NAME } from "@oh-my-pi/pi-coding-agent/config";
8
- import {
9
- PluginManager,
10
- parseSettingValue,
11
- validateSetting,
12
- } from "@oh-my-pi/pi-coding-agent/extensibility/plugins/index";
13
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
14
6
  import chalk from "chalk";
7
+ import { APP_NAME } from "../config";
8
+ import { PluginManager, parseSettingValue, validateSetting } from "../extensibility/plugins";
9
+ import { theme } from "../modes/theme/theme";
15
10
 
16
11
  // =============================================================================
17
12
  // Types
@@ -251,7 +246,7 @@ async function handleList(manager: PluginManager, flags: { json?: boolean }): Pr
251
246
  if (availableFeatures.length > 0) {
252
247
  const enabledSet = new Set(plugin.enabledFeatures ?? []);
253
248
  const featureDisplay = availableFeatures
254
- .map((f) => (enabledSet.has(f) ? chalk.green(f) : chalk.dim(f)))
249
+ .map(f => (enabledSet.has(f) ? chalk.green(f) : chalk.dim(f)))
255
250
  .join(", ");
256
251
  console.log(chalk.dim(` Available: [${featureDisplay}]`));
257
252
  }
@@ -302,10 +297,10 @@ async function handleDoctor(manager: PluginManager, flags: { json?: boolean; fix
302
297
  }
303
298
  }
304
299
 
305
- const errors = checks.filter((c) => c.status === "error" && !c.fixed).length;
306
- const warnings = checks.filter((c) => c.status === "warning" && !c.fixed).length;
307
- const ok = checks.filter((c) => c.status === "ok").length;
308
- const fixed = checks.filter((c) => c.fixed).length;
300
+ const errors = checks.filter(c => c.status === "error" && !c.fixed).length;
301
+ const warnings = checks.filter(c => c.status === "warning" && !c.fixed).length;
302
+ const ok = checks.filter(c => c.status === "ok").length;
303
+ const fixed = checks.filter(c => c.fixed).length;
309
304
 
310
305
  console.log("");
311
306
  console.log(`Summary: ${ok} ok, ${warnings} warnings, ${errors} errors${fixed > 0 ? `, ${fixed} fixed` : ""}`);
@@ -332,7 +327,7 @@ async function handleFeatures(
332
327
 
333
328
  const pluginName = args[0];
334
329
  const plugins = await manager.list();
335
- const plugin = plugins.find((p) => p.name === pluginName);
330
+ const plugin = plugins.find(p => p.name === pluginName);
336
331
 
337
332
  if (!plugin) {
338
333
  console.error(chalk.red(`Plugin "${pluginName}" not found`));
@@ -341,21 +336,21 @@ async function handleFeatures(
341
336
 
342
337
  // Handle modifications
343
338
  if (flags.enable || flags.disable || flags.set) {
344
- let currentFeatures = new Set(manager.getEnabledFeatures(pluginName) ?? []);
339
+ let currentFeatures = new Set((await manager.getEnabledFeatures(pluginName)) ?? []);
345
340
 
346
341
  if (flags.set) {
347
342
  // --set replaces all features
348
343
  currentFeatures = new Set(
349
344
  flags.set
350
345
  .split(",")
351
- .map((f) => f.trim())
346
+ .map(f => f.trim())
352
347
  .filter(Boolean),
353
348
  );
354
349
  } else {
355
350
  if (flags.enable) {
356
351
  for (const f of flags.enable
357
352
  .split(",")
358
- .map((f) => f.trim())
353
+ .map(f => f.trim())
359
354
  .filter(Boolean)) {
360
355
  currentFeatures.add(f);
361
356
  }
@@ -363,7 +358,7 @@ async function handleFeatures(
363
358
  if (flags.disable) {
364
359
  for (const f of flags.disable
365
360
  .split(",")
366
- .map((f) => f.trim())
361
+ .map(f => f.trim())
367
362
  .filter(Boolean)) {
368
363
  currentFeatures.delete(f);
369
364
  }
@@ -375,7 +370,7 @@ async function handleFeatures(
375
370
  }
376
371
 
377
372
  // Display current state
378
- const updatedFeatures = manager.getEnabledFeatures(pluginName);
373
+ const updatedFeatures = await manager.getEnabledFeatures(pluginName);
379
374
 
380
375
  if (flags.json) {
381
376
  console.log(
@@ -437,7 +432,7 @@ async function handleConfig(
437
432
  }
438
433
 
439
434
  const plugins = await manager.list();
440
- const plugin = plugins.find((p) => p.name === pluginName);
435
+ const plugin = plugins.find(p => p.name === pluginName);
441
436
 
442
437
  if (!plugin) {
443
438
  console.error(chalk.red(`Plugin "${pluginName}" not found`));
@@ -446,7 +441,7 @@ async function handleConfig(
446
441
 
447
442
  switch (subcommand) {
448
443
  case "list": {
449
- const settings = manager.getPluginSettings(pluginName);
444
+ const settings = await manager.getPluginSettings(pluginName);
450
445
  const schema = plugin.manifest.settings || {};
451
446
 
452
447
  if (flags.json) {
@@ -481,7 +476,7 @@ async function handleConfig(
481
476
  process.exit(1);
482
477
  }
483
478
 
484
- const settings = manager.getPluginSettings(pluginName);
479
+ const settings = await manager.getPluginSettings(pluginName);
485
480
  const schema = plugin.manifest.settings?.[key];
486
481
  const value = settings[key] ?? schema?.default;
487
482
 
@@ -516,7 +511,7 @@ async function handleConfig(
516
511
  }
517
512
  }
518
513
 
519
- manager.setPluginSetting(pluginName, key, value);
514
+ await manager.setPluginSetting(pluginName, key, value);
520
515
  console.log(chalk.green(`${theme.status.success} Set ${key}`));
521
516
  break;
522
517
  }
@@ -527,7 +522,7 @@ async function handleConfig(
527
522
  process.exit(1);
528
523
  }
529
524
 
530
- manager.deletePluginSetting(pluginName, key);
525
+ await manager.deletePluginSetting(pluginName, key);
531
526
  console.log(chalk.green(`${theme.status.success} Deleted ${key}`));
532
527
  break;
533
528
  }
@@ -544,7 +539,7 @@ async function handleConfigValidate(manager: PluginManager, flags: { json?: bool
544
539
  const results: Array<{ plugin: string; key: string; error: string }> = [];
545
540
 
546
541
  for (const plugin of plugins) {
547
- const settings = manager.getPluginSettings(plugin.name);
542
+ const settings = await manager.getPluginSettings(plugin.name);
548
543
  const schema = plugin.manifest.settings || {};
549
544
 
550
545
  for (const [key, s] of Object.entries(schema)) {
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * TUI session selector for --resume flag
3
3
  */
4
-
5
- import { SessionSelectorComponent } from "@oh-my-pi/pi-coding-agent/modes/components/session-selector";
6
- import type { SessionInfo } from "@oh-my-pi/pi-coding-agent/session/session-manager";
7
4
  import { ProcessTerminal, TUI } from "@oh-my-pi/pi-tui";
5
+ import { SessionSelectorComponent } from "../modes/components/session-selector";
6
+ import type { SessionInfo } from "../session/session-manager";
8
7
 
9
8
  /** Show TUI session selector and return selected session path or null if cancelled */
10
9
  export async function selectSession(sessions: SessionInfo[]): Promise<string | null> {
@@ -3,11 +3,10 @@
3
3
  *
4
4
  * Handles `omp setup <component>` to install dependencies for optional features.
5
5
  */
6
-
7
- import { APP_NAME } from "@oh-my-pi/pi-coding-agent/config";
8
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
9
6
  import { $ } from "bun";
10
7
  import chalk from "chalk";
8
+ import { APP_NAME } from "../config";
9
+ import { theme } from "../modes/theme/theme";
11
10
 
12
11
  export type SetupComponent = "python";
13
12
 
@@ -3,9 +3,8 @@
3
3
  *
4
4
  * Handles `omp stats` subcommand for viewing AI usage statistics.
5
5
  */
6
-
7
- import { APP_NAME } from "@oh-my-pi/pi-coding-agent/config";
8
6
  import chalk from "chalk";
7
+ import { APP_NAME } from "../config";
9
8
 
10
9
  // =============================================================================
11
10
  // Types
@@ -106,7 +105,7 @@ export async function runStatsCommand(cmd: StatsCommandArgs): Promise<void> {
106
105
  }
107
106
 
108
107
  // Start the dashboard server
109
- const { port } = startServer(cmd.port);
108
+ const { port } = await startServer(cmd.port);
110
109
  console.log(chalk.green(`Dashboard available at: http://localhost:${port}`));
111
110
  console.log("Press Ctrl+C to stop\n");
112
111
 
@@ -4,15 +4,15 @@
4
4
  * Handles `omp update` to check for and install updates.
5
5
  * Uses bun if available, otherwise downloads binary from GitHub releases.
6
6
  */
7
-
8
7
  import { execSync, spawnSync } from "node:child_process";
9
- import { createWriteStream, existsSync, renameSync, unlinkSync } from "node:fs";
10
- import { dirname } from "node:path";
8
+ import * as fs from "node:fs";
9
+ import * as path from "node:path";
11
10
  import { Readable } from "node:stream";
12
11
  import { pipeline } from "node:stream/promises";
13
- import { APP_NAME, VERSION } from "@oh-my-pi/pi-coding-agent/config";
14
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
12
+ import { isEnoent } from "@oh-my-pi/pi-utils";
15
13
  import chalk from "chalk";
14
+ import { APP_NAME, VERSION } from "../config";
15
+ import { theme } from "../modes/theme/theme";
16
16
 
17
17
  /**
18
18
  * Detect if we're running as a Bun compiled binary.
@@ -73,7 +73,7 @@ async function getLatestRelease(): Promise<ReleaseInfo> {
73
73
  return {
74
74
  tag: data.tag_name,
75
75
  version: data.tag_name.replace(/^v/, ""),
76
- assets: data.assets.map((a) => ({ name: a.name, url: a.browser_download_url })),
76
+ assets: data.assets.map(a => ({ name: a.name, url: a.browser_download_url })),
77
77
  };
78
78
  }
79
79
 
@@ -154,14 +154,14 @@ async function updateViaBun(): Promise<void> {
154
154
  */
155
155
  async function updateViaBinary(release: ReleaseInfo): Promise<void> {
156
156
  const binaryName = getBinaryName();
157
- const asset = release.assets.find((a) => a.name === binaryName);
157
+ const asset = release.assets.find(a => a.name === binaryName);
158
158
 
159
159
  if (!asset) {
160
160
  throw new Error(`No binary found for ${binaryName}`);
161
161
  }
162
162
 
163
163
  const execPath = process.execPath;
164
- const _execDir = dirname(execPath);
164
+ const _execDir = path.dirname(execPath);
165
165
  const tempPath = `${execPath}.new`;
166
166
  const backupPath = `${execPath}.bak`;
167
167
 
@@ -173,7 +173,7 @@ async function updateViaBinary(release: ReleaseInfo): Promise<void> {
173
173
  throw new Error(`Download failed: ${response.statusText}`);
174
174
  }
175
175
 
176
- const fileStream = createWriteStream(tempPath, { mode: 0o755 });
176
+ const fileStream = fs.createWriteStream(tempPath, { mode: 0o755 });
177
177
  const nodeStream = Readable.fromWeb(response.body as import("stream/web").ReadableStream);
178
178
  await pipeline(nodeStream, fileStream);
179
179
 
@@ -181,27 +181,30 @@ async function updateViaBinary(release: ReleaseInfo): Promise<void> {
181
181
  console.log(chalk.dim("Installing update..."));
182
182
 
183
183
  try {
184
- // Backup current binary
185
- if (existsSync(backupPath)) {
186
- unlinkSync(backupPath);
184
+ try {
185
+ await fs.promises.unlink(backupPath);
186
+ } catch (err) {
187
+ if (!isEnoent(err)) throw err;
187
188
  }
188
- renameSync(execPath, backupPath);
189
+ await fs.promises.rename(execPath, backupPath);
189
190
 
190
- // Move new binary into place
191
- renameSync(tempPath, execPath);
191
+ await fs.promises.rename(tempPath, execPath);
192
192
 
193
- // Clean up backup
194
- unlinkSync(backupPath);
193
+ await fs.promises.unlink(backupPath);
195
194
 
196
195
  console.log(chalk.green(`\n${theme.status.success} Updated to ${release.version}`));
197
196
  console.log(chalk.dim(`Restart ${APP_NAME} to use the new version`));
198
197
  } catch (err) {
199
- // Restore from backup if possible
200
- if (existsSync(backupPath) && !existsSync(execPath)) {
201
- renameSync(backupPath, execPath);
198
+ const [backupExists, execExists, tempExists] = await Promise.all([
199
+ Bun.file(backupPath).exists(),
200
+ Bun.file(execPath).exists(),
201
+ Bun.file(tempPath).exists(),
202
+ ]);
203
+ if (backupExists && !execExists) {
204
+ await fs.promises.rename(backupPath, execPath);
202
205
  }
203
- if (existsSync(tempPath)) {
204
- unlinkSync(tempPath);
206
+ if (tempExists) {
207
+ await fs.promises.unlink(tempPath);
205
208
  }
206
209
  throw err;
207
210
  }