// @vitest-environment jsdom import { act } from "react"; import type { ReactNode } from "react"; import { createRoot } from "react-dom/client"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { Agent } from "@penclipai/shared"; import { AgentConfigForm } from "./AgentConfigForm"; const translations: Record = { "agentConfig.identity": "身份信息", "agentConfig.name": "名称", "agentConfig.agentName": "智能体名称", "agentConfig.title": "头衔", "agentConfig.titlePlaceholder": "例如:工程副总裁", "agentConfig.reportsTo": "汇报对象", "agentConfig.chooseManager": "选择上级…", "agentConfig.capabilities": "能力", "agentConfig.capabilitiesPlaceholder": "描述这个智能体能做什么...", "agentConfig.adapter": "适配器", "agentConfig.testEnvironment": "检测环境", "agentConfig.permissionsAndConfiguration": "权限与配置", "agentConfig.command": "命令", "agentConfig.model": "模型", "agentConfig.thinkingEffort": "思考强度", "agentConfig.default": "默认", "agentConfig.extraArgs": "额外参数", "agentConfig.extraArgsPlaceholder": "用逗号分隔,例如 --verbose, --search", "agentConfig.environmentVariables": "环境变量", "agentConfig.timeoutSec": "超时时间(秒)", "agentConfig.graceSec": "宽限时间(秒)", "agentConfig.runPolicy": "运行策略", "agentConfig.heartbeatOnInterval": "按间隔触发心跳", "agentConfig.advancedRunPolicy": "高级运行策略", "agentConfig.wakeOnDemand": "按需唤醒", "agentConfig.cooldownSec": "冷却时间(秒)", "agentConfig.maxConcurrentRuns": "最大并发运行数", "agentConfig.auto": "自动", }; vi.mock("react-i18next", async (importOriginal) => { const actual = await importOriginal(); return { ...actual, useTranslation: () => ({ t: (key: string, options?: Record) => translations[key] ?? String(options?.defaultValue ?? key), }), }; }); const mockAgentsApi = vi.hoisted(() => ({ list: vi.fn(), adapterModels: vi.fn(), detectModel: vi.fn(), testEnvironment: vi.fn(), })); const mockSecretsApi = vi.hoisted(() => ({ list: vi.fn(), create: vi.fn(), })); const mockAssetsApi = vi.hoisted(() => ({ uploadImage: vi.fn(), })); vi.mock("../api/agents", () => ({ agentsApi: mockAgentsApi, })); vi.mock("../api/secrets", () => ({ secretsApi: mockSecretsApi, })); vi.mock("../api/assets", () => ({ assetsApi: mockAssetsApi, })); vi.mock("../context/CompanyContext", () => ({ useCompany: () => ({ selectedCompanyId: "company-1", }), })); vi.mock("../adapters", () => ({ getUIAdapter: () => ({ ConfigFields: () => null, buildAdapterConfig: () => ({}), }), })); vi.mock("../adapters/metadata", () => ({ listAdapterOptions: () => [{ value: "claude_local", label: "Claude Code (local)" }], listVisibleAdapterTypes: () => ["claude_local"], })); vi.mock("../adapters/adapter-display-registry", () => ({ getAdapterLabel: () => "Claude Code (local)", })); vi.mock("../adapters/use-disabled-adapters", () => ({ useDisabledAdaptersSync: () => new Set(), })); vi.mock("../adapters/claude-local/config-fields", () => ({ ClaudeLocalAdvancedFields: () => null, })); vi.mock("./MarkdownEditor", () => ({ MarkdownEditor: ({ placeholder }: { placeholder?: string }) =>