FN-6745: add xhigh thinking level support

Adds the xhigh reasoning option across settings, task flows, APIs, and model adapter tests.

- Extend the shared thinking-level enum, validation paths, generated resource types, and settings documentation for `xhigh`.
- Surface `xhigh` in task, agent, and global model selectors with localized labels.
- Cover task route handling, task form rendering, and Pi adapter mapping behavior with regression tests.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/fn-6745-xhigh-thinking-level.md         |   5 +
 docs/settings-reference.md                         |   2 +-
 .../core/src/__tests__/thinking-levels.test.ts     |   9 ++
 packages/core/src/types.ts                         |  10 +-
 packages/dashboard/app/api/legacy.ts               |   6 +-
 .../dashboard/app/components/AgentDetailView.tsx   |   2 +-
 .../dashboard/app/components/ModelSelectorTab.tsx  |   1 +
 .../dashboard/app/components/NewAgentDialog.tsx    |   3 +-
 packages/dashboard/app/components/NewTaskModal.tsx |   2 +-
 .../dashboard/app/components/TaskDetailModal.tsx   |   2 +-
 packages/dashboard/app/components/TaskForm.tsx     |   2 +
 .../app/components/__tests__/TaskForm.test.tsx     |  14 +++
 .../settings/sections/GlobalModelsSection.tsx      |   1 +
 .../src/__tests__/routes-tasks-ops.test.ts         |   8 +-
 .../dashboard/src/__tests__/routes-tasks.test.ts   |   8 +-
 packages/dashboard/src/agent-generation.ts         |   4 +-
 packages/dashboard/src/agent-onboarding.ts         |   4 +-
 .../src/routes/register-task-workflow-routes.ts    |   5 +-
 packages/engine/src/__tests__/pi.test.ts           |  25 ++++
 packages/i18n/locales/en/app.json                  |   3 +
 packages/i18n/locales/es/app.json                  |   3 +
 packages/i18n/locales/fr/app.json                  |   3 +
 packages/i18n/locales/ko/app.json                  |   3 +
 packages/i18n/locales/zh-CN/app.json               |   3 +
 packages/i18n/locales/zh-TW/app.json               |   3 +
 packages/i18n/src/resources.d.ts                   | 126 ++++++++++++++++++++-
 26 files changed, 229 insertions(+), 28 deletions(-)

Fusion-Task-Id: FN-6745

Fusion-Task-Lineage: 779e1517-607b-482b-83a1-0f2bb94ae736
This commit is contained in:
gsxdsm
2026-06-19 15:27:19 -07:00
parent 8d2b396e85
commit c158dda8a6
26 changed files with 229 additions and 28 deletions

View File

@@ -0,0 +1,5 @@
---
"@runfusion/fusion": minor
---
Add the `xhigh` reasoning effort level to model settings and task/agent selectors. Claude CLI adapters pass the value through to runtime mapping, where non-Opus models use `high` effort and Opus models use `max` effort.

View File

@@ -39,7 +39,7 @@ Defaults from `DEFAULT_GLOBAL_SETTINGS`; key scope from `GLOBAL_SETTINGS_KEYS`.
| `defaultModelId` | `string` | `undefined` | Default AI model ID. |
| `fallbackProvider` | `string` | `undefined` | Fallback provider when the primary default model hits transient provider failures or model-compatibility/auth-tier rejections. |
| `fallbackModelId` | `string` | `undefined` | Fallback model ID (must pair with `fallbackProvider`). |
| `defaultThinkingLevel` | `"off" \| "minimal" \| "low" \| "medium" \| "high"` | `undefined` | Default reasoning effort for AI sessions. If a provider/runtime rejects simultaneous `thinking` and `reasoning_effort` parameters, Fusion retries without the explicit thinking override instead of failing the run. |
| `defaultThinkingLevel` | `"off" \| "minimal" \| "low" \| "medium" \| "high" \| "xhigh"` | `undefined` | Default reasoning effort for AI sessions. `xhigh` requests maximum reasoning effort; Claude CLI adapters map it to `high` for non-Opus models and `max` for Opus models. If a provider/runtime rejects simultaneous `thinking` and `reasoning_effort` parameters, Fusion retries without the explicit thinking override instead of failing the run. |
| `ntfyEnabled` | `boolean` | `false` | Enable ntfy push notifications. |
| `failureNotificationMode` | `"sticky-only" \| "terminal-only" \| "all"` | `"sticky-only"` | Failure notification behavior. `sticky-only` defers failed-task notifications by `failureNotificationDelayMs` and suppresses transient self-recoveries. `terminal-only` suppresses while auto-retry is still active and only dispatches when `paused === true` or `column === "in-review"` with `status === "failed"`. `all` restores legacy immediate failure notifications. |
| `failureNotificationDelayMs` | `number` | `30000` | Delay window (ms) before evaluating/sending a `failed` notification in `sticky-only` and `terminal-only` modes. Set `0` for immediate dispatch in legacy `all` mode. |

View File

@@ -0,0 +1,9 @@
import { describe, expect, it } from "vitest";
import { THINKING_LEVELS } from "../types.js";
describe("THINKING_LEVELS", () => {
it("includes xhigh after high for maximum reasoning effort", () => {
expect(THINKING_LEVELS).toEqual(["off", "minimal", "low", "medium", "high", "xhigh"]);
});
});

View File

@@ -11,8 +11,14 @@ export {
} from "./capacity.js";
export type { CapacityRiskSignal } from "./capacity.js";
/** Valid thinking effort levels for AI agent sessions, controlling the cost/quality tradeoff of reasoning. */
export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high"] as const;
/**
* Valid thinking effort levels for AI agent sessions, controlling the cost/quality tradeoff of reasoning.
* Includes extra-high for maximum-effort requests on reasoning-capable models.
*
* FNXC:Settings-ThinkingLevel 2026-06-19-14:55:
* The central thinking-level enum must expose `xhigh` so UI settings and API validation can pass maximum reasoning requests through to CLI adapters. Runtime adapters map `xhigh` to `high` for non-Opus models and `max` for Opus models.
*/
export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"] as const;
export type ThinkingLevel = (typeof THINKING_LEVELS)[number];
/**

View File

@@ -3411,7 +3411,7 @@ export interface AgentOnboardingSummary {
name: string;
role: AgentCapability | "custom";
instructionsText: string;
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high";
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
maxTurns: number;
title?: string;
icon?: string;
@@ -3444,7 +3444,7 @@ export interface ExistingAgentOnboardingConfig {
reportsTo?: string;
skills?: string[];
model?: string;
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high";
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
maxTurns?: number;
runtimeHint?: string;
heartbeatIntervalMs?: number;
@@ -6352,7 +6352,7 @@ export interface AgentGenerationSpec {
/** Detailed system prompt in markdown */
systemPrompt: string;
/** Suggested thinking level */
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high";
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
/** Suggested max turns (1-500) */
maxTurns: number;
}

View File

@@ -3776,7 +3776,7 @@ function ConfigTab({
skills: selectedSkills,
model: modelValue || undefined,
runtimeHint: runtimeMode === "runtime" ? selectedRuntimeId || undefined : undefined,
thinkingLevel: (formValues.thinkingLevel as "off" | "minimal" | "low" | "medium" | "high" | undefined) ?? undefined,
thinkingLevel: (formValues.thinkingLevel as "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | undefined) ?? undefined,
maxTurns: formValues.maxTurns ? Number(formValues.maxTurns) : undefined,
heartbeatIntervalMs: heartbeatValues.heartbeatIntervalMs ? Number(heartbeatValues.heartbeatIntervalMs) * 1000 : undefined,
heartbeatTimeoutMs: heartbeatValues.heartbeatTimeoutMs ? Number(heartbeatValues.heartbeatTimeoutMs) * 1000 : undefined,

View File

@@ -499,6 +499,7 @@ export function ModelSelectorTab({ task, addToast, onTaskUpdated, settings }: Mo
<option value="low">{t("models.options.low", "Low")}</option>
<option value="medium">{t("models.options.medium", "Medium")}</option>
<option value="high">{t("models.options.high", "High")}</option>
<option value="xhigh">{t("models.options.xhigh", "Very High")}</option>
</select>
<small>{t("models.descriptions.thinkingLevel", "Controls the reasoning effort for the AI agent. Higher levels use more tokens.")}</small>
</div>

View File

@@ -35,7 +35,7 @@ const AGENT_ROLES: { value: AgentCapability; icon: string }[] = [
{ value: "custom", icon: "✦" },
];
type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high";
type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
/** Set of valid AgentCapability values for mapping generated roles */
const VALID_CAPABILITIES = new Set<string>(["triage", "executor", "reviewer", "merger", "scheduler", "engineer", "custom"]);
@@ -682,6 +682,7 @@ export function NewAgentDialog({
<option value="low">{t("agents.thinkingLow", "Low")}</option>
<option value="medium">{t("agents.thinkingMedium", "Medium")}</option>
<option value="high">{t("agents.thinkingHigh", "High")}</option>
<option value="xhigh">{t("agents.thinkingXhigh", "Very High")}</option>
</select>
</div>
<div className="agent-dialog-field">

View File

@@ -249,7 +249,7 @@ export function NewTaskModal({ isOpen, onClose, projectId, tasks, onCreateTask,
validatorModelId: validatorModel && validatorSlashIdx !== -1 ? validatorModel.slice(validatorSlashIdx + 1) : undefined,
planningModelProvider: planningModel && planningSlashIdx !== -1 ? planningModel.slice(0, planningSlashIdx) : undefined,
planningModelId: planningModel && planningSlashIdx !== -1 ? planningModel.slice(planningSlashIdx + 1) : undefined,
thinkingLevel: thinkingLevel !== "" ? thinkingLevel as "minimal" | "low" | "medium" | "high" : undefined,
thinkingLevel: thinkingLevel !== "" ? thinkingLevel as "minimal" | "low" | "medium" | "high" | "xhigh" : undefined,
reviewLevel,
...(autoMerge !== undefined ? { autoMerge } : {}),
priority,

View File

@@ -1527,7 +1527,7 @@ export function TaskDetailContent({
}
const currentThinkingLevel = task.thinkingLevel ?? "";
if (editThinkingLevel !== currentThinkingLevel) updates.thinkingLevel = editThinkingLevel !== "" ? (editThinkingLevel as "minimal" | "low" | "medium" | "high") : null;
if (editThinkingLevel !== currentThinkingLevel) updates.thinkingLevel = editThinkingLevel !== "" ? (editThinkingLevel as "minimal" | "low" | "medium" | "high" | "xhigh") : null;
if ((task.nodeId ?? undefined) !== editNodeId) updates.nodeId = editNodeId ?? null;
if (editReviewLevel !== task.reviewLevel) updates.reviewLevel = editReviewLevel;
if (editPriority !== normalizeTaskPriorityValue(task.priority)) updates.priority = editPriority;

View File

@@ -1221,6 +1221,7 @@ export function TaskForm({
)}
{onThinkingLevelChange && (
<div className="model-select-row">
{/* FNXC:Settings-ThinkingLevel 2026-06-19-14:55: The shared task thinking selector must expose `xhigh` so new-task and task-detail edits can request maximum reasoning effort instead of being capped at `high`. */}
<label htmlFor="thinking-level" className="model-select-label">{t("taskForm.thinkingLabel", "Thinking")}</label>
<select
id="thinking-level"
@@ -1234,6 +1235,7 @@ export function TaskForm({
<option value="low">{t("taskForm.thinkingLow", "Low")}</option>
<option value="medium">{t("taskForm.thinkingMedium", "Medium")}</option>
<option value="high">{t("taskForm.thinkingHigh", "High")}</option>
<option value="xhigh">{t("taskForm.thinkingXhigh", "Very High")}</option>
</select>
</div>
)}

View File

@@ -133,6 +133,20 @@ describe("TaskForm", () => {
vi.mocked(fetchGitBranches).mockResolvedValue([]);
});
it("renders xhigh in the shared thinking-level selector", async () => {
renderTaskForm({
thinkingLevel: "",
onThinkingLevelChange: vi.fn(),
});
fireEvent.click(screen.getByRole("button", { name: /More options/i }));
await waitFor(() => {
expect(screen.getByRole("combobox", { name: /Thinking/i })).toBeTruthy();
});
expect(screen.getByRole("option", { name: /Very High/i })).toHaveAttribute("value", "xhigh");
});
it("renders description field with AI refine button when text is present", () => {
renderTaskForm({ description: "Some text" });

View File

@@ -132,6 +132,7 @@ export function GlobalModelsSection({
if (selectedModel && !selectedModel.reasoning) return null;
return (
<div className="form-group">
{/* FNXC:Settings-ThinkingLevel 2026-06-19-14:55: This global selector renders the canonical THINKING_LEVELS list so newly added `xhigh` stays available anywhere the default reasoning effort is configured. */}
<label htmlFor="defaultThinkingLevel">Thinking Effort</label>
<select
id="defaultThinkingLevel"

View File

@@ -3052,21 +3052,21 @@ describe("PATCH /tasks/:id", () => {
expect(res.body.error).toContain("enabledWorkflowSteps must be an array of strings");
});
it("forwards thinkingLevel to store.updateTask", async () => {
it("forwards xhigh thinkingLevel to store.updateTask", async () => {
(store.updateTask as ReturnType<typeof vi.fn>).mockResolvedValue({
...FAKE_TASK_DETAIL,
thinkingLevel: "high",
thinkingLevel: "xhigh",
});
const res = await REQUEST(buildApp(), "PATCH", "/api/tasks/KB-001", JSON.stringify({
thinkingLevel: "high",
thinkingLevel: "xhigh",
}), {
"Content-Type": "application/json",
});
expect(res.status).toBe(200);
expect(store.updateTask).toHaveBeenCalledWith("KB-001", {
thinkingLevel: "high",
thinkingLevel: "xhigh",
});
});

View File

@@ -1220,11 +1220,11 @@ describe("POST /tasks", () => {
expect(store.createTask).not.toHaveBeenCalled();
});
it("forwards thinkingLevel when provided", async () => {
it("forwards xhigh thinkingLevel when provided", async () => {
const createdTask = {
...FAKE_TASK_DETAIL,
column: "triage",
thinkingLevel: "high",
thinkingLevel: "xhigh",
};
(store.createTask as ReturnType<typeof vi.fn>).mockResolvedValue(createdTask);
@@ -1234,7 +1234,7 @@ describe("POST /tasks", () => {
"/api/tasks",
JSON.stringify({
description: "Deep reasoning task",
thinkingLevel: "high",
thinkingLevel: "xhigh",
}),
{ "Content-Type": "application/json" },
);
@@ -1243,7 +1243,7 @@ describe("POST /tasks", () => {
expect(store.createTask).toHaveBeenCalledWith(
expect.objectContaining({
description: "Deep reasoning task",
thinkingLevel: "high",
thinkingLevel: "xhigh",
}),
expect.objectContaining({
settings: { autoSummarizeTitles: undefined },

View File

@@ -132,7 +132,7 @@ export interface AgentGenerationSpec {
/** Detailed system prompt in markdown */
systemPrompt: string;
/** Suggested thinking level */
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high";
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
/** Suggested max turns (1-500) */
maxTurns: number;
}
@@ -400,7 +400,7 @@ export function parseGenerationResponse(text: string): AgentGenerationSpec {
role: typeof obj.role === "string" ? obj.role : "custom",
description: typeof obj.description === "string" ? obj.description : "",
systemPrompt: typeof obj.systemPrompt === "string" ? obj.systemPrompt : "",
thinkingLevel: ["off", "minimal", "low", "medium", "high"].includes(obj.thinkingLevel as string)
thinkingLevel: ["off", "minimal", "low", "medium", "high", "xhigh"].includes(obj.thinkingLevel as string)
? (obj.thinkingLevel as AgentGenerationSpec["thinkingLevel"])
: "off",
maxTurns: typeof obj.maxTurns === "number"

View File

@@ -9,7 +9,7 @@ export interface AgentOnboardingSummary {
name: string;
role: AgentCapability | "custom";
instructionsText: string;
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high";
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
maxTurns: number;
title?: string;
icon?: string;
@@ -42,7 +42,7 @@ export interface ExistingAgentOnboardingConfig {
reportsTo?: string;
skills?: string[];
model?: string;
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high";
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
maxTurns?: number;
runtimeHint?: string;
heartbeatIntervalMs?: number;

View File

@@ -15,6 +15,7 @@ import type {
} from "@fusion/core";
import {
COLUMNS,
THINKING_LEVELS,
TASK_PRIORITIES,
VALID_TRANSITIONS,
computeContentFingerprint,
@@ -922,7 +923,7 @@ export function registerTaskWorkflowRoutes(ctx: ApiRoutesContext, deps: TaskWork
const validatedPlanningModelId = validateOptionalModelField(planningModelId, "planningModelId");
// Validate thinkingLevel if provided
const validThinkingLevels = ["off", "minimal", "low", "medium", "high"];
const validThinkingLevels = [...THINKING_LEVELS];
if (thinkingLevel !== undefined && thinkingLevel !== null && !validThinkingLevels.includes(thinkingLevel)) {
throw badRequest(`thinkingLevel must be one of: ${validThinkingLevels.join(", ")}`);
}
@@ -2922,7 +2923,7 @@ export function registerTaskWorkflowRoutes(ctx: ApiRoutesContext, deps: TaskWork
const validatedAssigneeUserId = validateModelField(assigneeUserId, "assigneeUserId");
// Validate thinkingLevel if provided
const validThinkingLevels = ["off", "minimal", "low", "medium", "high"];
const validThinkingLevels = [...THINKING_LEVELS];
if (thinkingLevel !== undefined && thinkingLevel !== null && !validThinkingLevels.includes(thinkingLevel)) {
throw new Error(`thinkingLevel must be one of: ${validThinkingLevels.join(", ")}`);
}

View File

@@ -689,6 +689,31 @@ describe("session failure diagnostics", () => {
warnSpy.mockRestore();
});
it("passes xhigh through to sessions without engine-side narrowing", async () => {
const createAgentSessionMock = vi.mocked(createAgentSession);
const sessionWithThinking = {
model: { provider: "test", id: "primary-model" },
prompt: vi.fn(),
subscribe: vi.fn(),
dispose: vi.fn(),
setThinkingLevel: vi.fn(),
sessionFile: undefined,
} as unknown as AgentSession;
createAgentSessionMock.mockReset();
createAgentSessionMock.mockResolvedValueOnce({ session: sessionWithThinking } as any);
await createFnAgent({
cwd: "/test/project",
systemPrompt: "Test xhigh thinking pass-through",
defaultProvider: "test",
defaultModelId: "primary-model",
defaultThinkingLevel: "xhigh",
});
expect(sessionWithThinking.setThinkingLevel).toHaveBeenCalledWith("xhigh");
});
it("retries prompt on thinking/reasoning conflict without switching fallback models", async () => {
const createAgentSessionMock = vi.mocked(createAgentSession);

View File

@@ -1034,6 +1034,7 @@
"templateCompact": "Compact",
"templateDefault": "Default",
"thinkingHigh": "High",
"thinkingXhigh": "Very High",
"thinkingLevel": "Thinking level",
"thinkingLow": "Low",
"thinkingMedium": "Medium",
@@ -3415,6 +3416,7 @@
"options": {
"default": "Default",
"high": "High",
"xhigh": "Very High",
"low": "Low",
"medium": "Medium",
"minimal": "Minimal",
@@ -6310,6 +6312,7 @@
"subtaskButton": "Subtask",
"thinkingDefault": "Default ({{level}})",
"thinkingHigh": "High",
"thinkingXhigh": "Very High",
"thinkingLabel": "Thinking",
"thinkingLow": "Low",
"thinkingMedium": "Medium",

View File

@@ -1034,6 +1034,7 @@
"templateCompact": "Compacto",
"templateDefault": "Predeterminado",
"thinkingHigh": "Alto",
"thinkingXhigh": "Muy alto",
"thinkingLevel": "Nivel de pensamiento",
"thinkingLow": "Bajo",
"thinkingMedium": "Medio",
@@ -3389,6 +3390,7 @@
"options": {
"default": "Predeterminado",
"high": "Alto",
"xhigh": "Muy alto",
"low": "Bajo",
"medium": "Medio",
"minimal": "Mínimo",
@@ -6211,6 +6213,7 @@
"subtaskButton": "Subtarea",
"thinkingDefault": "Predeterminado ({{level}})",
"thinkingHigh": "Alto",
"thinkingXhigh": "Muy alto",
"thinkingLabel": "Pensamiento",
"thinkingLow": "Bajo",
"thinkingMedium": "Medio",

View File

@@ -1034,6 +1034,7 @@
"templateCompact": "Compact",
"templateDefault": "Défaut",
"thinkingHigh": "Élevé",
"thinkingXhigh": "Très élevé",
"thinkingLevel": "Niveau de réflexion",
"thinkingLow": "Faible",
"thinkingMedium": "Moyen",
@@ -3389,6 +3390,7 @@
"options": {
"default": "Défaut",
"high": "Élevé",
"xhigh": "Très élevé",
"low": "Faible",
"medium": "Moyen",
"minimal": "Minimal",
@@ -6211,6 +6213,7 @@
"subtaskButton": "Sous-tâche",
"thinkingDefault": "Défaut ({{level}})",
"thinkingHigh": "Élevé",
"thinkingXhigh": "Très élevé",
"thinkingLabel": "Réflexion",
"thinkingLow": "Faible",
"thinkingMedium": "Moyen",

View File

@@ -1007,6 +1007,7 @@
"templateCompact": "간결",
"templateDefault": "기본",
"thinkingHigh": "높음",
"thinkingXhigh": "매우 높음",
"thinkingLevel": "사고 수준",
"thinkingLow": "낮음",
"thinkingMedium": "보통",
@@ -3388,6 +3389,7 @@
"options": {
"default": "기본값",
"high": "높음",
"xhigh": "매우 높음",
"low": "낮음",
"medium": "중간",
"minimal": "최소",
@@ -6210,6 +6212,7 @@
"subtaskButton": "하위 작업",
"thinkingDefault": "기본값 ({{level}})",
"thinkingHigh": "높음",
"thinkingXhigh": "매우 높음",
"thinkingLabel": "사고",
"thinkingLow": "낮음",
"thinkingMedium": "중간",

View File

@@ -1007,6 +1007,7 @@
"templateCompact": "紧凑",
"templateDefault": "默认",
"thinkingHigh": "高",
"thinkingXhigh": "极高",
"thinkingLevel": "思考级别",
"thinkingLow": "低",
"thinkingMedium": "中",
@@ -3388,6 +3389,7 @@
"options": {
"default": "默认值",
"high": "高",
"xhigh": "极高",
"low": "低",
"medium": "中等",
"minimal": "最小",
@@ -6210,6 +6212,7 @@
"subtaskButton": "子任务",
"thinkingDefault": "默认({{level}})",
"thinkingHigh": "高",
"thinkingXhigh": "极高",
"thinkingLabel": "思考",
"thinkingLow": "低",
"thinkingMedium": "中",

View File

@@ -1007,6 +1007,7 @@
"templateCompact": "緊湊",
"templateDefault": "預設",
"thinkingHigh": "高",
"thinkingXhigh": "極高",
"thinkingLevel": "思考級別",
"thinkingLow": "低",
"thinkingMedium": "中",
@@ -3388,6 +3389,7 @@
"options": {
"default": "預設值",
"high": "高",
"xhigh": "極高",
"low": "低",
"medium": "中等",
"minimal": "最小",
@@ -6210,6 +6212,7 @@
"subtaskButton": "子任務",
"thinkingDefault": "預設({{level}})",
"thinkingHigh": "高",
"thinkingXhigh": "極高",
"thinkingLabel": "思考",
"thinkingLow": "低",
"thinkingMedium": "中",

View File

@@ -1041,6 +1041,7 @@ export default interface Resources {
"thinkingMedium": "Medium",
"thinkingMinimal": "Minimal",
"thinkingOff": "Off",
"thinkingXhigh": "Very High",
"throughput": "Throughput",
"title": "Agents",
"titleLabel": "Title",
@@ -1197,7 +1198,6 @@ export default interface Resources {
"cancelButton": "Cancel",
"clearConversationFailed": "Failed to clear conversation",
"closeQuickChat": "Close quick chat",
"workingStatus": "Working…",
"conversationArchived": "Conversation archived",
"conversationDeleted": "Conversation deleted",
"copyFailed": "Copy failed",
@@ -1252,6 +1252,16 @@ export default interface Resources {
"noSkillsAvailable": "No skills available",
"noSkillsFound": "No skills found",
"openQuickChat": "Open quick chat",
"questionAnsweredLabel": "Answered",
"questionAnsweredWithoutContent": "A later user reply answered this question.",
"questionConfirmNo": "No",
"questionConfirmYes": "Yes",
"questionResponseEyebrow": "Assistant question",
"questionResponseLabel": "Question from assistant",
"questionSelectHint": "Answer all questions to continue the chat.",
"questionSubmit": "Send answer",
"questionSubmittedAnswerLabel": "Submitted answer",
"questionTextPlaceholder": "Type your answer here…",
"queuedMessage": "Queued: {{preview}}",
"quickChatTitle": "Quick Chat",
"relativeTimeDays_one": "{{count}}d ago",
@@ -1307,6 +1317,7 @@ export default interface Resources {
"typeMessage": "Type a message...",
"unreadMessages": "Unread messages",
"untitledSession": "Untitled",
"workingStatus": "Working…",
"you": "You"
},
"chatRooms": {
@@ -1434,6 +1445,91 @@ export default interface Resources {
"stoppedTasks_one": "Stopped {{count}} task{{plural}}",
"stoppedTasks_other": "Stopped {{count}} task{{plural}}"
},
"commandCenter": {
"areaPending": "This area renders once metrics data is available.",
"controls": {
"concurrency": {
"description": "Tune live scheduler capacity.",
"error": "Unable to load concurrency settings",
"maxConcurrent": "Max concurrent tasks",
"maxTriageConcurrent": "Max triage concurrent",
"maxWorktrees": "Max worktrees",
"title": "Concurrency"
},
"engine": {
"description": "Stopping the engine halts all AI work.",
"title": "AI engine"
},
"heartbeat": {
"description": "Pause or resume the scheduling heartbeat.",
"disabledByStop": "Start the AI engine before resuming the heartbeat.",
"pause": "Pause heartbeat",
"resume": "Resume heartbeat",
"title": "Heartbeat control"
},
"orgChart": {
"description": "Read-only view of the running agent hierarchy.",
"empty": "No agents are reporting in yet.",
"error": "Unable to load org chart",
"loading": "Loading org chart…",
"title": "Agent org chart"
},
"status": {
"error": "Unable to load live scheduler status",
"lastActivity": "Last activity",
"loading": "Loading…",
"maxConcurrent": "Max concurrent",
"noActivity": "No recent activity",
"paused": "Paused",
"ready": "Ready",
"running": "Running",
"saveError": "Save failed",
"saved": "Saved",
"saving": "Saving…",
"stopped": "Stopped"
},
"theme": {
"description": "Switch the dashboard theme with live color previews.",
"title": "Theme"
},
"title": "Operator controls"
},
"empty": "No usage data yet. Run some agents to populate the Command Center.",
"heading": "Command Center",
"loading": "Loading command center...",
"overview": {
"activeNodes": "Active nodes",
"autonomy": "Autonomy ratio",
"liveStrip": "Live activity",
"liveStripPending": "Live Mission Control loads with active sessions.",
"openSignals": "Open signals",
"tasksDone": "Tasks done",
"tokensCost": "Tokens & cost",
"uniqueModels": "Unique models"
},
"range": {
"allTime": "All time",
"custom": "Custom range",
"dialogLabel": "Select date range",
"from": "From",
"invalidRange": "Start date must be on or before end date",
"last24h": "Last 24h",
"last30d": "Last 30 days",
"last7d": "Last 7 days",
"to": "To"
},
"tablistLabel": "Command Center sections",
"tabs": {
"activity": "Activity",
"ecosystem": "Ecosystem",
"missionControl": "Mission Control",
"overview": "Overview",
"productivity": "Productivity",
"reliability": "Reliability",
"tokens": "Tokens",
"tools": "Tools"
}
},
"comments": {
"addButton": "Add Comment",
"addedSuccess": "Comment added",
@@ -2412,6 +2508,7 @@ export default interface Resources {
"browseFiles": "Browse Files",
"chatView": "Chat view",
"closeSearch": "Close search",
"commandCenterView": "Command Center",
"createTaskWithPlanning": "Create a task with AI planning",
"devServerView": "Dev Server",
"documentsView": "Documents view",
@@ -3433,7 +3530,8 @@ export default interface Resources {
"low": "Low",
"medium": "Medium",
"minimal": "Minimal",
"off": "Off"
"off": "Off",
"xhigh": "Very High"
},
"placeholders": {
"selectExecutor": "Select executor model…",
@@ -3458,6 +3556,7 @@ export default interface Resources {
"automation": "Automation",
"chat": "Chat",
"chatUnreadAriaLabel": "Unread chat response",
"commandCenter": "Command Center",
"devServer": "Dev Server",
"documents": "Documents",
"evals": "Evals",
@@ -4910,6 +5009,17 @@ export default interface Resources {
"title": "Secrets",
"valueLabel": "Value"
},
"selectionComment": {
"addComment": "Add comment",
"addCommentAria": "Add a comment to the selected text and send it to a new task",
"cancel": "Cancel",
"commentAria": "Comment for the new task",
"commentPlaceholder": "Describe the task this snippet should become…",
"dialogAria": "Comment on selected text",
"selectedSnippet": "Selected snippet",
"sendToNewTask": "Send to new task",
"title": "Comment on selection"
},
"sessionBanner": {
"cli": {
"advance": "Advance",
@@ -5632,8 +5742,8 @@ export default interface Resources {
"takeControl": "Take Control",
"takingControl": "Taking control...",
"titleLabel": "Title",
"waitingForThinking": "Waiting for AI progress updates...",
"untitled": "Untitled"
"untitled": "Untitled",
"waitingForThinking": "Waiting for AI progress updates..."
},
"syncLog": {
"entryCount_one": "{{count}} entry",
@@ -6315,6 +6425,7 @@ export default interface Resources {
"thinkingMedium": "Medium",
"thinkingMinimal": "Minimal",
"thinkingOff": "Off",
"thinkingXhigh": "Very High",
"titleLabel": "Title",
"titlePlaceholder": "Task title",
"useDropdown": "Use dropdown",
@@ -6916,6 +7027,7 @@ export default interface Resources {
"cycleBlocked": "That connection would create a cycle — only rework edges inside a for-each template may loop back",
"deleteEdge": "Delete edge",
"deleteNode": "Delete node",
"duplicateBlocked": "That connection already exists",
"edgeCondition": "Condition",
"edgeConditionLabel": "Condition: {{condition}}",
"edgeInspector": "Edge",
@@ -6945,6 +7057,9 @@ export default interface Resources {
"joinMode": "Join mode",
"joinQuorum": "Quorum (n)",
"mergeBoundaryNote": "Steps before this marker run pre-merge; steps after run post-merge.",
"mobileConnect": "Connect",
"mobileConnectChooseTarget": "Choose a target…",
"mobileConnectTarget": "Target node",
"parseArtifact": "Artifact",
"parseParser": "Parser",
"quorumN": "Quorum count (n)",
@@ -6960,6 +7075,9 @@ export default interface Resources {
"reviewPlan": "Plan review",
"reviewType": "Review type",
"splitNote": "Branches run concurrently from this node. Execute and merge seams are not allowed inside a branch.",
"startEntryColumn": "Entry column",
"startEntryColumnAuto": "— Auto (first column)",
"startNote": "The start node marks where a task enters the workflow.",
"stepExecuteLabel": "Step execute",
"summaryAwaitInput": "Waits for user input",
"summaryCodeDefault": "TypeScript",