@eddyskywalker/dsh-chatgpt-subscription 0.32.0 → 0.34.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/CHANGELOG.md +81 -0
- package/README.md +100 -111
- package/lib/client.js +4731 -1239
- package/lib/client.js.map +1 -1
- package/lib/index.js +11514 -3162
- package/lib/types/client/common/format.d.ts +10 -0
- package/lib/types/client/common/format.d.ts.map +1 -1
- package/lib/types/client/hub/brand-icons.d.ts +18 -2
- package/lib/types/client/hub/brand-icons.d.ts.map +1 -1
- package/lib/types/client/hub/hub-styles.d.ts.map +1 -1
- package/lib/types/client/hub/providers.d.ts.map +1 -1
- package/lib/types/client/index.d.ts +4 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/minimax-code/VideoFormDialog.d.ts +46 -50
- package/lib/types/client/minimax-code/VideoFormDialog.d.ts.map +1 -1
- package/lib/types/client/minimax-code/locales.d.ts +80 -20
- package/lib/types/client/minimax-code/locales.d.ts.map +1 -1
- package/lib/types/client/minimax-code/styles.d.ts.map +1 -1
- package/lib/types/client/minimax-code/video-command-host.d.ts +17 -11
- package/lib/types/client/minimax-code/video-command-host.d.ts.map +1 -1
- package/lib/types/client/minimax-code/video-command-icon.d.ts +38 -0
- package/lib/types/client/minimax-code/video-command-icon.d.ts.map +1 -0
- package/lib/types/client/minimax-code/video-command.d.ts +53 -59
- package/lib/types/client/minimax-code/video-command.d.ts.map +1 -1
- package/lib/types/client/minimax-code/video-media-dropzone.d.ts +57 -0
- package/lib/types/client/minimax-code/video-media-dropzone.d.ts.map +1 -0
- package/lib/types/client/minimax-code/video-media-input.d.ts +173 -0
- package/lib/types/client/minimax-code/video-media-input.d.ts.map +1 -0
- package/lib/types/client/minimax-code/video-presets.d.ts +67 -0
- package/lib/types/client/minimax-code/video-presets.d.ts.map +1 -0
- package/lib/types/client/minimax-code/video-workspace.d.ts +41 -0
- package/lib/types/client/minimax-code/video-workspace.d.ts.map +1 -0
- package/lib/types/client/opendesign/OpenDesignComposerQuota.d.ts +20 -0
- package/lib/types/client/opendesign/OpenDesignComposerQuota.d.ts.map +1 -0
- package/lib/types/client/opendesign/OpenDesignSection.d.ts +18 -0
- package/lib/types/client/opendesign/OpenDesignSection.d.ts.map +1 -0
- package/lib/types/client/opendesign/api.d.ts +45 -0
- package/lib/types/client/opendesign/api.d.ts.map +1 -0
- package/lib/types/client/opendesign/locales.d.ts +689 -0
- package/lib/types/client/opendesign/locales.d.ts.map +1 -0
- package/lib/types/client/opendesign/styles.d.ts +11 -0
- package/lib/types/client/opendesign/styles.d.ts.map +1 -0
- package/lib/types/client/qoder/QoderComposerQuota.d.ts +41 -0
- package/lib/types/client/qoder/QoderComposerQuota.d.ts.map +1 -0
- package/lib/types/client/qoder/QoderSection.d.ts +36 -0
- package/lib/types/client/qoder/QoderSection.d.ts.map +1 -0
- package/lib/types/client/qoder/api.d.ts +4 -0
- package/lib/types/client/qoder/api.d.ts.map +1 -0
- package/lib/types/client/qoder/locales.d.ts +316 -0
- package/lib/types/client/qoder/locales.d.ts.map +1 -0
- package/lib/types/client/qoder/styles.d.ts +16 -0
- package/lib/types/client/qoder/styles.d.ts.map +1 -0
- package/lib/types/client/qoder/useQoderSection.d.ts +97 -0
- package/lib/types/client/qoder/useQoderSection.d.ts.map +1 -0
- package/lib/types/host/common/model-request-control.d.ts +1 -1
- package/lib/types/host/common/model-request-control.d.ts.map +1 -1
- package/lib/types/host/common/request-diagnostics.d.ts +1 -1
- package/lib/types/host/common/request-diagnostics.d.ts.map +1 -1
- package/lib/types/host/kimi-code/adapter.d.ts +34 -1
- package/lib/types/host/kimi-code/adapter.d.ts.map +1 -1
- package/lib/types/host/kimi-code/mapper.d.ts +8 -0
- package/lib/types/host/kimi-code/mapper.d.ts.map +1 -1
- package/lib/types/host/kimi-code/types.d.ts +92 -0
- package/lib/types/host/kimi-code/types.d.ts.map +1 -1
- package/lib/types/host/opendesign/account-pool.d.ts +54 -0
- package/lib/types/host/opendesign/account-pool.d.ts.map +1 -0
- package/lib/types/host/opendesign/adapter.d.ts +69 -0
- package/lib/types/host/opendesign/adapter.d.ts.map +1 -0
- package/lib/types/host/opendesign/catalog.d.ts +44 -0
- package/lib/types/host/opendesign/catalog.d.ts.map +1 -0
- package/lib/types/host/opendesign/client.d.ts +148 -0
- package/lib/types/host/opendesign/client.d.ts.map +1 -0
- package/lib/types/host/opendesign/line.d.ts +49 -0
- package/lib/types/host/opendesign/line.d.ts.map +1 -0
- package/lib/types/host/opendesign/mapper.d.ts +128 -0
- package/lib/types/host/opendesign/mapper.d.ts.map +1 -0
- package/lib/types/host/opendesign/oauth.d.ts +105 -0
- package/lib/types/host/opendesign/oauth.d.ts.map +1 -0
- package/lib/types/host/opendesign/routes.d.ts +74 -0
- package/lib/types/host/opendesign/routes.d.ts.map +1 -0
- package/lib/types/host/opendesign/token-store.d.ts +154 -0
- package/lib/types/host/opendesign/token-store.d.ts.map +1 -0
- package/lib/types/host/opendesign/types.d.ts +180 -0
- package/lib/types/host/opendesign/types.d.ts.map +1 -0
- package/lib/types/host/qoder/account-pool.d.ts +137 -0
- package/lib/types/host/qoder/account-pool.d.ts.map +1 -0
- package/lib/types/host/qoder/adapter.d.ts +158 -0
- package/lib/types/host/qoder/adapter.d.ts.map +1 -0
- package/lib/types/host/qoder/adopt.d.ts +146 -0
- package/lib/types/host/qoder/adopt.d.ts.map +1 -0
- package/lib/types/host/qoder/client.d.ts +301 -0
- package/lib/types/host/qoder/client.d.ts.map +1 -0
- package/lib/types/host/qoder/cosy.d.ts +173 -0
- package/lib/types/host/qoder/cosy.d.ts.map +1 -0
- package/lib/types/host/qoder/mapper.d.ts +235 -0
- package/lib/types/host/qoder/mapper.d.ts.map +1 -0
- package/lib/types/host/qoder/model-catalog.d.ts +231 -0
- package/lib/types/host/qoder/model-catalog.d.ts.map +1 -0
- package/lib/types/host/qoder/oauth.d.ts +134 -0
- package/lib/types/host/qoder/oauth.d.ts.map +1 -0
- package/lib/types/host/qoder/routes.d.ts +119 -0
- package/lib/types/host/qoder/routes.d.ts.map +1 -0
- package/lib/types/host/qoder/token-store.d.ts +280 -0
- package/lib/types/host/qoder/token-store.d.ts.map +1 -0
- package/lib/types/host/qoder/types.d.ts +257 -0
- package/lib/types/host/qoder/types.d.ts.map +1 -0
- package/lib/types/host/workbuddy/adapter.d.ts.map +1 -1
- package/lib/types/host/workbuddy/mapper.d.ts +1 -0
- package/lib/types/host/workbuddy/mapper.d.ts.map +1 -1
- package/lib/types/index.d.ts +15 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/shared/opendesign-contracts.d.ts +159 -0
- package/lib/types/shared/opendesign-contracts.d.ts.map +1 -0
- package/lib/types/shared/qoder-contracts.d.ts +332 -0
- package/lib/types/shared/qoder-contracts.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qoder(订阅)线路的 web 路由。
|
|
3
|
+
*
|
|
4
|
+
* 路由表与客户端 \`src/client/qoder/api.ts\` 里那一份是**同一个约定**,两边必须逐条对上:
|
|
5
|
+
*
|
|
6
|
+
* \`\`\`
|
|
7
|
+
* GET /status -> QoderStatusDto(页面的唯一读口)
|
|
8
|
+
* POST /settings QoderSettingsUpdateDto -> QoderStatusDto
|
|
9
|
+
* POST /accounts { action, accountId } / { action:'strategy', strategy } -> QoderStatusDto
|
|
10
|
+
* POST /login/start { region } -> QoderLoginFlowStatus(设备流,仅全球区)
|
|
11
|
+
* GET /login/status -> QoderLoginFlowStatus
|
|
12
|
+
* POST /login/cancel { } -> QoderLoginFlowStatus
|
|
13
|
+
* POST /login/manual { region, token } -> QoderStatusDto(请求体带 PAT,不在冻结契约里)
|
|
14
|
+
* POST /adopt { } -> QoderAdoptResultDto(裸 DTO;失败永不阻断)
|
|
15
|
+
* POST /connection/test { } -> QoderConnectionDto(裸 DTO)
|
|
16
|
+
* POST /quota { } -> QoderStatusDto(强制刷新额度)
|
|
17
|
+
* POST /catalog/refresh { } -> QoderStatusDto
|
|
18
|
+
* \`\`\`
|
|
19
|
+
*
|
|
20
|
+
* 信封:除 \`/adopt\` 与 \`/connection/test\` 外一律 \`{ ok, value }\`(客户端的
|
|
21
|
+
* \`createLineApi\` 会把信封拆掉;那两条路由的契约把 DTO 定在顶层,所以它们直接返回 DTO)。
|
|
22
|
+
*
|
|
23
|
+
* 同源校验不可省:每个 POST 都过 \`isSameOriginMutation\`,与兄弟线路同一份实现。
|
|
24
|
+
*
|
|
25
|
+
* 本文件**不持有任何凭据,也不算任何用量**:落盘与刷新交给 token-store / account-pool /
|
|
26
|
+
* oauth / adopt,上游 I/O 交给 client.ts,缓存用量的累计是 adapter.ts 的累计器。
|
|
27
|
+
* 它只做三件事:读设置、组装状态面、把同源的 POST 翻译成对上面那些模块的一次调用。
|
|
28
|
+
*/
|
|
29
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
30
|
+
import type { AccountRotationStrategy } from '../../shared/account-pool-contracts.ts';
|
|
31
|
+
import { type QoderAccountSummaryDto, type QoderCacheStatsDto, type QoderQuotaSnapshotDto, type QoderRegion, type QoderStatusDto } from '../../shared/qoder-contracts.ts';
|
|
32
|
+
import { type QoderAccountPool } from './account-pool.ts';
|
|
33
|
+
import { type QoderModelEntry } from './model-catalog.ts';
|
|
34
|
+
import { QoderModelSettingsStore, type QoderModelSettings, type QoderPreferenceStore, type QoderSettingsPatch } from './token-store.ts';
|
|
35
|
+
/** 一个请求寻址的子路径(剥掉契约前缀)。 */
|
|
36
|
+
export declare function qoderSubPathOf(requestUrl: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* 设置来源:register 后端与文件后端形状不同,这里收敛成一个(与 step-code 同形)。
|
|
39
|
+
*/
|
|
40
|
+
export interface QoderSettingsSource {
|
|
41
|
+
status(): QoderModelSettings | Promise<QoderModelSettings>;
|
|
42
|
+
update(patch: QoderSettingsPatch): Promise<QoderModelSettings>;
|
|
43
|
+
}
|
|
44
|
+
/** 设置来源:register 后端优先,没有就落回凭据旁边的 JSON 文件。 */
|
|
45
|
+
export declare function qoderSettingsSource(preferences: QoderPreferenceStore | undefined, fallback: QoderModelSettingsStore): QoderSettingsSource;
|
|
46
|
+
export interface QoderRouteOptions {
|
|
47
|
+
fetchFn?: typeof fetch;
|
|
48
|
+
/** 本插件是否正在服务这条 Provider 路由;每次状态都重新读。 */
|
|
49
|
+
serving?: boolean | (() => boolean);
|
|
50
|
+
/** 路由被别的适配器占用时的诊断文案;每次状态都重新读。 */
|
|
51
|
+
conflict?: string | null | (() => string | null);
|
|
52
|
+
/** 号池;本进程装了才有。 */
|
|
53
|
+
accountPool?: QoderAccountPool;
|
|
54
|
+
/** 环境变量读取处;缺省 process.env,且**调用时**读取。 */
|
|
55
|
+
env?: NodeJS.ProcessEnv;
|
|
56
|
+
}
|
|
57
|
+
/** 号池切片的收紧形状(本线路状态面实际持有的那一部分)。 */
|
|
58
|
+
export interface QoderPoolSlice {
|
|
59
|
+
accounts: QoderAccountSummaryDto[];
|
|
60
|
+
rotationStrategy: AccountRotationStrategy;
|
|
61
|
+
activeAccountId?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface QoderStatusSources {
|
|
64
|
+
options: QoderRouteOptions;
|
|
65
|
+
settings: QoderSettingsSource;
|
|
66
|
+
/** 下一次登录要用的区域。 */
|
|
67
|
+
region: QoderRegion;
|
|
68
|
+
/** 号池切片:唯一装配它的地方是 account-pool 的 qoderPoolStatusSlice(这里只收紧形状)。 */
|
|
69
|
+
pool: QoderPoolSlice;
|
|
70
|
+
/** 本次读到的账号(卡片渲染用,不带任何凭据)。 */
|
|
71
|
+
account: QoderAccountSummaryDto | null;
|
|
72
|
+
/** 这个部署当前的模型目录(缓存读,轮询不联网)。 */
|
|
73
|
+
catalog: readonly QoderModelEntry[];
|
|
74
|
+
/** 本进程为当前账号记住的额度快照。 */
|
|
75
|
+
quota: QoderQuotaSnapshotDto | null;
|
|
76
|
+
/** 本次应答背后是否正在刷新额度。 */
|
|
77
|
+
quotaRefreshing: boolean;
|
|
78
|
+
/** 本次应答背后是否正在刷新模型目录(客户端据此排一次补读)。 */
|
|
79
|
+
catalogRefreshing: boolean;
|
|
80
|
+
/** 上一次额度读失败的原因;没有快照可渲染时为 null。 */
|
|
81
|
+
quotaError: string | null;
|
|
82
|
+
/** 本进程累计的缓存用量;尚无样本时为 undefined(客户端据此渲染占位符)。 */
|
|
83
|
+
cacheStats: QoderCacheStatsDto | undefined;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 组装 \`QoderStatusDto\`。
|
|
87
|
+
*
|
|
88
|
+
* 号池读不出来不能带倒整张卡:连接那一半仍然值得渲染,只是账号列表是空的。
|
|
89
|
+
*/
|
|
90
|
+
export declare function getQoderStatus(sources: QoderStatusSources): Promise<QoderStatusDto>;
|
|
91
|
+
/**
|
|
92
|
+
* 注册本线路的路由。
|
|
93
|
+
*
|
|
94
|
+
* 本文件不持有凭据:账号的落盘与轮转在号池,凭据由号池镜像。
|
|
95
|
+
* 设置的唯一写入点是 \`POST /settings\`。
|
|
96
|
+
*/
|
|
97
|
+
export declare function registerQoderRoutes(ctx: Context, settings: QoderSettingsSource, options?: QoderRouteOptions): () => void;
|
|
98
|
+
/**
|
|
99
|
+
* 插件启动时的一次目录预热(**非阻塞**,调用方不许 await)。
|
|
100
|
+
*
|
|
101
|
+
* 解决的问题见 client.ts 的 {@link warmQoderModelCatalog}:`cachedCatalog` 是进程内
|
|
102
|
+
* 的,宿主重启后它是空的,而磁盘快照里明明躺着上一次的真实目录;在用户第一次打开
|
|
103
|
+
* 设置页之前,`adapter.listModels` 读到的就是随包兜底表(15 条缺省模型),模型
|
|
104
|
+
* 选择器于是先把这一大片假模型摊出来,点一下设置页才恢复正常。
|
|
105
|
+
*
|
|
106
|
+
* 这里是**宿主侧的那一层**,它做三件 client.ts 不该知道的事:
|
|
107
|
+
*
|
|
108
|
+
* 1. **凭据从号池来**(`getQuotaReadTarget`,与 `refreshCatalog` 同一个入口):
|
|
109
|
+
* 目录是区域的属性,而哪个区域要看池里当前该展示的那一行。没有池、池里没有账号、
|
|
110
|
+
* 取凭据失败——三种情况都安静返回,不预热,**不报错**。
|
|
111
|
+
* 2. **对比预热前后的指纹**,只有目录真的换了才发 `llm/adapters-updated`:这条与
|
|
112
|
+
* `refreshCatalogAndAnnounce` 是同一条判词(client.ts 的 qoderCatalogFingerprint),
|
|
113
|
+
* 否则「目录变了没有」会在两条路径上给出两个答案。绝大多数启动里快照与上游一致,
|
|
114
|
+
* 一次事件都不发。没有快照时变化当场就发生;有快照时预热不等网络,变化是晚到的,
|
|
115
|
+
* 由 {@link observeQoderCatalogChange} 补发(两边都以同一份指纹为基线,不会重复)。
|
|
116
|
+
* 3. **全程吞错**:预热是尽力而为,它没有资格让插件装载或首次状态应答失败。
|
|
117
|
+
*/
|
|
118
|
+
export declare function warmQoderCatalogOnStartup(ctx: Context, options?: QoderRouteOptions): Promise<void>;
|
|
119
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/host/qoder/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qoder(订阅)线路的凭据 / 模型设置 / 偏好三件套。
|
|
3
|
+
*
|
|
4
|
+
* 本线路的凭据与 step-code 相反的那个性质先说清楚,因为它决定了本文件的设计:
|
|
5
|
+
*
|
|
6
|
+
* **凭据会过期、可刷新。** Qoder 的 job/device token 带着 `expires_at` / `expires_in`
|
|
7
|
+
* (pi-provider `pat.ts` / `login.ts`;qodercli2api `docs/oauth.md` §3)。所以:
|
|
8
|
+
*
|
|
9
|
+
* - 本文件**有** refresh 相关的一切(过期时刻、提前刷新量、刷新输入的留存);
|
|
10
|
+
* - PAT 来源的凭据**留住 PAT 本体**(host-only,绝不进共享契约),因为 PAT 的
|
|
11
|
+
* 「刷新」就是拿它重新兑换一把 job token(pi-provider `oauth.ts` 的
|
|
12
|
+
* `isPatRefresh` 路径同一做法);
|
|
13
|
+
* - 号池的 `expiresAt`/`needsRefresh`/`refresh` 钩子都是活的,
|
|
14
|
+
* 刷新失败按 401/403 → expired、其余 → 瞬时 分类(account-pool.ts)。
|
|
15
|
+
*
|
|
16
|
+
* 第二件必须记住的事:**本线路自己拥有它的凭据副本,但从不拥有 qodercli 的文件**。
|
|
17
|
+
* adopt 只是把 `~/.qoder/.auth/user` 读成一份快照存进本插件自己的凭据存储
|
|
18
|
+
* (`adopt.ts` 只读、不写、不删)。落盘的 adopt 凭据带 `adopted / source / sourcePath`
|
|
19
|
+
* 三个判别式字段,与其它线路的 adopt 语义一致。
|
|
20
|
+
*
|
|
21
|
+
* 三件套的分工与兄弟线路一致:凭据走 DPAPI / Keychain / Secret Service;
|
|
22
|
+
* 模型设置是明文 JSON,带写后回读校验;偏好在 harness 还提供 register 接缝时注册进
|
|
23
|
+
* 设置文档,没有就落回那个 JSON 文件。
|
|
24
|
+
*/
|
|
25
|
+
import type { CredentialStore } from '../token-store.ts';
|
|
26
|
+
import { type ContextWindowOverridePatch } from '../common/context-window-overrides.ts';
|
|
27
|
+
import type { QoderReasoningEffort, QoderRegion } from '../../shared/qoder-contracts.ts';
|
|
28
|
+
import { listModelIds } from './model-catalog.ts';
|
|
29
|
+
/** 本线路在设置文档里注册的命名空间。 */
|
|
30
|
+
export declare const QODER_PREFERENCES_NAMESPACE = "dsh-qoder";
|
|
31
|
+
/**
|
|
32
|
+
* 这份凭据是从哪条路来的。
|
|
33
|
+
*
|
|
34
|
+
* - `device`:浏览器设备流(仅全球区)。
|
|
35
|
+
* - `pat`:用户手动粘贴的 Personal Access Token 兑换来的 job token。
|
|
36
|
+
* - `adopt`:从本机 qodercli 客户端读来的登录态快照。
|
|
37
|
+
*
|
|
38
|
+
* 它与 `region` 是**两件事**:`region` 决定打哪套端点,`origin` 决定这份东西
|
|
39
|
+
* 怎么刷新(PAT 重兑换 vs refresh_token)以及本插件能不能对它做任何写操作。
|
|
40
|
+
*/
|
|
41
|
+
export type QoderCredentialOrigin = 'device' | 'pat' | 'adopt';
|
|
42
|
+
/** 本线路读 qodercli 登录态时的来源标记(与兄弟线路的 adopt 判别式同构)。 */
|
|
43
|
+
export declare const QODER_CLI_CREDENTIAL_SOURCE = "qoder-cli";
|
|
44
|
+
/**
|
|
45
|
+
* 一份可服务请求的 Qoder 凭据。
|
|
46
|
+
*
|
|
47
|
+
* 真正发请求只用 `accessToken`(Bearer + COSY 载荷里的 `security_oauth_token`)。
|
|
48
|
+
* 其余字段分四类:
|
|
49
|
+
*
|
|
50
|
+
* - **刷新输入**(`refreshToken` / `expiresAt` / `personalToken`):过期后续命的原料;
|
|
51
|
+
* - **非机密的账号事实**(`uid` / `email` / `accountName`):COSY 载荷与卡片渲染用;
|
|
52
|
+
* - **路由事实**(`region`):它唯一决定端点表,见 `./types.ts` 的 `REGION_HOSTS`;
|
|
53
|
+
* - **COSY 头的条件字段**(`organizationId` / `organizationTags` / `dataPolicyAgreed`):
|
|
54
|
+
* 非空才出现在请求头里(inference-protocol.md §2 的 presence 矩阵);
|
|
55
|
+
* - adopt 判别式(`adopted` / `source` / `sourcePath`):见文件头。
|
|
56
|
+
*/
|
|
57
|
+
export interface QoderCredentials {
|
|
58
|
+
/** 真正发请求用的 job/device token。Host-only,永不过共享边界。 */
|
|
59
|
+
accessToken: string;
|
|
60
|
+
/** 刷新令牌(`jrt-...` 或设备流的 refresh_token);没有时为 null。 */
|
|
61
|
+
refreshToken: string | null;
|
|
62
|
+
/** 过期时刻(Unix 毫秒,已含安全边);上游没给时按兑换时刻 + 24h 兜底。 */
|
|
63
|
+
expiresAt: number;
|
|
64
|
+
/** 凭据自述的区域;**端点由它唯一决定**,不另存一份。 */
|
|
65
|
+
region: QoderRegion;
|
|
66
|
+
origin: QoderCredentialOrigin;
|
|
67
|
+
/** 上游账号 id(COSY 的 `Cosy-User`);缺它 CN 会报「Login expired」(105)。 */
|
|
68
|
+
uid: string | null;
|
|
69
|
+
/** 账号邮箱(COSY UserInfo 的 `email`,非机密);没有时为 null。 */
|
|
70
|
+
email: string | null;
|
|
71
|
+
/** 账号显示名(COSY UserInfo 的 `name`);没有时为 null。 */
|
|
72
|
+
accountName: string | null;
|
|
73
|
+
/**
|
|
74
|
+
* PAT 来源的凭据留住的 PAT 本体(`pt-...`)。
|
|
75
|
+
*
|
|
76
|
+
* **Host-only,永远不过共享契约的边界**:它的唯一用途是过期后重新兑换一把
|
|
77
|
+
* job token(pi-provider 把 PAT 编进 refresh 字段,同一件事)。非 PAT 来源为 null。
|
|
78
|
+
*/
|
|
79
|
+
personalToken: string | null;
|
|
80
|
+
/** 组织 id(`Cosy-Organization-Id` 的条件字段);个人账号为 null。 */
|
|
81
|
+
organizationId: string | null;
|
|
82
|
+
/** 组织 tags(`Cosy-Organization-Tags` 的条件字段,逗号连接前的那份数组)。 */
|
|
83
|
+
organizationTags: string[];
|
|
84
|
+
/** `Cosy-Data-Policy` 的取值开关:true → `agree`,否则 `disagree`(fixture 的默认)。 */
|
|
85
|
+
dataPolicyAgreed: boolean;
|
|
86
|
+
/** 本插件接管这份凭据的时刻(Unix 毫秒)。 */
|
|
87
|
+
authenticatedAt: number;
|
|
88
|
+
/** 判别式,取字面量 `true`(与兄弟线路同:一个布尔比一句注释更难被忽略)。 */
|
|
89
|
+
adopted?: true;
|
|
90
|
+
/** 恒为 {@link QODER_CLI_CREDENTIAL_SOURCE}。 */
|
|
91
|
+
source?: typeof QODER_CLI_CREDENTIAL_SOURCE;
|
|
92
|
+
/** 读的是哪个文件,卡片照它显示。 */
|
|
93
|
+
sourcePath?: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 校验并归一化一份落盘的凭据。
|
|
97
|
+
*
|
|
98
|
+
* 缺的字段一律拒绝而不是补默认值:缺 `accessToken` 的凭据发出去一定是一次 401;
|
|
99
|
+
* 缺 `uid` 的凭据在 CN 会被报「Login expired」(105)——但它不拒绝:全球区对这个字段
|
|
100
|
+
* 更宽容,而号池装配侧会在发卡前尽力补齐(oauth.ts 的 userinfo 步骤)。
|
|
101
|
+
*
|
|
102
|
+
* `region` 认不出来时**拒绝**而不是回落默认:落盘的凭据总该自述;猜错的代价是
|
|
103
|
+
* 拿一区的凭据去打另一区的端点,一次明确的鉴权失败,排查成本远高于重新登录。
|
|
104
|
+
*/
|
|
105
|
+
export declare function parseQoderCredentials(value: unknown): QoderCredentials;
|
|
106
|
+
/**
|
|
107
|
+
* 一份凭据是不是 adopt 快照(号池与适配器据此知道它的上游权威是 qodercli 的文件)。
|
|
108
|
+
*
|
|
109
|
+
* 它读的是**凭据对象本身**而不是某个内存标记(同 step-code 的同名函数的理由)。
|
|
110
|
+
*/
|
|
111
|
+
export declare function isAdoptedQoderCredential(credentials: QoderCredentials): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* 凭据的失效时刻:自述的 `expiresAt`;缺 0 时按「接管时刻 + 24h」补一份诚实的兜底
|
|
114
|
+
* (pi-provider 的缺省寿命),让号池的刷新钩子有东西可判。
|
|
115
|
+
*/
|
|
116
|
+
export declare function qoderCredentialsExpireAt(credentials: QoderCredentials): number;
|
|
117
|
+
/**
|
|
118
|
+
* 这份凭据需不需要刷新:`expiresAt - 3600_000 < now` 时刷新
|
|
119
|
+
* (逐字 qodercli2api `docs/oauth.md` §3 的提前 1 小时)。
|
|
120
|
+
*/
|
|
121
|
+
export declare function qoderCredentialsNeedRefresh(credentials: QoderCredentials, now: number): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* 兑换/刷新响应里的过期时刻 → Unix 毫秒(已含 5 分钟安全边)。
|
|
124
|
+
*
|
|
125
|
+
* 三种形态都收(计划 §9 风险 6):
|
|
126
|
+
*
|
|
127
|
+
* - `expiresAt`:ISO 字符串或 Unix 秒/毫秒——用**量级**分辨(10^10 秒是 2286 年,
|
|
128
|
+
* 更大的数一定已经是毫秒);
|
|
129
|
+
* - `expiresIn`:相对时长。pi-provider 注释说观测到的是**毫秒**,qodercli2api 按秒读;
|
|
130
|
+
* 同一量级判据两处都兼容(小于 10^7 的值按秒才合理:10^7 秒约 4 个月,
|
|
131
|
+
* 而一把 job token 的寿命以小时/天计)。
|
|
132
|
+
*/
|
|
133
|
+
export declare function qoderExpiresAtFrom(expiresAt: unknown, expiresIn: unknown, now?: number): number;
|
|
134
|
+
/** 凭据文件路径(本线路自己拥有;号池把主账号镜像到这里)。 */
|
|
135
|
+
export declare function credentialPath(): string;
|
|
136
|
+
/** 模型设置文件路径。 */
|
|
137
|
+
export declare function modelSettingsPath(): string;
|
|
138
|
+
/**
|
|
139
|
+
* machine id 文件路径(本线路自己持有的那份)。
|
|
140
|
+
*
|
|
141
|
+
* adopt 优先读 qodercli 的 `~/.qoder/.auth/machine_id`(解密它的凭据文件必须用那把
|
|
142
|
+
* 原配 key);本线路自己发请求用的 machine id 落在这里——不与 qodercli 的混用,
|
|
143
|
+
* 也不写它的目录(读取顺序见 cosy.ts)。
|
|
144
|
+
*/
|
|
145
|
+
export declare function machineIdPath(): string;
|
|
146
|
+
/**
|
|
147
|
+
* 加密凭据存储。
|
|
148
|
+
*
|
|
149
|
+
* 与兄弟线路同构:写入之后回读比对;按路径排队,避免两个同时落地的写互相丢掉。
|
|
150
|
+
* 没有明文迁移分支(本线路从未发布过,没有历史文件要迁)。
|
|
151
|
+
*/
|
|
152
|
+
export declare class QoderCredentialStore {
|
|
153
|
+
private readonly filePath;
|
|
154
|
+
private readonly backend;
|
|
155
|
+
constructor(filePath?: string, backend?: CredentialStore<QoderCredentials>);
|
|
156
|
+
/** 人可读的存储位置说明(Windows DPAPI / macOS Keychain / Linux Secret Service)。 */
|
|
157
|
+
path(): string;
|
|
158
|
+
read(): Promise<QoderCredentials | null>;
|
|
159
|
+
write(credentials: QoderCredentials): Promise<void>;
|
|
160
|
+
delete(): Promise<void>;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 本线路设置文档里**用户自己**的那一半。
|
|
164
|
+
*
|
|
165
|
+
* 随包目录 `QODER_MODEL_CATALOG_*` 刻意不存:它跟着代码走(同 step-code 的理由)。
|
|
166
|
+
*/
|
|
167
|
+
export interface QoderModelSettings {
|
|
168
|
+
/** 线路总开关。只有显式 false 才是关闭。 */
|
|
169
|
+
enabled?: boolean;
|
|
170
|
+
/**
|
|
171
|
+
* 用户勾选的模型 id,**三态**:
|
|
172
|
+
*
|
|
173
|
+
* - `null` = 不过滤(全部可用)——出厂默认,也是「这条线路没被挑过」的状态;
|
|
174
|
+
* - `[]` = 用户明确把每一个模型都关掉(一个都不可用);
|
|
175
|
+
* - 非空 = 白名单,只有列出的那些可用。
|
|
176
|
+
*
|
|
177
|
+
* 为什么必须有第三态:schemastery 会把缺省的 `z.array(z.string())` 归一化成 `[]`,
|
|
178
|
+
* 一旦「空数组」同时表示「没挑过」,卡片上的「全不选」提交 `[]` 就与「全选」
|
|
179
|
+
* 完全等价——那是实测出来的真 bug,不是风格问题。
|
|
180
|
+
*/
|
|
181
|
+
enabledModelIds: string[] | null;
|
|
182
|
+
/** 逐模型上下文窗口覆盖;缺省用目录声明值。 */
|
|
183
|
+
contextWindowOverrides: Record<string, number>;
|
|
184
|
+
/** 会话没指定档位时用的档位;null 表示各模型用自己的默认。 */
|
|
185
|
+
defaultReasoningEffort: QoderReasoningEffort | null;
|
|
186
|
+
/** 手动指定下一个请求使用的账号;null 交回号池调度。 */
|
|
187
|
+
selectedAccountId: string | null;
|
|
188
|
+
/**
|
|
189
|
+
* 勾选语义的**迁移标记**:`QODER_SELECTION_VERSION` 表示「这份文档由三态代码写过」。
|
|
190
|
+
*
|
|
191
|
+
* 为什么需要它(删掉它等于升级即坏):三态之前,`defaultQoderModelSettings()` 返回的是
|
|
192
|
+
* `enabledModelIds: [...DEFAULT_VISIBLE_MODEL_IDS]`,而 qoder 的
|
|
193
|
+
* `DEFAULT_VISIBLE_MODEL_IDS` 就是 `[]`。所以**每一个老用户的落盘文件里都写着
|
|
194
|
+
* `"enabledModelIds": []`**,而旧语义下那个 `[]` 的意思是「不过滤(全部可用)」。
|
|
195
|
+
* 新语义里 `[]` 是「用户明确全关」。两者字面完全一样,只靠 `enabledModelIds`
|
|
196
|
+
* 本身分不开——没有这个标记,所有老用户升级后都会一个模型都不剩,而他们从没点过
|
|
197
|
+
* 「全不选」。
|
|
198
|
+
*
|
|
199
|
+
* 有了它,读文档时才能区分「旧版本的默认空表」与「用户真的点了全不选」:
|
|
200
|
+
* 无标记 + `[]` → 迁移成 `null`;有标记 + `[]` → 如实保留。
|
|
201
|
+
*/
|
|
202
|
+
selectionVersion: number;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* 当前勾选语义的版本号。1 = 三态(null / [] / 白名单)。
|
|
206
|
+
*
|
|
207
|
+
* 只增不减:以后若再改语义,把它 +1 并补一条新的迁移分支,而不是复用旧编号。
|
|
208
|
+
*/
|
|
209
|
+
export declare const QODER_SELECTION_VERSION = 1;
|
|
210
|
+
/** 一个设置补丁。 */
|
|
211
|
+
export interface QoderSettingsPatch {
|
|
212
|
+
enabled?: boolean;
|
|
213
|
+
/** 三态补丁:`null` 是**值**(回到不过滤),`[]` 也是值(全关),不是「没带这个字段」。 */
|
|
214
|
+
enabledModelIds?: string[] | null;
|
|
215
|
+
/** 补丁而不是整张表:`null` 必须能作为一个**值**活下来(卡片的「恢复目录默认」)。 */
|
|
216
|
+
contextWindowOverrides?: ContextWindowOverridePatch;
|
|
217
|
+
defaultReasoningEffort?: QoderReasoningEffort | null;
|
|
218
|
+
selectedAccountId?: string | null;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 路由与适配器共用的接缝(与 step-code 同一个形状,`status()` 同步的理由也相同)。
|
|
222
|
+
*/
|
|
223
|
+
export interface QoderPreferenceStore {
|
|
224
|
+
ready(): Promise<void>;
|
|
225
|
+
status(): QoderModelSettings;
|
|
226
|
+
update(patch: QoderSettingsPatch): Promise<QoderModelSettings>;
|
|
227
|
+
}
|
|
228
|
+
/** 一次全新安装的设置:全开、无过滤、无覆盖、无指定账号。 */
|
|
229
|
+
export declare function defaultQoderModelSettings(): QoderModelSettings;
|
|
230
|
+
/**
|
|
231
|
+
* 这份**原始**设置文档是否还停在旧语义上、需要一次迁移落盘。
|
|
232
|
+
*
|
|
233
|
+
* 判据只有一条:没有当前版本的迁移标记,且 `enabledModelIds` 是空数组。
|
|
234
|
+
* 旧版本把「没挑过」写成 `[]`(出厂值就是 `[]`,见 `QoderModelSettings.selectionVersion`
|
|
235
|
+
* 那段证据),所以这种文档必须被改写成 `null` 并盖上标记。
|
|
236
|
+
*
|
|
237
|
+
* 单独抽出来是因为落盘那一侧要先问「要不要迁移」再决定写不写,而
|
|
238
|
+
* {@link parseQoderModelSettings} 只负责给出解析后的值。
|
|
239
|
+
*/
|
|
240
|
+
export declare function needsQoderSelectionMigration(value: unknown): boolean;
|
|
241
|
+
/**
|
|
242
|
+
* 归一化一份解析出来的设置文档。什么都不抛:手改过或降级过的文档必须降级成一份
|
|
243
|
+
* 可用的选择,而不是让整条线路不可用。
|
|
244
|
+
*/
|
|
245
|
+
export declare function parseQoderModelSettings(value: unknown): QoderModelSettings;
|
|
246
|
+
/** 把一个补丁应用到一份设置文档上(register 与文件两个后端共用这一套规则)。 */
|
|
247
|
+
export declare function mergeQoderSettings(current: QoderModelSettings, patch: QoderSettingsPatch): QoderModelSettings;
|
|
248
|
+
/**
|
|
249
|
+
* 凭据旁边的设置文件(没有 register 接缝的 harness 启动时读的就是它)。
|
|
250
|
+
* 写入走「临时文件 + rename」,写完立刻回读比对再报告成功。
|
|
251
|
+
*/
|
|
252
|
+
export declare class QoderModelSettingsStore {
|
|
253
|
+
private readonly filePath;
|
|
254
|
+
constructor(filePath?: string);
|
|
255
|
+
path(): string;
|
|
256
|
+
/**
|
|
257
|
+
* 读一份设置,**并顺手完成一次性迁移**。
|
|
258
|
+
*
|
|
259
|
+
* 迁移必须落盘(否则下一次读到的还是同一份旧文档),所以整个「读 → 判断 → 写回」
|
|
260
|
+
* 跑在 {@link serialize} 的同一条按路径队列里:与 `updateSettings` 的读-改-写互斥,
|
|
261
|
+
* 不会出现「迁移写把用户刚提交的选择覆盖回去」这种顺序问题。
|
|
262
|
+
*/
|
|
263
|
+
read(): Promise<QoderModelSettings>;
|
|
264
|
+
/** 不做迁移的裸读;只给已经在队列里的调用方用(避免 serialize 自我嵌套死锁)。 */
|
|
265
|
+
private readRaw;
|
|
266
|
+
write(settings: QoderModelSettings): Promise<void>;
|
|
267
|
+
/** 在与凭据写入同一条按路径排队的锁里做「读-改-写」。 */
|
|
268
|
+
updateSettings(patch: QoderSettingsPatch): Promise<QoderModelSettings>;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* 把模型选择绑到 DSH 设置文档(harness 还提供 register 接缝时),
|
|
272
|
+
* 否则绑到凭据旁边的 JSON 文件。
|
|
273
|
+
*
|
|
274
|
+
* ⚠ `enabledModelIds` 是三态,schema 必须**显式**声明 `null` 这一格并把缺省值定成
|
|
275
|
+
* `null`:只写 `z.array(z.string())` 时 schemastery 会把缺省归一化成 `[]`,
|
|
276
|
+
* 那正好把「没挑过」翻译成「用户全关」,卡片上就再也点不出全关了。
|
|
277
|
+
*/
|
|
278
|
+
export declare function registerQoderPreferenceStore(settings?: unknown, fallbackStore?: QoderModelSettingsStore): QoderPreferenceStore;
|
|
279
|
+
export { listModelIds };
|
|
280
|
+
//# sourceMappingURL=token-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../../../src/host/qoder/token-store.ts"],"names":[],"mappings":"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"}
|