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:
5
.changeset/fn-6745-xhigh-thinking-level.md
Normal file
5
.changeset/fn-6745-xhigh-thinking-level.md
Normal 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.
|
||||
@@ -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. |
|
||||
|
||||
9
packages/core/src/__tests__/thinking-levels.test.ts
Normal file
9
packages/core/src/__tests__/thinking-levels.test.ts
Normal 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"]);
|
||||
});
|
||||
});
|
||||
@@ -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];
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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" });
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(", ")}`);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "중간",
|
||||
|
||||
@@ -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": "中",
|
||||
|
||||
@@ -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": "中",
|
||||
|
||||
126
packages/i18n/src/resources.d.ts
vendored
126
packages/i18n/src/resources.d.ts
vendored
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user