@zq-silk/yui 2.6.0 → 2.8.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/README.md +23 -0
- package/dist/cli/commandCatalog.js +34 -7
- package/dist/cli/updateCommand.js +3 -0
- package/dist/commands/configCommands.js +1 -0
- package/dist/commands/globalRoleCommands.js +62 -35
- package/dist/commands/inboxCommands.js +372 -0
- package/dist/commands/roleSkillValidation.js +2 -0
- package/dist/commands/taskCommands.js +39 -7
- package/dist/commands/taskRoleRuntimeStatus.js +2 -0
- package/dist/context/currentSkills.js +48 -0
- package/dist/context/roleSessionContext.js +13 -16
- package/dist/context/runContextPack.js +50 -3
- package/dist/context/runInputContract.js +1 -1
- package/dist/context/sessionBootstrapManifest.js +27 -4
- package/dist/context/skillCatalog.js +2 -3
- package/dist/context/taskContext.js +38 -12
- package/dist/controlPlaneCli.js +58 -7
- package/dist/controller/controller.js +8 -2
- package/dist/controller/fileSchedulerStoreAdapter.js +26 -6
- package/dist/controller/globalInputDelivery.js +86 -16
- package/dist/controller/globalRuntimeAttention.js +136 -6
- package/dist/controller/operatorNotification.js +6 -1
- package/dist/controller/providerRetryDelivery.js +3 -5
- package/dist/controller/runtime.js +6 -2
- package/dist/controller/structuredProviderObservation.js +51 -15
- package/dist/controller/taskHostTerminalRecovery.js +33 -0
- package/dist/doctor/doctor.js +25 -2
- package/dist/executor/effectiveLaunch.js +2 -2
- package/dist/executor/fileRoleLaunchPlanner.js +8 -15
- package/dist/interaction/notificationPresentation.js +2 -2
- package/dist/interaction/operatorPresentation.js +1 -1
- package/dist/message/globalInputBacklog.js +69 -0
- package/dist/message/globalMessageQuery.js +1 -0
- package/dist/message/inboxReceipt.js +62 -0
- package/dist/message/message.js +6 -1
- package/dist/message/messageContinuation.js +34 -13
- package/dist/message/taskInboxOwnership.js +43 -0
- package/dist/models/modelManagement.js +469 -0
- package/dist/models/modelManagementConfig.js +46 -0
- package/dist/models/modelManagementFiles.js +90 -0
- package/dist/models/modelManagementHttp.js +90 -0
- package/dist/models/modelManagementTypes.js +1 -0
- package/dist/nativeAgent/session/backends.js +1 -1
- package/dist/observability/runtimeIdentity.js +1 -1
- package/dist/output/boundedRead.js +43 -14
- package/dist/resources/sqliteResourceRegistry.js +1 -1
- package/dist/runtime/agentEndpointIdentity.js +8 -4
- package/dist/runtime/agentEndpointOwnership.js +5 -6
- package/dist/runtime/agentHost.js +165 -24
- package/dist/runtime/agentHostImplementation.js +18 -0
- package/dist/runtime/managedCaller.js +25 -1
- package/dist/runtime/managedIdentity.js +1 -1
- package/dist/runtime/providerRetry.js +19 -1
- package/dist/runtime/sessionCaller.js +53 -0
- package/dist/scheduler/operatorEvent.js +49 -0
- package/dist/scheduler/operatorInputNotificationProcessor.js +5 -4
- package/dist/scheduler/taskWake.js +5 -0
- package/dist/sqlite/driver.js +108 -0
- package/dist/storage/contextRecords.js +28 -0
- package/dist/storage/sqliteSchema.js +21 -1
- package/dist/storage/sqliteStore.js +64 -1
- package/dist/storage/storageSchema.js +1 -1
- package/dist/storage/storageVersions.js +1 -1
- package/dist/storage/storeRpc.js +1 -0
- package/dist/storage/taskStore.js +4 -0
- package/dist/storage/upgrade/upgradeOrchestrator.js +1 -1
- package/dist/task/completionReadiness.js +13 -6
- package/dist/telemetry/sqliteTelemetryStore.js +1 -1
- package/dist/web/assets/assetManifest.js +28 -2
- package/dist/web/assets/client/app/manage.js +6 -0
- package/dist/web/assets/client/app/models.js +20 -0
- package/dist/web/assets/client/app/settings.js +41 -9
- package/dist/web/assets/client/i18n/en.js +180 -2
- package/dist/web/assets/client/i18n/zh-CN.js +178 -2
- package/dist/web/assets/client/index.js +8 -0
- package/dist/web/assets/client/layout/manageShell.js +94 -0
- package/dist/web/assets/client/lib/api.js +13 -1
- package/dist/web/assets/client/lib/i18n.js +5 -3
- package/dist/web/assets/client/views/dock/conversation.js +231 -80
- package/dist/web/assets/client/views/models.js +777 -0
- package/dist/web/assets/client/views/skills.js +22 -15
- package/dist/web/assets/shared/icons.js +2 -0
- package/dist/web/assets/shared/manageNav.js +13 -0
- package/dist/web/assets/shell/manage.js +54 -0
- package/dist/web/assets/shell/models.js +7 -0
- package/dist/web/assets/shell/settings.js +1 -35
- package/dist/web/assets/shell/settingsContent.js +30 -0
- package/dist/web/assets/shell/sidebar.js +1 -0
- package/dist/web/assets/styles/index.js +6 -0
- package/dist/web/assets/styles/views/conversation.js +133 -0
- package/dist/web/assets/styles/views/manage.js +71 -0
- package/dist/web/assets/styles/views/models.js +129 -0
- package/dist/web/assets/styles/views/settings.js +28 -14
- package/dist/web/assets/styles/views/sidebar.js +1 -0
- package/dist/web/webServer.js +59 -9
- package/docs/cli-information-contract.md +42 -11
- package/docs/cli-information-contract.zh-CN.md +28 -7
- package/docs/managed-turn-and-session-runtime.md +127 -5
- package/docs/managed-turn-and-session-runtime.zh-CN.md +83 -3
- package/docs/release-workflow.md +105 -9
- package/docs/release-workflow.zh-CN.md +73 -5
- package/docs/storage-baseline.md +22 -7
- package/docs/storage-baseline.zh-CN.md +14 -5
- package/docs/task-delivery.md +17 -8
- package/docs/task-delivery.zh-CN.md +11 -5
- package/docs/testing/review-evaluation.md +148 -0
- package/docs/testing/review-evaluation.zh-CN.md +117 -0
- package/docs/testing/verification-levels.md +26 -4
- package/docs/testing/verification-levels.zh-CN.md +11 -1
- package/i18n/README.zh-CN.md +19 -0
- package/package.json +5 -2
- package/skills/yui-leader/SKILL.md +28 -11
- package/skills/yui-leader/VERSION +1 -0
- package/skills/yui-leader/references/execution.md +29 -0
- package/skills/yui-leader/references/replicated-execution.md +7 -0
- package/skills/yui-operator/SKILL.md +15 -3
- package/skills/yui-operator/VERSION +1 -0
- package/skills/yui-operator/references/task-delivery.md +2 -0
- package/skills/yui-reviewer/SKILL.md +43 -1
- package/skills/yui-reviewer/VERSION +1 -0
- package/skills/yui-runtime/SKILL.md +144 -15
- package/skills/yui-runtime/VERSION +1 -0
- package/skills/yui-runtime/references/publication.md +16 -5
- package/skills/yui-runtime/references/recovery.md +24 -5
- package/skills/yui-worker/SKILL.md +8 -1
- package/skills/yui-worker/VERSION +1 -0
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// fonts and xterm from their packages; the shell links them in this order.
|
|
4
4
|
import { readFileSync } from "node:fs";
|
|
5
5
|
import { createRequire } from "node:module";
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
6
7
|
import { APP_SCRIPT, CLIENT_MODULES } from "./client/index.js";
|
|
7
8
|
import { THEME_BOOTSTRAP_SCRIPT } from "./client/lib/theme.js";
|
|
8
9
|
import { FONT_WOFF2_BASE64 } from "./fontData.js";
|
|
@@ -22,8 +23,33 @@ export const WEB_ASSETS = Object.freeze({
|
|
|
22
23
|
"/assets/vendor/xterm.css": vendorAsset("@xterm/xterm/css/xterm.css", CSS)
|
|
23
24
|
});
|
|
24
25
|
export { DASHBOARD_HTML };
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
// One content revision covers the complete import graph: changing a dependency
|
|
27
|
+
// invalidates its importers too. Only these static assets may be cached.
|
|
28
|
+
export const WEB_ASSET_VERSION = createHash("sha256")
|
|
29
|
+
.update(JSON.stringify(WEB_ASSETS)).digest("hex").slice(0, 20);
|
|
30
|
+
function versionReferences(body) {
|
|
31
|
+
return body.replace(/\/assets\/[\w./-]+/g, path => WEB_ASSETS[path] ? `${path}?v=${WEB_ASSET_VERSION}` : path);
|
|
32
|
+
}
|
|
33
|
+
const VERSIONED_ASSETS = Object.fromEntries(Object.entries(WEB_ASSETS).map(([path, asset]) => [path, asset.encoding === "base64" ? asset :
|
|
34
|
+
{ ...asset, body: versionReferences(asset.body) }]));
|
|
35
|
+
export function findWebAsset(pathname, version) {
|
|
36
|
+
if (version && version !== WEB_ASSET_VERSION)
|
|
37
|
+
return null;
|
|
38
|
+
return (version ? VERSIONED_ASSETS : WEB_ASSETS)[pathname] ?? null;
|
|
39
|
+
}
|
|
40
|
+
export function prepareWebDocument(html, entry) {
|
|
41
|
+
const modules = new Set();
|
|
42
|
+
function visit(path) {
|
|
43
|
+
if (modules.has(path) || !WEB_ASSETS[path])
|
|
44
|
+
return;
|
|
45
|
+
modules.add(path);
|
|
46
|
+
for (const match of WEB_ASSETS[path].body.matchAll(/^import (?:.*? from )?["'](\/assets\/[^"']+)["'];/gm)) {
|
|
47
|
+
visit(match[1]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
visit(entry);
|
|
51
|
+
const preload = [...modules].map(path => `<link rel="modulepreload" href="${path}?v=${WEB_ASSET_VERSION}">`).join("\n");
|
|
52
|
+
return versionReferences(html).replace("</head>", `${preload}\n</head>`);
|
|
27
53
|
}
|
|
28
54
|
function vendorAsset(specifier, contentType) {
|
|
29
55
|
return {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const MODELS_SCRIPT = String.raw `
|
|
2
|
+
import { api } from "/assets/js/lib/api.js";
|
|
3
|
+
import { i18n, createManageShell, registerManagePage, navigateManage, readManageRoute } from "/assets/js/layout/manageShell.js";
|
|
4
|
+
import { mountModels } from "/assets/js/views/models.js";
|
|
5
|
+
const shell = createManageShell({ page: "models", t: i18n.t });
|
|
6
|
+
const initial = readManageRoute(new URL(location.href));
|
|
7
|
+
const page = mountModels(document.querySelector("#models-root"), {
|
|
8
|
+
t: i18n.t, locale: i18n.getLocale, api, route: initial,
|
|
9
|
+
navigate: next => navigateManage({ page: "models", ...next }),
|
|
10
|
+
onChange: flags => shell.setDirty({ providers: !!flags.provider, connection: !!flags.connection })
|
|
11
|
+
});
|
|
12
|
+
registerManagePage("models", { show: next => page.show(next) });
|
|
13
|
+
window.setInterval(() => page.updateFreshness(), 1000);
|
|
14
|
+
document.addEventListener("visibilitychange", () => { if (!document.hidden) page.updateFreshness(); });
|
|
15
|
+
i18n.subscribe(() => page.translate());
|
|
16
|
+
window.addEventListener("beforeunload", event => {
|
|
17
|
+
if (!page.dirty()) return;
|
|
18
|
+
event.preventDefault(); event.returnValue = "";
|
|
19
|
+
});
|
|
20
|
+
`;
|
|
@@ -1,15 +1,42 @@
|
|
|
1
1
|
export const SETTINGS_SCRIPT = String.raw `
|
|
2
|
+
// Settings controller in the shared management document. Sections stay
|
|
3
|
+
// mounted across model/settings navigation. Leaving the document protects
|
|
4
|
+
// unsaved server groups; Skills guard their own bindings.
|
|
2
5
|
import { h } from "/assets/js/lib/dom.js";
|
|
3
6
|
import { requestJson, submitMutation } from "/assets/js/lib/api.js";
|
|
4
|
-
import { createI18n } from "/assets/js/lib/i18n.js";
|
|
5
7
|
import { createThemeController } from "/assets/js/lib/theme.js";
|
|
6
8
|
import { clearPreference, readSessionAccessMode, writeSessionAccessMode } from "/assets/js/lib/prefs.js";
|
|
9
|
+
import { i18n, createManageShell, pageSections, registerManagePage, navigateManage } from "/assets/js/layout/manageShell.js";
|
|
7
10
|
import { mountSkills } from "/assets/js/views/skills.js";
|
|
8
11
|
|
|
9
12
|
const $ = selector => document.querySelector(selector);
|
|
10
|
-
const i18n = createI18n($("#locale-select"));
|
|
11
13
|
const t = i18n.t;
|
|
12
|
-
|
|
14
|
+
const SECTIONS = pageSections("settings");
|
|
15
|
+
const dirtySections = { skills: false, server: false };
|
|
16
|
+
function readSection() {
|
|
17
|
+
const section = new URLSearchParams(window.location.search).get("section");
|
|
18
|
+
return SECTIONS.includes(section) ? section : SECTIONS[0];
|
|
19
|
+
}
|
|
20
|
+
let section = readSection();
|
|
21
|
+
const shell = createManageShell({ page: "settings", t, onNavigate: navigate });
|
|
22
|
+
function showSection(next) {
|
|
23
|
+
section = next;
|
|
24
|
+
document.querySelectorAll("#settings-root > .manage-section[data-section]").forEach(panel => { panel.hidden = panel.dataset.section !== next; });
|
|
25
|
+
shell.set(next);
|
|
26
|
+
}
|
|
27
|
+
function navigate(next) {
|
|
28
|
+
navigateManage({ page: "settings", section: next });
|
|
29
|
+
}
|
|
30
|
+
function markDirty(name, value) {
|
|
31
|
+
if (dirtySections[name] === value) return;
|
|
32
|
+
dirtySections[name] = value;
|
|
33
|
+
shell.setDirty(dirtySections);
|
|
34
|
+
}
|
|
35
|
+
registerManagePage("settings", { show: next => showSection(next.section) });
|
|
36
|
+
i18n.subscribe(() => shell.render());
|
|
37
|
+
showSection(section);
|
|
38
|
+
const skills = mountSkills($("#skill-browser"), t, { heading: false, onDirty: value => markDirty("skills", value) });
|
|
39
|
+
i18n.subscribe(() => skills?.translate());
|
|
13
40
|
const theme = createThemeController($("#theme-options"), t);
|
|
14
41
|
i18n.subscribe(() => theme.render());
|
|
15
42
|
const access = $("#access-mode");
|
|
@@ -48,8 +75,8 @@ function inputValue(field, control) {
|
|
|
48
75
|
}
|
|
49
76
|
|
|
50
77
|
function editor(field, group, state) {
|
|
51
|
-
const
|
|
52
|
-
const label = h("label.field", null,
|
|
78
|
+
const fieldLabel = () => h("span", { "data-i18n": "settings.field." + field.key, "data-i18n-fallback": field.label }, t("settings.field." + field.key, field.label));
|
|
79
|
+
const label = h("label.field", null, fieldLabel());
|
|
53
80
|
let control;
|
|
54
81
|
if (field.kind === "boolean" || field.choices && field.choices.length) {
|
|
55
82
|
const values = field.kind === "boolean" ? ["true", "false"] : field.choices;
|
|
@@ -74,6 +101,7 @@ function editor(field, group, state) {
|
|
|
74
101
|
function mark() {
|
|
75
102
|
control.disabled = reset.checked || unavailable;
|
|
76
103
|
state.dirty = state.editors.some(e => e.changed());
|
|
104
|
+
markDirty("server", groups.some(g => g.dirty));
|
|
77
105
|
state.save.disabled = !state.dirty || state.pending || state.capabilityPending || state.unknown;
|
|
78
106
|
if (!state.unknown && !state.pending) state.receipt.textContent = state.dirty ? t("settings.unsaved") : "";
|
|
79
107
|
}
|
|
@@ -102,7 +130,7 @@ function editor(field, group, state) {
|
|
|
102
130
|
control.value = value;
|
|
103
131
|
control.disabled = reset.checked || unavailable;
|
|
104
132
|
listen();
|
|
105
|
-
label.replaceChildren(
|
|
133
|
+
label.replaceChildren(fieldLabel(), control);
|
|
106
134
|
choiceActions.replaceChildren();
|
|
107
135
|
if (choices.length && options.allowCustom && !unavailable) {
|
|
108
136
|
const custom = h("button.btn", { type: "button" }, t("settings.custom"));
|
|
@@ -110,7 +138,7 @@ function editor(field, group, state) {
|
|
|
110
138
|
const value = control.value;
|
|
111
139
|
control = h("input", { value });
|
|
112
140
|
control.disabled = reset.checked;
|
|
113
|
-
listen(); label.replaceChildren(
|
|
141
|
+
listen(); label.replaceChildren(fieldLabel(), control); choiceActions.replaceChildren();
|
|
114
142
|
control.focus();
|
|
115
143
|
});
|
|
116
144
|
choiceActions.append(custom);
|
|
@@ -153,9 +181,10 @@ function renderGroup(state, group) {
|
|
|
153
181
|
const generation = state.renderGeneration = (state.renderGeneration || 0) + 1;
|
|
154
182
|
state.group = group; state.editors = []; state.dirty = false; state.unknown = false;
|
|
155
183
|
state.capabilityPending = false;
|
|
184
|
+
markDirty("server", groups.some(g => g.dirty));
|
|
156
185
|
const form = h("form.settings-stack");
|
|
157
186
|
const receipt = h("p.settings-receipt", { role: "status", "aria-live": "polite" });
|
|
158
|
-
const save = h("button.btn.btn-primary", { type: "submit", disabled: true }, t("settings.save"));
|
|
187
|
+
const save = h("button.btn.btn-primary", { type: "submit", disabled: true, "data-i18n": "settings.save" }, t("settings.save"));
|
|
159
188
|
state.save = save; state.receipt = receipt;
|
|
160
189
|
form.append(h("p", null, group.notice));
|
|
161
190
|
const isRole = group.id.startsWith("role/");
|
|
@@ -172,7 +201,7 @@ function renderGroup(state, group) {
|
|
|
172
201
|
const acknowledge = h("input", { type: "checkbox" });
|
|
173
202
|
if (group.id.startsWith("role/") || group.id.startsWith("agent/")) form.append(h("label.settings-reset", null,
|
|
174
203
|
acknowledge, t("settings.acknowledge")));
|
|
175
|
-
const compare = h("button.btn", { type: "button" }, t("settings.compare"));
|
|
204
|
+
const compare = h("button.btn", { type: "button", "data-i18n": "settings.compare" }, t("settings.compare"));
|
|
176
205
|
compare.addEventListener("click", async () => {
|
|
177
206
|
compare.disabled = true;
|
|
178
207
|
try {
|
|
@@ -322,5 +351,8 @@ async function start(cursor) {
|
|
|
322
351
|
} catch (error) { status.textContent = error.message; }
|
|
323
352
|
finally { if (generation === searchGeneration) more.disabled = false; }
|
|
324
353
|
}
|
|
354
|
+
i18n.subscribe(() => {
|
|
355
|
+
more.textContent = t("settings.more");
|
|
356
|
+
});
|
|
325
357
|
void start();
|
|
326
358
|
`;
|
|
@@ -3,6 +3,172 @@
|
|
|
3
3
|
// domain vocabulary (statuses, owners, actions) keeps the exact product terms.
|
|
4
4
|
// Placeholders such as {count} are filled by fill() in lib/format.
|
|
5
5
|
export const EN = {
|
|
6
|
+
"models.subscriptionAuth": "Subscription",
|
|
7
|
+
"models.account": "Account",
|
|
8
|
+
"models.providerReadOnlyHelp": "Managed by its provider. Edit the configuration in the owning service.",
|
|
9
|
+
"models.readOnlyService": "Read-only connection. Configuration is managed by the running service.",
|
|
10
|
+
"models.window.5h": "5 hours",
|
|
11
|
+
"models.window.weekly": "Weekly",
|
|
12
|
+
"models.window.monthly": "Monthly",
|
|
13
|
+
"manage.nav": "Main navigation",
|
|
14
|
+
"manage.workbench": "Workbench",
|
|
15
|
+
"settings.section.preferences": "Preferences",
|
|
16
|
+
"settings.section.skills": "Skills",
|
|
17
|
+
"settings.section.server": "Agents & server",
|
|
18
|
+
"settings.hint.preferences": "Theme, language and workspace layout for this browser. Changes apply here immediately and are never sent to the server.",
|
|
19
|
+
"settings.hint.server": "Desired configuration for Yui, Roles, Agents and Profiles. Saving targets later launches; it is not proof that existing Sessions adopted it.",
|
|
20
|
+
"models.title": "Models",
|
|
21
|
+
"models.scope": "Manage the metabridge and CLIProxyAPI connection Yui reads. Saved configuration is not applied until metabridge is reloaded, and nothing here runs inference.",
|
|
22
|
+
"models.section.providers": "Access",
|
|
23
|
+
"models.section.catalog": "Model catalog",
|
|
24
|
+
"models.section.quota": "Quota",
|
|
25
|
+
"models.section.connection": "Model connection",
|
|
26
|
+
"models.openConnection": "Open model connection",
|
|
27
|
+
"models.connectionGroup.bridge": "metabridge",
|
|
28
|
+
"models.connectionGroup.cpa": "CLIProxyAPI (quota)",
|
|
29
|
+
"models.unsavedDraft": "Unsaved changes",
|
|
30
|
+
"models.applicationTitle": "Saving is not applying",
|
|
31
|
+
"models.column.provider": "Provider",
|
|
32
|
+
"models.column.baseUrl": "Base URL",
|
|
33
|
+
"models.column.prefix": "Prefix",
|
|
34
|
+
"models.column.route": "Route",
|
|
35
|
+
"models.column.state": "State",
|
|
36
|
+
"models.column.actions": "Actions",
|
|
37
|
+
"models.providerCount": "{shown} of {total} providers",
|
|
38
|
+
"models.noProviderMatches": "No provider matches these filters.",
|
|
39
|
+
"models.searchProviders": "Search name, ID, URL or prefix",
|
|
40
|
+
"models.searchCatalog": "Search loaded model IDs",
|
|
41
|
+
"models.filter.route": "Filter by route",
|
|
42
|
+
"models.filter.state": "Filter by state",
|
|
43
|
+
"models.filter.source": "Filter by source",
|
|
44
|
+
"models.filter.all": "All",
|
|
45
|
+
"models.filter.enabled": "Enabled",
|
|
46
|
+
"models.filter.disabled": "Disabled",
|
|
47
|
+
"models.filter.readonly": "Read-only",
|
|
48
|
+
"models.catalogMatches": "{count} match",
|
|
49
|
+
"models.noCatalogMatches": "No loaded model matches. Load more pages to search further.",
|
|
50
|
+
"models.resetUnknown": "Reset time unknown",
|
|
51
|
+
"models.accountIdHelp": "Identifier derived by Yui from the upstream account; not an account name.",
|
|
52
|
+
"models.loading": "Loading…",
|
|
53
|
+
"models.loadFailed": "Could not read model configuration:",
|
|
54
|
+
"models.retry": "Retry",
|
|
55
|
+
"models.unavailable": "Model configuration is unavailable until it can be read.",
|
|
56
|
+
"models.unknown": "unknown",
|
|
57
|
+
"models.connected": "Connection configured",
|
|
58
|
+
"models.disconnected": "Not connected",
|
|
59
|
+
"models.application.unverified": "Application unverified",
|
|
60
|
+
"models.applicationHelp": "Saving here changes desired configuration only. Reload metabridge with its existing deployment flow to apply it; this page never restarts services, rewrites Codex configuration, switches Sessions or validates inference.",
|
|
61
|
+
"models.configurationError": "Bridge configuration problem:",
|
|
62
|
+
"models.unknownBlocked": "An earlier save has an unknown outcome. It will not be resent. Read current facts before making another change.",
|
|
63
|
+
"models.readFacts": "Read current facts",
|
|
64
|
+
"models.reconciledChanged": "Current facts read; configuration has changed since the uncertain save. Review it before saving again.",
|
|
65
|
+
"models.reconciledUnchanged": "Current facts read; no change is visible yet. The earlier save may still be unresolved — review before saving again.",
|
|
66
|
+
"models.agentSettings": "Agent and model selection stay in Settings; models are never imported automatically.",
|
|
67
|
+
"models.openSettings": "Open Settings",
|
|
68
|
+
"models.connection": "Connection",
|
|
69
|
+
"models.connectionHelp": "Paths name local files; secrets are read by the server and never shown here. Disconnecting stops nothing and deletes no credentials.",
|
|
70
|
+
"models.notConnected": "No connection is configured. Enter at least the metabridge URL.",
|
|
71
|
+
"models.connection.bridgeUrl": "metabridge URL (required)",
|
|
72
|
+
"models.connection.bridgeUrlHelp": "Base URL of the metabridge management endpoint.",
|
|
73
|
+
"models.connection.bridgeConfigFile": "metabridge configuration file",
|
|
74
|
+
"models.connection.bridgeConfigFileHelp": "Optional. Enables provider management through this local file.",
|
|
75
|
+
"models.connection.cpaUrl": "CLIProxyAPI URL",
|
|
76
|
+
"models.connection.cpaUrlHelp": "Optional. Needed with the management key file for quota refresh.",
|
|
77
|
+
"models.connection.managementKeyFile": "CPA management key file",
|
|
78
|
+
"models.connection.managementKeyFileHelp": "Path to a private file holding the management key. The key itself is never returned.",
|
|
79
|
+
"models.connection.catalogKeyFile": "Catalog key file",
|
|
80
|
+
"models.connection.catalogKeyFileHelp": "Optional. Independent from the management key.",
|
|
81
|
+
"models.saveConnection": "Save connection",
|
|
82
|
+
"models.disconnect": "Disconnect",
|
|
83
|
+
"models.disconnectConfirm": "Disconnect Yui from metabridge? Services keep running and credentials are not deleted.",
|
|
84
|
+
"models.discard": "Discard changes",
|
|
85
|
+
"models.bridgeUrlRequired": "The metabridge URL is required.",
|
|
86
|
+
"models.providers": "Providers",
|
|
87
|
+
"models.providersHelp": "Providers configured in metabridge. Official, subscription and unprefixed shared routes are read-only.",
|
|
88
|
+
"models.noProviders": "No providers are configured.",
|
|
89
|
+
"models.addProvider": "Add API-key provider",
|
|
90
|
+
"models.configFileRequired": "Set the metabridge configuration file in the connection to manage providers.",
|
|
91
|
+
"models.newProvider": "New provider",
|
|
92
|
+
"models.editProvider": "Edit",
|
|
93
|
+
"models.removeProvider": "Remove",
|
|
94
|
+
"models.removeConfirm": "Remove this provider from metabridge? Its file and credential are retained.",
|
|
95
|
+
"models.discardProvider": "Discard the provider being edited?",
|
|
96
|
+
"models.readOnly": "Read-only",
|
|
97
|
+
"models.noPrefix": "no prefix",
|
|
98
|
+
"models.enabled": "Enabled",
|
|
99
|
+
"models.disabled": "Disabled",
|
|
100
|
+
"models.credentialStored": "Credential stored",
|
|
101
|
+
"models.credentialMissing": "No credential",
|
|
102
|
+
"models.via.direct": "Direct",
|
|
103
|
+
"models.via.cpa": "Through CPA",
|
|
104
|
+
"models.via.unknown": "Unknown route",
|
|
105
|
+
"models.provider.name": "Name",
|
|
106
|
+
"models.provider.via": "Route",
|
|
107
|
+
"models.provider.viaDirectHelp": "metabridge calls the provider directly with this provider's API key.",
|
|
108
|
+
"models.provider.viaCpaHelp": "metabridge calls CLIProxyAPI. Use a CPA client inference key — not an upstream account key or the management key.",
|
|
109
|
+
"models.provider.baseUrl": "Base URL",
|
|
110
|
+
"models.provider.prefix": "Model prefix",
|
|
111
|
+
"models.provider.prefixHelp": "Explicit model namespace ending in /, e.g. mine/ for mine/model: 1–64 letters, digits, _ or -, then /.",
|
|
112
|
+
"models.prefixInvalid": "Prefix must be 1–64 letters, digits, _ or - followed by /, e.g. mine/.",
|
|
113
|
+
"models.provider.enabled": "Enabled",
|
|
114
|
+
"models.provider.apiKey": "API key",
|
|
115
|
+
"models.provider.apiKeyCpa": "CPA client inference key",
|
|
116
|
+
"models.provider.apiKeyNewHelp": "Required. Sent once on save and cleared; it is never shown again.",
|
|
117
|
+
"models.provider.apiKeyKeepHelp": "Leave empty to keep the stored credential; a new value replaces it.",
|
|
118
|
+
"models.provider.apiKeyMissingHelp": "No credential is stored. Enter one to set it.",
|
|
119
|
+
"models.apiKeyKeep": "Unchanged",
|
|
120
|
+
"models.createProvider": "Create provider",
|
|
121
|
+
"models.saveProvider": "Save provider",
|
|
122
|
+
"models.cancel": "Cancel",
|
|
123
|
+
"models.providerNewRequired": "Name, base URL, prefix and API key are required for a new provider.",
|
|
124
|
+
"models.providerRequired": "Name, base URL and a direct or CPA route are required.",
|
|
125
|
+
"models.saving": "Saving…",
|
|
126
|
+
"models.saved": "Saved. Not applied until metabridge reloads.",
|
|
127
|
+
"models.rejected": "Not saved; your draft is kept. If the configuration changed, read current facts and save again.",
|
|
128
|
+
"models.rereadChanged": "Current facts read; configuration has changed. Your draft is kept — review it against the new facts before saving.",
|
|
129
|
+
"models.rereadUnchanged": "Current facts read; configuration is unchanged. Your draft is kept.",
|
|
130
|
+
"models.unknownWrite": "Save outcome unknown; it will not be resent.",
|
|
131
|
+
"models.catalog": "Model catalog",
|
|
132
|
+
"models.catalogHelp": "Cached metabridge catalog. Source comes from the model ID namespace; it is not proof of account attribution.",
|
|
133
|
+
"models.catalogFailed": "Catalog read failed:",
|
|
134
|
+
"models.catalogNotQueried": "The catalog has not been queried yet. Refresh to read it from metabridge.",
|
|
135
|
+
"models.catalogEmpty": "The observation contains no models.",
|
|
136
|
+
"models.catalogItemsUnknown": "No models were observed; the catalog is unknown, not empty.",
|
|
137
|
+
"models.catalogCount": "Showing {shown} of {total}",
|
|
138
|
+
"models.catalogChanged": "The catalog changed while paging; showing the newest first page.",
|
|
139
|
+
"models.moreCatalog": "Load more models",
|
|
140
|
+
"models.refreshCatalog": "Refresh catalog",
|
|
141
|
+
"models.quota": "Subscription quota",
|
|
142
|
+
"models.quotaHelp": "Each source is read separately. Refresh is explicit and may contact the upstream billing service through the CPA extension; it never renews credentials, resets quota or runs inference.",
|
|
143
|
+
"models.source": "Source",
|
|
144
|
+
"models.source.factory": "Factory",
|
|
145
|
+
"models.source.command-code": "Command Code",
|
|
146
|
+
"models.refreshQuota": "Refresh quota",
|
|
147
|
+
"models.quotaNeedsCpa": "Quota refresh needs the CPA URL and management key file.",
|
|
148
|
+
"models.quotaUnavailable": "The quota route is unavailable, so quota is unknown. This does not prove the extension is uninstalled.",
|
|
149
|
+
"models.quotaFailed": "Quota is unknown:",
|
|
150
|
+
"models.quotaNotQueried": "Quota has not been queried for this source.",
|
|
151
|
+
"models.quotaUnsupported": "This source does not report quota; it is unknown, not zero.",
|
|
152
|
+
"models.quotaEmpty": "The observation contains no accounts.",
|
|
153
|
+
"models.quotaItemsUnknown": "No accounts were observed; quota is unknown, not empty.",
|
|
154
|
+
"models.noWindows": "No quota windows reported.",
|
|
155
|
+
"models.remaining": "Remaining",
|
|
156
|
+
"models.used": "Used / cap",
|
|
157
|
+
"models.resets": "Resets",
|
|
158
|
+
"models.balance": "Balance",
|
|
159
|
+
"models.balance.extra-usage-usd": "Extra usage balance (USD)",
|
|
160
|
+
"models.balance.monthly-credits": "Monthly credits",
|
|
161
|
+
"models.balance.purchased-credits": "Purchased credits",
|
|
162
|
+
"models.balance.free-credits": "Free credits",
|
|
163
|
+
"models.periodEnd": "Period ends",
|
|
164
|
+
"models.status.not-queried": "Not queried",
|
|
165
|
+
"models.status.success": "Observed",
|
|
166
|
+
"models.status.partial": "Partial",
|
|
167
|
+
"models.status.failed": "Failed",
|
|
168
|
+
"models.status.unsupported": "Unsupported",
|
|
169
|
+
"models.stale": "Stale",
|
|
170
|
+
"models.attempted": "Attempted",
|
|
171
|
+
"models.observed": "observed",
|
|
6
172
|
"preview.title": "Preview",
|
|
7
173
|
"preview.refresh": "Refresh",
|
|
8
174
|
"preview.loading": "Checking registered services…",
|
|
@@ -76,7 +242,6 @@ export const EN = {
|
|
|
76
242
|
"workbench.reviewExecution": "Review execution (not acceptance):",
|
|
77
243
|
"workbench.noEvidence": "No recorded review or integration checks yet. See the Leader summary and original results.",
|
|
78
244
|
"workbench.openEvidence": "View results, reviews, validation and files",
|
|
79
|
-
"settings.scope": "Browser preferences apply here immediately. Server settings are desired configuration, not proof that existing Sessions adopted them.",
|
|
80
245
|
"settings.browser": "This browser",
|
|
81
246
|
"settings.more": "Load more groups",
|
|
82
247
|
"settings.groups": "configuration groups",
|
|
@@ -606,7 +771,7 @@ export const EN = {
|
|
|
606
771
|
"conversation.linkedOmitted": "More linked inputs are available in the source records.",
|
|
607
772
|
"conversation.stop": "Stop this Turn",
|
|
608
773
|
"conversation.receipt": "Check original receipt",
|
|
609
|
-
"conversation.older": "
|
|
774
|
+
"conversation.older": "Load earlier messages",
|
|
610
775
|
"conversation.latest": "Latest / reconnect",
|
|
611
776
|
"conversation.current": "Current Session",
|
|
612
777
|
"conversation.previous": "Previous Session",
|
|
@@ -622,6 +787,19 @@ export const EN = {
|
|
|
622
787
|
"conversation.empty": "No public items on this page. Older pages may contain messages.",
|
|
623
788
|
"conversation.liveUnavailable": "Live reply observation unavailable; native history only",
|
|
624
789
|
"conversation.truncated": "Long item excerpt; open native access for the full item.",
|
|
790
|
+
"conversation.placeholder": "Message this Session…",
|
|
791
|
+
"conversation.more": "More",
|
|
792
|
+
"conversation.copy": "Copy",
|
|
793
|
+
"conversation.copied": "Copied",
|
|
794
|
+
"conversation.jump": "Jump to latest",
|
|
795
|
+
"conversation.selectModel": "Select model",
|
|
796
|
+
"conversation.worked": "Worked",
|
|
797
|
+
"conversation.activity.commandExecution": "Ran",
|
|
798
|
+
"conversation.activity.fileChange": "Edited files",
|
|
799
|
+
"conversation.activity.mcpToolCall": "Used tool",
|
|
800
|
+
"conversation.activity.dynamicToolCall": "Used tool",
|
|
801
|
+
"conversation.activity.webSearch": "Searched the web",
|
|
802
|
+
"conversation.activity.collabAgentToolCall": "Asked another agent",
|
|
625
803
|
"dock.swap": "Swap with task details",
|
|
626
804
|
"dock.hide": "Hide session panel",
|
|
627
805
|
"dock.resize": "Resize session panel",
|
|
@@ -1,6 +1,170 @@
|
|
|
1
1
|
// Simplified Chinese UI copy. Typed against the English catalog, so a key that
|
|
2
2
|
// does not exist in en.ts is a compile error; a missing key falls back to en.
|
|
3
3
|
export const ZH_CN = {
|
|
4
|
+
"models.subscriptionAuth": "官方订阅",
|
|
5
|
+
"models.account": "账号",
|
|
6
|
+
"models.providerReadOnlyHelp": "由来源服务管理,请在对应服务中修改配置。",
|
|
7
|
+
"models.readOnlyService": "只读接入,配置由运行中的服务管理。",
|
|
8
|
+
"models.window.5h": "5 小时",
|
|
9
|
+
"models.window.weekly": "每周",
|
|
10
|
+
"models.window.monthly": "每月",
|
|
11
|
+
"manage.nav": "主导航",
|
|
12
|
+
"manage.workbench": "工作台",
|
|
13
|
+
"settings.section.preferences": "偏好设置",
|
|
14
|
+
"settings.section.skills": "Skill",
|
|
15
|
+
"settings.section.server": "Agent 与服务",
|
|
16
|
+
"settings.hint.preferences": "本浏览器的主题、语言与工作台布局。修改立即在此生效,不会发送到服务端。",
|
|
17
|
+
"settings.hint.server": "Yui、Role、Agent 与 Profile 的期望配置。保存面向后续启动,不代表现有 Session 已采用。",
|
|
18
|
+
"models.title": "模型",
|
|
19
|
+
"models.scope": "管理 Yui 读取的 metabridge 与 CLIProxyAPI 连接。保存的配置需重新加载 metabridge 后才生效,本页不会执行推理。",
|
|
20
|
+
"models.section.providers": "接入管理",
|
|
21
|
+
"models.section.catalog": "模型目录",
|
|
22
|
+
"models.section.quota": "订阅额度",
|
|
23
|
+
"models.section.connection": "模型连接",
|
|
24
|
+
"models.openConnection": "前往模型连接",
|
|
25
|
+
"models.connectionGroup.bridge": "metabridge",
|
|
26
|
+
"models.connectionGroup.cpa": "CLIProxyAPI(额度)",
|
|
27
|
+
"models.unsavedDraft": "有未保存的修改",
|
|
28
|
+
"models.applicationTitle": "保存不等于生效",
|
|
29
|
+
"models.column.provider": "Provider",
|
|
30
|
+
"models.column.baseUrl": "基础 URL",
|
|
31
|
+
"models.column.prefix": "前缀",
|
|
32
|
+
"models.column.route": "路由",
|
|
33
|
+
"models.column.state": "状态",
|
|
34
|
+
"models.column.actions": "操作",
|
|
35
|
+
"models.providerCount": "显示 {shown} / {total} 个 Provider",
|
|
36
|
+
"models.noProviderMatches": "没有符合筛选条件的 Provider。",
|
|
37
|
+
"models.searchProviders": "搜索名称、ID、地址或前缀",
|
|
38
|
+
"models.searchCatalog": "搜索已加载的模型 ID",
|
|
39
|
+
"models.filter.route": "按路由筛选",
|
|
40
|
+
"models.filter.state": "按状态筛选",
|
|
41
|
+
"models.filter.source": "按来源筛选",
|
|
42
|
+
"models.filter.all": "全部",
|
|
43
|
+
"models.filter.enabled": "已启用",
|
|
44
|
+
"models.filter.disabled": "已停用",
|
|
45
|
+
"models.filter.readonly": "只读",
|
|
46
|
+
"models.catalogMatches": "匹配 {count}",
|
|
47
|
+
"models.noCatalogMatches": "已加载的模型中没有匹配项;加载更多页后可继续搜索。",
|
|
48
|
+
"models.resetUnknown": "重置时间未知",
|
|
49
|
+
"models.accountIdHelp": "由 Yui 根据上游账号生成的标识,不是账号名。",
|
|
50
|
+
"models.loading": "加载中…",
|
|
51
|
+
"models.loadFailed": "无法读取模型配置:",
|
|
52
|
+
"models.retry": "重试",
|
|
53
|
+
"models.unavailable": "读取成功前无法管理模型配置。",
|
|
54
|
+
"models.unknown": "未知",
|
|
55
|
+
"models.connected": "已配置连接",
|
|
56
|
+
"models.disconnected": "未连接",
|
|
57
|
+
"models.application.unverified": "未验证是否生效",
|
|
58
|
+
"models.applicationHelp": "此处保存只改变期望配置。需按现有部署流程重新加载 metabridge 才会生效;本页不会重启服务、改写 Codex 配置、切换 Session 或验证推理。",
|
|
59
|
+
"models.configurationError": "Bridge 配置问题:",
|
|
60
|
+
"models.unknownBlocked": "之前的一次保存结果未知,不会重发。请先读取当前事实再做修改。",
|
|
61
|
+
"models.readFacts": "读取当前事实",
|
|
62
|
+
"models.reconciledChanged": "已读取当前事实;配置在那次不确定的保存后已变化,请核对后再保存。",
|
|
63
|
+
"models.reconciledUnchanged": "已读取当前事实,暂未看到变化;之前的保存可能仍未落定,请核对后再保存。",
|
|
64
|
+
"models.agentSettings": "Agent 与模型选择仍在设置页中进行,不会自动导入模型。",
|
|
65
|
+
"models.openSettings": "打开设置",
|
|
66
|
+
"models.connection": "连接",
|
|
67
|
+
"models.connectionHelp": "路径指向本地文件;密钥由服务端读取,不会在此显示。断开连接不会停止服务,也不会删除凭据。",
|
|
68
|
+
"models.notConnected": "尚未配置连接,至少需要填写 metabridge URL。",
|
|
69
|
+
"models.connection.bridgeUrl": "metabridge URL(必填)",
|
|
70
|
+
"models.connection.bridgeUrlHelp": "metabridge 管理端点的基础 URL。",
|
|
71
|
+
"models.connection.bridgeConfigFile": "metabridge 配置文件",
|
|
72
|
+
"models.connection.bridgeConfigFileHelp": "可选。填写后可通过此本地文件管理 Provider。",
|
|
73
|
+
"models.connection.cpaUrl": "CLIProxyAPI URL",
|
|
74
|
+
"models.connection.cpaUrlHelp": "可选。与管理密钥文件一起用于刷新额度。",
|
|
75
|
+
"models.connection.managementKeyFile": "CPA 管理密钥文件",
|
|
76
|
+
"models.connection.managementKeyFileHelp": "保存管理密钥的私有文件路径。密钥本身不会返回。",
|
|
77
|
+
"models.connection.catalogKeyFile": "目录密钥文件",
|
|
78
|
+
"models.connection.catalogKeyFileHelp": "可选。与管理密钥相互独立。",
|
|
79
|
+
"models.saveConnection": "保存连接",
|
|
80
|
+
"models.disconnect": "断开连接",
|
|
81
|
+
"models.disconnectConfirm": "断开 Yui 与 metabridge 的连接?服务会继续运行,凭据不会被删除。",
|
|
82
|
+
"models.discard": "放弃修改",
|
|
83
|
+
"models.bridgeUrlRequired": "必须填写 metabridge URL。",
|
|
84
|
+
"models.providers": "Provider",
|
|
85
|
+
"models.providersHelp": "metabridge 中配置的 Provider。官方、订阅以及无前缀的共享路由为只读。",
|
|
86
|
+
"models.noProviders": "尚未配置 Provider。",
|
|
87
|
+
"models.addProvider": "添加 API Key Provider",
|
|
88
|
+
"models.configFileRequired": "需在连接中设置 metabridge 配置文件后才能管理 Provider。",
|
|
89
|
+
"models.newProvider": "新建 Provider",
|
|
90
|
+
"models.editProvider": "编辑",
|
|
91
|
+
"models.removeProvider": "移除",
|
|
92
|
+
"models.removeConfirm": "从 metabridge 移除此 Provider?其文件与凭据会保留。",
|
|
93
|
+
"models.discardProvider": "放弃正在编辑的 Provider?",
|
|
94
|
+
"models.readOnly": "只读",
|
|
95
|
+
"models.noPrefix": "无前缀",
|
|
96
|
+
"models.enabled": "已启用",
|
|
97
|
+
"models.disabled": "已停用",
|
|
98
|
+
"models.credentialStored": "已保存凭据",
|
|
99
|
+
"models.credentialMissing": "无凭据",
|
|
100
|
+
"models.via.direct": "直连",
|
|
101
|
+
"models.via.cpa": "经 CPA",
|
|
102
|
+
"models.via.unknown": "未知路由",
|
|
103
|
+
"models.provider.name": "名称",
|
|
104
|
+
"models.provider.via": "路由",
|
|
105
|
+
"models.provider.viaDirectHelp": "metabridge 使用此 Provider 的 API Key 直接调用。",
|
|
106
|
+
"models.provider.viaCpaHelp": "metabridge 调用 CLIProxyAPI。请使用 CPA 客户端推理密钥,而不是上游账号密钥或管理密钥。",
|
|
107
|
+
"models.provider.baseUrl": "基础 URL",
|
|
108
|
+
"models.provider.prefix": "模型前缀",
|
|
109
|
+
"models.provider.prefixHelp": "显式模型命名空间,以 / 结尾,如 mine/ 对应 mine/model:1–64 个字母、数字、_ 或 -,再加 /。",
|
|
110
|
+
"models.prefixInvalid": "前缀须为 1–64 个字母、数字、_ 或 -,并以 / 结尾,如 mine/。",
|
|
111
|
+
"models.provider.enabled": "启用",
|
|
112
|
+
"models.provider.apiKey": "API Key",
|
|
113
|
+
"models.provider.apiKeyCpa": "CPA 客户端推理密钥",
|
|
114
|
+
"models.provider.apiKeyNewHelp": "必填。仅在保存时发送一次并随即清空,之后不会再显示。",
|
|
115
|
+
"models.provider.apiKeyKeepHelp": "留空则保留已保存的凭据;填写新值会替换它。",
|
|
116
|
+
"models.provider.apiKeyMissingHelp": "尚未保存凭据,填写后即可设置。",
|
|
117
|
+
"models.apiKeyKeep": "保持不变",
|
|
118
|
+
"models.createProvider": "创建 Provider",
|
|
119
|
+
"models.saveProvider": "保存 Provider",
|
|
120
|
+
"models.cancel": "取消",
|
|
121
|
+
"models.providerNewRequired": "新建 Provider 需要名称、基础 URL、前缀和 API Key。",
|
|
122
|
+
"models.providerRequired": "需要名称、基础 URL,以及直连或 CPA 路由。",
|
|
123
|
+
"models.saving": "正在保存…",
|
|
124
|
+
"models.saved": "已保存。重新加载 metabridge 前不会生效。",
|
|
125
|
+
"models.rejected": "未保存,草稿已保留。若配置已变化,请读取当前事实后再保存。",
|
|
126
|
+
"models.rereadChanged": "已读取当前事实;配置已变化。草稿已保留,请对照新事实核对后再保存。",
|
|
127
|
+
"models.rereadUnchanged": "已读取当前事实;配置未变化。草稿已保留。",
|
|
128
|
+
"models.unknownWrite": "保存结果未知,不会重发。",
|
|
129
|
+
"models.catalog": "模型目录",
|
|
130
|
+
"models.catalogHelp": "metabridge 目录缓存。来源取自模型 ID 命名空间,不代表已证实的账号归属。",
|
|
131
|
+
"models.catalogFailed": "目录读取失败:",
|
|
132
|
+
"models.catalogNotQueried": "尚未查询目录。刷新以从 metabridge 读取。",
|
|
133
|
+
"models.catalogEmpty": "此次观测中没有模型。",
|
|
134
|
+
"models.catalogItemsUnknown": "未观测到模型;目录未知,并非为空。",
|
|
135
|
+
"models.catalogCount": "显示 {shown} / {total}",
|
|
136
|
+
"models.catalogChanged": "翻页期间目录已变化,已显示最新的第一页。",
|
|
137
|
+
"models.moreCatalog": "加载更多模型",
|
|
138
|
+
"models.refreshCatalog": "刷新目录",
|
|
139
|
+
"models.quota": "订阅额度",
|
|
140
|
+
"models.quotaHelp": "按账号查看订阅窗口与余额。手动刷新获取最新额度。",
|
|
141
|
+
"models.source": "来源",
|
|
142
|
+
"models.refreshQuota": "刷新额度",
|
|
143
|
+
"models.quotaNeedsCpa": "刷新额度需要 CPA URL 和管理密钥文件。",
|
|
144
|
+
"models.quotaUnavailable": "额度接口不可用,额度未知。这并不证明扩展未安装。",
|
|
145
|
+
"models.quotaFailed": "额度未知:",
|
|
146
|
+
"models.quotaNotQueried": "此来源尚未查询额度。",
|
|
147
|
+
"models.quotaUnsupported": "此来源不提供额度;额度未知,并非为零。",
|
|
148
|
+
"models.quotaEmpty": "此次观测中没有账号。",
|
|
149
|
+
"models.quotaItemsUnknown": "未观测到账号;额度未知,并非为空。",
|
|
150
|
+
"models.noWindows": "未报告额度窗口。",
|
|
151
|
+
"models.remaining": "剩余",
|
|
152
|
+
"models.used": "已用 / 上限",
|
|
153
|
+
"models.resets": "重置于",
|
|
154
|
+
"models.balance": "余额",
|
|
155
|
+
"models.balance.extra-usage-usd": "额外用量余额(美元)",
|
|
156
|
+
"models.balance.monthly-credits": "月度点数",
|
|
157
|
+
"models.balance.purchased-credits": "购买点数",
|
|
158
|
+
"models.balance.free-credits": "免费点数",
|
|
159
|
+
"models.periodEnd": "周期结束",
|
|
160
|
+
"models.status.not-queried": "未查询",
|
|
161
|
+
"models.status.success": "已观测",
|
|
162
|
+
"models.status.partial": "部分",
|
|
163
|
+
"models.status.failed": "失败",
|
|
164
|
+
"models.status.unsupported": "不支持",
|
|
165
|
+
"models.stale": "已过期",
|
|
166
|
+
"models.attempted": "尝试于",
|
|
167
|
+
"models.observed": "观测于",
|
|
4
168
|
"preview.title": "网页预览",
|
|
5
169
|
"preview.refresh": "刷新",
|
|
6
170
|
"preview.loading": "正在检查已登记服务…",
|
|
@@ -74,7 +238,6 @@ export const ZH_CN = {
|
|
|
74
238
|
"workbench.reviewExecution": "审查执行状态(不代表验收):",
|
|
75
239
|
"workbench.noEvidence": "尚无已记录的审查或集成检查;可查看 Leader 说明与原始成果。",
|
|
76
240
|
"workbench.openEvidence": "查看成果、审查、验证与文件",
|
|
77
|
-
"settings.scope": "浏览器偏好在此立即生效。服务端保存的是期望配置,不代表现有 Session 已采用。",
|
|
78
241
|
"settings.browser": "当前浏览器",
|
|
79
242
|
"settings.more": "加载更多配置组",
|
|
80
243
|
"settings.groups": "个配置组",
|
|
@@ -604,7 +767,7 @@ export const ZH_CN = {
|
|
|
604
767
|
"conversation.linkedOmitted": "更多关联输入可在来源记录中查看。",
|
|
605
768
|
"conversation.stop": "停止本轮",
|
|
606
769
|
"conversation.receipt": "查询原始回执",
|
|
607
|
-
"conversation.older": "
|
|
770
|
+
"conversation.older": "加载更早的消息",
|
|
608
771
|
"conversation.latest": "最新 / 重连",
|
|
609
772
|
"conversation.current": "当前会话",
|
|
610
773
|
"conversation.previous": "历史会话",
|
|
@@ -620,6 +783,19 @@ export const ZH_CN = {
|
|
|
620
783
|
"conversation.empty": "此页没有公开消息,可继续读取更早的历史。",
|
|
621
784
|
"conversation.liveUnavailable": "实时回复观测不可用,仅显示原生历史",
|
|
622
785
|
"conversation.truncated": "长消息仅显示摘要;完整内容请打开原生入口。",
|
|
786
|
+
"conversation.placeholder": "给当前会话发消息…",
|
|
787
|
+
"conversation.more": "更多",
|
|
788
|
+
"conversation.copy": "复制",
|
|
789
|
+
"conversation.copied": "已复制",
|
|
790
|
+
"conversation.jump": "回到最新",
|
|
791
|
+
"conversation.selectModel": "选择模型",
|
|
792
|
+
"conversation.worked": "已处理",
|
|
793
|
+
"conversation.activity.commandExecution": "运行",
|
|
794
|
+
"conversation.activity.fileChange": "修改文件",
|
|
795
|
+
"conversation.activity.mcpToolCall": "调用工具",
|
|
796
|
+
"conversation.activity.dynamicToolCall": "调用工具",
|
|
797
|
+
"conversation.activity.webSearch": "联网搜索",
|
|
798
|
+
"conversation.activity.collabAgentToolCall": "询问其他 Agent",
|
|
623
799
|
"dock.swap": "与任务详情交换位置",
|
|
624
800
|
"dock.hide": "隐藏会话面板",
|
|
625
801
|
"dock.resize": "调整会话面板宽度",
|
|
@@ -60,9 +60,14 @@ import { SELECTION_SCRIPT } from "./app/selection.js";
|
|
|
60
60
|
import { TASK_VIEW_SCRIPT } from "./app/taskView.js";
|
|
61
61
|
import { SETTINGS_SCRIPT } from "./app/settings.js";
|
|
62
62
|
import { SKILLS_SCRIPT } from "./views/skills.js";
|
|
63
|
+
import { MODELS_VIEW_SCRIPT } from "./views/models.js";
|
|
64
|
+
import { MODELS_SCRIPT } from "./app/models.js";
|
|
65
|
+
import { MANAGE_SHELL_SCRIPT } from "./layout/manageShell.js";
|
|
66
|
+
import { MANAGE_SCRIPT } from "./app/manage.js";
|
|
63
67
|
export { APP_SCRIPT } from "./app/main.js";
|
|
64
68
|
export const CLIENT_MODULES = Object.freeze({
|
|
65
69
|
"views/skills": SKILLS_SCRIPT,
|
|
70
|
+
"views/models": MODELS_VIEW_SCRIPT,
|
|
66
71
|
"lib/dom": DOM_SCRIPT,
|
|
67
72
|
"lib/format": FORMAT_SCRIPT,
|
|
68
73
|
"lib/prefs": PREFS_SCRIPT,
|
|
@@ -107,8 +112,11 @@ export const CLIENT_MODULES = Object.freeze({
|
|
|
107
112
|
"layout/workspace": WORKSPACE_SCRIPT,
|
|
108
113
|
"layout/router": ROUTER_SCRIPT,
|
|
109
114
|
"layout/shortcuts": SHORTCUTS_SCRIPT,
|
|
115
|
+
"layout/manageShell": MANAGE_SHELL_SCRIPT,
|
|
110
116
|
"app/catalog": CATALOG_SCRIPT,
|
|
111
117
|
"app/taskView": TASK_VIEW_SCRIPT,
|
|
112
118
|
"app/settings": SETTINGS_SCRIPT,
|
|
119
|
+
"app/manage": MANAGE_SCRIPT,
|
|
120
|
+
"app/models": MODELS_SCRIPT,
|
|
113
121
|
"app/selection": SELECTION_SCRIPT
|
|
114
122
|
});
|