Added
- Added optional
fetchContent.domainPolicyhostname allow/deny rules forfetch_content, checked before target requests and redirects while preserving SSRF protection and local-source behavior. Thanks Joseph Maliksi (@jmaliksi) for #79. - Added explicit-only AnySearch direct search provider with anonymous access, optional
anysearchApiKey/ANYSEARCH_API_KEYcredentials, strict response validation, and request-time credential sources. Thanks Robin (@choronz) for #130. - Added SERPdive search provider with request-time credential sources, a free-tier
krilldefault that never spends on install, opt-inmako/mobyretrieval depth, locally applied domain filters, and recency documented as a query hint rather than a guaranteed freshness filter. Thanks Eden d'Alexis (@edendalexis) for #139. - Added opt-in ordered search routing through
searchRouting.providerswith explicit transient, quota, and network fallback kinds; named providers remain strict, single-provider config retains precedence, and exhausted routes preserve per-provider diagnostics. Thanks @smithyyang for #77. - Added optional self-hosted SearXNG search with SSRF-guarded base URLs, local-first auto selection, result filters, and documented
ssrf.allowRangesopt-ins. Thanks to Marcos A. Núñez (@marnunez) for PR #107 and Avinash Kanaujiya (@avinashkanaujiya) for issue #105. - Added optional self-hosted Firecrawl extraction for
fetch_content, using/v2/scrapeby default (or/v1/scrapefor older images), request-time credential sources, cache-only requests by default, cross-origin redirect credential stripping, and local-first fallback behavior when configured. Thanks Florian Kinder (@fank) for PR #123 and Avinash Kanaujiya (@avinashkanaujiya) for issue #105. - Added opt-in configurable public tool names for environments where another extension or model reserves the defaults, while keeping
web_search,source_check,fetch_content, andget_search_contentunchanged by default. Thanks Kaiqiang (@youkq95) for reporting #138. - Added
SECURITY.mdguidance for private vulnerability reporting. Thanks Aurelio Ribeiro (@aurelio-ribeiro) for #128. - Added request-time
$ENV_VARand!commandcredential sources for every provider API-key field, including escaped$$and$!literals, while preserving legacy environment precedence for literal config values. Thanks to Eugene Strizhok (@estrizhok) for #159. - Added request-time
$ENV_VARand!commandcredential sources for Exa and Gemini API configuration, with bounded output, redacted failures, strict source precedence, and shell-local 1Password session forwarding limited to the resolver command. Thanks to Ezra Miller (@ezmill) for #137. - Added
source_checkmachine-readable research artifacts with passage-level provenance, bounded page fetching, durable session retrieval, and conservative claim assessments. Thanks Clark Everson (@gr3enarr0w) for PR #111 and issue #108.
Changed
- Limited the published package contents to runtime files, docs, and declared assets, keeping internal tests out of the npm tarball.
- Deferred the heavy content extraction module until the first
fetch_contentorincludeContentsearch call, reducing extension startup work. Thanks Kaushik Gopal (@kaushikgopal) for PR #125. - Send direct Gemini API credentials in
x-goog-api-keyheaders for generate, upload, status, and delete requests instead of URL query parameters.
Removed
- Removed the bundled
librarianskill from this package instead of keeping a second research workflow coupled to GitHub clone internals. Thanks mcwalrus (@mcwalrus) for #136 and gravewhisper (@gravewhisper) for #23.
Fixed
- Prevented opt-in Gemini Web browser cookies from crossing origins on redirects, disabled automatic redirects for cookie-bearing generation and upload requests, and restored local file reads for Gemini Web uploads.
- Preserved caller cancellation in non-curated multi-query searches instead of continuing with later queries, and passed the active extension context into curator-added searches.
- Hardened new provider result boundaries and removed a dead auto-routing condition without changing provider behavior.
- Hardened unreleased config/result boundaries by rejecting malformed config roots, reporting malformed SSRF JSON, normalizing invalid Perplexity result counts, and rejecting contradictory curator summary metadata.
- Reworked opt-in Gemini Web browser-cookie extraction to scan non-default Chromium profiles, preflight required cookie names before Keychain/secret-tool access, and cache encryption passwords only in-process. Thanks Kevin Truong (@kevinQTruong) for the originating PR #14, Jessica Black (@jssblck) for reporting #9, János Veres (@jveres) for reporting #2, and RimuruW (@RimuruW) for reporting #15.
- Added read-only
sqlite3CLI and Python stdlib fallbacks whennode:sqliteis unavailable, with sanitized actionable diagnostics instead of silently reporting Gemini Web as unavailable. - Bounded curator summary-model generation and returned a deterministic, phase-labeled fallback when a draft exceeds its deadline, while preserving caller cancellation and model-resolution errors. Thanks torn1147 (@torn1147) for reporting #43.
- Used
gemini-2.5-flashas the Gemini API grounded-search default while preserving configuredsearchModelvalues and the shared URL/video defaults. Thanks lajarre for reporting #11. - Used the configured search provider when tool calls omit
provideror emit the schema'sautodefault, while preserving explicit provider overrides and auto fallback without configuration. Thanks Pavlo (@fxposter) for reporting #17. - Clarified that
githubClone.enabled: falsedisables GitHub clone/API specialization while leaving generic URL extraction available. Thanks Carlos Peralta (@cperalt) for issue #26. - Added an opt-in
ssrf.trustEnvProxysetting that skips local DNS preflight only for hostnames routed through configured HTTP(S) proxy environment variables, while retaining localhost, literal private-IP, andNO_PROXYprotections. This addresses the DNS failure described in #104 without claiming full proxy transport support. Thanks Daniel Birn (@DBPhoenix) for PR #109 and mystery4f for reporting #104. - Kept PDF extraction compatible with runtimes without native
Promise.tryand limited PDF.js output to errors. Thanks Guido Witt-Dörring (@guwidoe) for PRs #33 and #34. - Returned fetched URL content from
get_search_contentin bounded slices with explicitoffset/limitcontinuation metadata, preventing large stored pages from overflowing the next model request. Thanks @manfredlift for reporting #112. - Kept oversized local videos recognizable for ffmpeg frame/timestamp extraction while preserving the Gemini analysis upload size limit. Thanks @Xandaar for reporting #135.
- Declared
typeboxas a regular runtime dependency so clean/global installs can load the extension without relying on Pi or Feynman to provide that peer. Thanks @DuskyElf, @tonytziorvas, and @53able for reporting #59, #63, and #66. - Preserved OpenAI/Codex answers even when the provider returns no source citations instead of replacing them with
No results found. Thanks AstroHan (@Astro-Han) for reporting #117. - Prevented browser auto-open failures from crashing the curator fallback path with
ReferenceError: sendCuratorFallbackUpdate is not defined. Thanks Nisarg Patel (@pnisarg) for PR #121; Apostol Apostolov (@apoapostolov), @2seoik, and Demetre Dzmanashvili (@demetere) for related PRs #133, #120, and #114; and @ruanlinxin, @bluewatercg, @tonydiep, and @pinion05 for reports #103, #116, #126, and #127. - Added a focused SSRF error hint for TUN/fake-IP
198.18.0.0/15addresses that points users to the existingssrf.allowRangesopt-in. Thanks Aaron (@BenjaminAaron196) for PR #141 and AstroHan (@Astro-Han) for reporting #134. - Registered the web activity widget with Pi's supported string-array API to prevent
content is not a functioncrashes when toggling non-default shortcuts. Thanks @llllllllqq for reporting #158. - Registered the web activity widget as a Pi component factory instead of passing a
Textinstance directly. Thanks Trey Hoover (@treyhoover) for PR #132.