feat(FN-2595): merge fusion/fn-2595

This commit is contained in:
gsxdsm
2026-04-26 11:19:36 -07:00
parent 86f234f868
commit 8ca4e0989c
4 changed files with 18 additions and 18 deletions

View File

@@ -239,7 +239,7 @@ export function AgentLogViewer({
)}
</div>
<div className="agent-log-model-group">
<span className="agent-log-model-label">Planning/Triage:</span>
<span className="agent-log-model-label">Planning:</span>
{hasPlanningOverride ? (
<span className="agent-log-model-value">
<ProviderIcon provider={planningModel.provider!} size="sm" />

View File

@@ -403,7 +403,7 @@ describe("AgentLogViewer", () => {
expect(header!.textContent).toContain("Using default");
});
it("renders model info header with planning/triage model when set", () => {
it("renders model info header with planning model when set", () => {
const entries = [makeEntry()];
const { container } = render(
<AgentLogViewer
@@ -414,31 +414,31 @@ describe("AgentLogViewer", () => {
);
const header = container.querySelector("[data-testid='agent-log-model-header']");
expect(header).toBeTruthy();
expect(header!.textContent).toContain("Planning/Triage:");
expect(header!.textContent).toContain("Planning:");
expect(header!.textContent).toContain("anthropic/claude-opus-4");
// Verify ProviderIcon is rendered for planning
expect(container.querySelector('[data-provider="anthropic"]')).toBeTruthy();
});
it("renders 'Using default' for planning/triage when no planning model is set", () => {
it("renders 'Using default' for planning when no planning model is set", () => {
const entries = [makeEntry()];
const { container } = render(
<AgentLogViewer entries={entries} loading={false} planningModel={null} />
);
const header = container.querySelector("[data-testid='agent-log-model-header']");
expect(header).toBeTruthy();
expect(header!.textContent).toContain("Planning/Triage:");
expect(header!.textContent).toContain("Planning:");
expect(header!.textContent).toContain("Using default");
});
it("renders 'Using default' for planning/triage when planningModel is undefined", () => {
it("renders 'Using default' for planning when planningModel is undefined", () => {
const entries = [makeEntry()];
const { container } = render(
<AgentLogViewer entries={entries} loading={false} />
);
const header = container.querySelector("[data-testid='agent-log-model-header']");
expect(header).toBeTruthy();
expect(header!.textContent).toContain("Planning/Triage:");
expect(header!.textContent).toContain("Planning:");
expect(header!.textContent).toContain("Using default");
});
@@ -459,7 +459,7 @@ describe("AgentLogViewer", () => {
expect(header!.textContent).toContain("anthropic/claude-opus-4");
expect(header!.textContent).toContain("Validator:");
expect(header!.textContent).toContain("openai/gpt-4o");
expect(header!.textContent).toContain("Planning/Triage:");
expect(header!.textContent).toContain("Planning:");
expect(header!.textContent).toContain("google/gemini-pro");
// Verify all three ProviderIcons are rendered
expect(container.querySelector('[data-provider="anthropic"]')).toBeTruthy();
@@ -478,7 +478,7 @@ describe("AgentLogViewer", () => {
);
const header = container.querySelector("[data-testid='agent-log-model-header']");
expect(header).toBeTruthy();
expect(header!.textContent).toContain("Planning/Triage:");
expect(header!.textContent).toContain("Planning:");
expect(header!.textContent).toContain("Using default");
});
});

View File

@@ -655,12 +655,12 @@ describe("PluginManager", () => {
it("filters events by projectId in project-scoped mode", async () => {
// Start with plugin disabled
vi.mocked(fetchPlugins).mockResolvedValueOnce([{ ...mockPlugins[0], enabled: false }]);
vi.mocked(fetchPlugins).mockResolvedValue([{ ...mockPlugins[0], enabled: false }]);
render(<PluginManager addToast={addToast} projectId="proj-789" />);
await waitFor(() => {
expect(fetchPlugins).toHaveBeenCalled();
expect(screen.getByText("Test Plugin A")).toBeTruthy();
});
// Verify initial state - toggle should NOT be checked

View File

@@ -1908,8 +1908,8 @@ describe("TaskDetailModal", () => {
expect(header.textContent).toContain("openai/gpt-4o");
});
// Planning/Triage model resolution tests
describe("Planning/Triage model resolution", () => {
// Planning model resolution tests
describe("Planning model resolution", () => {
it("shows planning model from runtime triage log marker", async () => {
const { fetchSettings } = await import("../../api");
const { useAgentLogs } = await import("../../hooks/useAgentLogs");
@@ -1951,7 +1951,7 @@ describe("TaskDetailModal", () => {
const header = container.querySelector("[data-testid='agent-log-model-header']");
expect(header).toBeTruthy();
// Planning should show the runtime triage marker, not settings default
expect(header!.textContent).toContain("Planning/Triage:");
expect(header!.textContent).toContain("Planning:");
expect(header!.textContent).toContain("google/gemini-pro");
});
@@ -2000,7 +2000,7 @@ describe("TaskDetailModal", () => {
const header = container.querySelector("[data-testid='agent-log-model-header']");
expect(header).toBeTruthy();
// Planning should use planningProvider/planningModelId from settings
expect(header!.textContent).toContain("Planning/Triage:");
expect(header!.textContent).toContain("Planning:");
expect(header!.textContent).toContain("openai/gpt-4o");
});
@@ -2024,7 +2024,7 @@ describe("TaskDetailModal", () => {
await waitFor(() => {
const header = container.querySelector("[data-testid='agent-log-model-header']");
expect(header).toBeTruthy();
expect(header!.textContent).toContain("Planning/Triage:");
expect(header!.textContent).toContain("Planning:");
expect(header!.textContent).toContain("anthropic/claude-sonnet-4-5");
});
@@ -2049,7 +2049,7 @@ describe("TaskDetailModal", () => {
});
const header = container.querySelector("[data-testid='agent-log-model-header']")!;
expect(header.textContent).toContain("Planning/Triage:");
expect(header.textContent).toContain("Planning:");
const defaultBadges = header.querySelectorAll(".model-badge-default");
// 3 default badges: executor, validator, planning
expect(defaultBadges).toHaveLength(3);
@@ -2099,7 +2099,7 @@ describe("TaskDetailModal", () => {
const header = container.querySelector("[data-testid='agent-log-model-header']");
expect(header).toBeTruthy();
// Per-task override should take precedence over settings
expect(header!.textContent).toContain("Planning/Triage:");
expect(header!.textContent).toContain("Planning:");
expect(header!.textContent).toContain("google/gemini-2.5-pro");
});