@humain/terminal 0.1.1 → 0.2.1
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.
- package/CHANGELOG.md +16 -0
- package/dist/bundle/chunks/{anthropic-messages-XULXUBIG.js → anthropic-messages-QFCEKGI3.js} +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-JEG2XOYC.js → azure-openai-responses-G4ZMHV37.js} +1 -1
- package/dist/bundle/chunks/chunk-7T6XCLJF.js +22 -0
- package/dist/bundle/chunks/chunk-D6HHRSB5.js +103 -0
- package/dist/bundle/chunks/chunk-EY4DWHQU.js +2 -0
- package/dist/bundle/chunks/{chunk-LYAMSPR2.js → chunk-I47ZWR55.js} +483 -506
- package/dist/bundle/chunks/{chunk-JUPSJTFQ.js → chunk-K4JAZYQH.js} +1 -1
- package/dist/bundle/chunks/{chunk-HPPQHK3J.js → chunk-KKIB2TVR.js} +1 -1
- package/dist/bundle/chunks/chunk-LI2YVPWP.js +2 -0
- package/dist/bundle/chunks/{chunk-BZQ53VGE.js → chunk-XSR434CO.js} +1 -1
- package/dist/bundle/chunks/compat-QCV26HNS.js +2 -0
- package/dist/bundle/chunks/dist-PRPIUY3U.js +2 -0
- package/dist/bundle/chunks/esm-E7UVEYTO.js +4 -0
- package/dist/bundle/chunks/{extract-TRW5FBY6.js → extract-CTIFQZDJ.js} +15 -14
- package/dist/bundle/chunks/{google-generative-ai-OX6VSCA6.js → google-generative-ai-RSUU4MWO.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-GW76GSS2.js → google-vertex-CKQPOITO.js} +1 -1
- package/dist/bundle/chunks/host-WP3MVKS2.js +2 -0
- package/dist/bundle/chunks/{node-KOIP55YZ.js → node-NF43OPII.js} +1 -1
- package/dist/bundle/chunks/{node-XY3CBY3C.js → node-UMFM7CDZ.js} +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-NPLWP6ZC.js → openai-codex-responses-S34V5ZSD.js} +1 -1
- package/dist/bundle/chunks/{openai-completions-OT2GTJKC.js → openai-completions-T2IGVUEI.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-5A6CR7GI.js → openai-responses-GYZODCT3.js} +1 -1
- package/dist/bundle/chunks/readability-LAGF34IB.js +3 -0
- package/dist/bundle/chunks/turndown.cjs-HRMZVRUL.js +2 -0
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +21 -8
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/subagent-env.d.ts +18 -0
- package/dist/core/tools/subagent-env.d.ts.map +1 -0
- package/dist/core/tools/subagent-env.js +43 -0
- package/dist/core/tools/subagent-env.js.map +1 -0
- package/dist/core/tools/subagent-scheduler.d.ts +31 -0
- package/dist/core/tools/subagent-scheduler.d.ts.map +1 -0
- package/dist/core/tools/subagent-scheduler.js +203 -0
- package/dist/core/tools/subagent-scheduler.js.map +1 -0
- package/dist/core/tools/subagent.d.ts +83 -3
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +214 -76
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +78 -0
- package/dist/humain/mcp-adapter/vendor/README.md +125 -19
- package/dist/humain/mcp-adapter/vendor/agent-plugin-loader.ts +69 -30
- package/dist/humain/mcp-adapter/vendor/agent-plugin-provenance.ts +36 -0
- package/dist/humain/mcp-adapter/vendor/claude-plugin-loader.ts +365 -0
- package/dist/humain/mcp-adapter/vendor/commands.ts +13 -15
- package/dist/humain/mcp-adapter/vendor/config.ts +198 -30
- package/dist/humain/mcp-adapter/vendor/consent-manager.ts +40 -9
- package/dist/humain/mcp-adapter/vendor/direct-tool-surface.ts +250 -0
- package/dist/humain/mcp-adapter/vendor/direct-tools.ts +9 -228
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js +74 -32
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.d.ts +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.js +31 -0
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.d.ts +9 -0
- package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.js +362 -0
- package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/config.d.ts +3 -1
- package/dist/humain/mcp-adapter/vendor/dist/config.js +189 -27
- package/dist/humain/mcp-adapter/vendor/dist/config.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js +7 -16
- package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js +5 -17
- package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/types.d.ts +30 -4
- package/dist/humain/mcp-adapter/vendor/dist/types.js +26 -0
- package/dist/humain/mcp-adapter/vendor/dist/types.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/utils.d.ts +6 -0
- package/dist/humain/mcp-adapter/vendor/dist/utils.js +65 -6
- package/dist/humain/mcp-adapter/vendor/dist/utils.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/host-html-template.ts +20 -19
- package/dist/humain/mcp-adapter/vendor/http-ca.ts +84 -0
- package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +37102 -15103
- package/dist/humain/mcp-adapter/vendor/index.ts +828 -164
- package/dist/humain/mcp-adapter/vendor/init.ts +48 -10
- package/dist/humain/mcp-adapter/vendor/lazy-loader.ts +7 -0
- package/dist/humain/mcp-adapter/vendor/mcp-auth-fetch.ts +113 -0
- package/dist/humain/mcp-adapter/vendor/mcp-auth-flow.ts +256 -77
- package/dist/humain/mcp-adapter/vendor/mcp-auth.ts +316 -54
- package/dist/humain/mcp-adapter/vendor/mcp-code.ts +45 -18
- package/dist/humain/mcp-adapter/vendor/mcp-install.ts +60 -0
- package/dist/humain/mcp-adapter/vendor/mcp-oauth-provider.ts +70 -6
- package/dist/humain/mcp-adapter/vendor/mcp-output-guard.ts +53 -42
- package/dist/humain/mcp-adapter/vendor/mcp-panel-theme.ts +105 -0
- package/dist/humain/mcp-adapter/vendor/mcp-panel.ts +366 -331
- package/dist/humain/mcp-adapter/vendor/mcp-references.ts +9 -14
- package/dist/humain/mcp-adapter/vendor/mcp-script-worker.mjs +3 -1
- package/dist/humain/mcp-adapter/vendor/mcp-setup-panel.ts +383 -341
- package/dist/humain/mcp-adapter/vendor/mcp-status.ts +5 -0
- package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +7 -16
- package/dist/humain/mcp-adapter/vendor/namespace-tools.ts +61 -3
- package/dist/humain/mcp-adapter/vendor/oauth.ts +6 -2
- package/dist/humain/mcp-adapter/vendor/package-mcp-loader.ts +5 -17
- package/dist/humain/mcp-adapter/vendor/package.json +13 -3
- package/dist/humain/mcp-adapter/vendor/prompts.ts +35 -3
- package/dist/humain/mcp-adapter/vendor/proxy-modes.ts +108 -7
- package/dist/humain/mcp-adapter/vendor/runtime-owner.ts +16 -1
- package/dist/humain/mcp-adapter/vendor/sampling-handler.ts +9 -32
- package/dist/humain/mcp-adapter/vendor/sandbox-proxy-template.ts +20 -93
- package/dist/humain/mcp-adapter/vendor/server-manager.ts +227 -40
- package/dist/humain/mcp-adapter/vendor/session-approvals.ts +187 -0
- package/dist/humain/mcp-adapter/vendor/skills/mcp-scripting/SKILL.md +9 -1
- package/dist/humain/mcp-adapter/vendor/state.ts +10 -1
- package/dist/humain/mcp-adapter/vendor/tool-approval.ts +10 -22
- package/dist/humain/mcp-adapter/vendor/tool-metadata.ts +14 -0
- package/dist/humain/mcp-adapter/vendor/types.ts +57 -4
- package/dist/humain/mcp-adapter/vendor/ui-server.ts +36 -28
- package/dist/humain/mcp-adapter/vendor/utils.ts +64 -6
- package/dist/humain/web-access/vendor/abortable.d.ts +3 -0
- package/dist/humain/web-access/vendor/abortable.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/abortable.js +22 -0
- package/dist/humain/web-access/vendor/abortable.js.map +1 -0
- package/dist/humain/web-access/vendor/crawl4ai.d.ts +9 -0
- package/dist/humain/web-access/vendor/crawl4ai.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/crawl4ai.js +187 -0
- package/dist/humain/web-access/vendor/crawl4ai.js.map +1 -0
- package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/credential-source.js +1 -0
- package/dist/humain/web-access/vendor/credential-source.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.js +20 -2
- package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-run.d.ts +11 -0
- package/dist/humain/web-access/vendor/curator-run.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/curator-run.js +38 -0
- package/dist/humain/web-access/vendor/curator-run.js.map +1 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts +1 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.js +2 -0
- package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
- package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/duckduckgo.js +1 -1
- package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -1
- package/dist/humain/web-access/vendor/extract.d.ts +1 -1
- package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/extract.js +58 -11
- package/dist/humain/web-access/vendor/extract.js.map +1 -1
- package/dist/humain/web-access/vendor/fetch-params.js +1 -1
- package/dist/humain/web-access/vendor/fetch-params.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
- package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.js +12 -5
- package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
- package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/index.js +23 -19
- package/dist/humain/web-access/vendor/index.js.map +1 -1
- package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/openai-search.js +40 -14
- package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
- package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/page-query.js +6 -2
- package/dist/humain/web-access/vendor/page-query.js.map +1 -1
- package/dist/humain/web-access/vendor/query-rewrite.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/query-rewrite.js +6 -2
- package/dist/humain/web-access/vendor/query-rewrite.js.map +1 -1
- package/dist/humain/web-access/vendor/serpapi.d.ts +4 -0
- package/dist/humain/web-access/vendor/serpapi.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/serpapi.js +215 -0
- package/dist/humain/web-access/vendor/serpapi.js.map +1 -0
- package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/ssrf-protection.js +5 -1
- package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -1
- package/dist/humain/web-access/vendor/storage.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/storage.js +9 -0
- package/dist/humain/web-access/vendor/storage.js.map +1 -1
- package/dist/humain/web-access/vendor/summary-review.d.ts +1 -1
- package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/summary-review.js +35 -24
- package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
- package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/utils.js +5 -3
- package/dist/humain/web-access/vendor/utils.js.map +1 -1
- package/dist/modes/json-event.d.ts +8 -0
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +17 -0
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +3 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/docs/environment-variables.md +8 -0
- package/docs/json.md +16 -0
- package/npm-shrinkwrap.json +6 -6
- package/package.json +2 -2
- package/src/humain/mcp-adapter/UPSTREAM.md +56 -7
- package/src/humain/mcp-adapter/upstream.json +6 -4
- package/src/humain/mcp-adapter/vendor/CHANGELOG.md +78 -0
- package/src/humain/web-access/UPSTREAM.md +18 -8
- package/src/humain/web-access/upstream.json +6 -5
- package/dist/bundle/chunks/chunk-2LC3S3VV.js +0 -105
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-params.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/fetch-params.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fetch-params.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/fetch-params.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizeProxyUrl } from \"./utils.ts\";\n\nexport interface FetchContentParams {\n\turl?: unknown;\n\turls?: unknown;\n\tforceClone?: unknown;\n\tprompt?: unknown;\n\ttimestamp?: unknown;\n\tframes?: unknown;\n\tmodel?: unknown;\n\tmode?: unknown;\n\tanswerModel?: unknown;\n\tauth?: unknown;\n\tproxy?: unknown;\n}\n\nexport interface NormalizedFetchContentParams {\n\turlList: string[];\n\toptions: {\n\t\tforceClone?: boolean;\n\t\tprompt?: string;\n\t\ttimestamp?: string;\n\t\tframes?: number;\n\t\tmodel?: string;\n\t\tmode?: \"readable\" | \"raw\" | \"answer\";\n\t\tanswerModel?: string;\n\t\tauth?: true | string;\n\t\tproxy?: string;\n\t};\n}\n\nexport function normalizeFetchContentParams(params: FetchContentParams): NormalizedFetchContentParams {\n\tconst normalizedUrls = uniqueUrls(normalizeUrlArray(params.urls));\n\tconst urlList = normalizedUrls.length > 0 ? normalizedUrls : normalizeSingleUrl(params.url);\n\tconst prompt = normalizeOptionalString(params.prompt);\n\tconst timestamp = normalizeOptionalString(params.timestamp);\n\tconst frames = normalizeOptionalFrameCount(params.frames);\n\n\tconst shouldIncludeFrames = frames !== undefined && (timestamp !== undefined || frames > 1);\n\n\tconst forceClone = typeof params.forceClone === \"boolean\" ? params.forceClone : undefined;\n\tconst model = normalizeOptionalString(params.model);\n\tconst mode = normalizeMode(params.mode);\n\tconst answerModel = normalizeOptionalString(params.answerModel);\n\tconst auth = normalizeAuth(params.auth);\n\tconst proxy = normalizeProxy(params.proxy);\n\n\treturn {\n\t\turlList,\n\t\toptions: {\n\t\t\t...(forceClone !== undefined ? { forceClone } : {}),\n\t\t\t...(prompt !== undefined ? { prompt } : {}),\n\t\t\t...(timestamp !== undefined ? { timestamp } : {}),\n\t\t\t...(shouldIncludeFrames ? { frames } : {}),\n\t\t\t...(model !== undefined ? { model } : {}),\n\t\t\t...(mode !== undefined ? { mode } : {}),\n\t\t\t...(answerModel !== undefined ? { answerModel } : {}),\n\t\t\t...(auth !== undefined ? { auth } : {}),\n\t\t\t...(proxy !== undefined ? { proxy } : {}),\n\t\t},\n\t};\n}\n\nfunction normalizeUrlArray(value: unknown): string[] {\n\tif (!Array.isArray(value)) return [];\n\treturn value.flatMap(normalizeSingleUrl);\n}\n\nfunction normalizeSingleUrl(value: unknown): string[] {\n\tif (typeof value !== \"string\") return [];\n\tconst trimmed = value.trim();\n\treturn trimmed ? [trimmed] : [];\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed || undefined;\n}\n\nfunction normalizeMode(value: unknown): \"readable\" | \"raw\" | \"answer\" | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === \"readable\" || value === \"raw\" || value === \"answer\") return value;\n\tthrow new Error('mode must be \"readable\", \"raw\", or \"answer\"');\n}\n\nfunction normalizeAuth(value: unknown): true | string | undefined {\n\tif (value === undefined || value === false) return undefined;\n\tif (value === true) return true;\n\tif (typeof value === \"string\") {\n\t\tconst trimmed = value.trim();\n\t\tif (trimmed) return trimmed;\n\t}\n\tthrow new Error(\"auth must be a profile name, true, or false\");\n}\n\nfunction normalizeProxy(value: unknown): string | undefined {\n\tif (value === undefined || value === false) return undefined;\n\tif (value === null) throw new Error(\"proxy must be an http(s) or socks proxy URL string\");\n\tconst normalized = normalizeProxyUrl(value, \"proxy\");\n\treturn normalized ?? \"\";\n}\n\nfunction normalizeOptionalFrameCount(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isInteger(value) || value < 1 || value > 12) return undefined;\n\treturn value;\n}\n\nfunction uniqueUrls(urls: string[]): string[] {\n\treturn [...new Set(urls)];\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ExtensionContext } from "../host.ts";
|
|
2
2
|
import { type SearchResponse, type SearchOptions } from "./perplexity.ts";
|
|
3
|
-
export declare const RESOLVED_SEARCH_PROVIDERS: readonly ["openai", "brave", "parallel", "parallel-mcp", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "firecrawl", "jina", "searxng", "duckduckgo", "perplexity", "gemini", "kimi", "exa", "serpdive", "kagi", "ollama", "anysearch", "xai", "mistral", "brightdata", "serpbase", "serper", "valyu", "bocha", "xcrawl"];
|
|
4
|
-
export declare const SEARCH_PROVIDERS: readonly ["auto", "all", "openai", "brave", "parallel", "parallel-mcp", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "firecrawl", "jina", "searxng", "duckduckgo", "perplexity", "gemini", "kimi", "exa", "serpdive", "kagi", "ollama", "anysearch", "xai", "mistral", "brightdata", "serpbase", "serper", "valyu", "bocha", "xcrawl"];
|
|
3
|
+
export declare const RESOLVED_SEARCH_PROVIDERS: readonly ["openai", "brave", "parallel", "parallel-mcp", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "firecrawl", "jina", "searxng", "duckduckgo", "perplexity", "gemini", "kimi", "exa", "serpdive", "kagi", "ollama", "anysearch", "xai", "mistral", "brightdata", "serpbase", "serpapi", "serper", "valyu", "bocha", "xcrawl"];
|
|
4
|
+
export declare const SEARCH_PROVIDERS: readonly ["auto", "all", "openai", "brave", "parallel", "parallel-mcp", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "firecrawl", "jina", "searxng", "duckduckgo", "perplexity", "gemini", "kimi", "exa", "serpdive", "kagi", "ollama", "anysearch", "xai", "mistral", "brightdata", "serpbase", "serpapi", "serper", "valyu", "bocha", "xcrawl"];
|
|
5
5
|
export type ResolvedSearchProvider = typeof RESOLVED_SEARCH_PROVIDERS[number];
|
|
6
6
|
export type SearchProvider = typeof SEARCH_PROVIDERS[number];
|
|
7
7
|
export type SearchProviderSelection = SearchProvider | ResolvedSearchProvider[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-search.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMnD,OAAO,EAAkE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini-search.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,12 +28,13 @@ import { isXcrawlAvailable, searchWithXCrawl } from "./xcrawl.js";
|
|
|
28
28
|
import { isXaiSearchAvailable, searchWithXai } from "./xai-search.js";
|
|
29
29
|
import { isBrightDataAvailable, searchWithBrightData } from "./brightdata.js";
|
|
30
30
|
import { isSerpBaseAvailable, searchWithSerpBase } from "./serpbase.js";
|
|
31
|
+
import { isSerpApiAvailable, searchWithSerpApi } from "./serpapi.js";
|
|
31
32
|
import { isSerperAvailable, searchWithSerper } from "./serper.js";
|
|
32
33
|
import { isValyuAvailable, searchWithValyu } from "./valyu.js";
|
|
33
34
|
import { isKimiSearchAvailable, searchWithKimi } from "./kimi-search.js";
|
|
34
35
|
import { isMistralAvailable, searchWithMistral } from "./mistral-search.js";
|
|
35
36
|
import { getWebSearchConfigPath } from "./utils.js";
|
|
36
|
-
export const RESOLVED_SEARCH_PROVIDERS = ["openai", "brave", "parallel", "parallel-mcp", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "firecrawl", "jina", "searxng", "duckduckgo", "perplexity", "gemini", "kimi", "exa", "serpdive", "kagi", "ollama", "anysearch", "xai", "mistral", "brightdata", "serpbase", "serper", "valyu", "bocha", "xcrawl"];
|
|
37
|
+
export const RESOLVED_SEARCH_PROVIDERS = ["openai", "brave", "parallel", "parallel-mcp", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "firecrawl", "jina", "searxng", "duckduckgo", "perplexity", "gemini", "kimi", "exa", "serpdive", "kagi", "ollama", "anysearch", "xai", "mistral", "brightdata", "serpbase", "serpapi", "serper", "valyu", "bocha", "xcrawl"];
|
|
37
38
|
export const SEARCH_PROVIDERS = ["auto", "all", ...RESOLVED_SEARCH_PROVIDERS];
|
|
38
39
|
export class SearchProviderError extends Error {
|
|
39
40
|
constructor(provider, kind, message, status, cause) {
|
|
@@ -47,7 +48,7 @@ export class SearchProviderError extends Error {
|
|
|
47
48
|
}
|
|
48
49
|
const CONFIG_PATH = getWebSearchConfigPath();
|
|
49
50
|
const DEFAULT_SEARCH_MODEL = "gemini-3.6-flash";
|
|
50
|
-
// Explicit-only providers (Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, xAI, Mistral, Bright Data, SerpBase, Serper, Valyu) are deliberately absent:
|
|
51
|
+
// Explicit-only providers (Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, xAI, Mistral, Bright Data, SerpBase, SerpApi, Serper, Valyu) are deliberately absent:
|
|
51
52
|
// `all` must never fan out to an opt-in or paid provider without the user asking for it.
|
|
52
53
|
export const ALL_SEARCH_PROVIDERS = ["searxng", "openai", "exa", "brave", "parallel", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "firecrawl", "jina", "serpdive", "kagi", "ollama", "perplexity", "gemini", "bocha"];
|
|
53
54
|
const VALID_ROUTING_KINDS = ["transient", "quota", "network", "invalid-response", "unsupported"];
|
|
@@ -238,7 +239,7 @@ function classifyProviderError(provider, err) {
|
|
|
238
239
|
else if (status === 400 || status === 422) {
|
|
239
240
|
kind = "invalid-request";
|
|
240
241
|
}
|
|
241
|
-
else if (status === 402 || status === 429) {
|
|
242
|
+
else if (status === 402 || status === 429 || (provider === "tavily" && status === 432)) {
|
|
242
243
|
kind = "quota";
|
|
243
244
|
}
|
|
244
245
|
else if (status !== undefined && (status === 408 || status === 425 || status >= 500)) {
|
|
@@ -312,6 +313,8 @@ async function searchWithResolvedProvider(provider, query, options, useCurrentMo
|
|
|
312
313
|
return { ...(await searchWithBrightData(query, options)), provider };
|
|
313
314
|
if (provider === "serpbase")
|
|
314
315
|
return { ...(await searchWithSerpBase(query, options)), provider };
|
|
316
|
+
if (provider === "serpapi")
|
|
317
|
+
return { ...(await searchWithSerpApi(query, options)), provider };
|
|
315
318
|
if (provider === "serper")
|
|
316
319
|
return { ...(await searchWithSerper(query, options)), provider };
|
|
317
320
|
if (provider === "valyu")
|
|
@@ -385,6 +388,8 @@ async function isResolvedProviderAvailable(provider, options, useCurrentModel =
|
|
|
385
388
|
return isBrightDataAvailable();
|
|
386
389
|
if (provider === "serpbase")
|
|
387
390
|
return isSerpBaseAvailable();
|
|
391
|
+
if (provider === "serpapi")
|
|
392
|
+
return isSerpApiAvailable();
|
|
388
393
|
if (provider === "serper")
|
|
389
394
|
return isSerperAvailable();
|
|
390
395
|
if (provider === "valyu")
|
|
@@ -450,6 +455,8 @@ function providerLabel(provider) {
|
|
|
450
455
|
return "Bright Data";
|
|
451
456
|
if (provider === "serpbase")
|
|
452
457
|
return "SerpBase";
|
|
458
|
+
if (provider === "serpapi")
|
|
459
|
+
return "SerpApi";
|
|
453
460
|
if (provider === "serper")
|
|
454
461
|
return "Serper";
|
|
455
462
|
if (provider === "valyu")
|
|
@@ -472,7 +479,7 @@ async function searchWithProviders(query, options, selectedProviders) {
|
|
|
472
479
|
: await isResolvedProviderAvailable(provider, options),
|
|
473
480
|
})))).filter((entry) => entry.available).map((entry) => entry.provider);
|
|
474
481
|
if (providers.length === 0) {
|
|
475
|
-
throw new Error("No configured search provider available for provider \"all\". Parallel MCP, DuckDuckGo, Kimi, AnySearch, xAI, Mistral, Bright Data, SerpBase, Serper, Valyu, and XCrawl are excluded.");
|
|
482
|
+
throw new Error("No configured search provider available for provider \"all\". Parallel MCP, DuckDuckGo, Kimi, AnySearch, xAI, Mistral, Bright Data, SerpBase, SerpApi, Serper, Valyu, and XCrawl are excluded.");
|
|
476
483
|
}
|
|
477
484
|
const settled = await Promise.allSettled(providers.map((provider) => selectedProviders
|
|
478
485
|
? searchWithResolvedProvider(provider, query, options)
|
|
@@ -770,7 +777,7 @@ export async function search(query, options = {}) {
|
|
|
770
777
|
" 3. Set OPENAI_API_KEY, BRAVE_API_KEY, PARALLEL_API_KEY, TINYFISH_API_KEY, SEARCH1API_KEY, SEARCHINFINITY_API_KEY, QUERIT_API_KEY, TAVILY_API_KEY, FIRECRAWL_BASE_URL, JINA_API_KEY, SERPDIVE_API_KEY, KAGI_API_KEY, BOCHA_API_KEY, OLLAMA_API_KEY, SEARXNG_BASE_URL, EXA_API_KEY, PERPLEXITY_API_KEY, GEMINI_API_KEY, or CLOUDFLARE_API_KEY env vars\n" +
|
|
771
778
|
" 4. Set GOOGLE_GEMINI_BASE_URL with CLOUDFLARE_API_KEY for Cloudflare AI Gateway routing\n" +
|
|
772
779
|
" 5. Sign into gemini.google.com in a supported Chromium-based browser\n" +
|
|
773
|
-
" 6. Explicitly select provider: \"anysearch\" for anonymous AnySearch, \"xcrawl\" for XCrawl, \"xai\" for Grok, \"mistral\" for Mistral Conversations web search, \"brightdata\" with brightdataSerpZone for paid Bright Data SERP, \"serpbase\" or \"serper\" for Google SERP, or \"valyu\" for research search");
|
|
780
|
+
" 6. Explicitly select provider: \"anysearch\" for anonymous AnySearch, \"xcrawl\" for XCrawl, \"xai\" for Grok, \"mistral\" for Mistral Conversations web search, \"brightdata\" with brightdataSerpZone for paid Bright Data SERP, \"serpbase\", \"serpapi\", or \"serper\" for Google SERP, or \"valyu\" for research search");
|
|
774
781
|
}
|
|
775
782
|
async function searchWithGeminiApi(query, options = {}) {
|
|
776
783
|
const requestSignal = AbortSignal.any([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-search.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-search.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { CredentialResolutionError } from \"./credential-source.ts\";\nimport { getApiKey, getVersionedApiBase, fetchGeminiApi, isGatewayConfigured, isGeminiApiAvailable, redactGeminiApiResponse } from \"./gemini-api.ts\";\nimport { isGeminiAdcAvailable } from \"./gemini-adc.ts\";\nimport { getGeminiWebAvailabilityDiagnostic, isGeminiWebAvailable, queryWithCookies } from \"./gemini-web.ts\";\nimport { isPerplexityAvailable, searchWithPerplexity, type SearchResult, type SearchResponse, type SearchOptions } from \"./perplexity.ts\";\nimport { isExaAvailable, searchWithExa } from \"./exa.ts\";\nimport { isBraveAvailable, searchWithBrave } from \"./brave.ts\";\nimport {\n\tisCurrentModelHostedSearchEligible,\n\tisOpenAISearchAvailable,\n\tsearchWithCurrentModelOpenAI,\n\tsearchWithOpenAI,\n} from \"./openai-search.ts\";\nimport { isParallelAvailable, searchWithParallel } from \"./parallel.ts\";\nimport { isParallelMcpAvailable, searchWithParallelMcp } from \"./parallel-mcp.ts\";\nimport { isTinyFishAvailable, searchWithTinyFish } from \"./tinyfish.ts\";\nimport { isSearch1APIAvailable, searchWithSearch1API } from \"./search1api.ts\";\nimport { isSearchinfinityAvailable, searchWithSearchinfinity } from \"./searchinfinity.ts\";\nimport { isQueritAvailable, searchWithQuerit } from \"./querit.ts\";\nimport { isTavilyAvailable, searchWithTavily } from \"./tavily.ts\";\nimport { isFirecrawlAvailable, searchWithFirecrawl } from \"./firecrawl.ts\";\nimport { isJinaSearchAvailable, searchWithJina } from \"./jina-search.ts\";\nimport { isSerpdiveAvailable, searchWithSerpdive } from \"./serpdive.ts\";\nimport { isKagiAvailable, searchWithKagi } from \"./kagi.ts\";\nimport { isBochaAvailable, searchWithBocha } from \"./bocha.ts\";\nimport { isOllamaAvailable, searchWithOllama } from \"./ollama.ts\";\nimport { isSearXNGAvailable, searchWithSearXNG } from \"./searxng.ts\";\nimport { isDuckDuckGoAvailable, searchWithDuckDuckGo } from \"./duckduckgo.ts\";\nimport { isAnySearchAvailable, searchWithAnySearch } from \"./anysearch.ts\";\nimport { isXcrawlAvailable, searchWithXCrawl } from \"./xcrawl.ts\";\nimport { isXaiSearchAvailable, searchWithXai } from \"./xai-search.ts\";\nimport { isBrightDataAvailable, searchWithBrightData } from \"./brightdata.ts\";\nimport { isSerpBaseAvailable, searchWithSerpBase } from \"./serpbase.ts\";\nimport { isSerperAvailable, searchWithSerper } from \"./serper.ts\";\nimport { isValyuAvailable, searchWithValyu } from \"./valyu.ts\";\nimport { isKimiSearchAvailable, searchWithKimi } from \"./kimi-search.ts\";\nimport { isMistralAvailable, searchWithMistral } from \"./mistral-search.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nexport const RESOLVED_SEARCH_PROVIDERS = [\"openai\", \"brave\", \"parallel\", \"parallel-mcp\", \"tinyfish\", \"search1api\", \"searchinfinity\", \"querit\", \"tavily\", \"firecrawl\", \"jina\", \"searxng\", \"duckduckgo\", \"perplexity\", \"gemini\", \"kimi\", \"exa\", \"serpdive\", \"kagi\", \"ollama\", \"anysearch\", \"xai\", \"mistral\", \"brightdata\", \"serpbase\", \"serper\", \"valyu\", \"bocha\", \"xcrawl\"] as const;\nexport const SEARCH_PROVIDERS = [\"auto\", \"all\", ...RESOLVED_SEARCH_PROVIDERS] as const;\n\nexport type ResolvedSearchProvider = typeof RESOLVED_SEARCH_PROVIDERS[number];\nexport type SearchProvider = typeof SEARCH_PROVIDERS[number];\nexport type SearchProviderSelection = SearchProvider | ResolvedSearchProvider[];\nexport type ProviderAvailability = { all: boolean } & Record<ResolvedSearchProvider, boolean>;\nexport type SearchProviderErrorKind =\n\t| \"transient\"\n\t| \"quota\"\n\t| \"network\"\n\t| \"credential\"\n\t| \"config\"\n\t| \"auth\"\n\t| \"invalid-request\"\n\t| \"invalid-response\"\n\t| \"unsupported\"\n\t| \"aborted\"\n\t| \"unknown\";\n\nexport interface SearchRoutingConfig {\n\tproviders: ResolvedSearchProvider[];\n\tuseCurrentModel?: boolean;\n\tfallbackOn: Array<Extract<SearchProviderErrorKind, \"transient\" | \"quota\" | \"network\" | \"invalid-response\" | \"unsupported\">>;\n}\n\nexport class SearchProviderError extends Error {\n\treadonly provider: ResolvedSearchProvider;\n\treadonly kind: SearchProviderErrorKind;\n\treadonly status?: number;\n\treadonly causeError: unknown;\n\n\tconstructor(\n\t\tprovider: ResolvedSearchProvider,\n\t\tkind: SearchProviderErrorKind,\n\t\tmessage: string,\n\t\tstatus: number | undefined,\n\t\tcause: unknown,\n\t) {\n\t\tsuper(`${provider} search failed (${kind}): ${message}`);\n\t\tthis.name = \"SearchProviderError\";\n\t\tthis.provider = provider;\n\t\tthis.kind = kind;\n\t\tthis.status = status;\n\t\tthis.causeError = cause;\n\t}\n}\n\nexport interface ProviderSearchResponse extends SearchResponse {\n\tprovider: ResolvedSearchProvider;\n}\n\nexport interface ProviderSearchFailure {\n\tprovider: ResolvedSearchProvider;\n\terror: string;\n}\n\nexport interface AttributedSearchResponse extends SearchResponse {\n\tprovider: ResolvedSearchProvider | \"all\";\n\tproviderResponses?: ProviderSearchResponse[];\n\tproviderErrors?: ProviderSearchFailure[];\n}\n\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst DEFAULT_SEARCH_MODEL = \"gemini-3.6-flash\";\n// Explicit-only providers (Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, xAI, Mistral, Bright Data, SerpBase, Serper, Valyu) are deliberately absent:\n// `all` must never fan out to an opt-in or paid provider without the user asking for it.\nexport const ALL_SEARCH_PROVIDERS: ResolvedSearchProvider[] = [\"searxng\", \"openai\", \"exa\", \"brave\", \"parallel\", \"tinyfish\", \"search1api\", \"searchinfinity\", \"querit\", \"tavily\", \"firecrawl\", \"jina\", \"serpdive\", \"kagi\", \"ollama\", \"perplexity\", \"gemini\", \"bocha\"];\nconst VALID_ROUTING_KINDS = [\"transient\", \"quota\", \"network\", \"invalid-response\", \"unsupported\"] as const;\n\ntype SearchConfig = {\n\tsearchProvider: SearchProviderSelection;\n\tsearchProviderConfigured: boolean;\n\tsearchRouting?: SearchRoutingConfig;\n\tsearchModel?: string;\n};\n\nlet cachedSearchConfig: SearchConfig | null = null;\n\nfunction getSearchConfig(): SearchConfig {\n\tif (cachedSearchConfig) return cachedSearchConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedSearchConfig = { searchProvider: \"auto\", searchProviderConfigured: false };\n\t\treturn cachedSearchConfig;\n\t}\n\n\tconst rawText = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet raw: Record<string, unknown>;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(rawText);\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"expected a JSON object\");\n\t\t}\n\t\traw = parsed as Record<string, unknown>;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\n\tconst searchModel = normalizeSearchModel(raw.searchModel);\n\tconst searchProviderConfigured = Object.hasOwn(raw, \"searchProvider\") || Object.hasOwn(raw, \"provider\");\n\tcachedSearchConfig = {\n\t\tsearchProvider: normalizeSearchProviderSelection(raw.searchProvider ?? raw.provider, `provider in ${CONFIG_PATH}`),\n\t\tsearchProviderConfigured,\n\t\t...(Object.hasOwn(raw, \"searchRouting\") ? { searchRouting: normalizeSearchRouting(raw.searchRouting) } : {}),\n\t\t...(searchModel ? { searchModel } : {}),\n\t};\n\treturn cachedSearchConfig;\n}\n\nfunction normalizeSearchRouting(value: unknown): SearchRoutingConfig {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(`searchRouting in ${CONFIG_PATH} must be an object`);\n\t}\n\tconst raw = value as Record<string, unknown>;\n\tconst providers = normalizeResolvedProviderList(raw.providers, `searchRouting.providers in ${CONFIG_PATH}`);\n\tconst useCurrentModel = raw.useCurrentModel;\n\tif (useCurrentModel !== undefined && typeof useCurrentModel !== \"boolean\") {\n\t\tthrow new Error(`searchRouting.useCurrentModel in ${CONFIG_PATH} must be a boolean`);\n\t}\n\tif (!Array.isArray(raw.fallbackOn) || raw.fallbackOn.length === 0) {\n\t\tthrow new Error(`searchRouting.fallbackOn in ${CONFIG_PATH} must be a non-empty array`);\n\t}\n\tconst fallbackOn: SearchRoutingConfig[\"fallbackOn\"] = [];\n\tfor (const kind of raw.fallbackOn) {\n\t\tif (typeof kind !== \"string\" || !VALID_ROUTING_KINDS.includes(kind as typeof VALID_ROUTING_KINDS[number])) {\n\t\t\tthrow new Error(`searchRouting.fallbackOn in ${CONFIG_PATH} may only contain transient, quota, network, invalid-response, or unsupported`);\n\t\t}\n\t\tif (!fallbackOn.includes(kind as SearchRoutingConfig[\"fallbackOn\"][number])) {\n\t\t\tfallbackOn.push(kind as SearchRoutingConfig[\"fallbackOn\"][number]);\n\t\t}\n\t}\n\treturn {\n\t\tproviders,\n\t\t...(useCurrentModel !== undefined ? { useCurrentModel: useCurrentModel as boolean } : {}),\n\t\tfallbackOn,\n\t};\n}\n\nexport function getConfiguredSearchRouting(): SearchRoutingConfig | undefined {\n\tconst config = getSearchConfig();\n\treturn config.searchProviderConfigured ? undefined : config.searchRouting;\n}\n\nfunction normalizeSearchModel(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeResolvedProviderList(value: unknown, label: string): ResolvedSearchProvider[] {\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\tthrow new Error(`${label} must be a non-empty array`);\n\t}\n\tconst providers: ResolvedSearchProvider[] = [];\n\tfor (const provider of value) {\n\t\tconst normalized = typeof provider === \"string\" ? provider.trim().toLowerCase() : \"\";\n\t\tif (!RESOLVED_SEARCH_PROVIDERS.includes(normalized as ResolvedSearchProvider)) {\n\t\t\tthrow new Error(`${label} contains an invalid provider: ${String(provider)}`);\n\t\t}\n\t\tif (providers.includes(normalized as ResolvedSearchProvider)) {\n\t\t\tthrow new Error(`${label} must not contain duplicates: ${normalized}`);\n\t\t}\n\t\tproviders.push(normalized as ResolvedSearchProvider);\n\t}\n\treturn providers;\n}\n\nexport function normalizeSearchProviderSelection(value: unknown, label = \"provider\"): SearchProviderSelection {\n\tif (Array.isArray(value)) return normalizeResolvedProviderList(value, label);\n\tconst normalized = typeof value === \"string\" ? value.trim().toLowerCase() : \"\";\n\treturn SEARCH_PROVIDERS.includes(normalized as SearchProvider) ? normalized as SearchProvider : \"auto\";\n}\n\nexport interface FullSearchOptions extends SearchOptions {\n\tprovider?: SearchProviderSelection;\n\tincludeContent?: boolean;\n\textensionContext?: ExtensionContext;\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction isAbortError(err: unknown): boolean {\n\treturn errorMessage(err).toLowerCase().includes(\"abort\");\n}\n\nfunction shouldTryOpenAIInAuto(options: SearchOptions): boolean {\n\tif (options.recencyFilter) return false;\n\tif (typeof options.numResults === \"number\" && Number.isFinite(options.numResults) && Math.floor(options.numResults) !== 5) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction isOpenAICodexSelected(ctx?: ExtensionContext): boolean {\n\treturn ctx?.model?.provider === \"openai-codex\";\n}\n\nasync function tryOpenAIInAuto(query: string, options: FullSearchOptions, fallbackErrors: string[]): Promise<AttributedSearchResponse | null> {\n\tif (!shouldTryOpenAIInAuto(options)) return null;\n\ttry {\n\t\tif (await isOpenAISearchAvailable(options.extensionContext)) {\n\t\t\tconst result = await searchWithOpenAI(query, options, options.extensionContext);\n\t\t\treturn { ...result, provider: \"openai\" };\n\t\t}\n\t} catch (err) {\n\t\tif (isAbortError(err)) throw err;\n\t\tfallbackErrors.push(`OpenAI: ${errorMessage(err)}`);\n\t}\n\treturn null;\n}\n\nasync function searchWithGemini(\n\tquery: string,\n\toptions: SearchOptions,\n\tstrictErrors: boolean,\n): Promise<SearchResponse | null> {\n\tconst errors: string[] = [];\n\n\ttry {\n\t\tconst apiResult = await searchWithGeminiApi(query, options);\n\t\tif (apiResult) return apiResult;\n\t} catch (err) {\n\t\tif (err instanceof CredentialResolutionError || isAbortError(err)) throw err;\n\t\terrors.push(`Gemini API: ${errorMessage(err)}`);\n\t}\n\n\ttry {\n\t\tconst webResult = await searchWithGeminiWeb(query, options);\n\t\tif (webResult) return webResult;\n\t\tconst diagnostic = getGeminiWebAvailabilityDiagnostic();\n\t\tif (diagnostic) errors.push(`Gemini Web: ${diagnostic}`);\n\t} catch (err) {\n\t\tif (isAbortError(err)) throw err;\n\t\terrors.push(`Gemini Web: ${errorMessage(err)}`);\n\t}\n\n\tif (strictErrors && errors.length > 0) {\n\t\tthrow new Error(`Gemini search failed:\\n - ${errors.join(\"\\n - \")}`);\n\t}\n\n\treturn null;\n}\n\nfunction providerErrorStatus(message: string): number | undefined {\n\tconst match = message.match(/\\b(?:error|status|http)\\s+(\\d{3})\\b/i);\n\tif (!match) return undefined;\n\treturn Number(match[1]);\n}\n\nfunction classifyProviderError(provider: ResolvedSearchProvider, err: unknown): SearchProviderError {\n\tif (err instanceof SearchProviderError) return err;\n\tconst message = errorMessage(err);\n\tconst lower = message.toLowerCase();\n\tconst status = providerErrorStatus(message);\n\tlet kind: SearchProviderErrorKind = \"unknown\";\n\tconst mentionsUnsupportedWebSearch = /(?:web[_ -]?search|web[_ -]?search_preview|(?:the )?tool)\\b.*\\b(?:unsupported|not supported|does not support|doesn't support|unknown|unrecognized|unavailable|not found)|\\b(?:unsupported|not supported|does not support|doesn't support|unknown|unrecognized|unavailable|not found)\\b.*\\b(?:web[_ -]?search|web[_ -]?search_preview|(?:the )?tool)/i.test(lower);\n\tif (err instanceof CredentialResolutionError || /(?:api )?key (?:not found|missing)|credential resolution/.test(lower)) {\n\t\tkind = \"credential\";\n\t} else if (isAbortError(err)) {\n\t\tkind = \"aborted\";\n\t} else if (provider === \"xai\" && status === 403 && /spending[- ]limit|(?:no|out of) credits?|insufficient quota|quota (?:exceeded|exhausted)|credits? (?:exhausted|depleted|used up)/.test(lower)) {\n\t\tkind = \"quota\";\n\t} else if (status === 401 || status === 403) {\n\t\tkind = \"auth\";\n\t} else if (provider === \"openai\" && (status === 400 || status === 422) && mentionsUnsupportedWebSearch) {\n\t\tkind = \"unsupported\";\n\t} else if (status === 400 || status === 422) {\n\t\tkind = \"invalid-request\";\n\t} else if (status === 402 || status === 429) {\n\t\tkind = \"quota\";\n\t} else if (status !== undefined && (status === 408 || status === 425 || status >= 500)) {\n\t\tkind = \"transient\";\n\t} else if (/rate limit|quota|too many requests/.test(lower)) {\n\t\tkind = \"quota\";\n\t} else if (/unauthorized|forbidden|permission denied/.test(lower)) {\n\t\tkind = \"auth\";\n\t} else if (/bad request|invalid request/.test(lower)) {\n\t\tkind = \"invalid-request\";\n\t} else if (/invalid json|no parseable response|no parseable results|invalid response|returned empty response|no web_search_call/.test(lower)) {\n\t\tkind = \"invalid-response\";\n\t} else if (/temporar|service unavailable|server error/.test(lower)) {\n\t\tkind = \"transient\";\n\t} else if (err instanceof TypeError || /fetch failed|network|econnreset|econnrefused|enotfound|etimedout|timed out|socket/.test(lower)) {\n\t\tkind = \"network\";\n\t} else if (/invalid or missing|invalid config|failed to parse|must be an? |configuration/.test(lower)) {\n\t\tkind = \"config\";\n\t}\n\treturn new SearchProviderError(provider, kind, message, status, err);\n}\n\nasync function searchWithResolvedProvider(\n\tprovider: ResolvedSearchProvider,\n\tquery: string,\n\toptions: FullSearchOptions,\n\tuseCurrentModel = false,\n): Promise<AttributedSearchResponse> {\n\tif (provider === \"openai\") {\n\t\tconst result = useCurrentModel\n\t\t\t? await searchWithCurrentModelOpenAI(query, options, options.extensionContext)\n\t\t\t: await searchWithOpenAI(query, options, options.extensionContext);\n\t\treturn { ...result, provider };\n\t}\n\tif (provider === \"brave\") return { ...(await searchWithBrave(query, options)), provider };\n\tif (provider === \"parallel\") return { ...(await searchWithParallel(query, options)), provider };\n\tif (provider === \"parallel-mcp\") return { ...(await searchWithParallelMcp(query, options)), provider };\n\tif (provider === \"tinyfish\") return { ...(await searchWithTinyFish(query, options)), provider };\n\tif (provider === \"search1api\") return { ...(await searchWithSearch1API(query, options)), provider };\n\tif (provider === \"searchinfinity\") return { ...(await searchWithSearchinfinity(query, options)), provider };\n\tif (provider === \"querit\") return { ...(await searchWithQuerit(query, options)), provider };\n\tif (provider === \"tavily\") return { ...(await searchWithTavily(query, options)), provider };\n\tif (provider === \"firecrawl\") return { ...(await searchWithFirecrawl(query, options)), provider };\n\tif (provider === \"jina\") return { ...(await searchWithJina(query, options)), provider };\n\tif (provider === \"serpdive\") return { ...(await searchWithSerpdive(query, options)), provider };\n\tif (provider === \"kagi\") return { ...(await searchWithKagi(query, options)), provider };\n\tif (provider === \"bocha\") return { ...(await searchWithBocha(query, options)), provider };\n\tif (provider === \"ollama\") return { ...(await searchWithOllama(query, options)), provider };\n\tif (provider === \"anysearch\") return { ...(await searchWithAnySearch(query, options)), provider };\n\tif (provider === \"xai\") return { ...(await searchWithXai(query, options, options.extensionContext)), provider };\n\tif (provider === \"mistral\") return { ...(await searchWithMistral(query, options)), provider };\n\tif (provider === \"brightdata\") return { ...(await searchWithBrightData(query, options)), provider };\n\tif (provider === \"serpbase\") return { ...(await searchWithSerpBase(query, options)), provider };\n\tif (provider === \"serper\") return { ...(await searchWithSerper(query, options)), provider };\n\tif (provider === \"valyu\") return { ...(await searchWithValyu(query, options)), provider };\n\tif (provider === \"xcrawl\") return { ...(await searchWithXCrawl(query, options)), provider };\n\tif (provider === \"perplexity\") return { ...(await searchWithPerplexity(query, options)), provider };\n\tif (provider === \"searxng\") return { ...(await searchWithSearXNG(query, options)), provider };\n\tif (provider === \"duckduckgo\") return { ...(await searchWithDuckDuckGo(query, options)), provider };\n\tif (provider === \"kimi\") return { ...(await searchWithKimi(query, options, options.extensionContext)), provider };\n\tif (provider === \"gemini\") {\n\t\tconst result = await searchWithGemini(query, options, true);\n\t\tif (result) return { ...result, provider };\n\t\tthrow new Error(\n\t\t\t\"Gemini search unavailable. Either:\\n\" +\n\t\t\t` 1. Configure geminiApiKey in ${CONFIG_PATH} or set GEMINI_API_KEY\\n` +\n\t\t\t\" 2. Set GOOGLE_GEMINI_BASE_URL + CLOUDFLARE_API_KEY for Cloudflare AI Gateway routing\\n\" +\n\t\t\t\" 3. Set geminiAuth to \\\"adc\\\" in web-search.json with a Google Cloud ADC + project/location\\n\" +\n\t\t\t\" 4. Sign into gemini.google.com in a supported Chromium-based browser\",\n\t\t);\n\t}\n\tconst result = await searchWithExa(query, options);\n\tif (result) return { ...result, provider };\n\tthrow new Error(\"Exa search returned no results.\");\n}\n\nasync function isResolvedProviderAvailable(provider: ResolvedSearchProvider, options: FullSearchOptions, useCurrentModel = false): Promise<boolean> {\n\tif (provider === \"openai\") {\n\t\treturn useCurrentModel\n\t\t\t? isCurrentModelHostedSearchEligible(options.extensionContext)\n\t\t\t: isOpenAISearchAvailable(options.extensionContext);\n\t}\n\tif (provider === \"brave\") return isBraveAvailable();\n\tif (provider === \"parallel\") return isParallelAvailable();\n\tif (provider === \"parallel-mcp\") return isParallelMcpAvailable();\n\tif (provider === \"tinyfish\") return isTinyFishAvailable();\n\tif (provider === \"search1api\") return isSearch1APIAvailable();\n\tif (provider === \"searchinfinity\") return isSearchinfinityAvailable();\n\tif (provider === \"querit\") return isQueritAvailable();\n\tif (provider === \"tavily\") return isTavilyAvailable();\n\tif (provider === \"firecrawl\") return isFirecrawlAvailable();\n\tif (provider === \"jina\") return isJinaSearchAvailable();\n\tif (provider === \"serpdive\") return isSerpdiveAvailable();\n\tif (provider === \"kagi\") return isKagiAvailable();\n\tif (provider === \"bocha\") return isBochaAvailable();\n\tif (provider === \"ollama\") return isOllamaAvailable();\n\tif (provider === \"anysearch\") return isAnySearchAvailable();\n\tif (provider === \"xai\") return isXaiSearchAvailable(options.extensionContext);\n\tif (provider === \"mistral\") return isMistralAvailable();\n\tif (provider === \"brightdata\") return isBrightDataAvailable();\n\tif (provider === \"serpbase\") return isSerpBaseAvailable();\n\tif (provider === \"serper\") return isSerperAvailable();\n\tif (provider === \"valyu\") return isValyuAvailable();\n\tif (provider === \"xcrawl\") return isXcrawlAvailable();\n\tif (provider === \"perplexity\") return isPerplexityAvailable();\n\tif (provider === \"searxng\") return isSearXNGAvailable();\n\tif (provider === \"duckduckgo\") return isDuckDuckGoAvailable();\n\tif (provider === \"gemini\") return isGeminiApiAvailable() || await isGeminiWebOptionallyAvailable();\n\tif (provider === \"kimi\") return isKimiSearchAvailable(options.extensionContext);\n\treturn isExaAvailable();\n}\n\nasync function isGeminiWebOptionallyAvailable(): Promise<boolean> {\n\ttry {\n\t\treturn !!(await isGeminiWebAvailable());\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction providerLabel(provider: ResolvedSearchProvider): string {\n\tif (provider === \"openai\") return \"OpenAI\";\n\tif (provider === \"parallel-mcp\") return \"Parallel MCP\";\n\tif (provider === \"tinyfish\") return \"TinyFish\";\n\tif (provider === \"search1api\") return \"Search1API\";\n\tif (provider === \"searchinfinity\") return \"Searchinfinity\";\n\tif (provider === \"querit\") return \"Querit\";\n\tif (provider === \"firecrawl\") return \"Firecrawl\";\n\tif (provider === \"serpdive\") return \"SERPdive\";\n\tif (provider === \"searxng\") return \"SearXNG\";\n\tif (provider === \"duckduckgo\") return \"DuckDuckGo\";\n\tif (provider === \"kagi\") return \"Kagi\";\n\tif (provider === \"bocha\") return \"Bocha\";\n\tif (provider === \"xcrawl\") return \"XCrawl\";\n\tif (provider === \"kimi\") return \"Kimi\";\n\tif (provider === \"ollama\") return \"Ollama\";\n\tif (provider === \"xai\") return \"xAI\";\n\tif (provider === \"mistral\") return \"Mistral\";\n\tif (provider === \"brightdata\") return \"Bright Data\";\n\tif (provider === \"serpbase\") return \"SerpBase\";\n\tif (provider === \"serper\") return \"Serper\";\n\tif (provider === \"valyu\") return \"Valyu\";\n\treturn provider.charAt(0).toUpperCase() + provider.slice(1);\n}\n\nasync function searchWithAllProvider(\n\tprovider: ResolvedSearchProvider,\n\tquery: string,\n\toptions: FullSearchOptions,\n): Promise<AttributedSearchResponse> {\n\tif (provider !== \"gemini\") return searchWithResolvedProvider(provider, query, options);\n\tconst result = await searchWithGeminiApi(query, options);\n\tif (result) return { ...result, provider };\n\tthrow new Error(\"Gemini API search returned no results.\");\n}\n\nasync function searchWithProviders(\n\tquery: string,\n\toptions: FullSearchOptions,\n\tselectedProviders?: ResolvedSearchProvider[],\n): Promise<AttributedSearchResponse> {\n\tconst providers = selectedProviders ?? (await Promise.all(ALL_SEARCH_PROVIDERS.map(async (provider) => ({\n\t\tprovider,\n\t\tavailable: provider === \"gemini\"\n\t\t\t? isGeminiApiAvailable()\n\t\t\t: await isResolvedProviderAvailable(provider, options),\n\t})))).filter((entry) => entry.available).map((entry) => entry.provider);\n\tif (providers.length === 0) {\n\t\tthrow new Error(\"No configured search provider available for provider \\\"all\\\". Parallel MCP, DuckDuckGo, Kimi, AnySearch, xAI, Mistral, Bright Data, SerpBase, Serper, Valyu, and XCrawl are excluded.\");\n\t}\n\n\tconst settled = await Promise.allSettled(\n\t\tproviders.map((provider) => selectedProviders\n\t\t\t? searchWithResolvedProvider(provider, query, options)\n\t\t\t: searchWithAllProvider(provider, query, options)),\n\t);\n\tif (options.signal?.aborted) throw new Error(\"Aborted\");\n\n\tconst successes: AttributedSearchResponse[] = [];\n\tconst failures: Array<{ provider: ResolvedSearchProvider; error: string }> = [];\n\tfor (let index = 0; index < settled.length; index++) {\n\t\tconst outcome = settled[index];\n\t\tif (outcome.status === \"fulfilled\") {\n\t\t\tsuccesses.push(outcome.value);\n\t\t} else {\n\t\t\tfailures.push({ provider: providers[index], error: errorMessage(outcome.reason) });\n\t\t}\n\t}\n\tif (successes.length === 0) {\n\t\tconst label = selectedProviders ? \"Selected-provider\" : \"All-provider\";\n\t\tthrow new Error(`${label} search failed:\\n - ${failures.map(({ provider, error }) => `${providerLabel(provider)}: ${error}`).join(\"\\n - \")}`);\n\t}\n\n\tconst results: SearchResult[] = [];\n\tconst seenResultUrls = new Set<string>();\n\tconst inlineContent: NonNullable<SearchResponse[\"inlineContent\"]> = [];\n\tconst seenInlineUrls = new Set<string>();\n\tfor (const response of successes) {\n\t\tfor (const result of response.results) {\n\t\t\tif (seenResultUrls.has(result.url)) continue;\n\t\t\tseenResultUrls.add(result.url);\n\t\t\tresults.push(result);\n\t\t}\n\t\tfor (const content of response.inlineContent ?? []) {\n\t\t\tif (seenInlineUrls.has(content.url)) continue;\n\t\t\tseenInlineUrls.add(content.url);\n\t\t\tinlineContent.push(content);\n\t\t}\n\t}\n\n\tconst answerSections = successes.map((response) =>\n\t\t`## ${providerLabel(response.provider as ResolvedSearchProvider)}\\n\\n${response.answer || \"(No answer text returned.)\"}`\n\t);\n\tif (failures.length > 0) {\n\t\tanswerSections.push(\n\t\t\t`## Provider errors\\n\\n${failures.map(({ provider, error }) => `- **${providerLabel(provider)}:** ${error}`).join(\"\\n\")}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tprovider: \"all\",\n\t\tanswer: answerSections.join(\"\\n\\n\"),\n\t\tresults,\n\t\tproviderResponses: successes as ProviderSearchResponse[],\n\t\t...(failures.length > 0 ? { providerErrors: failures } : {}),\n\t\t...(inlineContent.length > 0 ? { inlineContent } : {}),\n\t};\n}\n\nasync function searchWithConfiguredRouting(\n\tquery: string,\n\toptions: FullSearchOptions,\n\trouting: SearchRoutingConfig,\n): Promise<AttributedSearchResponse> {\n\tconst diagnostics: string[] = [];\n\tfor (const provider of routing.providers) {\n\t\tconst useCurrentModel = provider === \"openai\" && routing.useCurrentModel === true;\n\t\tif (!(await isResolvedProviderAvailable(provider, options, useCurrentModel))) {\n\t\t\tdiagnostics.push(`${provider}: unavailable`);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\treturn await searchWithResolvedProvider(provider, query, options, useCurrentModel);\n\t\t} catch (err) {\n\t\t\tconst classified = classifyProviderError(provider, err);\n\t\t\tdiagnostics.push(`${provider} [${classified.kind}]: ${errorMessage(err)}`);\n\t\t\tif (!routing.fallbackOn.includes(classified.kind as SearchRoutingConfig[\"fallbackOn\"][number])) {\n\t\t\t\tthrow classified;\n\t\t\t}\n\t\t}\n\t}\n\tthrow new Error(`Configured search routing exhausted:\\n - ${diagnostics.join(\"\\n - \")}`);\n}\n\nexport async function search(query: string, options: FullSearchOptions = {}): Promise<AttributedSearchResponse> {\n\tconst config = getSearchConfig();\n\tconst provider = options.provider === undefined || options.provider === \"auto\"\n\t\t? config.searchProvider\n\t\t: options.provider;\n\tif (Array.isArray(provider)) {\n\t\treturn searchWithProviders(query, options, normalizeResolvedProviderList(provider, \"provider\"));\n\t}\n\tif (provider === \"all\") return searchWithProviders(query, options);\n\tif (provider !== \"auto\") return searchWithResolvedProvider(provider, query, options);\n\tif (!config.searchProviderConfigured && config.searchRouting) {\n\t\treturn searchWithConfiguredRouting(query, options, config.searchRouting);\n\t}\n\n\tconst fallbackErrors: string[] = [];\n\n\tif (isSearXNGAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSearXNG(query, options);\n\t\t\treturn { ...result, provider: \"searxng\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`SearXNG: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tlet triedOpenAI = false;\n\tif (!options.extensionContext || isOpenAICodexSelected(options.extensionContext)) {\n\t\ttriedOpenAI = true;\n\t\tconst result = await tryOpenAIInAuto(query, options, fallbackErrors);\n\t\tif (result) return result;\n\t}\n\n\tif (isExaAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithExa(query, options);\n\t\t\tif (result) return { ...result, provider: \"exa\" };\n\t\t} catch (err) {\n\t\t\tif (err instanceof CredentialResolutionError || isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Exa: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (!triedOpenAI) {\n\t\tconst result = await tryOpenAIInAuto(query, options, fallbackErrors);\n\t\tif (result) return result;\n\t}\n\n\tif (isBraveAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithBrave(query, options);\n\t\t\treturn { ...result, provider: \"brave\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Brave: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isParallelAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithParallel(query, options);\n\t\t\treturn { ...result, provider: \"parallel\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Parallel: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isTinyFishAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithTinyFish(query, options);\n\t\t\treturn { ...result, provider: \"tinyfish\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`TinyFish: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isSearch1APIAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSearch1API(query, options);\n\t\t\treturn { ...result, provider: \"search1api\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Search1API: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isSearchinfinityAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSearchinfinity(query, options);\n\t\t\treturn { ...result, provider: \"searchinfinity\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Searchinfinity: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isQueritAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithQuerit(query, options);\n\t\t\treturn { ...result, provider: \"querit\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Querit: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isTavilyAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithTavily(query, options);\n\t\t\treturn { ...result, provider: \"tavily\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Tavily: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isFirecrawlAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithFirecrawl(query, options);\n\t\t\treturn { ...result, provider: \"firecrawl\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Firecrawl: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isJinaSearchAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithJina(query, options);\n\t\t\treturn { ...result, provider: \"jina\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Jina: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isSerpdiveAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSerpdive(query, options);\n\t\t\treturn { ...result, provider: \"serpdive\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`SERPdive: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isKagiAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithKagi(query, options);\n\t\t\treturn { ...result, provider: \"kagi\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Kagi: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isBochaAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithBocha(query, options);\n\t\t\treturn { ...result, provider: \"bocha\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Bocha: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isOllamaAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithOllama(query, options);\n\t\t\treturn { ...result, provider: \"ollama\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Ollama: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isPerplexityAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithPerplexity(query, options);\n\t\t\treturn { ...result, provider: \"perplexity\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Perplexity: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\ttry {\n\t\tconst geminiResult = await searchWithGemini(query, options, false);\n\t\tif (geminiResult) return { ...geminiResult, provider: \"gemini\" };\n\t} catch (err) {\n\t\tif (isAbortError(err)) throw err;\n\t\tfallbackErrors.push(`Gemini: ${errorMessage(err)}`);\n\t}\n\n\tif (fallbackErrors.length > 0) {\n\t\tthrow new Error(`Auto provider search failed:\\n - ${fallbackErrors.join(\"\\n - \")}`);\n\t}\n\n\tthrow new Error(\n\t\t\"No search provider available. Either:\\n\" +\n\t\t\" 1. Use /login to sign in with a Codex subscription for OpenAI web search\\n\" +\n\t\t` 2. Set openaiApiKey, braveApiKey, parallelApiKey, tinyfishApiKey, search1apiApiKey, searchinfinityApiKey, queritApiKey, tavilyApiKey, firecrawlBaseUrl, jinaApiKey, serpdiveApiKey, kagiApiKey, ollamaApiKey, searxngBaseUrl, perplexityApiKey, exaApiKey, geminiApiKey, bochaApiKey, or cloudflareApiKey in ${CONFIG_PATH}\\n` +\n\t\t\" 3. Set OPENAI_API_KEY, BRAVE_API_KEY, PARALLEL_API_KEY, TINYFISH_API_KEY, SEARCH1API_KEY, SEARCHINFINITY_API_KEY, QUERIT_API_KEY, TAVILY_API_KEY, FIRECRAWL_BASE_URL, JINA_API_KEY, SERPDIVE_API_KEY, KAGI_API_KEY, BOCHA_API_KEY, OLLAMA_API_KEY, SEARXNG_BASE_URL, EXA_API_KEY, PERPLEXITY_API_KEY, GEMINI_API_KEY, or CLOUDFLARE_API_KEY env vars\\n\" +\n\t\t\" 4. Set GOOGLE_GEMINI_BASE_URL with CLOUDFLARE_API_KEY for Cloudflare AI Gateway routing\\n\" +\n\t\t\" 5. Sign into gemini.google.com in a supported Chromium-based browser\\n\" +\n\t\t\" 6. Explicitly select provider: \\\"anysearch\\\" for anonymous AnySearch, \\\"xcrawl\\\" for XCrawl, \\\"xai\\\" for Grok, \\\"mistral\\\" for Mistral Conversations web search, \\\"brightdata\\\" with brightdataSerpZone for paid Bright Data SERP, \\\"serpbase\\\" or \\\"serper\\\" for Google SERP, or \\\"valyu\\\" for research search\"\n\t);\n}\n\nasync function searchWithGeminiApi(query: string, options: SearchOptions = {}): Promise<SearchResponse | null> {\n\tconst requestSignal = AbortSignal.any([\n\t\tAbortSignal.timeout(120000),\n\t\t...(options.signal ? [options.signal] : []),\n\t]);\n\tconst apiKey = isGeminiAdcAvailable() ? null : await getApiKey(requestSignal);\n\tif (!apiKey && !isGatewayConfigured() && !isGeminiAdcAvailable()) return null;\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\n\ttry {\n\t\tconst model = getSearchConfig().searchModel ?? DEFAULT_SEARCH_MODEL;\n\t\tconst body = {\n\t\t\tcontents: [{ role: \"user\", parts: [{ text: query }] }],\n\t\t\ttools: [{ google_search: {} }],\n\t\t};\n\n\t\tconst res = await fetchGeminiApi(`${getVersionedApiBase()}/models/${model}:generateContent`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal,\n\t\t}, apiKey);\n\n\t\tif (!res.ok) {\n\t\t\tconst errorText = redactGeminiApiResponse(res, await res.text(), apiKey);\n\t\t\tthrow new Error(`Gemini API error ${res.status}: ${errorText.slice(0, 300)}`);\n\t\t}\n\n\t\tconst data = await res.json() as GeminiSearchResponse;\n\t\tactivityMonitor.logComplete(activityId, res.status);\n\n\t\tconst answer = data.candidates?.[0]?.content?.parts\n\t\t\t?.map(p => p.text).filter(Boolean).join(\"\\n\") ?? \"\";\n\n\t\tconst metadata = data.candidates?.[0]?.groundingMetadata;\n\t\tconst results = await resolveGroundingChunks(metadata?.groundingChunks, options.signal);\n\n\t\tif (!answer && results.length === 0) return null;\n\t\treturn { answer, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n\nasync function searchWithGeminiWeb(query: string, options: SearchOptions = {}): Promise<SearchResponse | null> {\n\tconst cookies = await isGeminiWebAvailable();\n\tif (!cookies) return null;\n\n\tconst prompt = buildSearchPrompt(query, options);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\n\ttry {\n\t\tconst text = await queryWithCookies(prompt, cookies, {\n\t\t\tsignal: options.signal,\n\t\t\ttimeoutMs: 120000,\n\t\t});\n\n\t\tactivityMonitor.logComplete(activityId, 200);\n\n\t\tconst results = extractSourceUrls(text);\n\t\treturn { answer: text, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n\nfunction buildSearchPrompt(query: string, options: SearchOptions): string {\n\tlet prompt = `Search the web and answer the following question. Include source URLs for your claims.\\nFormat your response as:\\n1. A direct answer to the question\\n2. Cited sources as markdown links\\n\\nQuestion: ${query}`;\n\n\tif (options.recencyFilter) {\n\t\tconst labels: Record<string, string> = {\n\t\t\tday: \"past 24 hours\",\n\t\t\tweek: \"past week\",\n\t\t\tmonth: \"past month\",\n\t\t\tyear: \"past year\",\n\t\t};\n\t\tprompt += `\\n\\nOnly include results from the ${labels[options.recencyFilter]}.`;\n\t}\n\n\tif (options.domainFilter?.length) {\n\t\tconst includes = options.domainFilter.filter(d => !d.startsWith(\"-\"));\n\t\tconst excludes = options.domainFilter.filter(d => d.startsWith(\"-\")).map(d => d.slice(1));\n\t\tif (includes.length) prompt += `\\n\\nOnly cite sources from: ${includes.join(\", \")}`;\n\t\tif (excludes.length) prompt += `\\n\\nDo not cite sources from: ${excludes.join(\", \")}`;\n\t}\n\n\treturn prompt;\n}\n\nfunction extractSourceUrls(markdown: string): SearchResult[] {\n\tconst results: SearchResult[] = [];\n\tconst seen = new Set<string>();\n\tconst linkRegex = /\\[([^\\]]+)\\]\\((https?:\\/\\/[^)]+)\\)/g;\n\tfor (const match of markdown.matchAll(linkRegex)) {\n\t\tconst url = match[2];\n\t\tif (seen.has(url)) continue;\n\t\tseen.add(url);\n\t\tresults.push({ title: match[1], url, snippet: \"\" });\n\t}\n\treturn results;\n}\n\nasync function resolveGroundingChunks(\n\tchunks: GroundingChunk[] | undefined,\n\tsignal?: AbortSignal,\n): Promise<SearchResult[]> {\n\tif (!chunks?.length) return [];\n\n\tconst results: SearchResult[] = [];\n\tfor (const chunk of chunks) {\n\t\tif (!chunk.web) continue;\n\t\tconst title = chunk.web.title || \"\";\n\t\tlet url = chunk.web.uri || \"\";\n\n\t\tif (url.includes(\"vertexaisearch.cloud.google.com/grounding-api-redirect\")) {\n\t\t\tconst resolved = await resolveRedirect(url, signal);\n\t\t\tif (resolved) url = resolved;\n\t\t}\n\n\t\tif (url) results.push({ title, url, snippet: \"\" });\n\t}\n\treturn results;\n}\n\nasync function resolveRedirect(proxyUrl: string, signal?: AbortSignal): Promise<string | null> {\n\ttry {\n\t\tconst res = await fetch(proxyUrl, {\n\t\t\tmethod: \"HEAD\",\n\t\t\tredirect: \"manual\",\n\t\t\tsignal: AbortSignal.any([\n\t\t\t\tAbortSignal.timeout(5000),\n\t\t\t\t...(signal ? [signal] : []),\n\t\t\t]),\n\t\t});\n\t\treturn res.headers.get(\"location\") || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface GeminiSearchResponse {\n\tcandidates?: Array<{\n\t\tcontent?: { parts?: Array<{ text?: string }> };\n\t\tgroundingMetadata?: {\n\t\t\twebSearchQueries?: string[];\n\t\t\tgroundingChunks?: GroundingChunk[];\n\t\t\tgroundingSupports?: Array<{\n\t\t\t\tsegment?: { startIndex?: number; endIndex?: number; text?: string };\n\t\t\t\tgroundingChunkIndices?: number[];\n\t\t\t}>;\n\t\t};\n\t}>;\n}\n\ninterface GroundingChunk {\n\tweb?: { uri?: string; title?: string };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gemini-search.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACrJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,kCAAkC,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC7G,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAA8D,MAAM,iBAAiB,CAAC;AAC1I,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EACN,kCAAkC,EAClC,uBAAuB,EACvB,4BAA4B,EAC5B,gBAAgB,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAC/X,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,yBAAyB,CAAU,CAAC;AAyBvF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAM7C,YACC,QAAgC,EAChC,IAA6B,EAC7B,OAAe,EACf,MAA0B,EAC1B,KAAc;QAEd,KAAK,CAAC,GAAG,QAAQ,mBAAmB,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IACzB,CAAC;CACD;AAiBD,MAAM,WAAW,GAAG,sBAAsB,EAAE,CAAC;AAC7C,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAChD,oKAAoK;AACpK,yFAAyF;AACzF,MAAM,CAAC,MAAM,oBAAoB,GAA6B,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACpQ,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,CAAU,CAAC;AAS1G,IAAI,kBAAkB,GAAwB,IAAI,CAAC;AAEnD,SAAS,eAAe;IACvB,IAAI,kBAAkB;QAAE,OAAO,kBAAkB,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,kBAAkB,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC;QACjF,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,GAA4B,CAAC;IACjC,IAAI,CAAC;QACJ,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3C,CAAC;QACD,GAAG,GAAG,MAAiC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,mBAAmB,WAAW,KAAK,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACxG,kBAAkB,GAAG;QACpB,cAAc,EAAE,gCAAgC,CAAC,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,QAAQ,EAAE,eAAe,WAAW,EAAE,CAAC;QAClH,wBAAwB;QACxB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5G,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvC,CAAC;IACF,OAAO,kBAAkB,CAAC;AAC3B,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,oBAAoB,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,SAAS,GAAG,6BAA6B,CAAC,GAAG,CAAC,SAAS,EAAE,8BAA8B,WAAW,EAAE,CAAC,CAAC;IAC5G,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;IAC5C,IAAI,eAAe,KAAK,SAAS,IAAI,OAAO,eAAe,KAAK,SAAS,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,oBAAoB,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,+BAA+B,WAAW,4BAA4B,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,UAAU,GAAsC,EAAE,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAA0C,CAAC,EAAE,CAAC;YAC3G,MAAM,IAAI,KAAK,CAAC,+BAA+B,WAAW,+EAA+E,CAAC,CAAC;QAC5I,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAiD,CAAC,EAAE,CAAC;YAC7E,UAAU,CAAC,IAAI,CAAC,IAAiD,CAAC,CAAC;QACpE,CAAC;IACF,CAAC;IACD,OAAO;QACN,SAAS;QACT,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,eAA0B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,UAAU;KACV,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B;IACzC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,OAAO,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;AAC3E,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAc,EAAE,KAAa;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,SAAS,GAA6B,EAAE,CAAC;IAC/C,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,UAAoC,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kCAAkC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAoC,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iCAAiC,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,UAAoC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAc,EAAE,KAAK,GAAG,UAAU;IAClF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,6BAA6B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO,gBAAgB,CAAC,QAAQ,CAAC,UAA4B,CAAC,CAAC,CAAC,CAAC,UAA4B,CAAC,CAAC,CAAC,MAAM,CAAC;AACxG,CAAC;AAQD,SAAS,YAAY,CAAC,GAAY;IACjC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IACjC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAsB;IACpD,IAAI,OAAO,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3H,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAsB;IACpD,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,KAAK,cAAc,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,OAA0B,EAAE,cAAwB;IACjG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,CAAC;QACJ,IAAI,MAAM,uBAAuB,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAChF,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC1C,CAAC;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,YAAY,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QACjC,cAAc,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC9B,KAAa,EACb,OAAsB,EACtB,YAAqB;IAErB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC;QACJ,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,yBAAyB,IAAI,YAAY,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,eAAe,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,MAAM,UAAU,GAAG,kCAAkC,EAAE,CAAC;QACxD,IAAI,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,YAAY,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,eAAe,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgC,EAAE,GAAY;IAC5E,IAAI,GAAG,YAAY,mBAAmB;QAAE,OAAO,GAAG,CAAC;IACnD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,IAAI,GAA4B,SAAS,CAAC;IAC9C,MAAM,4BAA4B,GAAG,sVAAsV,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxY,IAAI,GAAG,YAAY,yBAAyB,IAAI,0DAA0D,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxH,IAAI,GAAG,YAAY,CAAC;IACrB,CAAC;SAAM,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,IAAI,GAAG,SAAS,CAAC;IAClB,CAAC;SAAM,IAAI,QAAQ,KAAK,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI,kIAAkI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnM,IAAI,GAAG,OAAO,CAAC;IAChB,CAAC;SAAM,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7C,IAAI,GAAG,MAAM,CAAC;IACf,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,IAAI,4BAA4B,EAAE,CAAC;QACxG,IAAI,GAAG,aAAa,CAAC;IACtB,CAAC;SAAM,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7C,IAAI,GAAG,iBAAiB,CAAC;IAC1B,CAAC;SAAM,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1F,IAAI,GAAG,OAAO,CAAC;IAChB,CAAC;SAAM,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC;QACxF,IAAI,GAAG,WAAW,CAAC;IACpB,CAAC;SAAM,IAAI,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,IAAI,GAAG,OAAO,CAAC;IAChB,CAAC;SAAM,IAAI,0CAA0C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,IAAI,GAAG,MAAM,CAAC;IACf,CAAC;SAAM,IAAI,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,GAAG,iBAAiB,CAAC;IAC1B,CAAC;SAAM,IAAI,qHAAqH,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9I,IAAI,GAAG,kBAAkB,CAAC;IAC3B,CAAC;SAAM,IAAI,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpE,IAAI,GAAG,WAAW,CAAC;IACpB,CAAC;SAAM,IAAI,GAAG,YAAY,SAAS,IAAI,mFAAmF,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxI,IAAI,GAAG,SAAS,CAAC;IAClB,CAAC;SAAM,IAAI,8EAA8E,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvG,IAAI,GAAG,QAAQ,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,0BAA0B,CACxC,QAAgC,EAChC,KAAa,EACb,OAA0B,EAC1B,eAAe,GAAG,KAAK;IAEvB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,eAAe;YAC7B,CAAC,CAAC,MAAM,4BAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC;YAC9E,CAAC,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACpE,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC1F,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAChG,IAAI,QAAQ,KAAK,cAAc;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvG,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAChG,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpG,IAAI,QAAQ,KAAK,gBAAgB;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5G,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5F,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5F,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClG,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxF,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAChG,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxF,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC1F,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5F,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClG,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAChH,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC9F,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpG,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAChG,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC9F,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5F,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC1F,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5F,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpG,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC9F,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpG,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClH,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,MAAM;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACd,sCAAsC;YACtC,kCAAkC,WAAW,0BAA0B;YACvE,0FAA0F;YAC1F,gGAAgG;YAChG,wEAAwE,CACxE,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,MAAM;QAAE,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC3C,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,QAAgC,EAAE,OAA0B,EAAE,eAAe,GAAG,KAAK;IAC/H,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,eAAe;YACrB,CAAC,CAAC,kCAAkC,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC9D,CAAC,CAAC,uBAAuB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,gBAAgB,EAAE,CAAC;IACpD,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,mBAAmB,EAAE,CAAC;IAC1D,IAAI,QAAQ,KAAK,cAAc;QAAE,OAAO,sBAAsB,EAAE,CAAC;IACjE,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,mBAAmB,EAAE,CAAC;IAC1D,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,qBAAqB,EAAE,CAAC;IAC9D,IAAI,QAAQ,KAAK,gBAAgB;QAAE,OAAO,yBAAyB,EAAE,CAAC;IACtE,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,iBAAiB,EAAE,CAAC;IACtD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,iBAAiB,EAAE,CAAC;IACtD,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,oBAAoB,EAAE,CAAC;IAC5D,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,qBAAqB,EAAE,CAAC;IACxD,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,mBAAmB,EAAE,CAAC;IAC1D,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,eAAe,EAAE,CAAC;IAClD,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,gBAAgB,EAAE,CAAC;IACpD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,iBAAiB,EAAE,CAAC;IACtD,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,oBAAoB,EAAE,CAAC;IAC5D,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,oBAAoB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9E,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,kBAAkB,EAAE,CAAC;IACxD,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,qBAAqB,EAAE,CAAC;IAC9D,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,mBAAmB,EAAE,CAAC;IAC1D,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,kBAAkB,EAAE,CAAC;IACxD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,iBAAiB,EAAE,CAAC;IACtD,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,gBAAgB,EAAE,CAAC;IACpD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,iBAAiB,EAAE,CAAC;IACtD,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,qBAAqB,EAAE,CAAC;IAC9D,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,kBAAkB,EAAE,CAAC;IACxD,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,qBAAqB,EAAE,CAAC;IAC9D,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,oBAAoB,EAAE,IAAI,MAAM,8BAA8B,EAAE,CAAC;IACnG,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,qBAAqB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChF,OAAO,cAAc,EAAE,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,8BAA8B;IAC5C,IAAI,CAAC;QACJ,OAAO,CAAC,CAAC,CAAC,MAAM,oBAAoB,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,QAAgC;IACtD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,QAAQ,KAAK,cAAc;QAAE,OAAO,cAAc,CAAC;IACvD,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC/C,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IACnD,IAAI,QAAQ,KAAK,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAC3D,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IACjD,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC/C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IACnD,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACzC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,aAAa,CAAC;IACpD,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC/C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACzC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,qBAAqB,CACnC,QAAgC,EAChC,KAAa,EACb,OAA0B;IAE1B,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,0BAA0B,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,MAAM;QAAE,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC3C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,mBAAmB,CACjC,KAAa,EACb,OAA0B,EAC1B,iBAA4C;IAE5C,MAAM,SAAS,GAAG,iBAAiB,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACvG,QAAQ;QACR,SAAS,EAAE,QAAQ,KAAK,QAAQ;YAC/B,CAAC,CAAC,oBAAoB,EAAE;YACxB,CAAC,CAAC,MAAM,2BAA2B,CAAC,QAAQ,EAAE,OAAO,CAAC;KACvD,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,gMAAgM,CAAC,CAAC;IACnN,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACvC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB;QAC5C,CAAC,CAAC,0BAA0B,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;QACtD,CAAC,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CACnD,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAExD,MAAM,SAAS,GAA+B,EAAE,CAAC;IACjD,MAAM,QAAQ,GAA+D,EAAE,CAAC;IAChF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACpC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACP,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;IACF,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wBAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjJ,CAAC;IAED,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,aAAa,GAAiD,EAAE,CAAC;IACvE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC7C,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;YACpD,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC9C,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACjD,MAAM,aAAa,CAAC,QAAQ,CAAC,QAAkC,CAAC,OAAO,QAAQ,CAAC,MAAM,IAAI,4BAA4B,EAAE,CACxH,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,cAAc,CAAC,IAAI,CAClB,yBAAyB,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,OAAO,aAAa,CAAC,QAAQ,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzH,CAAC;IACH,CAAC;IAED,OAAO;QACN,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QACnC,OAAO;QACP,iBAAiB,EAAE,SAAqC;QACxD,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CACzC,KAAa,EACb,OAA0B,EAC1B,OAA4B;IAE5B,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,eAAe,GAAG,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,CAAC;QAClF,IAAI,CAAC,CAAC,MAAM,2BAA2B,CAAC,QAAQ,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;YAC9E,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,eAAe,CAAC,CAAC;YAC7C,SAAS;QACV,CAAC;QACD,IAAI,CAAC;YACJ,OAAO,MAAM,0BAA0B,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACxD,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,UAAU,CAAC,IAAI,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAiD,CAAC,EAAE,CAAC;gBAChG,MAAM,UAAU,CAAC;YAClB,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAa,EAAE,OAAO,GAAsB,EAAE;IAC1E,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM;QAC7E,CAAC,CAAC,MAAM,CAAC,cAAc;QACvB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACpB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,6BAA6B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnE,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,0BAA0B,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACrF,IAAI,CAAC,MAAM,CAAC,wBAAwB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QAC9D,OAAO,2BAA2B,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,IAAI,kBAAkB,EAAE,EAAE,CAAC;QAC1B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,YAAY,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;IAED,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,qBAAqB,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClF,WAAW,GAAG,IAAI,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc,EAAE,EAAE,CAAC;QACtB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,MAAM;gBAAE,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,GAAG,YAAY,yBAAyB,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YAC7E,cAAc,CAAC,IAAI,CAAC,QAAQ,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACxB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACxD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,aAAa,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACxD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,aAAa,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1D,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,eAAe,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAED,IAAI,yBAAyB,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9D,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,mBAAmB,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;IAED,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,cAAc,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IAED,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IAED,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACxD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,aAAa,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,IAAI,eAAe,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IAED,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACxB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1D,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,eAAe,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACnE,IAAI,YAAY;YAAE,OAAO,EAAE,GAAG,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,YAAY,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QACjC,cAAc,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,qCAAqC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,IAAI,KAAK,CACd,yCAAyC;QACzC,8EAA8E;QAC9E,kTAAkT,WAAW,IAAI;QACjU,0VAA0V;QAC1V,6FAA6F;QAC7F,0EAA0E;QAC1E,iUAAiU,CACjU,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAAa,EAAE,OAAO,GAAkB,EAAE;IAC5E,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC;QACrC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,oBAAoB,EAAE;QAAE,OAAO,IAAI,CAAC;IAE9E,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpE,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC,WAAW,IAAI,oBAAoB,CAAC;QACpE,MAAM,IAAI,GAAG;YACZ,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACtD,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;SAC9B,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,mBAAmB,EAAE,WAAW,KAAK,kBAAkB,EAAE;YAC5F,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,aAAa;SACrB,EAAE,MAAM,CAAC,CAAC;QAEX,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA0B,CAAC;QACtD,eAAe,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK;YAClD,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAExF,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,eAAe,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACP,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,GAAG,CAAC;IACX,CAAC;AACF,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAAa,EAAE,OAAO,GAAkB,EAAE;IAC5E,MAAM,OAAO,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpE,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE;YACpD,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,MAAM;SACjB,CAAC,CAAC;QAEH,eAAe,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,eAAe,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACP,eAAe,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,GAAG,CAAC;IACX,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,OAAsB;IAC/D,IAAI,MAAM,GAAG,yMAAyM,KAAK,EAAE,CAAC;IAE9N,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAA2B;YACtC,GAAG,EAAE,eAAe;YACpB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW;SACjB,CAAC;QACF,MAAM,IAAI,qCAAqC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC;IACjF,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,IAAI,QAAQ,CAAC,MAAM;YAAE,MAAM,IAAI,+BAA+B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpF,IAAI,QAAQ,CAAC,MAAM;YAAE,MAAM,IAAI,iCAAiC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACvF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IAC1C,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,SAAS,GAAG,qCAAqC,CAAC;IACxD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,sBAAsB,CACpC,MAAoC,EACpC,MAAoB;IAEpB,IAAI,CAAC,MAAM,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAE/B,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG;YAAE,SAAS;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAE9B,IAAI,GAAG,CAAC,QAAQ,CAAC,wDAAwD,CAAC,EAAE,CAAC;YAC5E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACpD,IAAI,QAAQ;gBAAE,GAAG,GAAG,QAAQ,CAAC;QAC9B,CAAC;QAED,IAAI,GAAG;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,MAAoB;IACpE,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC;gBACvB,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;gBACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3B,CAAC;SACF,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { CredentialResolutionError } from \"./credential-source.ts\";\nimport { getApiKey, getVersionedApiBase, fetchGeminiApi, isGatewayConfigured, isGeminiApiAvailable, redactGeminiApiResponse } from \"./gemini-api.ts\";\nimport { isGeminiAdcAvailable } from \"./gemini-adc.ts\";\nimport { getGeminiWebAvailabilityDiagnostic, isGeminiWebAvailable, queryWithCookies } from \"./gemini-web.ts\";\nimport { isPerplexityAvailable, searchWithPerplexity, type SearchResult, type SearchResponse, type SearchOptions } from \"./perplexity.ts\";\nimport { isExaAvailable, searchWithExa } from \"./exa.ts\";\nimport { isBraveAvailable, searchWithBrave } from \"./brave.ts\";\nimport {\n\tisCurrentModelHostedSearchEligible,\n\tisOpenAISearchAvailable,\n\tsearchWithCurrentModelOpenAI,\n\tsearchWithOpenAI,\n} from \"./openai-search.ts\";\nimport { isParallelAvailable, searchWithParallel } from \"./parallel.ts\";\nimport { isParallelMcpAvailable, searchWithParallelMcp } from \"./parallel-mcp.ts\";\nimport { isTinyFishAvailable, searchWithTinyFish } from \"./tinyfish.ts\";\nimport { isSearch1APIAvailable, searchWithSearch1API } from \"./search1api.ts\";\nimport { isSearchinfinityAvailable, searchWithSearchinfinity } from \"./searchinfinity.ts\";\nimport { isQueritAvailable, searchWithQuerit } from \"./querit.ts\";\nimport { isTavilyAvailable, searchWithTavily } from \"./tavily.ts\";\nimport { isFirecrawlAvailable, searchWithFirecrawl } from \"./firecrawl.ts\";\nimport { isJinaSearchAvailable, searchWithJina } from \"./jina-search.ts\";\nimport { isSerpdiveAvailable, searchWithSerpdive } from \"./serpdive.ts\";\nimport { isKagiAvailable, searchWithKagi } from \"./kagi.ts\";\nimport { isBochaAvailable, searchWithBocha } from \"./bocha.ts\";\nimport { isOllamaAvailable, searchWithOllama } from \"./ollama.ts\";\nimport { isSearXNGAvailable, searchWithSearXNG } from \"./searxng.ts\";\nimport { isDuckDuckGoAvailable, searchWithDuckDuckGo } from \"./duckduckgo.ts\";\nimport { isAnySearchAvailable, searchWithAnySearch } from \"./anysearch.ts\";\nimport { isXcrawlAvailable, searchWithXCrawl } from \"./xcrawl.ts\";\nimport { isXaiSearchAvailable, searchWithXai } from \"./xai-search.ts\";\nimport { isBrightDataAvailable, searchWithBrightData } from \"./brightdata.ts\";\nimport { isSerpBaseAvailable, searchWithSerpBase } from \"./serpbase.ts\";\nimport { isSerpApiAvailable, searchWithSerpApi } from \"./serpapi.ts\";\nimport { isSerperAvailable, searchWithSerper } from \"./serper.ts\";\nimport { isValyuAvailable, searchWithValyu } from \"./valyu.ts\";\nimport { isKimiSearchAvailable, searchWithKimi } from \"./kimi-search.ts\";\nimport { isMistralAvailable, searchWithMistral } from \"./mistral-search.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nexport const RESOLVED_SEARCH_PROVIDERS = [\"openai\", \"brave\", \"parallel\", \"parallel-mcp\", \"tinyfish\", \"search1api\", \"searchinfinity\", \"querit\", \"tavily\", \"firecrawl\", \"jina\", \"searxng\", \"duckduckgo\", \"perplexity\", \"gemini\", \"kimi\", \"exa\", \"serpdive\", \"kagi\", \"ollama\", \"anysearch\", \"xai\", \"mistral\", \"brightdata\", \"serpbase\", \"serpapi\", \"serper\", \"valyu\", \"bocha\", \"xcrawl\"] as const;\nexport const SEARCH_PROVIDERS = [\"auto\", \"all\", ...RESOLVED_SEARCH_PROVIDERS] as const;\n\nexport type ResolvedSearchProvider = typeof RESOLVED_SEARCH_PROVIDERS[number];\nexport type SearchProvider = typeof SEARCH_PROVIDERS[number];\nexport type SearchProviderSelection = SearchProvider | ResolvedSearchProvider[];\nexport type ProviderAvailability = { all: boolean } & Record<ResolvedSearchProvider, boolean>;\nexport type SearchProviderErrorKind =\n\t| \"transient\"\n\t| \"quota\"\n\t| \"network\"\n\t| \"credential\"\n\t| \"config\"\n\t| \"auth\"\n\t| \"invalid-request\"\n\t| \"invalid-response\"\n\t| \"unsupported\"\n\t| \"aborted\"\n\t| \"unknown\";\n\nexport interface SearchRoutingConfig {\n\tproviders: ResolvedSearchProvider[];\n\tuseCurrentModel?: boolean;\n\tfallbackOn: Array<Extract<SearchProviderErrorKind, \"transient\" | \"quota\" | \"network\" | \"invalid-response\" | \"unsupported\">>;\n}\n\nexport class SearchProviderError extends Error {\n\treadonly provider: ResolvedSearchProvider;\n\treadonly kind: SearchProviderErrorKind;\n\treadonly status?: number;\n\treadonly causeError: unknown;\n\n\tconstructor(\n\t\tprovider: ResolvedSearchProvider,\n\t\tkind: SearchProviderErrorKind,\n\t\tmessage: string,\n\t\tstatus: number | undefined,\n\t\tcause: unknown,\n\t) {\n\t\tsuper(`${provider} search failed (${kind}): ${message}`);\n\t\tthis.name = \"SearchProviderError\";\n\t\tthis.provider = provider;\n\t\tthis.kind = kind;\n\t\tthis.status = status;\n\t\tthis.causeError = cause;\n\t}\n}\n\nexport interface ProviderSearchResponse extends SearchResponse {\n\tprovider: ResolvedSearchProvider;\n}\n\nexport interface ProviderSearchFailure {\n\tprovider: ResolvedSearchProvider;\n\terror: string;\n}\n\nexport interface AttributedSearchResponse extends SearchResponse {\n\tprovider: ResolvedSearchProvider | \"all\";\n\tproviderResponses?: ProviderSearchResponse[];\n\tproviderErrors?: ProviderSearchFailure[];\n}\n\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst DEFAULT_SEARCH_MODEL = \"gemini-3.6-flash\";\n// Explicit-only providers (Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, xAI, Mistral, Bright Data, SerpBase, SerpApi, Serper, Valyu) are deliberately absent:\n// `all` must never fan out to an opt-in or paid provider without the user asking for it.\nexport const ALL_SEARCH_PROVIDERS: ResolvedSearchProvider[] = [\"searxng\", \"openai\", \"exa\", \"brave\", \"parallel\", \"tinyfish\", \"search1api\", \"searchinfinity\", \"querit\", \"tavily\", \"firecrawl\", \"jina\", \"serpdive\", \"kagi\", \"ollama\", \"perplexity\", \"gemini\", \"bocha\"];\nconst VALID_ROUTING_KINDS = [\"transient\", \"quota\", \"network\", \"invalid-response\", \"unsupported\"] as const;\n\ntype SearchConfig = {\n\tsearchProvider: SearchProviderSelection;\n\tsearchProviderConfigured: boolean;\n\tsearchRouting?: SearchRoutingConfig;\n\tsearchModel?: string;\n};\n\nlet cachedSearchConfig: SearchConfig | null = null;\n\nfunction getSearchConfig(): SearchConfig {\n\tif (cachedSearchConfig) return cachedSearchConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedSearchConfig = { searchProvider: \"auto\", searchProviderConfigured: false };\n\t\treturn cachedSearchConfig;\n\t}\n\n\tconst rawText = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet raw: Record<string, unknown>;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(rawText);\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"expected a JSON object\");\n\t\t}\n\t\traw = parsed as Record<string, unknown>;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\n\tconst searchModel = normalizeSearchModel(raw.searchModel);\n\tconst searchProviderConfigured = Object.hasOwn(raw, \"searchProvider\") || Object.hasOwn(raw, \"provider\");\n\tcachedSearchConfig = {\n\t\tsearchProvider: normalizeSearchProviderSelection(raw.searchProvider ?? raw.provider, `provider in ${CONFIG_PATH}`),\n\t\tsearchProviderConfigured,\n\t\t...(Object.hasOwn(raw, \"searchRouting\") ? { searchRouting: normalizeSearchRouting(raw.searchRouting) } : {}),\n\t\t...(searchModel ? { searchModel } : {}),\n\t};\n\treturn cachedSearchConfig;\n}\n\nfunction normalizeSearchRouting(value: unknown): SearchRoutingConfig {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(`searchRouting in ${CONFIG_PATH} must be an object`);\n\t}\n\tconst raw = value as Record<string, unknown>;\n\tconst providers = normalizeResolvedProviderList(raw.providers, `searchRouting.providers in ${CONFIG_PATH}`);\n\tconst useCurrentModel = raw.useCurrentModel;\n\tif (useCurrentModel !== undefined && typeof useCurrentModel !== \"boolean\") {\n\t\tthrow new Error(`searchRouting.useCurrentModel in ${CONFIG_PATH} must be a boolean`);\n\t}\n\tif (!Array.isArray(raw.fallbackOn) || raw.fallbackOn.length === 0) {\n\t\tthrow new Error(`searchRouting.fallbackOn in ${CONFIG_PATH} must be a non-empty array`);\n\t}\n\tconst fallbackOn: SearchRoutingConfig[\"fallbackOn\"] = [];\n\tfor (const kind of raw.fallbackOn) {\n\t\tif (typeof kind !== \"string\" || !VALID_ROUTING_KINDS.includes(kind as typeof VALID_ROUTING_KINDS[number])) {\n\t\t\tthrow new Error(`searchRouting.fallbackOn in ${CONFIG_PATH} may only contain transient, quota, network, invalid-response, or unsupported`);\n\t\t}\n\t\tif (!fallbackOn.includes(kind as SearchRoutingConfig[\"fallbackOn\"][number])) {\n\t\t\tfallbackOn.push(kind as SearchRoutingConfig[\"fallbackOn\"][number]);\n\t\t}\n\t}\n\treturn {\n\t\tproviders,\n\t\t...(useCurrentModel !== undefined ? { useCurrentModel: useCurrentModel as boolean } : {}),\n\t\tfallbackOn,\n\t};\n}\n\nexport function getConfiguredSearchRouting(): SearchRoutingConfig | undefined {\n\tconst config = getSearchConfig();\n\treturn config.searchProviderConfigured ? undefined : config.searchRouting;\n}\n\nfunction normalizeSearchModel(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeResolvedProviderList(value: unknown, label: string): ResolvedSearchProvider[] {\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\tthrow new Error(`${label} must be a non-empty array`);\n\t}\n\tconst providers: ResolvedSearchProvider[] = [];\n\tfor (const provider of value) {\n\t\tconst normalized = typeof provider === \"string\" ? provider.trim().toLowerCase() : \"\";\n\t\tif (!RESOLVED_SEARCH_PROVIDERS.includes(normalized as ResolvedSearchProvider)) {\n\t\t\tthrow new Error(`${label} contains an invalid provider: ${String(provider)}`);\n\t\t}\n\t\tif (providers.includes(normalized as ResolvedSearchProvider)) {\n\t\t\tthrow new Error(`${label} must not contain duplicates: ${normalized}`);\n\t\t}\n\t\tproviders.push(normalized as ResolvedSearchProvider);\n\t}\n\treturn providers;\n}\n\nexport function normalizeSearchProviderSelection(value: unknown, label = \"provider\"): SearchProviderSelection {\n\tif (Array.isArray(value)) return normalizeResolvedProviderList(value, label);\n\tconst normalized = typeof value === \"string\" ? value.trim().toLowerCase() : \"\";\n\treturn SEARCH_PROVIDERS.includes(normalized as SearchProvider) ? normalized as SearchProvider : \"auto\";\n}\n\nexport interface FullSearchOptions extends SearchOptions {\n\tprovider?: SearchProviderSelection;\n\tincludeContent?: boolean;\n\textensionContext?: ExtensionContext;\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction isAbortError(err: unknown): boolean {\n\treturn errorMessage(err).toLowerCase().includes(\"abort\");\n}\n\nfunction shouldTryOpenAIInAuto(options: SearchOptions): boolean {\n\tif (options.recencyFilter) return false;\n\tif (typeof options.numResults === \"number\" && Number.isFinite(options.numResults) && Math.floor(options.numResults) !== 5) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction isOpenAICodexSelected(ctx?: ExtensionContext): boolean {\n\treturn ctx?.model?.provider === \"openai-codex\";\n}\n\nasync function tryOpenAIInAuto(query: string, options: FullSearchOptions, fallbackErrors: string[]): Promise<AttributedSearchResponse | null> {\n\tif (!shouldTryOpenAIInAuto(options)) return null;\n\ttry {\n\t\tif (await isOpenAISearchAvailable(options.extensionContext)) {\n\t\t\tconst result = await searchWithOpenAI(query, options, options.extensionContext);\n\t\t\treturn { ...result, provider: \"openai\" };\n\t\t}\n\t} catch (err) {\n\t\tif (isAbortError(err)) throw err;\n\t\tfallbackErrors.push(`OpenAI: ${errorMessage(err)}`);\n\t}\n\treturn null;\n}\n\nasync function searchWithGemini(\n\tquery: string,\n\toptions: SearchOptions,\n\tstrictErrors: boolean,\n): Promise<SearchResponse | null> {\n\tconst errors: string[] = [];\n\n\ttry {\n\t\tconst apiResult = await searchWithGeminiApi(query, options);\n\t\tif (apiResult) return apiResult;\n\t} catch (err) {\n\t\tif (err instanceof CredentialResolutionError || isAbortError(err)) throw err;\n\t\terrors.push(`Gemini API: ${errorMessage(err)}`);\n\t}\n\n\ttry {\n\t\tconst webResult = await searchWithGeminiWeb(query, options);\n\t\tif (webResult) return webResult;\n\t\tconst diagnostic = getGeminiWebAvailabilityDiagnostic();\n\t\tif (diagnostic) errors.push(`Gemini Web: ${diagnostic}`);\n\t} catch (err) {\n\t\tif (isAbortError(err)) throw err;\n\t\terrors.push(`Gemini Web: ${errorMessage(err)}`);\n\t}\n\n\tif (strictErrors && errors.length > 0) {\n\t\tthrow new Error(`Gemini search failed:\\n - ${errors.join(\"\\n - \")}`);\n\t}\n\n\treturn null;\n}\n\nfunction providerErrorStatus(message: string): number | undefined {\n\tconst match = message.match(/\\b(?:error|status|http)\\s+(\\d{3})\\b/i);\n\tif (!match) return undefined;\n\treturn Number(match[1]);\n}\n\nfunction classifyProviderError(provider: ResolvedSearchProvider, err: unknown): SearchProviderError {\n\tif (err instanceof SearchProviderError) return err;\n\tconst message = errorMessage(err);\n\tconst lower = message.toLowerCase();\n\tconst status = providerErrorStatus(message);\n\tlet kind: SearchProviderErrorKind = \"unknown\";\n\tconst mentionsUnsupportedWebSearch = /(?:web[_ -]?search|web[_ -]?search_preview|(?:the )?tool)\\b.*\\b(?:unsupported|not supported|does not support|doesn't support|unknown|unrecognized|unavailable|not found)|\\b(?:unsupported|not supported|does not support|doesn't support|unknown|unrecognized|unavailable|not found)\\b.*\\b(?:web[_ -]?search|web[_ -]?search_preview|(?:the )?tool)/i.test(lower);\n\tif (err instanceof CredentialResolutionError || /(?:api )?key (?:not found|missing)|credential resolution/.test(lower)) {\n\t\tkind = \"credential\";\n\t} else if (isAbortError(err)) {\n\t\tkind = \"aborted\";\n\t} else if (provider === \"xai\" && status === 403 && /spending[- ]limit|(?:no|out of) credits?|insufficient quota|quota (?:exceeded|exhausted)|credits? (?:exhausted|depleted|used up)/.test(lower)) {\n\t\tkind = \"quota\";\n\t} else if (status === 401 || status === 403) {\n\t\tkind = \"auth\";\n\t} else if (provider === \"openai\" && (status === 400 || status === 422) && mentionsUnsupportedWebSearch) {\n\t\tkind = \"unsupported\";\n\t} else if (status === 400 || status === 422) {\n\t\tkind = \"invalid-request\";\n\t} else if (status === 402 || status === 429 || (provider === \"tavily\" && status === 432)) {\n\t\tkind = \"quota\";\n\t} else if (status !== undefined && (status === 408 || status === 425 || status >= 500)) {\n\t\tkind = \"transient\";\n\t} else if (/rate limit|quota|too many requests/.test(lower)) {\n\t\tkind = \"quota\";\n\t} else if (/unauthorized|forbidden|permission denied/.test(lower)) {\n\t\tkind = \"auth\";\n\t} else if (/bad request|invalid request/.test(lower)) {\n\t\tkind = \"invalid-request\";\n\t} else if (/invalid json|no parseable response|no parseable results|invalid response|returned empty response|no web_search_call/.test(lower)) {\n\t\tkind = \"invalid-response\";\n\t} else if (/temporar|service unavailable|server error/.test(lower)) {\n\t\tkind = \"transient\";\n\t} else if (err instanceof TypeError || /fetch failed|network|econnreset|econnrefused|enotfound|etimedout|timed out|socket/.test(lower)) {\n\t\tkind = \"network\";\n\t} else if (/invalid or missing|invalid config|failed to parse|must be an? |configuration/.test(lower)) {\n\t\tkind = \"config\";\n\t}\n\treturn new SearchProviderError(provider, kind, message, status, err);\n}\n\nasync function searchWithResolvedProvider(\n\tprovider: ResolvedSearchProvider,\n\tquery: string,\n\toptions: FullSearchOptions,\n\tuseCurrentModel = false,\n): Promise<AttributedSearchResponse> {\n\tif (provider === \"openai\") {\n\t\tconst result = useCurrentModel\n\t\t\t? await searchWithCurrentModelOpenAI(query, options, options.extensionContext)\n\t\t\t: await searchWithOpenAI(query, options, options.extensionContext);\n\t\treturn { ...result, provider };\n\t}\n\tif (provider === \"brave\") return { ...(await searchWithBrave(query, options)), provider };\n\tif (provider === \"parallel\") return { ...(await searchWithParallel(query, options)), provider };\n\tif (provider === \"parallel-mcp\") return { ...(await searchWithParallelMcp(query, options)), provider };\n\tif (provider === \"tinyfish\") return { ...(await searchWithTinyFish(query, options)), provider };\n\tif (provider === \"search1api\") return { ...(await searchWithSearch1API(query, options)), provider };\n\tif (provider === \"searchinfinity\") return { ...(await searchWithSearchinfinity(query, options)), provider };\n\tif (provider === \"querit\") return { ...(await searchWithQuerit(query, options)), provider };\n\tif (provider === \"tavily\") return { ...(await searchWithTavily(query, options)), provider };\n\tif (provider === \"firecrawl\") return { ...(await searchWithFirecrawl(query, options)), provider };\n\tif (provider === \"jina\") return { ...(await searchWithJina(query, options)), provider };\n\tif (provider === \"serpdive\") return { ...(await searchWithSerpdive(query, options)), provider };\n\tif (provider === \"kagi\") return { ...(await searchWithKagi(query, options)), provider };\n\tif (provider === \"bocha\") return { ...(await searchWithBocha(query, options)), provider };\n\tif (provider === \"ollama\") return { ...(await searchWithOllama(query, options)), provider };\n\tif (provider === \"anysearch\") return { ...(await searchWithAnySearch(query, options)), provider };\n\tif (provider === \"xai\") return { ...(await searchWithXai(query, options, options.extensionContext)), provider };\n\tif (provider === \"mistral\") return { ...(await searchWithMistral(query, options)), provider };\n\tif (provider === \"brightdata\") return { ...(await searchWithBrightData(query, options)), provider };\n\tif (provider === \"serpbase\") return { ...(await searchWithSerpBase(query, options)), provider };\n\tif (provider === \"serpapi\") return { ...(await searchWithSerpApi(query, options)), provider };\n\tif (provider === \"serper\") return { ...(await searchWithSerper(query, options)), provider };\n\tif (provider === \"valyu\") return { ...(await searchWithValyu(query, options)), provider };\n\tif (provider === \"xcrawl\") return { ...(await searchWithXCrawl(query, options)), provider };\n\tif (provider === \"perplexity\") return { ...(await searchWithPerplexity(query, options)), provider };\n\tif (provider === \"searxng\") return { ...(await searchWithSearXNG(query, options)), provider };\n\tif (provider === \"duckduckgo\") return { ...(await searchWithDuckDuckGo(query, options)), provider };\n\tif (provider === \"kimi\") return { ...(await searchWithKimi(query, options, options.extensionContext)), provider };\n\tif (provider === \"gemini\") {\n\t\tconst result = await searchWithGemini(query, options, true);\n\t\tif (result) return { ...result, provider };\n\t\tthrow new Error(\n\t\t\t\"Gemini search unavailable. Either:\\n\" +\n\t\t\t` 1. Configure geminiApiKey in ${CONFIG_PATH} or set GEMINI_API_KEY\\n` +\n\t\t\t\" 2. Set GOOGLE_GEMINI_BASE_URL + CLOUDFLARE_API_KEY for Cloudflare AI Gateway routing\\n\" +\n\t\t\t\" 3. Set geminiAuth to \\\"adc\\\" in web-search.json with a Google Cloud ADC + project/location\\n\" +\n\t\t\t\" 4. Sign into gemini.google.com in a supported Chromium-based browser\",\n\t\t);\n\t}\n\tconst result = await searchWithExa(query, options);\n\tif (result) return { ...result, provider };\n\tthrow new Error(\"Exa search returned no results.\");\n}\n\nasync function isResolvedProviderAvailable(provider: ResolvedSearchProvider, options: FullSearchOptions, useCurrentModel = false): Promise<boolean> {\n\tif (provider === \"openai\") {\n\t\treturn useCurrentModel\n\t\t\t? isCurrentModelHostedSearchEligible(options.extensionContext)\n\t\t\t: isOpenAISearchAvailable(options.extensionContext);\n\t}\n\tif (provider === \"brave\") return isBraveAvailable();\n\tif (provider === \"parallel\") return isParallelAvailable();\n\tif (provider === \"parallel-mcp\") return isParallelMcpAvailable();\n\tif (provider === \"tinyfish\") return isTinyFishAvailable();\n\tif (provider === \"search1api\") return isSearch1APIAvailable();\n\tif (provider === \"searchinfinity\") return isSearchinfinityAvailable();\n\tif (provider === \"querit\") return isQueritAvailable();\n\tif (provider === \"tavily\") return isTavilyAvailable();\n\tif (provider === \"firecrawl\") return isFirecrawlAvailable();\n\tif (provider === \"jina\") return isJinaSearchAvailable();\n\tif (provider === \"serpdive\") return isSerpdiveAvailable();\n\tif (provider === \"kagi\") return isKagiAvailable();\n\tif (provider === \"bocha\") return isBochaAvailable();\n\tif (provider === \"ollama\") return isOllamaAvailable();\n\tif (provider === \"anysearch\") return isAnySearchAvailable();\n\tif (provider === \"xai\") return isXaiSearchAvailable(options.extensionContext);\n\tif (provider === \"mistral\") return isMistralAvailable();\n\tif (provider === \"brightdata\") return isBrightDataAvailable();\n\tif (provider === \"serpbase\") return isSerpBaseAvailable();\n\tif (provider === \"serpapi\") return isSerpApiAvailable();\n\tif (provider === \"serper\") return isSerperAvailable();\n\tif (provider === \"valyu\") return isValyuAvailable();\n\tif (provider === \"xcrawl\") return isXcrawlAvailable();\n\tif (provider === \"perplexity\") return isPerplexityAvailable();\n\tif (provider === \"searxng\") return isSearXNGAvailable();\n\tif (provider === \"duckduckgo\") return isDuckDuckGoAvailable();\n\tif (provider === \"gemini\") return isGeminiApiAvailable() || await isGeminiWebOptionallyAvailable();\n\tif (provider === \"kimi\") return isKimiSearchAvailable(options.extensionContext);\n\treturn isExaAvailable();\n}\n\nasync function isGeminiWebOptionallyAvailable(): Promise<boolean> {\n\ttry {\n\t\treturn !!(await isGeminiWebAvailable());\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction providerLabel(provider: ResolvedSearchProvider): string {\n\tif (provider === \"openai\") return \"OpenAI\";\n\tif (provider === \"parallel-mcp\") return \"Parallel MCP\";\n\tif (provider === \"tinyfish\") return \"TinyFish\";\n\tif (provider === \"search1api\") return \"Search1API\";\n\tif (provider === \"searchinfinity\") return \"Searchinfinity\";\n\tif (provider === \"querit\") return \"Querit\";\n\tif (provider === \"firecrawl\") return \"Firecrawl\";\n\tif (provider === \"serpdive\") return \"SERPdive\";\n\tif (provider === \"searxng\") return \"SearXNG\";\n\tif (provider === \"duckduckgo\") return \"DuckDuckGo\";\n\tif (provider === \"kagi\") return \"Kagi\";\n\tif (provider === \"bocha\") return \"Bocha\";\n\tif (provider === \"xcrawl\") return \"XCrawl\";\n\tif (provider === \"kimi\") return \"Kimi\";\n\tif (provider === \"ollama\") return \"Ollama\";\n\tif (provider === \"xai\") return \"xAI\";\n\tif (provider === \"mistral\") return \"Mistral\";\n\tif (provider === \"brightdata\") return \"Bright Data\";\n\tif (provider === \"serpbase\") return \"SerpBase\";\n\tif (provider === \"serpapi\") return \"SerpApi\";\n\tif (provider === \"serper\") return \"Serper\";\n\tif (provider === \"valyu\") return \"Valyu\";\n\treturn provider.charAt(0).toUpperCase() + provider.slice(1);\n}\n\nasync function searchWithAllProvider(\n\tprovider: ResolvedSearchProvider,\n\tquery: string,\n\toptions: FullSearchOptions,\n): Promise<AttributedSearchResponse> {\n\tif (provider !== \"gemini\") return searchWithResolvedProvider(provider, query, options);\n\tconst result = await searchWithGeminiApi(query, options);\n\tif (result) return { ...result, provider };\n\tthrow new Error(\"Gemini API search returned no results.\");\n}\n\nasync function searchWithProviders(\n\tquery: string,\n\toptions: FullSearchOptions,\n\tselectedProviders?: ResolvedSearchProvider[],\n): Promise<AttributedSearchResponse> {\n\tconst providers = selectedProviders ?? (await Promise.all(ALL_SEARCH_PROVIDERS.map(async (provider) => ({\n\t\tprovider,\n\t\tavailable: provider === \"gemini\"\n\t\t\t? isGeminiApiAvailable()\n\t\t\t: await isResolvedProviderAvailable(provider, options),\n\t})))).filter((entry) => entry.available).map((entry) => entry.provider);\n\tif (providers.length === 0) {\n\t\tthrow new Error(\"No configured search provider available for provider \\\"all\\\". Parallel MCP, DuckDuckGo, Kimi, AnySearch, xAI, Mistral, Bright Data, SerpBase, SerpApi, Serper, Valyu, and XCrawl are excluded.\");\n\t}\n\n\tconst settled = await Promise.allSettled(\n\t\tproviders.map((provider) => selectedProviders\n\t\t\t? searchWithResolvedProvider(provider, query, options)\n\t\t\t: searchWithAllProvider(provider, query, options)),\n\t);\n\tif (options.signal?.aborted) throw new Error(\"Aborted\");\n\n\tconst successes: AttributedSearchResponse[] = [];\n\tconst failures: Array<{ provider: ResolvedSearchProvider; error: string }> = [];\n\tfor (let index = 0; index < settled.length; index++) {\n\t\tconst outcome = settled[index];\n\t\tif (outcome.status === \"fulfilled\") {\n\t\t\tsuccesses.push(outcome.value);\n\t\t} else {\n\t\t\tfailures.push({ provider: providers[index], error: errorMessage(outcome.reason) });\n\t\t}\n\t}\n\tif (successes.length === 0) {\n\t\tconst label = selectedProviders ? \"Selected-provider\" : \"All-provider\";\n\t\tthrow new Error(`${label} search failed:\\n - ${failures.map(({ provider, error }) => `${providerLabel(provider)}: ${error}`).join(\"\\n - \")}`);\n\t}\n\n\tconst results: SearchResult[] = [];\n\tconst seenResultUrls = new Set<string>();\n\tconst inlineContent: NonNullable<SearchResponse[\"inlineContent\"]> = [];\n\tconst seenInlineUrls = new Set<string>();\n\tfor (const response of successes) {\n\t\tfor (const result of response.results) {\n\t\t\tif (seenResultUrls.has(result.url)) continue;\n\t\t\tseenResultUrls.add(result.url);\n\t\t\tresults.push(result);\n\t\t}\n\t\tfor (const content of response.inlineContent ?? []) {\n\t\t\tif (seenInlineUrls.has(content.url)) continue;\n\t\t\tseenInlineUrls.add(content.url);\n\t\t\tinlineContent.push(content);\n\t\t}\n\t}\n\n\tconst answerSections = successes.map((response) =>\n\t\t`## ${providerLabel(response.provider as ResolvedSearchProvider)}\\n\\n${response.answer || \"(No answer text returned.)\"}`\n\t);\n\tif (failures.length > 0) {\n\t\tanswerSections.push(\n\t\t\t`## Provider errors\\n\\n${failures.map(({ provider, error }) => `- **${providerLabel(provider)}:** ${error}`).join(\"\\n\")}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tprovider: \"all\",\n\t\tanswer: answerSections.join(\"\\n\\n\"),\n\t\tresults,\n\t\tproviderResponses: successes as ProviderSearchResponse[],\n\t\t...(failures.length > 0 ? { providerErrors: failures } : {}),\n\t\t...(inlineContent.length > 0 ? { inlineContent } : {}),\n\t};\n}\n\nasync function searchWithConfiguredRouting(\n\tquery: string,\n\toptions: FullSearchOptions,\n\trouting: SearchRoutingConfig,\n): Promise<AttributedSearchResponse> {\n\tconst diagnostics: string[] = [];\n\tfor (const provider of routing.providers) {\n\t\tconst useCurrentModel = provider === \"openai\" && routing.useCurrentModel === true;\n\t\tif (!(await isResolvedProviderAvailable(provider, options, useCurrentModel))) {\n\t\t\tdiagnostics.push(`${provider}: unavailable`);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\treturn await searchWithResolvedProvider(provider, query, options, useCurrentModel);\n\t\t} catch (err) {\n\t\t\tconst classified = classifyProviderError(provider, err);\n\t\t\tdiagnostics.push(`${provider} [${classified.kind}]: ${errorMessage(err)}`);\n\t\t\tif (!routing.fallbackOn.includes(classified.kind as SearchRoutingConfig[\"fallbackOn\"][number])) {\n\t\t\t\tthrow classified;\n\t\t\t}\n\t\t}\n\t}\n\tthrow new Error(`Configured search routing exhausted:\\n - ${diagnostics.join(\"\\n - \")}`);\n}\n\nexport async function search(query: string, options: FullSearchOptions = {}): Promise<AttributedSearchResponse> {\n\tconst config = getSearchConfig();\n\tconst provider = options.provider === undefined || options.provider === \"auto\"\n\t\t? config.searchProvider\n\t\t: options.provider;\n\tif (Array.isArray(provider)) {\n\t\treturn searchWithProviders(query, options, normalizeResolvedProviderList(provider, \"provider\"));\n\t}\n\tif (provider === \"all\") return searchWithProviders(query, options);\n\tif (provider !== \"auto\") return searchWithResolvedProvider(provider, query, options);\n\tif (!config.searchProviderConfigured && config.searchRouting) {\n\t\treturn searchWithConfiguredRouting(query, options, config.searchRouting);\n\t}\n\n\tconst fallbackErrors: string[] = [];\n\n\tif (isSearXNGAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSearXNG(query, options);\n\t\t\treturn { ...result, provider: \"searxng\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`SearXNG: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tlet triedOpenAI = false;\n\tif (!options.extensionContext || isOpenAICodexSelected(options.extensionContext)) {\n\t\ttriedOpenAI = true;\n\t\tconst result = await tryOpenAIInAuto(query, options, fallbackErrors);\n\t\tif (result) return result;\n\t}\n\n\tif (isExaAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithExa(query, options);\n\t\t\tif (result) return { ...result, provider: \"exa\" };\n\t\t} catch (err) {\n\t\t\tif (err instanceof CredentialResolutionError || isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Exa: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (!triedOpenAI) {\n\t\tconst result = await tryOpenAIInAuto(query, options, fallbackErrors);\n\t\tif (result) return result;\n\t}\n\n\tif (isBraveAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithBrave(query, options);\n\t\t\treturn { ...result, provider: \"brave\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Brave: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isParallelAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithParallel(query, options);\n\t\t\treturn { ...result, provider: \"parallel\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Parallel: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isTinyFishAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithTinyFish(query, options);\n\t\t\treturn { ...result, provider: \"tinyfish\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`TinyFish: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isSearch1APIAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSearch1API(query, options);\n\t\t\treturn { ...result, provider: \"search1api\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Search1API: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isSearchinfinityAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSearchinfinity(query, options);\n\t\t\treturn { ...result, provider: \"searchinfinity\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Searchinfinity: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isQueritAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithQuerit(query, options);\n\t\t\treturn { ...result, provider: \"querit\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Querit: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isTavilyAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithTavily(query, options);\n\t\t\treturn { ...result, provider: \"tavily\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Tavily: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isFirecrawlAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithFirecrawl(query, options);\n\t\t\treturn { ...result, provider: \"firecrawl\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Firecrawl: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isJinaSearchAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithJina(query, options);\n\t\t\treturn { ...result, provider: \"jina\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Jina: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isSerpdiveAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSerpdive(query, options);\n\t\t\treturn { ...result, provider: \"serpdive\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`SERPdive: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isKagiAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithKagi(query, options);\n\t\t\treturn { ...result, provider: \"kagi\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Kagi: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isBochaAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithBocha(query, options);\n\t\t\treturn { ...result, provider: \"bocha\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Bocha: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isOllamaAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithOllama(query, options);\n\t\t\treturn { ...result, provider: \"ollama\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Ollama: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isPerplexityAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithPerplexity(query, options);\n\t\t\treturn { ...result, provider: \"perplexity\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Perplexity: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\ttry {\n\t\tconst geminiResult = await searchWithGemini(query, options, false);\n\t\tif (geminiResult) return { ...geminiResult, provider: \"gemini\" };\n\t} catch (err) {\n\t\tif (isAbortError(err)) throw err;\n\t\tfallbackErrors.push(`Gemini: ${errorMessage(err)}`);\n\t}\n\n\tif (fallbackErrors.length > 0) {\n\t\tthrow new Error(`Auto provider search failed:\\n - ${fallbackErrors.join(\"\\n - \")}`);\n\t}\n\n\tthrow new Error(\n\t\t\"No search provider available. Either:\\n\" +\n\t\t\" 1. Use /login to sign in with a Codex subscription for OpenAI web search\\n\" +\n\t\t` 2. Set openaiApiKey, braveApiKey, parallelApiKey, tinyfishApiKey, search1apiApiKey, searchinfinityApiKey, queritApiKey, tavilyApiKey, firecrawlBaseUrl, jinaApiKey, serpdiveApiKey, kagiApiKey, ollamaApiKey, searxngBaseUrl, perplexityApiKey, exaApiKey, geminiApiKey, bochaApiKey, or cloudflareApiKey in ${CONFIG_PATH}\\n` +\n\t\t\" 3. Set OPENAI_API_KEY, BRAVE_API_KEY, PARALLEL_API_KEY, TINYFISH_API_KEY, SEARCH1API_KEY, SEARCHINFINITY_API_KEY, QUERIT_API_KEY, TAVILY_API_KEY, FIRECRAWL_BASE_URL, JINA_API_KEY, SERPDIVE_API_KEY, KAGI_API_KEY, BOCHA_API_KEY, OLLAMA_API_KEY, SEARXNG_BASE_URL, EXA_API_KEY, PERPLEXITY_API_KEY, GEMINI_API_KEY, or CLOUDFLARE_API_KEY env vars\\n\" +\n\t\t\" 4. Set GOOGLE_GEMINI_BASE_URL with CLOUDFLARE_API_KEY for Cloudflare AI Gateway routing\\n\" +\n\t\t\" 5. Sign into gemini.google.com in a supported Chromium-based browser\\n\" +\n\t\t\" 6. Explicitly select provider: \\\"anysearch\\\" for anonymous AnySearch, \\\"xcrawl\\\" for XCrawl, \\\"xai\\\" for Grok, \\\"mistral\\\" for Mistral Conversations web search, \\\"brightdata\\\" with brightdataSerpZone for paid Bright Data SERP, \\\"serpbase\\\", \\\"serpapi\\\", or \\\"serper\\\" for Google SERP, or \\\"valyu\\\" for research search\"\n\t);\n}\n\nasync function searchWithGeminiApi(query: string, options: SearchOptions = {}): Promise<SearchResponse | null> {\n\tconst requestSignal = AbortSignal.any([\n\t\tAbortSignal.timeout(120000),\n\t\t...(options.signal ? [options.signal] : []),\n\t]);\n\tconst apiKey = isGeminiAdcAvailable() ? null : await getApiKey(requestSignal);\n\tif (!apiKey && !isGatewayConfigured() && !isGeminiAdcAvailable()) return null;\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\n\ttry {\n\t\tconst model = getSearchConfig().searchModel ?? DEFAULT_SEARCH_MODEL;\n\t\tconst body = {\n\t\t\tcontents: [{ role: \"user\", parts: [{ text: query }] }],\n\t\t\ttools: [{ google_search: {} }],\n\t\t};\n\n\t\tconst res = await fetchGeminiApi(`${getVersionedApiBase()}/models/${model}:generateContent`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal,\n\t\t}, apiKey);\n\n\t\tif (!res.ok) {\n\t\t\tconst errorText = redactGeminiApiResponse(res, await res.text(), apiKey);\n\t\t\tthrow new Error(`Gemini API error ${res.status}: ${errorText.slice(0, 300)}`);\n\t\t}\n\n\t\tconst data = await res.json() as GeminiSearchResponse;\n\t\tactivityMonitor.logComplete(activityId, res.status);\n\n\t\tconst answer = data.candidates?.[0]?.content?.parts\n\t\t\t?.map(p => p.text).filter(Boolean).join(\"\\n\") ?? \"\";\n\n\t\tconst metadata = data.candidates?.[0]?.groundingMetadata;\n\t\tconst results = await resolveGroundingChunks(metadata?.groundingChunks, options.signal);\n\n\t\tif (!answer && results.length === 0) return null;\n\t\treturn { answer, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n\nasync function searchWithGeminiWeb(query: string, options: SearchOptions = {}): Promise<SearchResponse | null> {\n\tconst cookies = await isGeminiWebAvailable();\n\tif (!cookies) return null;\n\n\tconst prompt = buildSearchPrompt(query, options);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\n\ttry {\n\t\tconst text = await queryWithCookies(prompt, cookies, {\n\t\t\tsignal: options.signal,\n\t\t\ttimeoutMs: 120000,\n\t\t});\n\n\t\tactivityMonitor.logComplete(activityId, 200);\n\n\t\tconst results = extractSourceUrls(text);\n\t\treturn { answer: text, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n\nfunction buildSearchPrompt(query: string, options: SearchOptions): string {\n\tlet prompt = `Search the web and answer the following question. Include source URLs for your claims.\\nFormat your response as:\\n1. A direct answer to the question\\n2. Cited sources as markdown links\\n\\nQuestion: ${query}`;\n\n\tif (options.recencyFilter) {\n\t\tconst labels: Record<string, string> = {\n\t\t\tday: \"past 24 hours\",\n\t\t\tweek: \"past week\",\n\t\t\tmonth: \"past month\",\n\t\t\tyear: \"past year\",\n\t\t};\n\t\tprompt += `\\n\\nOnly include results from the ${labels[options.recencyFilter]}.`;\n\t}\n\n\tif (options.domainFilter?.length) {\n\t\tconst includes = options.domainFilter.filter(d => !d.startsWith(\"-\"));\n\t\tconst excludes = options.domainFilter.filter(d => d.startsWith(\"-\")).map(d => d.slice(1));\n\t\tif (includes.length) prompt += `\\n\\nOnly cite sources from: ${includes.join(\", \")}`;\n\t\tif (excludes.length) prompt += `\\n\\nDo not cite sources from: ${excludes.join(\", \")}`;\n\t}\n\n\treturn prompt;\n}\n\nfunction extractSourceUrls(markdown: string): SearchResult[] {\n\tconst results: SearchResult[] = [];\n\tconst seen = new Set<string>();\n\tconst linkRegex = /\\[([^\\]]+)\\]\\((https?:\\/\\/[^)]+)\\)/g;\n\tfor (const match of markdown.matchAll(linkRegex)) {\n\t\tconst url = match[2];\n\t\tif (seen.has(url)) continue;\n\t\tseen.add(url);\n\t\tresults.push({ title: match[1], url, snippet: \"\" });\n\t}\n\treturn results;\n}\n\nasync function resolveGroundingChunks(\n\tchunks: GroundingChunk[] | undefined,\n\tsignal?: AbortSignal,\n): Promise<SearchResult[]> {\n\tif (!chunks?.length) return [];\n\n\tconst results: SearchResult[] = [];\n\tfor (const chunk of chunks) {\n\t\tif (!chunk.web) continue;\n\t\tconst title = chunk.web.title || \"\";\n\t\tlet url = chunk.web.uri || \"\";\n\n\t\tif (url.includes(\"vertexaisearch.cloud.google.com/grounding-api-redirect\")) {\n\t\t\tconst resolved = await resolveRedirect(url, signal);\n\t\t\tif (resolved) url = resolved;\n\t\t}\n\n\t\tif (url) results.push({ title, url, snippet: \"\" });\n\t}\n\treturn results;\n}\n\nasync function resolveRedirect(proxyUrl: string, signal?: AbortSignal): Promise<string | null> {\n\ttry {\n\t\tconst res = await fetch(proxyUrl, {\n\t\t\tmethod: \"HEAD\",\n\t\t\tredirect: \"manual\",\n\t\t\tsignal: AbortSignal.any([\n\t\t\t\tAbortSignal.timeout(5000),\n\t\t\t\t...(signal ? [signal] : []),\n\t\t\t]),\n\t\t});\n\t\treturn res.headers.get(\"location\") || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface GeminiSearchResponse {\n\tcandidates?: Array<{\n\t\tcontent?: { parts?: Array<{ text?: string }> };\n\t\tgroundingMetadata?: {\n\t\t\twebSearchQueries?: string[];\n\t\t\tgroundingChunks?: GroundingChunk[];\n\t\t\tgroundingSupports?: Array<{\n\t\t\t\tsegment?: { startIndex?: number; endIndex?: number; text?: string };\n\t\t\t\tgroundingChunkIndices?: number[];\n\t\t\t}>;\n\t\t};\n\t}>;\n}\n\ninterface GroundingChunk {\n\tweb?: { uri?: string; title?: string };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKlF,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAC;AAOrE,OAAO,EAA0K,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,KAAK,uBAAuB,EAA+B,MAAM,oBAAoB,CAAC;AACvT,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EASN,KAAK,eAAe,EAEpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAIN,KAAK,wBAAwB,EAE7B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKlF,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAC;AAOrE,OAAO,EAA0K,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,KAAK,uBAAuB,EAA+B,MAAM,oBAAoB,CAAC;AACvT,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EASN,KAAK,eAAe,EAEpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAIN,KAAK,wBAAwB,EAE7B,MAAM,qBAAqB,CAAC;AAqJ7B,KAAK,eAAe,GAAG,gBAAgB,CAAC;AACxC,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AA4N9D,wBAAgB,8BAA8B,IAAI,MAAM,CAMvD;AAqFD,wBAAgB,6BAA6B,CAC5C,QAAQ,EAAE,uBAAuB,EACjC,SAAS,EAAE,oBAAoB,EAC/B,GAAG,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,EACrC,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,eAAe,CAAC,GAC3D,eAAe,CAEjB;AAkHD,UAAU,aAAa;IACtB,KAAK,EAAE,WAAW,GAAG,UAAU,CAAC;IAChC,QAAQ,EAAE,eAAe,CAAC;IAC1B,cAAc,EAAE,wBAAwB,CAAC;IACzC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAClD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,EAAE,oBAAoB,CAAC;IACzC,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,EAAE,uBAAuB,CAAC;IACxC,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAChI,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;IAClE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkaD,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAw9ExC"}
|