@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
@@ -103,9 +103,9 @@ export const handleOsv: SpecialHandler = async (
103
103
  }
104
104
 
105
105
  // Severity
106
- const severities = vuln.severity || vuln.affected?.flatMap((a) => a.severity || []) || [];
106
+ const severities = vuln.severity || vuln.affected?.flatMap(a => a.severity || []) || [];
107
107
  if (severities.length) {
108
- const formatted = severities.map((s) => `${s.type}: ${s.score}`).join(", ");
108
+ const formatted = severities.map(s => `${s.type}: ${s.score}`).join(", ");
109
109
  md += `**Severity:** ${formatted}\n`;
110
110
  }
111
111
  md += "\n";
@@ -121,7 +121,7 @@ export const handlePackagist: SpecialHandler = async (
121
121
 
122
122
  // Maintainers
123
123
  if (pkg.maintainers?.length) {
124
- md += `**Maintainers:** ${pkg.maintainers.map((m) => m.name).join(", ")}\n`;
124
+ md += `**Maintainers:** ${pkg.maintainers.map(m => m.name).join(", ")}\n`;
125
125
  }
126
126
 
127
127
  // Links
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * PubMed handler for web-fetch
3
3
  */
4
-
5
4
  import type { RenderResult, SpecialHandler } from "./types";
6
5
  import { finalizeOutput, loadPage } from "./types";
7
6
 
@@ -100,7 +99,7 @@ export const handlePubMed: SpecialHandler = async (
100
99
 
101
100
  // Authors
102
101
  if (article.authors && article.authors.length > 0) {
103
- const authorNames = article.authors.map((a) => a.name).join(", ");
102
+ const authorNames = article.authors.map(a => a.name).join(", ");
104
103
  md += `**Authors:** ${authorNames}\n`;
105
104
  }
106
105
 
@@ -58,10 +58,10 @@ export const handleRawg: SpecialHandler = async (
58
58
  md += `**Rating:** ${game.rating.toFixed(2)} / 5\n`;
59
59
  }
60
60
 
61
- const platforms = collectNames(game.platforms?.map((entry) => entry.platform?.name));
61
+ const platforms = collectNames(game.platforms?.map(entry => entry.platform?.name));
62
62
  if (platforms.length) md += `**Platforms:** ${platforms.join(", ")}\n`;
63
63
 
64
- const genres = collectNames(game.genres?.map((entry) => entry.name));
64
+ const genres = collectNames(game.genres?.map(entry => entry.name));
65
65
  if (genres.length) md += `**Genres:** ${genres.join(", ")}\n`;
66
66
 
67
67
  md += `**RAWG:** https://rawg.io/games/${encodeURIComponent(slug)}\n`;
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * Read the Docs handler for web-fetch
3
3
  */
4
-
5
4
  import { parse as parseHtml } from "node-html-parser";
6
5
  import type { RenderResult, SpecialHandler } from "./types";
7
6
  import { finalizeOutput, htmlToBasicMarkdown, loadPage } from "./types";
@@ -62,7 +61,7 @@ export const handleReadTheDocs: SpecialHandler = async (
62
61
  ?.querySelectorAll(
63
62
  ".headerlink, .viewcode-link, nav, .sidebar, footer, .related, .sphinxsidebar, .toctree-wrapper",
64
63
  )
65
- .forEach((el) => {
64
+ .forEach(el => {
66
65
  el.remove();
67
66
  });
68
67
 
@@ -95,7 +95,7 @@ function prettifyRepo(repo: string): string {
95
95
  // Fallback: titlecase with underscores replaced
96
96
  return repo
97
97
  .split("_")
98
- .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
98
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
99
99
  .join(" ");
100
100
  }
101
101
 
@@ -157,7 +157,7 @@ export const handleRepology: SpecialHandler = async (
157
157
 
158
158
  // If no newest found, find the highest version
159
159
  if (newestVersions.size === 0) {
160
- const versions = packages.map((p) => p.version);
160
+ const versions = packages.map(p => p.version);
161
161
  if (versions.length > 0) newestVersions.add(versions[0]);
162
162
  }
163
163
 
@@ -135,7 +135,7 @@ export const handleRfc: SpecialHandler = async (
135
135
  // Authors
136
136
  if (metadata.authors?.length) {
137
137
  const authorList = metadata.authors
138
- .map((a) => (a.affiliation ? `${a.name} (${a.affiliation})` : a.name))
138
+ .map(a => (a.affiliation ? `${a.name} (${a.affiliation})` : a.name))
139
139
  .join(", ");
140
140
  md += `**Authors:** ${authorList}\n`;
141
141
  }
@@ -27,12 +27,12 @@ function parseLineNumbers(lines: SearchcodeResult["lines"]): number[] | null {
27
27
 
28
28
  if (typeof lines === "string") {
29
29
  const parts = lines.split(/[,\s]+/).filter(Boolean);
30
- const parsed = parts.map((part) => Number.parseInt(part, 10)).filter((value) => Number.isFinite(value));
30
+ const parsed = parts.map(part => Number.parseInt(part, 10)).filter(value => Number.isFinite(value));
31
31
  return parsed.length ? parsed : null;
32
32
  }
33
33
 
34
34
  if (Array.isArray(lines)) {
35
- const parsed = lines.map((part) => Number.parseInt(String(part), 10)).filter((value) => Number.isFinite(value));
35
+ const parsed = lines.map(part => Number.parseInt(String(part), 10)).filter(value => Number.isFinite(value));
36
36
  return parsed.length ? parsed : null;
37
37
  }
38
38
 
@@ -114,7 +114,7 @@ export const handleSemanticScholar: SpecialHandler = async (url: string, timeout
114
114
  sections.push("");
115
115
 
116
116
  if (paper.authors && paper.authors.length > 0) {
117
- const authorList = paper.authors.map((a) => a.name).join(", ");
117
+ const authorList = paper.authors.map(a => a.name).join(", ");
118
118
  sections.push(`**Authors:** ${authorList}`);
119
119
  sections.push("");
120
120
  }
@@ -81,9 +81,9 @@ function formatChannelName(channel?: SnapcraftChannel): string | null {
81
81
  }
82
82
 
83
83
  function pickVersionFromChannels(entries: SnapcraftChannelMapEntry[]): string | undefined {
84
- const stable = entries.find((entry) => entry.channel?.risk === "stable" && entry.version);
84
+ const stable = entries.find(entry => entry.channel?.risk === "stable" && entry.version);
85
85
  if (stable?.version) return stable.version;
86
- const first = entries.find((entry) => entry.version);
86
+ const first = entries.find(entry => entry.version);
87
87
  return first?.version;
88
88
  }
89
89
 
@@ -129,7 +129,7 @@ function parseSourcegraphUrl(url: string): SourcegraphTarget | null {
129
129
  const parts = parsed.pathname
130
130
  .split("/")
131
131
  .filter(Boolean)
132
- .map((part) => decodeURIComponent(part));
132
+ .map(part => decodeURIComponent(part));
133
133
  if (parts.length < 3) return null;
134
134
 
135
135
  const hyphenIndex = parts.indexOf("-");
@@ -30,11 +30,11 @@ function formatYesNo(value?: boolean): string {
30
30
 
31
31
  function collectCrossReferences(license: SpdxLicense): string[] {
32
32
  const ordered = (license.crossRef ?? [])
33
- .filter((ref) => ref.url)
33
+ .filter(ref => ref.url)
34
34
  .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
35
- .map((ref) => ref.url as string);
35
+ .map(ref => ref.url as string);
36
36
 
37
- const seeAlso = (license.seeAlso ?? []).filter((url) => url);
37
+ const seeAlso = (license.seeAlso ?? []).filter(url => url);
38
38
  const combined = [...ordered, ...seeAlso];
39
39
  return combined.filter((url, index) => combined.indexOf(url) === index);
40
40
  }
@@ -4,7 +4,6 @@
4
4
  * Uses oEmbed API and Open Graph metadata to extract information
5
5
  * from Spotify URLs without requiring authentication.
6
6
  */
7
-
8
7
  import type { SpecialHandler } from "./types";
9
8
  import { finalizeOutput, loadPage } from "./types";
10
9
 
@@ -1,5 +1,5 @@
1
- import { ToolAbortError } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
2
1
  import { parse as parseHtml } from "node-html-parser";
2
+ import { ToolAbortError } from "../../tools/tool-errors";
3
3
  import type { RenderResult, SpecialHandler } from "./types";
4
4
  import { finalizeOutput, loadPage } from "./types";
5
5
 
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * Shared types and utilities for web-fetch handlers
3
3
  */
4
-
5
- import { ToolAbortError } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
4
+ import { ToolAbortError } from "../../tools/tool-errors";
6
5
 
7
6
  export interface RenderResult {
8
7
  url: string;
@@ -1,9 +1,9 @@
1
- import { rm } from "node:fs/promises";
2
- import { tmpdir } from "node:os";
1
+ import * as fs from "node:fs/promises";
2
+ import * as os from "node:os";
3
3
  import * as path from "node:path";
4
- import { ensureTool } from "@oh-my-pi/pi-coding-agent/utils/tools-manager";
5
4
  import { ptree } from "@oh-my-pi/pi-utils";
6
5
  import { nanoid } from "nanoid";
6
+ import { ensureTool } from "../../utils/tools-manager";
7
7
  import { createRequestSignal } from "./types";
8
8
 
9
9
  const MAX_BYTES = 50 * 1024 * 1024; // 50MB for binary files
@@ -40,7 +40,7 @@ export async function convertWithMarkitdown(
40
40
 
41
41
  // Write to temp file with extension hint
42
42
  const ext = extensionHint || ".bin";
43
- const tmpDir = tmpdir();
43
+ const tmpDir = os.tmpdir();
44
44
  const tmpFile = path.join(tmpDir, `omp-convert-${nanoid()}${ext}`);
45
45
 
46
46
  if (content.length > MAX_BYTES) {
@@ -61,7 +61,7 @@ export async function convertWithMarkitdown(
61
61
  return { content: stdout, ok: true };
62
62
  } finally {
63
63
  try {
64
- await rm(tmpFile, { force: true });
64
+ await fs.rm(tmpFile, { force: true });
65
65
  } catch {}
66
66
  }
67
67
  }
@@ -179,8 +179,8 @@ export const handleWikidata: SpecialHandler = async (
179
179
 
180
180
  // Sort: known properties first, then by property ID
181
181
  processedProperties.sort((a, b) => {
182
- const aKnown = Object.values(PROPERTY_LABELS).some((l) => a.includes(`**${l}:**`));
183
- const bKnown = Object.values(PROPERTY_LABELS).some((l) => b.includes(`**${l}:**`));
182
+ const aKnown = Object.values(PROPERTY_LABELS).some(l => a.includes(`**${l}:**`));
183
+ const bKnown = Object.values(PROPERTY_LABELS).some(l => b.includes(`**${l}:**`));
184
184
  if (aKnown && !bKnown) return -1;
185
185
  if (!aKnown && bKnown) return 1;
186
186
  return a.localeCompare(b);
@@ -254,7 +254,7 @@ function getLocalizedAliases(
254
254
  if (!aliases) return [];
255
255
  const langAliases = aliases[preferredLang];
256
256
  if (!langAliases) return [];
257
- return langAliases.map((a) => a.value);
257
+ return langAliases.map(a => a.value);
258
258
  }
259
259
 
260
260
  /**
@@ -1,10 +1,10 @@
1
- import { unlinkSync } from "node:fs";
2
- import { tmpdir } from "node:os";
1
+ import * as fs from "node:fs/promises";
2
+ import * as os from "node:os";
3
3
  import path from "node:path";
4
- import { throwIfAborted } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
5
- import { ensureTool } from "@oh-my-pi/pi-coding-agent/utils/tools-manager";
6
4
  import { cspawn } from "@oh-my-pi/pi-utils";
7
5
  import { nanoid } from "nanoid";
6
+ import { throwIfAborted } from "../../tools/tool-errors";
7
+ import { ensureTool } from "../../utils/tools-manager";
8
8
  import type { RenderResult, SpecialHandler } from "./types";
9
9
  import { finalizeOutput } from "./types";
10
10
 
@@ -229,7 +229,7 @@ export const handleYouTube: SpecialHandler = async (
229
229
  const hasAutoSubs = listResult.stdout.includes("[info] Available automatic captions");
230
230
 
231
231
  // Create temp directory for subtitle download
232
- const tmpDir = tmpdir();
232
+ const tmpDir = os.tmpdir();
233
233
  const tmpBase = path.join(tmpDir, `yt-${yt.videoId}-${nanoid()}`);
234
234
 
235
235
  try {
@@ -302,15 +302,10 @@ export const handleYouTube: SpecialHandler = async (
302
302
  }
303
303
  }
304
304
  } finally {
305
- // Cleanup temp files using sync unlink to avoid leaving handles open
306
- try {
307
- const tmpFiles = await Array.fromAsync(new Bun.Glob(`${tmpBase}*`).scan({ absolute: true }));
308
- for (const f of tmpFiles) {
309
- try {
310
- unlinkSync(f);
311
- } catch {}
312
- }
313
- } catch {}
305
+ // Cleanup temp files (fire-and-forget with error suppression)
306
+ Array.fromAsync(new Bun.Glob(`${tmpBase}*`).scan({ absolute: true }))
307
+ .then(tmpFiles => Promise.all(tmpFiles.map(f => fs.unlink(f).catch(() => {}))))
308
+ .catch(() => {});
314
309
  }
315
310
 
316
311
  // Build markdown output
@@ -7,19 +7,14 @@
7
7
  * 3. OAuth credentials in ~/.omp/agent/agent.db (with expiry check)
8
8
  * 4. ANTHROPIC_API_KEY / ANTHROPIC_BASE_URL fallback
9
9
  */
10
-
11
10
  import * as os from "node:os";
12
11
  import * as path from "node:path";
13
12
  import { buildAnthropicHeaders as buildProviderAnthropicHeaders } from "@oh-my-pi/pi-ai";
14
- import { getAgentDbPath, getConfigDirPaths } from "@oh-my-pi/pi-coding-agent/config";
15
- import { AgentStorage } from "@oh-my-pi/pi-coding-agent/session/agent-storage";
16
- import type {
17
- AuthCredential,
18
- AuthCredentialEntry,
19
- AuthStorageData,
20
- } from "@oh-my-pi/pi-coding-agent/session/auth-storage";
21
- import { migrateJsonStorage } from "@oh-my-pi/pi-coding-agent/session/storage-migration";
22
13
  import { logger } from "@oh-my-pi/pi-utils";
14
+ import { getAgentDbPath, getConfigDirPaths } from "../../config";
15
+ import { AgentStorage } from "../../session/agent-storage";
16
+ import type { AuthCredential, AuthCredentialEntry, AuthStorageData } from "../../session/auth-storage";
17
+ import { migrateJsonStorage } from "../../session/storage-migration";
23
18
  import type { AnthropicAuthConfig, AnthropicOAuthCredential, ModelsJson } from "./types";
24
19
 
25
20
  const DEFAULT_BASE_URL = "https://api.anthropic.com";
@@ -148,7 +143,7 @@ async function readAnthropicOAuthCredentials(configDir: string): Promise<Anthrop
148
143
  authPaths: [path.join(configDir, "auth.json")],
149
144
  });
150
145
 
151
- const storage = AgentStorage.open(getAgentDbPath(configDir));
146
+ const storage = await AgentStorage.open(getAgentDbPath(configDir));
152
147
  const records = storage.listAuthCredentials("anthropic");
153
148
  const credentials: AnthropicOAuthCredential[] = [];
154
149
  for (const record of records) {
@@ -11,29 +11,19 @@
11
11
  * - web_search_linkedin: Search LinkedIn profiles and companies
12
12
  * - web_search_company: Comprehensive company research
13
13
  */
14
-
15
14
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
16
15
  import { StringEnum } from "@oh-my-pi/pi-ai";
17
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
18
- import {
19
- callExaTool,
20
- findApiKey as findExaKey,
21
- formatSearchResults,
22
- isSearchResponse,
23
- } from "@oh-my-pi/pi-coding-agent/exa/mcp-client";
24
- import { renderExaCall, renderExaResult } from "@oh-my-pi/pi-coding-agent/exa/render";
25
- import type { ExaRenderDetails } from "@oh-my-pi/pi-coding-agent/exa/types";
26
- import type {
27
- CustomTool,
28
- CustomToolContext,
29
- RenderResultOptions,
30
- } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
31
- import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
32
- import webSearchSystemPrompt from "@oh-my-pi/pi-coding-agent/prompts/system/web-search.md" with { type: "text" };
33
- import webSearchDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/web-search.md" with { type: "text" };
34
- import type { ToolSession } from "@oh-my-pi/pi-coding-agent/tools/index";
35
- import { formatAge } from "@oh-my-pi/pi-coding-agent/tools/render-utils";
36
16
  import { Type } from "@sinclair/typebox";
17
+ import { renderPromptTemplate } from "../../config/prompt-templates";
18
+ import { callExaTool, findApiKey as findExaKey, formatSearchResults, isSearchResponse } from "../../exa/mcp-client";
19
+ import { renderExaCall, renderExaResult } from "../../exa/render";
20
+ import type { ExaRenderDetails } from "../../exa/types";
21
+ import type { CustomTool, CustomToolContext, RenderResultOptions } from "../../extensibility/custom-tools/types";
22
+ import type { Theme } from "../../modes/theme/theme";
23
+ import webSearchSystemPrompt from "../../prompts/system/web-search.md" with { type: "text" };
24
+ import webSearchDescription from "../../prompts/tools/web-search.md" with { type: "text" };
25
+ import type { ToolSession } from "../../tools";
26
+ import { formatAge } from "../../tools/render-utils";
37
27
  import { findAnthropicAuth } from "./auth";
38
28
  import { searchAnthropic } from "./providers/anthropic";
39
29
  import { searchExa } from "./providers/exa";
@@ -103,7 +93,7 @@ function formatProviderLabel(provider: WebSearchProvider): string {
103
93
  }
104
94
 
105
95
  function formatProviderList(providers: WebSearchProvider[]): string {
106
- return providers.map((provider) => formatProviderLabel(provider)).join(", ");
96
+ return providers.map(provider => formatProviderLabel(provider)).join(", ");
107
97
  }
108
98
 
109
99
  function buildNoProviderError(): string {
@@ -4,14 +4,8 @@
4
4
  * Uses Claude's built-in web_search_20250305 tool to search the web.
5
5
  * Returns synthesized answers with citations and source metadata.
6
6
  */
7
-
8
7
  import { applyClaudeToolPrefix, buildAnthropicSystemBlocks, stripClaudeToolPrefix } from "@oh-my-pi/pi-ai";
9
- import {
10
- buildAnthropicHeaders,
11
- buildAnthropicUrl,
12
- findAnthropicAuth,
13
- getEnv,
14
- } from "@oh-my-pi/pi-coding-agent/web/search/auth";
8
+ import { buildAnthropicHeaders, buildAnthropicUrl, findAnthropicAuth, getEnv } from "../../../web/search/auth";
15
9
  import type {
16
10
  AnthropicApiResponse,
17
11
  AnthropicAuthConfig,
@@ -19,8 +13,8 @@ import type {
19
13
  WebSearchCitation,
20
14
  WebSearchResponse,
21
15
  WebSearchSource,
22
- } from "@oh-my-pi/pi-coding-agent/web/search/types";
23
- import { WebSearchProviderError } from "@oh-my-pi/pi-coding-agent/web/search/types";
16
+ } from "../../../web/search/types";
17
+ import { WebSearchProviderError } from "../../../web/search/types";
24
18
 
25
19
  const DEFAULT_MODEL = "claude-haiku-4-5";
26
20
  const DEFAULT_MAX_TOKENS = 4096;
@@ -4,11 +4,9 @@
4
4
  * High-quality neural search via Exa Search API.
5
5
  * Returns structured search results with optional content extraction.
6
6
  */
7
-
8
- import { existsSync, readFileSync } from "node:fs";
9
- import { homedir } from "node:os";
10
- import type { WebSearchResponse, WebSearchSource } from "@oh-my-pi/pi-coding-agent/web/search/types";
11
- import { WebSearchProviderError } from "@oh-my-pi/pi-coding-agent/web/search/types";
7
+ import * as os from "node:os";
8
+ import type { WebSearchResponse, WebSearchSource } from "../../../web/search/types";
9
+ import { WebSearchProviderError } from "../../../web/search/types";
12
10
 
13
11
  const EXA_API_URL = "https://api.exa.ai/search";
14
12
 
@@ -30,9 +28,7 @@ export interface ExaSearchParams {
30
28
  async function parseEnvFile(filePath: string): Promise<Record<string, string>> {
31
29
  const result: Record<string, string> = {};
32
30
  try {
33
- if (!existsSync(filePath)) return result;
34
-
35
- const content = readFileSync(filePath, "utf-8");
31
+ const content = await Bun.file(filePath).text();
36
32
  for (const line of content.split("\n")) {
37
33
  let trimmed = line.trim();
38
34
  if (!trimmed || trimmed.startsWith("#")) continue;
@@ -54,13 +50,13 @@ async function parseEnvFile(filePath: string): Promise<Record<string, string>> {
54
50
  result[key] = value;
55
51
  }
56
52
  } catch {
57
- // Ignore read errors
53
+ // Ignore read errors (including ENOENT for missing files)
58
54
  }
59
55
  return result;
60
56
  }
61
57
 
62
58
  function getHomeDir(): string {
63
- return homedir();
59
+ return os.homedir();
64
60
  }
65
61
 
66
62
  /** Find EXA_API_KEY from environment or .env files */
@@ -4,7 +4,6 @@
4
4
  * Supports both sonar (fast) and sonar-pro (comprehensive) models.
5
5
  * Returns synthesized answers with citations and related questions.
6
6
  */
7
-
8
7
  import * as os from "node:os";
9
8
  import type {
10
9
  PerplexityRequest,
@@ -12,8 +11,8 @@ import type {
12
11
  WebSearchCitation,
13
12
  WebSearchResponse,
14
13
  WebSearchSource,
15
- } from "@oh-my-pi/pi-coding-agent/web/search/types";
16
- import { WebSearchProviderError } from "@oh-my-pi/pi-coding-agent/web/search/types";
14
+ } from "../../../web/search/types";
15
+ import { WebSearchProviderError } from "../../../web/search/types";
17
16
 
18
17
  const PERPLEXITY_API_URL = "https://api.perplexity.ai/chat/completions";
19
18
 
@@ -123,7 +122,7 @@ function parseResponse(response: PerplexityResponse): WebSearchResponse {
123
122
  const searchResults = response.search_results ?? [];
124
123
 
125
124
  for (const url of citationUrls) {
126
- const searchResult = searchResults.find((r) => r.url === url);
125
+ const searchResult = searchResults.find(r => r.url === url);
127
126
  sources.push({
128
127
  title: searchResult?.title ?? url,
129
128
  url,
@@ -167,9 +166,10 @@ export async function searchPerplexity(params: PerplexitySearchParams): Promise<
167
166
  messages.push({ role: "user", content: params.query });
168
167
 
169
168
  const request: PerplexityRequest = {
170
- model: "sonar",
169
+ model: "sonar-pro",
171
170
  messages,
172
171
  return_related_questions: true,
172
+ search_context_size: "high",
173
173
  };
174
174
 
175
175
  if (params.search_recency_filter) {