@humain/terminal 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/bundle/chunks/{anthropic-messages-XULXUBIG.js → anthropic-messages-QFCEKGI3.js} +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-JEG2XOYC.js → azure-openai-responses-G4ZMHV37.js} +1 -1
- package/dist/bundle/chunks/chunk-7T6XCLJF.js +22 -0
- package/dist/bundle/chunks/chunk-D6HHRSB5.js +103 -0
- package/dist/bundle/chunks/chunk-EY4DWHQU.js +2 -0
- package/dist/bundle/chunks/{chunk-LYAMSPR2.js → chunk-I47ZWR55.js} +483 -506
- package/dist/bundle/chunks/{chunk-JUPSJTFQ.js → chunk-K4JAZYQH.js} +1 -1
- package/dist/bundle/chunks/{chunk-HPPQHK3J.js → chunk-KKIB2TVR.js} +1 -1
- package/dist/bundle/chunks/chunk-LI2YVPWP.js +2 -0
- package/dist/bundle/chunks/{chunk-BZQ53VGE.js → chunk-XSR434CO.js} +1 -1
- package/dist/bundle/chunks/compat-QCV26HNS.js +2 -0
- package/dist/bundle/chunks/dist-PRPIUY3U.js +2 -0
- package/dist/bundle/chunks/esm-E7UVEYTO.js +4 -0
- package/dist/bundle/chunks/{extract-TRW5FBY6.js → extract-CTIFQZDJ.js} +15 -14
- package/dist/bundle/chunks/{google-generative-ai-OX6VSCA6.js → google-generative-ai-RSUU4MWO.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-GW76GSS2.js → google-vertex-CKQPOITO.js} +1 -1
- package/dist/bundle/chunks/host-WP3MVKS2.js +2 -0
- package/dist/bundle/chunks/{node-KOIP55YZ.js → node-NF43OPII.js} +1 -1
- package/dist/bundle/chunks/{node-XY3CBY3C.js → node-UMFM7CDZ.js} +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-NPLWP6ZC.js → openai-codex-responses-S34V5ZSD.js} +1 -1
- package/dist/bundle/chunks/{openai-completions-OT2GTJKC.js → openai-completions-T2IGVUEI.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-5A6CR7GI.js → openai-responses-GYZODCT3.js} +1 -1
- package/dist/bundle/chunks/readability-LAGF34IB.js +3 -0
- package/dist/bundle/chunks/turndown.cjs-HRMZVRUL.js +2 -0
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +21 -8
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/subagent-env.d.ts +18 -0
- package/dist/core/tools/subagent-env.d.ts.map +1 -0
- package/dist/core/tools/subagent-env.js +43 -0
- package/dist/core/tools/subagent-env.js.map +1 -0
- package/dist/core/tools/subagent-scheduler.d.ts +31 -0
- package/dist/core/tools/subagent-scheduler.d.ts.map +1 -0
- package/dist/core/tools/subagent-scheduler.js +203 -0
- package/dist/core/tools/subagent-scheduler.js.map +1 -0
- package/dist/core/tools/subagent.d.ts +83 -3
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +214 -76
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +78 -0
- package/dist/humain/mcp-adapter/vendor/README.md +125 -19
- package/dist/humain/mcp-adapter/vendor/agent-plugin-loader.ts +69 -30
- package/dist/humain/mcp-adapter/vendor/agent-plugin-provenance.ts +36 -0
- package/dist/humain/mcp-adapter/vendor/claude-plugin-loader.ts +365 -0
- package/dist/humain/mcp-adapter/vendor/commands.ts +13 -15
- package/dist/humain/mcp-adapter/vendor/config.ts +198 -30
- package/dist/humain/mcp-adapter/vendor/consent-manager.ts +40 -9
- package/dist/humain/mcp-adapter/vendor/direct-tool-surface.ts +250 -0
- package/dist/humain/mcp-adapter/vendor/direct-tools.ts +9 -228
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js +74 -32
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.d.ts +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.js +31 -0
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.d.ts +9 -0
- package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.js +362 -0
- package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/config.d.ts +3 -1
- package/dist/humain/mcp-adapter/vendor/dist/config.js +189 -27
- package/dist/humain/mcp-adapter/vendor/dist/config.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js +7 -16
- package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js +5 -17
- package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/types.d.ts +30 -4
- package/dist/humain/mcp-adapter/vendor/dist/types.js +26 -0
- package/dist/humain/mcp-adapter/vendor/dist/types.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/dist/utils.d.ts +6 -0
- package/dist/humain/mcp-adapter/vendor/dist/utils.js +65 -6
- package/dist/humain/mcp-adapter/vendor/dist/utils.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/host-html-template.ts +20 -19
- package/dist/humain/mcp-adapter/vendor/http-ca.ts +84 -0
- package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +37102 -15103
- package/dist/humain/mcp-adapter/vendor/index.ts +828 -164
- package/dist/humain/mcp-adapter/vendor/init.ts +48 -10
- package/dist/humain/mcp-adapter/vendor/lazy-loader.ts +7 -0
- package/dist/humain/mcp-adapter/vendor/mcp-auth-fetch.ts +113 -0
- package/dist/humain/mcp-adapter/vendor/mcp-auth-flow.ts +256 -77
- package/dist/humain/mcp-adapter/vendor/mcp-auth.ts +316 -54
- package/dist/humain/mcp-adapter/vendor/mcp-code.ts +45 -18
- package/dist/humain/mcp-adapter/vendor/mcp-install.ts +60 -0
- package/dist/humain/mcp-adapter/vendor/mcp-oauth-provider.ts +70 -6
- package/dist/humain/mcp-adapter/vendor/mcp-output-guard.ts +53 -42
- package/dist/humain/mcp-adapter/vendor/mcp-panel-theme.ts +105 -0
- package/dist/humain/mcp-adapter/vendor/mcp-panel.ts +366 -331
- package/dist/humain/mcp-adapter/vendor/mcp-references.ts +9 -14
- package/dist/humain/mcp-adapter/vendor/mcp-script-worker.mjs +3 -1
- package/dist/humain/mcp-adapter/vendor/mcp-setup-panel.ts +383 -341
- package/dist/humain/mcp-adapter/vendor/mcp-status.ts +5 -0
- package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +7 -16
- package/dist/humain/mcp-adapter/vendor/namespace-tools.ts +61 -3
- package/dist/humain/mcp-adapter/vendor/oauth.ts +6 -2
- package/dist/humain/mcp-adapter/vendor/package-mcp-loader.ts +5 -17
- package/dist/humain/mcp-adapter/vendor/package.json +13 -3
- package/dist/humain/mcp-adapter/vendor/prompts.ts +35 -3
- package/dist/humain/mcp-adapter/vendor/proxy-modes.ts +108 -7
- package/dist/humain/mcp-adapter/vendor/runtime-owner.ts +16 -1
- package/dist/humain/mcp-adapter/vendor/sampling-handler.ts +9 -32
- package/dist/humain/mcp-adapter/vendor/sandbox-proxy-template.ts +20 -93
- package/dist/humain/mcp-adapter/vendor/server-manager.ts +227 -40
- package/dist/humain/mcp-adapter/vendor/session-approvals.ts +187 -0
- package/dist/humain/mcp-adapter/vendor/skills/mcp-scripting/SKILL.md +9 -1
- package/dist/humain/mcp-adapter/vendor/state.ts +10 -1
- package/dist/humain/mcp-adapter/vendor/tool-approval.ts +10 -22
- package/dist/humain/mcp-adapter/vendor/tool-metadata.ts +14 -0
- package/dist/humain/mcp-adapter/vendor/types.ts +57 -4
- package/dist/humain/mcp-adapter/vendor/ui-server.ts +36 -28
- package/dist/humain/mcp-adapter/vendor/utils.ts +64 -6
- package/dist/humain/web-access/vendor/abortable.d.ts +3 -0
- package/dist/humain/web-access/vendor/abortable.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/abortable.js +22 -0
- package/dist/humain/web-access/vendor/abortable.js.map +1 -0
- package/dist/humain/web-access/vendor/crawl4ai.d.ts +9 -0
- package/dist/humain/web-access/vendor/crawl4ai.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/crawl4ai.js +187 -0
- package/dist/humain/web-access/vendor/crawl4ai.js.map +1 -0
- package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/credential-source.js +1 -0
- package/dist/humain/web-access/vendor/credential-source.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.js +20 -2
- package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-run.d.ts +11 -0
- package/dist/humain/web-access/vendor/curator-run.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/curator-run.js +38 -0
- package/dist/humain/web-access/vendor/curator-run.js.map +1 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts +1 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.js +2 -0
- package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
- package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/duckduckgo.js +1 -1
- package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -1
- package/dist/humain/web-access/vendor/extract.d.ts +1 -1
- package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/extract.js +58 -11
- package/dist/humain/web-access/vendor/extract.js.map +1 -1
- package/dist/humain/web-access/vendor/fetch-params.js +1 -1
- package/dist/humain/web-access/vendor/fetch-params.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
- package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.js +12 -5
- package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
- package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/index.js +23 -19
- package/dist/humain/web-access/vendor/index.js.map +1 -1
- package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/openai-search.js +40 -14
- package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
- package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/page-query.js +6 -2
- package/dist/humain/web-access/vendor/page-query.js.map +1 -1
- package/dist/humain/web-access/vendor/query-rewrite.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/query-rewrite.js +6 -2
- package/dist/humain/web-access/vendor/query-rewrite.js.map +1 -1
- package/dist/humain/web-access/vendor/serpapi.d.ts +4 -0
- package/dist/humain/web-access/vendor/serpapi.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/serpapi.js +215 -0
- package/dist/humain/web-access/vendor/serpapi.js.map +1 -0
- package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/ssrf-protection.js +5 -1
- package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -1
- package/dist/humain/web-access/vendor/storage.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/storage.js +9 -0
- package/dist/humain/web-access/vendor/storage.js.map +1 -1
- package/dist/humain/web-access/vendor/summary-review.d.ts +1 -1
- package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/summary-review.js +35 -24
- package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
- package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/utils.js +5 -3
- package/dist/humain/web-access/vendor/utils.js.map +1 -1
- package/dist/modes/json-event.d.ts +8 -0
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +17 -0
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +3 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/docs/environment-variables.md +8 -0
- package/docs/json.md +16 -0
- package/npm-shrinkwrap.json +6 -6
- package/package.json +2 -2
- package/src/humain/mcp-adapter/UPSTREAM.md +56 -7
- package/src/humain/mcp-adapter/upstream.json +6 -4
- package/src/humain/mcp-adapter/vendor/CHANGELOG.md +78 -0
- package/src/humain/web-access/UPSTREAM.md +18 -8
- package/src/humain/web-access/upstream.json +6 -5
- package/dist/bundle/chunks/chunk-2LC3S3VV.js +0 -105
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, constants, fchmodSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, type Stats, unlinkSync, writeFileSync } from \"node:fs\";\nimport { randomBytes } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\nimport { getWebSearchConfigDir } from \"./utils.ts\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000;\nconst FETCH_CACHE_DIR = \"web-search-cache\";\nconst FETCH_CACHE_VERSION = 1;\nconst CACHE_KEY_PATTERN = /^[A-Za-z0-9_-]+\\.json$/;\nconst CACHE_TMP_PATTERN = /^[A-Za-z0-9_-]+\\.json\\.\\d+\\.\\d+(?:\\.[a-f0-9]{32})?\\.tmp$/;\nconst CACHE_ID_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst MAX_METADATA_TEXT = 8192;\nconst DEFAULT_CACHE_LIMITS = { maxEntries: 128, maxBytes: 128 * 1024 * 1024 };\nconst O_DIRECTORY = process.platform === \"win32\" ? 0 : (constants.O_DIRECTORY ?? 0);\nconst O_NOFOLLOW = process.platform === \"win32\" ? 0 : (constants.O_NOFOLLOW ?? 0);\n\ninterface FetchCacheLimits {\n\tmaxEntries: number;\n\tmaxBytes: number;\n}\n\ninterface CacheFile {\n\tname: string;\n\tsize: number;\n\tmtimeMs: number;\n\tdev: number;\n\tino: number;\n}\n\nexport interface QueryResultData {\n\tquery: string;\n\tanswer: string;\n\tresults: SearchResult[];\n\terror: string | null;\n\tprovider?: string;\n}\n\ninterface FetchCacheRef {\n\tversion: typeof FETCH_CACHE_VERSION;\n\tkey: string;\n\tstoredAt: number;\n}\n\ninterface StoredFetchUrlMetadata {\n\turl: string;\n\ttitle: string;\n\terror: string | null;\n\tcontentLength: number;\n\tmimeType?: string;\n\tstatus?: number;\n\tduration?: number;\n}\n\nexport interface StoredSearchData {\n\tid: string;\n\ttype: \"search\" | \"fetch\" | \"research\";\n\ttimestamp: number;\n\tqueries?: QueryResultData[];\n\turls?: ExtractedContent[];\n\tartifact?: unknown;\n\tfetchCache?: FetchCacheRef;\n\turlMetadata?: StoredFetchUrlMetadata[];\n\tfetchCacheError?: string;\n}\n\nconst storedResults = new Map<string, StoredSearchData>();\n\nexport function generateId(): string {\n\treturn Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nexport function getFetchCacheDir(): string {\n\treturn join(getWebSearchConfigDir(), FETCH_CACHE_DIR);\n}\n\nfunction fetchCachePath(key: string): string | null {\n\tif (!CACHE_KEY_PATTERN.test(key)) return null;\n\treturn join(getFetchCacheDir(), key);\n}\n\nfunction cacheKeyForId(id: string): string {\n\tif (!CACHE_ID_PATTERN.test(id)) {\n\t\tthrow new Error(`Invalid fetched content cache id: ${id}`);\n\t}\n\treturn `${id}.json`;\n}\n\nfunction truncateMetadataText(value: string | undefined): string {\n\tif (!value) return \"\";\n\treturn value.length > MAX_METADATA_TEXT ? `${value.slice(0, MAX_METADATA_TEXT)}...` : value;\n}\n\nfunction metadataForUrls(urls: ExtractedContent[]): StoredFetchUrlMetadata[] {\n\treturn urls.map((url) => ({\n\t\turl: truncateMetadataText(url.url),\n\t\ttitle: truncateMetadataText(url.title),\n\t\terror: url.error ? truncateMetadataText(url.error) : null,\n\t\tcontentLength: url.content.length,\n\t\t...(url.mimeType ? { mimeType: truncateMetadataText(url.mimeType) } : {}),\n\t\t...(typeof url.status === \"number\" ? { status: url.status } : {}),\n\t\t...(typeof url.duration === \"number\" ? { duration: url.duration } : {}),\n\t}));\n}\n\nfunction isFetchCacheRef(value: unknown): value is FetchCacheRef {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst ref = value as Record<string, unknown>;\n\treturn ref.version === FETCH_CACHE_VERSION &&\n\t\ttypeof ref.key === \"string\" && CACHE_KEY_PATTERN.test(ref.key) &&\n\t\ttypeof ref.storedAt === \"number\" && Number.isFinite(ref.storedAt);\n}\n\nfunction isStoredFetchUrlMetadata(value: unknown): value is StoredFetchUrlMetadata {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst meta = value as Record<string, unknown>;\n\treturn typeof meta.url === \"string\" &&\n\t\ttypeof meta.title === \"string\" &&\n\t\t(meta.error === null || typeof meta.error === \"string\") &&\n\t\ttypeof meta.contentLength === \"number\" && Number.isFinite(meta.contentLength) && meta.contentLength >= 0 &&\n\t\t(meta.mimeType === undefined || typeof meta.mimeType === \"string\") &&\n\t\t(meta.status === undefined || typeof meta.status === \"number\") &&\n\t\t(meta.duration === undefined || typeof meta.duration === \"number\");\n}\n\nfunction isInlineFetchedUrl(value: unknown): value is ExtractedContent {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst url = value as Record<string, unknown>;\n\treturn typeof url.url === \"string\" &&\n\t\ttypeof url.title === \"string\" &&\n\t\ttypeof url.content === \"string\" &&\n\t\t(url.error === null || typeof url.error === \"string\");\n}\n\nfunction isInlineFetchData(data: StoredSearchData): data is StoredSearchData & { urls: ExtractedContent[] } {\n\treturn data.type === \"fetch\" && Array.isArray(data.urls) && data.urls.every(isInlineFetchedUrl);\n}\n\nfunction cacheLimits(limits?: Partial<FetchCacheLimits>): FetchCacheLimits {\n\tconst resolved = {\n\t\tmaxEntries: limits?.maxEntries ?? DEFAULT_CACHE_LIMITS.maxEntries,\n\t\tmaxBytes: limits?.maxBytes ?? DEFAULT_CACHE_LIMITS.maxBytes,\n\t};\n\tif (!Number.isFinite(resolved.maxEntries) || !Number.isInteger(resolved.maxEntries) || resolved.maxEntries <= 0 ||\n\t\t!Number.isFinite(resolved.maxBytes) || !Number.isInteger(resolved.maxBytes) || resolved.maxBytes <= 0) {\n\t\tthrow new Error(\"Fetched content cache limits must be finite positive integers\");\n\t}\n\treturn resolved;\n}\n\nfunction enforceDirectoryMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o700);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction enforceFileMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o600);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction safeFetchCacheDir(create: true): string;\nfunction safeFetchCacheDir(create: false): string | null;\nfunction safeFetchCacheDir(create: boolean): string | null {\n\tconst dir = getFetchCacheDir();\n\tif (create) mkdirSync(dir, { recursive: true, mode: 0o700 });\n\tlet before: Stats;\n\ttry {\n\t\tbefore = lstatSync(dir);\n\t} catch (err) {\n\t\tif (!create && (err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow err;\n\t}\n\tif (before.isSymbolicLink() || !before.isDirectory()) {\n\t\tthrow new Error(\"Fetched content cache path is not a safe directory\");\n\t}\n\tif (process.platform === \"win32\") {\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t}\n\tlet fd: number | null = null;\n\ttry {\n\t\tfd = openSync(dir, constants.O_RDONLY | O_DIRECTORY | O_NOFOLLOW);\n\t\tconst opened = fstatSync(fd);\n\t\tif (!opened.isDirectory() || opened.dev !== before.dev || opened.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while opening\");\n\t\t}\n\t\tenforceDirectoryMode(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nfunction openRegularFile(path: string): { fd: number; info: Stats } {\n\tconst before = lstatSync(path);\n\tif (before.isSymbolicLink() || !before.isFile()) throw new Error(\"Fetched content cache entry is not a regular file\");\n\tconst fd = openSync(path, constants.O_RDONLY | O_NOFOLLOW);\n\ttry {\n\t\tconst info = fstatSync(fd);\n\t\tif (!info.isFile() || info.dev !== before.dev || info.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed while opening\");\n\t\t}\n\t\treturn { fd, info };\n\t} catch (err) {\n\t\tcloseSync(fd);\n\t\tthrow err;\n\t}\n}\n\ntype CacheUnlinkResult = \"removed\" | \"missing\" | \"changed\" | \"error\";\n\nfunction unlinkCacheFile(dir: string, file: CacheFile): CacheUnlinkResult {\n\ttry {\n\t\tconst root = lstatSync(dir);\n\t\tif (root.isSymbolicLink() || !root.isDirectory()) return \"changed\";\n\t\tconst path = join(dir, file.name);\n\t\tlet current: Stats;\n\t\ttry {\n\t\t\tcurrent = lstatSync(path);\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t\tif (current.isSymbolicLink() || !current.isFile() || current.dev !== file.dev || current.ino !== file.ino) return \"changed\";\n\t\ttry {\n\t\t\tunlinkSync(path);\n\t\t\treturn \"removed\";\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t} catch {\n\t\treturn \"error\";\n\t}\n}\n\nfunction pruneFetchCache(now: number, limits: FetchCacheLimits, preferredKey?: string, reservation?: { key: string; bytes: number }): boolean {\n\tlet dir: string | null;\n\ttry {\n\t\tdir = safeFetchCacheDir(false);\n\t} catch {\n\t\treturn false;\n\t}\n\tif (!dir) return true;\n\n\tlet entries: string[];\n\ttry {\n\t\tentries = readdirSync(dir);\n\t} catch {\n\t\treturn false;\n\t}\n\n\tconst files: CacheFile[] = [];\n\tfor (const entry of entries) {\n\t\tif (!CACHE_KEY_PATTERN.test(entry) && !CACHE_TMP_PATTERN.test(entry)) continue;\n\t\tconst path = join(dir, entry);\n\t\tlet opened: ReturnType<typeof openRegularFile>;\n\t\ttry {\n\t\t\topened = openRegularFile(path);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tenforceFileMode(opened.fd);\n\t\t} catch {\n\t\t\tcloseSync(opened.fd);\n\t\t\tcontinue;\n\t\t}\n\t\tcloseSync(opened.fd);\n\t\tconst file = { name: entry, size: opened.info.size, mtimeMs: opened.info.mtimeMs, dev: opened.info.dev, ino: opened.info.ino };\n\t\tif (now - file.mtimeMs >= CACHE_TTL_MS) {\n\t\t\tconst removed = unlinkCacheFile(dir, file);\n\t\t\tif (removed !== \"removed\" && removed !== \"missing\") return false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (CACHE_KEY_PATTERN.test(entry)) files.push(file);\n\t}\n\n\tfiles.sort((a, b) => a.mtimeMs - b.mtimeMs || a.name.localeCompare(b.name));\n\tconst projectedUsage = () => {\n\t\tconst replaced = reservation ? files.find((file) => file.name === reservation.key) : undefined;\n\t\treturn {\n\t\t\tentries: files.length + (reservation && !replaced ? 1 : 0),\n\t\t\tbytes: files.reduce((total, file) => total + file.size, 0) + (reservation ? reservation.bytes - (replaced?.size ?? 0) : 0),\n\t\t};\n\t};\n\tconst attempted = new Set<string>();\n\tlet usage = projectedUsage();\n\twhile (usage.entries > limits.maxEntries || usage.bytes > limits.maxBytes) {\n\t\tconst index = files.findIndex((file) => file.name !== preferredKey && !attempted.has(file.name));\n\t\tif (index < 0) break;\n\t\tconst file = files[index];\n\t\tattempted.add(file.name);\n\t\tconst removed = unlinkCacheFile(dir, file);\n\t\tif (removed === \"removed\" || removed === \"missing\") files.splice(index, 1);\n\t\tusage = projectedUsage();\n\t}\n\treturn usage.entries <= limits.maxEntries && usage.bytes <= limits.maxBytes;\n}\n\nfunction writeFetchCache(data: StoredSearchData & { urls: ExtractedContent[] }): FetchCacheRef {\n\tconst limits = DEFAULT_CACHE_LIMITS;\n\tconst serialized = JSON.stringify(data);\n\tconst size = Buffer.byteLength(serialized);\n\tif (size > limits.maxBytes) throw new Error(`Fetched content cache entry exceeds ${limits.maxBytes} bytes`);\n\n\tconst dir = safeFetchCacheDir(true);\n\tconst key = cacheKeyForId(data.id);\n\tif (!pruneFetchCache(Date.now(), limits, key, { key, bytes: size })) {\n\t\tthrow new Error(\"Fetched content cache could not reserve space for a new entry\");\n\t}\n\tconst finalPath = join(dir, key);\n\tconst tmpName = `${key}.${process.pid}.${Date.now()}.${randomBytes(16).toString(\"hex\")}.tmp`;\n\tconst tmpPath = join(dir, tmpName);\n\tlet fd: number | null = null;\n\tlet tmpFile: CacheFile | null = null;\n\tlet renamed = false;\n\ttry {\n\t\tfd = openSync(tmpPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | O_NOFOLLOW, 0o600);\n\t\tconst tmpInfo = fstatSync(fd);\n\t\ttmpFile = { name: tmpName, size: tmpInfo.size, mtimeMs: tmpInfo.mtimeMs, dev: tmpInfo.dev, ino: tmpInfo.ino };\n\t\tenforceFileMode(fd);\n\t\twriteFileSync(fd, serialized, \"utf8\");\n\t\tfsyncSync(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tsafeFetchCacheDir(false);\n\t\trenameSync(tmpPath, finalPath);\n\t\trenamed = true;\n\t\tconst written = lstatSync(finalPath);\n\t\tif (!written.isFile() || written.dev !== tmpFile.dev || written.ino !== tmpFile.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed after writing\");\n\t\t}\n\t\tif (!pruneFetchCache(Date.now(), limits, key)) {\n\t\t\tthrow new Error(\"Fetched content cache could not meet its limits after writing\");\n\t\t}\n\t} catch (err) {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t\tif (tmpFile) unlinkCacheFile(dir, { ...tmpFile, name: renamed ? key : tmpName });\n\t\tthrow err;\n\t}\n\treturn { version: FETCH_CACHE_VERSION, key, storedAt: Date.now() };\n}\n\nfunction cacheWriteError(err: unknown): string {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn `Failed to write fetched content cache: ${message}`;\n}\n\nfunction createFetchSessionData(data: StoredSearchData & { urls: ExtractedContent[] }, ref: FetchCacheRef | null, cacheError?: string): StoredSearchData {\n\treturn {\n\t\tid: data.id,\n\t\ttype: \"fetch\",\n\t\ttimestamp: data.timestamp,\n\t\turlMetadata: metadataForUrls(data.urls),\n\t\t...(ref ? { fetchCache: ref } : {}),\n\t\t...(cacheError ? { fetchCacheError: truncateMetadataText(cacheError) } : {}),\n\t};\n}\n\nfunction fetchUrlMetadata(data: StoredSearchData): StoredFetchUrlMetadata[] {\n\tif (data.urlMetadata) return data.urlMetadata;\n\treturn isInlineFetchData(data) ? metadataForUrls(data.urls) : [];\n}\n\nfunction unavailableFetchData(data: StoredSearchData, reason: string): StoredSearchData {\n\treturn {\n\t\t...data,\n\t\turls: fetchUrlMetadata(data).map((meta) => ({\n\t\t\turl: meta.url,\n\t\t\ttitle: meta.title,\n\t\t\tcontent: \"\",\n\t\t\terror: reason,\n\t\t\t...(meta.mimeType ? { mimeType: meta.mimeType } : {}),\n\t\t\t...(typeof meta.status === \"number\" ? { status: meta.status } : {}),\n\t\t\t...(typeof meta.duration === \"number\" ? { duration: meta.duration } : {}),\n\t\t})),\n\t};\n}\n\nfunction readCachedFetchData(data: StoredSearchData, now = Date.now()): StoredSearchData {\n\tif (data.type !== \"fetch\") return data;\n\tif (now - data.timestamp >= CACHE_TTL_MS) {\n\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t}\n\tif (isInlineFetchData(data)) return data;\n\tif (!data.fetchCache) {\n\t\treturn unavailableFetchData(data, data.fetchCacheError ?? \"Cached fetched content is unavailable\");\n\t}\n\tconst path = fetchCachePath(data.fetchCache.key);\n\tif (!path) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\tlet fd: number | null = null;\n\ttry {\n\t\tif (!safeFetchCacheDir(false)) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\tconst opened = openRegularFile(path);\n\t\tfd = opened.fd;\n\t\tenforceFileMode(fd);\n\t\tconst parsed: unknown = JSON.parse(readFileSync(fd, \"utf8\"));\n\t\tif (!isValidStoredData(parsed) || parsed.type !== \"fetch\" || parsed.id !== data.id || !isInlineFetchData(parsed)) {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is invalid\");\n\t\t}\n\t\treturn { ...parsed, fetchCache: data.fetchCache, urlMetadata: data.urlMetadata };\n\t} catch (err) {\n\t\tif ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\t}\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn unavailableFetchData(data, `Cached fetched content could not be read: ${message}`);\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nexport function pruneExpiredFetchCache(now = Date.now(), requestedLimits?: Partial<FetchCacheLimits>): void {\n\tconst limits = cacheLimits(requestedLimits);\n\ttry { pruneFetchCache(now, limits); } catch {}\n}\n\nexport function storeResult(id: string, data: StoredSearchData): void {\n\tstoredResults.set(id, data);\n}\n\nexport function storeFetchedContentResult(id: string, data: StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] }): StoredSearchData {\n\tlet ref: FetchCacheRef | null = null;\n\tlet cacheError: string | undefined;\n\ttry {\n\t\tref = writeFetchCache(data);\n\t} catch (err) {\n\t\tcacheError = cacheWriteError(err);\n\t}\n\tstoredResults.set(id, ref ? { ...data, fetchCache: ref, urlMetadata: metadataForUrls(data.urls) } : { ...data, fetchCacheError: cacheError });\n\treturn createFetchSessionData(data, ref, cacheError);\n}\n\nexport function getResult(id: string): StoredSearchData | null {\n\tconst data = storedResults.get(id);\n\tif (!data) return null;\n\tconst loaded = readCachedFetchData(data);\n\tif (loaded !== data) storedResults.set(id, loaded);\n\treturn loaded;\n}\n\nexport function getAllResults(): StoredSearchData[] {\n\treturn Array.from(storedResults.values());\n}\n\nexport function deleteResult(id: string): boolean {\n\tconst data = storedResults.get(id);\n\tif (data?.fetchCache) {\n\t\ttry {\n\t\t\tconst dir = safeFetchCacheDir(false);\n\t\t\tconst path = fetchCachePath(data.fetchCache.key);\n\t\t\tif (dir && path) {\n\t\t\t\tconst info = lstatSync(path);\n\t\t\t\tif (!info.isSymbolicLink() && info.isFile()) {\n\t\t\t\t\tunlinkCacheFile(dir, { name: data.fetchCache.key, size: info.size, mtimeMs: info.mtimeMs, dev: info.dev, ino: info.ino });\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\treturn storedResults.delete(id);\n}\n\nexport function clearResults(): void {\n\tstoredResults.clear();\n}\n\nfunction isValidStoredData(data: unknown): data is StoredSearchData {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Record<string, unknown>;\n\tif (typeof d.id !== \"string\" || !d.id) return false;\n\tif (d.type !== \"search\" && d.type !== \"fetch\" && d.type !== \"research\") return false;\n\tif (typeof d.timestamp !== \"number\") return false;\n\tif (d.type === \"search\" && !Array.isArray(d.queries)) return false;\n\tif (d.type === \"fetch\") {\n\t\tif (Array.isArray(d.urls)) return d.urls.every(isInlineFetchedUrl);\n\t\tif (!Array.isArray(d.urlMetadata) || !d.urlMetadata.every(isStoredFetchUrlMetadata)) return false;\n\t\treturn d.fetchCache === undefined ? d.fetchCacheError === undefined || typeof d.fetchCacheError === \"string\" : isFetchCacheRef(d.fetchCache);\n\t}\n\tif (d.type === \"research\" && (!d.artifact || typeof d.artifact !== \"object\")) return false;\n\treturn true;\n}\n\nexport function restoreFromSession(ctx: ExtensionContext): void {\n\tstoredResults.clear();\n\tconst now = Date.now();\n\tpruneExpiredFetchCache(now);\n\n\tfor (const entry of ctx.sessionManager.getBranch()) {\n\t\tif (entry.type === \"custom\" && entry.customType === \"web-search-results\") {\n\t\t\tconst data = entry.data;\n\t\t\tif (isValidStoredData(data) && now - data.timestamp < CACHE_TTL_MS) {\n\t\t\t\tstoredResults.set(data.id, data);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, constants, fchmodSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, type Stats, unlinkSync, writeFileSync } from \"node:fs\";\nimport { randomBytes } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\nimport { getWebSearchConfigDir } from \"./utils.ts\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000;\nconst FETCH_CACHE_DIR = \"web-search-cache\";\nconst FETCH_CACHE_VERSION = 1;\nconst CACHE_KEY_PATTERN = /^[A-Za-z0-9_-]+\\.json$/;\nconst CACHE_TMP_PATTERN = /^[A-Za-z0-9_-]+\\.json\\.\\d+\\.\\d+(?:\\.[a-f0-9]{32})?\\.tmp$/;\nconst CACHE_ID_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst MAX_METADATA_TEXT = 8192;\nconst DEFAULT_CACHE_LIMITS = { maxEntries: 128, maxBytes: 128 * 1024 * 1024 };\nconst O_DIRECTORY = process.platform === \"win32\" ? 0 : (constants.O_DIRECTORY ?? 0);\nconst O_NOFOLLOW = process.platform === \"win32\" ? 0 : (constants.O_NOFOLLOW ?? 0);\n\ninterface FetchCacheLimits {\n\tmaxEntries: number;\n\tmaxBytes: number;\n}\n\ninterface CacheFile {\n\tname: string;\n\tsize: number;\n\tmtimeMs: number;\n\tdev: number;\n\tino: number;\n}\n\nexport interface QueryResultData {\n\tquery: string;\n\tanswer: string;\n\tresults: SearchResult[];\n\terror: string | null;\n\tprovider?: string;\n}\n\ninterface FetchCacheRef {\n\tversion: typeof FETCH_CACHE_VERSION;\n\tkey: string;\n\tstoredAt: number;\n}\n\ninterface StoredFetchUrlMetadata {\n\turl: string;\n\ttitle: string;\n\terror: string | null;\n\tcontentLength: number;\n\tmimeType?: string;\n\tstatus?: number;\n\tduration?: number;\n}\n\nexport interface StoredSearchData {\n\tid: string;\n\ttype: \"search\" | \"fetch\" | \"research\";\n\ttimestamp: number;\n\tqueries?: QueryResultData[];\n\turls?: ExtractedContent[];\n\tartifact?: unknown;\n\tfetchCache?: FetchCacheRef;\n\turlMetadata?: StoredFetchUrlMetadata[];\n\tfetchCacheError?: string;\n}\n\nconst storedResults = new Map<string, StoredSearchData>();\n\nexport function generateId(): string {\n\treturn Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nexport function getFetchCacheDir(): string {\n\treturn join(getWebSearchConfigDir(), FETCH_CACHE_DIR);\n}\n\nfunction fetchCachePath(key: string): string | null {\n\tif (!CACHE_KEY_PATTERN.test(key)) return null;\n\treturn join(getFetchCacheDir(), key);\n}\n\nfunction cacheKeyForId(id: string): string {\n\tif (!CACHE_ID_PATTERN.test(id)) {\n\t\tthrow new Error(`Invalid fetched content cache id: ${id}`);\n\t}\n\treturn `${id}.json`;\n}\n\nfunction truncateMetadataText(value: string | undefined): string {\n\tif (!value) return \"\";\n\treturn value.length > MAX_METADATA_TEXT ? `${value.slice(0, MAX_METADATA_TEXT)}...` : value;\n}\n\nfunction metadataForUrls(urls: ExtractedContent[]): StoredFetchUrlMetadata[] {\n\treturn urls.map((url) => ({\n\t\turl: truncateMetadataText(url.url),\n\t\ttitle: truncateMetadataText(url.title),\n\t\terror: url.error ? truncateMetadataText(url.error) : null,\n\t\tcontentLength: url.content.length,\n\t\t...(url.mimeType ? { mimeType: truncateMetadataText(url.mimeType) } : {}),\n\t\t...(typeof url.status === \"number\" ? { status: url.status } : {}),\n\t\t...(typeof url.duration === \"number\" ? { duration: url.duration } : {}),\n\t}));\n}\n\nfunction isFetchCacheRef(value: unknown): value is FetchCacheRef {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst ref = value as Record<string, unknown>;\n\treturn ref.version === FETCH_CACHE_VERSION &&\n\t\ttypeof ref.key === \"string\" && CACHE_KEY_PATTERN.test(ref.key) &&\n\t\ttypeof ref.storedAt === \"number\" && Number.isFinite(ref.storedAt);\n}\n\nfunction isStoredFetchUrlMetadata(value: unknown): value is StoredFetchUrlMetadata {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst meta = value as Record<string, unknown>;\n\treturn typeof meta.url === \"string\" &&\n\t\ttypeof meta.title === \"string\" &&\n\t\t(meta.error === null || typeof meta.error === \"string\") &&\n\t\ttypeof meta.contentLength === \"number\" && Number.isFinite(meta.contentLength) && meta.contentLength >= 0 &&\n\t\t(meta.mimeType === undefined || typeof meta.mimeType === \"string\") &&\n\t\t(meta.status === undefined || typeof meta.status === \"number\") &&\n\t\t(meta.duration === undefined || typeof meta.duration === \"number\");\n}\n\nfunction isInlineFetchedUrl(value: unknown): value is ExtractedContent {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst url = value as Record<string, unknown>;\n\treturn typeof url.url === \"string\" &&\n\t\ttypeof url.title === \"string\" &&\n\t\ttypeof url.content === \"string\" &&\n\t\t(url.error === null || typeof url.error === \"string\");\n}\n\nfunction isInlineFetchData(data: StoredSearchData): data is StoredSearchData & { urls: ExtractedContent[] } {\n\treturn data.type === \"fetch\" && Array.isArray(data.urls) && data.urls.every(isInlineFetchedUrl);\n}\n\nfunction cacheLimits(limits?: Partial<FetchCacheLimits>): FetchCacheLimits {\n\tconst resolved = {\n\t\tmaxEntries: limits?.maxEntries ?? DEFAULT_CACHE_LIMITS.maxEntries,\n\t\tmaxBytes: limits?.maxBytes ?? DEFAULT_CACHE_LIMITS.maxBytes,\n\t};\n\tif (!Number.isFinite(resolved.maxEntries) || !Number.isInteger(resolved.maxEntries) || resolved.maxEntries <= 0 ||\n\t\t!Number.isFinite(resolved.maxBytes) || !Number.isInteger(resolved.maxBytes) || resolved.maxBytes <= 0) {\n\t\tthrow new Error(\"Fetched content cache limits must be finite positive integers\");\n\t}\n\treturn resolved;\n}\n\nfunction enforceDirectoryMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o700);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction enforceFileMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o600);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction safeFetchCacheDir(create: true): string;\nfunction safeFetchCacheDir(create: false): string | null;\nfunction safeFetchCacheDir(create: boolean): string | null {\n\tconst dir = getFetchCacheDir();\n\tif (create) mkdirSync(dir, { recursive: true, mode: 0o700 });\n\tlet before: Stats;\n\ttry {\n\t\tbefore = lstatSync(dir);\n\t} catch (err) {\n\t\tif (!create && (err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow err;\n\t}\n\tif (before.isSymbolicLink() || !before.isDirectory()) {\n\t\tthrow new Error(\"Fetched content cache path is not a safe directory\");\n\t}\n\tif (process.platform === \"win32\") {\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t}\n\tlet fd: number | null = null;\n\ttry {\n\t\tfd = openSync(dir, constants.O_RDONLY | O_DIRECTORY | O_NOFOLLOW);\n\t\tconst opened = fstatSync(fd);\n\t\tif (!opened.isDirectory() || opened.dev !== before.dev || opened.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while opening\");\n\t\t}\n\t\tenforceDirectoryMode(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nfunction openRegularFile(path: string): { fd: number; info: Stats } {\n\tconst before = lstatSync(path);\n\tif (before.isSymbolicLink() || !before.isFile()) throw new Error(\"Fetched content cache entry is not a regular file\");\n\tconst fd = openSync(path, constants.O_RDONLY | O_NOFOLLOW);\n\ttry {\n\t\tconst info = fstatSync(fd);\n\t\tif (!info.isFile() || info.dev !== before.dev || info.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed while opening\");\n\t\t}\n\t\treturn { fd, info };\n\t} catch (err) {\n\t\tcloseSync(fd);\n\t\tthrow err;\n\t}\n}\n\ntype CacheUnlinkResult = \"removed\" | \"missing\" | \"changed\" | \"error\";\n\nfunction unlinkCacheFile(dir: string, file: CacheFile): CacheUnlinkResult {\n\ttry {\n\t\tconst root = lstatSync(dir);\n\t\tif (root.isSymbolicLink() || !root.isDirectory()) return \"changed\";\n\t\tconst path = join(dir, file.name);\n\t\tlet current: Stats;\n\t\ttry {\n\t\t\tcurrent = lstatSync(path);\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t\tif (current.isSymbolicLink() || !current.isFile() || current.dev !== file.dev || current.ino !== file.ino) return \"changed\";\n\t\ttry {\n\t\t\tunlinkSync(path);\n\t\t\treturn \"removed\";\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t} catch {\n\t\treturn \"error\";\n\t}\n}\n\nfunction pruneFetchCache(now: number, limits: FetchCacheLimits, preferredKey?: string, reservation?: { key: string; bytes: number }): boolean {\n\tlet dir: string | null;\n\ttry {\n\t\tdir = safeFetchCacheDir(false);\n\t} catch {\n\t\treturn false;\n\t}\n\tif (!dir) return true;\n\n\tlet entries: string[];\n\ttry {\n\t\tentries = readdirSync(dir);\n\t} catch {\n\t\treturn false;\n\t}\n\n\tconst files: CacheFile[] = [];\n\tfor (const entry of entries) {\n\t\tif (!CACHE_KEY_PATTERN.test(entry) && !CACHE_TMP_PATTERN.test(entry)) continue;\n\t\tconst path = join(dir, entry);\n\t\tlet opened: ReturnType<typeof openRegularFile>;\n\t\ttry {\n\t\t\topened = openRegularFile(path);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tenforceFileMode(opened.fd);\n\t\t} catch {\n\t\t\tcloseSync(opened.fd);\n\t\t\tcontinue;\n\t\t}\n\t\tcloseSync(opened.fd);\n\t\tconst file = { name: entry, size: opened.info.size, mtimeMs: opened.info.mtimeMs, dev: opened.info.dev, ino: opened.info.ino };\n\t\tif (now - file.mtimeMs >= CACHE_TTL_MS) {\n\t\t\tconst removed = unlinkCacheFile(dir, file);\n\t\t\tif (removed !== \"removed\" && removed !== \"missing\") return false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (CACHE_KEY_PATTERN.test(entry)) files.push(file);\n\t}\n\n\tfiles.sort((a, b) => a.mtimeMs - b.mtimeMs || a.name.localeCompare(b.name));\n\tconst projectedUsage = () => {\n\t\tconst replaced = reservation ? files.find((file) => file.name === reservation.key) : undefined;\n\t\treturn {\n\t\t\tentries: files.length + (reservation && !replaced ? 1 : 0),\n\t\t\tbytes: files.reduce((total, file) => total + file.size, 0) + (reservation ? reservation.bytes - (replaced?.size ?? 0) : 0),\n\t\t};\n\t};\n\tconst attempted = new Set<string>();\n\tlet usage = projectedUsage();\n\twhile (usage.entries > limits.maxEntries || usage.bytes > limits.maxBytes) {\n\t\tconst index = files.findIndex((file) => file.name !== preferredKey && !attempted.has(file.name));\n\t\tif (index < 0) break;\n\t\tconst file = files[index];\n\t\tattempted.add(file.name);\n\t\tconst removed = unlinkCacheFile(dir, file);\n\t\tif (removed === \"removed\" || removed === \"missing\") files.splice(index, 1);\n\t\tusage = projectedUsage();\n\t}\n\treturn usage.entries <= limits.maxEntries && usage.bytes <= limits.maxBytes;\n}\n\nfunction writeFetchCache(data: StoredSearchData & { urls: ExtractedContent[] }): FetchCacheRef {\n\tconst limits = DEFAULT_CACHE_LIMITS;\n\tconst serialized = JSON.stringify(data);\n\tconst size = Buffer.byteLength(serialized);\n\tif (size > limits.maxBytes) throw new Error(`Fetched content cache entry exceeds ${limits.maxBytes} bytes`);\n\n\tconst dir = safeFetchCacheDir(true);\n\tconst key = cacheKeyForId(data.id);\n\tif (!pruneFetchCache(Date.now(), limits, key, { key, bytes: size })) {\n\t\tthrow new Error(\"Fetched content cache could not reserve space for a new entry\");\n\t}\n\tconst finalPath = join(dir, key);\n\tconst tmpName = `${key}.${process.pid}.${Date.now()}.${randomBytes(16).toString(\"hex\")}.tmp`;\n\tconst tmpPath = join(dir, tmpName);\n\tlet fd: number | null = null;\n\tlet tmpFile: CacheFile | null = null;\n\tlet renamed = false;\n\ttry {\n\t\tfd = openSync(tmpPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | O_NOFOLLOW, 0o600);\n\t\tconst tmpInfo = fstatSync(fd);\n\t\ttmpFile = { name: tmpName, size: tmpInfo.size, mtimeMs: tmpInfo.mtimeMs, dev: tmpInfo.dev, ino: tmpInfo.ino };\n\t\tenforceFileMode(fd);\n\t\twriteFileSync(fd, serialized, \"utf8\");\n\t\tfsyncSync(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tsafeFetchCacheDir(false);\n\t\trenameSync(tmpPath, finalPath);\n\t\trenamed = true;\n\t\tconst written = lstatSync(finalPath);\n\t\tif (!written.isFile() || written.dev !== tmpFile.dev || written.ino !== tmpFile.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed after writing\");\n\t\t}\n\t\tif (!pruneFetchCache(Date.now(), limits, key)) {\n\t\t\tthrow new Error(\"Fetched content cache could not meet its limits after writing\");\n\t\t}\n\t} catch (err) {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t\tif (tmpFile) unlinkCacheFile(dir, { ...tmpFile, name: renamed ? key : tmpName });\n\t\tthrow err;\n\t}\n\treturn { version: FETCH_CACHE_VERSION, key, storedAt: Date.now() };\n}\n\nfunction cacheWriteError(err: unknown): string {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn `Failed to write fetched content cache: ${message}`;\n}\n\nfunction createFetchSessionData(data: StoredSearchData & { urls: ExtractedContent[] }, ref: FetchCacheRef | null, cacheError?: string): StoredSearchData {\n\treturn {\n\t\tid: data.id,\n\t\ttype: \"fetch\",\n\t\ttimestamp: data.timestamp,\n\t\turlMetadata: metadataForUrls(data.urls),\n\t\t...(ref ? { fetchCache: ref } : {}),\n\t\t...(cacheError ? { fetchCacheError: truncateMetadataText(cacheError) } : {}),\n\t};\n}\n\nfunction fetchUrlMetadata(data: StoredSearchData): StoredFetchUrlMetadata[] {\n\tif (data.urlMetadata) return data.urlMetadata;\n\treturn isInlineFetchData(data) ? metadataForUrls(data.urls) : [];\n}\n\nfunction unavailableFetchData(data: StoredSearchData, reason: string): StoredSearchData {\n\treturn {\n\t\t...data,\n\t\turls: fetchUrlMetadata(data).map((meta) => ({\n\t\t\turl: meta.url,\n\t\t\ttitle: meta.title,\n\t\t\tcontent: \"\",\n\t\t\terror: reason,\n\t\t\t...(meta.mimeType ? { mimeType: meta.mimeType } : {}),\n\t\t\t...(typeof meta.status === \"number\" ? { status: meta.status } : {}),\n\t\t\t...(typeof meta.duration === \"number\" ? { duration: meta.duration } : {}),\n\t\t})),\n\t};\n}\n\nfunction readCachedFetchData(data: StoredSearchData, now = Date.now()): StoredSearchData {\n\tif (data.type !== \"fetch\") return data;\n\tif (now - data.timestamp >= CACHE_TTL_MS) {\n\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t}\n\tif (isInlineFetchData(data)) return data;\n\tif (!data.fetchCache) {\n\t\treturn unavailableFetchData(data, data.fetchCacheError ?? \"Cached fetched content is unavailable\");\n\t}\n\tconst path = fetchCachePath(data.fetchCache.key);\n\tif (!path) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\tlet fd: number | null = null;\n\ttry {\n\t\tif (!safeFetchCacheDir(false)) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\tconst opened = openRegularFile(path);\n\t\tfd = opened.fd;\n\t\tenforceFileMode(fd);\n\t\tconst parsed: unknown = JSON.parse(readFileSync(fd, \"utf8\"));\n\t\tif (!isValidStoredData(parsed) || parsed.type !== \"fetch\" || parsed.id !== data.id || !isInlineFetchData(parsed)) {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is invalid\");\n\t\t}\n\t\treturn { ...parsed, fetchCache: data.fetchCache, urlMetadata: data.urlMetadata };\n\t} catch (err) {\n\t\tif ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\t}\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn unavailableFetchData(data, `Cached fetched content could not be read: ${message}`);\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nfunction pruneExpiredFetchedResults(now: number): void {\n\tfor (const [id, data] of storedResults) {\n\t\tif (data.type === \"fetch\" && now - data.timestamp >= CACHE_TTL_MS) {\n\t\t\tstoredResults.set(id, unavailableFetchData(data, \"Cached fetched content is missing or expired\"));\n\t\t}\n\t}\n}\n\nexport function pruneExpiredFetchCache(now = Date.now(), requestedLimits?: Partial<FetchCacheLimits>): void {\n\tconst limits = cacheLimits(requestedLimits);\n\tpruneExpiredFetchedResults(now);\n\ttry { pruneFetchCache(now, limits); } catch {}\n}\n\nexport function storeResult(id: string, data: StoredSearchData): void {\n\tstoredResults.set(id, data);\n}\n\nexport function storeFetchedContentResult(id: string, data: StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] }): StoredSearchData {\n\tpruneExpiredFetchedResults(Date.now());\n\tlet ref: FetchCacheRef | null = null;\n\tlet cacheError: string | undefined;\n\ttry {\n\t\tref = writeFetchCache(data);\n\t} catch (err) {\n\t\tcacheError = cacheWriteError(err);\n\t}\n\tstoredResults.set(id, ref ? { ...data, fetchCache: ref, urlMetadata: metadataForUrls(data.urls) } : { ...data, fetchCacheError: cacheError });\n\treturn createFetchSessionData(data, ref, cacheError);\n}\n\nexport function getResult(id: string): StoredSearchData | null {\n\tconst data = storedResults.get(id);\n\tif (!data) return null;\n\tconst loaded = readCachedFetchData(data);\n\tif (loaded !== data) storedResults.set(id, loaded);\n\treturn loaded;\n}\n\nexport function getAllResults(): StoredSearchData[] {\n\treturn Array.from(storedResults.values());\n}\n\nexport function deleteResult(id: string): boolean {\n\tconst data = storedResults.get(id);\n\tif (data?.fetchCache) {\n\t\ttry {\n\t\t\tconst dir = safeFetchCacheDir(false);\n\t\t\tconst path = fetchCachePath(data.fetchCache.key);\n\t\t\tif (dir && path) {\n\t\t\t\tconst info = lstatSync(path);\n\t\t\t\tif (!info.isSymbolicLink() && info.isFile()) {\n\t\t\t\t\tunlinkCacheFile(dir, { name: data.fetchCache.key, size: info.size, mtimeMs: info.mtimeMs, dev: info.dev, ino: info.ino });\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\treturn storedResults.delete(id);\n}\n\nexport function clearResults(): void {\n\tstoredResults.clear();\n}\n\nfunction isValidStoredData(data: unknown): data is StoredSearchData {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Record<string, unknown>;\n\tif (typeof d.id !== \"string\" || !d.id) return false;\n\tif (d.type !== \"search\" && d.type !== \"fetch\" && d.type !== \"research\") return false;\n\tif (typeof d.timestamp !== \"number\") return false;\n\tif (d.type === \"search\" && !Array.isArray(d.queries)) return false;\n\tif (d.type === \"fetch\") {\n\t\tif (Array.isArray(d.urls)) return d.urls.every(isInlineFetchedUrl);\n\t\tif (!Array.isArray(d.urlMetadata) || !d.urlMetadata.every(isStoredFetchUrlMetadata)) return false;\n\t\treturn d.fetchCache === undefined ? d.fetchCacheError === undefined || typeof d.fetchCacheError === \"string\" : isFetchCacheRef(d.fetchCache);\n\t}\n\tif (d.type === \"research\" && (!d.artifact || typeof d.artifact !== \"object\")) return false;\n\treturn true;\n}\n\nexport function restoreFromSession(ctx: ExtensionContext): void {\n\tstoredResults.clear();\n\tconst now = Date.now();\n\tpruneExpiredFetchCache(now);\n\n\tfor (const entry of ctx.sessionManager.getBranch()) {\n\t\tif (entry.type === \"custom\" && entry.customType === \"web-search-results\") {\n\t\t\tconst data = entry.data;\n\t\t\tif (isValidStoredData(data) && now - data.timestamp < CACHE_TTL_MS) {\n\t\t\t\tstoredResults.set(data.id, data);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { complete } from "@earendil-works/pi-ai/compat";
|
|
1
|
+
import type { complete } from "@earendil-works/pi-ai/compat";
|
|
2
2
|
import type { ExtensionContext } from "../host.ts";
|
|
3
3
|
import type { QueryResultData } from "./storage.ts";
|
|
4
4
|
type CompleteFunction = typeof complete;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-review.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,
|
|
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;AAEnD,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,KAAK,GAAG,kBAAkB,CAAC,CAAC;AAiCtH,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,CAmJjD"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { clampThinkingLevel } from "@earendil-works/pi-ai";
|
|
2
|
-
import { complete, completeSimple } from "@earendil-works/pi-ai/compat";
|
|
3
1
|
import { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix } from "./summary-model-scope.js";
|
|
4
2
|
const PREFERRED_SUMMARY_MODELS = [
|
|
5
3
|
{ provider: "anthropic", id: "claude-haiku-4-5" },
|
|
@@ -161,9 +159,10 @@ function parseModelSelector(value) {
|
|
|
161
159
|
thinkingLevel: selector.thinkingLevel,
|
|
162
160
|
};
|
|
163
161
|
}
|
|
164
|
-
function resolveThinkingLevel(model, requested) {
|
|
162
|
+
async function resolveThinkingLevel(model, requested) {
|
|
165
163
|
if (!requested)
|
|
166
164
|
return undefined;
|
|
165
|
+
const { clampThinkingLevel } = await import("@earendil-works/pi-ai");
|
|
167
166
|
return clampThinkingLevel(model, requested);
|
|
168
167
|
}
|
|
169
168
|
async function resolveSummaryModelCandidates(ctx, modelOverride) {
|
|
@@ -237,20 +236,20 @@ export async function generateSummaryDraft(results, ctx, signal, modelOverride,
|
|
|
237
236
|
if (!ctx || !ctx.modelRegistry) {
|
|
238
237
|
throw new Error("Summary generation context unavailable");
|
|
239
238
|
}
|
|
239
|
+
if (signal?.aborted)
|
|
240
|
+
throw new Error("Aborted");
|
|
240
241
|
const registry = ctx.modelRegistry;
|
|
241
242
|
const customCompleteFn = completeFn !== undefined;
|
|
242
243
|
const usesRegistryComplete = !customCompleteFn && typeof registry.complete === "function";
|
|
243
|
-
|
|
244
|
+
let piAiCompat;
|
|
244
245
|
const generationStartedAt = Date.now();
|
|
245
246
|
const deadlineController = new AbortController();
|
|
246
247
|
const deadlineMarker = Symbol("summary-generation-deadline");
|
|
247
248
|
let deadlineTimer;
|
|
248
|
-
let resolveDeadline;
|
|
249
249
|
const deadlinePromise = new Promise(resolve => {
|
|
250
|
-
resolveDeadline = () => resolve(deadlineMarker);
|
|
251
250
|
deadlineTimer = setTimeout(() => {
|
|
252
251
|
deadlineController.abort();
|
|
253
|
-
|
|
252
|
+
resolve(deadlineMarker);
|
|
254
253
|
}, deadlineMs);
|
|
255
254
|
});
|
|
256
255
|
let callerAbortListener;
|
|
@@ -266,19 +265,25 @@ export async function generateSummaryDraft(results, ctx, signal, modelOverride,
|
|
|
266
265
|
const completionSignal = signal
|
|
267
266
|
? AbortSignal.any([signal, deadlineController.signal])
|
|
268
267
|
: deadlineController.signal;
|
|
268
|
+
function checkSummaryDeadline() {
|
|
269
|
+
if (signal?.aborted)
|
|
270
|
+
throw new Error("Aborted");
|
|
271
|
+
// Imports or synchronous providers can finish before an overdue timer runs.
|
|
272
|
+
if (deadlineController.signal.aborted || Date.now() - generationStartedAt >= deadlineMs) {
|
|
273
|
+
deadlineController.abort();
|
|
274
|
+
throw deadlineMarker;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
269
277
|
async function raceSummaryOperation(operation) {
|
|
270
278
|
// A provider may ignore AbortSignal and never settle; observe it before racing so
|
|
271
279
|
// its eventual rejection cannot become an unhandled promise rejection.
|
|
272
280
|
void operation.then(() => undefined, () => undefined);
|
|
281
|
+
checkSummaryDeadline();
|
|
273
282
|
const contenders = [operation, deadlinePromise];
|
|
274
283
|
if (callerAbortPromise)
|
|
275
284
|
contenders.push(callerAbortPromise);
|
|
276
285
|
const result = await Promise.race(contenders);
|
|
277
|
-
|
|
278
|
-
if (signal?.aborted)
|
|
279
|
-
throw new Error("Aborted");
|
|
280
|
-
throw deadlineMarker;
|
|
281
|
-
}
|
|
286
|
+
checkSummaryDeadline();
|
|
282
287
|
return result;
|
|
283
288
|
}
|
|
284
289
|
try {
|
|
@@ -287,14 +292,15 @@ export async function generateSummaryDraft(results, ctx, signal, modelOverride,
|
|
|
287
292
|
const prompt = buildSummaryPrompt(results, feedback);
|
|
288
293
|
let resolved;
|
|
289
294
|
try {
|
|
295
|
+
checkSummaryDeadline();
|
|
296
|
+
if (!customCompleteFn && !usesRegistryComplete) {
|
|
297
|
+
piAiCompat = await raceSummaryOperation(import("@earendil-works/pi-ai/compat"));
|
|
298
|
+
}
|
|
299
|
+
completeFn ??= usesRegistryComplete ? registry.complete.bind(registry) : piAiCompat.complete;
|
|
290
300
|
resolved = await raceSummaryOperation(resolveSummaryModelCandidates(ctx, modelOverride));
|
|
291
301
|
}
|
|
292
302
|
catch (err) {
|
|
293
|
-
|
|
294
|
-
throw new Error("Aborted");
|
|
295
|
-
if (err === deadlineMarker || deadlineController.signal.aborted) {
|
|
296
|
-
return buildFallbackSummary(results, "summary-generation-timeout", Date.now() - generationStartedAt);
|
|
297
|
-
}
|
|
303
|
+
checkSummaryDeadline();
|
|
298
304
|
const message = err instanceof Error ? err.message : String(err);
|
|
299
305
|
return buildFallbackSummary(results, `summary-model-settings-error: ${message}`, Date.now() - generationStartedAt);
|
|
300
306
|
}
|
|
@@ -307,7 +313,7 @@ export async function generateSummaryDraft(results, ctx, signal, modelOverride,
|
|
|
307
313
|
content: [{ type: "text", text: prompt }],
|
|
308
314
|
timestamp: Date.now(),
|
|
309
315
|
};
|
|
310
|
-
const requestedThinkingLevel = resolveThinkingLevel(model, thinkingLevel);
|
|
316
|
+
const requestedThinkingLevel = await raceSummaryOperation(resolveThinkingLevel(model, thinkingLevel));
|
|
311
317
|
const enabledThinkingLevel = requestedThinkingLevel && requestedThinkingLevel !== "off"
|
|
312
318
|
? requestedThinkingLevel
|
|
313
319
|
: undefined;
|
|
@@ -317,8 +323,9 @@ export async function generateSummaryDraft(results, ctx, signal, modelOverride,
|
|
|
317
323
|
...(requestedThinkingLevel ? { reasoning: requestedThinkingLevel } : {}),
|
|
318
324
|
...(enabledThinkingLevel ? { reasoningEffort: enabledThinkingLevel } : {}),
|
|
319
325
|
};
|
|
326
|
+
checkSummaryDeadline();
|
|
320
327
|
const completion = thinkingLevel !== undefined && !customCompleteFn && !usesRegistryComplete
|
|
321
|
-
? completeSimple(model, { messages: [userMessage] }, { apiKey, headers, signal: completionSignal, ...(enabledThinkingLevel ? { reasoning: enabledThinkingLevel } : {}) })
|
|
328
|
+
? piAiCompat.completeSimple(model, { messages: [userMessage] }, { apiKey, headers, signal: completionSignal, ...(enabledThinkingLevel ? { reasoning: enabledThinkingLevel } : {}) })
|
|
322
329
|
: completeFn(model, { messages: [userMessage] }, completionOptions);
|
|
323
330
|
const response = await raceSummaryOperation(Promise.resolve(completion));
|
|
324
331
|
if (response.stopReason === "aborted") {
|
|
@@ -348,11 +355,7 @@ export async function generateSummaryDraft(results, ctx, signal, modelOverride,
|
|
|
348
355
|
};
|
|
349
356
|
}
|
|
350
357
|
catch (err) {
|
|
351
|
-
|
|
352
|
-
throw new Error("Aborted");
|
|
353
|
-
if (err === deadlineMarker || deadlineController.signal.aborted) {
|
|
354
|
-
return buildFallbackSummary(results, "summary-generation-timeout", Date.now() - generationStartedAt);
|
|
355
|
-
}
|
|
358
|
+
checkSummaryDeadline();
|
|
356
359
|
if (isAbortError(err))
|
|
357
360
|
throw err;
|
|
358
361
|
lastError = err instanceof Error ? err.message : String(err);
|
|
@@ -360,6 +363,14 @@ export async function generateSummaryDraft(results, ctx, signal, modelOverride,
|
|
|
360
363
|
}
|
|
361
364
|
return buildFallbackSummary(results, lastError ? `summary-model-unavailable: ${lastError}` : "summary-model-unavailable", Date.now() - generationStartedAt);
|
|
362
365
|
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
if (signal?.aborted)
|
|
368
|
+
throw new Error("Aborted");
|
|
369
|
+
if (err === deadlineMarker) {
|
|
370
|
+
return buildFallbackSummary(results, "summary-generation-timeout", Date.now() - generationStartedAt);
|
|
371
|
+
}
|
|
372
|
+
throw err;
|
|
373
|
+
}
|
|
363
374
|
finally {
|
|
364
375
|
if (deadlineTimer)
|
|
365
376
|
clearTimeout(deadlineTimer);
|
|
@@ -1 +1 @@
|
|
|
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 { clampThinkingLevel, type ModelThinkingLevel, type ThinkingLevel } from \"@earendil-works/pi-ai\";\nimport { complete, completeSimple, type Api, type Message, type 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\nfunction resolveThinkingLevel(model: Model<Api>, requested?: SummaryThinkingLevel): ModelThinkingLevel | undefined {\n\tif (!requested) return undefined;\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\n\tconst registry = ctx.modelRegistry as SummaryModelRegistry;\n\tconst customCompleteFn = completeFn !== undefined;\n\tconst usesRegistryComplete = !customCompleteFn && typeof registry.complete === \"function\";\n\tcompleteFn ??= usesRegistryComplete ? registry.complete!.bind(registry) as CompleteFunction : complete;\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\tlet resolveDeadline!: () => void;\n\tconst deadlinePromise = new Promise<typeof deadlineMarker>(resolve => {\n\t\tresolveDeadline = () => resolve(deadlineMarker);\n\t\tdeadlineTimer = setTimeout(() => {\n\t\t\tdeadlineController.abort();\n\t\t\tresolveDeadline();\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\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\tconst contenders: Promise<unknown>[] = [operation, deadlinePromise];\n\t\tif (callerAbortPromise) contenders.push(callerAbortPromise);\n\t\tconst result = await Promise.race(contenders);\n\t\tif (result === deadlineMarker) {\n\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\tthrow deadlineMarker;\n\t\t}\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\tresolved = await raceSummaryOperation(resolveSummaryModelCandidates(ctx, modelOverride));\n\t\t} catch (err) {\n\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\tif (err === deadlineMarker || deadlineController.signal.aborted) {\n\t\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t\t}\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 = 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\tconst completion = thinkingLevel !== undefined && !customCompleteFn && !usesRegistryComplete\n\t\t\t\t\t? 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\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\t\tif (err === deadlineMarker || deadlineController.signal.aborted) {\n\t\t\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t\t\t}\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} 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 { 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"AAQA,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,UAAU,iBAAiB;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAgCpE;AAMD,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAClC,OAAO,CAAC,QAAQ,CAAC,CAmCnB;AAED,MAAM,WAAW,oBAAoB;IACpC,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAUD,kFAAkF;AAClF,wBAAgB,2BAA2B,IAAI,oBAAoB,CAyBlE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAa9F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAOpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAOnD;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"AAQA,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,UAAU,iBAAiB;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAgCpE;AAMD,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAClC,OAAO,CAAC,QAAQ,CAAC,CAmCnB;AAED,MAAM,WAAW,oBAAoB;IACpC,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAUD,kFAAkF;AAClF,wBAAgB,2BAA2B,IAAI,oBAAoB,CAyBlE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAa9F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAOpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAOnD;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB/E;AA0BD,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAKzE;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAkBD,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAMpD;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACtD,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAOD,4GAA4G;AAC5G,wBAAgB,uBAAuB,IAAI,IAAI,CAsB9C"}
|
|
@@ -166,7 +166,7 @@ export function normalizeProxyUrl(value, source) {
|
|
|
166
166
|
if (value === undefined || value === null)
|
|
167
167
|
return null;
|
|
168
168
|
if (typeof value !== "string")
|
|
169
|
-
throw new Error(`${source} must be an http(s) proxy URL string`);
|
|
169
|
+
throw new Error(`${source} must be an http(s) or socks proxy URL string`);
|
|
170
170
|
const trimmed = value.trim();
|
|
171
171
|
if (!trimmed)
|
|
172
172
|
return null;
|
|
@@ -177,8 +177,10 @@ export function normalizeProxyUrl(value, source) {
|
|
|
177
177
|
catch {
|
|
178
178
|
throw new Error(`${source} must be a valid proxy URL: ${JSON.stringify(trimmed)}`);
|
|
179
179
|
}
|
|
180
|
-
if (parsed.protocol !== "http:" && parsed.protocol !== "https:"
|
|
181
|
-
|
|
180
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:" &&
|
|
181
|
+
parsed.protocol !== "socks4:" && parsed.protocol !== "socks4a:" &&
|
|
182
|
+
parsed.protocol !== "socks5:" && parsed.protocol !== "socks5h:") {
|
|
183
|
+
throw new Error(`${source} must use the http://, https://, or socks scheme: ${trimmed}`);
|
|
182
184
|
}
|
|
183
185
|
if (!parsed.hostname)
|
|
184
186
|
throw new Error(`${source} must include a proxy host: ${trimmed}`);
|