@asterxsk/kiln 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +170 -170
- package/agent/AGENTS.md +67 -67
- package/agent/README.md +5 -5
- package/agent/extensions/AGENTS.md +68 -68
- package/agent/extensions/ask-user/index.ts +418 -418
- package/agent/extensions/ask-user/package-lock.json +769 -769
- package/agent/extensions/ask-user/package.json +19 -19
- package/agent/extensions/ask-user/prompt.ts +45 -45
- package/agent/extensions/ask-user/tsconfig.json +7 -7
- package/agent/extensions/background-terminals/docs/implementation-guide.md +942 -942
- package/agent/extensions/background-terminals/index.ts +627 -627
- package/agent/extensions/background-terminals/manager.test.ts +735 -735
- package/agent/extensions/background-terminals/output.test.ts +109 -109
- package/agent/extensions/background-terminals/package-lock.json +769 -769
- package/agent/extensions/background-terminals/package.json +17 -17
- package/agent/extensions/background-terminals/prompt.test.ts +125 -125
- package/agent/extensions/background-terminals/ps.test.ts +82 -82
- package/agent/extensions/background-terminals/result-delivery.test.ts +44 -44
- package/agent/extensions/background-terminals/src/domain.ts +87 -87
- package/agent/extensions/background-terminals/src/manager.ts +907 -907
- package/agent/extensions/background-terminals/src/output.ts +84 -84
- package/agent/extensions/background-terminals/src/prompt.ts +142 -142
- package/agent/extensions/background-terminals/src/result-delivery.ts +27 -27
- package/agent/extensions/background-terminals/src/runtime.ts +36 -36
- package/agent/extensions/background-terminals/src/ui/output-view.ts +79 -79
- package/agent/extensions/background-terminals/src/ui/ps.ts +621 -621
- package/agent/extensions/background-terminals/tsconfig.json +7 -7
- package/agent/extensions/file-search/index.spec.ts +443 -443
- package/agent/extensions/file-search/index.ts +459 -459
- package/agent/extensions/file-search/package-lock.json +2253 -2253
- package/agent/extensions/file-search/package.json +23 -23
- package/agent/extensions/file-search/src/args.ts +122 -122
- package/agent/extensions/file-search/src/binaries.ts +422 -422
- package/agent/extensions/file-search/src/output.ts +126 -126
- package/agent/extensions/file-search/src/process.ts +146 -146
- package/agent/extensions/file-search/src/prompt.ts +52 -52
- package/agent/extensions/file-search/tsconfig.json +7 -7
- package/agent/extensions/modelconf/PLAN.md +915 -915
- package/agent/extensions/modelconf/index.ts +296 -296
- package/agent/extensions/modelconf/src/ui/ModelConfView.ts +1101 -1101
- package/agent/extensions/pi-web-access/CHANGELOG.md +690 -690
- package/agent/extensions/pi-web-access/LICENSE +21 -21
- package/agent/extensions/pi-web-access/README.md +470 -470
- package/agent/extensions/pi-web-access/SECURITY.md +5 -5
- package/agent/extensions/pi-web-access/activity.ts +101 -101
- package/agent/extensions/pi-web-access/auth-fetch.ts +148 -148
- package/agent/extensions/pi-web-access/brightdata-unlocker.ts +272 -272
- package/agent/extensions/pi-web-access/chrome-cookies.ts +669 -669
- package/agent/extensions/pi-web-access/content-find.ts +139 -139
- package/agent/extensions/pi-web-access/credential-source.ts +191 -191
- package/agent/extensions/pi-web-access/data-uri-sanitize.ts +406 -406
- package/agent/extensions/pi-web-access/datalab-pdf-extract.ts +568 -568
- package/agent/extensions/pi-web-access/declared-web-links.ts +173 -173
- package/agent/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +496 -496
- package/agent/extensions/pi-web-access/evidence/contract-probe.mjs +140 -140
- package/agent/extensions/pi-web-access/exa.ts +526 -526
- package/agent/extensions/pi-web-access/extract.ts +1196 -1196
- package/agent/extensions/pi-web-access/feature-config.ts +29 -29
- package/agent/extensions/pi-web-access/fetch-params.ts +111 -111
- package/agent/extensions/pi-web-access/gemini-adc.ts +298 -298
- package/agent/extensions/pi-web-access/gemini-api.ts +353 -353
- package/agent/extensions/pi-web-access/gemini-pdf-extract.ts +108 -108
- package/agent/extensions/pi-web-access/gemini-url-context.ts +128 -128
- package/agent/extensions/pi-web-access/gemini-web-config.ts +101 -101
- package/agent/extensions/pi-web-access/gemini-web.ts +487 -487
- package/agent/extensions/pi-web-access/github-api.ts +197 -197
- package/agent/extensions/pi-web-access/github-extract.ts +746 -746
- package/agent/extensions/pi-web-access/github-issue-pr.ts +700 -700
- package/agent/extensions/pi-web-access/index.ts +1737 -1737
- package/agent/extensions/pi-web-access/package-lock.json +5808 -5808
- package/agent/extensions/pi-web-access/package.json +64 -64
- package/agent/extensions/pi-web-access/page-query.ts +96 -96
- package/agent/extensions/pi-web-access/pdf-extract.ts +409 -409
- package/agent/extensions/pi-web-access/promise-try.d.ts +7 -7
- package/agent/extensions/pi-web-access/query-rewrite.ts +51 -51
- package/agent/extensions/pi-web-access/render-search-error.ts +170 -170
- package/agent/extensions/pi-web-access/rsc-extract.ts +338 -338
- package/agent/extensions/pi-web-access/source-check.ts +282 -282
- package/agent/extensions/pi-web-access/ssrf-protection.ts +526 -526
- package/agent/extensions/pi-web-access/storage.ts +521 -521
- package/agent/extensions/pi-web-access/summary-model-scope.ts +125 -125
- package/agent/extensions/pi-web-access/test/auth-fetch.test.mjs +208 -208
- package/agent/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +840 -840
- package/agent/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +441 -441
- package/agent/extensions/pi-web-access/test/config-path.test.mjs +283 -283
- package/agent/extensions/pi-web-access/test/content-find.test.mjs +25 -25
- package/agent/extensions/pi-web-access/test/credential-source.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +210 -210
- package/agent/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +552 -552
- package/agent/extensions/pi-web-access/test/declared-web-links.test.mjs +212 -212
- package/agent/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +40 -40
- package/agent/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +334 -334
- package/agent/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +95 -95
- package/agent/extensions/pi-web-access/test/fetch-modes.test.mjs +53 -53
- package/agent/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +92 -92
- package/agent/extensions/pi-web-access/test/fetch-params.test.mjs +86 -86
- package/agent/extensions/pi-web-access/test/fetch-render-call.test.mjs +34 -34
- package/agent/extensions/pi-web-access/test/fetch-routing.test.mjs +173 -173
- package/agent/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +257 -257
- package/agent/extensions/pi-web-access/test/gemini-api-transport.test.mjs +170 -170
- package/agent/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +133 -133
- package/agent/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +178 -178
- package/agent/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +148 -148
- package/agent/extensions/pi-web-access/test/get-search-content.test.mjs +223 -223
- package/agent/extensions/pi-web-access/test/github-extract.test.mjs +378 -378
- package/agent/extensions/pi-web-access/test/github-issue-pr.test.mjs +565 -565
- package/agent/extensions/pi-web-access/test/inline-content-config.test.mjs +99 -99
- package/agent/extensions/pi-web-access/test/lazy-extract-load.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/local-video-oversize.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +50 -50
- package/agent/extensions/pi-web-access/test/page-query.test.mjs +51 -51
- package/agent/extensions/pi-web-access/test/pdf-config.test.mjs +140 -140
- package/agent/extensions/pi-web-access/test/pdf-extract.test.mjs +500 -500
- package/agent/extensions/pi-web-access/test/proxy-transport.test.mjs +286 -286
- package/agent/extensions/pi-web-access/test/query-rewrite.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/rsc-fallback.test.mjs +102 -102
- package/agent/extensions/pi-web-access/test/search-error-render.test.mjs +152 -152
- package/agent/extensions/pi-web-access/test/search-providers.test.mjs +274 -274
- package/agent/extensions/pi-web-access/test/source-check.test.mjs +179 -179
- package/agent/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +205 -205
- package/agent/extensions/pi-web-access/test/ssrf-protection.test.mjs +456 -456
- package/agent/extensions/pi-web-access/test/tool-registration-config.test.mjs +182 -182
- package/agent/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +64 -64
- package/agent/extensions/pi-web-access/tsconfig.json +11 -11
- package/agent/extensions/pi-web-access/utils.ts +451 -451
- package/agent/extensions/pi-web-access/video-extract.ts +392 -392
- package/agent/extensions/pi-web-access/youtube-extract.ts +328 -328
- package/agent/extensions/shared/activity-status.ts +31 -31
- package/agent/extensions/shared/child-session.test.ts +270 -270
- package/agent/extensions/shared/child-session.ts +148 -148
- package/agent/extensions/shared/context-utilization.test.ts +48 -48
- package/agent/extensions/shared/context-utilization.ts +47 -47
- package/agent/extensions/shared/dashboard-state.ts +99 -99
- package/agent/extensions/shared/tool-call-timeout.test.ts +117 -117
- package/agent/extensions/shared/tool-call-timeout.ts +104 -104
- package/agent/extensions/subagents/by-the-way.test.ts +29 -29
- package/agent/extensions/subagents/claude.test.ts +119 -119
- package/agent/extensions/subagents/codex.test.ts +102 -102
- package/agent/extensions/subagents/context-usage.test.ts +107 -107
- package/agent/extensions/subagents/docs/design-plan.md +568 -568
- package/agent/extensions/subagents/docs/effect-v4-extension-guide.md +354 -354
- package/agent/extensions/subagents/docs/effect-v4-notes.md +571 -571
- package/agent/extensions/subagents/index.ts +779 -779
- package/agent/extensions/subagents/manager.test.ts +276 -276
- package/agent/extensions/subagents/package-lock.json +2244 -2244
- package/agent/extensions/subagents/package.json +19 -19
- package/agent/extensions/subagents/result-delivery.test.ts +27 -27
- package/agent/extensions/subagents/src/backend.ts +73 -73
- package/agent/extensions/subagents/src/backends/claude.ts +701 -701
- package/agent/extensions/subagents/src/backends/codex.ts +1060 -1060
- package/agent/extensions/subagents/src/backends/pi.ts +575 -575
- package/agent/extensions/subagents/src/backends/stub.ts +300 -300
- package/agent/extensions/subagents/src/by-the-way.ts +21 -21
- package/agent/extensions/subagents/src/domain.ts +253 -253
- package/agent/extensions/subagents/src/format.ts +74 -74
- package/agent/extensions/subagents/src/manager.ts +736 -736
- package/agent/extensions/subagents/src/prompt.ts +92 -92
- package/agent/extensions/subagents/src/result-delivery.ts +20 -20
- package/agent/extensions/subagents/src/runtime.ts +53 -53
- package/agent/extensions/subagents/src/ui/takeover.ts +583 -583
- package/agent/extensions/subagents/src/ui/transcript.ts +201 -201
- package/agent/extensions/subagents/takeover.test.ts +29 -29
- package/agent/extensions/subagents/tsconfig.json +7 -7
- package/agent/extensions/todo/AGENTS.md +38 -38
- package/agent/extensions/todo/LICENSE +21 -21
- package/agent/extensions/todo/config.ts +55 -55
- package/agent/extensions/todo/index.ts +151 -151
- package/agent/extensions/todo/locales/de.json +17 -17
- package/agent/extensions/todo/locales/en.json +15 -15
- package/agent/extensions/todo/locales/es.json +17 -17
- package/agent/extensions/todo/locales/fr.json +17 -17
- package/agent/extensions/todo/locales/pt-BR.json +17 -17
- package/agent/extensions/todo/locales/pt.json +17 -17
- package/agent/extensions/todo/locales/ru.json +17 -17
- package/agent/extensions/todo/locales/uk.json +17 -17
- package/agent/extensions/todo/locales/zh.json +17 -17
- package/agent/extensions/todo/package-lock.json +3358 -3358
- package/agent/extensions/todo/package.json +67 -67
- package/agent/extensions/todo/state/i18n-bridge.ts +64 -64
- package/agent/extensions/todo/state/invariants.ts +20 -20
- package/agent/extensions/todo/state/replay.ts +38 -38
- package/agent/extensions/todo/state/selectors.ts +107 -107
- package/agent/extensions/todo/state/state-reducer.ts +326 -326
- package/agent/extensions/todo/state/state.ts +18 -18
- package/agent/extensions/todo/state/store.ts +82 -82
- package/agent/extensions/todo/state/task-graph.ts +57 -57
- package/agent/extensions/todo/todo-overlay.ts +200 -200
- package/agent/extensions/todo/todo.ts +155 -155
- package/agent/extensions/todo/tool/response-envelope.ts +109 -109
- package/agent/extensions/todo/tool/types.ts +206 -206
- package/agent/extensions/todo/view/format.ts +177 -177
- package/agent/install.ps1 +637 -527
- package/agent/install.sh +620 -511
- package/agent/keybindings.json +7 -7
- package/bin/kiln.js +124 -11
- package/package.json +8 -2
- package/agent/extensions/taste/index.ts +0 -443
- package/agent/extensions/taste/install.ps1 +0 -23
- package/agent/extensions/taste/install.sh +0 -21
- /package/agent/extensions/{status line → statusline}/index.ts +0 -0
- /package/agent/extensions/{status line → statusline}/install.ps1 +0 -0
- /package/agent/extensions/{status line → statusline}/install.sh +0 -0
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import { getWebSearchConfigPath } from "./utils.ts";
|
|
3
|
-
|
|
4
|
-
const CONFIG_PATH = getWebSearchConfigPath();
|
|
5
|
-
|
|
6
|
-
type FeatureConfig = { image?: { enabled?: unknown } };
|
|
7
|
-
|
|
8
|
-
function loadFeatureConfig(): FeatureConfig {
|
|
9
|
-
if (!existsSync(CONFIG_PATH)) return {};
|
|
10
|
-
try {
|
|
11
|
-
const raw: unknown = JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
|
|
12
|
-
return raw && typeof raw === "object" ? raw as FeatureConfig : {};
|
|
13
|
-
} catch (err) {
|
|
14
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
15
|
-
throw new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function isImageEnabled(): boolean {
|
|
20
|
-
return loadFeatureConfig().image?.enabled !== false;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function canAttachImages(): boolean {
|
|
24
|
-
try {
|
|
25
|
-
return isImageEnabled();
|
|
26
|
-
} catch {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { getWebSearchConfigPath } from "./utils.ts";
|
|
3
|
+
|
|
4
|
+
const CONFIG_PATH = getWebSearchConfigPath();
|
|
5
|
+
|
|
6
|
+
type FeatureConfig = { image?: { enabled?: unknown } };
|
|
7
|
+
|
|
8
|
+
function loadFeatureConfig(): FeatureConfig {
|
|
9
|
+
if (!existsSync(CONFIG_PATH)) return {};
|
|
10
|
+
try {
|
|
11
|
+
const raw: unknown = JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
|
|
12
|
+
return raw && typeof raw === "object" ? raw as FeatureConfig : {};
|
|
13
|
+
} catch (err) {
|
|
14
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
15
|
+
throw new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function isImageEnabled(): boolean {
|
|
20
|
+
return loadFeatureConfig().image?.enabled !== false;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function canAttachImages(): boolean {
|
|
24
|
+
try {
|
|
25
|
+
return isImageEnabled();
|
|
26
|
+
} catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
import { normalizeProxyUrl } from "./utils.ts";
|
|
2
|
-
|
|
3
|
-
export interface FetchContentParams {
|
|
4
|
-
url?: unknown;
|
|
5
|
-
urls?: unknown;
|
|
6
|
-
forceClone?: unknown;
|
|
7
|
-
prompt?: unknown;
|
|
8
|
-
timestamp?: unknown;
|
|
9
|
-
frames?: unknown;
|
|
10
|
-
model?: unknown;
|
|
11
|
-
mode?: unknown;
|
|
12
|
-
answerModel?: unknown;
|
|
13
|
-
auth?: unknown;
|
|
14
|
-
proxy?: unknown;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface NormalizedFetchContentParams {
|
|
18
|
-
urlList: string[];
|
|
19
|
-
options: {
|
|
20
|
-
forceClone?: boolean;
|
|
21
|
-
prompt?: string;
|
|
22
|
-
timestamp?: string;
|
|
23
|
-
frames?: number;
|
|
24
|
-
model?: string;
|
|
25
|
-
mode?: "readable" | "raw" | "answer";
|
|
26
|
-
answerModel?: string;
|
|
27
|
-
auth?: true | string;
|
|
28
|
-
proxy?: string;
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function normalizeFetchContentParams(params: FetchContentParams): NormalizedFetchContentParams {
|
|
33
|
-
const normalizedUrls = uniqueUrls(normalizeUrlArray(params.urls));
|
|
34
|
-
const urlList = normalizedUrls.length > 0 ? normalizedUrls : normalizeSingleUrl(params.url);
|
|
35
|
-
const prompt = normalizeOptionalString(params.prompt);
|
|
36
|
-
const timestamp = normalizeOptionalString(params.timestamp);
|
|
37
|
-
const frames = normalizeOptionalFrameCount(params.frames);
|
|
38
|
-
|
|
39
|
-
const shouldIncludeFrames = frames !== undefined && (timestamp !== undefined || frames > 1);
|
|
40
|
-
|
|
41
|
-
const forceClone = typeof params.forceClone === "boolean" ? params.forceClone : undefined;
|
|
42
|
-
const model = normalizeOptionalString(params.model);
|
|
43
|
-
const mode = normalizeMode(params.mode);
|
|
44
|
-
const answerModel = normalizeOptionalString(params.answerModel);
|
|
45
|
-
const auth = normalizeAuth(params.auth);
|
|
46
|
-
const proxy = normalizeProxy(params.proxy);
|
|
47
|
-
|
|
48
|
-
return {
|
|
49
|
-
urlList,
|
|
50
|
-
options: {
|
|
51
|
-
...(forceClone !== undefined ? { forceClone } : {}),
|
|
52
|
-
...(prompt !== undefined ? { prompt } : {}),
|
|
53
|
-
...(timestamp !== undefined ? { timestamp } : {}),
|
|
54
|
-
...(shouldIncludeFrames ? { frames } : {}),
|
|
55
|
-
...(model !== undefined ? { model } : {}),
|
|
56
|
-
...(mode !== undefined ? { mode } : {}),
|
|
57
|
-
...(answerModel !== undefined ? { answerModel } : {}),
|
|
58
|
-
...(auth !== undefined ? { auth } : {}),
|
|
59
|
-
...(proxy !== undefined ? { proxy } : {}),
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function normalizeUrlArray(value: unknown): string[] {
|
|
65
|
-
if (!Array.isArray(value)) return [];
|
|
66
|
-
return value.flatMap(normalizeSingleUrl);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function normalizeSingleUrl(value: unknown): string[] {
|
|
70
|
-
if (typeof value !== "string") return [];
|
|
71
|
-
const trimmed = value.trim();
|
|
72
|
-
return trimmed ? [trimmed] : [];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function normalizeOptionalString(value: unknown): string | undefined {
|
|
76
|
-
if (typeof value !== "string") return undefined;
|
|
77
|
-
const trimmed = value.trim();
|
|
78
|
-
return trimmed || undefined;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function normalizeMode(value: unknown): "readable" | "raw" | "answer" | undefined {
|
|
82
|
-
if (value === undefined) return undefined;
|
|
83
|
-
if (value === "readable" || value === "raw" || value === "answer") return value;
|
|
84
|
-
throw new Error('mode must be "readable", "raw", or "answer"');
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function normalizeAuth(value: unknown): true | string | undefined {
|
|
88
|
-
if (value === undefined || value === false) return undefined;
|
|
89
|
-
if (value === true) return true;
|
|
90
|
-
if (typeof value === "string") {
|
|
91
|
-
const trimmed = value.trim();
|
|
92
|
-
if (trimmed) return trimmed;
|
|
93
|
-
}
|
|
94
|
-
throw new Error("auth must be a profile name, true, or false");
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function normalizeProxy(value: unknown): string | undefined {
|
|
98
|
-
if (value === undefined || value === false) return undefined;
|
|
99
|
-
if (value === null) throw new Error("proxy must be an http(s) proxy URL string");
|
|
100
|
-
const normalized = normalizeProxyUrl(value, "proxy");
|
|
101
|
-
return normalized ?? "";
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function normalizeOptionalFrameCount(value: unknown): number | undefined {
|
|
105
|
-
if (typeof value !== "number" || !Number.isInteger(value) || value < 1 || value > 12) return undefined;
|
|
106
|
-
return value;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function uniqueUrls(urls: string[]): string[] {
|
|
110
|
-
return [...new Set(urls)];
|
|
111
|
-
}
|
|
1
|
+
import { normalizeProxyUrl } from "./utils.ts";
|
|
2
|
+
|
|
3
|
+
export interface FetchContentParams {
|
|
4
|
+
url?: unknown;
|
|
5
|
+
urls?: unknown;
|
|
6
|
+
forceClone?: unknown;
|
|
7
|
+
prompt?: unknown;
|
|
8
|
+
timestamp?: unknown;
|
|
9
|
+
frames?: unknown;
|
|
10
|
+
model?: unknown;
|
|
11
|
+
mode?: unknown;
|
|
12
|
+
answerModel?: unknown;
|
|
13
|
+
auth?: unknown;
|
|
14
|
+
proxy?: unknown;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface NormalizedFetchContentParams {
|
|
18
|
+
urlList: string[];
|
|
19
|
+
options: {
|
|
20
|
+
forceClone?: boolean;
|
|
21
|
+
prompt?: string;
|
|
22
|
+
timestamp?: string;
|
|
23
|
+
frames?: number;
|
|
24
|
+
model?: string;
|
|
25
|
+
mode?: "readable" | "raw" | "answer";
|
|
26
|
+
answerModel?: string;
|
|
27
|
+
auth?: true | string;
|
|
28
|
+
proxy?: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function normalizeFetchContentParams(params: FetchContentParams): NormalizedFetchContentParams {
|
|
33
|
+
const normalizedUrls = uniqueUrls(normalizeUrlArray(params.urls));
|
|
34
|
+
const urlList = normalizedUrls.length > 0 ? normalizedUrls : normalizeSingleUrl(params.url);
|
|
35
|
+
const prompt = normalizeOptionalString(params.prompt);
|
|
36
|
+
const timestamp = normalizeOptionalString(params.timestamp);
|
|
37
|
+
const frames = normalizeOptionalFrameCount(params.frames);
|
|
38
|
+
|
|
39
|
+
const shouldIncludeFrames = frames !== undefined && (timestamp !== undefined || frames > 1);
|
|
40
|
+
|
|
41
|
+
const forceClone = typeof params.forceClone === "boolean" ? params.forceClone : undefined;
|
|
42
|
+
const model = normalizeOptionalString(params.model);
|
|
43
|
+
const mode = normalizeMode(params.mode);
|
|
44
|
+
const answerModel = normalizeOptionalString(params.answerModel);
|
|
45
|
+
const auth = normalizeAuth(params.auth);
|
|
46
|
+
const proxy = normalizeProxy(params.proxy);
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
urlList,
|
|
50
|
+
options: {
|
|
51
|
+
...(forceClone !== undefined ? { forceClone } : {}),
|
|
52
|
+
...(prompt !== undefined ? { prompt } : {}),
|
|
53
|
+
...(timestamp !== undefined ? { timestamp } : {}),
|
|
54
|
+
...(shouldIncludeFrames ? { frames } : {}),
|
|
55
|
+
...(model !== undefined ? { model } : {}),
|
|
56
|
+
...(mode !== undefined ? { mode } : {}),
|
|
57
|
+
...(answerModel !== undefined ? { answerModel } : {}),
|
|
58
|
+
...(auth !== undefined ? { auth } : {}),
|
|
59
|
+
...(proxy !== undefined ? { proxy } : {}),
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function normalizeUrlArray(value: unknown): string[] {
|
|
65
|
+
if (!Array.isArray(value)) return [];
|
|
66
|
+
return value.flatMap(normalizeSingleUrl);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function normalizeSingleUrl(value: unknown): string[] {
|
|
70
|
+
if (typeof value !== "string") return [];
|
|
71
|
+
const trimmed = value.trim();
|
|
72
|
+
return trimmed ? [trimmed] : [];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function normalizeOptionalString(value: unknown): string | undefined {
|
|
76
|
+
if (typeof value !== "string") return undefined;
|
|
77
|
+
const trimmed = value.trim();
|
|
78
|
+
return trimmed || undefined;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function normalizeMode(value: unknown): "readable" | "raw" | "answer" | undefined {
|
|
82
|
+
if (value === undefined) return undefined;
|
|
83
|
+
if (value === "readable" || value === "raw" || value === "answer") return value;
|
|
84
|
+
throw new Error('mode must be "readable", "raw", or "answer"');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function normalizeAuth(value: unknown): true | string | undefined {
|
|
88
|
+
if (value === undefined || value === false) return undefined;
|
|
89
|
+
if (value === true) return true;
|
|
90
|
+
if (typeof value === "string") {
|
|
91
|
+
const trimmed = value.trim();
|
|
92
|
+
if (trimmed) return trimmed;
|
|
93
|
+
}
|
|
94
|
+
throw new Error("auth must be a profile name, true, or false");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function normalizeProxy(value: unknown): string | undefined {
|
|
98
|
+
if (value === undefined || value === false) return undefined;
|
|
99
|
+
if (value === null) throw new Error("proxy must be an http(s) proxy URL string");
|
|
100
|
+
const normalized = normalizeProxyUrl(value, "proxy");
|
|
101
|
+
return normalized ?? "";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function normalizeOptionalFrameCount(value: unknown): number | undefined {
|
|
105
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 1 || value > 12) return undefined;
|
|
106
|
+
return value;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function uniqueUrls(urls: string[]): string[] {
|
|
110
|
+
return [...new Set(urls)];
|
|
111
|
+
}
|