@eddyskywalker/dsh-chatgpt-subscription 0.2.17 → 0.2.19
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 +1 -0
- package/README.md +1 -1
- package/lib/index.js +61 -10
- package/lib/types/host/proxy-manager.d.ts +15 -0
- package/lib/types/host/proxy-manager.d.ts.map +1 -1
- package/lib/types/host/routes.d.ts +2 -1
- package/lib/types/host/routes.d.ts.map +1 -1
- package/lib/types/host/search-provider-switcher.d.ts +8 -11
- package/lib/types/host/search-provider-switcher.d.ts.map +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
- 修复开启系统代理的机器上 `web_fetch` 必然失败的问题:DSH 内置抓取 provider 在连接前解析、校验并固定目标地址,而代理工具(Clash/Mihomo 等)的 fake-ip DNS 会把域名解析成 `198.18.0.0/15` 里的保留地址(实测 `api.github.com` → `198.18.0.17`),于是每次调用都以 `WEB_BLOCKED_URL`(`resolves to a non-public IP address`)结束——代理根本没被用上。DSH 只在进程环境变量里读到代理时才走代理,看不到系统代理。现在只要插件配置了可用代理(系统代理自动检测或自定义代理),`web_fetch` 就改用本插件的抓取 provider:由代理解析源站,与 DSH 对“走代理的请求”采用的语义一致;未配置代理时仍由内置 provider 抓取,其解析与固定策略不变。
|
|
6
6
|
- 抓取 provider 新增地址策略 `src/host/fetch-address-policy.ts`,保留内置 provider 安全边界中不需要 DNS 的那一半:URL 里写明的 IP 字面量只有全球可路由单播才放行(loopback、私网、链路本地、CGNAT、多播、保留地址、IPv6 转换与隧道前缀一律拒绝);域名用本机解析器检查一次,落在私网(含 `localhost`、`127.0.0.1.nip.io` 这类)一律拒绝;只有代理的 fake-ip 答案被接受,本机解析不出的域名交给代理处理。与内置 provider 的差别是不再固定(pin)连接地址——fake-ip 环境下这一步无法成立,已在 README 的安全边界中写明。
|
|
7
7
|
- 代理偏好在运行时变化(例如系统代理 ↔ 直连)会重新选择抓取后端;选择 ChatGPT 搜索来源时同时切换搜索与抓取的行为保持不变。
|
|
8
|
+
- `ProxyManager` 新增系统代理探测的观察点(`onSystemProxyDetected`):只在「从未知变为已知代理」时通知——探测失败与「本机没有代理」都读作 `null`,因此不会因为一次 `reg query` / `scutil` 抖动就把已经可用的路由拆掉。插件据此在代理迟于 DSH 出现时自动重新选择抓取后端,否则内置 provider 会一直占到进程结束。
|
|
8
9
|
- 新增 `test/fetch-address-policy.test.ts`(地址分类、fake-ip 识别、私网解析拒绝、解析失败放行),并扩充 `test/codex-fetch.test.ts`、`test/search-provider-switcher.test.ts`、`test/web-provider-lifecycle.test.ts` 覆盖抓取 provider 的拒绝路径与后端切换。
|
|
9
10
|
|
|
10
11
|
## 0.2.15 - 2026-09-11
|
package/README.md
CHANGED
|
@@ -123,7 +123,7 @@ DSH 模型选择器应显示 **“Codex(ChatGPT 订阅)”**。6 Astra 与 G
|
|
|
123
123
|
|
|
124
124
|
**搜索与抓取来源** 切换 DSH 的搜索后端;网页抓取后端在有可用代理时自动改用本插件。选择 ChatGPT 来源后,网页由本插件在 Host 抓取,并使用上述网络代理设置;纯 TUN 模式可使用直连,流量由虚拟网卡接管。来源切换即时生效,DSH web 服务重载后会重新注册插件后端,并保留切回 DSH 默认来源所需的配置。
|
|
125
125
|
|
|
126
|
-
**网页抓取后端(web_fetch)** DSH 内置抓取 provider 会先解析域名、校验并固定解析结果,而且只在进程环境变量里读到代理时才走代理——系统代理对它不可见。代理工具(Clash/Mihomo 等)常把域名解析成自己的 fake-ip 地址(默认 `198.18.0.0/15`),于是内置 provider 直接以 `WEB_BLOCKED_URL`(resolves to a non-public IP address)拒绝,代理根本没被用上。因此只要插件配置了可用代理(**网络代理** 选系统代理且检测到,或填写自定义代理),`web_fetch` 就改用本插件的 provider:由代理解析源站,与 DSH 对“走代理的请求”采用的语义一致;未配置代理时仍由 DSH 内置 provider 抓取,保留其解析与固定策略。若在纯 TUN 模式下把代理设为**直连**,内置 provider
|
|
126
|
+
**网页抓取后端(web_fetch)** DSH 内置抓取 provider 会先解析域名、校验并固定解析结果,而且只在进程环境变量里读到代理时才走代理——系统代理对它不可见。代理工具(Clash/Mihomo 等)常把域名解析成自己的 fake-ip 地址(默认 `198.18.0.0/15`),于是内置 provider 直接以 `WEB_BLOCKED_URL`(resolves to a non-public IP address)拒绝,代理根本没被用上。因此只要插件配置了可用代理(**网络代理** 选系统代理且检测到,或填写自定义代理),`web_fetch` 就改用本插件的 provider:由代理解析源站,与 DSH 对“走代理的请求”采用的语义一致;未配置代理时仍由 DSH 内置 provider 抓取,保留其解析与固定策略。若在纯 TUN 模式下把代理设为**直连**,内置 provider 会重新接管,此时可改回系统代理让插件接管抓取。代理如果在 DSH 启动之后才可用(代理工具后启动,或首次探测失败),插件会在下一次探测到代理时重新选择抓取后端,不必重启或改设置。
|
|
127
127
|
|
|
128
128
|
卸载前建议先在设置页点击 **“注销”**,它会删除当前平台的凭据和 Host 内存中的额度缓存。
|
|
129
129
|
|
package/lib/index.js
CHANGED
|
@@ -1514,6 +1514,8 @@ var ProxyManager = class {
|
|
|
1514
1514
|
logger;
|
|
1515
1515
|
cachedSystemProxy = null;
|
|
1516
1516
|
lastSystemProxyCheck = 0;
|
|
1517
|
+
detected = false;
|
|
1518
|
+
proxyListeners = /* @__PURE__ */ new Set();
|
|
1517
1519
|
agents = /* @__PURE__ */ new Map();
|
|
1518
1520
|
constructor(options) {
|
|
1519
1521
|
this.getPreferences = options.getPreferences;
|
|
@@ -1524,15 +1526,37 @@ var ProxyManager = class {
|
|
|
1524
1526
|
getSystemProxy(force = false) {
|
|
1525
1527
|
const now = Date.now();
|
|
1526
1528
|
if (!force && now - this.lastSystemProxyCheck < SYSTEM_PROXY_CACHE_TTL_MS) return this.cachedSystemProxy;
|
|
1529
|
+
const previous = this.cachedSystemProxy;
|
|
1530
|
+
const hadDetected = this.detected;
|
|
1527
1531
|
this.lastSystemProxyCheck = now;
|
|
1532
|
+
this.detected = true;
|
|
1528
1533
|
try {
|
|
1529
1534
|
this.cachedSystemProxy = this.systemProxyDetector();
|
|
1530
1535
|
} catch (error) {
|
|
1531
1536
|
this.cachedSystemProxy = null;
|
|
1532
1537
|
this.logger?.warn?.(`[dsh-chatgpt-subscription] Failed to detect system proxy: ${error instanceof Error ? error.message : String(error)}`);
|
|
1533
1538
|
}
|
|
1539
|
+
if (hadDetected && previous === null && this.cachedSystemProxy !== null) for (const listener of [...this.proxyListeners]) try {
|
|
1540
|
+
listener(this.cachedSystemProxy);
|
|
1541
|
+
} catch {}
|
|
1534
1542
|
return this.cachedSystemProxy;
|
|
1535
1543
|
}
|
|
1544
|
+
/**
|
|
1545
|
+
* Observe the system proxy becoming known.
|
|
1546
|
+
*
|
|
1547
|
+
* A proxy that appears after startup — or a first detection that failed — otherwise leaves every
|
|
1548
|
+
* consumer on the decision it made at load, because `null` reads the same for "no proxy" and for
|
|
1549
|
+
* "detection failed".
|
|
1550
|
+
*
|
|
1551
|
+
* @param listener - called with the detected proxy URL; a throw from it is ignored.
|
|
1552
|
+
* @returns the disposer that stops observing.
|
|
1553
|
+
*/
|
|
1554
|
+
onSystemProxyDetected(listener) {
|
|
1555
|
+
this.proxyListeners.add(listener);
|
|
1556
|
+
return () => {
|
|
1557
|
+
this.proxyListeners.delete(listener);
|
|
1558
|
+
};
|
|
1559
|
+
}
|
|
1536
1560
|
resolveActiveProxyUrl() {
|
|
1537
1561
|
const prefs = this.getPreferences();
|
|
1538
1562
|
const mode = prefs.proxyMode ?? "auto";
|
|
@@ -1564,6 +1588,7 @@ var ProxyManager = class {
|
|
|
1564
1588
|
};
|
|
1565
1589
|
}
|
|
1566
1590
|
dispose() {
|
|
1591
|
+
this.proxyListeners.clear();
|
|
1567
1592
|
for (const agent of this.agents.values()) agent.destroy().catch(() => void 0);
|
|
1568
1593
|
this.agents.clear();
|
|
1569
1594
|
}
|
|
@@ -3089,7 +3114,7 @@ function identityKey(credentials) {
|
|
|
3089
3114
|
//#endregion
|
|
3090
3115
|
//#region src/host/routes.ts
|
|
3091
3116
|
const MAX_BODY_BYTES = 64 * 1024;
|
|
3092
|
-
function registerRoutes(ctx, oauth, usage, preferences, proxyManager) {
|
|
3117
|
+
function registerRoutes(ctx, oauth, usage, preferences, proxyManager, searchSwitcher) {
|
|
3093
3118
|
const handler = async (request, response) => {
|
|
3094
3119
|
const url = new URL(request.url ?? "/", "http://dsh.local");
|
|
3095
3120
|
if (request.method === "GET" && url.pathname === `/api/dsh-chatgpt-subscription/status`) {
|
|
@@ -3101,7 +3126,8 @@ function registerRoutes(ctx, oauth, usage, preferences, proxyManager) {
|
|
|
3101
3126
|
quota: await usage.status(oauthStatus.authenticated),
|
|
3102
3127
|
preferences: preferences.status(),
|
|
3103
3128
|
detectedProxy: proxyManager?.getSystemProxy() ?? null,
|
|
3104
|
-
activeProxy: proxyManager?.resolveActiveProxyUrl() ?? null
|
|
3129
|
+
activeProxy: proxyManager?.resolveActiveProxyUrl() ?? null,
|
|
3130
|
+
switcher: searchSwitcher?.status() ?? null
|
|
3105
3131
|
}
|
|
3106
3132
|
});
|
|
3107
3133
|
return;
|
|
@@ -3758,12 +3784,25 @@ var SearchProviderSwitcher = class {
|
|
|
3758
3784
|
originalSearchProvider;
|
|
3759
3785
|
originalFetchProvider;
|
|
3760
3786
|
initialized = false;
|
|
3787
|
+
state = "idle";
|
|
3761
3788
|
constructor(loader) {
|
|
3762
3789
|
this.loader = loader;
|
|
3763
3790
|
}
|
|
3791
|
+
status() {
|
|
3792
|
+
const entry = this.findWebEntry();
|
|
3793
|
+
const config = entry ? currentConfig(entry) : {};
|
|
3794
|
+
return {
|
|
3795
|
+
state: this.state,
|
|
3796
|
+
configuredSearchProvider: providerId(config.searchProvider),
|
|
3797
|
+
configuredFetchProvider: providerId(config.fetchProvider)
|
|
3798
|
+
};
|
|
3799
|
+
}
|
|
3764
3800
|
async select(preference, options = {}) {
|
|
3765
3801
|
const entry = this.findWebEntry();
|
|
3766
|
-
if (entry === null)
|
|
3802
|
+
if (entry === null) {
|
|
3803
|
+
this.state = "missing";
|
|
3804
|
+
return;
|
|
3805
|
+
}
|
|
3767
3806
|
const config = currentConfig(entry);
|
|
3768
3807
|
if (!this.initialized) {
|
|
3769
3808
|
this.originalSearchProvider = typeof config.searchProvider === "string" && config.searchProvider !== "codex-subscription" ? config.searchProvider : void 0;
|
|
@@ -3779,13 +3818,17 @@ var SearchProviderSwitcher = class {
|
|
|
3779
3818
|
else nextConfig.searchProvider = nextSearch;
|
|
3780
3819
|
if (nextFetch === void 0) delete nextConfig.fetchProvider;
|
|
3781
3820
|
else nextConfig.fetchProvider = nextFetch;
|
|
3782
|
-
|
|
3821
|
+
this.state = "applying";
|
|
3822
|
+
try {
|
|
3823
|
+
await entry.update({ config: nextConfig });
|
|
3824
|
+
this.state = "applied";
|
|
3825
|
+
} catch (error) {
|
|
3826
|
+
this.state = "failed";
|
|
3827
|
+
throw error;
|
|
3828
|
+
}
|
|
3783
3829
|
}
|
|
3784
3830
|
findWebEntry() {
|
|
3785
|
-
for (const entry of this.loader.entries())
|
|
3786
|
-
if (entry.options.id === "web") return entry;
|
|
3787
|
-
if (entry.options.name === "@deepseek-ai/dsh-web") return entry;
|
|
3788
|
-
}
|
|
3831
|
+
for (const entry of this.loader.entries()) if (entry.options.id === "web" || entry.options.name === "@deepseek-ai/dsh-web") return entry;
|
|
3789
3832
|
return null;
|
|
3790
3833
|
}
|
|
3791
3834
|
};
|
|
@@ -3793,6 +3836,10 @@ function currentConfig(entry) {
|
|
|
3793
3836
|
const config = entry.options.config;
|
|
3794
3837
|
return typeof config === "object" && config !== null && !Array.isArray(config) ? config : {};
|
|
3795
3838
|
}
|
|
3839
|
+
/** Never include paths, credentials, or arbitrary configuration in public diagnostics. */
|
|
3840
|
+
function providerId(value) {
|
|
3841
|
+
return typeof value === "string" && /^[a-zA-Z0-9_-]{1,80}$/.test(value) ? value : null;
|
|
3842
|
+
}
|
|
3796
3843
|
//#endregion
|
|
3797
3844
|
//#region src/host/antigravity/types.ts
|
|
3798
3845
|
const PROVIDER_NAME = "Antigravity";
|
|
@@ -6187,7 +6234,7 @@ function apply(ctx, pluginConfig = {}) {
|
|
|
6187
6234
|
ctx.logger.warn(`[dsh-chatgpt-subscription] Web provider selection could not be applied: ${error instanceof Error ? error.message : String(error)}`);
|
|
6188
6235
|
});
|
|
6189
6236
|
};
|
|
6190
|
-
const disposeRoutes = registerRoutes(ctx, oauth, usage, preferences, proxyManager);
|
|
6237
|
+
const disposeRoutes = registerRoutes(ctx, oauth, usage, preferences, proxyManager, searchSwitcher);
|
|
6191
6238
|
const disposeAdapter = ctx.llm.registerAdapter([PROVIDER_ID$1], adapter);
|
|
6192
6239
|
const disposeImageTool = ctx.tools.register(createCodexImageTool(oauth, ctx.attachments, { fetchFn: proxyFetch }));
|
|
6193
6240
|
ctx.inject(["web"], (ctx) => {
|
|
@@ -6196,7 +6243,11 @@ function apply(ctx, pluginConfig = {}) {
|
|
|
6196
6243
|
applyWebProviders();
|
|
6197
6244
|
});
|
|
6198
6245
|
const disposePreferenceWatch = preferences.watch((next) => applyWebProviders(next));
|
|
6246
|
+
const disposeProxyWatch = proxyManager.onSystemProxyDetected(() => {
|
|
6247
|
+
applyWebProviders();
|
|
6248
|
+
});
|
|
6199
6249
|
return () => {
|
|
6250
|
+
disposeProxyWatch();
|
|
6200
6251
|
disposePreferenceWatch();
|
|
6201
6252
|
disposeImageTool();
|
|
6202
6253
|
disposeAdapter();
|
|
@@ -6212,4 +6263,4 @@ function localWebServerBaseUrl(host, port) {
|
|
|
6212
6263
|
return `http://${host === "0.0.0.0" ? "127.0.0.1" : host}:${port}`;
|
|
6213
6264
|
}
|
|
6214
6265
|
//#endregion
|
|
6215
|
-
export { AntigravityAdapter, CodexChatGptAdapter, Config, FileCredentialStore, FileModelSettingsStore, LinuxFileTokenStore, MacKeychainTokenStore, OAuthService, ProxyManager, ResponsesClient, SUBAGENT_MODEL_SELECTION_NAMESPACE, SUBAGENT_POLICY_EVENT, UsageService, WindowsDpapiTokenStore, apply, authorizedRoutesFor, beginWebLogin, clearCachedQuota, createCodexFetchProvider, createCodexImageTool, createCodexSearchProvider, createPlatformTokenStore, createSubagentAuthorization, credentialPath, delegationDenialReason, detectSystemProxy, fetchAccountQuota, getCachedQuota, inject, installSubagentModelAuthorization, loginAndSave, mapCodexUsage, modelSettingsPath, normalizeDelegationToolNames, parseAllowedRoutes, parseCodexUsage, parseResponsesStream, policyRoutesOf, refreshAntigravityToken, subagentModelSelectionPreference, unauthorizedRouteReason, validateAuthorizationScope, validateDelegationToolNames };
|
|
6266
|
+
export { AntigravityAdapter, CodexChatGptAdapter, Config, FileCredentialStore, FileModelSettingsStore, LinuxFileTokenStore, MacKeychainTokenStore, OAuthService, ProxyManager, ResponsesClient, SUBAGENT_MODEL_SELECTION_NAMESPACE, SUBAGENT_POLICY_EVENT, SearchProviderSwitcher, UsageService, WindowsDpapiTokenStore, apply, authorizedRoutesFor, beginWebLogin, clearCachedQuota, createCodexFetchProvider, createCodexImageTool, createCodexSearchProvider, createPlatformTokenStore, createSubagentAuthorization, credentialPath, delegationDenialReason, detectSystemProxy, fetchAccountQuota, getCachedQuota, inject, installSubagentModelAuthorization, loginAndSave, mapCodexUsage, modelSettingsPath, normalizeDelegationToolNames, parseAllowedRoutes, parseCodexUsage, parseResponsesStream, policyRoutesOf, refreshAntigravityToken, subagentModelSelectionPreference, unauthorizedRouteReason, validateAuthorizationScope, validateDelegationToolNames };
|
|
@@ -13,6 +13,8 @@ export interface ParseEnvProxyOptions {
|
|
|
13
13
|
}
|
|
14
14
|
export declare function parseEnvProxy(env?: Record<string, string | undefined>, options?: ParseEnvProxyOptions): string | null;
|
|
15
15
|
export declare function detectSystemProxy(platform?: NodeJS.Platform, env?: Record<string, string | undefined>): string | null;
|
|
16
|
+
/** Called with the proxy URL the first time detection reports one after a `null`. */
|
|
17
|
+
export type SystemProxyListener = (proxyUrl: string) => void;
|
|
16
18
|
export interface ProxyFetchOptions {
|
|
17
19
|
getPreferences: () => Pick<SubscriptionPreferencesDto, 'proxyMode' | 'customProxyUrl'>;
|
|
18
20
|
baseFetch?: FetchLike;
|
|
@@ -26,9 +28,22 @@ export declare class ProxyManager {
|
|
|
26
28
|
private readonly logger?;
|
|
27
29
|
private cachedSystemProxy;
|
|
28
30
|
private lastSystemProxyCheck;
|
|
31
|
+
private detected;
|
|
32
|
+
private readonly proxyListeners;
|
|
29
33
|
private readonly agents;
|
|
30
34
|
constructor(options: ProxyFetchOptions);
|
|
31
35
|
getSystemProxy(force?: boolean): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Observe the system proxy becoming known.
|
|
38
|
+
*
|
|
39
|
+
* A proxy that appears after startup — or a first detection that failed — otherwise leaves every
|
|
40
|
+
* consumer on the decision it made at load, because `null` reads the same for "no proxy" and for
|
|
41
|
+
* "detection failed".
|
|
42
|
+
*
|
|
43
|
+
* @param listener - called with the detected proxy URL; a throw from it is ignored.
|
|
44
|
+
* @returns the disposer that stops observing.
|
|
45
|
+
*/
|
|
46
|
+
onSystemProxyDetected(listener: SystemProxyListener): () => void;
|
|
32
47
|
resolveActiveProxyUrl(): string | null;
|
|
33
48
|
private getOrCreateAgent;
|
|
34
49
|
createFetch(): FetchLike;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-manager.d.ts","sourceRoot":"","sources":["../../../src/host/proxy-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAa,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAEnF,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAA;AAIpC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqCvE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBnE;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,wBAAgB,aAAa,CAC3B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,OAAO,GAAE,oBAAyB,GACjC,MAAM,GAAG,IAAI,CA2Bf;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,GAAG,IAAI,CAuBpJ;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC,0BAA0B,EAAE,WAAW,GAAG,gBAAgB,CAAC,CAAA;IACtF,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IACzC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;CAClD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwE;IACvG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA0C;IAElE,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;gBAE3C,OAAO,EAAE,iBAAiB;IAOtC,cAAc,CAAC,KAAK,UAAQ,GAAG,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"proxy-manager.d.ts","sourceRoot":"","sources":["../../../src/host/proxy-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAa,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAEnF,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAA;AAIpC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqCvE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBnE;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,wBAAgB,aAAa,CAC3B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,OAAO,GAAE,oBAAyB,GACjC,MAAM,GAAG,IAAI,CA2Bf;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,GAAG,IAAI,CAuBpJ;AAED,qFAAqF;AACrF,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC,0BAA0B,EAAE,WAAW,GAAG,gBAAgB,CAAC,CAAA;IACtF,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IACzC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;CAClD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwE;IACvG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA0C;IAElE,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiC;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;gBAE3C,OAAO,EAAE,iBAAiB;IAOtC,cAAc,CAAC,KAAK,UAAQ,GAAG,MAAM,GAAG,IAAI;IA8B5C;;;;;;;;;OASG;IACH,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAKhE,qBAAqB,IAAI,MAAM,GAAG,IAAI;IAgBtC,OAAO,CAAC,gBAAgB;IASxB,WAAW,IAAI,SAAS;IAsBxB,OAAO,IAAI,IAAI;CAOhB"}
|
|
@@ -2,6 +2,7 @@ import type { Context } from '@deepseek-ai/cordis';
|
|
|
2
2
|
import { OAuthService } from './oauth-service.ts';
|
|
3
3
|
import { type SubscriptionPreferenceStore } from './preferences.ts';
|
|
4
4
|
import type { ProxyManager } from './proxy-manager.ts';
|
|
5
|
+
import type { SearchProviderSwitcher } from './search-provider-switcher.ts';
|
|
5
6
|
import { UsageService } from './usage-service.ts';
|
|
6
|
-
export declare function registerRoutes(ctx: Context, oauth: OAuthService, usage: UsageService, preferences: SubscriptionPreferenceStore, proxyManager?: ProxyManager): () => void;
|
|
7
|
+
export declare function registerRoutes(ctx: Context, oauth: OAuthService, usage: UsageService, preferences: SubscriptionPreferenceStore, proxyManager?: ProxyManager, searchSwitcher?: SearchProviderSwitcher): () => void;
|
|
7
8
|
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/host/routes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAmB,KAAK,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAIpE,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,2BAA2B,EACxC,YAAY,CAAC,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/host/routes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAmB,KAAK,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAC3E,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAIpE,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,2BAA2B,EACxC,YAAY,CAAC,EAAE,YAAY,EAC3B,cAAc,CAAC,EAAE,sBAAsB,GACtC,MAAM,IAAI,CAuKZ"}
|
|
@@ -3,26 +3,23 @@ import type { SearchProviderPreference } from '../shared/contracts.ts';
|
|
|
3
3
|
interface LoaderLike {
|
|
4
4
|
entries(): Iterable<Entry>;
|
|
5
5
|
}
|
|
6
|
-
/** What one selection asks for on top of the settings preference. */
|
|
7
6
|
export interface WebProviderSelectionOptions {
|
|
8
|
-
/**
|
|
9
|
-
* Whether this plugin's fetch provider must serve the `web_fetch` tool.
|
|
10
|
-
*
|
|
11
|
-
* DSH's built-in provider resolves and pins every destination before it
|
|
12
|
-
* connects and routes through a proxy only when the process environment names
|
|
13
|
-
* one, so an OS-level proxy plus the fake-ip DNS that usually comes with it
|
|
14
|
-
* fails every fetch with `WEB_BLOCKED_URL`. Selecting this plugin's provider
|
|
15
|
-
* hands the origin's resolution to the configured proxy — the same
|
|
16
|
-
* proxied-hop semantics DSH applies to a URL it routes through a proxy.
|
|
17
|
-
*/
|
|
18
7
|
readonly pluginFetch?: boolean;
|
|
19
8
|
}
|
|
9
|
+
/** Configuration diagnostics, not proof that an in-flight tool uses this service. */
|
|
10
|
+
export interface SearchProviderSwitcherStatus {
|
|
11
|
+
readonly state: 'idle' | 'applying' | 'applied' | 'missing' | 'failed';
|
|
12
|
+
readonly configuredSearchProvider: string | null;
|
|
13
|
+
readonly configuredFetchProvider: string | null;
|
|
14
|
+
}
|
|
20
15
|
export declare class SearchProviderSwitcher {
|
|
21
16
|
private readonly loader;
|
|
22
17
|
private originalSearchProvider;
|
|
23
18
|
private originalFetchProvider;
|
|
24
19
|
private initialized;
|
|
20
|
+
private state;
|
|
25
21
|
constructor(loader: LoaderLike);
|
|
22
|
+
status(): SearchProviderSwitcherStatus;
|
|
26
23
|
select(preference: SearchProviderPreference, options?: WebProviderSelectionOptions): Promise<void>;
|
|
27
24
|
private findWebEntry;
|
|
28
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-provider-switcher.d.ts","sourceRoot":"","sources":["../../../src/host/search-provider-switcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAA;AAG9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AAEtE,UAAU,UAAU;IAClB,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAA;CAC3B;AAED,
|
|
1
|
+
{"version":3,"file":"search-provider-switcher.d.ts","sourceRoot":"","sources":["../../../src/host/search-provider-switcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAA;AAG9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AAEtE,UAAU,UAAU;IAClB,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAA;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,qFAAqF;AACrF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;IACtE,QAAQ,CAAC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChD,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD;AAED,qBAAa,sBAAsB;IAMrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALnC,OAAO,CAAC,sBAAsB,CAAoB;IAClD,OAAO,CAAC,qBAAqB,CAAoB;IACjD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,KAAK,CAAgD;gBAEhC,MAAM,EAAE,UAAU;IAE/C,MAAM,IAAI,4BAA4B;IAUhC,MAAM,CAAC,UAAU,EAAE,wBAAwB,EAAE,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC5G,OAAO,CAAC,YAAY;CAMrB"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export { CodexChatGptAdapter } from './host/adapter.ts';
|
|
|
27
27
|
export { createCodexImageTool } from './host/codex-images.ts';
|
|
28
28
|
export { createCodexSearchProvider } from './host/codex-search.ts';
|
|
29
29
|
export { createCodexFetchProvider } from './host/codex-fetch.ts';
|
|
30
|
+
export { SearchProviderSwitcher, type SearchProviderSwitcherStatus } from './host/search-provider-switcher.ts';
|
|
30
31
|
export { ResponsesClient, parseResponsesStream } from './host/responses-client.ts';
|
|
31
32
|
export { UsageService, mapCodexUsage, parseCodexUsage } from './host/usage-service.ts';
|
|
32
33
|
export { createPlatformTokenStore } from './host/platform-token-store.ts';
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAsCxC,yDAAyD;AACzD,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAA;CAC9C;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAI3B,CAAA;AAEF,eAAO,MAAM,MAAM,UAAqE,CAAA;AAExF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,GAAE,MAAW,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAsCxC,yDAAyD;AACzD,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAA;CAC9C;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAI3B,CAAA;AAEF,eAAO,MAAM,MAAM,UAAqE,CAAA;AAExF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,GAAE,MAAW,GAAG,IAAI,CA8GnE;AAED,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EACL,kCAAkC,EAClC,qBAAqB,EACrB,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EACtB,iCAAiC,EACjC,4BAA4B,EAC5B,kBAAkB,EAClB,cAAc,EACd,gCAAgC,EAChC,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,sBAAsB,EAAE,KAAK,4BAA4B,EAAE,MAAM,oCAAoC,CAAA;AAC9G,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAA;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,YAAY,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,GAClB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAClG,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA"}
|