dsh-llm-ustc 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/lib/oidc.js ADDED
@@ -0,0 +1,208 @@
1
+ import { createHash, createHmac, randomBytes } from 'node:crypto';
2
+ import { request as httpsRequest } from 'node:https';
3
+ import { IWAN_APP_SECRET, validateIwanConfig } from "./iwan.js";
4
+ const AUTH_URL = 'https://auth.ivpn.ustc.edu.cn/login/oauth/authorize';
5
+ const ISSUER = 'https://auth.ivpn.ustc.edu.cn';
6
+ const TOKEN_URL = 'https://auth.ivpn.ustc.edu.cn/api/login/oauth/access_token';
7
+ const CONTROLLER = 'https://crtl.ivpn.ustc.edu.cn';
8
+ const CLIENT_ID = 'afc6479ffb531d71daef';
9
+ const REDIRECT = 'com.panabit.mobile://oauth2redirect';
10
+ const SCOPE = 'openid profile email offline_access';
11
+ const DOMAIN = 'iwan.ustc';
12
+ const APP_ID = 'controller-ustc';
13
+ const TRANSACTION_TTL_MS = 10 * 60 * 1_000;
14
+ const REQUEST_TIMEOUT_MS = 8_000;
15
+ const MAX_RESPONSE_BYTES = 1024 * 1024;
16
+ export class IwanAuthenticator {
17
+ requester;
18
+ pending = new Map();
19
+ constructor(requester = requestJson) {
20
+ this.requester = requester;
21
+ }
22
+ begin() {
23
+ const verifier = randomBytes(64).toString('base64url');
24
+ const challenge = createHash('sha256').update(verifier).digest('base64url');
25
+ const state = randomBytes(24).toString('base64url');
26
+ const expiresAt = Date.now() + TRANSACTION_TTL_MS;
27
+ for (const [key, transaction] of this.pending) {
28
+ if (transaction.expiresAt <= Date.now())
29
+ this.pending.delete(key);
30
+ }
31
+ this.pending.set(state, { verifier, expiresAt });
32
+ const url = new URL(AUTH_URL);
33
+ url.searchParams.set('client_id', CLIENT_ID);
34
+ url.searchParams.set('redirect_uri', REDIRECT);
35
+ url.searchParams.set('response_type', 'code');
36
+ url.searchParams.set('scope', SCOPE);
37
+ url.searchParams.set('code_challenge', challenge);
38
+ url.searchParams.set('code_challenge_method', 'S256');
39
+ url.searchParams.set('state', state);
40
+ return { authUrl: url.toString(), expiresInSeconds: TRANSACTION_TTL_MS / 1_000 };
41
+ }
42
+ async complete(callbackUrl) {
43
+ const { code, verifier } = this.takeTransaction(callbackUrl);
44
+ const tokenBody = Buffer.from(JSON.stringify({
45
+ client_id: CLIENT_ID,
46
+ code,
47
+ code_verifier: verifier,
48
+ redirect_uri: REDIRECT,
49
+ grant_type: 'authorization_code',
50
+ }));
51
+ const token = await this.requester(new URL(TOKEN_URL), tokenBody, { 'content-type': 'application/json' });
52
+ if (!isRecord(token) || typeof token.access_token !== 'string' || token.access_token.length === 0) {
53
+ throw new Error('OIDC response has no access token');
54
+ }
55
+ const username = typeof token.id_token === 'string' ? usernameFromIdToken(token.id_token) : undefined;
56
+ return this.fetchServers(token.access_token, username ?? 'unknown');
57
+ }
58
+ takeTransaction(callbackUrl) {
59
+ let url;
60
+ try {
61
+ url = new URL(callbackUrl);
62
+ }
63
+ catch (error) {
64
+ throw new TypeError('invalid callback URL', { cause: error });
65
+ }
66
+ if (url.protocol !== 'com.panabit.mobile:' || url.hostname !== 'oauth2redirect') {
67
+ throw new TypeError('callback URL has an unexpected scheme or target');
68
+ }
69
+ const state = url.searchParams.get('state');
70
+ const code = url.searchParams.get('code');
71
+ if (state === null || state.length === 0)
72
+ throw new TypeError('callback URL has no state');
73
+ if (code === null || code.length === 0)
74
+ throw new TypeError('callback URL has no authorization code');
75
+ const transaction = this.pending.get(state);
76
+ this.pending.delete(state);
77
+ if (transaction === undefined)
78
+ throw new TypeError('OIDC transaction is missing or already consumed');
79
+ if (transaction.expiresAt <= Date.now())
80
+ throw new TypeError('OIDC transaction expired');
81
+ const issuer = url.searchParams.get('iss');
82
+ if (issuer !== null && issuer.replace(/\/+$/u, '') !== ISSUER) {
83
+ throw new TypeError('callback URL has an unexpected issuer');
84
+ }
85
+ return { code, verifier: transaction.verifier };
86
+ }
87
+ async fetchServers(accessToken, username) {
88
+ const body = {
89
+ domain: DOMAIN,
90
+ type: 'android',
91
+ oem_name: 'panabit',
92
+ device_id: randomBytes(8).toString('hex'),
93
+ userName: username,
94
+ serverlist_version: '0',
95
+ ipfilter_version: '0',
96
+ branding_version: '0',
97
+ };
98
+ await this.controllerPost('/m/auth', body, accessToken);
99
+ await this.controllerPost('/m/keepalive', { ...body, type: 'keepalive' }, accessToken);
100
+ const response = await this.controllerPost('/m/config', body, accessToken);
101
+ const serverList = readServerList(response);
102
+ return validateIwanConfig({
103
+ domain: DOMAIN,
104
+ servers: serverList.map((server, index) => {
105
+ const host = requiredString(server, 'serverName');
106
+ const port = typeof server.serverPort === 'number' ? server.serverPort : 6001;
107
+ const lineUsername = requiredString(server, 'userName');
108
+ return {
109
+ id: `line-${createHash('sha256').update(`${index}\0${host}\0${port}\0${lineUsername}`).digest('hex').slice(0, 16)}`,
110
+ name: requiredString(server, 'name'),
111
+ host,
112
+ port,
113
+ username: lineUsername,
114
+ passWord: requiredString(server, 'passWord'),
115
+ };
116
+ }),
117
+ });
118
+ }
119
+ controllerPost(path, body, accessToken) {
120
+ const timestamp = Math.floor(Date.now() / 1_000).toString();
121
+ const nonce = randomBytes(16).toString('hex').toUpperCase();
122
+ const bytes = Buffer.from(JSON.stringify(body));
123
+ const bodyHash = createHash('sha256').update(bytes).digest('hex');
124
+ const canonical = `POST\n${path}\n\n${bodyHash}\n${timestamp}\n${nonce}`;
125
+ const signature = createHmac('sha256', IWAN_APP_SECRET).update(canonical).digest('hex');
126
+ return this.requester(new URL(path, CONTROLLER), bytes, {
127
+ authorization: `Bearer ${accessToken}`,
128
+ 'x-auth-appid': APP_ID,
129
+ 'x-auth-timestamp': timestamp,
130
+ 'x-auth-nonce': nonce,
131
+ 'x-auth-sign': signature,
132
+ 'content-type': 'application/json',
133
+ });
134
+ }
135
+ }
136
+ function requestJson(url, body, headers) {
137
+ return new Promise((resolve, reject) => {
138
+ const request = httpsRequest(url, {
139
+ method: 'POST',
140
+ agent: false,
141
+ headers: { ...headers, 'content-length': String(body.length), accept: 'application/json' },
142
+ }, response => {
143
+ const chunks = [];
144
+ let size = 0;
145
+ response.on('data', (chunk) => {
146
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
147
+ size += bytes.length;
148
+ if (size > MAX_RESPONSE_BYTES) {
149
+ request.destroy(new Error('iWAN control response is too large'));
150
+ return;
151
+ }
152
+ chunks.push(bytes);
153
+ });
154
+ response.once('end', () => {
155
+ const status = response.statusCode ?? 0;
156
+ if (status < 200 || status >= 300) {
157
+ reject(new Error(`${url.hostname} answered HTTP ${status}`));
158
+ return;
159
+ }
160
+ try {
161
+ resolve(JSON.parse(Buffer.concat(chunks).toString('utf8')));
162
+ }
163
+ catch (error) {
164
+ reject(new Error(`${url.hostname} returned invalid JSON`, { cause: error }));
165
+ }
166
+ });
167
+ });
168
+ request.setTimeout(REQUEST_TIMEOUT_MS, () => request.destroy(new Error(`${url.hostname} connection timed out`)));
169
+ request.once('error', reject);
170
+ request.end(body);
171
+ });
172
+ }
173
+ function readServerList(value) {
174
+ if (!isRecord(value) || !isRecord(value.serverlist) || !Array.isArray(value.serverlist.serverlist)) {
175
+ throw new Error('controller response has no server list');
176
+ }
177
+ return value.serverlist.serverlist.map(server => {
178
+ if (!isRecord(server))
179
+ throw new Error('controller response contains an invalid server');
180
+ return server;
181
+ });
182
+ }
183
+ function requiredString(value, key) {
184
+ const result = value[key];
185
+ if (typeof result !== 'string' || result.length === 0)
186
+ throw new Error(`server has no ${key}`);
187
+ return result;
188
+ }
189
+ function usernameFromIdToken(token) {
190
+ const payload = token.split('.')[1];
191
+ if (payload === undefined)
192
+ return undefined;
193
+ try {
194
+ const value = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
195
+ if (!isRecord(value))
196
+ return undefined;
197
+ for (const key of ['name', 'preferred_username', 'sub']) {
198
+ if (typeof value[key] === 'string')
199
+ return value[key];
200
+ }
201
+ }
202
+ catch { }
203
+ return undefined;
204
+ }
205
+ function isRecord(value) {
206
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
207
+ }
208
+ //# sourceMappingURL=oidc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.js","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAEL,UAAU,EAIV,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAW7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAiBtD,qBAAa,WAAY,SAAQ,UAAU;IAIvC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,QAAQ,CAAmD;gBAGhD,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,YAAY;IAK/B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAK5D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IAKpD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAU9D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAe3E,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;IAY5E,UAAU,IAAI,IAAI;YAIJ,eAAe;IAuB7B,OAAO,CAAC,cAAc;CAGvB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtE"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAEL,UAAU,EAIV,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAW7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAatD,qBAAa,WAAY,SAAQ,UAAU;IAIvC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,QAAQ,CAAmD;gBAGhD,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,YAAY;IAK/B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAK5D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IAKpD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAU9D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAe3E,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;IAY5E,UAAU,IAAI,IAAI;YAIJ,eAAe;IAuB7B,OAAO,CAAC,cAAc;CAGvB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtE"}
@@ -49,19 +49,10 @@ interface PublicServer {
49
49
  name: string;
50
50
  endpoint: string;
51
51
  }
52
- interface HelperStatus {
53
- protocol: 'v1';
54
- target: 'api.llm.ustc.edu.cn:443';
55
- route: 'direct' | 'iwan';
56
- iwanConfigured: boolean;
57
- selectedServerId?: string;
58
- tunnelRunning: boolean;
59
- }
60
52
  interface SettingsSnapshot {
61
53
  writable: boolean;
62
54
  revision: number;
63
55
  selectedServerId?: string;
64
- directReprobeSeconds: number;
65
56
  apiKey: {
66
57
  configured: boolean;
67
58
  source?: string;
@@ -73,7 +64,7 @@ interface SettingsSnapshot {
73
64
  writable: boolean;
74
65
  servers: PublicServer[];
75
66
  };
76
- helper?: HelperStatus;
67
+ usingIwan: boolean;
77
68
  models: {
78
69
  id: string;
79
70
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import z from '@deepseek-ai/schemastery';
2
2
  export interface Config {
3
3
  selectedServerId?: string;
4
- directReprobeSeconds?: number;
4
+ directRecoverySeconds?: number;
5
5
  }
6
6
  export declare const Config: z<Config>;
7
7
  export interface ResolvedConfig {
8
8
  selectedServerId?: string;
9
- directReprobeSeconds: number;
9
+ directRecoverySeconds: number;
10
10
  }
11
11
  export declare function resolveConfig(config: Config): ResolvedConfig;
12
12
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,MAAM,WAAW,MAAM;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAG3B,CAAA;AAEF,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAU5D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,MAAM,WAAW,MAAM;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAG3B,CAAA;AAEF,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAU5D"}
@@ -6,6 +6,6 @@ export declare const IWAN_CONFIG_REF = "USTC_LLM_IWAN_CONFIG";
6
6
  export declare const DEFAULT_MODEL = "deepseek-v4-flash-ascend";
7
7
  export declare const DEFAULT_CONTEXT_WINDOW = 262144;
8
8
  export declare const DEFAULT_MAX_TOKENS = 32768;
9
- export declare const HELPER_PROTOCOL = "v1";
9
+ export declare const HELPER_PROTOCOL = "v2";
10
10
  export declare const SETTINGS_ROUTE = "/_dsh/llm-ustc/settings";
11
11
  //# sourceMappingURL=constants.d.ts.map
@@ -1,19 +1,10 @@
1
1
  import type { Context } from '@deepseek-ai/cordis';
2
2
  import type { ResolvedConfig } from './config.ts';
3
- import type { CachedModel, HelperStatus, IwanConfig, PublicServer } from './types.ts';
4
3
  export interface HelperEndpoint {
5
4
  baseURL: string;
6
5
  generation: number;
7
6
  headers: Readonly<Record<string, string>>;
8
7
  }
9
- export interface OidcBegin {
10
- authUrl: string;
11
- expiresInSeconds: number;
12
- }
13
- export interface OidcComplete {
14
- servers: PublicServer[];
15
- iwanConfig: IwanConfig;
16
- }
17
8
  export declare class HelperManager {
18
9
  private readonly ctx;
19
10
  private child;
@@ -22,30 +13,22 @@ export declare class HelperManager {
22
13
  private starting;
23
14
  private lifecycle;
24
15
  private closed;
25
- private recoveredModels;
16
+ private usingIwan;
17
+ private directRecovered;
26
18
  private config;
27
19
  private generation;
28
20
  constructor(ctx: Context, config: ResolvedConfig);
29
21
  reconfigure(config: ResolvedConfig): void;
30
22
  stageSelectedServer(serverId: string): () => void;
31
- onRecoveredModels(handler: (models: CachedModel[]) => Promise<void>): void;
23
+ onDirectRecovered(handler: () => Promise<void>): void;
32
24
  ensureStarted(): Promise<string>;
33
25
  endpoint(): Promise<HelperEndpoint>;
34
26
  stop(): Promise<void>;
35
27
  private stopNow;
36
28
  dispose(): Promise<void>;
37
- request<T>(path: string, init?: RequestInit, timeoutMs?: number): Promise<T>;
38
29
  fetch(path: string, init?: RequestInit): Promise<Response>;
39
- status(): Promise<HelperStatus>;
40
- refreshRoute(apiKey?: string): Promise<HelperStatus>;
41
- statusIfRunning(): Promise<HelperStatus | undefined>;
42
- servers(): Promise<PublicServer[]>;
43
- beginOidc(): Promise<OidcBegin>;
44
- completeOidc(callbackUrl: string): Promise<OidcComplete>;
45
- selectServer(serverId: string, apiKey?: string): Promise<void>;
30
+ get route(): boolean;
31
+ refreshRoute(): Promise<void>;
46
32
  private start;
47
33
  }
48
- export declare function parseHelperEvent(line: string): CachedModel[] | undefined;
49
- export declare function sanitizedEnvironment(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
50
- export declare function secretFingerprint(secret: string): string;
51
34
  //# sourceMappingURL=helper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../src/helper.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAQrF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAC1C;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,qBAAa,aAAa;IAWZ,OAAO,CAAC,QAAQ,CAAC,GAAG;IAVhC,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,eAAe,CAAwD;IAC/E,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAI;gBAEO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc;IAIjE,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAMzC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,IAAI;IAMjD,iBAAiB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIpE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAShC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAWnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,OAAO;IAef,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;IAkBhF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAapE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAIzB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOpD,eAAe,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAe1D,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIlC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAIzB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IASxD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQtD,KAAK;CAkEpB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,SAAS,CAYxE;AAYD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAQjF;AAyBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD"}
1
+ {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../src/helper.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIjD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAC1C;AAED,qBAAa,aAAa;IAYZ,OAAO,CAAC,QAAQ,CAAC,GAAG;IAXhC,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAI;gBAEO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc;IAIjE,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAMzC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,IAAI;IAMjD,iBAAiB,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI/C,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAShC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IASnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,OAAO;IAgBf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAapE,IAAI,KAAK,IAAI,OAAO,CAEnB;IAEK,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAoBrB,KAAK;CA+EpB"}
@@ -0,0 +1,8 @@
1
+ import type { IwanConfig, PublicServer, TunnelCredential } from './types.ts';
2
+ export declare const IWAN_APP_SECRET = "ca6a3532abd2986a03b86b3a";
3
+ export declare function parseIwanConfig(raw: string): IwanConfig;
4
+ export declare function validateIwanConfig(value: unknown): IwanConfig;
5
+ export declare function publicIwanServers(raw: string | undefined): PublicServer[];
6
+ export declare function selectedTunnel(raw: string | undefined, serverId: string | undefined): TunnelCredential | undefined;
7
+ export declare function decryptPassword(domain: string, username: string, encrypted: string): string;
8
+ //# sourceMappingURL=iwan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iwan.d.ts","sourceRoot":"","sources":["../../src/iwan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAc,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAExF,eAAO,MAAM,eAAe,6BAA6B,CAAA;AAEzD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAQvD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAM7D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,EAAE,CAWzE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAWlH;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAiB3F"}
@@ -0,0 +1,17 @@
1
+ import type { IwanConfig } from './types.ts';
2
+ export interface OidcBegin {
3
+ authUrl: string;
4
+ expiresInSeconds: number;
5
+ }
6
+ export type IwanRequester = (url: URL, body: Buffer, headers: Readonly<Record<string, string>>) => Promise<unknown>;
7
+ export declare class IwanAuthenticator {
8
+ private readonly requester;
9
+ private readonly pending;
10
+ constructor(requester?: IwanRequester);
11
+ begin(): OidcBegin;
12
+ complete(callbackUrl: string): Promise<IwanConfig>;
13
+ private takeTransaction;
14
+ private fetchServers;
15
+ private controllerPost;
16
+ }
17
+ //# sourceMappingURL=oidc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../../src/oidc.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAoB5C,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KACtC,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;gBAE5B,SAAS,GAAE,aAA2B;IAEnE,KAAK,IAAI,SAAS;IAoBZ,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAiBxD,OAAO,CAAC,eAAe;YAuBT,YAAY;IAiC1B,OAAO,CAAC,cAAc;CAiBvB"}
@@ -15,6 +15,12 @@ export interface PublicServer {
15
15
  name: string;
16
16
  endpoint: string;
17
17
  }
18
+ export interface TunnelCredential {
19
+ host: string;
20
+ port: number;
21
+ username: string;
22
+ password: string;
23
+ }
18
24
  export interface CachedModel {
19
25
  id: string;
20
26
  name: string;
@@ -23,12 +29,4 @@ export interface PluginState {
23
29
  models: CachedModel[];
24
30
  modelsUpdatedAt?: string;
25
31
  }
26
- export interface HelperStatus {
27
- protocol: 'v1';
28
- target: 'api.llm.ustc.edu.cn:443';
29
- route: 'direct' | 'iwan';
30
- iwanConfigured: boolean;
31
- selectedServerId?: string;
32
- tunnelRunning: boolean;
33
- }
34
32
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,IAAI,CAAA;IACd,MAAM,EAAE,yBAAyB,CAAA;IACjC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAA;IACxB,cAAc,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,OAAO,CAAA;CACvB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB"}
@@ -1,13 +1,13 @@
1
1
  import type { Context } from '@deepseek-ai/cordis';
2
2
  import type { HelperManager } from './helper.ts';
3
3
  import type { ModelCatalog } from './model-catalog.ts';
4
+ import { IwanAuthenticator } from './oidc.ts';
4
5
  import type { StateStore } from './state.ts';
5
- import type { HelperStatus, PublicServer } from './types.ts';
6
+ import type { PublicServer } from './types.ts';
6
7
  export interface SettingsSnapshot {
7
8
  writable: boolean;
8
9
  revision: number;
9
10
  selectedServerId?: string;
10
- directReprobeSeconds: number;
11
11
  apiKey: {
12
12
  configured: boolean;
13
13
  source?: string;
@@ -19,7 +19,7 @@ export interface SettingsSnapshot {
19
19
  writable: boolean;
20
20
  servers: PublicServer[];
21
21
  };
22
- helper?: HelperStatus;
22
+ usingIwan: boolean;
23
23
  models: {
24
24
  id: string;
25
25
  name: string;
@@ -53,12 +53,12 @@ export declare class UstcWebBackend {
53
53
  private readonly helper;
54
54
  private readonly catalog;
55
55
  private readonly store;
56
- constructor(ctx: Context, helper: HelperManager, catalog: ModelCatalog, store: StateStore);
56
+ private readonly iwanAuth;
57
+ constructor(ctx: Context, helper: HelperManager, catalog: ModelCatalog, store: StateStore, iwanAuth?: IwanAuthenticator);
57
58
  snapshot(): Promise<SettingsSnapshot>;
58
59
  handle(request: WebRequest): Promise<unknown>;
59
60
  }
60
61
  export declare function installWeb(ctx: Context, backend: UstcWebBackend): void;
61
- export declare function publicIwanServers(raw: string | undefined): PublicServer[];
62
62
  export declare function publicMessage(error: unknown): string;
63
63
  export {};
64
64
  //# sourceMappingURL=web.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAc,YAAY,EAAE,MAAM,YAAY,CAAA;AAExE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,MAAM,EAAE;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAA;IACnE,IAAI,EAAE;QACJ,UAAU,EAAE,OAAO,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,OAAO,CAAA;QACjB,OAAO,EAAE,YAAY,EAAE,CAAA;KACxB,CAAA;IACD,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACtC,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,KAAK,UAAU,GACX;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,GAC1B;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAA;AAE5B,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAHL,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,UAAU;IAG9B,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA2BrC,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;CA+CpD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAoBtE;AAMD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,EAAE,CAYzE;AAgED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMpD"}
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAA;IACnE,IAAI,EAAE;QACJ,UAAU,EAAE,OAAO,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,OAAO,CAAA;QACjB,OAAO,EAAE,YAAY,EAAE,CAAA;KACxB,CAAA;IACD,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACtC,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,KAAK,UAAU,GACX;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,GAC1B;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAA;AAE5B,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAJR,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,UAAU,EACjB,QAAQ,GAAE,iBAA2C;IAGlE,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAyBrC,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;CAkDpD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAoBtE;AAoED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMpD"}
package/lib/web.js CHANGED
@@ -1,40 +1,42 @@
1
1
  import { credentialRef } from '@deepseek-ai/dsh-credentials';
2
2
  import { SettingsConflictError, settingsNamespace } from '@deepseek-ai/dsh-settings';
3
3
  import { API_KEY_REF, IWAN_CONFIG_REF, SETTINGS_NS, SETTINGS_ROUTE } from "./constants.js";
4
+ import { parseIwanConfig, publicIwanServers } from "./iwan.js";
5
+ import { IwanAuthenticator } from "./oidc.js";
4
6
  export class UstcWebBackend {
5
7
  ctx;
6
8
  helper;
7
9
  catalog;
8
10
  store;
9
- constructor(ctx, helper, catalog, store) {
11
+ iwanAuth;
12
+ constructor(ctx, helper, catalog, store, iwanAuth = new IwanAuthenticator()) {
10
13
  this.ctx = ctx;
11
14
  this.helper = helper;
12
15
  this.catalog = catalog;
13
16
  this.store = store;
17
+ this.iwanAuth = iwanAuth;
14
18
  }
15
19
  async snapshot() {
16
20
  const descriptor = this.ctx.settings.describe({ redactSecrets: true }).find(row => row.ns === SETTINGS_NS);
17
21
  if (descriptor === undefined)
18
22
  throw new Error('llm-ustc settings namespace is not registered');
19
23
  const value = descriptor.value;
20
- const [apiKey, iwan, iwanSecret, helper] = await Promise.all([
24
+ const [apiKey, iwan, iwanSecret] = await Promise.all([
21
25
  this.ctx.credentials.describe(credentialRef(API_KEY_REF)),
22
26
  this.ctx.credentials.describe(credentialRef(IWAN_CONFIG_REF)),
23
27
  this.ctx.credentials.resolve(credentialRef(IWAN_CONFIG_REF)),
24
- this.helper.statusIfRunning(),
25
28
  ]);
26
29
  const state = this.store.snapshot();
27
30
  return {
28
31
  writable: this.ctx.settings.writable,
29
32
  revision: descriptor.revision,
30
33
  ...(value.selectedServerId === undefined ? {} : { selectedServerId: value.selectedServerId }),
31
- directReprobeSeconds: value.directReprobeSeconds ?? 300,
32
34
  apiKey: publicCredential(apiKey),
33
35
  iwan: {
34
36
  ...publicCredential(iwan),
35
37
  servers: publicIwanServers(iwanSecret?.value),
36
38
  },
37
- ...(helper === undefined ? {} : { helper }),
39
+ usingIwan: this.helper.route,
38
40
  models: state.models,
39
41
  ...(state.modelsUpdatedAt === undefined ? {} : { modelsUpdatedAt: state.modelsUpdatedAt }),
40
42
  };
@@ -54,24 +56,27 @@ export class UstcWebBackend {
54
56
  await this.helper.stop();
55
57
  return this.snapshot();
56
58
  case 'beginOidc':
57
- return this.helper.beginOidc();
59
+ return this.iwanAuth.begin();
58
60
  case 'completeOidc': {
59
- const result = await this.helper.completeOidc(request.callbackUrl);
60
- return { servers: result.servers, snapshot: await this.snapshot() };
61
+ const config = await this.iwanAuth.complete(request.callbackUrl);
62
+ await this.ctx.credentials.set(credentialRef(IWAN_CONFIG_REF), JSON.stringify(config));
63
+ await this.helper.stop();
64
+ return { servers: publicIwanServers(JSON.stringify(config)), snapshot: await this.snapshot() };
61
65
  }
62
66
  case 'logoutIwan':
63
67
  await this.ctx.settings.mutate(settingsNamespace(SETTINGS_NS), [{ op: 'unset', path: ['selectedServerId'] }], request.expectedRevision);
64
68
  await this.ctx.credentials.unset(credentialRef(IWAN_CONFIG_REF));
65
69
  await this.helper.stop();
66
- await this.helper.status();
67
70
  return this.snapshot();
68
71
  case 'refreshRoute': {
69
- const key = await this.ctx.credentials.resolve(credentialRef(API_KEY_REF));
70
- await this.helper.refreshRoute(key?.value.trim());
72
+ await this.helper.refreshRoute();
71
73
  return this.snapshot();
72
74
  }
73
75
  case 'selectServer': {
74
- const key = await this.ctx.credentials.resolve(credentialRef(API_KEY_REF));
76
+ const iwan = await this.ctx.credentials.resolve(credentialRef(IWAN_CONFIG_REF));
77
+ if (iwan === undefined || !parseIwanConfig(iwan.value).servers.some(server => server.id === request.serverId)) {
78
+ throw new TypeError('selected iWAN line is unavailable');
79
+ }
75
80
  const rollback = this.helper.stageSelectedServer(request.serverId);
76
81
  try {
77
82
  await this.ctx.settings.update(settingsNamespace(SETTINGS_NS), { selectedServerId: request.serverId }, request.expectedRevision);
@@ -80,7 +85,7 @@ export class UstcWebBackend {
80
85
  rollback();
81
86
  throw error;
82
87
  }
83
- await this.helper.selectServer(request.serverId, key?.value.trim());
88
+ await this.helper.refreshRoute();
84
89
  return this.snapshot();
85
90
  }
86
91
  case 'syncModels':
@@ -117,23 +122,6 @@ export function installWeb(ctx, backend) {
117
122
  function publicCredential(info) {
118
123
  return { configured: info.configured, ...(info.source === undefined ? {} : { source: info.source }), writable: info.writable };
119
124
  }
120
- export function publicIwanServers(raw) {
121
- if (raw === undefined)
122
- return [];
123
- try {
124
- const value = JSON.parse(raw);
125
- if (!Array.isArray(value.servers))
126
- return [];
127
- return value.servers.flatMap(server => {
128
- if (typeof server.id !== 'string' || typeof server.name !== 'string' || typeof server.host !== 'string' || !Number.isSafeInteger(server.port))
129
- return [];
130
- return [{ id: server.id, name: server.name, endpoint: `${server.host}:${server.port}` }];
131
- });
132
- }
133
- catch {
134
- return [];
135
- }
136
- }
137
125
  function responseJson(res, status, body) {
138
126
  const bytes = Buffer.from(JSON.stringify(body));
139
127
  res.setHeader('content-type', 'application/json; charset=utf-8');