@tiangong-lca/cli 0.0.32 → 0.1.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/LICENSE +21 -0
- package/README.md +33 -12
- package/assets/import-smoke/simapro.csv +20 -0
- package/bin/tiangong-lca.js +1 -1
- package/dist/src/cli.js +103 -65
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-bilingual.js.map +1 -1
- package/dist/src/lib/dataset-classification.js.map +1 -1
- package/dist/src/lib/dataset-contract.js.map +1 -1
- package/dist/src/lib/dataset-evidence-search.js.map +1 -1
- package/dist/src/lib/dataset-import-lca.js +302 -131
- package/dist/src/lib/dataset-import-lca.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-apply.js +916 -43
- package/dist/src/lib/dataset-maintenance-apply.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-clear-account.js +10 -4
- package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-contract.js +1 -6
- package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-derivatives.js +0 -1
- package/dist/src/lib/dataset-maintenance-derivatives.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-flow-identity-capture.js +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-capture.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-pagination.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-before.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-contract.js +0 -1
- package/dist/src/lib/dataset-maintenance-protected-contract.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-freeze.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-preparation.js +0 -2
- package/dist/src/lib/dataset-maintenance-protected-preparation.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-seal.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-verify.js +0 -3
- package/dist/src/lib/dataset-maintenance-protected-verify.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-remote.js +68 -12
- package/dist/src/lib/dataset-maintenance-remote.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-verify.js +1 -2
- package/dist/src/lib/dataset-maintenance-verify.js.map +1 -1
- package/dist/src/lib/dataset-remote-refresh.js.map +1 -1
- package/dist/src/lib/dataset-remote-verify.js +2 -0
- package/dist/src/lib/dataset-remote-verify.js.map +1 -1
- package/dist/src/lib/dataset-save-draft-run.js +2 -0
- package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
- package/dist/src/lib/flow-build-alias-map.js.map +1 -1
- package/dist/src/lib/flow-fetch-rows.js.map +1 -1
- package/dist/src/lib/flow-get.js.map +1 -1
- package/dist/src/lib/flow-governance.js.map +1 -1
- package/dist/src/lib/flow-list.js +1 -0
- package/dist/src/lib/flow-list.js.map +1 -1
- package/dist/src/lib/flow-payload-validation.js.map +1 -1
- package/dist/src/lib/flow-publish-version.js +1 -0
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/flow-read.js +1 -0
- package/dist/src/lib/flow-read.js.map +1 -1
- package/dist/src/lib/flow-regen-product.js.map +1 -1
- package/dist/src/lib/flow-remediate.js.map +1 -1
- package/dist/src/lib/identity-preflight.js +4 -10
- package/dist/src/lib/identity-preflight.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-bundle-save.js +1 -0
- package/dist/src/lib/lifecyclemodel-bundle-save.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-orchestrate.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-publish-resulting-process.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-save-draft-run.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -1
- package/dist/src/lib/package-version.js.map +1 -1
- package/dist/src/lib/process-auto-build.js.map +1 -1
- package/dist/src/lib/process-dedup-review.js +14 -7
- package/dist/src/lib/process-dedup-review.js.map +1 -1
- package/dist/src/lib/process-flow-build-plan.js +111 -30
- package/dist/src/lib/process-flow-build-plan.js.map +1 -1
- package/dist/src/lib/process-get.js +1 -0
- package/dist/src/lib/process-get.js.map +1 -1
- package/dist/src/lib/process-list.js +1 -0
- package/dist/src/lib/process-list.js.map +1 -1
- package/dist/src/lib/process-payload-validation.js.map +1 -1
- package/dist/src/lib/process-qa.js.map +1 -1
- package/dist/src/lib/process-refresh-references.js +15 -10
- package/dist/src/lib/process-refresh-references.js.map +1 -1
- package/dist/src/lib/process-save-draft.js +9 -3
- package/dist/src/lib/process-save-draft.js.map +1 -1
- package/dist/src/lib/process-scope-statistics.js +11 -4
- package/dist/src/lib/process-scope-statistics.js.map +1 -1
- package/dist/src/lib/process-verify-rows.js.map +1 -1
- package/dist/src/lib/publish.js.map +1 -1
- package/dist/src/lib/run.js.map +1 -1
- package/dist/src/lib/supabase-client.js +13 -1
- package/dist/src/lib/supabase-client.js.map +1 -1
- package/dist/src/lib/supabase-data-api-contract.js +328 -0
- package/dist/src/lib/supabase-data-api-contract.js.map +1 -0
- package/dist/src/lib/supabase-data-api-replay.js +69 -0
- package/dist/src/lib/supabase-data-api-replay.js.map +1 -0
- package/dist/src/lib/supabase-json-ordered-write.js +2 -0
- package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
- package/dist/src/lib/supabase-rest.js +1 -0
- package/dist/src/lib/supabase-rest.js.map +1 -1
- package/dist/src/lib/tidas-sdk-package-validator.js +5 -5
- package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
- package/dist/src/lib/validation.js.map +1 -1
- package/dist/src/main.js.map +1 -1
- package/package.json +40 -40
- package/dist/scripts/assert-full-coverage.js +0 -77
- package/dist/scripts/assert-full-coverage.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-evidence-search.js","sourceRoot":"","sources":["../../../src/lib/dataset-evidence-search.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { postJson } from './http.js';\nimport { readJsonInput } from './io.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type EvidenceSearchMode = 'plan' | 'run';\nexport type EvidenceSearchProfile = 'shallow' | 'balanced' | 'deep';\nexport type EvidenceSearchStatus =\n | 'planned'\n | 'completed_with_evidence'\n | 'completed_with_partial_evidence'\n | 'completed_no_sufficient_evidence';\n\nexport type EvidenceSearchBudget = {\n max_queries: number;\n max_results_per_query: number;\n max_provider_calls: number;\n};\n\nexport type EvidenceSearchQuery = {\n query_id: string;\n text: string;\n purpose: string;\n source_tier: string;\n priority: number;\n expected_terms: string[];\n};\n\nexport type EvidenceSearchResult = {\n query_id: string | null;\n query: string | null;\n provider: string;\n rank: number;\n title: string;\n url: string;\n snippet: string | null;\n published_at: string | null;\n source_domain: string | null;\n source_tier: string;\n matched_terms: string[];\n score: number;\n};\n\nexport type EvidenceSearchDeclaration = {\n schema_version: 1;\n generated_at_utc: string;\n question: string;\n declaration_type: 'no_sufficient_evidence' | 'partial_temporal_evidence';\n statement: string;\n search_scope: {\n query_count: number;\n provider_count: number;\n normalized_result_count: number;\n authoritative_result_count: number;\n required_complete_year: boolean;\n requested_year: number | null;\n temporal_coverage_status: string;\n };\n limits: string[];\n};\n\nexport type EvidenceSearchReport = {\n schema_version: 1;\n generated_at_utc: string;\n mode: EvidenceSearchMode;\n status: EvidenceSearchStatus;\n question: string;\n field: {\n dataset_type: string | null;\n field_path: string | null;\n };\n profile: EvidenceSearchProfile;\n budget: EvidenceSearchBudget;\n plan: {\n query_count: number;\n queries: EvidenceSearchQuery[];\n };\n run: {\n provider_count: number;\n provider_call_count: number;\n normalized_result_count: number;\n authoritative_result_count: number;\n high_confidence_result_count: number;\n stop_reason: string;\n };\n evidence_quality: {\n sufficient: boolean;\n temporal_coverage_status: string;\n requested_year: number | null;\n required_complete_year: boolean;\n };\n files: {\n plan: string | null;\n results: string | null;\n report: string | null;\n declaration: string | null;\n };\n};\n\nexport type RunDatasetEvidenceSearchOptions = {\n mode: EvidenceSearchMode;\n query?: string | null;\n inputPath?: string | null;\n resultsPath?: string | null;\n providerUrl?: string | null;\n providerKey?: string | null;\n profile?: string | null;\n outDir?: string | null;\n maxQueries?: number | null;\n maxResultsPerQuery?: number | null;\n timeoutMs?: number | null;\n rawInput?: unknown;\n rawResults?: unknown;\n now?: Date;\n fetchImpl?: FetchLike;\n};\n\ntype EvidenceSearchRequest = {\n question: string;\n field: {\n dataset_type: string | null;\n field_path: string | null;\n };\n profile: EvidenceSearchProfile;\n budget: EvidenceSearchBudget;\n preferred_domains: string[];\n required_terms: string[];\n required_complete_year: boolean;\n requested_year: number | null;\n};\n\ntype ProviderQueryResult = {\n provider: string;\n query_id: string | null;\n query: string | null;\n items: unknown[];\n};\n\nconst DEFAULT_BUDGETS: Record<EvidenceSearchProfile, EvidenceSearchBudget> = {\n shallow: {\n max_queries: 4,\n max_results_per_query: 5,\n max_provider_calls: 4,\n },\n balanced: {\n max_queries: 8,\n max_results_per_query: 8,\n max_provider_calls: 8,\n },\n deep: {\n max_queries: 14,\n max_results_per_query: 10,\n max_provider_calls: 14,\n },\n};\n\nconst PUBLIC_OFFICIAL_DOMAINS = [\n 'gov.cn',\n 'stats.gov.cn',\n 'nea.gov.cn',\n 'ndrc.gov.cn',\n 'samr.gov.cn',\n];\n\nconst ELECTRICITY_TERMS = [\n '中国',\n '全国',\n '2026',\n '电力',\n '电源',\n '结构',\n '数据',\n '发电',\n '发电量',\n '装机',\n '火电',\n '水电',\n '核电',\n '风电',\n '太阳能',\n '非化石',\n 'coal',\n 'hydro',\n 'nuclear',\n 'wind',\n 'solar',\n 'generation',\n 'electricity',\n 'mix',\n];\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeProfile(value: string | null | undefined): EvidenceSearchProfile {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return 'balanced';\n }\n if (normalized === 'shallow' || normalized === 'balanced' || normalized === 'deep') {\n return normalized;\n }\n throw new CliError(\"--profile must be 'shallow', 'balanced', or 'deep'.\", {\n code: 'EVIDENCE_SEARCH_PROFILE_INVALID',\n exitCode: 2,\n details: value,\n });\n}\n\nfunction readPositiveInteger(value: unknown, fallback: number, label: string): number {\n if (value === undefined || value === null || value === '') {\n return fallback;\n }\n const numberValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isInteger(numberValue) || numberValue < 1) {\n throw new CliError(`${label} must be a positive integer.`, {\n code: 'EVIDENCE_SEARCH_BUDGET_INVALID',\n exitCode: 2,\n details: value,\n });\n }\n return numberValue;\n}\n\nfunction readStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.map((item) => trimToken(item)).filter((item): item is string => item !== null);\n}\n\nfunction readBoolean(value: unknown): boolean {\n return value === true;\n}\n\nfunction readRequestedYear(question: string, request: JsonObject): number | null {\n const rawTemporal = isRecord(request.required_evidence)\n ? trimToken(request.required_evidence.temporal_scope)\n : null;\n const source = rawTemporal ? `${question} ${rawTemporal}` : question;\n const match = /(?:19|20)\\d{2}/u.exec(source);\n return match ? Number(match[0]) : null;\n}\n\nfunction requestRequiresCompleteYear(request: JsonObject): boolean {\n if (!isRecord(request.required_evidence)) {\n return false;\n }\n return (\n readBoolean(request.required_evidence.require_complete_year) ||\n trimToken(request.required_evidence.temporal_coverage)?.toLowerCase() === 'annual_complete'\n );\n}\n\nfunction normalizeDomain(url: string): string | null {\n try {\n return new URL(url).hostname.toLowerCase().replace(/^www\\./u, '');\n } catch {\n return null;\n }\n}\n\nfunction domainMatches(domain: string | null, candidate: string): boolean {\n if (!domain) {\n return false;\n }\n const normalized = candidate.toLowerCase().replace(/^www\\./u, '');\n return domain === normalized || domain.endsWith(`.${normalized}`);\n}\n\nfunction classifySourceTier(domain: string | null, preferredDomains: string[]): string {\n if (preferredDomains.some((preferred) => domainMatches(domain, preferred))) {\n return 'preferred_domain';\n }\n if (PUBLIC_OFFICIAL_DOMAINS.some((official) => domainMatches(domain, official))) {\n return 'official_statistics';\n }\n if (domainMatches(domain, 'cec.org.cn') || domainMatches(domain, 'chinapower.org.cn')) {\n return 'industry_association';\n }\n if (domainMatches(domain, 'iea.org') || domainMatches(domain, 'ember-energy.org')) {\n return 'international_statistics';\n }\n return 'open_web';\n}\n\nfunction extractTerms(question: string, configuredTerms: string[]): string[] {\n const terms = new Set<string>();\n for (const term of configuredTerms) {\n terms.add(term.toLowerCase());\n }\n for (const term of ELECTRICITY_TERMS) {\n if (question.toLowerCase().includes(term.toLowerCase())) {\n terms.add(term.toLowerCase());\n }\n }\n const latinTerms = question.match(/[a-z0-9][a-z0-9-]{2,}/giu) ?? [];\n for (const term of latinTerms) {\n terms.add(term.toLowerCase());\n }\n return [...terms];\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const normalized = value.replace(/\\s+/gu, ' ').trim();\n const key = normalized.toLowerCase();\n if (normalized && !seen.has(key)) {\n seen.add(key);\n result.push(normalized);\n }\n }\n return result;\n}\n\nfunction buildQueryTexts(request: EvidenceSearchRequest): string[] {\n const yearText = request.requested_year ? String(request.requested_year) : '';\n const preferredQueries = request.preferred_domains.map(\n (domain) => `site:${domain} ${request.question}`,\n );\n const generated = [\n request.question,\n `site:stats.gov.cn ${request.question}`,\n `site:nea.gov.cn ${request.question}`,\n yearText\n ? `国家统计局 ${yearText} 发电量 火电 水电 核电 风电 太阳能`\n : '国家统计局 发电量 火电 水电 核电 风电 太阳能',\n yearText\n ? `国家能源局 ${yearText} 全国电力统计数据 发电装机容量 火电 水电 风电 太阳能`\n : '国家能源局 全国电力统计数据 发电装机容量 火电 水电 风电 太阳能',\n yearText\n ? `中电联 ${yearText} 电力供需形势 非化石能源 发电量 占比`\n : '中电联 电力供需形势 非化石能源 发电量 占比',\n yearText\n ? `China ${yearText} electricity generation mix coal hydro nuclear wind solar`\n : 'China electricity generation mix coal hydro nuclear wind solar',\n yearText\n ? `China ${yearText} installed power capacity mix thermal hydro nuclear wind solar`\n : 'China installed power capacity mix thermal hydro nuclear wind solar',\n ...preferredQueries,\n ];\n return dedupeStrings(generated).slice(0, request.budget.max_queries);\n}\n\nfunction buildSearchPlan(request: EvidenceSearchRequest): EvidenceSearchQuery[] {\n const expectedTerms = extractTerms(request.question, request.required_terms);\n return buildQueryTexts(request).map((text, index) => ({\n query_id: `q${String(index + 1).padStart(2, '0')}`,\n text,\n purpose: index === 0 ? 'broad_discovery' : 'source_targeted_discovery',\n source_tier: text.startsWith('site:') ? 'targeted' : 'general',\n priority: index + 1,\n expected_terms: expectedTerms,\n }));\n}\n\nfunction normalizeRequest(options: RunDatasetEvidenceSearchOptions): EvidenceSearchRequest {\n const rawInput = options.rawInput ?? (options.inputPath ? readJsonInput(options.inputPath) : {});\n const input = isRecord(rawInput) ? rawInput : {};\n const question = trimToken(options.query) ?? trimToken(input.question);\n if (!question) {\n throw new CliError('Evidence search requires --query or input.question.', {\n code: 'EVIDENCE_SEARCH_QUESTION_REQUIRED',\n exitCode: 2,\n });\n }\n\n const profile = normalizeProfile(options.profile ?? trimToken(input.profile));\n const defaultBudget = DEFAULT_BUDGETS[profile];\n const budgetInput = isRecord(input.budget) ? input.budget : {};\n const maxQueries = readPositiveInteger(\n options.maxQueries ?? budgetInput.max_queries,\n defaultBudget.max_queries,\n '--max-queries',\n );\n const maxResultsPerQuery = readPositiveInteger(\n options.maxResultsPerQuery ?? budgetInput.max_results_per_query,\n defaultBudget.max_results_per_query,\n '--max-results-per-query',\n );\n const budget = {\n max_queries: maxQueries,\n max_results_per_query: maxResultsPerQuery,\n max_provider_calls: maxQueries,\n };\n const fieldInput = isRecord(input.field) ? input.field : {};\n\n return {\n question,\n field: {\n dataset_type: trimToken(fieldInput.dataset_type),\n field_path: trimToken(fieldInput.field_path),\n },\n profile,\n budget,\n preferred_domains: readStringArray(input.preferred_domains),\n required_terms: readStringArray(input.required_terms),\n required_complete_year: requestRequiresCompleteYear(input),\n requested_year: readRequestedYear(question, input),\n };\n}\n\nfunction readResultsInput(resultsPath: string, rawResults?: unknown): unknown {\n if (rawResults !== undefined) {\n return rawResults;\n }\n const text = readFileSync(resultsPath, 'utf8');\n const trimmed = text.trim();\n if (!trimmed) {\n return [];\n }\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n return JSON.parse(trimmed);\n } catch (error) {\n throw new CliError(`Search results file is not valid JSON: ${resultsPath}`, {\n code: 'EVIDENCE_SEARCH_RESULTS_INVALID_JSON',\n exitCode: 2,\n details: String(error),\n });\n }\n }\n return trimmed\n .split(/\\r?\\n/u)\n .map((line, index) => {\n try {\n return JSON.parse(line);\n } catch (error) {\n throw new CliError(`Search results file has invalid JSONL at line ${index + 1}.`, {\n code: 'EVIDENCE_SEARCH_RESULTS_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n })\n .filter((item) => item !== null);\n}\n\nfunction extractItems(value: JsonObject): unknown[] {\n for (const key of ['items', 'results', 'data', 'web_results']) {\n const candidate = value[key];\n if (Array.isArray(candidate)) {\n return candidate;\n }\n }\n return [];\n}\n\nfunction normalizeResultGroups(rawResults: unknown): ProviderQueryResult[] {\n const root = rawResults;\n if (isRecord(root) && Array.isArray(root.queries)) {\n return root.queries.filter(isRecord).map((queryGroup) => ({\n provider: trimToken(queryGroup.provider) ?? 'external',\n query_id: trimToken(queryGroup.query_id),\n query: trimToken(queryGroup.query ?? queryGroup.text),\n items: extractItems(queryGroup),\n }));\n }\n const rows = Array.isArray(root) ? root : [root];\n if (rows.every(isRecord) && rows.some((row) => extractItems(row).length > 0)) {\n return rows.filter(isRecord).map((queryGroup) => ({\n provider: trimToken(queryGroup.provider) ?? 'external',\n query_id: trimToken(queryGroup.query_id),\n query: trimToken(queryGroup.query ?? queryGroup.text),\n items: extractItems(queryGroup),\n }));\n }\n return [\n {\n provider: 'external',\n query_id: null,\n query: null,\n items: rows,\n },\n ];\n}\n\nfunction normalizeOneResult(options: {\n item: unknown;\n group: ProviderQueryResult;\n rank: number;\n terms: string[];\n preferredDomains: string[];\n}): EvidenceSearchResult | null {\n if (!isRecord(options.item)) {\n return null;\n }\n const title = trimToken(options.item.title ?? options.item.name);\n const url = trimToken(options.item.url ?? options.item.link ?? options.item.href);\n if (!title || !url) {\n return null;\n }\n const snippet = trimToken(\n options.item.snippet ?? options.item.description ?? options.item.summary ?? options.item.text,\n );\n const publishedAt = trimToken(\n options.item.published_at ?? options.item.publishedAt ?? options.item.date,\n );\n const sourceText = `${title} ${snippet ?? ''}`.toLowerCase();\n const matchedTerms = options.terms.filter((term) => sourceText.includes(term));\n const domain = normalizeDomain(url);\n const sourceTier = classifySourceTier(domain, options.preferredDomains);\n const authorityScore =\n sourceTier === 'official_statistics'\n ? 4\n : sourceTier === 'preferred_domain' || sourceTier === 'industry_association'\n ? 3\n : sourceTier === 'international_statistics'\n ? 2\n : 1;\n const termScore = Math.min(matchedTerms.length, 6);\n return {\n query_id: options.group.query_id,\n query: options.group.query,\n provider: options.group.provider,\n rank: options.rank,\n title,\n url,\n snippet,\n published_at: publishedAt,\n source_domain: domain,\n source_tier: sourceTier,\n matched_terms: matchedTerms,\n score: authorityScore + termScore,\n };\n}\n\nfunction normalizeResults(options: {\n rawResults: unknown;\n terms: string[];\n preferredDomains: string[];\n maxResultsPerQuery: number;\n}): EvidenceSearchResult[] {\n const byUrl = new Map<string, EvidenceSearchResult>();\n for (const group of normalizeResultGroups(options.rawResults)) {\n group.items.slice(0, options.maxResultsPerQuery).forEach((item, index) => {\n const result = normalizeOneResult({\n item,\n group,\n rank: index + 1,\n terms: options.terms,\n preferredDomains: options.preferredDomains,\n });\n if (!result) {\n return;\n }\n const previous = byUrl.get(result.url);\n if (!previous || result.score > previous.score) {\n byUrl.set(result.url, result);\n }\n });\n }\n return [...byUrl.values()].sort(\n (left, right) => right.score - left.score || left.rank - right.rank,\n );\n}\n\nasync function fetchProviderResults(options: {\n providerUrl: string;\n providerKey: string | null;\n plan: EvidenceSearchQuery[];\n request: EvidenceSearchRequest;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<{ rawResults: ProviderQueryResult[]; callCount: number }> {\n const rawResults: ProviderQueryResult[] = [];\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (options.providerKey) {\n headers.Authorization = `Bearer ${options.providerKey}`;\n }\n for (const query of options.plan.slice(0, options.request.budget.max_provider_calls)) {\n const payload = await postJson({\n url: options.providerUrl,\n headers,\n body: {\n query: query.text,\n query_id: query.query_id,\n limit: options.request.budget.max_results_per_query,\n context: {\n question: options.request.question,\n field: options.request.field,\n expected_terms: query.expected_terms,\n },\n },\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n rawResults.push({\n provider: options.providerUrl,\n query_id: query.query_id,\n query: query.text,\n items: isRecord(payload) ? extractItems(payload) : Array.isArray(payload) ? payload : [],\n });\n }\n return { rawResults, callCount: rawResults.length };\n}\n\nfunction temporalCoverageStatus(request: EvidenceSearchRequest, now: Date): string {\n if (!request.required_complete_year || !request.requested_year) {\n return 'not_required';\n }\n const currentYear = now.getUTCFullYear();\n if (request.requested_year > currentYear) {\n return 'future_year';\n }\n if (request.requested_year === currentYear && now.getUTCMonth() < 11) {\n return 'incomplete_current_year';\n }\n return 'complete_year_possible';\n}\n\nfunction buildDeclaration(options: {\n generatedAt: string;\n request: EvidenceSearchRequest;\n queryCount: number;\n providerCount: number;\n resultCount: number;\n authoritativeResultCount: number;\n temporalStatus: string;\n partial: boolean;\n}): EvidenceSearchDeclaration {\n const declarationType = options.partial ? 'partial_temporal_evidence' : 'no_sufficient_evidence';\n const statement =\n declarationType === 'partial_temporal_evidence'\n ? 'The configured search found current-year or forecast evidence, but not complete annual evidence for the requested year.'\n : 'Within the configured search scope, query matrix, source policy, and budget, no sufficient evidence was found for the requested field.';\n return {\n schema_version: 1,\n generated_at_utc: options.generatedAt,\n question: options.request.question,\n declaration_type: declarationType,\n statement,\n search_scope: {\n query_count: options.queryCount,\n provider_count: options.providerCount,\n normalized_result_count: options.resultCount,\n authoritative_result_count: options.authoritativeResultCount,\n required_complete_year: options.request.required_complete_year,\n requested_year: options.request.requested_year,\n temporal_coverage_status: options.temporalStatus,\n },\n limits: [\n 'The command records deterministic search scope and result normalization; it does not prove that the open web contains no undiscoverable source.',\n 'Browser-only, paywalled, login-protected, or unindexed sources require separate readback or manual evidence capture.',\n 'A no-evidence or partial-evidence declaration is valid only for the configured query matrix, provider set, and budget.',\n ],\n };\n}\n\nfunction buildReport(options: {\n generatedAt: string;\n mode: EvidenceSearchMode;\n request: EvidenceSearchRequest;\n plan: EvidenceSearchQuery[];\n results: EvidenceSearchResult[];\n providerCount: number;\n providerCallCount: number;\n files: EvidenceSearchReport['files'];\n now: Date;\n}): EvidenceSearchReport {\n const authoritativeResultCount = options.results.filter((result) =>\n ['official_statistics', 'preferred_domain', 'industry_association'].includes(\n result.source_tier,\n ),\n ).length;\n const highConfidenceResultCount = options.results.filter((result) => result.score >= 7).length;\n const temporalStatus = temporalCoverageStatus(options.request, options.now);\n const hasEvidence = authoritativeResultCount > 0 || highConfidenceResultCount > 0;\n const partial =\n hasEvidence && ['future_year', 'incomplete_current_year'].includes(temporalStatus);\n const sufficient = hasEvidence && !partial;\n const status: EvidenceSearchStatus =\n options.mode === 'plan'\n ? 'planned'\n : sufficient\n ? 'completed_with_evidence'\n : partial\n ? 'completed_with_partial_evidence'\n : 'completed_no_sufficient_evidence';\n const stopReason =\n options.mode === 'plan'\n ? 'plan_only'\n : sufficient\n ? 'sufficient_authoritative_evidence_found'\n : partial\n ? 'complete_annual_scope_not_available'\n : 'budget_exhausted_without_sufficient_evidence';\n\n return {\n schema_version: 1,\n generated_at_utc: options.generatedAt,\n mode: options.mode,\n status,\n question: options.request.question,\n field: options.request.field,\n profile: options.request.profile,\n budget: options.request.budget,\n plan: {\n query_count: options.plan.length,\n queries: options.plan,\n },\n run: {\n provider_count: options.providerCount,\n provider_call_count: options.providerCallCount,\n normalized_result_count: options.results.length,\n authoritative_result_count: authoritativeResultCount,\n high_confidence_result_count: highConfidenceResultCount,\n stop_reason: stopReason,\n },\n evidence_quality: {\n sufficient,\n temporal_coverage_status: temporalStatus,\n requested_year: options.request.requested_year,\n required_complete_year: options.request.required_complete_year,\n },\n files: options.files,\n };\n}\n\nexport async function runDatasetEvidenceSearch(\n options: RunDatasetEvidenceSearchOptions,\n): Promise<EvidenceSearchReport> {\n const request = normalizeRequest(options);\n const plan = buildSearchPlan(request);\n const generatedAt = nowIso(options.now);\n const now = options.now ?? new Date();\n const outputDir = options.outDir ? path.resolve(options.outDir) : null;\n const planFile = outputDir ? path.join(outputDir, 'outputs', 'evidence-search-plan.json') : null;\n const resultsFile = outputDir\n ? path.join(outputDir, 'outputs', 'evidence-search-results.jsonl')\n : null;\n const reportFile = outputDir\n ? path.join(outputDir, 'outputs', 'evidence-search-report.json')\n : null;\n const declarationFile = outputDir\n ? path.join(outputDir, 'outputs', 'evidence-search-declaration.json')\n : null;\n\n if (planFile) {\n writeJsonArtifact(planFile, {\n schema_version: 1,\n generated_at_utc: generatedAt,\n question: request.question,\n field: request.field,\n profile: request.profile,\n budget: request.budget,\n queries: plan,\n });\n }\n\n let rawResults: unknown = [];\n let providerCount = 0;\n let providerCallCount = 0;\n\n if (options.mode === 'run') {\n if (options.resultsPath) {\n rawResults = readResultsInput(options.resultsPath, options.rawResults);\n providerCount += 1;\n }\n if (options.providerUrl) {\n if (!options.fetchImpl) {\n throw new CliError('Evidence search provider mode requires fetchImpl.', {\n code: 'EVIDENCE_SEARCH_FETCH_IMPL_REQUIRED',\n exitCode: 2,\n });\n }\n const providerResults = await fetchProviderResults({\n providerUrl: options.providerUrl,\n providerKey: options.providerKey ?? null,\n plan,\n request,\n timeoutMs: options.timeoutMs ?? 30_000,\n fetchImpl: options.fetchImpl,\n });\n rawResults = [...normalizeResultGroups(rawResults), ...providerResults.rawResults];\n providerCount += 1;\n providerCallCount += providerResults.callCount;\n }\n if (!options.resultsPath && !options.providerUrl) {\n throw new CliError('dataset evidence-search run requires --results or --provider-url.', {\n code: 'EVIDENCE_SEARCH_PROVIDER_REQUIRED',\n exitCode: 2,\n });\n }\n }\n\n const terms = extractTerms(request.question, request.required_terms);\n const results =\n options.mode === 'run'\n ? normalizeResults({\n rawResults,\n terms,\n preferredDomains: request.preferred_domains,\n maxResultsPerQuery: request.budget.max_results_per_query,\n })\n : [];\n if (resultsFile) {\n writeJsonLinesArtifact(resultsFile, results);\n }\n\n const preliminaryReport = buildReport({\n generatedAt,\n mode: options.mode,\n request,\n plan,\n results,\n providerCount,\n providerCallCount,\n files: {\n plan: planFile,\n results: resultsFile,\n report: reportFile,\n declaration: null,\n },\n now,\n });\n\n let finalDeclarationFile: string | null = null;\n if (\n outputDir &&\n options.mode === 'run' &&\n preliminaryReport.status !== 'completed_with_evidence'\n ) {\n const declaration = buildDeclaration({\n generatedAt,\n request,\n queryCount: plan.length,\n providerCount,\n resultCount: results.length,\n authoritativeResultCount: preliminaryReport.run.authoritative_result_count,\n temporalStatus: preliminaryReport.evidence_quality.temporal_coverage_status,\n partial: preliminaryReport.status === 'completed_with_partial_evidence',\n });\n finalDeclarationFile = writeJsonArtifact(declarationFile!, declaration);\n }\n\n const report = {\n ...preliminaryReport,\n files: {\n ...preliminaryReport.files,\n declaration: finalDeclarationFile,\n },\n };\n if (reportFile) {\n writeJsonArtifact(reportFile, report);\n }\n return report;\n}\n\nexport const __testInternals = {\n buildSearchPlan,\n classifySourceTier,\n normalizeResults,\n normalizeRequest,\n temporalCoverageStatus,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"dataset-evidence-search.js","sourceRoot":"","sources":["../../../src/lib/dataset-evidence-search.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { postJson } from './http.js';\nimport { readJsonInput } from './io.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type EvidenceSearchMode = 'plan' | 'run';\nexport type EvidenceSearchProfile = 'shallow' | 'balanced' | 'deep';\nexport type EvidenceSearchStatus =\n | 'planned'\n | 'completed_with_evidence'\n | 'completed_with_partial_evidence'\n | 'completed_no_sufficient_evidence';\n\nexport type EvidenceSearchBudget = {\n max_queries: number;\n max_results_per_query: number;\n max_provider_calls: number;\n};\n\nexport type EvidenceSearchQuery = {\n query_id: string;\n text: string;\n purpose: string;\n source_tier: string;\n priority: number;\n expected_terms: string[];\n};\n\nexport type EvidenceSearchResult = {\n query_id: string | null;\n query: string | null;\n provider: string;\n rank: number;\n title: string;\n url: string;\n snippet: string | null;\n published_at: string | null;\n source_domain: string | null;\n source_tier: string;\n matched_terms: string[];\n score: number;\n};\n\nexport type EvidenceSearchDeclaration = {\n schema_version: 1;\n generated_at_utc: string;\n question: string;\n declaration_type: 'no_sufficient_evidence' | 'partial_temporal_evidence';\n statement: string;\n search_scope: {\n query_count: number;\n provider_count: number;\n normalized_result_count: number;\n authoritative_result_count: number;\n required_complete_year: boolean;\n requested_year: number | null;\n temporal_coverage_status: string;\n };\n limits: string[];\n};\n\nexport type EvidenceSearchReport = {\n schema_version: 1;\n generated_at_utc: string;\n mode: EvidenceSearchMode;\n status: EvidenceSearchStatus;\n question: string;\n field: {\n dataset_type: string | null;\n field_path: string | null;\n };\n profile: EvidenceSearchProfile;\n budget: EvidenceSearchBudget;\n plan: {\n query_count: number;\n queries: EvidenceSearchQuery[];\n };\n run: {\n provider_count: number;\n provider_call_count: number;\n normalized_result_count: number;\n authoritative_result_count: number;\n high_confidence_result_count: number;\n stop_reason: string;\n };\n evidence_quality: {\n sufficient: boolean;\n temporal_coverage_status: string;\n requested_year: number | null;\n required_complete_year: boolean;\n };\n files: {\n plan: string | null;\n results: string | null;\n report: string | null;\n declaration: string | null;\n };\n};\n\nexport type RunDatasetEvidenceSearchOptions = {\n mode: EvidenceSearchMode;\n query?: string | null;\n inputPath?: string | null;\n resultsPath?: string | null;\n providerUrl?: string | null;\n providerKey?: string | null;\n profile?: string | null;\n outDir?: string | null;\n maxQueries?: number | null;\n maxResultsPerQuery?: number | null;\n timeoutMs?: number | null;\n rawInput?: unknown;\n rawResults?: unknown;\n now?: Date;\n fetchImpl?: FetchLike;\n};\n\ntype EvidenceSearchRequest = {\n question: string;\n field: {\n dataset_type: string | null;\n field_path: string | null;\n };\n profile: EvidenceSearchProfile;\n budget: EvidenceSearchBudget;\n preferred_domains: string[];\n required_terms: string[];\n required_complete_year: boolean;\n requested_year: number | null;\n};\n\ntype ProviderQueryResult = {\n provider: string;\n query_id: string | null;\n query: string | null;\n items: unknown[];\n};\n\nconst DEFAULT_BUDGETS: Record<EvidenceSearchProfile, EvidenceSearchBudget> = {\n shallow: {\n max_queries: 4,\n max_results_per_query: 5,\n max_provider_calls: 4,\n },\n balanced: {\n max_queries: 8,\n max_results_per_query: 8,\n max_provider_calls: 8,\n },\n deep: {\n max_queries: 14,\n max_results_per_query: 10,\n max_provider_calls: 14,\n },\n};\n\nconst PUBLIC_OFFICIAL_DOMAINS = [\n 'gov.cn',\n 'stats.gov.cn',\n 'nea.gov.cn',\n 'ndrc.gov.cn',\n 'samr.gov.cn',\n];\n\nconst ELECTRICITY_TERMS = [\n '中国',\n '全国',\n '2026',\n '电力',\n '电源',\n '结构',\n '数据',\n '发电',\n '发电量',\n '装机',\n '火电',\n '水电',\n '核电',\n '风电',\n '太阳能',\n '非化石',\n 'coal',\n 'hydro',\n 'nuclear',\n 'wind',\n 'solar',\n 'generation',\n 'electricity',\n 'mix',\n];\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeProfile(value: string | null | undefined): EvidenceSearchProfile {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return 'balanced';\n }\n if (normalized === 'shallow' || normalized === 'balanced' || normalized === 'deep') {\n return normalized;\n }\n throw new CliError(\"--profile must be 'shallow', 'balanced', or 'deep'.\", {\n code: 'EVIDENCE_SEARCH_PROFILE_INVALID',\n exitCode: 2,\n details: value,\n });\n}\n\nfunction readPositiveInteger(value: unknown, fallback: number, label: string): number {\n if (value === undefined || value === null || value === '') {\n return fallback;\n }\n const numberValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isInteger(numberValue) || numberValue < 1) {\n throw new CliError(`${label} must be a positive integer.`, {\n code: 'EVIDENCE_SEARCH_BUDGET_INVALID',\n exitCode: 2,\n details: value,\n });\n }\n return numberValue;\n}\n\nfunction readStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.map((item) => trimToken(item)).filter((item): item is string => item !== null);\n}\n\nfunction readBoolean(value: unknown): boolean {\n return value === true;\n}\n\nfunction readRequestedYear(question: string, request: JsonObject): number | null {\n const rawTemporal = isRecord(request.required_evidence)\n ? trimToken(request.required_evidence.temporal_scope)\n : null;\n const source = rawTemporal ? `${question} ${rawTemporal}` : question;\n const match = /(?:19|20)\\d{2}/u.exec(source);\n return match ? Number(match[0]) : null;\n}\n\nfunction requestRequiresCompleteYear(request: JsonObject): boolean {\n if (!isRecord(request.required_evidence)) {\n return false;\n }\n return (\n readBoolean(request.required_evidence.require_complete_year) ||\n trimToken(request.required_evidence.temporal_coverage)?.toLowerCase() === 'annual_complete'\n );\n}\n\nfunction normalizeDomain(url: string): string | null {\n try {\n return new URL(url).hostname.toLowerCase().replace(/^www\\./u, '');\n } catch {\n return null;\n }\n}\n\nfunction domainMatches(domain: string | null, candidate: string): boolean {\n if (!domain) {\n return false;\n }\n const normalized = candidate.toLowerCase().replace(/^www\\./u, '');\n return domain === normalized || domain.endsWith(`.${normalized}`);\n}\n\nfunction classifySourceTier(domain: string | null, preferredDomains: string[]): string {\n if (preferredDomains.some((preferred) => domainMatches(domain, preferred))) {\n return 'preferred_domain';\n }\n if (PUBLIC_OFFICIAL_DOMAINS.some((official) => domainMatches(domain, official))) {\n return 'official_statistics';\n }\n if (domainMatches(domain, 'cec.org.cn') || domainMatches(domain, 'chinapower.org.cn')) {\n return 'industry_association';\n }\n if (domainMatches(domain, 'iea.org') || domainMatches(domain, 'ember-energy.org')) {\n return 'international_statistics';\n }\n return 'open_web';\n}\n\nfunction extractTerms(question: string, configuredTerms: string[]): string[] {\n const terms = new Set<string>();\n for (const term of configuredTerms) {\n terms.add(term.toLowerCase());\n }\n for (const term of ELECTRICITY_TERMS) {\n if (question.toLowerCase().includes(term.toLowerCase())) {\n terms.add(term.toLowerCase());\n }\n }\n const latinTerms = question.match(/[a-z0-9][a-z0-9-]{2,}/giu) ?? [];\n for (const term of latinTerms) {\n terms.add(term.toLowerCase());\n }\n return [...terms];\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const normalized = value.replace(/\\s+/gu, ' ').trim();\n const key = normalized.toLowerCase();\n if (normalized && !seen.has(key)) {\n seen.add(key);\n result.push(normalized);\n }\n }\n return result;\n}\n\nfunction buildQueryTexts(request: EvidenceSearchRequest): string[] {\n const yearText = request.requested_year ? String(request.requested_year) : '';\n const preferredQueries = request.preferred_domains.map(\n (domain) => `site:${domain} ${request.question}`,\n );\n const generated = [\n request.question,\n `site:stats.gov.cn ${request.question}`,\n `site:nea.gov.cn ${request.question}`,\n yearText\n ? `国家统计局 ${yearText} 发电量 火电 水电 核电 风电 太阳能`\n : '国家统计局 发电量 火电 水电 核电 风电 太阳能',\n yearText\n ? `国家能源局 ${yearText} 全国电力统计数据 发电装机容量 火电 水电 风电 太阳能`\n : '国家能源局 全国电力统计数据 发电装机容量 火电 水电 风电 太阳能',\n yearText\n ? `中电联 ${yearText} 电力供需形势 非化石能源 发电量 占比`\n : '中电联 电力供需形势 非化石能源 发电量 占比',\n yearText\n ? `China ${yearText} electricity generation mix coal hydro nuclear wind solar`\n : 'China electricity generation mix coal hydro nuclear wind solar',\n yearText\n ? `China ${yearText} installed power capacity mix thermal hydro nuclear wind solar`\n : 'China installed power capacity mix thermal hydro nuclear wind solar',\n ...preferredQueries,\n ];\n return dedupeStrings(generated).slice(0, request.budget.max_queries);\n}\n\nfunction buildSearchPlan(request: EvidenceSearchRequest): EvidenceSearchQuery[] {\n const expectedTerms = extractTerms(request.question, request.required_terms);\n return buildQueryTexts(request).map((text, index) => ({\n query_id: `q${String(index + 1).padStart(2, '0')}`,\n text,\n purpose: index === 0 ? 'broad_discovery' : 'source_targeted_discovery',\n source_tier: text.startsWith('site:') ? 'targeted' : 'general',\n priority: index + 1,\n expected_terms: expectedTerms,\n }));\n}\n\nfunction normalizeRequest(options: RunDatasetEvidenceSearchOptions): EvidenceSearchRequest {\n const rawInput = options.rawInput ?? (options.inputPath ? readJsonInput(options.inputPath) : {});\n const input = isRecord(rawInput) ? rawInput : {};\n const question = trimToken(options.query) ?? trimToken(input.question);\n if (!question) {\n throw new CliError('Evidence search requires --query or input.question.', {\n code: 'EVIDENCE_SEARCH_QUESTION_REQUIRED',\n exitCode: 2,\n });\n }\n\n const profile = normalizeProfile(options.profile ?? trimToken(input.profile));\n const defaultBudget = DEFAULT_BUDGETS[profile];\n const budgetInput = isRecord(input.budget) ? input.budget : {};\n const maxQueries = readPositiveInteger(\n options.maxQueries ?? budgetInput.max_queries,\n defaultBudget.max_queries,\n '--max-queries',\n );\n const maxResultsPerQuery = readPositiveInteger(\n options.maxResultsPerQuery ?? budgetInput.max_results_per_query,\n defaultBudget.max_results_per_query,\n '--max-results-per-query',\n );\n const budget = {\n max_queries: maxQueries,\n max_results_per_query: maxResultsPerQuery,\n max_provider_calls: maxQueries,\n };\n const fieldInput = isRecord(input.field) ? input.field : {};\n\n return {\n question,\n field: {\n dataset_type: trimToken(fieldInput.dataset_type),\n field_path: trimToken(fieldInput.field_path),\n },\n profile,\n budget,\n preferred_domains: readStringArray(input.preferred_domains),\n required_terms: readStringArray(input.required_terms),\n required_complete_year: requestRequiresCompleteYear(input),\n requested_year: readRequestedYear(question, input),\n };\n}\n\nfunction readResultsInput(resultsPath: string, rawResults?: unknown): unknown {\n if (rawResults !== undefined) {\n return rawResults;\n }\n const text = readFileSync(resultsPath, 'utf8');\n const trimmed = text.trim();\n if (!trimmed) {\n return [];\n }\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n return JSON.parse(trimmed);\n } catch (error) {\n throw new CliError(`Search results file is not valid JSON: ${resultsPath}`, {\n code: 'EVIDENCE_SEARCH_RESULTS_INVALID_JSON',\n exitCode: 2,\n details: String(error),\n });\n }\n }\n return trimmed\n .split(/\\r?\\n/u)\n .map((line, index) => {\n try {\n return JSON.parse(line);\n } catch (error) {\n throw new CliError(`Search results file has invalid JSONL at line ${index + 1}.`, {\n code: 'EVIDENCE_SEARCH_RESULTS_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n })\n .filter((item) => item !== null);\n}\n\nfunction extractItems(value: JsonObject): unknown[] {\n for (const key of ['items', 'results', 'data', 'web_results']) {\n const candidate = value[key];\n if (Array.isArray(candidate)) {\n return candidate;\n }\n }\n return [];\n}\n\nfunction normalizeResultGroups(rawResults: unknown): ProviderQueryResult[] {\n const root = rawResults;\n if (isRecord(root) && Array.isArray(root.queries)) {\n return root.queries.filter(isRecord).map((queryGroup) => ({\n provider: trimToken(queryGroup.provider) ?? 'external',\n query_id: trimToken(queryGroup.query_id),\n query: trimToken(queryGroup.query ?? queryGroup.text),\n items: extractItems(queryGroup),\n }));\n }\n const rows = Array.isArray(root) ? root : [root];\n if (rows.every(isRecord) && rows.some((row) => extractItems(row).length > 0)) {\n return rows.filter(isRecord).map((queryGroup) => ({\n provider: trimToken(queryGroup.provider) ?? 'external',\n query_id: trimToken(queryGroup.query_id),\n query: trimToken(queryGroup.query ?? queryGroup.text),\n items: extractItems(queryGroup),\n }));\n }\n return [\n {\n provider: 'external',\n query_id: null,\n query: null,\n items: rows,\n },\n ];\n}\n\nfunction normalizeOneResult(options: {\n item: unknown;\n group: ProviderQueryResult;\n rank: number;\n terms: string[];\n preferredDomains: string[];\n}): EvidenceSearchResult | null {\n if (!isRecord(options.item)) {\n return null;\n }\n const title = trimToken(options.item.title ?? options.item.name);\n const url = trimToken(options.item.url ?? options.item.link ?? options.item.href);\n if (!title || !url) {\n return null;\n }\n const snippet = trimToken(\n options.item.snippet ?? options.item.description ?? options.item.summary ?? options.item.text,\n );\n const publishedAt = trimToken(\n options.item.published_at ?? options.item.publishedAt ?? options.item.date,\n );\n const sourceText = `${title} ${snippet ?? ''}`.toLowerCase();\n const matchedTerms = options.terms.filter((term) => sourceText.includes(term));\n const domain = normalizeDomain(url);\n const sourceTier = classifySourceTier(domain, options.preferredDomains);\n const authorityScore =\n sourceTier === 'official_statistics'\n ? 4\n : sourceTier === 'preferred_domain' || sourceTier === 'industry_association'\n ? 3\n : sourceTier === 'international_statistics'\n ? 2\n : 1;\n const termScore = Math.min(matchedTerms.length, 6);\n return {\n query_id: options.group.query_id,\n query: options.group.query,\n provider: options.group.provider,\n rank: options.rank,\n title,\n url,\n snippet,\n published_at: publishedAt,\n source_domain: domain,\n source_tier: sourceTier,\n matched_terms: matchedTerms,\n score: authorityScore + termScore,\n };\n}\n\nfunction normalizeResults(options: {\n rawResults: unknown;\n terms: string[];\n preferredDomains: string[];\n maxResultsPerQuery: number;\n}): EvidenceSearchResult[] {\n const byUrl = new Map<string, EvidenceSearchResult>();\n for (const group of normalizeResultGroups(options.rawResults)) {\n group.items.slice(0, options.maxResultsPerQuery).forEach((item, index) => {\n const result = normalizeOneResult({\n item,\n group,\n rank: index + 1,\n terms: options.terms,\n preferredDomains: options.preferredDomains,\n });\n if (!result) {\n return;\n }\n const previous = byUrl.get(result.url);\n if (!previous || result.score > previous.score) {\n byUrl.set(result.url, result);\n }\n });\n }\n return [...byUrl.values()].sort(\n (left, right) => right.score - left.score || left.rank - right.rank,\n );\n}\n\nasync function fetchProviderResults(options: {\n providerUrl: string;\n providerKey: string | null;\n plan: EvidenceSearchQuery[];\n request: EvidenceSearchRequest;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<{ rawResults: ProviderQueryResult[]; callCount: number }> {\n const rawResults: ProviderQueryResult[] = [];\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (options.providerKey) {\n headers.Authorization = `Bearer ${options.providerKey}`;\n }\n for (const query of options.plan.slice(0, options.request.budget.max_provider_calls)) {\n const payload = await postJson({\n url: options.providerUrl,\n headers,\n body: {\n query: query.text,\n query_id: query.query_id,\n limit: options.request.budget.max_results_per_query,\n context: {\n question: options.request.question,\n field: options.request.field,\n expected_terms: query.expected_terms,\n },\n },\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n rawResults.push({\n provider: options.providerUrl,\n query_id: query.query_id,\n query: query.text,\n items: isRecord(payload) ? extractItems(payload) : Array.isArray(payload) ? payload : [],\n });\n }\n return { rawResults, callCount: rawResults.length };\n}\n\nfunction temporalCoverageStatus(request: EvidenceSearchRequest, now: Date): string {\n if (!request.required_complete_year || !request.requested_year) {\n return 'not_required';\n }\n const currentYear = now.getUTCFullYear();\n if (request.requested_year > currentYear) {\n return 'future_year';\n }\n if (request.requested_year === currentYear && now.getUTCMonth() < 11) {\n return 'incomplete_current_year';\n }\n return 'complete_year_possible';\n}\n\nfunction buildDeclaration(options: {\n generatedAt: string;\n request: EvidenceSearchRequest;\n queryCount: number;\n providerCount: number;\n resultCount: number;\n authoritativeResultCount: number;\n temporalStatus: string;\n partial: boolean;\n}): EvidenceSearchDeclaration {\n const declarationType = options.partial ? 'partial_temporal_evidence' : 'no_sufficient_evidence';\n const statement =\n declarationType === 'partial_temporal_evidence'\n ? 'The configured search found current-year or forecast evidence, but not complete annual evidence for the requested year.'\n : 'Within the configured search scope, query matrix, source policy, and budget, no sufficient evidence was found for the requested field.';\n return {\n schema_version: 1,\n generated_at_utc: options.generatedAt,\n question: options.request.question,\n declaration_type: declarationType,\n statement,\n search_scope: {\n query_count: options.queryCount,\n provider_count: options.providerCount,\n normalized_result_count: options.resultCount,\n authoritative_result_count: options.authoritativeResultCount,\n required_complete_year: options.request.required_complete_year,\n requested_year: options.request.requested_year,\n temporal_coverage_status: options.temporalStatus,\n },\n limits: [\n 'The command records deterministic search scope and result normalization; it does not prove that the open web contains no undiscoverable source.',\n 'Browser-only, paywalled, login-protected, or unindexed sources require separate readback or manual evidence capture.',\n 'A no-evidence or partial-evidence declaration is valid only for the configured query matrix, provider set, and budget.',\n ],\n };\n}\n\nfunction buildReport(options: {\n generatedAt: string;\n mode: EvidenceSearchMode;\n request: EvidenceSearchRequest;\n plan: EvidenceSearchQuery[];\n results: EvidenceSearchResult[];\n providerCount: number;\n providerCallCount: number;\n files: EvidenceSearchReport['files'];\n now: Date;\n}): EvidenceSearchReport {\n const authoritativeResultCount = options.results.filter((result) =>\n ['official_statistics', 'preferred_domain', 'industry_association'].includes(\n result.source_tier,\n ),\n ).length;\n const highConfidenceResultCount = options.results.filter((result) => result.score >= 7).length;\n const temporalStatus = temporalCoverageStatus(options.request, options.now);\n const hasEvidence = authoritativeResultCount > 0 || highConfidenceResultCount > 0;\n const partial =\n hasEvidence && ['future_year', 'incomplete_current_year'].includes(temporalStatus);\n const sufficient = hasEvidence && !partial;\n const status: EvidenceSearchStatus =\n options.mode === 'plan'\n ? 'planned'\n : sufficient\n ? 'completed_with_evidence'\n : partial\n ? 'completed_with_partial_evidence'\n : 'completed_no_sufficient_evidence';\n const stopReason =\n options.mode === 'plan'\n ? 'plan_only'\n : sufficient\n ? 'sufficient_authoritative_evidence_found'\n : partial\n ? 'complete_annual_scope_not_available'\n : 'budget_exhausted_without_sufficient_evidence';\n\n return {\n schema_version: 1,\n generated_at_utc: options.generatedAt,\n mode: options.mode,\n status,\n question: options.request.question,\n field: options.request.field,\n profile: options.request.profile,\n budget: options.request.budget,\n plan: {\n query_count: options.plan.length,\n queries: options.plan,\n },\n run: {\n provider_count: options.providerCount,\n provider_call_count: options.providerCallCount,\n normalized_result_count: options.results.length,\n authoritative_result_count: authoritativeResultCount,\n high_confidence_result_count: highConfidenceResultCount,\n stop_reason: stopReason,\n },\n evidence_quality: {\n sufficient,\n temporal_coverage_status: temporalStatus,\n requested_year: options.request.requested_year,\n required_complete_year: options.request.required_complete_year,\n },\n files: options.files,\n };\n}\n\nexport async function runDatasetEvidenceSearch(\n options: RunDatasetEvidenceSearchOptions,\n): Promise<EvidenceSearchReport> {\n const request = normalizeRequest(options);\n const plan = buildSearchPlan(request);\n const generatedAt = nowIso(options.now);\n const now = options.now ?? new Date();\n const outputDir = options.outDir ? path.resolve(options.outDir) : null;\n const planFile = outputDir ? path.join(outputDir, 'outputs', 'evidence-search-plan.json') : null;\n const resultsFile = outputDir\n ? path.join(outputDir, 'outputs', 'evidence-search-results.jsonl')\n : null;\n const reportFile = outputDir\n ? path.join(outputDir, 'outputs', 'evidence-search-report.json')\n : null;\n const declarationFile = outputDir\n ? path.join(outputDir, 'outputs', 'evidence-search-declaration.json')\n : null;\n\n if (planFile) {\n writeJsonArtifact(planFile, {\n schema_version: 1,\n generated_at_utc: generatedAt,\n question: request.question,\n field: request.field,\n profile: request.profile,\n budget: request.budget,\n queries: plan,\n });\n }\n\n let rawResults: unknown = [];\n let providerCount = 0;\n let providerCallCount = 0;\n\n if (options.mode === 'run') {\n if (options.resultsPath) {\n rawResults = readResultsInput(options.resultsPath, options.rawResults);\n providerCount += 1;\n }\n if (options.providerUrl) {\n if (!options.fetchImpl) {\n throw new CliError('Evidence search provider mode requires fetchImpl.', {\n code: 'EVIDENCE_SEARCH_FETCH_IMPL_REQUIRED',\n exitCode: 2,\n });\n }\n const providerResults = await fetchProviderResults({\n providerUrl: options.providerUrl,\n providerKey: options.providerKey ?? null,\n plan,\n request,\n timeoutMs: options.timeoutMs ?? 30_000,\n fetchImpl: options.fetchImpl,\n });\n rawResults = [...normalizeResultGroups(rawResults), ...providerResults.rawResults];\n providerCount += 1;\n providerCallCount += providerResults.callCount;\n }\n if (!options.resultsPath && !options.providerUrl) {\n throw new CliError('dataset evidence-search run requires --results or --provider-url.', {\n code: 'EVIDENCE_SEARCH_PROVIDER_REQUIRED',\n exitCode: 2,\n });\n }\n }\n\n const terms = extractTerms(request.question, request.required_terms);\n const results =\n options.mode === 'run'\n ? normalizeResults({\n rawResults,\n terms,\n preferredDomains: request.preferred_domains,\n maxResultsPerQuery: request.budget.max_results_per_query,\n })\n : [];\n if (resultsFile) {\n writeJsonLinesArtifact(resultsFile, results);\n }\n\n const preliminaryReport = buildReport({\n generatedAt,\n mode: options.mode,\n request,\n plan,\n results,\n providerCount,\n providerCallCount,\n files: {\n plan: planFile,\n results: resultsFile,\n report: reportFile,\n declaration: null,\n },\n now,\n });\n\n let finalDeclarationFile: string | null = null;\n if (\n outputDir &&\n options.mode === 'run' &&\n preliminaryReport.status !== 'completed_with_evidence'\n ) {\n const declaration = buildDeclaration({\n generatedAt,\n request,\n queryCount: plan.length,\n providerCount,\n resultCount: results.length,\n authoritativeResultCount: preliminaryReport.run.authoritative_result_count,\n temporalStatus: preliminaryReport.evidence_quality.temporal_coverage_status,\n partial: preliminaryReport.status === 'completed_with_partial_evidence',\n });\n finalDeclarationFile = writeJsonArtifact(declarationFile!, declaration);\n }\n\n const report = {\n ...preliminaryReport,\n files: {\n ...preliminaryReport.files,\n declaration: finalDeclarationFile,\n },\n };\n if (reportFile) {\n writeJsonArtifact(reportFile, report);\n }\n return report;\n}\n\nexport const __testInternals = {\n buildSearchPlan,\n classifySourceTier,\n normalizeResults,\n normalizeRequest,\n temporalCoverageStatus,\n};\n"]}
|