paperclip/ui/src/components/RunInvocationCard.test.tsx
HenkDz 14d59da316 feat(adapters): external adapter plugin system with dynamic UI parser
- Plugin loader: install/reload/remove/reinstall external adapters
  from npm packages or local directories
- Plugin store persisted at ~/.paperclip/adapter-plugins.json
- Self-healing UI parser resolution with version caching
- UI: Adapter Manager page, dynamic loader, display registry
  with humanized names for unknown adapter types
- Dev watch: exclude adapter-plugins dir from tsx watcher
  to prevent mid-request server restarts during reinstall
- All consumer fallbacks use getAdapterLabel() for consistent display
- AdapterTypeDropdown uses controlled open state for proper close behavior
- Remove hermes-local from built-in UI (externalized to plugin)
- Add docs for external adapters and UI parser contract
2026-04-03 21:11:20 +01:00

38 lines
1.4 KiB
TypeScript

// @vitest-environment node
import { describe, expect, it } from "vitest";
import { renderToStaticMarkup } from "react-dom/server";
import { ThemeProvider } from "../context/ThemeContext";
import { RunInvocationCard } from "../pages/AgentDetail";
describe("RunInvocationCard", () => {
it("keeps verbose invocation details collapsed by default", () => {
const html = renderToStaticMarkup(
<ThemeProvider>
<RunInvocationCard
payload={{
adapterType: "claude_local",
cwd: "/tmp/workspace",
command: "claude",
commandArgs: ["--dangerously-skip-permissions"],
commandNotes: ["Prompt is piped to claude via stdin."],
prompt: "very long prompt body",
context: { triggeredBy: "board" },
env: { ANTHROPIC_API_KEY: "***REDACTED***" },
}}
censorUsernameInLogs={false}
/>
</ThemeProvider>,
);
expect(html).toContain("Invocation");
expect(html).toContain("Adapter:");
expect(html).toContain("Working dir:");
expect(html).toContain("Details");
expect(html).not.toContain("Command:");
expect(html).not.toContain("Prompt is piped to claude via stdin.");
expect(html).not.toContain("very long prompt body");
expect(html).not.toContain("ANTHROPIC_API_KEY");
expect(html).not.toContain("triggeredBy");
});
});