
























@@ -0,0 +1,136 @@
1+//#region packages/web-content-core/src/provider-runtime-shared.ts
2+const DEFAULT_SECRET_PROVIDER_ALIAS = "default";
3+const ENV_SECRET_REF_ID_RE = /^[A-Z][A-Z0-9_]{0,127}$/;
4+const LEGACY_SECRETREF_ENV_MARKER_PREFIX = "secretref-env:";
5+const LEGACY_DOUBLE_UNDERSCORE_ENV_MARKER_PREFIX = "__env__:";
6+const ENV_SECRET_TEMPLATE_RE = /^\$\{([A-Z][A-Z0-9_]{0,127})\}$/;
7+const ENV_SECRET_SHORTHAND_RE = /^\$([A-Z][A-Z0-9_]{0,127})$/;
8+function isRecord(value) {
9+return typeof value === "object" && value !== null && !Array.isArray(value);
10+}
11+function normalizeSecretInputString(value) {
12+if (typeof value !== "string") return;
13+const trimmed = value.trim();
14+return trimmed.length > 0 ? trimmed : void 0;
15+}
16+function normalizeSecretInput(value) {
17+if (typeof value !== "string") return "";
18+const collapsed = value.replace(/[\r\n\u2028\u2029]+/g, "");
19+let latin1Only = "";
20+for (const char of collapsed) {
21+const codePoint = char.codePointAt(0);
22+if (typeof codePoint === "number" && codePoint <= 255) latin1Only += char;
23+}
24+return latin1Only.trim();
25+}
26+function isSecretRef(value) {
27+if (!isRecord(value)) return false;
28+if (Object.keys(value).length !== 3) return false;
29+return (value.source === "env" || value.source === "file" || value.source === "exec") && typeof value.provider === "string" && value.provider.trim().length > 0 && typeof value.id === "string" && value.id.trim().length > 0;
30+}
31+function coerceSecretRef(value) {
32+if (isSecretRef(value)) return value;
33+if (typeof value === "string") {
34+const trimmed = value.trim();
35+const legacyPrefix = trimmed.startsWith(LEGACY_SECRETREF_ENV_MARKER_PREFIX) ? LEGACY_SECRETREF_ENV_MARKER_PREFIX : trimmed.startsWith(LEGACY_DOUBLE_UNDERSCORE_ENV_MARKER_PREFIX) ? LEGACY_DOUBLE_UNDERSCORE_ENV_MARKER_PREFIX : void 0;
36+if (legacyPrefix) {
37+const id = trimmed.slice(legacyPrefix.length);
38+return ENV_SECRET_REF_ID_RE.test(id) ? {
39+source: "env",
40+provider: DEFAULT_SECRET_PROVIDER_ALIAS,
41+ id
42+} : null;
43+}
44+const match = ENV_SECRET_TEMPLATE_RE.exec(trimmed) ?? ENV_SECRET_SHORTHAND_RE.exec(trimmed);
45+return match ? {
46+source: "env",
47+provider: DEFAULT_SECRET_PROVIDER_ALIAS,
48+id: match[1]
49+} : null;
50+}
51+if (isRecord(value) && (value.source === "env" || value.source === "file" || value.source === "exec") && typeof value.id === "string" && value.id.trim().length > 0 && value.provider === void 0) return {
52+source: value.source,
53+provider: DEFAULT_SECRET_PROVIDER_ALIAS,
54+id: value.id
55+};
56+return null;
57+}
58+function resolveWebProviderConfig(cfg, kind) {
59+const webConfig = cfg?.tools?.web;
60+if (!webConfig || typeof webConfig !== "object") return;
61+const toolConfig = webConfig[kind];
62+if (!toolConfig || typeof toolConfig !== "object") return;
63+return toolConfig;
64+}
65+function readWebProviderEnvValue(envVars, processEnv = process.env) {
66+for (const envVar of envVars) {
67+const value = normalizeSecretInput(processEnv[envVar]);
68+if (value) return value;
69+}
70+}
71+function providerRequiresCredential(provider) {
72+return provider.requiresCredential !== false;
73+}
74+function hasWebProviderEntryCredential(params) {
75+if (!providerRequiresCredential(params.provider)) return true;
76+const rawValue = params.resolveRawValue({
77+provider: params.provider,
78+config: params.config,
79+toolConfig: params.toolConfig
80+});
81+const configuredRef = coerceSecretRef(rawValue);
82+if (configuredRef && configuredRef.source !== "env") return true;
83+if (normalizeSecretInput(normalizeSecretInputString(rawValue))) return true;
84+if (params.provider.authProviderId && params.resolveProviderAuthValue?.(params.provider.authProviderId)) return true;
85+if (params.resolveEnvValue({
86+provider: params.provider,
87+configuredEnvVarId: configuredRef?.source === "env" ? configuredRef.id : void 0
88+})) return true;
89+const fallbackRawValue = params.resolveFallbackRawValue?.({
90+provider: params.provider,
91+config: params.config,
92+toolConfig: params.toolConfig
93+});
94+const fallbackRef = coerceSecretRef(fallbackRawValue);
95+if (fallbackRef && fallbackRef.source !== "env") return true;
96+if (normalizeSecretInput(normalizeSecretInputString(fallbackRawValue))) return true;
97+return Boolean(fallbackRef?.source === "env" ? params.resolveEnvValue({
98+provider: params.provider,
99+configuredEnvVarId: fallbackRef.id
100+}) : void 0);
101+}
102+function resolveWebProviderDefinition(params) {
103+if (!params.resolveEnabled({
104+toolConfig: params.toolConfig,
105+sandboxed: params.sandboxed
106+})) return null;
107+const providers = params.providers.filter(Boolean);
108+if (providers.length === 0) return null;
109+const autoProviderId = params.resolveAutoProviderId({
110+config: params.config,
111+toolConfig: params.toolConfig,
112+ providers
113+});
114+const providerId = params.providerId ?? params.runtimeMetadata?.selectedProvider ?? autoProviderId;
115+if (!providerId) return null;
116+const provider = providers.find((entry) => entry.id === providerId) ?? providers.find((entry) => entry.id === params.resolveFallbackProviderId?.({
117+config: params.config,
118+toolConfig: params.toolConfig,
119+ providers,
120+ providerId
121+}));
122+if (!provider) return null;
123+const definition = params.createTool({
124+ provider,
125+config: params.config,
126+toolConfig: params.toolConfig,
127+runtimeMetadata: params.runtimeMetadata
128+});
129+if (!definition) return null;
130+return {
131+ provider,
132+ definition
133+};
134+}
135+//#endregion
136+export { hasWebProviderEntryCredential, providerRequiresCredential, readWebProviderEnvValue, resolveWebProviderConfig, resolveWebProviderDefinition };
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。