@wengine-ai/ccr-provider-qoder 0.3.1 → 0.3.2
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/dist/card.js +156 -45
- package/dist/plugin.js +25 -13
- package/dist/plugin.json +1 -1
- package/package.json +1 -1
package/dist/card.js
CHANGED
|
@@ -10,11 +10,6 @@ var qoderLocales = {
|
|
|
10
10
|
connected: "Connected",
|
|
11
11
|
expired: "Sign-in lapsed \u2014 reconnect with a fresh PAT",
|
|
12
12
|
error: "Management request failed",
|
|
13
|
-
account: "Account",
|
|
14
|
-
models: "Models",
|
|
15
|
-
pat: "Personal access token",
|
|
16
|
-
patPlaceholder: "pt-\u2026",
|
|
17
|
-
connect: "Connect",
|
|
18
13
|
checkin: "Check in",
|
|
19
14
|
checkin_action: "Check in",
|
|
20
15
|
checkin_pending: "Checking in\u2026",
|
|
@@ -24,14 +19,25 @@ var qoderLocales = {
|
|
|
24
19
|
checkin_ineligible: "Unavailable",
|
|
25
20
|
checkin_failed: "Check-in failed",
|
|
26
21
|
checkinDesktop: "International check-in requires Qoder desktop device identity; claim in Qoder desktop.",
|
|
22
|
+
account: "Account",
|
|
23
|
+
models: "Models",
|
|
24
|
+
models_count: "{{count}} models",
|
|
25
|
+
pat: "Personal access token",
|
|
26
|
+
patPlaceholder: "pt-\u2026",
|
|
27
|
+
connect: "Connect",
|
|
27
28
|
sync: "Refresh models",
|
|
28
29
|
usage: "Refresh quota",
|
|
29
30
|
unknown: "Quota unknown",
|
|
30
31
|
stale: "Last known quota (stale)",
|
|
31
32
|
used: "Allowance",
|
|
33
|
+
restore_partial: "Partially completed: restored {{count}} of {{total}} models. Management request failed.",
|
|
34
|
+
hide_partial: "Partially completed: hid {{count}} of {{total}} models. Management request failed.",
|
|
35
|
+
restore_model: "Restore {{model}}",
|
|
32
36
|
disconnect: "Disconnect",
|
|
33
|
-
|
|
37
|
+
hide_model: "Hide {{model}}",
|
|
38
|
+
hidden_models: "Hidden models ({{count}})",
|
|
34
39
|
restore: "Restore",
|
|
40
|
+
restore_all: "Restore all",
|
|
35
41
|
cooling: "Rate limited until",
|
|
36
42
|
noModels: "Refresh models after connecting",
|
|
37
43
|
free: "free",
|
|
@@ -47,11 +53,6 @@ var qoderLocales = {
|
|
|
47
53
|
connected: "\u5DF2\u8FDE\u63A5",
|
|
48
54
|
expired: "\u767B\u5F55\u5DF2\u5931\u6548 \u2014 \u8BF7\u4F7F\u7528\u65B0\u7684 PAT \u91CD\u65B0\u8FDE\u63A5",
|
|
49
55
|
error: "\u7BA1\u7406\u64CD\u4F5C\u5931\u8D25",
|
|
50
|
-
account: "\u8D26\u53F7",
|
|
51
|
-
models: "\u6A21\u578B",
|
|
52
|
-
pat: "\u4E2A\u4EBA\u8BBF\u95EE\u4EE4\u724C",
|
|
53
|
-
patPlaceholder: "pt-\u2026",
|
|
54
|
-
connect: "\u8FDE\u63A5",
|
|
55
56
|
checkin: "\u7B7E\u5230",
|
|
56
57
|
checkin_action: "\u7B7E\u5230",
|
|
57
58
|
checkin_pending: "\u7B7E\u5230\u4E2D\u2026",
|
|
@@ -61,14 +62,25 @@ var qoderLocales = {
|
|
|
61
62
|
checkin_ineligible: "\u4E0D\u53EF\u7528",
|
|
62
63
|
checkin_failed: "\u7B7E\u5230\u5931\u8D25",
|
|
63
64
|
checkinDesktop: "\u56FD\u9645\u7AD9\u9700\u8981\u5728 Qoder \u684C\u9762\u7AEF\u5185\u7B7E\u5230\u3002",
|
|
65
|
+
account: "\u8D26\u53F7",
|
|
66
|
+
models: "\u6A21\u578B",
|
|
67
|
+
models_count: "{{count}} \u4E2A\u6A21\u578B",
|
|
68
|
+
pat: "\u4E2A\u4EBA\u8BBF\u95EE\u4EE4\u724C",
|
|
69
|
+
patPlaceholder: "pt-\u2026",
|
|
70
|
+
connect: "\u8FDE\u63A5",
|
|
64
71
|
sync: "\u5237\u65B0\u6A21\u578B",
|
|
65
72
|
usage: "\u5237\u65B0\u989D\u5EA6",
|
|
66
73
|
unknown: "\u989D\u5EA6\u672A\u77E5",
|
|
67
74
|
stale: "\u4E0A\u6B21\u989D\u5EA6\uFF08\u5DF2\u8FC7\u671F\uFF09",
|
|
68
75
|
used: "\u5DF2\u7528\u989D\u5EA6",
|
|
76
|
+
restore_partial: "\u90E8\u5206\u5B8C\u6210\uFF1A\u5DF2\u6062\u590D {{count}} \u4E2A\u6A21\u578B\uFF0C\u5171 {{total}} \u4E2A\u3002\u7BA1\u7406\u64CD\u4F5C\u5931\u8D25\u3002",
|
|
77
|
+
hide_partial: "\u90E8\u5206\u5B8C\u6210\uFF1A\u5DF2\u9690\u85CF {{count}} \u4E2A\u6A21\u578B\uFF0C\u5171 {{total}} \u4E2A\u3002\u7BA1\u7406\u64CD\u4F5C\u5931\u8D25\u3002",
|
|
78
|
+
restore_model: "\u6062\u590D {{model}}",
|
|
69
79
|
disconnect: "\u65AD\u5F00\u8FDE\u63A5",
|
|
70
|
-
|
|
80
|
+
hide_model: "\u9690\u85CF {{model}}",
|
|
81
|
+
hidden_models: "\u5DF2\u9690\u85CF\u6A21\u578B\uFF08{{count}}\uFF09",
|
|
71
82
|
restore: "\u6062\u590D",
|
|
83
|
+
restore_all: "\u6062\u590D\u5168\u90E8",
|
|
72
84
|
cooling: "\u9650\u6D41\u81F3",
|
|
73
85
|
noModels: "\u8FDE\u63A5\u540E\u8BF7\u5237\u65B0\u6A21\u578B",
|
|
74
86
|
free: "\u514D\u8D39",
|
|
@@ -162,9 +174,36 @@ function mount(el, props) {
|
|
|
162
174
|
n.className = cls;
|
|
163
175
|
return n;
|
|
164
176
|
};
|
|
177
|
+
const CHIP = "inline-flex max-w-full items-center gap-1 break-all whitespace-normal rounded-lg border border-white/5 bg-white/5 px-2 py-0.5 text-[10px] font-bold text-muted-foreground";
|
|
178
|
+
const CHIP_HIDE = "rounded p-0.5 text-muted-foreground/60 transition-colors hover:bg-white/10 hover:text-foreground disabled:opacity-40";
|
|
179
|
+
const BUTTON_BASE = "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-sm font-semibold ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 active:scale-95";
|
|
180
|
+
const BUTTON_OUTLINE = "border border-input bg-input/50 backdrop-blur-md shadow-sm hover:bg-input/80 hover:border-primary/50 hover:shadow-md hover:text-accent-foreground";
|
|
181
|
+
const xIcon = (className) => {
|
|
182
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
183
|
+
svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
|
|
184
|
+
svg.setAttribute("width", "24");
|
|
185
|
+
svg.setAttribute("height", "24");
|
|
186
|
+
svg.setAttribute("viewBox", "0 0 24 24");
|
|
187
|
+
svg.setAttribute("fill", "none");
|
|
188
|
+
svg.setAttribute("stroke", "currentColor");
|
|
189
|
+
svg.setAttribute("stroke-width", "2");
|
|
190
|
+
svg.setAttribute("stroke-linecap", "round");
|
|
191
|
+
svg.setAttribute("stroke-linejoin", "round");
|
|
192
|
+
svg.setAttribute("aria-hidden", "true");
|
|
193
|
+
svg.setAttribute("class", className);
|
|
194
|
+
for (const d of ["M18 6 6 18", "m6 6 12 12"]) {
|
|
195
|
+
const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
196
|
+
path.setAttribute("d", d);
|
|
197
|
+
svg.appendChild(path);
|
|
198
|
+
}
|
|
199
|
+
return svg;
|
|
200
|
+
};
|
|
201
|
+
const format = (key, vars = {}) => String(words[key] ?? key).replace(/\{\{(\w+)\}\}/g, (_, name) => String(vars[name] ?? ""));
|
|
202
|
+
const sectionBusy = () => disposed || props.disabled || sections.some((s) => s.busy);
|
|
165
203
|
const sectionWords = (section) => section.site.id === "qoder" ? { title: words.title, description: words.description } : { title: words.cnTitle, description: words.cnDescription };
|
|
166
204
|
const finish = (section) => {
|
|
167
205
|
section.busy = false;
|
|
206
|
+
section.pendingModel = null;
|
|
168
207
|
section.release?.();
|
|
169
208
|
section.release = void 0;
|
|
170
209
|
props.onBusy?.(false);
|
|
@@ -182,6 +221,7 @@ function mount(el, props) {
|
|
|
182
221
|
section.release = lease;
|
|
183
222
|
section.busy = true;
|
|
184
223
|
section.error = false;
|
|
224
|
+
section.errorMessage = void 0;
|
|
185
225
|
props.onBusy?.(true);
|
|
186
226
|
render();
|
|
187
227
|
try {
|
|
@@ -208,7 +248,7 @@ function mount(el, props) {
|
|
|
208
248
|
});
|
|
209
249
|
const action = (section, label, fn) => {
|
|
210
250
|
const button = node("button", words[label], "px-3 py-2 rounded-md bg-secondary text-secondary-foreground hover:bg-secondary/80 disabled:opacity-50");
|
|
211
|
-
button.disabled =
|
|
251
|
+
button.disabled = sectionBusy();
|
|
212
252
|
button.onclick = fn;
|
|
213
253
|
return button;
|
|
214
254
|
};
|
|
@@ -235,6 +275,40 @@ function mount(el, props) {
|
|
|
235
275
|
};
|
|
236
276
|
return button;
|
|
237
277
|
};
|
|
278
|
+
const checkinNote = (section) => {
|
|
279
|
+
if (!section.checkin) return null;
|
|
280
|
+
const result = section.checkin;
|
|
281
|
+
const amount = result.credit;
|
|
282
|
+
const detail = result.outcome === "claimed" && typeof amount === "number" && Number.isFinite(amount) && amount > 0 ? lang === "zh" ? `+${amount} \u79EF\u5206` : `+${amount} credits` : words[`checkin_${result.outcome}`] ?? words.checkin_failed;
|
|
283
|
+
const note = node("p", detail + (result.outcome === "failed" && result.message ? `: ${result.message}` : ""), result.outcome === "failed" ? "text-destructive" : "text-xs text-muted-foreground");
|
|
284
|
+
note.setAttribute("role", "status");
|
|
285
|
+
return note;
|
|
286
|
+
};
|
|
287
|
+
const smallButton = (label, extra, fn) => {
|
|
288
|
+
const button = node("button", label, `${BUTTON_BASE} ${BUTTON_OUTLINE} ${extra}`);
|
|
289
|
+
button.type = "button";
|
|
290
|
+
button.disabled = sectionBusy();
|
|
291
|
+
button.onclick = fn;
|
|
292
|
+
return button;
|
|
293
|
+
};
|
|
294
|
+
const setModelVisibility = (section, ids, hidden) => void run(section, async () => {
|
|
295
|
+
let completed = 0;
|
|
296
|
+
try {
|
|
297
|
+
for (const id of ids) {
|
|
298
|
+
await call(section, "/models/visibility", { model: id, hidden });
|
|
299
|
+
completed += 1;
|
|
300
|
+
}
|
|
301
|
+
} catch (error) {
|
|
302
|
+
if (completed > 0) section.errorMessage = format(hidden ? "hide_partial" : "restore_partial", { count: completed, total: ids.length });
|
|
303
|
+
throw error;
|
|
304
|
+
} finally {
|
|
305
|
+
try {
|
|
306
|
+
await reconcile(section);
|
|
307
|
+
} finally {
|
|
308
|
+
await refresh(section);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
});
|
|
238
312
|
const renderSection = (section) => {
|
|
239
313
|
const panel = node("div", "", "space-y-3 border-t border-border pt-4 first:border-t-0 first:pt-0");
|
|
240
314
|
panel.append(
|
|
@@ -244,7 +318,7 @@ function mount(el, props) {
|
|
|
244
318
|
panel.append(node("p", section.status ? words[section.status.status] ?? words.error : words.loading));
|
|
245
319
|
if (section.status?.expired) panel.append(node("p", words.expired, "text-destructive"));
|
|
246
320
|
if (section.status?.account) panel.append(node("p", `${words.account}: ${section.status.account}`));
|
|
247
|
-
if (section.error) panel.append(node("p", words.error, "text-destructive"));
|
|
321
|
+
if (section.error) panel.append(node("p", section.errorMessage ?? words.error, "text-destructive"));
|
|
248
322
|
const buttons = node("div", "", "flex flex-wrap gap-2");
|
|
249
323
|
if (section.status?.status === "not_connected") {
|
|
250
324
|
const input = node("input", "", "w-full rounded-md border border-input bg-background px-3 py-2 text-sm");
|
|
@@ -263,42 +337,30 @@ function mount(el, props) {
|
|
|
263
337
|
panel.append(node("p", words.pat, "text-sm font-medium"), input);
|
|
264
338
|
buttons.append(connectButton);
|
|
265
339
|
} else if (section.status) {
|
|
340
|
+
if (section.site.id === "qoder-cn") {
|
|
341
|
+
panel.append(checkinButton(section));
|
|
342
|
+
const note = checkinNote(section);
|
|
343
|
+
if (note) panel.append(note);
|
|
344
|
+
} else if (section.status) {
|
|
345
|
+
panel.append(node("p", words.checkinDesktop, "text-sm text-muted-foreground"));
|
|
346
|
+
}
|
|
266
347
|
buttons.append(action(section, "sync", () => void run(section, async () => {
|
|
267
348
|
await call(section, "/sync", {});
|
|
268
349
|
await reconcile(section);
|
|
269
350
|
await refresh(section);
|
|
270
351
|
})));
|
|
271
|
-
if (section.site.id === "qoder-cn") {
|
|
272
|
-
panel.append(checkinButton(section));
|
|
273
|
-
if (section.checkin) {
|
|
274
|
-
const result = section.checkin;
|
|
275
|
-
const amount = result.credit;
|
|
276
|
-
const detail = result.outcome === "claimed" && typeof amount === "number" && Number.isFinite(amount) && amount > 0 ? lang === "zh" ? `+${amount} \u79EF\u5206` : `+${amount} credits` : words[`checkin_${result.outcome}`] ?? words.checkin_failed;
|
|
277
|
-
const note = node("p", detail + (result.outcome === "failed" && result.message ? `: ${result.message}` : ""), result.outcome === "failed" ? "text-destructive" : "text-xs text-muted-foreground");
|
|
278
|
-
note.setAttribute("role", "status");
|
|
279
|
-
panel.append(note);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
352
|
buttons.append(action(section, "usage", () => void run(section, async () => {
|
|
283
353
|
section.usage = await call(section, "/usage", {});
|
|
284
354
|
})));
|
|
285
355
|
buttons.append(action(section, "disconnect", () => void run(section, async () => {
|
|
286
356
|
await call(section, "/disconnect", {});
|
|
287
357
|
section.usage = void 0;
|
|
288
|
-
section.checkin = void 0;
|
|
289
358
|
await reconcile(section);
|
|
290
359
|
await refresh(section);
|
|
291
360
|
})));
|
|
292
361
|
}
|
|
293
362
|
buttons.append(action(section, "refresh", () => void run(section, () => refresh(section))));
|
|
294
363
|
panel.append(buttons);
|
|
295
|
-
if (section.status?.status === "connected" && section.site.id === "qoder") panel.append(node("p", words.checkinDesktop, "text-sm text-muted-foreground"));
|
|
296
|
-
if (section.checkin) {
|
|
297
|
-
const result = section.checkin;
|
|
298
|
-
const amount = result.credit;
|
|
299
|
-
const detail = result.outcome === "claimed" && typeof amount === "number" && Number.isFinite(amount) && amount > 0 ? lang === "zh" ? `+${amount} \u79EF\u5206` : `+${amount} credits` : words[`checkin_${result.outcome}`] ?? words.checkin_failed;
|
|
300
|
-
panel.append(node("p", detail + (result.outcome === "failed" && result.message ? `: ${result.message}` : ""), result.outcome === "failed" ? "text-destructive" : "text-sm"));
|
|
301
|
-
}
|
|
302
364
|
const usageLine = node("p", "", "text-sm text-muted-foreground");
|
|
303
365
|
if (section.usage?.known && Array.isArray(section.usage.windows) && section.usage.windows.length) {
|
|
304
366
|
usageLine.textContent = `${section.usage.stale ? words.stale : words.used}: ` + section.usage.windows.map((w) => {
|
|
@@ -309,18 +371,67 @@ function mount(el, props) {
|
|
|
309
371
|
} else usageLine.textContent = words.unknown;
|
|
310
372
|
panel.append(usageLine);
|
|
311
373
|
if (section.status?.coolingUntil > Date.now()) panel.append(node("p", `${words.cooling}: ${new Date(section.status.coolingUntil).toLocaleString()}`, "text-sm text-muted-foreground"));
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
374
|
+
const models = Array.isArray(section.status?.models) ? section.status.models : [];
|
|
375
|
+
const visible = models.filter((model) => !model.hidden);
|
|
376
|
+
const hiddenModels = models.filter((model) => model.hidden);
|
|
377
|
+
if (section.status?.status === "connected" || models.length) {
|
|
378
|
+
const count = node("dl", "", "grid max-w-md grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1 text-xs");
|
|
379
|
+
count.append(
|
|
380
|
+
node("dt", words.models, "text-muted-foreground"),
|
|
381
|
+
node("dd", format("models_count", { count: section.status?.modelCount ?? models.length }), "break-all text-foreground")
|
|
382
|
+
);
|
|
383
|
+
panel.append(count);
|
|
384
|
+
}
|
|
385
|
+
if (!models.length) panel.append(node("p", words.noModels, "text-sm text-muted-foreground"));
|
|
386
|
+
if (visible.length) {
|
|
387
|
+
const chips = node("div", "", "flex flex-wrap gap-2 pt-1");
|
|
388
|
+
for (const model of visible) {
|
|
389
|
+
const id = String(model.id);
|
|
390
|
+
const chip = node("span", id, CHIP);
|
|
391
|
+
if (model.context) chip.append(node("span", String(model.context), "font-medium text-muted-foreground/60"));
|
|
392
|
+
if (model.free) chip.append(node("span", words.free, "font-medium text-muted-foreground/60"));
|
|
393
|
+
const hide = node("button", "", CHIP_HIDE);
|
|
394
|
+
hide.type = "button";
|
|
395
|
+
hide.disabled = sectionBusy();
|
|
396
|
+
hide.setAttribute("aria-label", format("hide_model", { model: id }));
|
|
397
|
+
hide.setAttribute("aria-busy", String(section.busy && section.pendingModel === id));
|
|
398
|
+
hide.append(xIcon("h-3 w-3"));
|
|
399
|
+
hide.onclick = () => {
|
|
400
|
+
section.pendingModel = id;
|
|
401
|
+
setModelVisibility(section, [id], true);
|
|
402
|
+
};
|
|
403
|
+
chip.append(hide);
|
|
404
|
+
chips.append(chip);
|
|
405
|
+
}
|
|
406
|
+
panel.append(chips);
|
|
407
|
+
}
|
|
408
|
+
if (hiddenModels.length) {
|
|
409
|
+
const details = node("details", "", "max-w-md text-xs text-muted-foreground");
|
|
410
|
+
details.append(node("summary", format("hidden_models", { count: hiddenModels.length }), "cursor-pointer select-none font-medium"));
|
|
411
|
+
const list = node("ul", "", "mt-2 space-y-1");
|
|
412
|
+
for (const model of hiddenModels) {
|
|
413
|
+
const id = String(model.id);
|
|
414
|
+
const item = node("li", "", "flex items-center justify-between gap-2");
|
|
415
|
+
item.append(node("span", id, "break-all font-mono"));
|
|
416
|
+
const restore = smallButton(
|
|
417
|
+
words.restore,
|
|
418
|
+
"h-6 shrink-0 px-2 text-[11px]",
|
|
419
|
+
() => {
|
|
420
|
+
section.pendingModel = id;
|
|
421
|
+
setModelVisibility(section, [id], false);
|
|
422
|
+
}
|
|
423
|
+
);
|
|
424
|
+
restore.setAttribute("aria-label", format("restore_model", { model: id }));
|
|
425
|
+
item.append(restore);
|
|
426
|
+
list.append(item);
|
|
427
|
+
}
|
|
428
|
+
details.append(list);
|
|
429
|
+
details.append(smallButton(
|
|
430
|
+
words.restore_all,
|
|
431
|
+
"mt-2 h-7 px-2 text-[11px]",
|
|
432
|
+
() => setModelVisibility(section, hiddenModels.map((model) => String(model.id)), false)
|
|
433
|
+
));
|
|
434
|
+
panel.append(details);
|
|
324
435
|
}
|
|
325
436
|
return panel;
|
|
326
437
|
};
|
package/dist/plugin.js
CHANGED
|
@@ -2546,11 +2546,6 @@ var qoderLocales = {
|
|
|
2546
2546
|
connected: "Connected",
|
|
2547
2547
|
expired: "Sign-in lapsed \u2014 reconnect with a fresh PAT",
|
|
2548
2548
|
error: "Management request failed",
|
|
2549
|
-
account: "Account",
|
|
2550
|
-
models: "Models",
|
|
2551
|
-
pat: "Personal access token",
|
|
2552
|
-
patPlaceholder: "pt-\u2026",
|
|
2553
|
-
connect: "Connect",
|
|
2554
2549
|
checkin: "Check in",
|
|
2555
2550
|
checkin_action: "Check in",
|
|
2556
2551
|
checkin_pending: "Checking in\u2026",
|
|
@@ -2560,14 +2555,25 @@ var qoderLocales = {
|
|
|
2560
2555
|
checkin_ineligible: "Unavailable",
|
|
2561
2556
|
checkin_failed: "Check-in failed",
|
|
2562
2557
|
checkinDesktop: "International check-in requires Qoder desktop device identity; claim in Qoder desktop.",
|
|
2558
|
+
account: "Account",
|
|
2559
|
+
models: "Models",
|
|
2560
|
+
models_count: "{{count}} models",
|
|
2561
|
+
pat: "Personal access token",
|
|
2562
|
+
patPlaceholder: "pt-\u2026",
|
|
2563
|
+
connect: "Connect",
|
|
2563
2564
|
sync: "Refresh models",
|
|
2564
2565
|
usage: "Refresh quota",
|
|
2565
2566
|
unknown: "Quota unknown",
|
|
2566
2567
|
stale: "Last known quota (stale)",
|
|
2567
2568
|
used: "Allowance",
|
|
2569
|
+
restore_partial: "Partially completed: restored {{count}} of {{total}} models. Management request failed.",
|
|
2570
|
+
hide_partial: "Partially completed: hid {{count}} of {{total}} models. Management request failed.",
|
|
2571
|
+
restore_model: "Restore {{model}}",
|
|
2568
2572
|
disconnect: "Disconnect",
|
|
2569
|
-
|
|
2573
|
+
hide_model: "Hide {{model}}",
|
|
2574
|
+
hidden_models: "Hidden models ({{count}})",
|
|
2570
2575
|
restore: "Restore",
|
|
2576
|
+
restore_all: "Restore all",
|
|
2571
2577
|
cooling: "Rate limited until",
|
|
2572
2578
|
noModels: "Refresh models after connecting",
|
|
2573
2579
|
free: "free",
|
|
@@ -2583,11 +2589,6 @@ var qoderLocales = {
|
|
|
2583
2589
|
connected: "\u5DF2\u8FDE\u63A5",
|
|
2584
2590
|
expired: "\u767B\u5F55\u5DF2\u5931\u6548 \u2014 \u8BF7\u4F7F\u7528\u65B0\u7684 PAT \u91CD\u65B0\u8FDE\u63A5",
|
|
2585
2591
|
error: "\u7BA1\u7406\u64CD\u4F5C\u5931\u8D25",
|
|
2586
|
-
account: "\u8D26\u53F7",
|
|
2587
|
-
models: "\u6A21\u578B",
|
|
2588
|
-
pat: "\u4E2A\u4EBA\u8BBF\u95EE\u4EE4\u724C",
|
|
2589
|
-
patPlaceholder: "pt-\u2026",
|
|
2590
|
-
connect: "\u8FDE\u63A5",
|
|
2591
2592
|
checkin: "\u7B7E\u5230",
|
|
2592
2593
|
checkin_action: "\u7B7E\u5230",
|
|
2593
2594
|
checkin_pending: "\u7B7E\u5230\u4E2D\u2026",
|
|
@@ -2597,14 +2598,25 @@ var qoderLocales = {
|
|
|
2597
2598
|
checkin_ineligible: "\u4E0D\u53EF\u7528",
|
|
2598
2599
|
checkin_failed: "\u7B7E\u5230\u5931\u8D25",
|
|
2599
2600
|
checkinDesktop: "\u56FD\u9645\u7AD9\u9700\u8981\u5728 Qoder \u684C\u9762\u7AEF\u5185\u7B7E\u5230\u3002",
|
|
2601
|
+
account: "\u8D26\u53F7",
|
|
2602
|
+
models: "\u6A21\u578B",
|
|
2603
|
+
models_count: "{{count}} \u4E2A\u6A21\u578B",
|
|
2604
|
+
pat: "\u4E2A\u4EBA\u8BBF\u95EE\u4EE4\u724C",
|
|
2605
|
+
patPlaceholder: "pt-\u2026",
|
|
2606
|
+
connect: "\u8FDE\u63A5",
|
|
2600
2607
|
sync: "\u5237\u65B0\u6A21\u578B",
|
|
2601
2608
|
usage: "\u5237\u65B0\u989D\u5EA6",
|
|
2602
2609
|
unknown: "\u989D\u5EA6\u672A\u77E5",
|
|
2603
2610
|
stale: "\u4E0A\u6B21\u989D\u5EA6\uFF08\u5DF2\u8FC7\u671F\uFF09",
|
|
2604
2611
|
used: "\u5DF2\u7528\u989D\u5EA6",
|
|
2612
|
+
restore_partial: "\u90E8\u5206\u5B8C\u6210\uFF1A\u5DF2\u6062\u590D {{count}} \u4E2A\u6A21\u578B\uFF0C\u5171 {{total}} \u4E2A\u3002\u7BA1\u7406\u64CD\u4F5C\u5931\u8D25\u3002",
|
|
2613
|
+
hide_partial: "\u90E8\u5206\u5B8C\u6210\uFF1A\u5DF2\u9690\u85CF {{count}} \u4E2A\u6A21\u578B\uFF0C\u5171 {{total}} \u4E2A\u3002\u7BA1\u7406\u64CD\u4F5C\u5931\u8D25\u3002",
|
|
2614
|
+
restore_model: "\u6062\u590D {{model}}",
|
|
2605
2615
|
disconnect: "\u65AD\u5F00\u8FDE\u63A5",
|
|
2606
|
-
|
|
2616
|
+
hide_model: "\u9690\u85CF {{model}}",
|
|
2617
|
+
hidden_models: "\u5DF2\u9690\u85CF\u6A21\u578B\uFF08{{count}}\uFF09",
|
|
2607
2618
|
restore: "\u6062\u590D",
|
|
2619
|
+
restore_all: "\u6062\u590D\u5168\u90E8",
|
|
2608
2620
|
cooling: "\u9650\u6D41\u81F3",
|
|
2609
2621
|
noModels: "\u8FDE\u63A5\u540E\u8BF7\u5237\u65B0\u6A21\u578B",
|
|
2610
2622
|
free: "\u514D\u8D39",
|
|
@@ -2613,7 +2625,7 @@ var qoderLocales = {
|
|
|
2613
2625
|
};
|
|
2614
2626
|
|
|
2615
2627
|
// src/plugin.ts
|
|
2616
|
-
var manifest = { name: "qoder", version: "0.3.
|
|
2628
|
+
var manifest = { name: "qoder", version: "0.3.2", coreApi: "1", description: "Qoder (qoder.com / qoder.cn) subscription provider with PAT sign-in, model management and usage." };
|
|
2617
2629
|
function activatedTransformer(site, service) {
|
|
2618
2630
|
return class ActivatedQoderTransformer extends QoderTransformer {
|
|
2619
2631
|
static TransformerName = site;
|
package/dist/plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wengine-ai/ccr-provider-qoder",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Qoder subscription provider (qoder.com and qoder.cn): Personal Access Token sign-in, fixed agent_chat_generation upstream, model management and usage.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/plugin.js",
|