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. |
|
| `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. |
|
| `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`). |
|
| `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. |
|
| `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. |
|
| `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. |
|
| `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";
|
} from "./capacity.js";
|
||||||
export type { CapacityRiskSignal } 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];
|
export type ThinkingLevel = (typeof THINKING_LEVELS)[number];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3411,7 +3411,7 @@ export interface AgentOnboardingSummary {
|
|||||||
name: string;
|
name: string;
|
||||||
role: AgentCapability | "custom";
|
role: AgentCapability | "custom";
|
||||||
instructionsText: string;
|
instructionsText: string;
|
||||||
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high";
|
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
||||||
maxTurns: number;
|
maxTurns: number;
|
||||||
title?: string;
|
title?: string;
|
||||||
icon?: string;
|
icon?: string;
|
||||||
@@ -3444,7 +3444,7 @@ export interface ExistingAgentOnboardingConfig {
|
|||||||
reportsTo?: string;
|
reportsTo?: string;
|
||||||
skills?: string[];
|
skills?: string[];
|
||||||
model?: string;
|
model?: string;
|
||||||
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high";
|
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
||||||
maxTurns?: number;
|
maxTurns?: number;
|
||||||
runtimeHint?: string;
|
runtimeHint?: string;
|
||||||
heartbeatIntervalMs?: number;
|
heartbeatIntervalMs?: number;
|
||||||
@@ -6352,7 +6352,7 @@ export interface AgentGenerationSpec {
|
|||||||
/** Detailed system prompt in markdown */
|
/** Detailed system prompt in markdown */
|
||||||
systemPrompt: string;
|
systemPrompt: string;
|
||||||
/** Suggested thinking level */
|
/** Suggested thinking level */
|
||||||
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high";
|
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
||||||
/** Suggested max turns (1-500) */
|
/** Suggested max turns (1-500) */
|
||||||
maxTurns: number;
|
maxTurns: number;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3776,7 +3776,7 @@ function ConfigTab({
|
|||||||
skills: selectedSkills,
|
skills: selectedSkills,
|
||||||
model: modelValue || undefined,
|
model: modelValue || undefined,
|
||||||
runtimeHint: runtimeMode === "runtime" ? selectedRuntimeId || undefined : 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,
|
maxTurns: formValues.maxTurns ? Number(formValues.maxTurns) : undefined,
|
||||||
heartbeatIntervalMs: heartbeatValues.heartbeatIntervalMs ? Number(heartbeatValues.heartbeatIntervalMs) * 1000 : undefined,
|
heartbeatIntervalMs: heartbeatValues.heartbeatIntervalMs ? Number(heartbeatValues.heartbeatIntervalMs) * 1000 : undefined,
|
||||||
heartbeatTimeoutMs: heartbeatValues.heartbeatTimeoutMs ? Number(heartbeatValues.heartbeatTimeoutMs) * 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="low">{t("models.options.low", "Low")}</option>
|
||||||
<option value="medium">{t("models.options.medium", "Medium")}</option>
|
<option value="medium">{t("models.options.medium", "Medium")}</option>
|
||||||
<option value="high">{t("models.options.high", "High")}</option>
|
<option value="high">{t("models.options.high", "High")}</option>
|
||||||
|
<option value="xhigh">{t("models.options.xhigh", "Very High")}</option>
|
||||||
</select>
|
</select>
|
||||||
<small>{t("models.descriptions.thinkingLevel", "Controls the reasoning effort for the AI agent. Higher levels use more tokens.")}</small>
|
<small>{t("models.descriptions.thinkingLevel", "Controls the reasoning effort for the AI agent. Higher levels use more tokens.")}</small>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ const AGENT_ROLES: { value: AgentCapability; icon: string }[] = [
|
|||||||
{ value: "custom", icon: "✦" },
|
{ 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 */
|
/** Set of valid AgentCapability values for mapping generated roles */
|
||||||
const VALID_CAPABILITIES = new Set<string>(["triage", "executor", "reviewer", "merger", "scheduler", "engineer", "custom"]);
|
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="low">{t("agents.thinkingLow", "Low")}</option>
|
||||||
<option value="medium">{t("agents.thinkingMedium", "Medium")}</option>
|
<option value="medium">{t("agents.thinkingMedium", "Medium")}</option>
|
||||||
<option value="high">{t("agents.thinkingHigh", "High")}</option>
|
<option value="high">{t("agents.thinkingHigh", "High")}</option>
|
||||||
|
<option value="xhigh">{t("agents.thinkingXhigh", "Very High")}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div className="agent-dialog-field">
|
<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,
|
validatorModelId: validatorModel && validatorSlashIdx !== -1 ? validatorModel.slice(validatorSlashIdx + 1) : undefined,
|
||||||
planningModelProvider: planningModel && planningSlashIdx !== -1 ? planningModel.slice(0, planningSlashIdx) : undefined,
|
planningModelProvider: planningModel && planningSlashIdx !== -1 ? planningModel.slice(0, planningSlashIdx) : undefined,
|
||||||
planningModelId: planningModel && planningSlashIdx !== -1 ? planningModel.slice(planningSlashIdx + 1) : 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,
|
reviewLevel,
|
||||||
...(autoMerge !== undefined ? { autoMerge } : {}),
|
...(autoMerge !== undefined ? { autoMerge } : {}),
|
||||||
priority,
|
priority,
|
||||||
|
|||||||
@@ -1527,7 +1527,7 @@ export function TaskDetailContent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const currentThinkingLevel = task.thinkingLevel ?? "";
|
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 ((task.nodeId ?? undefined) !== editNodeId) updates.nodeId = editNodeId ?? null;
|
||||||
if (editReviewLevel !== task.reviewLevel) updates.reviewLevel = editReviewLevel;
|
if (editReviewLevel !== task.reviewLevel) updates.reviewLevel = editReviewLevel;
|
||||||
if (editPriority !== normalizeTaskPriorityValue(task.priority)) updates.priority = editPriority;
|
if (editPriority !== normalizeTaskPriorityValue(task.priority)) updates.priority = editPriority;
|
||||||
|
|||||||
@@ -1221,6 +1221,7 @@ export function TaskForm({
|
|||||||
)}
|
)}
|
||||||
{onThinkingLevelChange && (
|
{onThinkingLevelChange && (
|
||||||
<div className="model-select-row">
|
<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>
|
<label htmlFor="thinking-level" className="model-select-label">{t("taskForm.thinkingLabel", "Thinking")}</label>
|
||||||
<select
|
<select
|
||||||
id="thinking-level"
|
id="thinking-level"
|
||||||
@@ -1234,6 +1235,7 @@ export function TaskForm({
|
|||||||
<option value="low">{t("taskForm.thinkingLow", "Low")}</option>
|
<option value="low">{t("taskForm.thinkingLow", "Low")}</option>
|
||||||
<option value="medium">{t("taskForm.thinkingMedium", "Medium")}</option>
|
<option value="medium">{t("taskForm.thinkingMedium", "Medium")}</option>
|
||||||
<option value="high">{t("taskForm.thinkingHigh", "High")}</option>
|
<option value="high">{t("taskForm.thinkingHigh", "High")}</option>
|
||||||
|
<option value="xhigh">{t("taskForm.thinkingXhigh", "Very High")}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -133,6 +133,20 @@ describe("TaskForm", () => {
|
|||||||
vi.mocked(fetchGitBranches).mockResolvedValue([]);
|
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", () => {
|
it("renders description field with AI refine button when text is present", () => {
|
||||||
renderTaskForm({ description: "Some text" });
|
renderTaskForm({ description: "Some text" });
|
||||||
|
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ export function GlobalModelsSection({
|
|||||||
if (selectedModel && !selectedModel.reasoning) return null;
|
if (selectedModel && !selectedModel.reasoning) return null;
|
||||||
return (
|
return (
|
||||||
<div className="form-group">
|
<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>
|
<label htmlFor="defaultThinkingLevel">Thinking Effort</label>
|
||||||
<select
|
<select
|
||||||
id="defaultThinkingLevel"
|
id="defaultThinkingLevel"
|
||||||
|
|||||||
@@ -3052,21 +3052,21 @@ describe("PATCH /tasks/:id", () => {
|
|||||||
expect(res.body.error).toContain("enabledWorkflowSteps must be an array of strings");
|
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({
|
(store.updateTask as ReturnType<typeof vi.fn>).mockResolvedValue({
|
||||||
...FAKE_TASK_DETAIL,
|
...FAKE_TASK_DETAIL,
|
||||||
thinkingLevel: "high",
|
thinkingLevel: "xhigh",
|
||||||
});
|
});
|
||||||
|
|
||||||
const res = await REQUEST(buildApp(), "PATCH", "/api/tasks/KB-001", JSON.stringify({
|
const res = await REQUEST(buildApp(), "PATCH", "/api/tasks/KB-001", JSON.stringify({
|
||||||
thinkingLevel: "high",
|
thinkingLevel: "xhigh",
|
||||||
}), {
|
}), {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(res.status).toBe(200);
|
expect(res.status).toBe(200);
|
||||||
expect(store.updateTask).toHaveBeenCalledWith("KB-001", {
|
expect(store.updateTask).toHaveBeenCalledWith("KB-001", {
|
||||||
thinkingLevel: "high",
|
thinkingLevel: "xhigh",
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1220,11 +1220,11 @@ describe("POST /tasks", () => {
|
|||||||
expect(store.createTask).not.toHaveBeenCalled();
|
expect(store.createTask).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("forwards thinkingLevel when provided", async () => {
|
it("forwards xhigh thinkingLevel when provided", async () => {
|
||||||
const createdTask = {
|
const createdTask = {
|
||||||
...FAKE_TASK_DETAIL,
|
...FAKE_TASK_DETAIL,
|
||||||
column: "triage",
|
column: "triage",
|
||||||
thinkingLevel: "high",
|
thinkingLevel: "xhigh",
|
||||||
};
|
};
|
||||||
(store.createTask as ReturnType<typeof vi.fn>).mockResolvedValue(createdTask);
|
(store.createTask as ReturnType<typeof vi.fn>).mockResolvedValue(createdTask);
|
||||||
|
|
||||||
@@ -1234,7 +1234,7 @@ describe("POST /tasks", () => {
|
|||||||
"/api/tasks",
|
"/api/tasks",
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
description: "Deep reasoning task",
|
description: "Deep reasoning task",
|
||||||
thinkingLevel: "high",
|
thinkingLevel: "xhigh",
|
||||||
}),
|
}),
|
||||||
{ "Content-Type": "application/json" },
|
{ "Content-Type": "application/json" },
|
||||||
);
|
);
|
||||||
@@ -1243,7 +1243,7 @@ describe("POST /tasks", () => {
|
|||||||
expect(store.createTask).toHaveBeenCalledWith(
|
expect(store.createTask).toHaveBeenCalledWith(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
description: "Deep reasoning task",
|
description: "Deep reasoning task",
|
||||||
thinkingLevel: "high",
|
thinkingLevel: "xhigh",
|
||||||
}),
|
}),
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
settings: { autoSummarizeTitles: undefined },
|
settings: { autoSummarizeTitles: undefined },
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ export interface AgentGenerationSpec {
|
|||||||
/** Detailed system prompt in markdown */
|
/** Detailed system prompt in markdown */
|
||||||
systemPrompt: string;
|
systemPrompt: string;
|
||||||
/** Suggested thinking level */
|
/** Suggested thinking level */
|
||||||
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high";
|
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
||||||
/** Suggested max turns (1-500) */
|
/** Suggested max turns (1-500) */
|
||||||
maxTurns: number;
|
maxTurns: number;
|
||||||
}
|
}
|
||||||
@@ -400,7 +400,7 @@ export function parseGenerationResponse(text: string): AgentGenerationSpec {
|
|||||||
role: typeof obj.role === "string" ? obj.role : "custom",
|
role: typeof obj.role === "string" ? obj.role : "custom",
|
||||||
description: typeof obj.description === "string" ? obj.description : "",
|
description: typeof obj.description === "string" ? obj.description : "",
|
||||||
systemPrompt: typeof obj.systemPrompt === "string" ? obj.systemPrompt : "",
|
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"])
|
? (obj.thinkingLevel as AgentGenerationSpec["thinkingLevel"])
|
||||||
: "off",
|
: "off",
|
||||||
maxTurns: typeof obj.maxTurns === "number"
|
maxTurns: typeof obj.maxTurns === "number"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ export interface AgentOnboardingSummary {
|
|||||||
name: string;
|
name: string;
|
||||||
role: AgentCapability | "custom";
|
role: AgentCapability | "custom";
|
||||||
instructionsText: string;
|
instructionsText: string;
|
||||||
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high";
|
thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
||||||
maxTurns: number;
|
maxTurns: number;
|
||||||
title?: string;
|
title?: string;
|
||||||
icon?: string;
|
icon?: string;
|
||||||
@@ -42,7 +42,7 @@ export interface ExistingAgentOnboardingConfig {
|
|||||||
reportsTo?: string;
|
reportsTo?: string;
|
||||||
skills?: string[];
|
skills?: string[];
|
||||||
model?: string;
|
model?: string;
|
||||||
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high";
|
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
||||||
maxTurns?: number;
|
maxTurns?: number;
|
||||||
runtimeHint?: string;
|
runtimeHint?: string;
|
||||||
heartbeatIntervalMs?: number;
|
heartbeatIntervalMs?: number;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import type {
|
|||||||
} from "@fusion/core";
|
} from "@fusion/core";
|
||||||
import {
|
import {
|
||||||
COLUMNS,
|
COLUMNS,
|
||||||
|
THINKING_LEVELS,
|
||||||
TASK_PRIORITIES,
|
TASK_PRIORITIES,
|
||||||
VALID_TRANSITIONS,
|
VALID_TRANSITIONS,
|
||||||
computeContentFingerprint,
|
computeContentFingerprint,
|
||||||
@@ -922,7 +923,7 @@ export function registerTaskWorkflowRoutes(ctx: ApiRoutesContext, deps: TaskWork
|
|||||||
const validatedPlanningModelId = validateOptionalModelField(planningModelId, "planningModelId");
|
const validatedPlanningModelId = validateOptionalModelField(planningModelId, "planningModelId");
|
||||||
|
|
||||||
// Validate thinkingLevel if provided
|
// Validate thinkingLevel if provided
|
||||||
const validThinkingLevels = ["off", "minimal", "low", "medium", "high"];
|
const validThinkingLevels = [...THINKING_LEVELS];
|
||||||
if (thinkingLevel !== undefined && thinkingLevel !== null && !validThinkingLevels.includes(thinkingLevel)) {
|
if (thinkingLevel !== undefined && thinkingLevel !== null && !validThinkingLevels.includes(thinkingLevel)) {
|
||||||
throw badRequest(`thinkingLevel must be one of: ${validThinkingLevels.join(", ")}`);
|
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");
|
const validatedAssigneeUserId = validateModelField(assigneeUserId, "assigneeUserId");
|
||||||
|
|
||||||
// Validate thinkingLevel if provided
|
// Validate thinkingLevel if provided
|
||||||
const validThinkingLevels = ["off", "minimal", "low", "medium", "high"];
|
const validThinkingLevels = [...THINKING_LEVELS];
|
||||||
if (thinkingLevel !== undefined && thinkingLevel !== null && !validThinkingLevels.includes(thinkingLevel)) {
|
if (thinkingLevel !== undefined && thinkingLevel !== null && !validThinkingLevels.includes(thinkingLevel)) {
|
||||||
throw new Error(`thinkingLevel must be one of: ${validThinkingLevels.join(", ")}`);
|
throw new Error(`thinkingLevel must be one of: ${validThinkingLevels.join(", ")}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -689,6 +689,31 @@ describe("session failure diagnostics", () => {
|
|||||||
warnSpy.mockRestore();
|
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 () => {
|
it("retries prompt on thinking/reasoning conflict without switching fallback models", async () => {
|
||||||
const createAgentSessionMock = vi.mocked(createAgentSession);
|
const createAgentSessionMock = vi.mocked(createAgentSession);
|
||||||
|
|
||||||
|
|||||||
@@ -1034,6 +1034,7 @@
|
|||||||
"templateCompact": "Compact",
|
"templateCompact": "Compact",
|
||||||
"templateDefault": "Default",
|
"templateDefault": "Default",
|
||||||
"thinkingHigh": "High",
|
"thinkingHigh": "High",
|
||||||
|
"thinkingXhigh": "Very High",
|
||||||
"thinkingLevel": "Thinking level",
|
"thinkingLevel": "Thinking level",
|
||||||
"thinkingLow": "Low",
|
"thinkingLow": "Low",
|
||||||
"thinkingMedium": "Medium",
|
"thinkingMedium": "Medium",
|
||||||
@@ -3415,6 +3416,7 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"default": "Default",
|
"default": "Default",
|
||||||
"high": "High",
|
"high": "High",
|
||||||
|
"xhigh": "Very High",
|
||||||
"low": "Low",
|
"low": "Low",
|
||||||
"medium": "Medium",
|
"medium": "Medium",
|
||||||
"minimal": "Minimal",
|
"minimal": "Minimal",
|
||||||
@@ -6310,6 +6312,7 @@
|
|||||||
"subtaskButton": "Subtask",
|
"subtaskButton": "Subtask",
|
||||||
"thinkingDefault": "Default ({{level}})",
|
"thinkingDefault": "Default ({{level}})",
|
||||||
"thinkingHigh": "High",
|
"thinkingHigh": "High",
|
||||||
|
"thinkingXhigh": "Very High",
|
||||||
"thinkingLabel": "Thinking",
|
"thinkingLabel": "Thinking",
|
||||||
"thinkingLow": "Low",
|
"thinkingLow": "Low",
|
||||||
"thinkingMedium": "Medium",
|
"thinkingMedium": "Medium",
|
||||||
|
|||||||
@@ -1034,6 +1034,7 @@
|
|||||||
"templateCompact": "Compacto",
|
"templateCompact": "Compacto",
|
||||||
"templateDefault": "Predeterminado",
|
"templateDefault": "Predeterminado",
|
||||||
"thinkingHigh": "Alto",
|
"thinkingHigh": "Alto",
|
||||||
|
"thinkingXhigh": "Muy alto",
|
||||||
"thinkingLevel": "Nivel de pensamiento",
|
"thinkingLevel": "Nivel de pensamiento",
|
||||||
"thinkingLow": "Bajo",
|
"thinkingLow": "Bajo",
|
||||||
"thinkingMedium": "Medio",
|
"thinkingMedium": "Medio",
|
||||||
@@ -3389,6 +3390,7 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"default": "Predeterminado",
|
"default": "Predeterminado",
|
||||||
"high": "Alto",
|
"high": "Alto",
|
||||||
|
"xhigh": "Muy alto",
|
||||||
"low": "Bajo",
|
"low": "Bajo",
|
||||||
"medium": "Medio",
|
"medium": "Medio",
|
||||||
"minimal": "Mínimo",
|
"minimal": "Mínimo",
|
||||||
@@ -6211,6 +6213,7 @@
|
|||||||
"subtaskButton": "Subtarea",
|
"subtaskButton": "Subtarea",
|
||||||
"thinkingDefault": "Predeterminado ({{level}})",
|
"thinkingDefault": "Predeterminado ({{level}})",
|
||||||
"thinkingHigh": "Alto",
|
"thinkingHigh": "Alto",
|
||||||
|
"thinkingXhigh": "Muy alto",
|
||||||
"thinkingLabel": "Pensamiento",
|
"thinkingLabel": "Pensamiento",
|
||||||
"thinkingLow": "Bajo",
|
"thinkingLow": "Bajo",
|
||||||
"thinkingMedium": "Medio",
|
"thinkingMedium": "Medio",
|
||||||
|
|||||||
@@ -1034,6 +1034,7 @@
|
|||||||
"templateCompact": "Compact",
|
"templateCompact": "Compact",
|
||||||
"templateDefault": "Défaut",
|
"templateDefault": "Défaut",
|
||||||
"thinkingHigh": "Élevé",
|
"thinkingHigh": "Élevé",
|
||||||
|
"thinkingXhigh": "Très élevé",
|
||||||
"thinkingLevel": "Niveau de réflexion",
|
"thinkingLevel": "Niveau de réflexion",
|
||||||
"thinkingLow": "Faible",
|
"thinkingLow": "Faible",
|
||||||
"thinkingMedium": "Moyen",
|
"thinkingMedium": "Moyen",
|
||||||
@@ -3389,6 +3390,7 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"default": "Défaut",
|
"default": "Défaut",
|
||||||
"high": "Élevé",
|
"high": "Élevé",
|
||||||
|
"xhigh": "Très élevé",
|
||||||
"low": "Faible",
|
"low": "Faible",
|
||||||
"medium": "Moyen",
|
"medium": "Moyen",
|
||||||
"minimal": "Minimal",
|
"minimal": "Minimal",
|
||||||
@@ -6211,6 +6213,7 @@
|
|||||||
"subtaskButton": "Sous-tâche",
|
"subtaskButton": "Sous-tâche",
|
||||||
"thinkingDefault": "Défaut ({{level}})",
|
"thinkingDefault": "Défaut ({{level}})",
|
||||||
"thinkingHigh": "Élevé",
|
"thinkingHigh": "Élevé",
|
||||||
|
"thinkingXhigh": "Très élevé",
|
||||||
"thinkingLabel": "Réflexion",
|
"thinkingLabel": "Réflexion",
|
||||||
"thinkingLow": "Faible",
|
"thinkingLow": "Faible",
|
||||||
"thinkingMedium": "Moyen",
|
"thinkingMedium": "Moyen",
|
||||||
|
|||||||
@@ -1007,6 +1007,7 @@
|
|||||||
"templateCompact": "간결",
|
"templateCompact": "간결",
|
||||||
"templateDefault": "기본",
|
"templateDefault": "기본",
|
||||||
"thinkingHigh": "높음",
|
"thinkingHigh": "높음",
|
||||||
|
"thinkingXhigh": "매우 높음",
|
||||||
"thinkingLevel": "사고 수준",
|
"thinkingLevel": "사고 수준",
|
||||||
"thinkingLow": "낮음",
|
"thinkingLow": "낮음",
|
||||||
"thinkingMedium": "보통",
|
"thinkingMedium": "보통",
|
||||||
@@ -3388,6 +3389,7 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"default": "기본값",
|
"default": "기본값",
|
||||||
"high": "높음",
|
"high": "높음",
|
||||||
|
"xhigh": "매우 높음",
|
||||||
"low": "낮음",
|
"low": "낮음",
|
||||||
"medium": "중간",
|
"medium": "중간",
|
||||||
"minimal": "최소",
|
"minimal": "최소",
|
||||||
@@ -6210,6 +6212,7 @@
|
|||||||
"subtaskButton": "하위 작업",
|
"subtaskButton": "하위 작업",
|
||||||
"thinkingDefault": "기본값 ({{level}})",
|
"thinkingDefault": "기본값 ({{level}})",
|
||||||
"thinkingHigh": "높음",
|
"thinkingHigh": "높음",
|
||||||
|
"thinkingXhigh": "매우 높음",
|
||||||
"thinkingLabel": "사고",
|
"thinkingLabel": "사고",
|
||||||
"thinkingLow": "낮음",
|
"thinkingLow": "낮음",
|
||||||
"thinkingMedium": "중간",
|
"thinkingMedium": "중간",
|
||||||
|
|||||||
@@ -1007,6 +1007,7 @@
|
|||||||
"templateCompact": "紧凑",
|
"templateCompact": "紧凑",
|
||||||
"templateDefault": "默认",
|
"templateDefault": "默认",
|
||||||
"thinkingHigh": "高",
|
"thinkingHigh": "高",
|
||||||
|
"thinkingXhigh": "极高",
|
||||||
"thinkingLevel": "思考级别",
|
"thinkingLevel": "思考级别",
|
||||||
"thinkingLow": "低",
|
"thinkingLow": "低",
|
||||||
"thinkingMedium": "中",
|
"thinkingMedium": "中",
|
||||||
@@ -3388,6 +3389,7 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"default": "默认值",
|
"default": "默认值",
|
||||||
"high": "高",
|
"high": "高",
|
||||||
|
"xhigh": "极高",
|
||||||
"low": "低",
|
"low": "低",
|
||||||
"medium": "中等",
|
"medium": "中等",
|
||||||
"minimal": "最小",
|
"minimal": "最小",
|
||||||
@@ -6210,6 +6212,7 @@
|
|||||||
"subtaskButton": "子任务",
|
"subtaskButton": "子任务",
|
||||||
"thinkingDefault": "默认({{level}})",
|
"thinkingDefault": "默认({{level}})",
|
||||||
"thinkingHigh": "高",
|
"thinkingHigh": "高",
|
||||||
|
"thinkingXhigh": "极高",
|
||||||
"thinkingLabel": "思考",
|
"thinkingLabel": "思考",
|
||||||
"thinkingLow": "低",
|
"thinkingLow": "低",
|
||||||
"thinkingMedium": "中",
|
"thinkingMedium": "中",
|
||||||
|
|||||||
@@ -1007,6 +1007,7 @@
|
|||||||
"templateCompact": "緊湊",
|
"templateCompact": "緊湊",
|
||||||
"templateDefault": "預設",
|
"templateDefault": "預設",
|
||||||
"thinkingHigh": "高",
|
"thinkingHigh": "高",
|
||||||
|
"thinkingXhigh": "極高",
|
||||||
"thinkingLevel": "思考級別",
|
"thinkingLevel": "思考級別",
|
||||||
"thinkingLow": "低",
|
"thinkingLow": "低",
|
||||||
"thinkingMedium": "中",
|
"thinkingMedium": "中",
|
||||||
@@ -3388,6 +3389,7 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"default": "預設值",
|
"default": "預設值",
|
||||||
"high": "高",
|
"high": "高",
|
||||||
|
"xhigh": "極高",
|
||||||
"low": "低",
|
"low": "低",
|
||||||
"medium": "中等",
|
"medium": "中等",
|
||||||
"minimal": "最小",
|
"minimal": "最小",
|
||||||
@@ -6210,6 +6212,7 @@
|
|||||||
"subtaskButton": "子任務",
|
"subtaskButton": "子任務",
|
||||||
"thinkingDefault": "預設({{level}})",
|
"thinkingDefault": "預設({{level}})",
|
||||||
"thinkingHigh": "高",
|
"thinkingHigh": "高",
|
||||||
|
"thinkingXhigh": "極高",
|
||||||
"thinkingLabel": "思考",
|
"thinkingLabel": "思考",
|
||||||
"thinkingLow": "低",
|
"thinkingLow": "低",
|
||||||
"thinkingMedium": "中",
|
"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",
|
"thinkingMedium": "Medium",
|
||||||
"thinkingMinimal": "Minimal",
|
"thinkingMinimal": "Minimal",
|
||||||
"thinkingOff": "Off",
|
"thinkingOff": "Off",
|
||||||
|
"thinkingXhigh": "Very High",
|
||||||
"throughput": "Throughput",
|
"throughput": "Throughput",
|
||||||
"title": "Agents",
|
"title": "Agents",
|
||||||
"titleLabel": "Title",
|
"titleLabel": "Title",
|
||||||
@@ -1197,7 +1198,6 @@ export default interface Resources {
|
|||||||
"cancelButton": "Cancel",
|
"cancelButton": "Cancel",
|
||||||
"clearConversationFailed": "Failed to clear conversation",
|
"clearConversationFailed": "Failed to clear conversation",
|
||||||
"closeQuickChat": "Close quick chat",
|
"closeQuickChat": "Close quick chat",
|
||||||
"workingStatus": "Working…",
|
|
||||||
"conversationArchived": "Conversation archived",
|
"conversationArchived": "Conversation archived",
|
||||||
"conversationDeleted": "Conversation deleted",
|
"conversationDeleted": "Conversation deleted",
|
||||||
"copyFailed": "Copy failed",
|
"copyFailed": "Copy failed",
|
||||||
@@ -1252,6 +1252,16 @@ export default interface Resources {
|
|||||||
"noSkillsAvailable": "No skills available",
|
"noSkillsAvailable": "No skills available",
|
||||||
"noSkillsFound": "No skills found",
|
"noSkillsFound": "No skills found",
|
||||||
"openQuickChat": "Open quick chat",
|
"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}}",
|
"queuedMessage": "Queued: {{preview}}",
|
||||||
"quickChatTitle": "Quick Chat",
|
"quickChatTitle": "Quick Chat",
|
||||||
"relativeTimeDays_one": "{{count}}d ago",
|
"relativeTimeDays_one": "{{count}}d ago",
|
||||||
@@ -1307,6 +1317,7 @@ export default interface Resources {
|
|||||||
"typeMessage": "Type a message...",
|
"typeMessage": "Type a message...",
|
||||||
"unreadMessages": "Unread messages",
|
"unreadMessages": "Unread messages",
|
||||||
"untitledSession": "Untitled",
|
"untitledSession": "Untitled",
|
||||||
|
"workingStatus": "Working…",
|
||||||
"you": "You"
|
"you": "You"
|
||||||
},
|
},
|
||||||
"chatRooms": {
|
"chatRooms": {
|
||||||
@@ -1434,6 +1445,91 @@ export default interface Resources {
|
|||||||
"stoppedTasks_one": "Stopped {{count}} task{{plural}}",
|
"stoppedTasks_one": "Stopped {{count}} task{{plural}}",
|
||||||
"stoppedTasks_other": "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": {
|
"comments": {
|
||||||
"addButton": "Add Comment",
|
"addButton": "Add Comment",
|
||||||
"addedSuccess": "Comment added",
|
"addedSuccess": "Comment added",
|
||||||
@@ -2412,6 +2508,7 @@ export default interface Resources {
|
|||||||
"browseFiles": "Browse Files",
|
"browseFiles": "Browse Files",
|
||||||
"chatView": "Chat view",
|
"chatView": "Chat view",
|
||||||
"closeSearch": "Close search",
|
"closeSearch": "Close search",
|
||||||
|
"commandCenterView": "Command Center",
|
||||||
"createTaskWithPlanning": "Create a task with AI planning",
|
"createTaskWithPlanning": "Create a task with AI planning",
|
||||||
"devServerView": "Dev Server",
|
"devServerView": "Dev Server",
|
||||||
"documentsView": "Documents view",
|
"documentsView": "Documents view",
|
||||||
@@ -3433,7 +3530,8 @@ export default interface Resources {
|
|||||||
"low": "Low",
|
"low": "Low",
|
||||||
"medium": "Medium",
|
"medium": "Medium",
|
||||||
"minimal": "Minimal",
|
"minimal": "Minimal",
|
||||||
"off": "Off"
|
"off": "Off",
|
||||||
|
"xhigh": "Very High"
|
||||||
},
|
},
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"selectExecutor": "Select executor model…",
|
"selectExecutor": "Select executor model…",
|
||||||
@@ -3458,6 +3556,7 @@ export default interface Resources {
|
|||||||
"automation": "Automation",
|
"automation": "Automation",
|
||||||
"chat": "Chat",
|
"chat": "Chat",
|
||||||
"chatUnreadAriaLabel": "Unread chat response",
|
"chatUnreadAriaLabel": "Unread chat response",
|
||||||
|
"commandCenter": "Command Center",
|
||||||
"devServer": "Dev Server",
|
"devServer": "Dev Server",
|
||||||
"documents": "Documents",
|
"documents": "Documents",
|
||||||
"evals": "Evals",
|
"evals": "Evals",
|
||||||
@@ -4910,6 +5009,17 @@ export default interface Resources {
|
|||||||
"title": "Secrets",
|
"title": "Secrets",
|
||||||
"valueLabel": "Value"
|
"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": {
|
"sessionBanner": {
|
||||||
"cli": {
|
"cli": {
|
||||||
"advance": "Advance",
|
"advance": "Advance",
|
||||||
@@ -5632,8 +5742,8 @@ export default interface Resources {
|
|||||||
"takeControl": "Take Control",
|
"takeControl": "Take Control",
|
||||||
"takingControl": "Taking control...",
|
"takingControl": "Taking control...",
|
||||||
"titleLabel": "Title",
|
"titleLabel": "Title",
|
||||||
"waitingForThinking": "Waiting for AI progress updates...",
|
"untitled": "Untitled",
|
||||||
"untitled": "Untitled"
|
"waitingForThinking": "Waiting for AI progress updates..."
|
||||||
},
|
},
|
||||||
"syncLog": {
|
"syncLog": {
|
||||||
"entryCount_one": "{{count}} entry",
|
"entryCount_one": "{{count}} entry",
|
||||||
@@ -6315,6 +6425,7 @@ export default interface Resources {
|
|||||||
"thinkingMedium": "Medium",
|
"thinkingMedium": "Medium",
|
||||||
"thinkingMinimal": "Minimal",
|
"thinkingMinimal": "Minimal",
|
||||||
"thinkingOff": "Off",
|
"thinkingOff": "Off",
|
||||||
|
"thinkingXhigh": "Very High",
|
||||||
"titleLabel": "Title",
|
"titleLabel": "Title",
|
||||||
"titlePlaceholder": "Task title",
|
"titlePlaceholder": "Task title",
|
||||||
"useDropdown": "Use dropdown",
|
"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",
|
"cycleBlocked": "That connection would create a cycle — only rework edges inside a for-each template may loop back",
|
||||||
"deleteEdge": "Delete edge",
|
"deleteEdge": "Delete edge",
|
||||||
"deleteNode": "Delete node",
|
"deleteNode": "Delete node",
|
||||||
|
"duplicateBlocked": "That connection already exists",
|
||||||
"edgeCondition": "Condition",
|
"edgeCondition": "Condition",
|
||||||
"edgeConditionLabel": "Condition: {{condition}}",
|
"edgeConditionLabel": "Condition: {{condition}}",
|
||||||
"edgeInspector": "Edge",
|
"edgeInspector": "Edge",
|
||||||
@@ -6945,6 +7057,9 @@ export default interface Resources {
|
|||||||
"joinMode": "Join mode",
|
"joinMode": "Join mode",
|
||||||
"joinQuorum": "Quorum (n)",
|
"joinQuorum": "Quorum (n)",
|
||||||
"mergeBoundaryNote": "Steps before this marker run pre-merge; steps after run post-merge.",
|
"mergeBoundaryNote": "Steps before this marker run pre-merge; steps after run post-merge.",
|
||||||
|
"mobileConnect": "Connect",
|
||||||
|
"mobileConnectChooseTarget": "Choose a target…",
|
||||||
|
"mobileConnectTarget": "Target node",
|
||||||
"parseArtifact": "Artifact",
|
"parseArtifact": "Artifact",
|
||||||
"parseParser": "Parser",
|
"parseParser": "Parser",
|
||||||
"quorumN": "Quorum count (n)",
|
"quorumN": "Quorum count (n)",
|
||||||
@@ -6960,6 +7075,9 @@ export default interface Resources {
|
|||||||
"reviewPlan": "Plan review",
|
"reviewPlan": "Plan review",
|
||||||
"reviewType": "Review type",
|
"reviewType": "Review type",
|
||||||
"splitNote": "Branches run concurrently from this node. Execute and merge seams are not allowed inside a branch.",
|
"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",
|
"stepExecuteLabel": "Step execute",
|
||||||
"summaryAwaitInput": "Waits for user input",
|
"summaryAwaitInput": "Waits for user input",
|
||||||
"summaryCodeDefault": "TypeScript",
|
"summaryCodeDefault": "TypeScript",
|
||||||
|
|||||||
Reference in New Issue
Block a user