@humain/terminal 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/dist/bundle/chunks/{chunk-U75GS4NL.js → chunk-CBTAWCW5.js} +1 -1
- package/dist/bundle/chunks/{chunk-D6HHRSB5.js → chunk-S43N4JYF.js} +14 -29
- package/dist/bundle/chunks/{chunk-LYOOYM65.js → chunk-WKLAQTQ4.js} +100 -124
- package/dist/bundle/chunks/{compat-22OQ5DBK.js → compat-L5WILLPV.js} +1 -1
- package/dist/bundle/chunks/{extract-CTIFQZDJ.js → extract-2YP6VMY4.js} +3 -3
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/humain/web-access/vendor/anysearch.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/anysearch.js +4 -14
- package/dist/humain/web-access/vendor/anysearch.js.map +1 -1
- package/dist/humain/web-access/vendor/bocha.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/bocha.js +3 -24
- package/dist/humain/web-access/vendor/bocha.js.map +1 -1
- package/dist/humain/web-access/vendor/brave.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/brave.js +3 -24
- package/dist/humain/web-access/vendor/brave.js.map +1 -1
- package/dist/humain/web-access/vendor/brightdata.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/brightdata.js +5 -34
- package/dist/humain/web-access/vendor/brightdata.js.map +1 -1
- package/dist/humain/web-access/vendor/content-find.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/content-find.js +186 -51
- package/dist/humain/web-access/vendor/content-find.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 +4 -1
- package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-run.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-run.js +3 -1
- package/dist/humain/web-access/vendor/curator-run.js.map +1 -1
- 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/domain-filter-normalization.d.ts +2 -0
- package/dist/humain/web-access/vendor/domain-filter-normalization.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/domain-filter-normalization.js +19 -0
- package/dist/humain/web-access/vendor/domain-filter-normalization.js.map +1 -0
- package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/duckduckgo.js +3 -24
- package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -1
- package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/extract.js +3 -1
- package/dist/humain/web-access/vendor/extract.js.map +1 -1
- package/dist/humain/web-access/vendor/firecrawl.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/firecrawl.js +5 -32
- package/dist/humain/web-access/vendor/firecrawl.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.d.ts +5 -2
- package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.js +85 -37
- package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
- package/dist/humain/web-access/vendor/index.d.ts +3 -3
- package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/index.js +135 -157
- package/dist/humain/web-access/vendor/index.js.map +1 -1
- package/dist/humain/web-access/vendor/jina-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/jina-search.js +4 -14
- package/dist/humain/web-access/vendor/jina-search.js.map +1 -1
- package/dist/humain/web-access/vendor/kagi.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/kagi.js +4 -12
- package/dist/humain/web-access/vendor/kagi.js.map +1 -1
- package/dist/humain/web-access/vendor/kimi-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/kimi-search.js +5 -32
- package/dist/humain/web-access/vendor/kimi-search.js.map +1 -1
- package/dist/humain/web-access/vendor/mistral-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/mistral-search.js +1 -18
- package/dist/humain/web-access/vendor/mistral-search.js.map +1 -1
- package/dist/humain/web-access/vendor/ollama.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/ollama.js +2 -6
- package/dist/humain/web-access/vendor/ollama.js.map +1 -1
- package/dist/humain/web-access/vendor/openai-search.d.ts +3 -0
- package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/openai-search.js +181 -38
- package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
- package/dist/humain/web-access/vendor/opencode-session-headers.d.ts +10 -0
- package/dist/humain/web-access/vendor/opencode-session-headers.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/opencode-session-headers.js +23 -0
- package/dist/humain/web-access/vendor/opencode-session-headers.js.map +1 -0
- package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/page-query.js +10 -2
- package/dist/humain/web-access/vendor/page-query.js.map +1 -1
- package/dist/humain/web-access/vendor/parallel.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/parallel.js +1 -18
- package/dist/humain/web-access/vendor/parallel.js.map +1 -1
- package/dist/humain/web-access/vendor/pdf-extract.d.ts +2 -0
- package/dist/humain/web-access/vendor/pdf-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/pdf-extract.js +1 -0
- package/dist/humain/web-access/vendor/pdf-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/querit.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/querit.js +5 -32
- package/dist/humain/web-access/vendor/querit.js.map +1 -1
- package/dist/humain/web-access/vendor/search-answer-formatting.d.ts +8 -0
- package/dist/humain/web-access/vendor/search-answer-formatting.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/search-answer-formatting.js +6 -0
- package/dist/humain/web-access/vendor/search-answer-formatting.js.map +1 -0
- package/dist/humain/web-access/vendor/search-result-count-normalization.d.ts +2 -0
- package/dist/humain/web-access/vendor/search-result-count-normalization.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/search-result-count-normalization.js +6 -0
- package/dist/humain/web-access/vendor/search-result-count-normalization.js.map +1 -0
- package/dist/humain/web-access/vendor/search1api.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/search1api.js +5 -32
- package/dist/humain/web-access/vendor/search1api.js.map +1 -1
- package/dist/humain/web-access/vendor/searchinfinity.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/searchinfinity.js +5 -32
- package/dist/humain/web-access/vendor/searchinfinity.js.map +1 -1
- package/dist/humain/web-access/vendor/searxng.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/searxng.js +3 -24
- package/dist/humain/web-access/vendor/searxng.js.map +1 -1
- package/dist/humain/web-access/vendor/serpapi.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/serpapi.js +5 -30
- package/dist/humain/web-access/vendor/serpapi.js.map +1 -1
- package/dist/humain/web-access/vendor/serpbase.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/serpbase.js +3 -24
- package/dist/humain/web-access/vendor/serpbase.js.map +1 -1
- package/dist/humain/web-access/vendor/serpdive.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/serpdive.js +3 -24
- package/dist/humain/web-access/vendor/serpdive.js.map +1 -1
- package/dist/humain/web-access/vendor/serper.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/serper.js +5 -30
- package/dist/humain/web-access/vendor/serper.js.map +1 -1
- package/dist/humain/web-access/vendor/serply.d.ts +4 -0
- package/dist/humain/web-access/vendor/serply.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/serply.js +191 -0
- package/dist/humain/web-access/vendor/serply.js.map +1 -0
- package/dist/humain/web-access/vendor/source-check.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/source-check.js +11 -47
- package/dist/humain/web-access/vendor/source-check.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 +6 -2
- package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
- package/dist/humain/web-access/vendor/tavily.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/tavily.js +3 -24
- package/dist/humain/web-access/vendor/tavily.js.map +1 -1
- package/dist/humain/web-access/vendor/tinyfish.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/tinyfish.js +5 -32
- package/dist/humain/web-access/vendor/tinyfish.js.map +1 -1
- package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/utils.js +2 -0
- package/dist/humain/web-access/vendor/utils.js.map +1 -1
- package/dist/humain/web-access/vendor/valyu.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/valyu.js +5 -30
- package/dist/humain/web-access/vendor/valyu.js.map +1 -1
- package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/xai-search.js +1 -18
- package/dist/humain/web-access/vendor/xai-search.js.map +1 -1
- package/dist/humain/web-access/vendor/xcrawl.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/xcrawl.js +5 -34
- package/dist/humain/web-access/vendor/xcrawl.js.map +1 -1
- package/npm-shrinkwrap.json +6 -6
- package/package.json +2 -2
- package/src/humain/web-access/UPSTREAM.md +33 -1
- package/src/humain/web-access/upstream.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-check.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/source-check.ts"],"names":[],"mappings":"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","sourcesContent":["// Structured source checking and machine-readable research artifacts.\nimport { createHash } from \"node:crypto\";\nimport { generateId, getResult, storeResult } from \"./storage.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\n\nexport type SourceQuality = \"official_docs\" | \"vendor_docs\" | \"repo_issue\" | \"blog\" | \"forum\" | \"news\" | \"unknown\";\nexport type ClaimStatus = \"supported\" | \"contradicted\" | \"unclear\" | \"missing-evidence\";\nexport type RecencyFilter = \"day\" | \"week\" | \"month\" | \"year\";\n\nexport interface ResearchSource {\n\trank: number;\n\turl: string;\n\ttitle: string;\n\tsnippet?: string;\n\tfetch_timestamp?: number;\n\tcontent_hash?: string;\n\tquality: SourceQuality;\n\tfetched?: boolean;\n\tfetch_error?: string;\n}\n\nexport interface ResearchPassage {\n\tpassage_id: string;\n\tsource_url: string;\n\tsource_rank: number;\n\ttext: string;\n\textraction_span?: { start: number; end: number };\n\tcontent_hash?: string;\n}\n\nexport interface ClaimAssessment {\n\tclaim: string;\n\tstatus: ClaimStatus;\n\tsupporting_passages: string[];\n\tcontradicting_passages: string[];\n\trationale: string;\n\tconfidence: number;\n}\n\nexport interface ResearchArtifact {\n\tid: string;\n\ttype: \"research\";\n\ttimestamp: number;\n\tquery: string;\n\tsources: ResearchSource[];\n\tpassages: ResearchPassage[];\n\tclaims?: ClaimAssessment[];\n\tprovider?: string;\n\tsummary?: string;\n\tcontent_hash?: string;\n\tfilters?: { recency?: RecencyFilter; domain_include?: string[]; domain_exclude?: string[] };\n\terrors?: Array<{ query: string; error: string }>;\n}\n\nexport interface ResearchSearchRequest {\n\tquery: string;\n\tnumResults: number;\n\trecencyFilter?: RecencyFilter;\n\tdomainFilter?: string[];\n}\nexport interface ResearchSearchResult { url: string; title: string; snippet: string; rank: number }\nexport interface ResearchSearchResponse { provider: string; results: ResearchSearchResult[]; summary?: string }\nexport interface ResearchProvider { name: string; search(req: ResearchSearchRequest): Promise<ResearchSearchResponse> }\n\nconst OFFICIAL_DOCS_HOSTS = /^(developers\\.|docs\\.|learn\\.|reference\\.)|\\.github\\.io$/i;\nconst OFFICIAL_DOCS_PATHS = /\\/(docs?|reference)(\\/|\\b)/i;\nconst VENDOR_DOCS_PATHS = /\\/(documentation|docs?)\\//i;\nconst REPO_ISSUE_PATHS = /\\/(issues|pull|pulls)\\//i;\nconst BLOG_HOSTS = /(medium\\.com|substack\\.com|dev\\.to|hashnode\\.)/i;\nconst BLOG_PATHS = /\\/blogs?\\//i;\nconst FORUM_HOSTS = /(stackoverflow\\.com|serverfault\\.com|superuser\\.com|discourse\\.|community\\.)/i;\nconst FORUM_PATHS = /\\/(forum|forums|threads)\\//i;\nconst NEWS_HOSTS = /(reuters\\.com|bloomberg\\.com|techcrunch\\.com|theverge\\.com|arstechnica\\.com|wired\\.com|cnet\\.com|zdnet\\.com)/i;\nconst NEWS_PATHS = /\\/news(\\/|$)/i;\n\nexport function classifySource(url: string): SourceQuality {\n\tlet host = \"\";\n\tlet path = \"\";\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\thost = parsed.hostname;\n\t\tpath = parsed.pathname;\n\t} catch {\n\t\treturn \"unknown\";\n\t}\n\tif (REPO_ISSUE_PATHS.test(path)) return \"repo_issue\";\n\tif (OFFICIAL_DOCS_HOSTS.test(host) || OFFICIAL_DOCS_PATHS.test(path)) return \"official_docs\";\n\tif (VENDOR_DOCS_PATHS.test(path)) return \"vendor_docs\";\n\tif (NEWS_HOSTS.test(host) || NEWS_PATHS.test(path)) return \"news\";\n\tif (FORUM_HOSTS.test(host) || FORUM_PATHS.test(path)) return \"forum\";\n\tif (BLOG_HOSTS.test(host) || BLOG_PATHS.test(path)) return \"blog\";\n\treturn \"unknown\";\n}\n\nexport function hashContent(text: string): string {\n\treturn `sha256:${createHash(\"sha256\").update(text, \"utf8\").digest(\"hex\")}`;\n}\n\ninterface Span { text: string; start: number; end: number }\n\nfunction tokenize(value: string): string[] {\n\treturn [...new Set(value.toLowerCase().split(/[^a-z0-9]+/).filter((term) => term.length > 3))];\n}\n\nfunction extractRelevantSpans(content: string, hint: string): Span[] {\n\tconst sentences: Span[] = [];\n\tconst sentencePattern = /[^.!?]+(?:[.!?]+(?=\\s|$)|$)/g;\n\tfor (const match of content.matchAll(sentencePattern)) {\n\t\tconst raw = match[0];\n\t\tconst text = raw.trim();\n\t\tif (text.length > 0 && text.length <= 400) {\n\t\t\tconst start = (match.index ?? 0) + raw.indexOf(text);\n\t\t\tsentences.push({ text, start, end: start + text.length });\n\t\t}\n\t}\n\tconst terms = tokenize(hint);\n\tif (terms.length === 0) return [];\n\treturn sentences\n\t\t.map((sentence, index) => ({ sentence, index, score: terms.filter((term) => sentence.text.toLowerCase().includes(term)).length }))\n\t\t.filter((item) => item.score > 0)\n\t\t.sort((a, b) => b.score - a.score || a.index - b.index)\n\t\t.slice(0, 3)\n\t\t.map(({ sentence }) => sentence);\n}\n\nfunction passageId(sourceRank: number, index: number): string {\n\treturn `p-${sourceRank}-${index}`;\n}\n\nexport function buildPassages(sources: ResearchSource[], fetched: ExtractedContent[] = [], hint = \"\"): ResearchPassage[] {\n\tconst passages: ResearchPassage[] = [];\n\tconst fetchedByUrl = new Map(fetched.map((item) => [item.url, item]));\n\tfor (const source of sources) {\n\t\tif (source.snippet) {\n\t\t\tpassages.push({\n\t\t\t\tpassage_id: passageId(source.rank, 0),\n\t\t\t\tsource_url: source.url,\n\t\t\t\tsource_rank: source.rank,\n\t\t\t\ttext: source.snippet,\n\t\t\t\tcontent_hash: hashContent(source.snippet),\n\t\t\t});\n\t\t}\n\t\tconst page = fetchedByUrl.get(source.url);\n\t\tif (page && !page.error && page.content) {\n\t\t\tconst passageHint = source.snippet?.trim() || hint;\n\t\t\tfor (const [index, span] of extractRelevantSpans(page.content, passageHint).entries()) {\n\t\t\t\tpassages.push({\n\t\t\t\t\tpassage_id: passageId(source.rank, index + 1),\n\t\t\t\t\tsource_url: source.url,\n\t\t\t\t\tsource_rank: source.rank,\n\t\t\t\t\ttext: span.text,\n\t\t\t\t\textraction_span: { start: span.start, end: span.end },\n\t\t\t\t\tcontent_hash: hashContent(span.text),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn passages;\n}\n\nconst CONTRADICTION_MARKERS = [\"not true\", \"false\", \"incorrect\", \"debunked\", \"retracted\", \"no longer\", \"never\", \"denied\", \"contrary\", \"misleading\"];\nconst SUPPORT_MARKERS = [\"yes\", \"true\", \"correct\", \"confirmed\", \"according to\", \"shows that\", \"demonstrates\", \"reported\", \"verified\", \"established\"];\n\nfunction containsPhrase(value: string, phrase: string): boolean {\n\tconst escaped = phrase.trim().toLowerCase().split(/\\s+/).map((term) => term.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"\\\\s+\");\n\treturn new RegExp(`(?:^|[^a-z0-9])${escaped}(?=$|[^a-z0-9])`, \"i\").test(value);\n}\n\nfunction markerIsNegated(value: string, marker: string): boolean {\n\tconst escaped = marker.trim().toLowerCase().split(/\\s+/).map((term) => term.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"\\\\s+\");\n\tconst markerPattern = new RegExp(`(?:^|[^a-z0-9])${escaped}(?=$|[^a-z0-9])`, \"i\");\n\tconst match = markerPattern.exec(value);\n\tif (!match || match.index === undefined) return false;\n\tconst matchedMarker = match[0].replace(/^[^a-z0-9]+/i, \"\");\n\tconst beforeMarker = value.slice(0, match.index + match[0].length - matchedMarker.length);\n\treturn /(?:^|[^a-z0-9])(?:not|no|never|without)\\s+$/i.test(beforeMarker);\n}\n\nfunction hasPolarityMarker(value: string, markers: string[], allowNegated = false): boolean {\n\treturn markers.some((marker) => containsPhrase(value, marker) && (allowNegated || !markerIsNegated(value, marker)));\n}\n\nexport function assessClaim(claim: string, passages: ResearchPassage[]): ClaimAssessment {\n\tconst terms = tokenize(claim);\n\tif (terms.length === 0 || passages.length === 0) {\n\t\treturn { claim, status: \"missing-evidence\", supporting_passages: [], contradicting_passages: [], rationale: \"No passages available that discuss the claim's terms.\", confidence: 0.2 };\n\t}\n\tconst supporting: string[] = [];\n\tconst contradicting: string[] = [];\n\tfor (const passage of passages) {\n\t\tconst lower = passage.text.toLowerCase();\n\t\tconst overlap = terms.filter((term) => containsPhrase(lower, term)).length;\n\t\tif (overlap < Math.max(2, Math.ceil(terms.length / 4))) continue;\n\t\tconst contra = hasPolarityMarker(lower, CONTRADICTION_MARKERS);\n\t\tconst support = hasPolarityMarker(lower, SUPPORT_MARKERS);\n\t\tif (contra && !support) contradicting.push(passage.passage_id);\n\t\telse if (support && !contra) supporting.push(passage.passage_id);\n\t}\n\tif (contradicting.length > 0 && supporting.length === 0) {\n\t\treturn { claim, status: \"contradicted\", supporting_passages: [], contradicting_passages: contradicting, rationale: `${contradicting.length} passage(s) contradict the claim; none support it.`, confidence: Math.min(0.85, 0.5 + contradicting.length * 0.1) };\n\t}\n\tif (supporting.length > 0 && contradicting.length === 0) {\n\t\treturn { claim, status: \"supported\", supporting_passages: supporting, contradicting_passages: [], rationale: `${supporting.length} passage(s) support the claim; none contradict it.`, confidence: Math.min(0.85, 0.5 + supporting.length * 0.1) };\n\t}\n\tif (supporting.length > 0 || contradicting.length > 0) {\n\t\treturn { claim, status: \"unclear\", supporting_passages: supporting, contradicting_passages: contradicting, rationale: `${supporting.length} supporting and ${contradicting.length} contradicting passage(s); evidence is mixed.`, confidence: 0.4 };\n\t}\n\treturn { claim, status: \"unclear\", supporting_passages: [], contradicting_passages: [], rationale: \"Passages mention the claim's terms but contain no clear support or contradiction markers.\", confidence: 0.3 };\n}\n\ninterface RankedSearchResult extends SearchResult {\n\trank?: number;\n}\n\nexport interface BuildArtifactInput {\n\tquery: string;\n\tprovider?: string;\n\tsummary?: string;\n\tresults: RankedSearchResult[];\n\tfetched?: ExtractedContent[];\n\trecency?: RecencyFilter;\n\tdomainFilter?: string[];\n}\n\nexport function buildResearchArtifact(input: BuildArtifactInput): ResearchArtifact {\n\tconst filters = input.domainFilter ?? [];\n\tconst fetchedByUrl = new Map((input.fetched ?? []).map((page) => [page.url, page]));\n\tconst sources: ResearchSource[] = [];\n\tconst seen = new Set<string>();\n\tfor (const [index, result] of input.results.entries()) {\n\t\tif (seen.has(result.url)) continue;\n\t\tseen.add(result.url);\n\t\tconst page = fetchedByUrl.get(result.url);\n\t\tconst fetched = Boolean(page && !page.error);\n\t\tsources.push({\n\t\t\trank: result.rank ?? index + 1,\n\t\t\turl: result.url,\n\t\t\ttitle: result.title,\n\t\t\tsnippet: result.snippet,\n\t\t\tquality: classifySource(result.url),\n\t\t\tfetched,\n\t\t\t...(page ? { fetch_timestamp: Date.now() } : {}),\n\t\t\t...(page && !page.error ? { content_hash: hashContent(page.content) } : {}),\n\t\t\t...(page?.error ? { fetch_error: page.error } : {}),\n\t\t});\n\t}\n\tconst passages = buildPassages(sources, input.fetched, input.query);\n\tconst domainInclude = filters.filter((domain) => !domain.startsWith(\"-\"));\n\tconst domainExclude = filters.filter((domain) => domain.startsWith(\"-\")).map((domain) => domain.slice(1));\n\treturn {\n\t\tid: generateId(),\n\t\ttype: \"research\",\n\t\ttimestamp: Date.now(),\n\t\tquery: input.query,\n\t\tsources,\n\t\tpassages,\n\t\t...(input.provider !== undefined ? { provider: input.provider } : {}),\n\t\t...(input.summary !== undefined ? { summary: input.summary } : {}),\n\t\t...(passages.length > 0 ? { content_hash: hashContent(passages.map((passage) => passage.text).join(\"\\n\")) } : {}),\n\t\tfilters: {\n\t\t\t...(input.recency !== undefined ? { recency: input.recency } : {}),\n\t\t\tdomain_include: domainInclude,\n\t\t\tdomain_exclude: domainExclude,\n\t\t},\n\t};\n}\n\nexport function withClaimAssessment(artifact: ResearchArtifact, claims: string[]): ResearchArtifact {\n\treturn { ...artifact, claims: claims.map((claim) => assessClaim(claim, artifact.passages)) };\n}\n\nexport function storeResearchArtifact(artifact: ResearchArtifact): void {\n\tif (!artifact.id) throw new Error(\"Research artifact id must not be empty\");\n\tstoreResult(artifact.id, { id: artifact.id, type: \"research\", timestamp: artifact.timestamp, artifact });\n}\n\nexport function getResearchArtifact(id: string): ResearchArtifact | null {\n\tconst data = getResult(id);\n\tif (!data || data.type !== \"research\" || !data.artifact || typeof data.artifact !== \"object\") return null;\n\treturn data.artifact as ResearchArtifact;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"source-check.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/source-check.ts"],"names":[],"mappings":"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","sourcesContent":["// Structured source evidence and machine-readable research artifacts.\nimport { createHash } from \"node:crypto\";\nimport { generateId, getResult, storeResult } from \"./storage.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\n\nexport type SourceQuality = \"official_docs\" | \"vendor_docs\" | \"repo_issue\" | \"blog\" | \"forum\" | \"news\" | \"unknown\";\nexport type ClaimStatus = \"supported\" | \"contradicted\" | \"unclear\" | \"missing-evidence\";\nexport type RecencyFilter = \"day\" | \"week\" | \"month\" | \"year\";\n\nexport interface ResearchSource {\n\trank: number;\n\turl: string;\n\ttitle: string;\n\tsnippet?: string;\n\tfetch_timestamp?: number;\n\tcontent_hash?: string;\n\tquality: SourceQuality;\n\tfetched?: boolean;\n\tfetch_error?: string;\n}\n\nexport interface ResearchPassage {\n\tpassage_id: string;\n\tsource_url: string;\n\tsource_rank: number;\n\ttext: string;\n\textraction_span?: { start: number; end: number };\n\tcontent_hash?: string;\n}\n\nexport interface ClaimAssessment {\n\tclaim: string;\n\tstatus: ClaimStatus;\n\tsupporting_passages: string[];\n\tcontradicting_passages: string[];\n\trationale: string;\n\tconfidence: number;\n}\n\nexport interface ResearchArtifact {\n\tid: string;\n\ttype: \"research\";\n\ttimestamp: number;\n\tquery: string;\n\tsources: ResearchSource[];\n\tpassages: ResearchPassage[];\n\tclaims?: ClaimAssessment[];\n\tprovider?: string;\n\tsummary?: string;\n\tcontent_hash?: string;\n\tfilters?: { recency?: RecencyFilter; domain_include?: string[]; domain_exclude?: string[] };\n\terrors?: Array<{ query: string; error: string }>;\n}\n\nexport interface ResearchSearchRequest {\n\tquery: string;\n\tnumResults: number;\n\trecencyFilter?: RecencyFilter;\n\tdomainFilter?: string[];\n}\nexport interface ResearchSearchResult { url: string; title: string; snippet: string; rank: number }\nexport interface ResearchSearchResponse { provider: string; results: ResearchSearchResult[]; summary?: string }\nexport interface ResearchProvider { name: string; search(req: ResearchSearchRequest): Promise<ResearchSearchResponse> }\n\nconst OFFICIAL_DOCS_HOSTS = /^(developers\\.|docs\\.|learn\\.|reference\\.)|\\.github\\.io$/i;\nconst OFFICIAL_DOCS_PATHS = /\\/(docs?|reference)(\\/|\\b)/i;\nconst VENDOR_DOCS_PATHS = /\\/(documentation|docs?)\\//i;\nconst REPO_ISSUE_PATHS = /\\/(issues|pull|pulls)\\//i;\nconst BLOG_HOSTS = /(medium\\.com|substack\\.com|dev\\.to|hashnode\\.)/i;\nconst BLOG_PATHS = /\\/blogs?\\//i;\nconst FORUM_HOSTS = /(stackoverflow\\.com|serverfault\\.com|superuser\\.com|discourse\\.|community\\.)/i;\nconst FORUM_PATHS = /\\/(forum|forums|threads)\\//i;\nconst NEWS_HOSTS = /(reuters\\.com|bloomberg\\.com|techcrunch\\.com|theverge\\.com|arstechnica\\.com|wired\\.com|cnet\\.com|zdnet\\.com)/i;\nconst NEWS_PATHS = /\\/news(\\/|$)/i;\n\nexport function classifySource(url: string): SourceQuality {\n\tlet host = \"\";\n\tlet path = \"\";\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\thost = parsed.hostname;\n\t\tpath = parsed.pathname;\n\t} catch {\n\t\treturn \"unknown\";\n\t}\n\tif (REPO_ISSUE_PATHS.test(path)) return \"repo_issue\";\n\tif (OFFICIAL_DOCS_HOSTS.test(host) || OFFICIAL_DOCS_PATHS.test(path)) return \"official_docs\";\n\tif (VENDOR_DOCS_PATHS.test(path)) return \"vendor_docs\";\n\tif (NEWS_HOSTS.test(host) || NEWS_PATHS.test(path)) return \"news\";\n\tif (FORUM_HOSTS.test(host) || FORUM_PATHS.test(path)) return \"forum\";\n\tif (BLOG_HOSTS.test(host) || BLOG_PATHS.test(path)) return \"blog\";\n\treturn \"unknown\";\n}\n\nexport function hashContent(text: string): string {\n\treturn `sha256:${createHash(\"sha256\").update(text, \"utf8\").digest(\"hex\")}`;\n}\n\ninterface Span { text: string; start: number; end: number }\n\nfunction tokenize(value: string): string[] {\n\treturn [...new Set(value.toLowerCase().split(/[^a-z0-9]+/).filter((term) => term.length > 3))];\n}\n\nfunction extractRelevantSpans(content: string, hint: string): Span[] {\n\tconst sentences: Span[] = [];\n\tconst sentencePattern = /[^.!?]+(?:[.!?]+(?=\\s|$)|$)/g;\n\tfor (const match of content.matchAll(sentencePattern)) {\n\t\tconst raw = match[0];\n\t\tconst text = raw.trim();\n\t\tif (text.length > 0 && text.length <= 400) {\n\t\t\tconst start = (match.index ?? 0) + raw.indexOf(text);\n\t\t\tsentences.push({ text, start, end: start + text.length });\n\t\t}\n\t}\n\tconst terms = tokenize(hint);\n\tif (terms.length === 0) return [];\n\treturn sentences\n\t\t.map((sentence, index) => ({ sentence, index, score: terms.filter((term) => sentence.text.toLowerCase().includes(term)).length }))\n\t\t.filter((item) => item.score > 0)\n\t\t.sort((a, b) => b.score - a.score || a.index - b.index)\n\t\t.slice(0, 3)\n\t\t.map(({ sentence }) => sentence);\n}\n\nfunction passageId(sourceRank: number, index: number): string {\n\treturn `p-${sourceRank}-${index}`;\n}\n\nexport function buildPassages(sources: ResearchSource[], fetched: ExtractedContent[] = [], hint = \"\"): ResearchPassage[] {\n\tconst passages: ResearchPassage[] = [];\n\tconst fetchedByUrl = new Map(fetched.map((item) => [item.url, item]));\n\tfor (const source of sources) {\n\t\tif (source.snippet) {\n\t\t\tpassages.push({\n\t\t\t\tpassage_id: passageId(source.rank, 0),\n\t\t\t\tsource_url: source.url,\n\t\t\t\tsource_rank: source.rank,\n\t\t\t\ttext: source.snippet,\n\t\t\t\tcontent_hash: hashContent(source.snippet),\n\t\t\t});\n\t\t}\n\t\tconst page = fetchedByUrl.get(source.url);\n\t\tif (page && !page.error && page.content) {\n\t\t\tconst passageHint = source.snippet?.trim() || hint;\n\t\t\tfor (const [index, span] of extractRelevantSpans(page.content, passageHint).entries()) {\n\t\t\t\tpassages.push({\n\t\t\t\t\tpassage_id: passageId(source.rank, index + 1),\n\t\t\t\t\tsource_url: source.url,\n\t\t\t\t\tsource_rank: source.rank,\n\t\t\t\t\ttext: span.text,\n\t\t\t\t\textraction_span: { start: span.start, end: span.end },\n\t\t\t\t\tcontent_hash: hashContent(span.text),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn passages;\n}\n\nexport function assessClaim(claim: string, passages: ResearchPassage[]): ClaimAssessment {\n\tif (passages.length === 0) {\n\t\treturn { claim, status: \"missing-evidence\", supporting_passages: [], contradicting_passages: [], rationale: \"No passages were retrieved for the claim.\", confidence: 0.2 };\n\t}\n\treturn {\n\t\tclaim,\n\t\tstatus: \"unclear\",\n\t\tsupporting_passages: [],\n\t\tcontradicting_passages: [],\n\t\trationale: \"Passages were retrieved, but automated semantic support or contradiction assessment is unavailable; review the cited passages manually.\",\n\t\tconfidence: 0.3,\n\t};\n}\n\ninterface RankedSearchResult extends SearchResult {\n\trank?: number;\n}\n\nexport interface BuildArtifactInput {\n\tquery: string;\n\tprovider?: string;\n\tsummary?: string;\n\tresults: RankedSearchResult[];\n\tfetched?: ExtractedContent[];\n\trecency?: RecencyFilter;\n\tdomainFilter?: string[];\n}\n\nexport function buildResearchArtifact(input: BuildArtifactInput): ResearchArtifact {\n\tconst filters = input.domainFilter ?? [];\n\tconst fetchedByUrl = new Map((input.fetched ?? []).map((page) => [page.url, page]));\n\tconst sources: ResearchSource[] = [];\n\tconst seen = new Set<string>();\n\tfor (const [index, result] of input.results.entries()) {\n\t\tif (seen.has(result.url)) continue;\n\t\tseen.add(result.url);\n\t\tconst page = fetchedByUrl.get(result.url);\n\t\tconst fetched = Boolean(page && !page.error);\n\t\tsources.push({\n\t\t\trank: result.rank ?? index + 1,\n\t\t\turl: result.url,\n\t\t\ttitle: result.title,\n\t\t\tsnippet: result.snippet,\n\t\t\tquality: classifySource(result.url),\n\t\t\tfetched,\n\t\t\t...(page ? { fetch_timestamp: Date.now() } : {}),\n\t\t\t...(page && !page.error ? { content_hash: hashContent(page.content) } : {}),\n\t\t\t...(page?.error ? { fetch_error: page.error } : {}),\n\t\t});\n\t}\n\tconst passages = buildPassages(sources, input.fetched, input.query);\n\tconst domainInclude = filters.filter((domain) => !domain.startsWith(\"-\"));\n\tconst domainExclude = filters.filter((domain) => domain.startsWith(\"-\")).map((domain) => domain.slice(1));\n\treturn {\n\t\tid: generateId(),\n\t\ttype: \"research\",\n\t\ttimestamp: Date.now(),\n\t\tquery: input.query,\n\t\tsources,\n\t\tpassages,\n\t\t...(input.provider !== undefined ? { provider: input.provider } : {}),\n\t\t...(input.summary !== undefined ? { summary: input.summary } : {}),\n\t\t...(passages.length > 0 ? { content_hash: hashContent(passages.map((passage) => passage.text).join(\"\\n\")) } : {}),\n\t\tfilters: {\n\t\t\t...(input.recency !== undefined ? { recency: input.recency } : {}),\n\t\t\tdomain_include: domainInclude,\n\t\t\tdomain_exclude: domainExclude,\n\t\t},\n\t};\n}\n\nexport function withClaimAssessment(artifact: ResearchArtifact, claims: string[]): ResearchArtifact {\n\treturn { ...artifact, claims: claims.map((claim) => assessClaim(claim, artifact.passages)) };\n}\n\nexport function storeResearchArtifact(artifact: ResearchArtifact): void {\n\tif (!artifact.id) throw new Error(\"Research artifact id must not be empty\");\n\tstoreResult(artifact.id, { id: artifact.id, type: \"research\", timestamp: artifact.timestamp, artifact });\n}\n\nexport function getResearchArtifact(id: string): ResearchArtifact | null {\n\tconst data = getResult(id);\n\tif (!data || data.type !== \"research\" || !data.artifact || typeof data.artifact !== \"object\") return null;\n\treturn data.artifact as ResearchArtifact;\n}\n"]}
|
|
@@ -12,7 +12,7 @@ export interface SummaryMeta {
|
|
|
12
12
|
phase?: "summary-model" | "deterministic-fallback";
|
|
13
13
|
edited?: boolean;
|
|
14
14
|
}
|
|
15
|
-
export type SummaryGenerationContext = Pick<ExtensionContext, "model" | "modelRegistry" | "cwd" | "isProjectTrusted">;
|
|
15
|
+
export type SummaryGenerationContext = Pick<ExtensionContext, "model" | "modelRegistry" | "sessionManager" | "cwd" | "isProjectTrusted">;
|
|
16
16
|
export declare function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string;
|
|
17
17
|
export declare function buildDeterministicSummary(results: QueryResultData[]): {
|
|
18
18
|
summary: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-review.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAuB,MAAM,8BAA8B,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"summary-review.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAuB,MAAM,8BAA8B,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,KAAK,gBAAgB,GAAG,OAAO,QAAQ,CAAC;AAYxC,eAAO,MAAM,8BAA8B,QAAS,CAAC;AAErD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,eAAe,GAAG,wBAAwB,CAAC;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,eAAe,GAAG,gBAAgB,GAAG,KAAK,GAAG,kBAAkB,CAAC,CAAC;AAiCzI,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAkCxF;AA2ED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAkB5G;AA+FD,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,eAAe,EAAE,EAC1B,GAAG,EAAE,wBAAwB,EAC7B,MAAM,CAAC,EAAE,WAAW,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,gBAAgB,EAC7B,UAAU,SAAiC,GACzC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAsJjD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { openCodeSessionHeaders } from "./opencode-session-headers.js";
|
|
1
2
|
import { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix } from "./summary-model-scope.js";
|
|
2
3
|
const PREFERRED_SUMMARY_MODELS = [
|
|
3
4
|
{ provider: "anthropic", id: "claude-haiku-4-5" },
|
|
@@ -308,6 +309,7 @@ export async function generateSummaryDraft(results, ctx, signal, modelOverride,
|
|
|
308
309
|
for (const { model, apiKey, headers, thinkingLevel } of resolved.candidates) {
|
|
309
310
|
const startedAt = Date.now();
|
|
310
311
|
try {
|
|
312
|
+
const sessionHeaders = openCodeSessionHeaders(model, ctx.sessionManager);
|
|
311
313
|
const userMessage = {
|
|
312
314
|
role: "user",
|
|
313
315
|
content: [{ type: "text", text: prompt }],
|
|
@@ -318,14 +320,16 @@ export async function generateSummaryDraft(results, ctx, signal, modelOverride,
|
|
|
318
320
|
? requestedThinkingLevel
|
|
319
321
|
: undefined;
|
|
320
322
|
const completionOptions = {
|
|
321
|
-
...(usesRegistryComplete
|
|
323
|
+
...(usesRegistryComplete
|
|
324
|
+
? (sessionHeaders ? { transformHeaders: (requestHeaders) => ({ ...requestHeaders, ...sessionHeaders }) } : {})
|
|
325
|
+
: { apiKey, headers: sessionHeaders ? { ...headers, ...sessionHeaders } : headers }),
|
|
322
326
|
signal: completionSignal,
|
|
323
327
|
...(requestedThinkingLevel ? { reasoning: requestedThinkingLevel } : {}),
|
|
324
328
|
...(enabledThinkingLevel ? { reasoningEffort: enabledThinkingLevel } : {}),
|
|
325
329
|
};
|
|
326
330
|
checkSummaryDeadline();
|
|
327
331
|
const completion = thinkingLevel !== undefined && !customCompleteFn && !usesRegistryComplete
|
|
328
|
-
? piAiCompat.completeSimple(model, { messages: [userMessage] }, { apiKey, headers, signal: completionSignal, ...(enabledThinkingLevel ? { reasoning: enabledThinkingLevel } : {}) })
|
|
332
|
+
? piAiCompat.completeSimple(model, { messages: [userMessage] }, { apiKey, headers: sessionHeaders ? { ...headers, ...sessionHeaders } : headers, signal: completionSignal, ...(enabledThinkingLevel ? { reasoning: enabledThinkingLevel } : {}) })
|
|
329
333
|
: completeFn(model, { messages: [userMessage] }, completionOptions);
|
|
330
334
|
const response = await raceSummaryOperation(Promise.resolve(completion));
|
|
331
335
|
if (response.stopReason === "aborted") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-review.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-review.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,mBAAmB,EAA6B,MAAM,0BAA0B,CAAC;AAO/K,MAAM,wBAAwB,GAAG;IAChC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE;IACjD,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE;IAChD,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,eAAe,EAAE;IACjD,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,kBAAkB,EAAE;IAC9C,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE;IACxC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,mBAAmB,EAAE;CACxC,CAAC;AAEX,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAC;AAcrD,SAAS,cAAc,CAAC,IAAY;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAuB;IACpD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,UAAU,MAAM,CAAC,KAAK,2BAA2B,MAAM,CAAC,KAAK,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,KAAK,GAAG;QACb,UAAU,MAAM,CAAC,KAAK,EAAE;QACxB,aAAa,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE;QAC3C,WAAW,MAAM,CAAC,MAAM,IAAI,2BAA2B,EAAE;KACzD,CAAC;IAEF,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA0B,EAAE,QAAiB;IAC/E,MAAM,QAAQ,GAAG;QAChB,sEAAsE;QACtE,0EAA0E;QAC1E,eAAe;QACf,mCAAmC;QACnC,qCAAqC;QACrC,oCAAoC;QACpC,0DAA0D;QAC1D,wEAAwE;KACxE,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IACnF,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAErC,IAAI,QAAQ,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,+BAA+B,CAAC,MAAc;IACtD,IAAI,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACpD,IAAI,YAAY,IAAI,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;IACjE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,8BAA8B,CAAC,OAA0B;IACjE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACN,+EAA+E;YAC/E,EAAE;YACF,SAAS;YACT,QAAQ;SACR,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAa;QACvB,yDAAyD;QACzD,EAAE;KACF,CAAC;IAEF,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,aAAa,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YAC1D,SAAS;QACV,CAAC;QAED,UAAU,IAAI,CAAC,CAAC;QAChB,MAAM,OAAO,GAAG,+BAA+B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,cAAc,MAAM,CAAC,OAAO,CAAC,MAAM,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,uBAAuB,CAAC,CAAC;QACzI,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEtB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;SAAM,CAAC;QACP,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAA0B;IACnE,MAAM,OAAO,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QACzC,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,kGAAkG,CAAC;IAEtG,OAAO;QACN,OAAO,EAAE,eAAe;QACxB,IAAI,EAAE;YACL,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,cAAc,CAAC,eAAe,CAAC;YAC9C,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,+BAA+B;YAC/C,KAAK,EAAE,wBAAwB;YAC/B,MAAM,EAAE,KAAK;SACb;KACD,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACxC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,0BAA0B,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO;QACN,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;QAC7C,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;QACxC,aAAa,EAAE,QAAQ,CAAC,aAAa;KACrC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,KAAiB,EAAE,SAAgC;IACtF,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACrE,OAAO,kBAAkB,CAAC,KAAK,EAAE,SAA+B,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,6BAA6B,CAC3C,GAA6B,EAC7B,aAAsB;IAEtB,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAkF,EAAE,CAAC;IAChG,MAAM,kBAAkB,GAAG,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACtF,KAAK,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,CAAC;IAExC,MAAM,UAAU,GAAmH,EAAE,CAAC;IACtI,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEhB,MAAM,KAAK,GAAG,4BAA4B,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;YACjD,SAAS;QACV,CAAC;QACD,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;YACtD,SAAS;QACV,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAC;YAC/D,SAAS;QACV,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,oBAAoB,CAC5B,OAA0B,EAC1B,cAAsB,EACtB,UAAU,GAAG,CAAC;IAEd,MAAM,aAAa,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO;QACN,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,IAAI,EAAE;YACL,GAAG,aAAa,CAAC,IAAI;YACrB,UAAU;YACV,cAAc;SACd;KACD,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IACjC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,IAAI,GAAI,GAA0B,CAAC,IAAI,CAAC;IAC9C,MAAM,OAAO,GAAI,GAA6B,CAAC,OAAO,CAAC;IACvD,OAAO,IAAI,KAAK,YAAY,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAa;IAC5C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,IAA+B,CAAC;IAC9C,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACtD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IAC5D,OAAO,EAAE,CAAC;AACX,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAa;IACxC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxD,MAAM,KAAK,GAAG,IAA+B,CAAC;IAC9C,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,OAA0B,EAC1B,GAA6B,EAC7B,MAAoB,EACpB,aAAsB,EACtB,QAAiB,EACjB,UAA6B,EAC7B,UAAU,GAAG,8BAA8B;IAE3C,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAqC,CAAC;IAC3D,MAAM,gBAAgB,GAAG,UAAU,KAAK,SAAS,CAAC;IAClD,MAAM,oBAAoB,GAAG,CAAC,gBAAgB,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,UAAU,CAAC;IAC1F,IAAI,UAAqE,CAAC;IAE1E,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAC;IACjD,MAAM,cAAc,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAC7D,IAAI,aAAwD,CAAC;IAC7D,MAAM,eAAe,GAAG,IAAI,OAAO,CAAwB,OAAO,CAAC,EAAE;QACpE,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,cAAc,CAAC,CAAC;QACzB,CAAC,EAAE,UAAU,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,mBAA6C,CAAC;IAClD,MAAM,kBAAkB,GAAG,MAAM;QAChC,CAAC,CAAC,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAClC,mBAAmB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YACzD,IAAI,MAAM,CAAC,OAAO;gBAAE,mBAAmB,EAAE,CAAC;;gBACrC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC;QACF,CAAC,CAAC,SAAS,CAAC;IACb,MAAM,gBAAgB,GAAG,MAAM;QAC9B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC;IAE7B,SAAS,oBAAoB;QAC5B,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAChD,4EAA4E;QAC5E,IAAI,kBAAkB,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,IAAI,UAAU,EAAE,CAAC;YACzF,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAC3B,MAAM,cAAc,CAAC;QACtB,CAAC;IACF,CAAC;IAED,KAAK,UAAU,oBAAoB,CAAI,SAAqB;QAC3D,kFAAkF;QAClF,uEAAuE;QACvE,KAAK,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACtD,oBAAoB,EAAE,CAAC;QACvB,MAAM,UAAU,GAAuB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACpE,IAAI,kBAAkB;YAAE,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,oBAAoB,EAAE,CAAC;QACvB,OAAO,MAAW,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACJ,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,QAAmE,CAAC;QACxE,IAAI,CAAC;YACJ,oBAAoB,EAAE,CAAC;YACvB,IAAI,CAAC,gBAAgB,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAChD,UAAU,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,UAAU,KAAK,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAS,CAAC,IAAI,CAAC,QAAQ,CAAqB,CAAC,CAAC,CAAC,UAAW,CAAC,QAAQ,CAAC;YACnH,QAAQ,GAAG,MAAM,oBAAoB,CAAC,6BAA6B,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,oBAAoB,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,oBAAoB,CAAC,OAAO,EAAE,iCAAiC,OAAO,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,CAAC,CAAC;QACpH,CAAC;QAED,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACJ,MAAM,WAAW,GAAY;oBAC5B,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBACzC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACrB,CAAC;gBACF,MAAM,sBAAsB,GAAG,MAAM,oBAAoB,CAAC,oBAAoB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;gBACtG,MAAM,oBAAoB,GAAG,sBAAsB,IAAI,sBAAsB,KAAK,KAAK;oBACtF,CAAC,CAAC,sBAAuC;oBACzC,CAAC,CAAC,SAAS,CAAC;gBACb,MAAM,iBAAiB,GAAG;oBACzB,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;oBACpD,MAAM,EAAE,gBAAgB;oBACxB,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxE,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1E,CAAC;gBACF,oBAAoB,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,aAAa,KAAK,SAAS,IAAI,CAAC,gBAAgB,IAAI,CAAC,oBAAoB;oBAC3F,CAAC,CAAC,UAAW,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBACrL,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;gBAErE,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;gBACzE,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;oBACvC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC5B,CAAC;gBAED,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,MAAM,OAAO,GAAG,YAAY;qBAC1B,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;qBACpD,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;qBAChD,IAAI,CAAC,IAAI,CAAC;qBACV,IAAI,EAAE,CAAC;gBAET,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;oBAChF,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBACxE,MAAM,IAAI,KAAK,CAAC,yDAAyD,UAAU,GAAG,CAAC,CAAC;gBACzF,CAAC;gBAED,OAAO;oBACN,OAAO;oBACP,IAAI,EAAE;wBACL,KAAK,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE;wBACtC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;wBAC/C,aAAa,EAAE,cAAc,CAAC,OAAO,CAAC;wBACtC,YAAY,EAAE,KAAK;wBACnB,KAAK,EAAE,eAAe;wBACtB,MAAM,EAAE,KAAK;qBACb;iBACD,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,oBAAoB,EAAE,CAAC;gBACvB,IAAI,YAAY,CAAC,GAAG,CAAC;oBAAE,MAAM,GAAG,CAAC;gBACjC,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9D,CAAC;QACF,CAAC;QAED,OAAO,oBAAoB,CAC1B,OAAO,EACP,SAAS,CAAC,CAAC,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC,CAAC,2BAA2B,EACnF,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,CAChC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC5B,OAAO,oBAAoB,CAAC,OAAO,EAAE,4BAA4B,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,GAAG,CAAC;IACX,CAAC;YAAS,CAAC;QACV,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,MAAM,IAAI,mBAAmB;YAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAC7F,CAAC;AACF,CAAC","sourcesContent":["import type { ModelThinkingLevel, ThinkingLevel } from \"@earendil-works/pi-ai\";\nimport type { complete, Api, Message, Model } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix, type SummaryThinkingLevel } from \"./summary-model-scope.ts\";\nimport type { QueryResultData } from \"./storage.ts\";\n\ntype ProviderHeaders = Record<string, string | null>;\ntype CompleteFunction = typeof complete;\ntype SummaryModelRegistry = SummaryGenerationContext[\"modelRegistry\"] & { complete?: CompleteFunction };\n\nconst PREFERRED_SUMMARY_MODELS = [\n\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-luna\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-terra\" },\n\t{ provider: \"google\", id: \"gemini-3.6-flash\" },\n\t{ provider: \"openai\", id: \"gpt-5-mini\" },\n\t{ provider: \"deepseek\", id: \"deepseek-v4-flash\" },\n] as const;\n\nexport const SUMMARY_GENERATION_DEADLINE_MS = 30_000;\n\nexport interface SummaryMeta {\n\tmodel: string | null;\n\tdurationMs: number;\n\ttokenEstimate: number;\n\tfallbackUsed: boolean;\n\tfallbackReason?: string;\n\tphase?: \"summary-model\" | \"deterministic-fallback\";\n\tedited?: boolean;\n}\n\nexport type SummaryGenerationContext = Pick<ExtensionContext, \"model\" | \"modelRegistry\" | \"cwd\" | \"isProjectTrusted\">;\n\nfunction estimateTokens(text: string): number {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return 0;\n\treturn Math.max(1, Math.ceil(trimmed.length / 4));\n}\n\nfunction summarizeQueryResult(result: QueryResultData): string {\n\tif (result.error) {\n\t\treturn `Query: ${result.query}\\nStatus: Error\\nError: ${result.error}`;\n\t}\n\n\tconst lines = [\n\t\t`Query: ${result.query}`,\n\t\t`Provider: ${result.provider ?? \"unknown\"}`,\n\t\t`Answer: ${result.answer || \"(no answer text returned)\"}`,\n\t];\n\n\tif (result.results.length === 0) {\n\t\tlines.push(\"Sources: none\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tlines.push(\"Sources:\");\n\tfor (let i = 0; i < result.results.length; i++) {\n\t\tconst source = result.results[i];\n\t\tlines.push(`${i + 1}. ${source.title} — ${source.url}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {\n\tconst sections = [\n\t\t\"You are writing the final web search summary for a coding assistant.\",\n\t\t\"Write a concise, factual summary using only the provided search results.\",\n\t\t\"Requirements:\",\n\t\t\"- Keep it readable and skimmable.\",\n\t\t\"- Include key findings and caveats.\",\n\t\t\"- Do not invent sources or claims.\",\n\t\t\"- If evidence is weak or conflicting, say so explicitly.\",\n\t\t\"- End with a short \\\"Sources\\\" section listing the most relevant URLs.\",\n\t];\n\n\tif (feedback) {\n\t\tsections.push(\"- Incorporate the user feedback provided below into the summary.\");\n\t}\n\n\tsections.push(\"\");\n\tsections.push(\"<search_results>\");\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tsections.push(`\\n[Result ${i + 1}]`);\n\t\tsections.push(summarizeQueryResult(results[i]));\n\t}\n\n\tsections.push(\"\\n</search_results>\");\n\n\tif (feedback) {\n\t\tsections.push(\"\");\n\t\tsections.push(\"<user_feedback>\");\n\t\tsections.push(feedback);\n\t\tsections.push(\"</user_feedback>\");\n\t}\n\n\treturn sections.join(\"\\n\");\n}\n\nfunction buildDeterministicAnswerPreview(answer: string): string {\n\tlet text = answer.replace(/\\s+/g, \" \").trim();\n\tif (text.length === 0) return \"\";\n\n\tconst sourceMarker = text.search(/\\bSources?\\s*:/i);\n\tif (sourceMarker >= 0) text = text.slice(0, sourceMarker).trim();\n\tif (text.length === 0) return \"\";\n\n\treturn text.length > 240 ? `${text.slice(0, 237)}...` : text;\n}\n\nfunction buildDeterministicSummaryLines(results: QueryResultData[]): string[] {\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t\"No completed search results were available when the curator session finished.\",\n\t\t\t\"\",\n\t\t\t\"Sources\",\n\t\t\t\"- None\",\n\t\t];\n\t}\n\n\tconst lines: string[] = [\n\t\t\"Summary based on the currently selected search results.\",\n\t\t\"\",\n\t];\n\n\tconst sourceUrls: string[] = [];\n\tlet successful = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\tif (result.error) {\n\t\t\tfailed += 1;\n\t\t\tlines.push(`- ${result.query}: failed (${result.error})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsuccessful += 1;\n\t\tconst preview = buildDeterministicAnswerPreview(result.answer);\n\t\tif (preview.length > 0) {\n\t\t\tlines.push(`- ${result.query}: ${preview}`);\n\t\t} else {\n\t\t\tlines.push(`- ${result.query}: returned ${result.results.length} source${result.results.length === 1 ? \"\" : \"s\"} without answer text.`);\n\t\t}\n\n\t\tfor (const source of result.results) {\n\t\t\tif (!sourceUrls.includes(source.url)) {\n\t\t\t\tsourceUrls.push(source.url);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`Completed queries: ${results.length}`);\n\tlines.push(`Successful: ${successful}`);\n\tlines.push(`Failed: ${failed}`);\n\tlines.push(\"\");\n\tlines.push(\"Sources\");\n\n\tif (sourceUrls.length === 0) {\n\t\tlines.push(\"- None\");\n\t} else {\n\t\tfor (const url of sourceUrls.slice(0, 12)) {\n\t\t\tlines.push(`- ${url}`);\n\t\t}\n\t\tif (sourceUrls.length > 12) {\n\t\t\tlines.push(`- ... and ${sourceUrls.length - 12} more`);\n\t\t}\n\t}\n\n\treturn lines;\n}\n\nexport function buildDeterministicSummary(results: QueryResultData[]): { summary: string; meta: SummaryMeta } {\n\tconst summary = buildDeterministicSummaryLines(results).join(\"\\n\").trim();\n\tconst nonEmptySummary = summary.length > 0\n\t\t? summary\n\t\t: \"No completed search results were available when the curator session finished.\\n\\nSources\\n- None\";\n\n\treturn {\n\t\tsummary: nonEmptySummary,\n\t\tmeta: {\n\t\t\tmodel: null,\n\t\t\tdurationMs: 0,\n\t\t\ttokenEstimate: estimateTokens(nonEmptySummary),\n\t\t\tfallbackUsed: true,\n\t\t\tfallbackReason: \"deterministic-submit-fallback\",\n\t\t\tphase: \"deterministic-fallback\",\n\t\t\tedited: false,\n\t\t},\n\t};\n}\n\nfunction parseModelSelector(value: string): { provider: string; id: string; thinkingLevel?: SummaryThinkingLevel } {\n\tconst selector = splitThinkingSuffix(value);\n\tconst slashIndex = selector.value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex >= selector.value.length - 1) {\n\t\tthrow new Error(`Invalid summary model: ${value}. Use provider/model-id.`);\n\t}\n\treturn {\n\t\tprovider: selector.value.slice(0, slashIndex),\n\t\tid: selector.value.slice(slashIndex + 1),\n\t\tthinkingLevel: selector.thinkingLevel,\n\t};\n}\n\nasync function resolveThinkingLevel(model: Model<Api>, requested?: SummaryThinkingLevel): Promise<ModelThinkingLevel | undefined> {\n\tif (!requested) return undefined;\n\tconst { clampThinkingLevel } = await import(\"@earendil-works/pi-ai\");\n\treturn clampThinkingLevel(model, requested as ModelThinkingLevel);\n}\n\nasync function resolveSummaryModelCandidates(\n\tctx: SummaryGenerationContext,\n\tmodelOverride?: string,\n): Promise<{ candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }>; errors: string[] }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tconst specs: Array<{ provider: string; id: string; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst normalizedOverride = typeof modelOverride === \"string\" ? modelOverride.trim() : \"\";\n\tif (normalizedOverride.length > 0) specs.push(parseModelSelector(normalizedOverride));\n\tspecs.push(...PREFERRED_SUMMARY_MODELS);\n\n\tconst candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst errors: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const spec of specs) {\n\t\tconst value = `${spec.provider}/${spec.id}`;\n\t\tif (seen.has(value)) continue;\n\t\tseen.add(value);\n\n\t\tconst model = findModelWithProviderRouting(ctx.modelRegistry, spec.provider, spec.id);\n\t\tif (!model) {\n\t\t\terrors.push(`Summary model not found: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) {\n\t\t\terrors.push(`Summary model is not enabled: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok) {\n\t\t\terrors.push(`No API key available for summary model ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ model, apiKey: auth.apiKey, headers: auth.headers, thinkingLevel: spec.thinkingLevel });\n\t}\n\treturn { candidates, errors };\n}\n\nfunction buildFallbackSummary(\n\tresults: QueryResultData[],\n\tfallbackReason: string,\n\tdurationMs = 0,\n): { summary: string; meta: SummaryMeta } {\n\tconst deterministic = buildDeterministicSummary(results);\n\treturn {\n\t\tsummary: deterministic.summary,\n\t\tmeta: {\n\t\t\t...deterministic.meta,\n\t\t\tdurationMs,\n\t\t\tfallbackReason,\n\t\t},\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tconst name = (err as { name?: unknown }).name;\n\tconst message = (err as { message?: unknown }).message;\n\treturn name === \"AbortError\" || (typeof message === \"string\" && message.toLowerCase().includes(\"abort\"));\n}\n\nfunction getTextFromContentPart(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"\";\n\tconst value = part as Record<string, unknown>;\n\tif (typeof value.text === \"string\") return value.text;\n\tif (typeof value.refusal === \"string\") return value.refusal;\n\treturn \"\";\n}\n\nfunction getContentPartType(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"unknown\";\n\tconst value = part as Record<string, unknown>;\n\treturn typeof value.type === \"string\" ? value.type : \"unknown\";\n}\n\nexport async function generateSummaryDraft(\n\tresults: QueryResultData[],\n\tctx: SummaryGenerationContext,\n\tsignal?: AbortSignal,\n\tmodelOverride?: string,\n\tfeedback?: string,\n\tcompleteFn?: CompleteFunction,\n\tdeadlineMs = SUMMARY_GENERATION_DEADLINE_MS,\n): Promise<{ summary: string; meta: SummaryMeta }> {\n\tif (!ctx || !ctx.modelRegistry) {\n\t\tthrow new Error(\"Summary generation context unavailable\");\n\t}\n\tif (signal?.aborted) throw new Error(\"Aborted\");\n\n\tconst registry = ctx.modelRegistry as SummaryModelRegistry;\n\tconst customCompleteFn = completeFn !== undefined;\n\tconst usesRegistryComplete = !customCompleteFn && typeof registry.complete === \"function\";\n\tlet piAiCompat: typeof import(\"@earendil-works/pi-ai/compat\") | undefined;\n\n\tconst generationStartedAt = Date.now();\n\tconst deadlineController = new AbortController();\n\tconst deadlineMarker = Symbol(\"summary-generation-deadline\");\n\tlet deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst deadlinePromise = new Promise<typeof deadlineMarker>(resolve => {\n\t\tdeadlineTimer = setTimeout(() => {\n\t\t\tdeadlineController.abort();\n\t\t\tresolve(deadlineMarker);\n\t\t}, deadlineMs);\n\t});\n\n\tlet callerAbortListener: (() => void) | undefined;\n\tconst callerAbortPromise = signal\n\t\t? new Promise<never>((_, reject) => {\n\t\t\tcallerAbortListener = () => reject(new Error(\"Aborted\"));\n\t\t\tif (signal.aborted) callerAbortListener();\n\t\t\telse signal.addEventListener(\"abort\", callerAbortListener, { once: true });\n\t\t})\n\t\t: undefined;\n\tconst completionSignal = signal\n\t\t? AbortSignal.any([signal, deadlineController.signal])\n\t\t: deadlineController.signal;\n\n\tfunction checkSummaryDeadline(): void {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t// Imports or synchronous providers can finish before an overdue timer runs.\n\t\tif (deadlineController.signal.aborted || Date.now() - generationStartedAt >= deadlineMs) {\n\t\t\tdeadlineController.abort();\n\t\t\tthrow deadlineMarker;\n\t\t}\n\t}\n\n\tasync function raceSummaryOperation<T>(operation: Promise<T>): Promise<T> {\n\t\t// A provider may ignore AbortSignal and never settle; observe it before racing so\n\t\t// its eventual rejection cannot become an unhandled promise rejection.\n\t\tvoid operation.then(() => undefined, () => undefined);\n\t\tcheckSummaryDeadline();\n\t\tconst contenders: Promise<unknown>[] = [operation, deadlinePromise];\n\t\tif (callerAbortPromise) contenders.push(callerAbortPromise);\n\t\tconst result = await Promise.race(contenders);\n\t\tcheckSummaryDeadline();\n\t\treturn result as T;\n\t}\n\n\ttry {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\tconst prompt = buildSummaryPrompt(results, feedback);\n\t\tlet resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;\n\t\ttry {\n\t\t\tcheckSummaryDeadline();\n\t\t\tif (!customCompleteFn && !usesRegistryComplete) {\n\t\t\t\tpiAiCompat = await raceSummaryOperation(import(\"@earendil-works/pi-ai/compat\"));\n\t\t\t}\n\t\t\tcompleteFn ??= usesRegistryComplete ? registry.complete!.bind(registry) as CompleteFunction : piAiCompat!.complete;\n\t\t\tresolved = await raceSummaryOperation(resolveSummaryModelCandidates(ctx, modelOverride));\n\t\t} catch (err) {\n\t\t\tcheckSummaryDeadline();\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\treturn buildFallbackSummary(results, `summary-model-settings-error: ${message}`, Date.now() - generationStartedAt);\n\t\t}\n\n\t\tlet lastError = resolved.errors.at(-1);\n\t\tfor (const { model, apiKey, headers, thinkingLevel } of resolved.candidates) {\n\t\t\tconst startedAt = Date.now();\n\t\t\ttry {\n\t\t\t\tconst userMessage: Message = {\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: [{ type: \"text\", text: prompt }],\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tconst requestedThinkingLevel = await raceSummaryOperation(resolveThinkingLevel(model, thinkingLevel));\n\t\t\t\tconst enabledThinkingLevel = requestedThinkingLevel && requestedThinkingLevel !== \"off\"\n\t\t\t\t\t? requestedThinkingLevel as ThinkingLevel\n\t\t\t\t\t: undefined;\n\t\t\t\tconst completionOptions = {\n\t\t\t\t\t...(usesRegistryComplete ? {} : { apiKey, headers }),\n\t\t\t\t\tsignal: completionSignal,\n\t\t\t\t\t...(requestedThinkingLevel ? { reasoning: requestedThinkingLevel } : {}),\n\t\t\t\t\t...(enabledThinkingLevel ? { reasoningEffort: enabledThinkingLevel } : {}),\n\t\t\t\t};\n\t\t\t\tcheckSummaryDeadline();\n\t\t\t\tconst completion = thinkingLevel !== undefined && !customCompleteFn && !usesRegistryComplete\n\t\t\t\t\t? piAiCompat!.completeSimple(model, { messages: [userMessage] }, { apiKey, headers, signal: completionSignal, ...(enabledThinkingLevel ? { reasoning: enabledThinkingLevel } : {}) })\n\t\t\t\t\t: completeFn(model, { messages: [userMessage] }, completionOptions);\n\n\t\t\t\tconst response = await raceSummaryOperation(Promise.resolve(completion));\n\t\t\t\tif (response.stopReason === \"aborted\") {\n\t\t\t\t\tthrow new Error(\"Aborted\");\n\t\t\t\t}\n\n\t\t\t\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\t\t\t\tconst summary = contentParts\n\t\t\t\t\t.map((part: unknown) => getTextFromContentPart(part))\n\t\t\t\t\t.filter((text: string) => text.trim().length > 0)\n\t\t\t\t\t.join(\"\\n\")\n\t\t\t\t\t.trim();\n\n\t\t\t\tif (summary.length === 0) {\n\t\t\t\t\tconst partTypes = contentParts.map((part: unknown) => getContentPartType(part));\n\t\t\t\t\tconst typesLabel = partTypes.length > 0 ? partTypes.join(\", \") : \"none\";\n\t\t\t\t\tthrow new Error(`Summary model returned empty response (content parts: ${typesLabel})`);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsummary,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tmodel: `${model.provider}/${model.id}`,\n\t\t\t\t\t\tdurationMs: Math.max(0, Date.now() - startedAt),\n\t\t\t\t\t\ttokenEstimate: estimateTokens(summary),\n\t\t\t\t\t\tfallbackUsed: false,\n\t\t\t\t\t\tphase: \"summary-model\",\n\t\t\t\t\t\tedited: false,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\tcheckSummaryDeadline();\n\t\t\t\tif (isAbortError(err)) throw err;\n\t\t\t\tlastError = err instanceof Error ? err.message : String(err);\n\t\t\t}\n\t\t}\n\n\t\treturn buildFallbackSummary(\n\t\t\tresults,\n\t\t\tlastError ? `summary-model-unavailable: ${lastError}` : \"summary-model-unavailable\",\n\t\t\tDate.now() - generationStartedAt,\n\t\t);\n\t} catch (err) {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\tif (err === deadlineMarker) {\n\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t}\n\t\tthrow err;\n\t} finally {\n\t\tif (deadlineTimer) clearTimeout(deadlineTimer);\n\t\tif (signal && callerAbortListener) signal.removeEventListener(\"abort\", callerAbortListener);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"summary-review.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-review.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ModelThinkingLevel, ThinkingLevel } from \"@earendil-works/pi-ai\";\nimport type { complete, Api, Message, Model } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { openCodeSessionHeaders } from \"./opencode-session-headers.ts\";\nimport { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix, type SummaryThinkingLevel } from \"./summary-model-scope.ts\";\nimport type { QueryResultData } from \"./storage.ts\";\n\ntype ProviderHeaders = Record<string, string | null>;\ntype CompleteFunction = typeof complete;\ntype SummaryModelRegistry = SummaryGenerationContext[\"modelRegistry\"] & { complete?: CompleteFunction };\n\nconst PREFERRED_SUMMARY_MODELS = [\n\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-luna\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-terra\" },\n\t{ provider: \"google\", id: \"gemini-3.6-flash\" },\n\t{ provider: \"openai\", id: \"gpt-5-mini\" },\n\t{ provider: \"deepseek\", id: \"deepseek-v4-flash\" },\n] as const;\n\nexport const SUMMARY_GENERATION_DEADLINE_MS = 30_000;\n\nexport interface SummaryMeta {\n\tmodel: string | null;\n\tdurationMs: number;\n\ttokenEstimate: number;\n\tfallbackUsed: boolean;\n\tfallbackReason?: string;\n\tphase?: \"summary-model\" | \"deterministic-fallback\";\n\tedited?: boolean;\n}\n\nexport type SummaryGenerationContext = Pick<ExtensionContext, \"model\" | \"modelRegistry\" | \"sessionManager\" | \"cwd\" | \"isProjectTrusted\">;\n\nfunction estimateTokens(text: string): number {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return 0;\n\treturn Math.max(1, Math.ceil(trimmed.length / 4));\n}\n\nfunction summarizeQueryResult(result: QueryResultData): string {\n\tif (result.error) {\n\t\treturn `Query: ${result.query}\\nStatus: Error\\nError: ${result.error}`;\n\t}\n\n\tconst lines = [\n\t\t`Query: ${result.query}`,\n\t\t`Provider: ${result.provider ?? \"unknown\"}`,\n\t\t`Answer: ${result.answer || \"(no answer text returned)\"}`,\n\t];\n\n\tif (result.results.length === 0) {\n\t\tlines.push(\"Sources: none\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tlines.push(\"Sources:\");\n\tfor (let i = 0; i < result.results.length; i++) {\n\t\tconst source = result.results[i];\n\t\tlines.push(`${i + 1}. ${source.title} — ${source.url}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {\n\tconst sections = [\n\t\t\"You are writing the final web search summary for a coding assistant.\",\n\t\t\"Write a concise, factual summary using only the provided search results.\",\n\t\t\"Requirements:\",\n\t\t\"- Keep it readable and skimmable.\",\n\t\t\"- Include key findings and caveats.\",\n\t\t\"- Do not invent sources or claims.\",\n\t\t\"- If evidence is weak or conflicting, say so explicitly.\",\n\t\t\"- End with a short \\\"Sources\\\" section listing the most relevant URLs.\",\n\t];\n\n\tif (feedback) {\n\t\tsections.push(\"- Incorporate the user feedback provided below into the summary.\");\n\t}\n\n\tsections.push(\"\");\n\tsections.push(\"<search_results>\");\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tsections.push(`\\n[Result ${i + 1}]`);\n\t\tsections.push(summarizeQueryResult(results[i]));\n\t}\n\n\tsections.push(\"\\n</search_results>\");\n\n\tif (feedback) {\n\t\tsections.push(\"\");\n\t\tsections.push(\"<user_feedback>\");\n\t\tsections.push(feedback);\n\t\tsections.push(\"</user_feedback>\");\n\t}\n\n\treturn sections.join(\"\\n\");\n}\n\nfunction buildDeterministicAnswerPreview(answer: string): string {\n\tlet text = answer.replace(/\\s+/g, \" \").trim();\n\tif (text.length === 0) return \"\";\n\n\tconst sourceMarker = text.search(/\\bSources?\\s*:/i);\n\tif (sourceMarker >= 0) text = text.slice(0, sourceMarker).trim();\n\tif (text.length === 0) return \"\";\n\n\treturn text.length > 240 ? `${text.slice(0, 237)}...` : text;\n}\n\nfunction buildDeterministicSummaryLines(results: QueryResultData[]): string[] {\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t\"No completed search results were available when the curator session finished.\",\n\t\t\t\"\",\n\t\t\t\"Sources\",\n\t\t\t\"- None\",\n\t\t];\n\t}\n\n\tconst lines: string[] = [\n\t\t\"Summary based on the currently selected search results.\",\n\t\t\"\",\n\t];\n\n\tconst sourceUrls: string[] = [];\n\tlet successful = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\tif (result.error) {\n\t\t\tfailed += 1;\n\t\t\tlines.push(`- ${result.query}: failed (${result.error})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsuccessful += 1;\n\t\tconst preview = buildDeterministicAnswerPreview(result.answer);\n\t\tif (preview.length > 0) {\n\t\t\tlines.push(`- ${result.query}: ${preview}`);\n\t\t} else {\n\t\t\tlines.push(`- ${result.query}: returned ${result.results.length} source${result.results.length === 1 ? \"\" : \"s\"} without answer text.`);\n\t\t}\n\n\t\tfor (const source of result.results) {\n\t\t\tif (!sourceUrls.includes(source.url)) {\n\t\t\t\tsourceUrls.push(source.url);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`Completed queries: ${results.length}`);\n\tlines.push(`Successful: ${successful}`);\n\tlines.push(`Failed: ${failed}`);\n\tlines.push(\"\");\n\tlines.push(\"Sources\");\n\n\tif (sourceUrls.length === 0) {\n\t\tlines.push(\"- None\");\n\t} else {\n\t\tfor (const url of sourceUrls.slice(0, 12)) {\n\t\t\tlines.push(`- ${url}`);\n\t\t}\n\t\tif (sourceUrls.length > 12) {\n\t\t\tlines.push(`- ... and ${sourceUrls.length - 12} more`);\n\t\t}\n\t}\n\n\treturn lines;\n}\n\nexport function buildDeterministicSummary(results: QueryResultData[]): { summary: string; meta: SummaryMeta } {\n\tconst summary = buildDeterministicSummaryLines(results).join(\"\\n\").trim();\n\tconst nonEmptySummary = summary.length > 0\n\t\t? summary\n\t\t: \"No completed search results were available when the curator session finished.\\n\\nSources\\n- None\";\n\n\treturn {\n\t\tsummary: nonEmptySummary,\n\t\tmeta: {\n\t\t\tmodel: null,\n\t\t\tdurationMs: 0,\n\t\t\ttokenEstimate: estimateTokens(nonEmptySummary),\n\t\t\tfallbackUsed: true,\n\t\t\tfallbackReason: \"deterministic-submit-fallback\",\n\t\t\tphase: \"deterministic-fallback\",\n\t\t\tedited: false,\n\t\t},\n\t};\n}\n\nfunction parseModelSelector(value: string): { provider: string; id: string; thinkingLevel?: SummaryThinkingLevel } {\n\tconst selector = splitThinkingSuffix(value);\n\tconst slashIndex = selector.value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex >= selector.value.length - 1) {\n\t\tthrow new Error(`Invalid summary model: ${value}. Use provider/model-id.`);\n\t}\n\treturn {\n\t\tprovider: selector.value.slice(0, slashIndex),\n\t\tid: selector.value.slice(slashIndex + 1),\n\t\tthinkingLevel: selector.thinkingLevel,\n\t};\n}\n\nasync function resolveThinkingLevel(model: Model<Api>, requested?: SummaryThinkingLevel): Promise<ModelThinkingLevel | undefined> {\n\tif (!requested) return undefined;\n\tconst { clampThinkingLevel } = await import(\"@earendil-works/pi-ai\");\n\treturn clampThinkingLevel(model, requested as ModelThinkingLevel);\n}\n\nasync function resolveSummaryModelCandidates(\n\tctx: SummaryGenerationContext,\n\tmodelOverride?: string,\n): Promise<{ candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }>; errors: string[] }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tconst specs: Array<{ provider: string; id: string; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst normalizedOverride = typeof modelOverride === \"string\" ? modelOverride.trim() : \"\";\n\tif (normalizedOverride.length > 0) specs.push(parseModelSelector(normalizedOverride));\n\tspecs.push(...PREFERRED_SUMMARY_MODELS);\n\n\tconst candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst errors: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const spec of specs) {\n\t\tconst value = `${spec.provider}/${spec.id}`;\n\t\tif (seen.has(value)) continue;\n\t\tseen.add(value);\n\n\t\tconst model = findModelWithProviderRouting(ctx.modelRegistry, spec.provider, spec.id);\n\t\tif (!model) {\n\t\t\terrors.push(`Summary model not found: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) {\n\t\t\terrors.push(`Summary model is not enabled: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok) {\n\t\t\terrors.push(`No API key available for summary model ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ model, apiKey: auth.apiKey, headers: auth.headers, thinkingLevel: spec.thinkingLevel });\n\t}\n\treturn { candidates, errors };\n}\n\nfunction buildFallbackSummary(\n\tresults: QueryResultData[],\n\tfallbackReason: string,\n\tdurationMs = 0,\n): { summary: string; meta: SummaryMeta } {\n\tconst deterministic = buildDeterministicSummary(results);\n\treturn {\n\t\tsummary: deterministic.summary,\n\t\tmeta: {\n\t\t\t...deterministic.meta,\n\t\t\tdurationMs,\n\t\t\tfallbackReason,\n\t\t},\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tconst name = (err as { name?: unknown }).name;\n\tconst message = (err as { message?: unknown }).message;\n\treturn name === \"AbortError\" || (typeof message === \"string\" && message.toLowerCase().includes(\"abort\"));\n}\n\nfunction getTextFromContentPart(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"\";\n\tconst value = part as Record<string, unknown>;\n\tif (typeof value.text === \"string\") return value.text;\n\tif (typeof value.refusal === \"string\") return value.refusal;\n\treturn \"\";\n}\n\nfunction getContentPartType(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"unknown\";\n\tconst value = part as Record<string, unknown>;\n\treturn typeof value.type === \"string\" ? value.type : \"unknown\";\n}\n\nexport async function generateSummaryDraft(\n\tresults: QueryResultData[],\n\tctx: SummaryGenerationContext,\n\tsignal?: AbortSignal,\n\tmodelOverride?: string,\n\tfeedback?: string,\n\tcompleteFn?: CompleteFunction,\n\tdeadlineMs = SUMMARY_GENERATION_DEADLINE_MS,\n): Promise<{ summary: string; meta: SummaryMeta }> {\n\tif (!ctx || !ctx.modelRegistry) {\n\t\tthrow new Error(\"Summary generation context unavailable\");\n\t}\n\tif (signal?.aborted) throw new Error(\"Aborted\");\n\n\tconst registry = ctx.modelRegistry as SummaryModelRegistry;\n\tconst customCompleteFn = completeFn !== undefined;\n\tconst usesRegistryComplete = !customCompleteFn && typeof registry.complete === \"function\";\n\tlet piAiCompat: typeof import(\"@earendil-works/pi-ai/compat\") | undefined;\n\n\tconst generationStartedAt = Date.now();\n\tconst deadlineController = new AbortController();\n\tconst deadlineMarker = Symbol(\"summary-generation-deadline\");\n\tlet deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst deadlinePromise = new Promise<typeof deadlineMarker>(resolve => {\n\t\tdeadlineTimer = setTimeout(() => {\n\t\t\tdeadlineController.abort();\n\t\t\tresolve(deadlineMarker);\n\t\t}, deadlineMs);\n\t});\n\n\tlet callerAbortListener: (() => void) | undefined;\n\tconst callerAbortPromise = signal\n\t\t? new Promise<never>((_, reject) => {\n\t\t\tcallerAbortListener = () => reject(new Error(\"Aborted\"));\n\t\t\tif (signal.aborted) callerAbortListener();\n\t\t\telse signal.addEventListener(\"abort\", callerAbortListener, { once: true });\n\t\t})\n\t\t: undefined;\n\tconst completionSignal = signal\n\t\t? AbortSignal.any([signal, deadlineController.signal])\n\t\t: deadlineController.signal;\n\n\tfunction checkSummaryDeadline(): void {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t// Imports or synchronous providers can finish before an overdue timer runs.\n\t\tif (deadlineController.signal.aborted || Date.now() - generationStartedAt >= deadlineMs) {\n\t\t\tdeadlineController.abort();\n\t\t\tthrow deadlineMarker;\n\t\t}\n\t}\n\n\tasync function raceSummaryOperation<T>(operation: Promise<T>): Promise<T> {\n\t\t// A provider may ignore AbortSignal and never settle; observe it before racing so\n\t\t// its eventual rejection cannot become an unhandled promise rejection.\n\t\tvoid operation.then(() => undefined, () => undefined);\n\t\tcheckSummaryDeadline();\n\t\tconst contenders: Promise<unknown>[] = [operation, deadlinePromise];\n\t\tif (callerAbortPromise) contenders.push(callerAbortPromise);\n\t\tconst result = await Promise.race(contenders);\n\t\tcheckSummaryDeadline();\n\t\treturn result as T;\n\t}\n\n\ttry {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\tconst prompt = buildSummaryPrompt(results, feedback);\n\t\tlet resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;\n\t\ttry {\n\t\t\tcheckSummaryDeadline();\n\t\t\tif (!customCompleteFn && !usesRegistryComplete) {\n\t\t\t\tpiAiCompat = await raceSummaryOperation(import(\"@earendil-works/pi-ai/compat\"));\n\t\t\t}\n\t\t\tcompleteFn ??= usesRegistryComplete ? registry.complete!.bind(registry) as CompleteFunction : piAiCompat!.complete;\n\t\t\tresolved = await raceSummaryOperation(resolveSummaryModelCandidates(ctx, modelOverride));\n\t\t} catch (err) {\n\t\t\tcheckSummaryDeadline();\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\treturn buildFallbackSummary(results, `summary-model-settings-error: ${message}`, Date.now() - generationStartedAt);\n\t\t}\n\n\t\tlet lastError = resolved.errors.at(-1);\n\t\tfor (const { model, apiKey, headers, thinkingLevel } of resolved.candidates) {\n\t\t\tconst startedAt = Date.now();\n\t\t\ttry {\n\t\t\t\tconst sessionHeaders = openCodeSessionHeaders(model, ctx.sessionManager);\n\t\t\t\tconst userMessage: Message = {\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: [{ type: \"text\", text: prompt }],\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tconst requestedThinkingLevel = await raceSummaryOperation(resolveThinkingLevel(model, thinkingLevel));\n\t\t\t\tconst enabledThinkingLevel = requestedThinkingLevel && requestedThinkingLevel !== \"off\"\n\t\t\t\t\t? requestedThinkingLevel as ThinkingLevel\n\t\t\t\t\t: undefined;\n\t\t\t\tconst completionOptions = {\n\t\t\t\t\t...(usesRegistryComplete\n\t\t\t\t\t\t? (sessionHeaders ? { transformHeaders: (requestHeaders: Record<string, string>) => ({ ...requestHeaders, ...sessionHeaders }) } : {})\n\t\t\t\t\t\t: { apiKey, headers: sessionHeaders ? { ...headers, ...sessionHeaders } : headers }),\n\t\t\t\t\tsignal: completionSignal,\n\t\t\t\t\t...(requestedThinkingLevel ? { reasoning: requestedThinkingLevel } : {}),\n\t\t\t\t\t...(enabledThinkingLevel ? { reasoningEffort: enabledThinkingLevel } : {}),\n\t\t\t\t};\n\t\t\t\tcheckSummaryDeadline();\n\t\t\t\tconst completion = thinkingLevel !== undefined && !customCompleteFn && !usesRegistryComplete\n\t\t\t\t\t? piAiCompat!.completeSimple(model, { messages: [userMessage] }, { apiKey, headers: sessionHeaders ? { ...headers, ...sessionHeaders } : headers, signal: completionSignal, ...(enabledThinkingLevel ? { reasoning: enabledThinkingLevel } : {}) })\n\t\t\t\t\t: completeFn(model, { messages: [userMessage] }, completionOptions);\n\n\t\t\t\tconst response = await raceSummaryOperation(Promise.resolve(completion));\n\t\t\t\tif (response.stopReason === \"aborted\") {\n\t\t\t\t\tthrow new Error(\"Aborted\");\n\t\t\t\t}\n\n\t\t\t\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\t\t\t\tconst summary = contentParts\n\t\t\t\t\t.map((part: unknown) => getTextFromContentPart(part))\n\t\t\t\t\t.filter((text: string) => text.trim().length > 0)\n\t\t\t\t\t.join(\"\\n\")\n\t\t\t\t\t.trim();\n\n\t\t\t\tif (summary.length === 0) {\n\t\t\t\t\tconst partTypes = contentParts.map((part: unknown) => getContentPartType(part));\n\t\t\t\t\tconst typesLabel = partTypes.length > 0 ? partTypes.join(\", \") : \"none\";\n\t\t\t\t\tthrow new Error(`Summary model returned empty response (content parts: ${typesLabel})`);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsummary,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tmodel: `${model.provider}/${model.id}`,\n\t\t\t\t\t\tdurationMs: Math.max(0, Date.now() - startedAt),\n\t\t\t\t\t\ttokenEstimate: estimateTokens(summary),\n\t\t\t\t\t\tfallbackUsed: false,\n\t\t\t\t\t\tphase: \"summary-model\",\n\t\t\t\t\t\tedited: false,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\tcheckSummaryDeadline();\n\t\t\t\tif (isAbortError(err)) throw err;\n\t\t\t\tlastError = err instanceof Error ? err.message : String(err);\n\t\t\t}\n\t\t}\n\n\t\treturn buildFallbackSummary(\n\t\t\tresults,\n\t\t\tlastError ? `summary-model-unavailable: ${lastError}` : \"summary-model-unavailable\",\n\t\t\tDate.now() - generationStartedAt,\n\t\t);\n\t} catch (err) {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\tif (err === deadlineMarker) {\n\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t}\n\t\tthrow err;\n\t} finally {\n\t\tif (deadlineTimer) clearTimeout(deadlineTimer);\n\t\tif (signal && callerAbortListener) signal.removeEventListener(\"abort\", callerAbortListener);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tavily.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tavily.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AA0BrE,UAAU,mBAAoB,SAAQ,aAAa;IAClD,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AA0GD,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CA6DhH"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { activityMonitor } from "./activity.js";
|
|
3
|
+
import { normalizeDomain } from "./domain-filter-normalization.js";
|
|
4
|
+
import { normalizeSearchResultCount } from "./search-result-count-normalization.js";
|
|
3
5
|
import { hasCredentialSource, redactCredential, resolveCredential } from "./credential-source.js";
|
|
4
6
|
import { fetchWithCredentialRedirects, getWebSearchConfigPath, resolveApiBaseUrl } from "./utils.js";
|
|
5
7
|
const TAVILY_API_BASE_URL = "https://api.tavily.com";
|
|
@@ -50,29 +52,6 @@ async function requireApiKey(signal) {
|
|
|
50
52
|
}
|
|
51
53
|
return apiKey;
|
|
52
54
|
}
|
|
53
|
-
function normalizeCount(value) {
|
|
54
|
-
if (typeof value !== "number" || !Number.isFinite(value))
|
|
55
|
-
return 5;
|
|
56
|
-
return Math.max(1, Math.min(Math.floor(value), 20));
|
|
57
|
-
}
|
|
58
|
-
function normalizeDomain(value) {
|
|
59
|
-
let input = value.trim().toLowerCase();
|
|
60
|
-
if (!input)
|
|
61
|
-
return null;
|
|
62
|
-
if (input.startsWith("-"))
|
|
63
|
-
input = input.slice(1).trim();
|
|
64
|
-
if (!input)
|
|
65
|
-
return null;
|
|
66
|
-
try {
|
|
67
|
-
const parsed = input.includes("://") ? new URL(input) : new URL(`https://${input}`);
|
|
68
|
-
input = parsed.hostname;
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
input = input.split("/")[0]?.split(":")[0] ?? "";
|
|
72
|
-
}
|
|
73
|
-
input = input.replace(/^\.+|\.+$/g, "");
|
|
74
|
-
return /^[a-z0-9][a-z0-9.-]*\.[a-z]{2,}$/i.test(input) ? input : null;
|
|
75
|
-
}
|
|
76
55
|
function mapDomainFilter(domainFilter) {
|
|
77
56
|
if (!domainFilter?.length)
|
|
78
57
|
return {};
|
|
@@ -139,7 +118,7 @@ export function isTavilyAvailable() {
|
|
|
139
118
|
export async function searchWithTavily(query, options = {}) {
|
|
140
119
|
const apiUrl = getApiUrl();
|
|
141
120
|
const apiKey = await requireApiKey(options.signal);
|
|
142
|
-
const numResults =
|
|
121
|
+
const numResults = normalizeSearchResultCount(options.numResults);
|
|
143
122
|
const body = {
|
|
144
123
|
query,
|
|
145
124
|
search_depth: "basic",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tavily.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tavily.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { fetchWithCredentialRedirects, getWebSearchConfigPath, resolveApiBaseUrl } from \"./utils.ts\";\n\nconst TAVILY_API_BASE_URL = \"https://api.tavily.com\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\ninterface WebSearchConfig {\n\ttavilyApiKey?: unknown;\n\ttavilyBaseUrl?: unknown;\n}\n\ninterface TavilyResult {\n\ttitle?: string;\n\turl?: string;\n\tcontent?: string;\n\traw_content?: string | null;\n}\n\ninterface TavilyResponse {\n\tanswer?: string;\n\tresults?: TavilyResult[];\n}\n\ninterface TavilySearchOptions extends SearchOptions {\n\tincludeContent?: boolean;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\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\nasync function getApiKey(signal?: AbortSignal): Promise<string | null> {\n\treturn resolveCredential({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t\tsignal,\n\t});\n}\n\nfunction getApiUrl(): string {\n\treturn `${resolveApiBaseUrl({\n\t\tconfigKey: \"tavilyBaseUrl\",\n\t\tconfiguredValue: loadConfig().tavilyBaseUrl,\n\t\tdefaultValue: TAVILY_API_BASE_URL,\n\t\tenvironmentKey: \"TAVILY_BASE_URL\",\n\t\tenvironmentValue: process.env.TAVILY_BASE_URL,\n\t})}/search`;\n}\n\nasync function requireApiKey(signal?: AbortSignal): Promise<string> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) {\n\t\tthrow new Error(\n\t\t\t\"Tavily API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"tavilyApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set TAVILY_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://app.tavily.com/\",\n\t\t);\n\t}\n\treturn apiKey;\n}\n\nfunction normalizeCount(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction mapDomainFilter(domainFilter: string[] | undefined): { include_domains?: string[]; exclude_domains?: string[] } {\n\tif (!domainFilter?.length) return {};\n\tconst include_domains: string[] = [];\n\tconst exclude_domains: string[] = [];\n\tfor (const raw of domainFilter) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? exclude_domains : include_domains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn {\n\t\t...(include_domains.length > 0 ? { include_domains } : {}),\n\t\t...(exclude_domains.length > 0 ? { exclude_domains } : {}),\n\t};\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n\tconst timeout = AbortSignal.timeout(SEARCH_TIMEOUT_MS);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction mapResults(results: TavilyResult[] | undefined, numResults: number): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) return [];\n\tconst mapped: SearchResponse[\"results\"] = [];\n\tfor (const item of results) {\n\t\tif (!item?.url) continue;\n\t\tmapped.push({\n\t\t\ttitle: item.title || `Source ${mapped.length + 1}`,\n\t\t\turl: item.url,\n\t\t\tsnippet: typeof item.content === \"string\" ? item.content.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t});\n\t\tif (mapped.length >= numResults) break;\n\t}\n\treturn mapped;\n}\n\nfunction mapInlineContent(results: TavilyResult[] | undefined): ExtractedContent[] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item?.url || typeof item.raw_content !== \"string\" || item.raw_content.trim().length === 0) return [];\n\t\treturn [{\n\t\t\turl: item.url,\n\t\t\ttitle: item.title || \"\",\n\t\t\tcontent: item.raw_content,\n\t\t\terror: null,\n\t\t}];\n\t});\n}\n\nexport function isTavilyAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t});\n}\n\nexport async function searchWithTavily(query: string, options: TavilySearchOptions = {}): Promise<SearchResponse> {\n\tconst apiUrl = getApiUrl();\n\tconst apiKey = await requireApiKey(options.signal);\n\tconst numResults = normalizeCount(options.numResults);\n\tconst body: Record<string, unknown> = {\n\t\tquery,\n\t\tsearch_depth: \"basic\",\n\t\tmax_results: numResults,\n\t\tinclude_answer: \"basic\",\n\t\tinclude_raw_content: options.includeContent ? \"markdown\" : false,\n\t\t...(options.recencyFilter ? { time_range: options.recencyFilter } : {}),\n\t\t...mapDomainFilter(options.domainFilter),\n\t};\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetchWithCredentialRedirects(apiUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Authorization\": `Bearer ${apiKey}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal(options.signal),\n\t\t}, [\"Authorization\"]);\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n\n\tif (!response.ok) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tconst errorText = redactCredential(await response.text(), apiKey);\n\t\tthrow new Error(`Tavily API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t}\n\n\tlet data: TavilyResponse;\n\ttry {\n\t\tdata = await response.json() as TavilyResponse;\n\t} catch (err) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tthrow new Error(`Tavily API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n\n\tactivityMonitor.logComplete(activityId, response.status);\n\tconst result: SearchResponse = {\n\t\tanswer: typeof data.answer === \"string\" ? data.answer : \"\",\n\t\tresults: mapResults(data.results, numResults),\n\t};\n\tif (options.includeContent) {\n\t\tconst inlineContent = mapInlineContent(data.results);\n\t\tif (inlineContent.length > 0) result.inlineContent = inlineContent;\n\t}\n\treturn result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tavily.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tavily.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { normalizeDomain } from \"./domain-filter-normalization.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { normalizeSearchResultCount } from \"./search-result-count-normalization.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { fetchWithCredentialRedirects, getWebSearchConfigPath, resolveApiBaseUrl } from \"./utils.ts\";\n\nconst TAVILY_API_BASE_URL = \"https://api.tavily.com\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\ninterface WebSearchConfig {\n\ttavilyApiKey?: unknown;\n\ttavilyBaseUrl?: unknown;\n}\n\ninterface TavilyResult {\n\ttitle?: string;\n\turl?: string;\n\tcontent?: string;\n\traw_content?: string | null;\n}\n\ninterface TavilyResponse {\n\tanswer?: string;\n\tresults?: TavilyResult[];\n}\n\ninterface TavilySearchOptions extends SearchOptions {\n\tincludeContent?: boolean;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\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\nasync function getApiKey(signal?: AbortSignal): Promise<string | null> {\n\treturn resolveCredential({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t\tsignal,\n\t});\n}\n\nfunction getApiUrl(): string {\n\treturn `${resolveApiBaseUrl({\n\t\tconfigKey: \"tavilyBaseUrl\",\n\t\tconfiguredValue: loadConfig().tavilyBaseUrl,\n\t\tdefaultValue: TAVILY_API_BASE_URL,\n\t\tenvironmentKey: \"TAVILY_BASE_URL\",\n\t\tenvironmentValue: process.env.TAVILY_BASE_URL,\n\t})}/search`;\n}\n\nasync function requireApiKey(signal?: AbortSignal): Promise<string> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) {\n\t\tthrow new Error(\n\t\t\t\"Tavily API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"tavilyApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set TAVILY_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://app.tavily.com/\",\n\t\t);\n\t}\n\treturn apiKey;\n}\n\nfunction mapDomainFilter(domainFilter: string[] | undefined): { include_domains?: string[]; exclude_domains?: string[] } {\n\tif (!domainFilter?.length) return {};\n\tconst include_domains: string[] = [];\n\tconst exclude_domains: string[] = [];\n\tfor (const raw of domainFilter) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? exclude_domains : include_domains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn {\n\t\t...(include_domains.length > 0 ? { include_domains } : {}),\n\t\t...(exclude_domains.length > 0 ? { exclude_domains } : {}),\n\t};\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n\tconst timeout = AbortSignal.timeout(SEARCH_TIMEOUT_MS);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction mapResults(results: TavilyResult[] | undefined, numResults: number): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) return [];\n\tconst mapped: SearchResponse[\"results\"] = [];\n\tfor (const item of results) {\n\t\tif (!item?.url) continue;\n\t\tmapped.push({\n\t\t\ttitle: item.title || `Source ${mapped.length + 1}`,\n\t\t\turl: item.url,\n\t\t\tsnippet: typeof item.content === \"string\" ? item.content.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t});\n\t\tif (mapped.length >= numResults) break;\n\t}\n\treturn mapped;\n}\n\nfunction mapInlineContent(results: TavilyResult[] | undefined): ExtractedContent[] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item?.url || typeof item.raw_content !== \"string\" || item.raw_content.trim().length === 0) return [];\n\t\treturn [{\n\t\t\turl: item.url,\n\t\t\ttitle: item.title || \"\",\n\t\t\tcontent: item.raw_content,\n\t\t\terror: null,\n\t\t}];\n\t});\n}\n\nexport function isTavilyAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t});\n}\n\nexport async function searchWithTavily(query: string, options: TavilySearchOptions = {}): Promise<SearchResponse> {\n\tconst apiUrl = getApiUrl();\n\tconst apiKey = await requireApiKey(options.signal);\n\tconst numResults = normalizeSearchResultCount(options.numResults);\n\tconst body: Record<string, unknown> = {\n\t\tquery,\n\t\tsearch_depth: \"basic\",\n\t\tmax_results: numResults,\n\t\tinclude_answer: \"basic\",\n\t\tinclude_raw_content: options.includeContent ? \"markdown\" : false,\n\t\t...(options.recencyFilter ? { time_range: options.recencyFilter } : {}),\n\t\t...mapDomainFilter(options.domainFilter),\n\t};\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetchWithCredentialRedirects(apiUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Authorization\": `Bearer ${apiKey}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal(options.signal),\n\t\t}, [\"Authorization\"]);\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n\n\tif (!response.ok) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tconst errorText = redactCredential(await response.text(), apiKey);\n\t\tthrow new Error(`Tavily API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t}\n\n\tlet data: TavilyResponse;\n\ttry {\n\t\tdata = await response.json() as TavilyResponse;\n\t} catch (err) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tthrow new Error(`Tavily API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n\n\tactivityMonitor.logComplete(activityId, response.status);\n\tconst result: SearchResponse = {\n\t\tanswer: typeof data.answer === \"string\" ? data.answer : \"\",\n\t\tresults: mapResults(data.results, numResults),\n\t};\n\tif (options.includeContent) {\n\t\tconst inlineContent = mapInlineContent(data.results);\n\t\tif (inlineContent.length > 0) result.inlineContent = inlineContent;\n\t}\n\treturn result;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tinyfish.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tinyfish.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tinyfish.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tinyfish.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAsDrE,UAAU,qBAAsB,SAAQ,aAAa;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAqBD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAoBD,wBAAgB,mBAAmB,IAAI,OAAO,CAM7C;AA2LD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,cAAc,CAAC,CAuCpH;AAED,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA+BlC"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { activityMonitor } from "./activity.js";
|
|
3
|
+
import { normalizeDomain } from "./domain-filter-normalization.js";
|
|
4
|
+
import { formatSearchResultsAsAnswer } from "./search-answer-formatting.js";
|
|
5
|
+
import { normalizeSearchResultCount } from "./search-result-count-normalization.js";
|
|
3
6
|
import { hasCredentialSource, redactCredential, resolveCredential } from "./credential-source.js";
|
|
4
7
|
import { getWebSearchConfigPath } from "./utils.js";
|
|
5
8
|
const TINYFISH_SEARCH_URL = "https://api.search.tinyfish.ai";
|
|
@@ -59,24 +62,6 @@ function requestSignal(signal, timeoutMs) {
|
|
|
59
62
|
const timeout = AbortSignal.timeout(timeoutMs);
|
|
60
63
|
return signal ? AbortSignal.any([signal, timeout]) : timeout;
|
|
61
64
|
}
|
|
62
|
-
function normalizeDomain(value) {
|
|
63
|
-
let input = value.trim().toLowerCase();
|
|
64
|
-
if (!input)
|
|
65
|
-
return null;
|
|
66
|
-
if (input.startsWith("-"))
|
|
67
|
-
input = input.slice(1).trim();
|
|
68
|
-
if (!input)
|
|
69
|
-
return null;
|
|
70
|
-
try {
|
|
71
|
-
const parsed = input.includes("://") ? new URL(input) : new URL(`https://${input}`);
|
|
72
|
-
input = parsed.hostname;
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
input = input.split("/")[0]?.split(":")[0] ?? "";
|
|
76
|
-
}
|
|
77
|
-
input = input.replace(/^\.+|\.+$/g, "");
|
|
78
|
-
return /^[a-z0-9][a-z0-9.-]*\.[a-z]{2,}$/i.test(input) ? input : null;
|
|
79
|
-
}
|
|
80
65
|
function mapDomainFilter(domainFilter) {
|
|
81
66
|
const includeDomains = [];
|
|
82
67
|
const excludeDomains = [];
|
|
@@ -101,11 +86,6 @@ function recencyMinutes(filter) {
|
|
|
101
86
|
};
|
|
102
87
|
return minutes[filter];
|
|
103
88
|
}
|
|
104
|
-
function normalizeNumResults(value) {
|
|
105
|
-
if (typeof value !== "number" || !Number.isFinite(value))
|
|
106
|
-
return 5;
|
|
107
|
-
return Math.max(1, Math.min(Math.floor(value), 20));
|
|
108
|
-
}
|
|
109
89
|
function buildSearchUrl(query, options, page) {
|
|
110
90
|
const params = new URLSearchParams({ query });
|
|
111
91
|
const { includeDomains, excludeDomains } = mapDomainFilter(options.domainFilter);
|
|
@@ -181,13 +161,6 @@ function deduplicateResults(results, limit) {
|
|
|
181
161
|
}
|
|
182
162
|
return unique;
|
|
183
163
|
}
|
|
184
|
-
function buildAnswer(results) {
|
|
185
|
-
return results.map((result) => {
|
|
186
|
-
if (result.snippet)
|
|
187
|
-
return `${result.snippet}\nSource: ${result.title} (${result.url})`;
|
|
188
|
-
return `Source: ${result.title} (${result.url})`;
|
|
189
|
-
}).join("\n\n");
|
|
190
|
-
}
|
|
191
164
|
function fetchPerUrlTimeout(value) {
|
|
192
165
|
if (typeof value !== "number" || !Number.isFinite(value))
|
|
193
166
|
return MAX_FETCH_PER_URL_TIMEOUT_MS;
|
|
@@ -253,7 +226,7 @@ async function fetchInlineContent(urls, apiKey, signal) {
|
|
|
253
226
|
}
|
|
254
227
|
export async function searchWithTinyFish(query, options = {}) {
|
|
255
228
|
const apiKey = await getApiKey(options.signal);
|
|
256
|
-
const numResults =
|
|
229
|
+
const numResults = normalizeSearchResultCount(options.numResults);
|
|
257
230
|
const activityId = activityMonitor.logStart({ type: "api", query });
|
|
258
231
|
try {
|
|
259
232
|
const combined = [];
|
|
@@ -267,7 +240,7 @@ export async function searchWithTinyFish(query, options = {}) {
|
|
|
267
240
|
break;
|
|
268
241
|
}
|
|
269
242
|
const results = deduplicateResults(combined, numResults);
|
|
270
|
-
const response = { answer:
|
|
243
|
+
const response = { answer: formatSearchResultsAsAnswer(results), results };
|
|
271
244
|
if (options.includeContent && results.length > 0) {
|
|
272
245
|
const inlineContent = await fetchInlineContent(results.map(result => result.url), apiKey, options.signal);
|
|
273
246
|
if (inlineContent.length > 0)
|