dsh-llm-ustc 0.1.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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +69 -0
  3. package/cordis.patch.yml +4 -0
  4. package/lib/adapter.js +211 -0
  5. package/lib/adapter.js.map +1 -0
  6. package/lib/client.js +506 -0
  7. package/lib/config.js +17 -0
  8. package/lib/config.js.map +1 -0
  9. package/lib/constants.js +11 -0
  10. package/lib/constants.js.map +1 -0
  11. package/lib/helper.js +302 -0
  12. package/lib/helper.js.map +1 -0
  13. package/lib/index.js +43 -0
  14. package/lib/index.js.map +1 -0
  15. package/lib/model-catalog.js +59 -0
  16. package/lib/model-catalog.js.map +1 -0
  17. package/lib/native.js +47 -0
  18. package/lib/native.js.map +1 -0
  19. package/lib/state.js +97 -0
  20. package/lib/state.js.map +1 -0
  21. package/lib/types/adapter.d.ts +24 -0
  22. package/lib/types/adapter.d.ts.map +1 -0
  23. package/lib/types/client/index.d.ts +112 -0
  24. package/lib/types/client/index.d.ts.map +1 -0
  25. package/lib/types/config.d.ts +12 -0
  26. package/lib/types/config.d.ts.map +1 -0
  27. package/lib/types/constants.d.ts +11 -0
  28. package/lib/types/constants.d.ts.map +1 -0
  29. package/lib/types/helper.d.ts +51 -0
  30. package/lib/types/helper.d.ts.map +1 -0
  31. package/lib/types/index.d.ts +7 -0
  32. package/lib/types/index.d.ts.map +1 -0
  33. package/lib/types/model-catalog.d.ts +14 -0
  34. package/lib/types/model-catalog.d.ts.map +1 -0
  35. package/lib/types/native.d.ts +7 -0
  36. package/lib/types/native.d.ts.map +1 -0
  37. package/lib/types/state.d.ts +15 -0
  38. package/lib/types/state.d.ts.map +1 -0
  39. package/lib/types/types.d.ts +34 -0
  40. package/lib/types/types.d.ts.map +1 -0
  41. package/lib/types/web.d.ts +64 -0
  42. package/lib/types/web.d.ts.map +1 -0
  43. package/lib/types.js +2 -0
  44. package/lib/types.js.map +1 -0
  45. package/lib/web.js +221 -0
  46. package/lib/web.js.map +1 -0
  47. package/package.json +112 -0
package/lib/helper.js ADDED
@@ -0,0 +1,302 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createHash, randomBytes } from 'node:crypto';
3
+ import { createInterface } from 'node:readline';
4
+ import { credentialRef } from '@deepseek-ai/dsh-credentials';
5
+ import { HELPER_PROTOCOL, IWAN_CONFIG_REF } from "./constants.js";
6
+ import { resolveHelperBinary } from "./native.js";
7
+ export class HelperManager {
8
+ ctx;
9
+ child;
10
+ sessionToken;
11
+ baseURL;
12
+ starting;
13
+ lifecycle = Promise.resolve();
14
+ closed = false;
15
+ recoveredModels;
16
+ config;
17
+ generation = 0;
18
+ constructor(ctx, config) {
19
+ this.ctx = ctx;
20
+ this.config = config;
21
+ }
22
+ reconfigure(config) {
23
+ if (sameConfig(this.config, config))
24
+ return;
25
+ this.config = config;
26
+ this.lifecycle = this.lifecycle.then(() => this.stopNow());
27
+ }
28
+ stageSelectedServer(serverId) {
29
+ const previous = this.config;
30
+ this.config = { ...previous, selectedServerId: serverId };
31
+ return () => { this.config = previous; };
32
+ }
33
+ onRecoveredModels(handler) {
34
+ this.recoveredModels = handler;
35
+ }
36
+ async ensureStarted() {
37
+ if (this.closed)
38
+ throw new Error('USTC helper manager is disposed');
39
+ await this.lifecycle;
40
+ if (this.baseURL !== undefined && this.child?.exitCode === null)
41
+ return this.baseURL;
42
+ if (this.starting !== undefined)
43
+ return this.starting;
44
+ this.starting = this.start().finally(() => { this.starting = undefined; });
45
+ return this.starting;
46
+ }
47
+ async endpoint() {
48
+ const baseURL = await this.ensureStarted();
49
+ const sessionToken = this.sessionToken;
50
+ if (sessionToken === undefined)
51
+ throw new Error('USTC helper started without a session token');
52
+ return {
53
+ baseURL: `${baseURL}/v1`,
54
+ generation: this.generation,
55
+ headers: { 'x-dsh-ustc-session': sessionToken },
56
+ };
57
+ }
58
+ async stop() {
59
+ this.lifecycle = this.lifecycle.then(() => this.stopNow());
60
+ await this.lifecycle;
61
+ }
62
+ async stopNow() {
63
+ if (this.starting !== undefined) {
64
+ try {
65
+ await this.starting;
66
+ }
67
+ catch { }
68
+ }
69
+ const child = this.child;
70
+ this.child = undefined;
71
+ this.baseURL = undefined;
72
+ this.sessionToken = undefined;
73
+ if (child === undefined || child.exitCode !== null)
74
+ return;
75
+ child.stdin.end();
76
+ const exited = new Promise(resolve => { child.once('exit', () => resolve()); });
77
+ await Promise.race([exited, new Promise(resolve => setTimeout(resolve, 1_000))]);
78
+ if (child.exitCode === null)
79
+ child.kill();
80
+ }
81
+ async dispose() {
82
+ this.closed = true;
83
+ await this.stop();
84
+ }
85
+ async request(path, init = {}, timeoutMs = 20_000) {
86
+ const timeout = AbortSignal.timeout(timeoutMs);
87
+ const response = await this.fetch(path, {
88
+ ...init,
89
+ signal: init.signal == null ? timeout : AbortSignal.any([init.signal, timeout]),
90
+ });
91
+ const text = await response.text();
92
+ let value;
93
+ try {
94
+ value = JSON.parse(text);
95
+ }
96
+ catch {
97
+ value = undefined;
98
+ }
99
+ if (!response.ok) {
100
+ const message = isRecord(value) && isRecord(value.error) && typeof value.error.message === 'string'
101
+ ? value.error.message
102
+ : `USTC helper request failed (HTTP ${response.status})`;
103
+ throw new Error(message);
104
+ }
105
+ return value;
106
+ }
107
+ async fetch(path, init = {}) {
108
+ if (!path.startsWith('/') || path.startsWith('//'))
109
+ throw new TypeError('helper request path must be absolute');
110
+ const baseURL = await this.ensureStarted();
111
+ const headers = new Headers(init.headers);
112
+ if (!headers.has('accept'))
113
+ headers.set('accept', 'application/json');
114
+ if (init.body !== undefined && !headers.has('content-type'))
115
+ headers.set('content-type', 'application/json');
116
+ headers.set('x-dsh-ustc-session', this.sessionToken);
117
+ return fetch(`${baseURL}${path}`, {
118
+ ...init,
119
+ headers,
120
+ });
121
+ }
122
+ status() {
123
+ return this.request('/_control/status');
124
+ }
125
+ async refreshRoute(apiKey) {
126
+ const status = await this.status();
127
+ if (!status.iwanConfigured || status.selectedServerId === undefined)
128
+ return status;
129
+ await this.selectServer(status.selectedServerId, apiKey);
130
+ return this.status();
131
+ }
132
+ async statusIfRunning() {
133
+ const baseURL = this.baseURL;
134
+ const sessionToken = this.sessionToken;
135
+ if (baseURL === undefined || sessionToken === undefined || this.child?.exitCode !== null)
136
+ return undefined;
137
+ try {
138
+ const response = await fetch(`${baseURL}/_control/status`, {
139
+ headers: { accept: 'application/json', 'x-dsh-ustc-session': sessionToken },
140
+ signal: AbortSignal.timeout(1_000),
141
+ });
142
+ return response.ok ? await response.json() : undefined;
143
+ }
144
+ catch {
145
+ return undefined;
146
+ }
147
+ }
148
+ servers() {
149
+ return this.request('/_control/servers');
150
+ }
151
+ beginOidc() {
152
+ return this.request('/_control/oidc/begin', { method: 'POST' });
153
+ }
154
+ async completeOidc(callbackUrl) {
155
+ const result = await this.request('/_control/oidc/complete', {
156
+ method: 'POST',
157
+ body: JSON.stringify({ callbackUrl }),
158
+ });
159
+ await this.ctx.credentials.set(credentialRef(IWAN_CONFIG_REF), JSON.stringify(result.iwanConfig));
160
+ return result;
161
+ }
162
+ async selectServer(serverId, apiKey) {
163
+ await this.request('/_control/select', {
164
+ method: 'POST',
165
+ body: JSON.stringify({ serverId }),
166
+ ...(apiKey === undefined ? {} : { headers: { authorization: `Bearer ${apiKey}` } }),
167
+ }, 20_000);
168
+ }
169
+ async start() {
170
+ const binary = await resolveHelperBinary();
171
+ const sessionToken = randomBytes(32).toString('base64url');
172
+ const credential = await this.ctx.credentials.resolve(credentialRef(IWAN_CONFIG_REF));
173
+ const iwanConfig = credential === undefined ? undefined : parseIwanConfig(credential.value);
174
+ const child = spawn(binary, [], {
175
+ stdio: ['pipe', 'pipe', 'pipe'],
176
+ windowsHide: true,
177
+ env: sanitizedEnvironment(process.env),
178
+ });
179
+ this.child = child;
180
+ child.stderr.setEncoding('utf8');
181
+ let stderr = '';
182
+ child.stderr.on('data', (chunk) => {
183
+ stderr = `${stderr}${chunk}`.slice(-8_192);
184
+ const message = redact(chunk.trim());
185
+ if (message.length === 0)
186
+ return;
187
+ if (message.includes('USTC upstream transport error') || message.includes('iWAN data path stopped')) {
188
+ this.ctx.logger.warn('dsh-llm-ustc helper: %s', message);
189
+ }
190
+ else {
191
+ this.ctx.logger.debug('dsh-llm-ustc helper: %s', message);
192
+ }
193
+ });
194
+ child.stdin.write(`${JSON.stringify({
195
+ sessionToken,
196
+ ...(iwanConfig === undefined ? {} : { iwanConfig }),
197
+ ...this.config.selectedServerId === undefined ? {} : { selectedServerId: this.config.selectedServerId },
198
+ directReprobeSeconds: this.config.directReprobeSeconds,
199
+ })}\n`);
200
+ const lines = createInterface({ input: child.stdout });
201
+ const handshake = await new Promise((resolve, reject) => {
202
+ const timer = setTimeout(() => reject(new Error('USTC helper startup timed out')), 8_000);
203
+ lines.once('line', line => {
204
+ clearTimeout(timer);
205
+ try {
206
+ resolve(parseHandshake(line));
207
+ }
208
+ catch (error) {
209
+ reject(error);
210
+ }
211
+ });
212
+ child.once('error', error => { clearTimeout(timer); reject(error); });
213
+ child.once('exit', code => {
214
+ clearTimeout(timer);
215
+ reject(new Error(`USTC helper exited during startup (${code ?? 'signal'}): ${redact(stderr)}`));
216
+ });
217
+ });
218
+ if (handshake.protocol !== HELPER_PROTOCOL) {
219
+ child.kill();
220
+ throw new Error(`USTC helper protocol ${handshake.protocol} is incompatible with ${HELPER_PROTOCOL}`);
221
+ }
222
+ lines.on('line', line => {
223
+ if (this.child !== child)
224
+ return;
225
+ const models = parseHelperEvent(line);
226
+ if (models === undefined || this.recoveredModels === undefined)
227
+ return;
228
+ void this.recoveredModels(models).catch(error => {
229
+ this.ctx.logger.warn('dsh-llm-ustc could not persist recovered models: %s', redact(String(error)));
230
+ });
231
+ });
232
+ child.once('exit', () => {
233
+ if (this.child === child) {
234
+ this.child = undefined;
235
+ this.baseURL = undefined;
236
+ this.sessionToken = undefined;
237
+ }
238
+ });
239
+ this.sessionToken = sessionToken;
240
+ this.baseURL = `http://127.0.0.1:${handshake.port}`;
241
+ this.generation += 1;
242
+ return this.baseURL;
243
+ }
244
+ }
245
+ export function parseHelperEvent(line) {
246
+ try {
247
+ const value = JSON.parse(line);
248
+ if (!isRecord(value) || value.event !== 'models' || !Array.isArray(value.models))
249
+ return undefined;
250
+ const models = value.models.flatMap(model => {
251
+ if (!isRecord(model) || typeof model.id !== 'string' || typeof model.name !== 'string')
252
+ return [];
253
+ return [{ id: model.id, name: model.name }];
254
+ });
255
+ return models.length === 0 ? undefined : models;
256
+ }
257
+ catch {
258
+ return undefined;
259
+ }
260
+ }
261
+ function parseHandshake(line) {
262
+ const value = JSON.parse(line);
263
+ if (!isRecord(value) || typeof value.protocol !== 'string' || !Number.isSafeInteger(value.port) || typeof value.pid !== 'number') {
264
+ throw new TypeError('USTC helper returned an invalid startup handshake');
265
+ }
266
+ const port = value.port;
267
+ if (port < 1 || port > 65_535)
268
+ throw new TypeError('USTC helper returned an invalid port');
269
+ return { protocol: value.protocol, port, pid: value.pid };
270
+ }
271
+ export function sanitizedEnvironment(source) {
272
+ const result = { ...source };
273
+ for (const name of Object.keys(result)) {
274
+ if (name.toLowerCase() === 'http_proxy' || name.toLowerCase() === 'https_proxy' || name.toLowerCase() === 'all_proxy' || name.toLowerCase() === 'no_proxy') {
275
+ delete result[name];
276
+ }
277
+ }
278
+ return result;
279
+ }
280
+ function parseIwanConfig(raw) {
281
+ const value = JSON.parse(raw);
282
+ if (!isRecord(value) || typeof value.domain !== 'string' || !Array.isArray(value.servers) || value.servers.length === 0) {
283
+ throw new TypeError(`${IWAN_CONFIG_REF} does not contain a valid iWAN configuration`);
284
+ }
285
+ return value;
286
+ }
287
+ function sameConfig(left, right) {
288
+ return left.selectedServerId === right.selectedServerId && left.directReprobeSeconds === right.directReprobeSeconds;
289
+ }
290
+ function isRecord(value) {
291
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
292
+ }
293
+ function redact(value) {
294
+ return value
295
+ .replace(/Bearer\s+[A-Za-z0-9._~+\/-]+/giu, 'Bearer [redacted]')
296
+ .replace(/com\.panabit\.mobile:\/\/[^\s]+/giu, 'com.panabit.mobile://[redacted]')
297
+ .replace(/[A-Za-z0-9_-]{32,}/gu, match => `${match.slice(0, 6)}...[redacted]`);
298
+ }
299
+ export function secretFingerprint(secret) {
300
+ return createHash('sha256').update(secret).digest('hex').slice(0, 12);
301
+ }
302
+ //# sourceMappingURL=helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"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"}
package/lib/index.js ADDED
@@ -0,0 +1,43 @@
1
+ import { settingsNamespace } from '@deepseek-ai/dsh-settings';
2
+ import { UstcAdapter } from "./adapter.js";
3
+ import { Config, resolveConfig } from "./config.js";
4
+ import { PROVIDER, PROVIDER_NAME, SETTINGS_NS } from "./constants.js";
5
+ import { HelperManager } from "./helper.js";
6
+ import { ModelCatalog } from "./model-catalog.js";
7
+ import { StateStore } from "./state.js";
8
+ import { installWeb, UstcWebBackend } from "./web.js";
9
+ export const name = 'dsh-llm-ustc';
10
+ export const inject = ['llm', 'credentials', 'settings'];
11
+ export { Config };
12
+ export async function apply(ctx, config = {}) {
13
+ const scope = ctx.settings.register(settingsNamespace(SETTINGS_NS), Config, {
14
+ base: config,
15
+ applies: 'live',
16
+ validate: resolveConfig,
17
+ });
18
+ const store = new StateStore();
19
+ await store.load();
20
+ const helper = new HelperManager(ctx, resolveConfig(scope.get()));
21
+ const catalog = new ModelCatalog(ctx, helper, store);
22
+ const adapter = new UstcAdapter(ctx, helper, catalog);
23
+ const registration = ctx.llm.registerAdapter([PROVIDER], adapter);
24
+ const directory = ctx.llm.registerConfigurableProviders([{
25
+ provider: PROVIDER,
26
+ displayName: PROVIDER_NAME,
27
+ settingsNs: SETTINGS_NS,
28
+ settingsPath: [],
29
+ declared: false,
30
+ }]);
31
+ const watch = scope.watch(next => {
32
+ helper.reconfigure(resolveConfig(next));
33
+ adapter.invalidate();
34
+ });
35
+ installWeb(ctx, new UstcWebBackend(ctx, helper, catalog, store));
36
+ return async () => {
37
+ watch();
38
+ directory();
39
+ registration();
40
+ await helper.dispose();
41
+ };
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,aAAa,EAA+B,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAErD,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAA;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,CAAA;AAEjB,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY,EAAE,SAAuB,EAAE;IACjE,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE;QAC1E,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,aAAa;KACxB,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAA;IAC9B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;IAClB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACjE,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IACrD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;IACjE,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YACvD,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,aAAa;YAC1B,UAAU,EAAE,WAAW;YACvB,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC,CAAA;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QAC/B,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;QACvC,OAAO,CAAC,UAAU,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IACF,UAAU,CAAC,GAAG,EAAE,IAAI,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IAChE,OAAO,KAAK,IAAI,EAAE;QAChB,KAAK,EAAE,CAAA;QACP,SAAS,EAAE,CAAA;QACX,YAAY,EAAE,CAAA;QACd,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;IACxB,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { credentialRef } from '@deepseek-ai/dsh-credentials';
2
+ import { API_KEY_REF } from "./constants.js";
3
+ import { normalizeModels } from "./state.js";
4
+ export class ModelCatalog {
5
+ ctx;
6
+ helper;
7
+ store;
8
+ constructor(ctx, helper, store) {
9
+ this.ctx = ctx;
10
+ this.helper = helper;
11
+ this.store = store;
12
+ this.helper.onRecoveredModels(async (models) => { await this.accept(models); });
13
+ }
14
+ models() {
15
+ return this.store.models();
16
+ }
17
+ async refresh(signal) {
18
+ const credential = await this.ctx.credentials.resolve(credentialRef(API_KEY_REF));
19
+ if (credential === undefined)
20
+ throw new Error(`${API_KEY_REF} is not configured`);
21
+ const timeout = AbortSignal.timeout(20_000);
22
+ const response = await this.helper.fetch('/v1/models', {
23
+ signal: signal === undefined ? timeout : AbortSignal.any([signal, timeout]),
24
+ headers: {
25
+ accept: 'application/json',
26
+ authorization: `Bearer ${credential.value.trim()}`,
27
+ },
28
+ });
29
+ if (!response.ok)
30
+ throw await apiError(response);
31
+ const value = await response.json();
32
+ if (!isRecord(value) || !Array.isArray(value.data))
33
+ throw new TypeError('USTC /v1/models returned an invalid listing');
34
+ return this.accept(value.data.flatMap(item => {
35
+ if (!isRecord(item) || typeof item.id !== 'string')
36
+ return [];
37
+ return [{ id: item.id, name: typeof item.name === 'string' ? item.name : item.id }];
38
+ }));
39
+ }
40
+ async accept(input) {
41
+ const models = normalizeModels(input);
42
+ await this.store.setModels(models);
43
+ return models;
44
+ }
45
+ }
46
+ async function apiError(response) {
47
+ let message = `USTC API answered HTTP ${response.status}`;
48
+ try {
49
+ const value = await response.json();
50
+ if (isRecord(value) && isRecord(value.error) && typeof value.error.message === 'string')
51
+ message = value.error.message;
52
+ }
53
+ catch { }
54
+ return new Error(message);
55
+ }
56
+ function isRecord(value) {
57
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
58
+ }
59
+ //# sourceMappingURL=model-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"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"}
package/lib/native.js ADDED
@@ -0,0 +1,47 @@
1
+ import { access } from 'node:fs/promises';
2
+ import { constants } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ const require = createRequire(import.meta.url);
7
+ const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
8
+ const TARGETS = {
9
+ 'win32-x64': { packageName: '@dsh-llm-ustc/helper-win32-x64', binaryName: 'dsh-llm-ustc-helper.exe' },
10
+ 'win32-arm64': { packageName: '@dsh-llm-ustc/helper-win32-arm64', binaryName: 'dsh-llm-ustc-helper.exe' },
11
+ 'darwin-x64': { packageName: '@dsh-llm-ustc/helper-darwin-x64', binaryName: 'dsh-llm-ustc-helper' },
12
+ 'darwin-arm64': { packageName: '@dsh-llm-ustc/helper-darwin-arm64', binaryName: 'dsh-llm-ustc-helper' },
13
+ 'linux-x64': { packageName: '@dsh-llm-ustc/helper-linux-x64', binaryName: 'dsh-llm-ustc-helper' },
14
+ 'linux-arm64': { packageName: '@dsh-llm-ustc/helper-linux-arm64', binaryName: 'dsh-llm-ustc-helper' },
15
+ };
16
+ export function nativeTarget(platform = process.platform, arch = process.arch) {
17
+ const target = TARGETS[`${platform}-${arch}`];
18
+ if (target === undefined)
19
+ throw new Error(`dsh-llm-ustc does not provide a helper for ${platform}/${arch}`);
20
+ return target;
21
+ }
22
+ export async function resolveHelperBinary() {
23
+ const target = nativeTarget();
24
+ const development = [
25
+ join(root, 'helper', 'target', 'debug', target.binaryName),
26
+ join(root, 'helper', 'target', 'release', target.binaryName),
27
+ join(root, 'target', 'debug', target.binaryName),
28
+ join(root, 'target', 'release', target.binaryName),
29
+ ];
30
+ for (const candidate of development) {
31
+ try {
32
+ await access(candidate, process.platform === 'win32' ? constants.F_OK : constants.X_OK);
33
+ return candidate;
34
+ }
35
+ catch { }
36
+ }
37
+ try {
38
+ const manifest = require.resolve(`${target.packageName}/package.json`);
39
+ const binary = join(dirname(manifest), 'bin', target.binaryName);
40
+ await access(binary, process.platform === 'win32' ? constants.F_OK : constants.X_OK);
41
+ return binary;
42
+ }
43
+ catch (error) {
44
+ throw new Error(`native helper ${target.packageName} is not installed for ${process.platform}/${process.arch}`, { cause: error });
45
+ }
46
+ }
47
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;AAOnE,MAAM,OAAO,GAAiC;IAC5C,WAAW,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,UAAU,EAAE,yBAAyB,EAAE;IACrG,aAAa,EAAE,EAAE,WAAW,EAAE,kCAAkC,EAAE,UAAU,EAAE,yBAAyB,EAAE;IACzG,YAAY,EAAE,EAAE,WAAW,EAAE,iCAAiC,EAAE,UAAU,EAAE,qBAAqB,EAAE;IACnG,cAAc,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE,UAAU,EAAE,qBAAqB,EAAE;IACvG,WAAW,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,UAAU,EAAE,qBAAqB,EAAE;IACjG,aAAa,EAAE,EAAE,WAAW,EAAE,kCAAkC,EAAE,UAAU,EAAE,qBAAqB,EAAE;CACtG,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI;IAC3E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAA;IAC7C,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAA;IAC3G,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;IAC7B,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;QAC1D,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC;QAC5D,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC;KACnD,CAAA;IACD,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACvF,OAAO,SAAS,CAAA;QAClB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,WAAW,eAAe,CAAC,CAAA;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;QAChE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACpF,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,CAAC,WAAW,yBAAyB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IACnI,CAAC;AACH,CAAC"}
package/lib/state.js ADDED
@@ -0,0 +1,97 @@
1
+ import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { DEFAULT_MODEL } from "./constants.js";
5
+ const FALLBACK = {
6
+ models: [{ id: DEFAULT_MODEL, name: DEFAULT_MODEL }],
7
+ };
8
+ export function resolveDshHome() {
9
+ const configured = process.env.DSH_HOME?.trim();
10
+ return configured === undefined || configured.length === 0 ? join(homedir(), '.dsh') : configured;
11
+ }
12
+ export class StateStore {
13
+ filename;
14
+ current = structuredClone(FALLBACK);
15
+ writes = Promise.resolve();
16
+ constructor(dshHome = resolveDshHome()) {
17
+ this.filename = join(dshHome, 'plugins', 'dsh-llm-ustc', 'state.json');
18
+ }
19
+ async load() {
20
+ try {
21
+ const value = JSON.parse(await readFile(this.filename, 'utf8'));
22
+ this.current = parseState(value);
23
+ if (JSON.stringify(value) !== JSON.stringify(this.current))
24
+ await this.persist();
25
+ }
26
+ catch (error) {
27
+ if (error.code !== 'ENOENT')
28
+ throw error;
29
+ }
30
+ }
31
+ snapshot() {
32
+ return structuredClone(this.current);
33
+ }
34
+ models() {
35
+ return this.current.models.map(model => ({ ...model }));
36
+ }
37
+ async setModels(models) {
38
+ const normalized = normalizeModels(models);
39
+ this.current = {
40
+ ...this.current,
41
+ models: normalized,
42
+ modelsUpdatedAt: new Date().toISOString(),
43
+ };
44
+ await this.persist();
45
+ }
46
+ async persist() {
47
+ const snapshot = `${JSON.stringify(this.current, null, 2)}\n`;
48
+ this.writes = this.writes.then(async () => {
49
+ await mkdir(dirname(this.filename), { recursive: true });
50
+ const temporary = `${this.filename}.${process.pid}.tmp`;
51
+ await writeFile(temporary, snapshot, { encoding: 'utf8', mode: 0o600 });
52
+ await rename(temporary, this.filename);
53
+ });
54
+ await this.writes;
55
+ }
56
+ }
57
+ export function normalizeModels(models) {
58
+ const unique = new Map();
59
+ for (const model of models) {
60
+ const id = model.id.trim();
61
+ if (id.length === 0 || id.length > 256 || /^claude/iu.test(id) || unique.has(id))
62
+ continue;
63
+ const name = model.name.trim();
64
+ unique.set(id, { id, name: name.length === 0 ? id : name });
65
+ }
66
+ if (unique.size === 0)
67
+ throw new TypeError('USTC model listing contains no usable model ids');
68
+ return [...unique.values()].sort((left, right) => {
69
+ if (left.id === DEFAULT_MODEL)
70
+ return -1;
71
+ if (right.id === DEFAULT_MODEL)
72
+ return 1;
73
+ return left.id.localeCompare(right.id);
74
+ });
75
+ }
76
+ function parseState(value) {
77
+ if (!isRecord(value) || !Array.isArray(value.models))
78
+ return structuredClone(FALLBACK);
79
+ let models;
80
+ try {
81
+ models = normalizeModels(value.models.filter(isCachedModel));
82
+ }
83
+ catch {
84
+ models = structuredClone(FALLBACK.models);
85
+ }
86
+ return {
87
+ models,
88
+ ...(typeof value.modelsUpdatedAt === 'string' ? { modelsUpdatedAt: value.modelsUpdatedAt } : {}),
89
+ };
90
+ }
91
+ function isRecord(value) {
92
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
93
+ }
94
+ function isCachedModel(value) {
95
+ return isRecord(value) && typeof value.id === 'string' && typeof value.name === 'string';
96
+ }
97
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import { LlmAdapter, type GenerateOptions, type LlmModelInfo, type LlmResolvedModelInfo, type ResolvedRetryPolicy, type StreamChunk } from '@deepseek-ai/dsh-llm';
3
+ import type { HelperManager } from './helper.ts';
4
+ import type { ModelCatalog } from './model-catalog.ts';
5
+ export declare class UstcAdapter extends LlmAdapter {
6
+ private readonly ctx;
7
+ private readonly helper;
8
+ private readonly catalog;
9
+ private delegate;
10
+ constructor(ctx: Context, helper: HelperManager, catalog: ModelCatalog);
11
+ providerInfo(provider: string): {
12
+ id: string;
13
+ name: string;
14
+ };
15
+ providerRetryPolicy(provider: string): ResolvedRetryPolicy;
16
+ listModels(provider: string): Promise<readonly LlmModelInfo[]>;
17
+ resolveModel(provider: string, model: string): Promise<LlmResolvedModelInfo>;
18
+ stream(options: GenerateOptions): AsyncIterable<StreamChunk>;
19
+ invalidate(): void;
20
+ private currentDelegate;
21
+ private assertProvider;
22
+ }
23
+ export declare function normalizeFailure(message: string, code: string): string;
24
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +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"}