@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
@@ -2,25 +2,24 @@
2
2
  * State manager for the Extension Control Center.
3
3
  * Handles data loading, tree building, filtering, and toggle persistence.
4
4
  */
5
-
6
- import type { ContextFile } from "@oh-my-pi/pi-coding-agent/capability/context-file";
7
- import type { ExtensionModule } from "@oh-my-pi/pi-coding-agent/capability/extension-module";
8
- import type { Hook } from "@oh-my-pi/pi-coding-agent/capability/hook";
9
- import type { MCPServer } from "@oh-my-pi/pi-coding-agent/capability/mcp";
10
- import type { Prompt } from "@oh-my-pi/pi-coding-agent/capability/prompt";
11
- import type { Rule } from "@oh-my-pi/pi-coding-agent/capability/rule";
12
- import type { Skill } from "@oh-my-pi/pi-coding-agent/capability/skill";
13
- import type { SlashCommand } from "@oh-my-pi/pi-coding-agent/capability/slash-command";
14
- import type { CustomTool } from "@oh-my-pi/pi-coding-agent/capability/tool";
15
- import type { SourceMeta } from "@oh-my-pi/pi-coding-agent/capability/types";
5
+ import { logger } from "@oh-my-pi/pi-utils";
6
+ import type { ContextFile } from "../../../capability/context-file";
7
+ import type { ExtensionModule } from "../../../capability/extension-module";
8
+ import type { Hook } from "../../../capability/hook";
9
+ import type { MCPServer } from "../../../capability/mcp";
10
+ import type { Prompt } from "../../../capability/prompt";
11
+ import type { Rule } from "../../../capability/rule";
12
+ import type { Skill } from "../../../capability/skill";
13
+ import type { SlashCommand } from "../../../capability/slash-command";
14
+ import type { CustomTool } from "../../../capability/tool";
15
+ import type { SourceMeta } from "../../../capability/types";
16
16
  import {
17
17
  disableProvider,
18
18
  enableProvider,
19
19
  getAllProvidersInfo,
20
20
  isProviderEnabled,
21
21
  loadCapability,
22
- } from "@oh-my-pi/pi-coding-agent/discovery";
23
- import { logger } from "@oh-my-pi/pi-utils";
22
+ } from "../../../discovery";
24
23
  import type {
25
24
  DashboardState,
26
25
  Extension,
@@ -103,8 +102,8 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
103
102
  try {
104
103
  const skills = await loadCapability<Skill>("skills", loadOpts);
105
104
  addItems(skills.all, "skill", {
106
- getDescription: (s) => s.frontmatter?.description,
107
- getTrigger: (s) => s.frontmatter?.globs?.join(", "),
105
+ getDescription: s => s.frontmatter?.description,
106
+ getTrigger: s => s.frontmatter?.globs?.join(", "),
108
107
  });
109
108
  } catch (error) {
110
109
  logger.warn("Failed to load skills capability", { error: String(error) });
@@ -114,8 +113,8 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
114
113
  try {
115
114
  const rules = await loadCapability<Rule>("rules", loadOpts);
116
115
  addItems(rules.all, "rule", {
117
- getDescription: (r) => r.description,
118
- getTrigger: (r) => r.globs?.join(", ") || (r.alwaysApply ? "always" : undefined),
116
+ getDescription: r => r.description,
117
+ getTrigger: r => r.globs?.join(", ") || (r.alwaysApply ? "always" : undefined),
119
118
  });
120
119
  } catch (error) {
121
120
  logger.warn("Failed to load rules capability", { error: String(error) });
@@ -125,7 +124,7 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
125
124
  try {
126
125
  const tools = await loadCapability<CustomTool>("tools", loadOpts);
127
126
  addItems(tools.all, "tool", {
128
- getDescription: (t) => t.description,
127
+ getDescription: t => t.description,
129
128
  });
130
129
  } catch (error) {
131
130
  logger.warn("Failed to load tools capability", { error: String(error) });
@@ -134,7 +133,7 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
134
133
  // Load extension modules
135
134
  try {
136
135
  const modules = await loadCapability<ExtensionModule>("extension-modules", loadOpts);
137
- const nativeModules = modules.all.filter((module) => module._source.provider === "native");
136
+ const nativeModules = modules.all.filter(module => module._source.provider === "native");
138
137
  addItems(nativeModules, "extension-module");
139
138
  } catch (error) {
140
139
  logger.warn("Failed to load extension-modules capability", { error: String(error) });
@@ -188,7 +187,7 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
188
187
  const prompts = await loadCapability<Prompt>("prompts", loadOpts);
189
188
  addItems(prompts.all, "prompt", {
190
189
  getDescription: () => undefined,
191
- getTrigger: (p) => `/prompts:${p.name}`,
190
+ getTrigger: p => `/prompts:${p.name}`,
192
191
  });
193
192
  } catch (error) {
194
193
  logger.warn("Failed to load prompts capability", { error: String(error) });
@@ -199,7 +198,7 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
199
198
  const commands = await loadCapability<SlashCommand>("slash-commands", loadOpts);
200
199
  addItems(commands.all, "slash-command", {
201
200
  getDescription: () => undefined,
202
- getTrigger: (c) => `/${c.name}`,
201
+ getTrigger: c => `/${c.name}`,
203
202
  });
204
203
  } catch (error) {
205
204
  logger.warn("Failed to load slash-commands capability", { error: String(error) });
@@ -396,7 +395,7 @@ export function applyFilter(extensions: Extension[], query: string): Extension[]
396
395
  return extensions;
397
396
  }
398
397
 
399
- return extensions.filter((ext) => {
398
+ return extensions.filter(ext => {
400
399
  const searchable = [
401
400
  ext.name,
402
401
  ext.displayName,
@@ -408,7 +407,7 @@ export function applyFilter(extensions: Extension[], query: string): Extension[]
408
407
  .join(" ")
409
408
  .toLowerCase();
410
409
 
411
- return tokens.every((token) => searchable.includes(token));
410
+ return tokens.every(token => searchable.includes(token));
412
411
  });
413
412
  }
414
413
 
@@ -506,7 +505,7 @@ export function filterByProvider(extensions: Extension[], providerId: string): E
506
505
  if (providerId === "all") {
507
506
  return extensions;
508
507
  }
509
- return extensions.filter((ext) => ext.source.provider === providerId);
508
+ return extensions.filter(ext => ext.source.provider === providerId);
510
509
  }
511
510
 
512
511
  /**
@@ -564,12 +563,12 @@ export async function refreshState(
564
563
  const searchFiltered = applyFilter(tabFiltered, state.searchQuery);
565
564
 
566
565
  // Find new index for current provider (tabs may have reordered)
567
- const newActiveTabIndex = tabs.findIndex((t) => t.id === providerId);
566
+ const newActiveTabIndex = tabs.findIndex(t => t.id === providerId);
568
567
  const activeTabIndex = newActiveTabIndex >= 0 ? newActiveTabIndex : 0;
569
568
 
570
569
  // Try to preserve selection
571
570
  const selectedId = state.selected?.id;
572
- let selected = selectedId ? searchFiltered.find((e) => e.id === selectedId) : null;
571
+ let selected = selectedId ? searchFiltered.find(e => e.id === selectedId) : null;
573
572
  if (!selected && searchFiltered.length > 0) {
574
573
  selected = searchFiltered[Math.min(state.listIndex, searchFiltered.length - 1)];
575
574
  }
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * Types for the Extension Control Center dashboard.
3
3
  */
4
-
5
- import type { SourceMeta } from "@oh-my-pi/pi-coding-agent/capability/types";
4
+ import type { SourceMeta } from "../../../capability/types";
6
5
 
7
6
  /**
8
7
  * Extension kinds matching capability types.
@@ -1,10 +1,11 @@
1
- import { existsSync, type FSWatcher, readFileSync, watch } from "node:fs";
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
2
3
  import type { AssistantMessage } from "@oh-my-pi/pi-ai";
3
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
4
- import type { AgentSession } from "@oh-my-pi/pi-coding-agent/session/agent-session";
5
- import { shortenPath } from "@oh-my-pi/pi-coding-agent/tools/render-utils";
6
4
  import { type Component, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
7
- import { dirname, join } from "path";
5
+ import { isEnoent } from "@oh-my-pi/pi-utils";
6
+ import { theme } from "../../modes/theme/theme";
7
+ import type { AgentSession } from "../../session/agent-session";
8
+ import { shortenPath } from "../../tools/render-utils";
8
9
 
9
10
  /**
10
11
  * Sanitize text for display in a single-line status.
@@ -18,20 +19,19 @@ function sanitizeStatusText(text: string): string {
18
19
  .trim();
19
20
  }
20
21
 
21
- /**
22
- * Find the git root directory by walking up from cwd.
23
- * Returns the path to .git/HEAD if found, null otherwise.
24
- */
25
- function findGitHeadPath(): string | null {
22
+ /** Find the git root by walking up from cwd. Returns path and content of .git/HEAD if found. */
23
+ async function findGitHeadPath(): Promise<{ path: string; content: string } | null> {
26
24
  let dir = process.cwd();
27
25
  while (true) {
28
- const gitHeadPath = join(dir, ".git", "HEAD");
29
- if (existsSync(gitHeadPath)) {
30
- return gitHeadPath;
26
+ const gitHeadPath = path.join(dir, ".git", "HEAD");
27
+ try {
28
+ const content = await Bun.file(gitHeadPath).text();
29
+ return { path: gitHeadPath, content };
30
+ } catch (err) {
31
+ if (!isEnoent(err)) throw err;
31
32
  }
32
- const parent = dirname(dir);
33
+ const parent = path.dirname(dir);
33
34
  if (parent === dir) {
34
- // Reached filesystem root
35
35
  return null;
36
36
  }
37
37
  dir = parent;
@@ -44,7 +44,7 @@ function findGitHeadPath(): string | null {
44
44
  export class FooterComponent implements Component {
45
45
  private session: AgentSession;
46
46
  private cachedBranch: string | null | undefined = undefined; // undefined = not checked yet, null = not in git repo, string = branch name
47
- private gitWatcher: FSWatcher | null = null;
47
+ private gitWatcher: fs.FSWatcher | null = null;
48
48
  private onBranchChange: (() => void) | null = null;
49
49
  private autoCompactEnabled: boolean = true;
50
50
  private extensionStatuses: Map<string, string> = new Map();
@@ -88,21 +88,22 @@ export class FooterComponent implements Component {
88
88
  this.gitWatcher = null;
89
89
  }
90
90
 
91
- const gitHeadPath = findGitHeadPath();
92
- if (!gitHeadPath) {
93
- return;
94
- }
91
+ findGitHeadPath().then(result => {
92
+ if (!result) {
93
+ return;
94
+ }
95
95
 
96
- try {
97
- this.gitWatcher = watch(gitHeadPath, () => {
98
- this.cachedBranch = undefined; // Invalidate cache
99
- if (this.onBranchChange) {
100
- this.onBranchChange();
101
- }
102
- });
103
- } catch {
104
- // Silently fail if we can't watch
105
- }
96
+ try {
97
+ this.gitWatcher = fs.watch(result.path, () => {
98
+ this.cachedBranch = undefined; // Invalidate cache
99
+ if (this.onBranchChange) {
100
+ this.onBranchChange();
101
+ }
102
+ });
103
+ } catch {
104
+ // Silently fail if we can't watch
105
+ }
106
+ });
106
107
  }
107
108
 
108
109
  /**
@@ -130,27 +131,30 @@ export class FooterComponent implements Component {
130
131
  return this.cachedBranch;
131
132
  }
132
133
 
133
- try {
134
- const gitHeadPath = findGitHeadPath();
135
- if (!gitHeadPath) {
134
+ // Note: fire-and-forget async call - will return undefined on first call
135
+ // This is acceptable since it's a cached value that will update on next render
136
+ findGitHeadPath().then(result => {
137
+ if (!result) {
136
138
  this.cachedBranch = null;
137
- return null;
139
+ if (this.onBranchChange) {
140
+ this.onBranchChange();
141
+ }
142
+ return;
138
143
  }
139
- const content = readFileSync(gitHeadPath, "utf8").trim();
144
+ const content = result.content.trim();
140
145
 
141
146
  if (content.startsWith("ref: refs/heads/")) {
142
- // Normal branch: extract branch name
143
147
  this.cachedBranch = content.slice(16);
144
148
  } else {
145
- // Detached HEAD state
146
149
  this.cachedBranch = "detached";
147
150
  }
148
- } catch {
149
- // Not in a git repo or error reading file
150
- this.cachedBranch = null;
151
- }
151
+ if (this.onBranchChange) {
152
+ this.onBranchChange();
153
+ }
154
+ });
152
155
 
153
- return this.cachedBranch;
156
+ // Return undefined while loading (will show on next render once loaded)
157
+ return null;
154
158
  }
155
159
 
156
160
  render(width: number): string[] {
@@ -177,7 +181,7 @@ export class FooterComponent implements Component {
177
181
  const lastAssistantMessage = state.messages
178
182
  .slice()
179
183
  .reverse()
180
- .find((m) => m.role === "assistant" && m.stopReason !== "aborted") as AssistantMessage | undefined;
184
+ .find(m => m.role === "assistant" && m.stopReason !== "aborted") as AssistantMessage | undefined;
181
185
 
182
186
  // Calculate context percentage from last message (input + output + cacheRead + cacheWrite)
183
187
  const contextTokens = lastAssistantMessage
@@ -1,5 +1,3 @@
1
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
2
- import type { HistoryEntry, HistoryStorage } from "@oh-my-pi/pi-coding-agent/session/history-storage";
3
1
  import {
4
2
  type Component,
5
3
  Container,
@@ -10,6 +8,8 @@ import {
10
8
  truncateToWidth,
11
9
  visibleWidth,
12
10
  } from "@oh-my-pi/pi-tui";
11
+ import { theme } from "../../modes/theme/theme";
12
+ import type { HistoryEntry, HistoryStorage } from "../../session/history-storage";
13
13
  import { DynamicBorder } from "./dynamic-border";
14
14
 
15
15
  class HistoryResultsList implements Component {
@@ -2,13 +2,12 @@
2
2
  * Multi-line editor component for hooks.
3
3
  * Supports Ctrl+G for external editor.
4
4
  */
5
-
6
- import { rm } from "node:fs/promises";
5
+ import * as fs from "node:fs/promises";
7
6
  import * as os from "node:os";
8
7
  import * as path from "node:path";
9
- import { getEditorTheme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
10
8
  import { Container, Editor, matchesKey, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
11
9
  import { nanoid } from "nanoid";
10
+ import { getEditorTheme, theme } from "../../modes/theme/theme";
12
11
  import { DynamicBorder } from "./dynamic-border";
13
12
 
14
13
  export class HookEditorComponent extends Container {
@@ -110,7 +109,7 @@ export class HookEditorComponent extends Container {
110
109
  }
111
110
  } finally {
112
111
  try {
113
- await rm(tmpFile, { force: true });
112
+ await fs.rm(tmpFile, { force: true });
114
113
  } catch {
115
114
  // Ignore cleanup errors
116
115
  }
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * Simple text input component for hooks.
3
3
  */
4
-
5
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
6
4
  import { Container, Input, matchesKey, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
5
+ import { theme } from "../../modes/theme/theme";
7
6
  import { CountdownTimer } from "./countdown-timer";
8
7
  import { DynamicBorder } from "./dynamic-border";
9
8
 
@@ -44,7 +43,7 @@ export class HookInputComponent extends Container {
44
43
  this.countdown = new CountdownTimer(
45
44
  opts.timeout,
46
45
  opts.tui,
47
- (s) => this.titleText.setText(theme.fg("accent", `${this.baseTitle} (${s}s)`)),
46
+ s => this.titleText.setText(theme.fg("accent", `${this.baseTitle} (${s}s)`)),
48
47
  () => this.onCancelCallback(),
49
48
  );
50
49
  }
@@ -1,9 +1,9 @@
1
1
  import type { TextContent } from "@oh-my-pi/pi-ai";
2
- import type { HookMessageRenderer } from "@oh-my-pi/pi-coding-agent/extensibility/hooks/types";
3
- import { getMarkdownTheme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
4
- import type { HookMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
5
2
  import type { Component } from "@oh-my-pi/pi-tui";
6
3
  import { Box, Container, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
4
+ import type { HookMessageRenderer } from "../../extensibility/hooks/types";
5
+ import { getMarkdownTheme, theme } from "../../modes/theme/theme";
6
+ import type { HookMessage } from "../../session/messages";
7
7
 
8
8
  /**
9
9
  * Component that renders a custom message entry from hooks.
@@ -24,7 +24,7 @@ export class HookMessageComponent extends Container {
24
24
  this.addChild(new Spacer(1));
25
25
 
26
26
  // Create box with purple background (used for default rendering)
27
- this.box = new Box(1, 1, (t) => theme.bg("customMessageBg", t));
27
+ this.box = new Box(1, 1, t => theme.bg("customMessageBg", t));
28
28
 
29
29
  this.rebuild();
30
30
  }
@@ -80,7 +80,7 @@ export class HookMessageComponent extends Container {
80
80
  } else {
81
81
  text = this.message.content
82
82
  .filter((c): c is TextContent => c.type === "text")
83
- .map((c) => c.text)
83
+ .map(c => c.text)
84
84
  .join("\n");
85
85
  }
86
86
 
@@ -2,9 +2,8 @@
2
2
  * Generic selector component for hooks.
3
3
  * Displays a list of string options with keyboard navigation.
4
4
  */
5
-
6
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
7
5
  import { Container, matchesKey, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
6
+ import { theme } from "../../modes/theme/theme";
8
7
  import { CountdownTimer } from "./countdown-timer";
9
8
  import { DynamicBorder } from "./dynamic-border";
10
9
 
@@ -50,7 +49,7 @@ export class HookSelectorComponent extends Container {
50
49
  this.countdown = new CountdownTimer(
51
50
  opts.timeout,
52
51
  opts.tui,
53
- (s) => this.titleText.setText(theme.fg("accent", `${this.baseTitle} (${s}s)`)),
52
+ s => this.titleText.setText(theme.fg("accent", `${this.baseTitle} (${s}s)`)),
54
53
  () => this.onCancelCallback(),
55
54
  );
56
55
  }
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * Utilities for formatting keybinding hints in the UI.
3
3
  */
4
-
5
- import type { AppAction, KeybindingsManager } from "@oh-my-pi/pi-coding-agent/config/keybindings";
6
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
7
4
  import { type EditorAction, getEditorKeybindings, type KeyId } from "@oh-my-pi/pi-tui";
5
+ import type { AppAction, KeybindingsManager } from "../../config/keybindings";
6
+ import { theme } from "../../modes/theme/theme";
8
7
 
9
8
  /**
10
9
  * Format keys array as display string (e.g., ["ctrl+c", "escape"] -> "ctrl+c/escape").
@@ -1,7 +1,7 @@
1
1
  import { getOAuthProviders } from "@oh-my-pi/pi-ai";
2
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
3
2
  import { Container, getEditorKeybindings, Input, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
4
3
  import { $ } from "bun";
4
+ import { theme } from "../../modes/theme/theme";
5
5
  import { DynamicBorder } from "./dynamic-border";
6
6
 
7
7
  /**
@@ -23,7 +23,7 @@ export class LoginDialogComponent extends Container {
23
23
  super();
24
24
  this.tui = tui;
25
25
 
26
- const providerInfo = getOAuthProviders().find((p) => p.id === providerId);
26
+ const providerInfo = getOAuthProviders().find(p => p.id === providerId);
27
27
  const providerName = providerInfo?.name || providerId;
28
28
 
29
29
  // Top border
@@ -1,9 +1,4 @@
1
1
  import { type Model, modelsAreEqual } from "@oh-my-pi/pi-ai";
2
- import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
3
- import { parseModelString } from "@oh-my-pi/pi-coding-agent/config/model-resolver";
4
- import type { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
5
- import { type ThemeColor, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
6
- import { fuzzyFilter } from "@oh-my-pi/pi-coding-agent/utils/fuzzy";
7
2
  import {
8
3
  Container,
9
4
  Input,
@@ -16,6 +11,11 @@ import {
16
11
  type TUI,
17
12
  visibleWidth,
18
13
  } from "@oh-my-pi/pi-tui";
14
+ import type { ModelRegistry } from "../../config/model-registry";
15
+ import { parseModelString } from "../../config/model-resolver";
16
+ import type { SettingsManager } from "../../config/settings-manager";
17
+ import { type ThemeColor, theme } from "../../modes/theme/theme";
18
+ import { fuzzyFilter } from "../../utils/fuzzy";
19
19
  import { DynamicBorder } from "./dynamic-border";
20
20
 
21
21
  function makeInvertedBadge(label: string, color: ThemeColor): string {
@@ -190,7 +190,7 @@ export class ModelSelectorComponent extends Container {
190
190
  if (defaultStr) {
191
191
  const parsed = parseModelString(defaultStr);
192
192
  if (parsed) {
193
- this.defaultModel = allModels.find((m) => m.provider === parsed.provider && m.id === parsed.id);
193
+ this.defaultModel = allModels.find(m => m.provider === parsed.provider && m.id === parsed.id);
194
194
  }
195
195
  }
196
196
 
@@ -199,7 +199,7 @@ export class ModelSelectorComponent extends Container {
199
199
  if (smolStr) {
200
200
  const parsed = parseModelString(smolStr);
201
201
  if (parsed) {
202
- this.smolModel = allModels.find((m) => m.provider === parsed.provider && m.id === parsed.id);
202
+ this.smolModel = allModels.find(m => m.provider === parsed.provider && m.id === parsed.id);
203
203
  }
204
204
  }
205
205
 
@@ -208,7 +208,7 @@ export class ModelSelectorComponent extends Container {
208
208
  if (slowStr) {
209
209
  const parsed = parseModelString(slowStr);
210
210
  if (parsed) {
211
- this.slowModel = allModels.find((m) => m.provider === parsed.provider && m.id === parsed.id);
211
+ this.slowModel = allModels.find(m => m.provider === parsed.provider && m.id === parsed.id);
212
212
  }
213
213
  }
214
214
  }
@@ -218,7 +218,7 @@ export class ModelSelectorComponent extends Container {
218
218
 
219
219
  // Use scoped models if provided via --models flag
220
220
  if (this.scopedModels.length > 0) {
221
- models = this.scopedModels.map((scoped) => ({
221
+ models = this.scopedModels.map(scoped => ({
222
222
  provider: scoped.model.provider,
223
223
  id: scoped.model.id,
224
224
  model: scoped.model,
@@ -279,7 +279,7 @@ export class ModelSelectorComponent extends Container {
279
279
  private updateTabBar(): void {
280
280
  this.headerContainer.clear();
281
281
 
282
- const tabs: Tab[] = this.providers.map((provider) => ({ id: provider, label: provider }));
282
+ const tabs: Tab[] = this.providers.map(provider => ({ id: provider, label: provider }));
283
283
  const tabBar = new TabBar("Models", tabs, getTabBarTheme(), this.activeTabIndex);
284
284
  tabBar.onTabChange = (_tab, index) => {
285
285
  this.activeTabIndex = index;
@@ -300,7 +300,7 @@ export class ModelSelectorComponent extends Container {
300
300
  // Start with all models or filter by provider
301
301
  let baseModels = this.allModels;
302
302
  if (activeProvider !== ALL_TAB) {
303
- baseModels = this.allModels.filter((m) => m.provider.toUpperCase() === activeProvider);
303
+ baseModels = this.allModels.filter(m => m.provider.toUpperCase() === activeProvider);
304
304
  }
305
305
 
306
306
  // Apply fuzzy filter if query is present
@@ -426,7 +426,7 @@ export class ModelSelectorComponent extends Container {
426
426
  const menuWidth = Math.max(
427
427
  visibleWidth(headerText),
428
428
  visibleWidth(hintText),
429
- ...actionLines.map((line) => visibleWidth(line)),
429
+ ...actionLines.map(line => visibleWidth(line)),
430
430
  );
431
431
 
432
432
  // Menu header
@@ -1,7 +1,7 @@
1
1
  import { getOAuthProviders, type OAuthProviderInfo } from "@oh-my-pi/pi-ai";
2
- import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
3
- import type { AuthStorage } from "@oh-my-pi/pi-coding-agent/session/auth-storage";
4
2
  import { Container, matchesKey, Spacer, TruncatedText } from "@oh-my-pi/pi-tui";
3
+ import { theme } from "../../modes/theme/theme";
4
+ import type { AuthStorage } from "../../session/auth-storage";
5
5
  import { DynamicBorder } from "./dynamic-border";
6
6
 
7
7
  /**