diff --git a/.github/workflows/test_unit.yml b/.github/workflows/test_unit.yml index 5e40a1cb0d..e6ec70b494 100644 --- a/.github/workflows/test_unit.yml +++ b/.github/workflows/test_unit.yml @@ -253,6 +253,10 @@ jobs: if: matrix.node-version == '22.x' run: pnpm --dir showcase/scripts exec playwright install chromium + - name: Run Web Inspector browser tests + if: ${{ matrix.node-version == '22.x' && matrix.react-version == '19' && contains(steps.select.outputs.projects, '@copilotkit/web-inspector') }} + run: pnpm nx run @copilotkit/web-inspector:test:browser + - name: Verify packed Angular consumer matrix if: matrix.node-version == '22.x' run: pnpm run verify:angular-package diff --git a/packages/web-inspector/dev/index.html b/packages/web-inspector/dev/index.html index f564e9f890..675fa2aa46 100644 --- a/packages/web-inspector/dev/index.html +++ b/packages/web-inspector/dev/index.html @@ -7,7 +7,7 @@ rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23023047' d='M4 4h16v16H4z'/%3E%3Cpath fill='%23fff' d='M8 8h8v2H8zm0 4h8v2H8zm0 4h5v2H8z'/%3E%3C/svg%3E" /> - Inspector Threads state lab + Inspector state workbench + + +
+ + diff --git a/packages/web-inspector/dev/learning-states.ts b/packages/web-inspector/dev/learning-states.ts new file mode 100644 index 0000000000..155c89c9f3 --- /dev/null +++ b/packages/web-inspector/dev/learning-states.ts @@ -0,0 +1,64 @@ +import { CopilotKitCore } from "@copilotkit/core"; +import { + WEB_INSPECTOR_TAG, + configureWebInspectorElement, +} from "@copilotkit/web-inspector"; +import type { WebInspectorElement } from "@copilotkit/web-inspector"; +import { + learningLabRuntimeUrl, + prepareLearningStateClient, + readyIntegratedLearningState, + settleLearningState, + waitForLearningConnection, +} from "./learning-state-client.js"; +import { isLearningScreenshotState } from "./learning-state-fixtures.js"; +import type { LearningScreenshotState } from "./learning-state-fixtures.js"; + +const query = new URLSearchParams(window.location.search); +const requestedState = query.get("state"); +const state: LearningScreenshotState = isLearningScreenshotState(requestedState) + ? requestedState + : "success"; +const runtimeTransport = + query.get("transport") === "single" ? "single" : "rest"; +const runtimeState = + query.get("fixture") === "pagination" ? "pagination" : state; +const preserveLearningSetup = query.get("preserveSetup") === "true"; +prepareLearningStateClient({ state, preserveSetup: preserveLearningSetup }); + +const runtimeUrl = learningLabRuntimeUrl(window.location.origin, runtimeState); +const core = new CopilotKitCore({ + runtimeUrl, + runtimeTransport, + deferInitialConnection: true, +}); +const inspector = configureWebInspectorElement( + document.createElement(WEB_INSPECTOR_TAG), + core, +); +document.querySelector("#inspector-host")?.replaceChildren(inspector); + +async function boot(): Promise { + core.connect(); + await waitForLearningConnection(core); + await readyIntegratedLearningState(state, inspector); + await settleLearningState(); + document.body.dataset.state = state; + document.body.dataset.transport = runtimeTransport; + document.documentElement.dataset.ready = "true"; +} + +void boot().catch((error: unknown) => { + document.documentElement.dataset.ready = "error"; + document.body.dataset.error = + error instanceof Error ? error.message : String(error); + console.error("[Inspector Learning lab]", error); +}); + +declare global { + interface Window { + __learningInspector?: WebInspectorElement; + } +} + +window.__learningInspector = inspector; diff --git a/packages/web-inspector/dev/learning-workbench.browser.ts b/packages/web-inspector/dev/learning-workbench.browser.ts new file mode 100644 index 0000000000..55f3037e8b --- /dev/null +++ b/packages/web-inspector/dev/learning-workbench.browser.ts @@ -0,0 +1,171 @@ +import { expect, test } from "@playwright/test"; +import type { Page } from "@playwright/test"; + +import { LEARNING_WORKBENCH_SCENARIOS } from "./learning-state-fixtures.js"; + +async function openWorkbenchState( + page: Page, + state: (typeof LEARNING_WORKBENCH_SCENARIOS)[number]["state"], +): Promise { + await page.goto(`/?scenario=learning-${state}&reset=1`, { + waitUntil: "domcontentloaded", + }); + await expect(page.locator("html")).toHaveAttribute("data-ready", "true", { + timeout: 15_000, + }); +} + +test("enumerates and navigates the complete Automatic Learning matrix at the root", async ({ + page, +}) => { + await page.setViewportSize({ width: 1702, height: 1200 }); + const infoResponse = page.waitForResponse( + (response) => + response.url().endsWith("/inspector-learning-lab/landing/info") && + response.request().method() === "GET", + ); + await openWorkbenchState(page, "landing"); + + await expect( + page.getByRole("heading", { name: "Inspector state workbench" }), + ).toBeVisible(); + await expect( + page.getByRole("complementary", { name: "Scenario validation console" }), + ).toBeVisible(); + + const options = page.locator( + '#scenario-select optgroup[label="Automatic Learning"] option', + ); + await expect(options).toHaveCount(LEARNING_WORKBENCH_SCENARIOS.length); + expect( + await options.evaluateAll((items) => + items.map((item) => ({ + value: (item as HTMLOptionElement).value, + label: item.textContent, + })), + ), + ).toEqual( + LEARNING_WORKBENCH_SCENARIOS.map(({ key, label }) => ({ + value: key, + label: `Automatic Learning · ${label}`, + })), + ); + + expect(await (await infoResponse).json()).toMatchObject({ + mode: "intelligence", + inspectorLearning: true, + agents: { "Checkout Assistant": { name: "Checkout Assistant" } }, + }); + await expect( + page.getByRole("heading", { + name: "Turn every interaction into reusable context.", + }), + ).toBeVisible(); + await expect( + page.getByRole("button", { name: "Copy setup prompt for Threads" }), + ).toBeVisible(); + await expect( + page.locator('[data-inspector-locked-feature-talk="memory"]'), + ).toBeVisible(); + await expect( + page.locator('iframe[title="CopilotKit Learning overview"]'), + ).toBeVisible(); + + await page.locator("#scenario-select").click(); + await page.locator("#scenario-select").press("Escape"); + await page.locator("#scenario-select").selectOption("learning-success"); + await page.waitForURL(/\?scenario=learning-success&reset=1$/); + await expect(page.locator("html")).toHaveAttribute("data-ready", "true", { + timeout: 15_000, + }); + await expect( + page.getByRole("region", { name: "Skills in registry" }), + ).toBeVisible(); + await expect( + page.getByRole("heading", { name: "verify-refund-request" }), + ).toBeVisible(); + await expect( + page.getByRole("link", { name: "1 Skill for review in web app" }), + ).toHaveAttribute( + "href", + "https://app.copilotkit.ai/o/acme/checkout/learning/checkout-assistant-default/skills", + ); + await expect( + page.getByText("Supporting Insight", { exact: true }), + ).toBeVisible(); + await expect( + page.getByText("Not applicable to Learning fixtures."), + ).toBeVisible(); + expect( + await page.evaluate( + () => document.documentElement.scrollWidth <= window.innerWidth, + ), + ).toBe(true); +}); + +test("selects every Automatic Learning state without editing the root URL", async ({ + page, +}) => { + await page.setViewportSize({ width: 1200, height: 900 }); + await openWorkbenchState(page, "landing"); + + for (const { key, state } of LEARNING_WORKBENCH_SCENARIOS.slice(1)) { + await page.locator("#scenario-select").selectOption(key); + await page.waitForURL(`**/?scenario=${key}&reset=1`); + await expect(page.locator("html")).toHaveAttribute("data-ready", "true", { + timeout: 15_000, + }); + await expect(page.locator("body")).toHaveAttribute("data-scenario", key); + await expect(page.locator("body")).toHaveAttribute( + "data-learning-state", + state, + ); + } +}); + +test("renders the narrow root workbench with an icon rail and stacked setup steps", async ({ + page, +}) => { + await page.setViewportSize({ width: 768, height: 1200 }); + await openWorkbenchState(page, "no-threads"); + + const inspectorWindow = page.locator(".inspector-window"); + const inspectorBox = await inspectorWindow.boundingBox(); + expect(inspectorBox).not.toBeNull(); + expect(inspectorBox!.x).toBe(0); + expect(inspectorBox!.x + inspectorBox!.width).toBeLessThanOrEqual(768); + await expect( + page.locator('.inspector-sidebar[data-icon-rail="true"]'), + ).toBeVisible(); + const setup = page.getByRole("region", { name: "Set up Learning" }); + await expect(setup.getByText("1 of 3 steps")).toBeVisible(); + await expect( + setup.getByRole("heading", { name: "Waiting for the first Thread" }), + ).toBeVisible(); + const stepBoxes = await setup.locator(".step").evaluateAll((steps) => + steps.map((step) => { + const bounds = step.getBoundingClientRect(); + return { x: bounds.x, y: bounds.y }; + }), + ); + expect(stepBoxes).toHaveLength(3); + expect(new Set(stepBoxes.map(({ x }) => Math.round(x))).size).toBe(1); + expect(stepBoxes[1]!.y).toBeGreaterThan(stepBoxes[0]!.y); + expect(stepBoxes[2]!.y).toBeGreaterThan(stepBoxes[1]!.y); + expect( + await page.evaluate( + () => document.documentElement.scrollWidth <= window.innerWidth, + ), + ).toBe(true); + + await page.getByRole("button", { name: "Close Web Inspector" }).click(); + await expect(page.locator("#scenario-select")).toBeVisible(); + await page.locator("#scenario-select").selectOption("learning-success"); + await page.waitForURL(/\?scenario=learning-success&reset=1$/); + await expect(page.locator("html")).toHaveAttribute("data-ready", "true", { + timeout: 15_000, + }); + await expect( + page.getByRole("region", { name: "Skills in registry" }), + ).toBeVisible(); +}); diff --git a/packages/web-inspector/dev/main.ts b/packages/web-inspector/dev/main.ts index 92aed1e40e..3e4b835095 100644 --- a/packages/web-inspector/dev/main.ts +++ b/packages/web-inspector/dev/main.ts @@ -29,6 +29,13 @@ import type { ThreadsStateScenario, } from "./threads-state-lab.js"; import type { ThreadRequestLog } from "./threads-state-lab-server.js"; +import { + learningLabRuntimeUrl, + prepareLearningStateClient, + readyIntegratedLearningState, + settleLearningState, + waitForLearningConnection, +} from "./learning-state-client.js"; const scenarioSelect = requiredElement("#scenario-select"); const notificationField = requiredElement("#notification-field"); @@ -76,8 +83,12 @@ const notificationConfig: NotificationConfig = customNotificationText ? { source: "custom", text: customNotificationText } : { source: "live" }; -const runtimeUrl = runtimeUrlFor(window.location.origin, scenario.key); -const requestLogUrl = `${runtimeUrl}/request-log`; +const runtimeUrl = scenario.learningState + ? learningLabRuntimeUrl(window.location.origin, scenario.learningState) + : runtimeUrlFor(window.location.origin, scenario.key); +const requestLogUrl = scenario.learningState + ? null + : `${runtimeUrl}/request-log`; let core: CopilotKitCore | null = null; let inspector: WebInspectorElement | null = null; @@ -263,6 +274,7 @@ function renderFixture(): void { threads: scenario.threads, learning: scenario.learning, memories: scenario.memories, + learningState: scenario.learningState ?? null, expectedNewestThreadId: scenario.expectedNewestThreadId ?? null, expectedInitialRequests: scenario.expectedRequests, media: scenario.media, @@ -326,6 +338,9 @@ function renderLedger(log: ThreadRequestLog): void { async function fetchRequestLog( signal?: AbortSignal, ): Promise { + if (!requestLogUrl) { + throw new Error("The Thread request ledger does not apply to Learning."); + } const response = await fetch(requestLogUrl, { headers: { accept: "application/json" }, signal, @@ -336,8 +351,27 @@ async function fetchRequestLog( return parseRequestLog(await response.json()); } +function renderLearningLedger(): void { + for (const kind of THREAD_REQUEST_KINDS) { + const actualCell = requiredElement(`#actual-${kind}`); + const outcomeCell = requiredElement(`#outcome-${kind}`); + actualCell.textContent = "—"; + outcomeCell.textContent = "Not used"; + outcomeCell.dataset.state = "match"; + } + const empty = document.createElement("li"); + empty.textContent = "Learning uses the shared Inspector Learning Runtime."; + requestLogOutput.replaceChildren(empty); + ledgerStatus.textContent = "Not applicable to Learning fixtures."; + ledgerStatus.dataset.state = "match"; +} + async function refreshLedger(): Promise { if (teardownStarted) return; + if (scenario.learningState) { + renderLearningLedger(); + return; + } ledgerAbortController?.abort(); const controller = new AbortController(); ledgerAbortController = controller; @@ -441,6 +475,7 @@ async function openInspectorSurface( } async function resetServerLedger(): Promise { + if (!requestLogUrl) return; const response = await fetch(`${requestLogUrl}/reset`, { method: "POST", headers: { "content-type": "application/json" }, @@ -537,6 +572,8 @@ function reportFatalError(error: unknown): void { const message = error instanceof Error ? error.message : String(error); actionStatus.textContent = message; actionStatus.dataset.state = "error"; + document.body.dataset.labReady = "error"; + document.documentElement.dataset.ready = "error"; console.error("[Inspector Threads lab]", error); } @@ -545,7 +582,7 @@ async function boot(): Promise { renderNotificationEditor(notificationConfig); installCustomNotificationResponse(notificationConfig); renderFixture(); - document.title = `${scenario.label} · Inspector Threads lab`; + document.title = `${scenario.label} · Inspector state workbench`; document.body.dataset.scenario = scenario.key; if (parsedScenario.rejectedKey) { @@ -582,6 +619,13 @@ async function boot(): Promise { actionStatus.textContent = "Inspector state and fixture ledger reset."; } + if (scenario.learningState) { + prepareLearningStateClient({ + state: scenario.learningState, + embeddedWorkbench: true, + }); + } + core = new CopilotKitCore({ runtimeUrl, runtimeTransport: "rest", @@ -604,14 +648,31 @@ async function boot(): Promise { refreshLedger().catch(reportFatalError); mediaTimer = window.setInterval(updateMediaStatus, 400); updateMediaStatus(); - seedThreadsStateLabAgentEvents(inspector, scenario); - await inspector.updateComplete; - if (replayingNotification) { - actionStatus.textContent = ""; + if (scenario.learningState) { + await waitForLearningConnection(core); + await readyIntegratedLearningState(scenario.learningState, inspector); + if (window.innerWidth <= 900) { + // The narrow Inspector remains truly docked, but the workbench itself + // must keep its normal viewport width so closing the Inspector reveals + // usable scenario controls instead of a page shifted off canvas. + document.body.style.marginLeft = ""; + } + await settleLearningState(); + document.body.dataset.learningState = scenario.learningState; } else { + seedThreadsStateLabAgentEvents(inspector, scenario); + await inspector.updateComplete; + } + if (replayingNotification && !scenario.learningState) { + actionStatus.textContent = ""; + } else if (!scenario.learningState) { await openInspectorSurface(scenario.initialMenu); actionStatus.textContent = ""; + } else { + actionStatus.textContent = ""; } + document.body.dataset.labReady = "true"; + document.documentElement.dataset.ready = "true"; } const removeNavigationListeners = installThreadsStateLabNavigation( diff --git a/packages/web-inspector/dev/playwright.config.ts b/packages/web-inspector/dev/playwright.config.ts new file mode 100644 index 0000000000..f42806de42 --- /dev/null +++ b/packages/web-inspector/dev/playwright.config.ts @@ -0,0 +1,26 @@ +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { defineConfig } from "@playwright/test"; + +export default defineConfig({ + testDir: ".", + testMatch: "*.browser.ts", + fullyParallel: false, + workers: 1, + reporter: "list", + outputDir: join(tmpdir(), "copilotkit-web-inspector-playwright"), + use: { + baseURL: "http://127.0.0.1:5177", + screenshot: "off", + trace: "off", + video: "off", + }, + webServer: { + command: + "pnpm exec vite dev dev --config dev/vite.config.ts --host 127.0.0.1 --port 5177", + cwd: "..", + url: "http://127.0.0.1:5177/", + reuseExistingServer: !process.env.CI, + timeout: 30_000, + }, +}); diff --git a/packages/web-inspector/dev/threads-state-lab.spec.ts b/packages/web-inspector/dev/threads-state-lab.spec.ts index cd265c91ee..3742e2e477 100644 --- a/packages/web-inspector/dev/threads-state-lab.spec.ts +++ b/packages/web-inspector/dev/threads-state-lab.spec.ts @@ -36,6 +36,7 @@ import type { ThreadRequestCounters, ThreadsStateScenario, } from "./threads-state-lab.js"; +import { LEARNING_WORKBENCH_SCENARIOS } from "./learning-state-fixtures.js"; import { createThreadsStateLabPlugin, createThreadsStateLabRuntime, @@ -89,9 +90,26 @@ const EXPECTED_EDGE_KEYS = [ ] as const; const EXPECTED_LEARNING_KEYS = [ - "learning-enabled-existing", - "learning-enabled-empty", - "learning-disabled", + "learning-landing", + "learning-copy-error", + "learning-no-threads", + "learning-threads-available", + "learning-first-run", + "learning-success", + "learning-insights-only", + "learning-multiple-skills", + "learning-new-threads", + "learning-candidates-only", + "learning-empty-results", + "learning-setup-error", + "learning-unsupported", + "learning-loading", + "learning-data-error", + "learning-selection-required", + "learning-results-error", + "learning-results-evidence", + "learning-evidence-unavailable", + "learning-setup-prompt", ] as const; const EXPECTED_RECORDING_THREADS = [ @@ -489,7 +507,7 @@ function nextSocketMessage(socket: WebSocket): Promise { }); } -test("exports the exact ordered 37-scenario route catalog", () => { +test("exports the exact ordered 54-scenario route catalog", () => { expect(CORE_SCENARIO_KEYS).toEqual(EXPECTED_CORE_KEYS); expect(LEARNING_SCENARIO_KEYS).toEqual(EXPECTED_LEARNING_KEYS); expect(EDGE_SCENARIO_KEYS).toEqual(EXPECTED_EDGE_KEYS); @@ -498,7 +516,7 @@ test("exports the exact ordered 37-scenario route catalog", () => { ...EXPECTED_LEARNING_KEYS, ...EXPECTED_EDGE_KEYS, ]); - expect(new Set(ALL_SCENARIO_KEYS).size).toBe(37); + expect(new Set(ALL_SCENARIO_KEYS).size).toBe(54); expect(Object.keys(THREADS_STATE_SCENARIOS)).toEqual(ALL_SCENARIO_KEYS); }); @@ -556,24 +574,26 @@ test("models every plan deployment capability and data matrix cell", () => { } }); -test("models enabled, empty, and disabled Automatic Learning fixtures", () => { - const existing = getThreadsStateScenario("learning-enabled-existing"); - const empty = getThreadsStateScenario("learning-enabled-empty"); - const disabled = getThreadsStateScenario("learning-disabled"); +test("models the complete Automatic Learning workbench matrix", () => { + expect(LEARNING_SCENARIO_KEYS).toEqual( + LEARNING_WORKBENCH_SCENARIOS.map(({ key }) => key), + ); - expect(existing.learning).toBe("enabled"); - expect(existing.initialMenu).toBe("memories"); - expect(existing.memories.map((memory) => memory.kind)).toEqual([ - "topical", - "episodic", - "operational", - ]); - expect(empty.learning).toBe("enabled"); - expect(empty.initialMenu).toBe("memories"); - expect(empty.memories).toEqual([]); - expect(disabled.learning).toBe("disabled"); - expect(disabled.initialMenu).toBe("memories"); - expect(disabled.memories).toEqual([]); + for (const descriptor of LEARNING_WORKBENCH_SCENARIOS) { + const scenario = getThreadsStateScenario(descriptor.key); + expect(scenario.label).toBe(`Automatic Learning · ${descriptor.label}`); + expect(scenario.learningState).toBe(descriptor.state); + expect(scenario.initialMenu).toBe("memories"); + expect(scenario.learning).toBe("disabled"); + expect(scenario.memories).toEqual([]); + expect(scenario.runtimeInfo.inspectorLearning).toBe( + descriptor.state === "unsupported" ? undefined : true, + ); + } + + expect(LEARNING_SCENARIO_KEYS).not.toContain("learning-enabled-existing"); + expect(LEARNING_SCENARIO_KEYS).not.toContain("learning-enabled-empty"); + expect(LEARNING_SCENARIO_KEYS).not.toContain("learning-disabled"); }); test("models zero-thread routes with available usage as true zero states", () => { @@ -777,50 +797,6 @@ test("serves deterministic list and bounded list-error responses", async () => { await runtime.dispose(); }); -test("serves Automatic Learning records, realtime credentials, recall, and the disabled gate", async () => { - const runtime = createThreadsStateLabRuntime(); - const enabledBase = - "http://127.0.0.1/inspector-lab-runtime/learning-enabled-existing"; - const list = await runtime.handleRequest( - new Request(`${enabledBase}/memories`), - ); - expect(await readJson(list)).toMatchObject({ - memories: [ - { kind: "topical" }, - { kind: "episodic" }, - { kind: "operational" }, - ], - }); - const subscribe = await runtime.handleRequest( - new Request(`${enabledBase}/memories/subscribe`, { - method: "POST", - body: "{}", - }), - ); - expect(await readJson(subscribe)).toEqual({ - joinToken: "threads-lab-token-learning-enabled-existing", - joinCode: "memories-threads-lab-learning-enabled-existing", - }); - const recall = await runtime.handleRequest( - new Request(`${enabledBase}/memories/recall`, { - method: "POST", - body: JSON.stringify({ query: "launch review" }), - }), - ); - const recallBody = (await readJson(recall)) as { memories: unknown[] }; - expect(recallBody).toMatchObject({ - memories: expect.any(Array), - }); - expect(recallBody.memories[0]).toMatchObject({ score: 0.95 }); - const disabled = await runtime.handleRequest( - new Request( - "http://127.0.0.1/inspector-lab-runtime/learning-disabled/memories", - ), - ); - expect(disabled.status).toBe(404); - await runtime.dispose(); -}); - test("serves subscribe inspect messages events and state contracts", async () => { const runtime = createThreadsStateLabRuntime(); const scenario = getThreadsStateScenario("pro-enabled-existing"); @@ -1363,7 +1339,7 @@ test("runs teardown before real select and reset control navigation", async () = } }); -test("drives the real Core, Inspector, stores, surfaces, and ledger for all 37 routes", async () => { +test("drives the real Core, Inspector, stores, surfaces, and ledger for all 34 Thread routes", async () => { const restoreNodeBridges = installNodeIntegrationBridges(); const matchMediaDescriptor = Object.getOwnPropertyDescriptor( window, @@ -1388,7 +1364,7 @@ test("drives the real Core, Inspector, stores, surfaces, and ledger for all 37 r }), }); } - for (const key of ALL_SCENARIO_KEYS) { + for (const key of [...CORE_SCENARIO_KEYS, ...EDGE_SCENARIO_KEYS]) { const scenario = getThreadsStateScenario(key); const runtimeUrl = runtimeUrlFor(lab.origin, key); const resetResponse = await fetch(`${runtimeUrl}/request-log/reset`, { diff --git a/packages/web-inspector/dev/threads-state-lab.ts b/packages/web-inspector/dev/threads-state-lab.ts index b7b26a62bc..74b360ccc5 100644 --- a/packages/web-inspector/dev/threads-state-lab.ts +++ b/packages/web-inspector/dev/threads-state-lab.ts @@ -2,6 +2,15 @@ import type { CopilotKitCore, Memory } from "@copilotkit/core"; import type { InspectorMetadataV1, RuntimeInfo } from "@copilotkit/shared"; import type { WebInspectorElement } from "@copilotkit/web-inspector"; +import { + LEARNING_WORKBENCH_SCENARIOS, + learningRuntimeInfo, +} from "./learning-state-fixtures.js"; +import type { + LearningScreenshotState, + LearningWorkbenchScenarioKey, +} from "./learning-state-fixtures.js"; + export const CORE_SCENARIO_KEYS = [ "pro-enabled-zero", "pro-enabled-existing", @@ -42,11 +51,8 @@ export const EDGE_SCENARIO_KEYS = [ "telemetry-disabled", ] as const; -export const LEARNING_SCENARIO_KEYS = [ - "learning-enabled-existing", - "learning-enabled-empty", - "learning-disabled", -] as const; +export const LEARNING_SCENARIO_KEYS: readonly LearningWorkbenchScenarioKey[] = + LEARNING_WORKBENCH_SCENARIOS.map(({ key }) => key); export const ALL_SCENARIO_KEYS = [ ...CORE_SCENARIO_KEYS, @@ -115,6 +121,7 @@ export interface ThreadsStateScenario { readonly media: "normal" | "video_error" | "reduced_motion"; readonly learning: "enabled" | "disabled"; readonly memories: readonly Memory[]; + readonly learningState?: LearningScreenshotState; } const INSPECTOR_STATE_STORAGE_KEY = "cpk:inspector:state"; @@ -842,89 +849,40 @@ function edgeScenario( } } -function learningMemoryFixtures( - key: (typeof LEARNING_SCENARIO_KEYS)[number], - threads: readonly ThreadFixture[], -): readonly Memory[] { - const [earlierThread, newestThread] = threads; - return [ - { - id: `${key}-topical-preference`, - kind: "topical", - scope: "user", - content: - "Prefers concise implementation plans with the highest-risk verification step listed first.", - sourceThreadIds: newestThread ? [newestThread.id] : [], - invalidatedAt: null, - }, - { - id: `${key}-episodic-resolution`, - kind: "episodic", - scope: "user", - content: - "Resolved the onboarding follow-up by validating the local Inspector flow before requesting review.", - sourceThreadIds: threads.map((thread) => thread.id), - invalidatedAt: null, - }, - { - id: `${key}-operational-handoff`, - kind: "operational", - scope: "project", - content: - "For launch reviews, include a working local preview and a screenshot of the final state.", - sourceThreadIds: earlierThread ? [earlierThread.id] : [], - invalidatedAt: null, - }, - ]; -} - function buildLearningScenario( - key: (typeof LEARNING_SCENARIO_KEYS)[number], + descriptor: (typeof LEARNING_WORKBENCH_SCENARIOS)[number], ): ThreadsStateScenario { - const threads = threadFixtures(key); - const enabled = key !== "learning-disabled"; - const memories = - key === "learning-enabled-existing" - ? learningMemoryFixtures(key, threads) - : []; + const { key, label, state } = descriptor; const inspectorMetadata = metadata("pro", { - used: 122, + used: 0, limit: { kind: "finite", value: 5_000 }, - expiringSoonCount: 7, + expiringSoonCount: 0, action: { kind: "manage_plan", url: MANAGE_PLAN_URL }, }); - const label = - key === "learning-enabled-existing" - ? "Automatic Learning · enabled · records" - : key === "learning-enabled-empty" - ? "Automatic Learning · enabled · empty" - : "Automatic Learning · disabled"; - const description = enabled - ? `${memories.length || "No"} learning record${memories.length === 1 ? "" : "s"}; Memory API enabled.` - : "Memory API unavailable; the Learning setup gate is shown."; return buildScenario({ key, - label, - description, + label: `Automatic Learning · ${label}`, + description: `Integrated Inspector fixture for the ${label.toLowerCase()} state.`, deployment: "managed", plan: "pro", - capability: "enabled", - data: "existing", - runtimeInfo: runtimeInfo(key, { capability: "enabled" }), + capability: "absent", + data: "zero", + runtimeInfo: learningRuntimeInfo(state), inspectorMetadata, inspectorMetadataBody: inspectorMetadata, - threads, + threads: [], media: "normal", initialMenu: "memories", - learning: enabled ? "enabled" : "disabled", - memories, + learning: "disabled", + memories: [], + learningState: state, }); } const scenarios = [ ...CORE_SCENARIO_KEYS.map(buildCoreScenario), - ...LEARNING_SCENARIO_KEYS.map(buildLearningScenario), + ...LEARNING_WORKBENCH_SCENARIOS.map(buildLearningScenario), ...EDGE_SCENARIO_KEYS.map(edgeScenario), ]; diff --git a/packages/web-inspector/dev/vite.config.ts b/packages/web-inspector/dev/vite.config.ts index 7703c4dc92..1d3079e755 100644 --- a/packages/web-inspector/dev/vite.config.ts +++ b/packages/web-inspector/dev/vite.config.ts @@ -3,6 +3,7 @@ import { fileURLToPath } from "node:url"; import type { Plugin, UserConfig } from "vite"; import { createThreadsStateLabPlugin } from "./threads-state-lab-server.js"; +import { createLearningStateLabPlugin } from "./learning-state-lab-server.js"; /** * Mirrors the package bundler's CSS-as-string behavior for the standalone @@ -29,7 +30,11 @@ const cssRawImportPlugin = { } as const satisfies Plugin; const config = { - plugins: [cssRawImportPlugin, createThreadsStateLabPlugin()], + plugins: [ + cssRawImportPlugin, + createThreadsStateLabPlugin(), + createLearningStateLabPlugin(), + ], resolve: { alias: { "@copilotkit/web-inspector": fileURLToPath( diff --git a/packages/web-inspector/package.json b/packages/web-inspector/package.json index 72e3694a24..84a28d03c9 100644 --- a/packages/web-inspector/package.json +++ b/packages/web-inspector/package.json @@ -34,6 +34,7 @@ "dev:css": "tailwindcss -i ./src/styles/tailwind.css -o ./src/styles/generated.css --watch --minify", "check-types": "pnpm run build:css && tsc --noEmit && tsc --project dev/tsconfig.json", "test": "pnpm run build:css && vitest run", + "test:browser": "playwright test --config dev/playwright.config.ts", "publint": "publint .", "attw": "attw --pack . --profile node16" }, @@ -47,6 +48,7 @@ }, "devDependencies": { "@copilotkit/typescript-config": "workspace:*", + "@playwright/test": "^1.59.1", "@tailwindcss/cli": "^4.1.11", "@types/node": "^22.15.3", "@types/ws": "^8.18.1", diff --git a/packages/web-inspector/project.json b/packages/web-inspector/project.json index cbfa24e093..27dacebd49 100644 --- a/packages/web-inspector/project.json +++ b/packages/web-inspector/project.json @@ -4,6 +4,20 @@ "sourceRoot": "packages/web-inspector/src", "projectType": "library", "targets": { + "test:browser": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm run test:browser", + "cwd": "packages/web-inspector" + }, + "dependsOn": [ + { + "target": "build:css", + "projects": "self" + } + ], + "cache": false + }, "dev:standalone": { "executor": "nx:run-commands", "options": { diff --git a/packages/web-inspector/src/__tests__/inspector-navigation.spec.ts b/packages/web-inspector/src/__tests__/inspector-navigation.spec.ts index 1632121f8b..2df07dede5 100644 --- a/packages/web-inspector/src/__tests__/inspector-navigation.spec.ts +++ b/packages/web-inspector/src/__tests__/inspector-navigation.spec.ts @@ -1660,9 +1660,16 @@ test("persisted leaves restore after Inspector has been opened, and first upgrad "Web Inspector shadow root was not rendered", ); expectCurrentNavigation(root, expected.group, expected.leaf); - expect(root.querySelector("#cpk-main-scroll")?.textContent).toContain( - expected.marker, - ); + const learningView = root.querySelector("cpk-learning-view"); + if (expected.leaf === "memories" && learningView) { + await (learningView as HTMLElement & { updateComplete: Promise }) + .updateComplete; + } + const renderedText = + expected.leaf === "memories" + ? learningView?.shadowRoot?.textContent + : root.querySelector("#cpk-main-scroll")?.textContent; + expect(renderedText).toContain(expected.marker); expect(storedSelectedMenu()).toBe(expected.leaf); } finally { context.teardown(); @@ -1743,9 +1750,10 @@ test("Workbench remembers Learning, and Settings does not persist a settings lea '"settings"', ); await context.toggleSettings(); - expect(root.querySelector("#cpk-main-scroll")?.textContent).toContain( - "Learning", - ); + const learningView = root.querySelector("cpk-learning-view"); + await (learningView as HTMLElement & { updateComplete: Promise }) + .updateComplete; + expect(learningView?.shadowRoot?.textContent).toContain("Learning"); } finally { context.teardown(); } diff --git a/packages/web-inspector/src/__tests__/launcher-error-signal.spec.ts b/packages/web-inspector/src/__tests__/launcher-error-signal.spec.ts index 2267dfa03d..c34798c232 100644 --- a/packages/web-inspector/src/__tests__/launcher-error-signal.spec.ts +++ b/packages/web-inspector/src/__tests__/launcher-error-signal.spec.ts @@ -2478,7 +2478,7 @@ test("reading the landing view clears the unread event, not the how-to-fix card" expect(launcherDot(context.inspector)).toBeNull(); }); -test("a Learning failure names itself and lands on Learning", async () => { +test("a legacy Memory failure does not masquerade as a Learning failure", async () => { const context = await setup({ intelligence: true }); // The store is only reached from the view, so visiting it once is what makes // the latch reachable at all. This mirrors how a developer gets here. @@ -2492,22 +2492,8 @@ test("a Learning failure names itself and lands on Learning", async () => { await context.failMemory("Failed to load memories: 500"); - expect(dotSubject(context.inspector)).toBe("memory"); - expect(launcherName(context.inspector)).toContain("learning error"); - await context.advance(ERROR_BEAT_MS); - expect(pillHeading(context.inspector)).toBe("Failed to load learning data"); - - await context.activate(pill(context.inspector)); - expect(currentMenu(context.inspector)).toBe("memories"); - // Learning keeps its own error display rather than the shared banner that - // run and tool use, so this asserts what the view actually renders: the - // store's message, and the advice line from the shared guidance table. - const view = root(context.inspector).textContent; - expect(view).toContain("Failed to load memories: 500"); - expect(view).toContain("Intelligence is connected"); - // Advice is not a claim about this view, so nothing here promises a - // highlight — and there is none to promise. - expect(view).not.toContain("highlighted below"); + expect(dotSubject(context.inspector)).toBeNull(); + expect(launcherName(context.inspector)).not.toContain("learning error"); }); test("a Learning failure arms nothing while the view has never been opened", async () => { @@ -2521,7 +2507,7 @@ test("a Learning failure arms nothing while the view has never been opened", asy expect(markers(context.inspector)).toEqual([]); }); -test("a resolved Learning failure stays unread until Learning renders", async () => { +test("a resolved legacy Memory failure leaves Learning unread state alone", async () => { const context = await setup({ intelligence: true }); await context.press(launcher(context.inspector)); await context.activate( @@ -2531,11 +2517,11 @@ test("a resolved Learning failure stays unread until Learning renders", async () ); await context.closePanel(); await context.failMemory("Failed to load memories: 500"); - expect(dotSubject(context.inspector)).toBe("memory"); + expect(dotSubject(context.inspector)).toBeNull(); await context.failMemory(null); - expect(dotSubject(context.inspector)).toBe("memory"); + expect(dotSubject(context.inspector)).toBeNull(); await context.press(launcher(context.inspector)); expect(currentMenu(context.inspector)).toBe("memories"); await context.closePanel(); diff --git a/packages/web-inspector/src/__tests__/launcher-hud.spec.ts b/packages/web-inspector/src/__tests__/launcher-hud.spec.ts index 8987498670..329a8caacd 100644 --- a/packages/web-inspector/src/__tests__/launcher-hud.spec.ts +++ b/packages/web-inspector/src/__tests__/launcher-hud.spec.ts @@ -469,16 +469,15 @@ test("disabled feature rows open their landing pages, where setup prompts can be ).click(); await settle(inspector); expect(currentMenu(inspector)).toBe("memories"); - requireElement( - root(inspector).querySelector( - '[data-inspector-feature-setup-prompt="memory"]', - ), - ).click(); - await settle(inspector); - expect(writeText).toHaveBeenCalledTimes(2); - expect(String(writeText.mock.calls[1]?.[0])).toContain( - "This task is specifically to enable Learning", + const learningView = requireElement( + root(inspector).querySelector("cpk-learning-view"), ); + await (learningView as HTMLElement & { updateComplete: Promise }) + .updateComplete; + expect(learningView.shadowRoot?.textContent).toContain( + "Learning is not available with this runtime version.", + ); + expect(writeText).toHaveBeenCalledTimes(1); expect(root(inspector).querySelector(".inspector-window")).not.toBeNull(); } finally { if (originalClipboard) { diff --git a/packages/web-inspector/src/__tests__/web-inspector.spec.ts b/packages/web-inspector/src/__tests__/web-inspector.spec.ts index 3702c48702..93d04d50d2 100644 --- a/packages/web-inspector/src/__tests__/web-inspector.spec.ts +++ b/packages/web-inspector/src/__tests__/web-inspector.spec.ts @@ -14,6 +14,7 @@ import type { CopilotKitCoreSubscriber } from "@copilotkit/core"; import type { Memory } from "@copilotkit/core"; import type { AbstractAgent, AgentSubscriber } from "@ag-ui/client"; import type { InspectorOpenSource } from "../lib/telemetry.js"; +import type { InspectorLearningSnapshotV1 } from "@copilotkit/shared"; import { describe, it, test, expect, vi, beforeEach, afterEach } from "vitest"; // --- Types for accessing LitElement-private reactive properties --- @@ -2669,14 +2670,14 @@ describe("WebInspectorElement owned thread store headers (#5581)", () => { harness.emitHeadersChanged({ "X-CSRF": "2" }); + let eventCalls: unknown[][] = []; await vi.waitFor(() => { - expect( - fetchMock.mock.calls.filter((call) => - String(call[0]).endsWith("/threads/thread-1/events"), - ), - ).toHaveLength(2); + eventCalls = fetchMock.mock.calls.filter((call) => + String(call[0]).endsWith("/threads/thread-1/events"), + ); + expect(eventCalls).toHaveLength(2); }); - expect(headersOf(fetchMock.mock.calls.at(-1)!)).toMatchObject({ + expect(headersOf(eventCalls.at(-1)!)).toMatchObject({ "X-CSRF": "2", }); }); @@ -3428,6 +3429,15 @@ describe("WebInspectorElement memories — tab presence", () => { // ── 6.4 View states ────────────────────────────────────────────────────── describe("WebInspectorElement memories — view states", () => { + async function learningSurface(el: WebInspectorElement) { + await el.updateComplete; + const view = el.shadowRoot?.querySelector("cpk-learning-view"); + expect(view, "Learning surface should render").not.toBeNull(); + await (view as HTMLElement & { updateComplete: Promise }) + .updateComplete; + return view!; + } + beforeEach(() => { document.body.innerHTML = ""; vi.stubGlobal("localStorage", { @@ -3446,40 +3456,377 @@ describe("WebInspectorElement memories — view states", () => { vi.unstubAllGlobals(); }); - it("renders the locked teaser when intelligence is absent", async () => { + const landingSnapshot: InspectorLearningSnapshotV1 = { + schemaVersion: 1, + projectKey: "project-safe-key", + snapshotVersion: "snapshot-landing", + webAppOrigin: "https://intelligence.customer.example", + configuration: { state: "not_configured" }, + pendingThreadCount: 0, + run: { hasActiveRun: false, hasEverSucceeded: false, latest: null }, + pendingCandidateCount: 0, + skillsPage: { + page: 1, + pageSize: 3, + total: 0, + totalPages: 0, + items: [], + }, + insightsPage: { + page: 1, + pageSize: 4, + total: 0, + totalPages: 0, + items: [], + }, + links: { + learning: "https://intelligence.customer.example/learning", + candidates: null, + runs: null, + }, + }; + + const resultsSnapshot = ( + overrides: Partial = {}, + ): InspectorLearningSnapshotV1 => ({ + ...landingSnapshot, + snapshotVersion: "snapshot-results", + configuration: { + state: "configured", + container: { id: "container-1", name: "Checkout Assistant" }, + }, + run: { hasActiveRun: false, hasEverSucceeded: true, latest: null }, + skillsPage: { + page: 1, + pageSize: 3, + total: 0, + totalPages: 0, + items: [], + }, + insightsPage: { + page: 1, + pageSize: 4, + total: 1, + totalPages: 1, + items: [ + { + id: "insight-1", + statement: "Confirm the order before giving refund guidance.", + impact: "Customers get an accurate next step.", + totalThreadCount: 1, + evidenceTruncated: false, + evidence: [ + { + status: "available", + threadId: "thread-1", + threadName: "Refund request #1798", + messageIds: ["message-1"], + updatedAt: "2026-09-03T19:00:00.000Z", + }, + ], + }, + ], + }, + links: { + learning: "https://intelligence.customer.example/learning", + candidates: null, + runs: null, + }, + ...overrides, + }); + + const learningCore = ( + fetch: ReturnType, + agents: Record = {}, + ) => + Object.assign(makeCoreWithMemory([]), { + agents, + runtimeUrl: "https://runtime.customer.example/api/copilotkit", + runtimeTransport: "rest" as const, + inspectorLearning: true, + ɵruntimeFetch: fetch, + }); + + it("advances the existing Learning landing copy action into setup progress", async () => { + const writeText = vi.fn().mockResolvedValue(undefined); + Object.defineProperty(navigator, "clipboard", { + configurable: true, + value: { writeText }, + }); + const core = Object.assign(makeCoreWithMemory([]), { + runtimeUrl: "https://runtime.customer.example/api/copilotkit", + runtimeTransport: "rest" as const, + inspectorLearning: true, + }); + const el = await mountMemories(core); + const internals = el as unknown as { + learningSupported: boolean; + learningSnapshot: InspectorLearningSnapshotV1 | null; + learningSetupMarker: { + runtimeUrl: string; + agentId: string | null; + } | null; + selectedMenu: string; + }; + internals.learningSupported = true; + internals.learningSnapshot = landingSnapshot; + el.requestUpdate(); + await el.updateComplete; + + const landing = el.shadowRoot?.querySelector( + '[data-inspector-locked-feature="memory"]', + ); + expect(landing?.textContent).toContain( + "Turn every interaction into reusable context.", + ); + const copy = landing?.querySelector( + '[data-inspector-feature-setup-prompt="threads"]', + ); + expect(copy).not.toBeNull(); + copy?.click(); + + await vi.waitFor(() => { + expect(writeText).toHaveBeenCalledOnce(); + expect(internals.learningSetupMarker).toMatchObject({ + runtimeUrl: "https://runtime.customer.example/api/copilotkit", + agentId: null, + }); + }); + expect(internals.selectedMenu).toBe("memories"); + await el.updateComplete; + const view = el.shadowRoot?.querySelector("cpk-learning-view"); + await (view as HTMLElement & { updateComplete: Promise }) + .updateComplete; + expect( + view?.shadowRoot?.querySelector('[data-learning-state="setup"]'), + ).not.toBeNull(); + }); + + it("keeps all-agents Learning unscoped when several agents are present", () => { + const alpha = createMockAgent("alpha").agent; + const beta = createMockAgent("beta").agent; + const core = makeCoreWithMemory([]); + core.agents = { alpha, beta }; + const el = createInspectorWithCore(core as unknown as MockCore); + const internals = el as unknown as { + selectedContext: string; + getLearningAgentId: () => string | null; + }; + + internals.selectedContext = "all-agents"; + expect(internals.getLearningAgentId()).toBeNull(); + internals.selectedContext = "beta"; + expect(internals.getLearningAgentId()).toBe("beta"); + }); + + it("keeps Skills and Insights pagination independent through the integrated pane", async () => { + const fetch = vi.fn(async (input: RequestInfo | URL) => { + const url = new URL(String(input)); + const skillsPage = Number(url.searchParams.get("skillsPage") ?? "1"); + const insightsPage = Number(url.searchParams.get("insightsPage") ?? "1"); + return new Response( + JSON.stringify( + resultsSnapshot({ + snapshotVersion: `snapshot-${skillsPage}-${insightsPage}`, + skillsPage: { + page: skillsPage, + pageSize: 3, + total: 4, + totalPages: 2, + items: Array.from( + { length: skillsPage === 1 ? 3 : 1 }, + (_, index) => ({ + id: `skill-${skillsPage}-${index}`, + name: `skill-page-${skillsPage}-${index}`, + description: "Use this Skill for support requests.", + revision: 1, + skillMd: "# Skill", + sourceInsight: null, + }), + ), + }, + insightsPage: { + ...resultsSnapshot().insightsPage, + page: insightsPage, + total: 5, + totalPages: 2, + items: Array.from( + { length: insightsPage === 1 ? 4 : 1 }, + (_, index) => ({ + ...resultsSnapshot().insightsPage.items[0]!, + id: `insight-${insightsPage}-${index}`, + }), + ), + }, + }), + ), + { status: 200, headers: { "content-type": "application/json" } }, + ); + }); + const el = await mountMemories(learningCore(fetch)); + const view = await learningSurface(el); + await vi.waitFor(() => { + expect( + view.shadowRoot?.querySelector("[data-learning-state='results']"), + ).not.toBeNull(); + }); + + view.shadowRoot + ?.querySelector( + "nav[aria-label='insights pages'] button:last-child", + ) + ?.click(); + await vi.waitFor(() => { + expect( + fetch.mock.calls.some(([input]) => + String(input).includes("skillsPage=1&insightsPage=2"), + ), + ).toBe(true); + expect( + ( + view as HTMLElement & { + snapshot: InspectorLearningSnapshotV1 | null; + } + ).snapshot?.insightsPage.page, + ).toBe(2); + }); + + view.shadowRoot + ?.querySelector( + "nav[aria-label='skills pages'] button:last-child", + ) + ?.click(); + await vi.waitFor(() => { + expect( + fetch.mock.calls.some(([input]) => + String(input).includes("skillsPage=2&insightsPage=2"), + ), + ).toBe(true); + }); + el.remove(); + }); + + it("clears the prior scope and refetches when the Inspector agent changes", async () => { + const fetch = vi.fn(async (input: RequestInfo | URL) => { + const url = new URL(String(input)); + const agentId = url.searchParams.get("agentId"); + return new Response( + JSON.stringify( + resultsSnapshot({ + projectKey: agentId ? `project-${agentId}` : "project-all", + snapshotVersion: agentId ? `snapshot-${agentId}` : "snapshot-all", + }), + ), + { status: 200, headers: { "content-type": "application/json" } }, + ); + }); + const alpha = createMockAgent("alpha").agent; + const beta = createMockAgent("beta").agent; + const el = await mountMemories(learningCore(fetch, { alpha, beta })); + const internals = el as unknown as { + contextOptions: Array<{ key: string; label: string }>; + handleContextOptionSelect: (key: string) => void; + learningSnapshot: InspectorLearningSnapshotV1 | null; + }; + await vi.waitFor(() => { + expect(internals.learningSnapshot?.projectKey).toBe("project-all"); + }); + + internals.handleContextOptionSelect("beta"); + expect(internals.learningSnapshot).toBeNull(); + await vi.waitFor(() => { + expect(internals.learningSnapshot?.projectKey).toBe("project-beta"); + }); + expect( + fetch.mock.calls.some(([input]) => + String(input).includes("agentId=beta"), + ), + ).toBe(true); + el.remove(); + }); + + it("routes accessible evidence through the integrated Threads navigator", async () => { + const fetch = vi.fn( + async () => + new Response(JSON.stringify(resultsSnapshot()), { + status: 200, + headers: { "content-type": "application/json" }, + }), + ); + const el = await mountMemories(learningCore(fetch)); + const view = await learningSurface(el); + await vi.waitFor(() => { + expect(view.shadowRoot?.querySelector(".insight-row")).not.toBeNull(); + }); + const focusThread = vi.fn(); + (el as unknown as { focusThread: typeof focusThread }).focusThread = + focusThread; + + view.shadowRoot?.querySelector(".insight-row")?.click(); + await (view as HTMLElement & { updateComplete: Promise }) + .updateComplete; + view.shadowRoot + ?.querySelector(".evidence-link") + ?.click(); + expect(focusThread).toHaveBeenCalledWith({ + threadId: "thread-1", + messageId: "message-1", + }); + el.remove(); + }); + + it("renders a retryable data error when a pending action link is missing", async () => { + const fetch = vi.fn( + async () => + new Response( + JSON.stringify( + resultsSnapshot({ + pendingThreadCount: 2, + links: { + learning: "https://intelligence.customer.example/learning", + candidates: null, + runs: null, + }, + }), + ), + { + status: 200, + headers: { "content-type": "application/json" }, + }, + ), + ); + const el = await mountMemories(learningCore(fetch)); + const view = await learningSurface(el); + + await vi.waitFor(() => { + expect( + view.shadowRoot?.querySelector('[data-learning-state="error"]'), + ).not.toBeNull(); + }); + expect(view.shadowRoot?.textContent).toContain( + "Learning snapshot response is invalid.", + ); + expect( + Array.from( + view.shadowRoot?.querySelectorAll("button") ?? [], + ).some((button) => button.textContent?.trim() === "Retry"), + ).toBe(true); + expect(view.shadowRoot?.querySelector("a")).toBeNull(); + el.remove(); + }); + + it("renders the unsupported Learning surface when the capability is absent", async () => { const core = makeCoreNoIntelligence(); const el = await mountMemories(core); - const text = el.shadowRoot?.textContent ?? ""; + const view = await learningSurface(el); + const text = view.shadowRoot?.textContent ?? ""; expect(text).toContain("Learning"); expect(text).toContain( - "Learning captures durable information from agent interactions and brings it back when it matters, so your product gets more useful over time.", + "Learning is not available with this runtime version.", ); expect( - el.shadowRoot?.querySelector('[data-inspector-locked-feature="memory"]'), - ).not.toBeNull(); - const video = el.shadowRoot?.querySelector( - '[data-inspector-feature-video="memory"]', - ); - expect(video?.src).toBe( - "https://www.loom.com/embed/2978fbfe42324e509057ac5fd46b7a70?hide_owner=true&hide_share=true&hide_title=true&hideEmbedTopBar=true&hide_speed=true", - ); - const outline = el.shadowRoot?.querySelector( - '[data-inspector-feature-outline="memory"]', - ); - expect(outline?.getAttribute("aria-label")).toBe("Learning capabilities"); - expect(outline?.textContent).toContain("Memory across sessions"); - expect(outline?.textContent).toContain("Recall by meaning"); - expect(outline?.textContent).toContain("Built-in structure"); - expect(outline?.textContent).toContain("Full visibility"); - const setupPrompt = el.shadowRoot?.querySelector( - '[data-inspector-feature-setup-prompt="memory"]', - ); - expect(setupPrompt?.classList.contains("inspector-account-cta")).toBe(true); - expect( - el.shadowRoot?.querySelector( - '.cpk-locked-feature-icon svg[viewBox="0 0 24 24"]', - ), + view.shadowRoot?.querySelector('[data-learning-state="unsupported"]'), ).not.toBeNull(); expect(el.shadowRoot?.textContent).not.toContain( "Sign up for Intelligence", @@ -3491,43 +3838,24 @@ describe("WebInspectorElement memories — view states", () => { ).toBeNull(); }); - it("renders the setup landing when Intelligence is present but unlicensed", async () => { + it("does not infer Learning support from a legacy Memory license", async () => { const core = makeCoreWithMemory([], { licenseStatus: "none" }); const el = await mountMemories(core); - expect( - el.shadowRoot?.querySelector('[data-inspector-locked-feature="memory"]'), - ).not.toBeNull(); - expect( - el.shadowRoot?.querySelector( - '[data-inspector-feature-setup-prompt="memory"]', - ), - ).not.toBeNull(); + const view = await learningSurface(el); + expect(view.shadowRoot?.textContent).toContain( + "Learning is not available with this runtime version.", + ); expect(el.shadowRoot?.querySelector("cpk-memory-list")).toBeNull(); }); - it("does not use Threads onboarding UTM attribution for locked memory CTAs", async () => { + it("does not render setup or external actions when Learning is unsupported", async () => { const core = makeCoreNoIntelligence(); const el = await mountMemories(core); - const lockedOverview = el.shadowRoot?.querySelector( - '[data-inspector-locked-feature="memory"]', - ); + const view = await learningSurface(el); - const talkToEngineer = lockedOverview?.querySelector( - 'a[href^="https://www.copilotkit.ai/talk-to-an-engineer"]', - ); - expect(talkToEngineer).not.toBeNull(); - expect( - lockedOverview?.querySelector( - 'a[href^="https://intelligence.copilotkit.ai/?ref="]', - ), - ).toBeNull(); - - const url = new URL(talkToEngineer!.href); - expect(url.searchParams.get("ref")).toBeTruthy(); - expect(url.searchParams.has("utm_source")).toBe(false); - expect(url.searchParams.has("utm_medium")).toBe(false); - expect(url.searchParams.has("utm_campaign")).toBe(false); + expect(view.shadowRoot?.querySelectorAll("a, button")).toHaveLength(0); + expect(view.shadowRoot?.textContent).not.toContain("setup prompt"); }); it("renders the locked teaser when memories are unavailable", async () => { @@ -3543,23 +3871,18 @@ describe("WebInspectorElement memories — view states", () => { ).toBeNull(); }); - it("renders cpk-memory-list with empty state when available and no memories", async () => { + it("does not render the legacy Memory list when Memory is available", async () => { const core = makeCoreWithMemory([], { available: true }); const el = await mountMemories(core); - const memoryList = el.shadowRoot?.querySelector("cpk-memory-list"); - expect( - memoryList, - "cpk-memory-list should render when enabled", - ).not.toBeNull(); - - await (memoryList as unknown as { updateComplete: Promise }) - .updateComplete; - const listText = memoryList?.shadowRoot?.textContent ?? ""; - expect(listText).toContain("No learning records yet"); + const view = await learningSurface(el); + expect(view.shadowRoot?.textContent).toContain( + "Learning is not available with this runtime version.", + ); + expect(el.shadowRoot?.querySelector("cpk-memory-list")).toBeNull(); }); - it("keeps the list rendered (not the full-screen error) when a mutation error arrives with memories present", async () => { + it("ignores a legacy Memory mutation error on the Learning surface", async () => { // INSP-2: a failed remove/update sets the store error while a valid list is // already on screen. That must NOT blank the list with the full-screen // "Failed to load learning data" state — the error is surfaced inline instead. @@ -3581,21 +3904,16 @@ describe("WebInspectorElement memories — view states", () => { el.requestUpdate(); await el.updateComplete; - // The list survives. - const memoryList = el.shadowRoot?.querySelector("cpk-memory-list"); - expect( - memoryList, - "cpk-memory-list must remain rendered on a mutation error", - ).not.toBeNull(); - - const text = el.shadowRoot?.textContent ?? ""; - // Inline, non-blocking error with distinct copy. - expect(text).toContain("Action failed: could not delete memory"); - // The full-screen load-failure copy must NOT appear. - expect(text).not.toContain("Failed to load learning data"); + const view = await learningSurface(el); + const text = view.shadowRoot?.textContent ?? ""; + expect(text).toContain( + "Learning is not available with this runtime version.", + ); + expect(text).not.toContain("could not delete memory"); + expect(el.shadowRoot?.querySelector("cpk-memory-list")).toBeNull(); }); - it("shows the full-screen load error only when no memories are loaded", async () => { + it("ignores a legacy Memory load error on the Learning surface", async () => { // INSP-2 counterpart: a snapshot-load failure (empty list) still shows the // full-screen "Failed to load learning data" state. const core = makeCoreWithMemory([]); @@ -3606,10 +3924,12 @@ describe("WebInspectorElement memories — view states", () => { el.requestUpdate(); await el.updateComplete; - const text = el.shadowRoot?.textContent ?? ""; - expect(text).toContain("Failed to load learning data"); - expect(text).toContain("network down"); - expect(text).not.toContain("Action failed:"); + const view = await learningSurface(el); + const text = view.shadowRoot?.textContent ?? ""; + expect(text).toContain( + "Learning is not available with this runtime version.", + ); + expect(text).not.toContain("network down"); const memoryList = el.shadowRoot?.querySelector("cpk-memory-list"); expect(memoryList).toBeNull(); }); @@ -3627,33 +3947,37 @@ describe("WebInspectorElement memories — view states", () => { expect(text).not.toContain("reconnecting"); }); - it("shows a muted 'reconnecting' indicator while realtime is connecting", async () => { + it("does not expose legacy Memory reconnect state", async () => { const core = makeCoreWithMemory([], { available: true, realtimeStatus: "connecting", }); const el = await mountMemories(core); - const text = el.shadowRoot?.textContent ?? ""; - expect(text).toContain("reconnecting"); - // It must NOT claim "live" while still connecting. - expect(text).not.toMatch(/>\s*live\s* { + it("does not expose legacy Memory offline state", async () => { const core = makeCoreWithMemory([], { available: true, realtimeStatus: "unavailable", }); const el = await mountMemories(core); - const text = el.shadowRoot?.textContent ?? ""; - expect(text).toContain("offline"); - // The frozen snapshot must NOT be labelled "live". - expect(text).not.toMatch(/>\s*live\s* { + it("does not project a legacy Memory record as a Learning result", async () => { const oneMemory: Memory = { id: "m1", kind: "topical", @@ -3666,13 +3990,9 @@ describe("WebInspectorElement memories — view states", () => { const core = makeCoreWithMemory([oneMemory]); const el = await mountMemories(core); - const memoryList = el.shadowRoot?.querySelector("cpk-memory-list"); - expect(memoryList, "cpk-memory-list should render").not.toBeNull(); - - await (memoryList as unknown as { updateComplete: Promise }) - .updateComplete; - const cards = memoryList?.shadowRoot?.querySelectorAll(".cpk-ml__card"); - expect(cards?.length).toBe(1); + const view = await learningSurface(el); + expect(view.shadowRoot?.textContent).not.toContain("Prefers dark mode"); + expect(el.shadowRoot?.querySelector("cpk-memory-list")).toBeNull(); }); }); @@ -3843,13 +4163,14 @@ describe("WebInspectorElement memories — passive store guard", () => { expect(spy).not.toHaveBeenCalled(); - // Activating the Memories tab is what creates + subscribes to the store. + // Learning reads the Intelligence projection and must not create the + // legacy browser Memory store as a side effect. ( el as unknown as { handleMenuSelect: (k: string) => void } ).handleMenuSelect("memories"); await el.updateComplete; - expect(spy).toHaveBeenCalledTimes(1); + expect(spy).not.toHaveBeenCalled(); }); it("does not double-subscribe when the Memories tab is re-activated", async () => { @@ -4069,7 +4390,7 @@ describe("WebInspectorElement memories — older-core compat (no getMemoryStore) ).toBeNull(); }); - it("shows the SDK-upgrade teaser (distinct from the not-enabled teaser) when getMemoryStore is absent", async () => { + it("uses the negotiated Learning capability instead of getMemoryStore presence", async () => { // INSP-3: an older @copilotkit/core (no getMemoryStore) must guide an SDK // upgrade, with copy distinct from the genuine "not enabled on this // deployment" teaser shown by a current SDK against a memory-less backend. @@ -4098,26 +4419,28 @@ describe("WebInspectorElement memories — older-core compat (no getMemoryStore) internals.handleMenuSelect("memories"); await el.updateComplete; - const text = el.shadowRoot?.textContent ?? ""; - expect(text).toContain("Upgrade to enable Learning"); - expect(text).toContain("@copilotkit/core and @copilotkit/react"); - // Must NOT show the deployment-not-enabled copy in this case. - expect(text).not.toContain( - "Learning captures durable information from agent interactions and brings it back when it matters, so your product gets more useful over time.", + const view = el.shadowRoot?.querySelector("cpk-learning-view"); + await (view as HTMLElement & { updateComplete: Promise }) + .updateComplete; + expect(view?.shadowRoot?.textContent).toContain( + "Learning is not available with this runtime version.", ); + expect(view?.shadowRoot?.textContent).not.toContain("@copilotkit SDK"); }); - it("shows the not-enabled teaser (distinct from the upgrade teaser) when the current SDK reports memory unavailable", async () => { + it("ignores legacy Memory availability when Learning was not negotiated", async () => { // INSP-3 counterpart: a current SDK (getMemoryStore present) whose store // reports available=false shows the deployment teaser, NOT upgrade copy. const core = makeCoreWithMemory([], { available: false }); const el = await mountMemories(core); - const text = el.shadowRoot?.textContent ?? ""; - expect(text).toContain( - "Learning captures durable information from agent interactions and brings it back when it matters, so your product gets more useful over time.", + const view = el.shadowRoot?.querySelector("cpk-learning-view"); + await (view as HTMLElement & { updateComplete: Promise }) + .updateComplete; + expect(view?.shadowRoot?.textContent).toContain( + "Learning is not available with this runtime version.", ); - expect(text).not.toContain("Learning requires a newer version"); + expect(view?.shadowRoot?.textContent).not.toContain("@copilotkit SDK"); }); }); @@ -4197,7 +4520,7 @@ describe("WebInspectorElement memories — tab telemetry + detach reset", () => const clicks = memoriesTabClicks(); expect(clicks).toHaveLength(1); expect(clicks[0]!.properties).toMatchObject({ - memory_count: 1, + memory_count: 0, available: true, }); }); diff --git a/packages/web-inspector/src/components/learning-view.spec.ts b/packages/web-inspector/src/components/learning-view.spec.ts new file mode 100644 index 0000000000..276e618b7d --- /dev/null +++ b/packages/web-inspector/src/components/learning-view.spec.ts @@ -0,0 +1,346 @@ +import { describe, expect, it } from "vitest"; +import type { InspectorLearningSnapshotV1 } from "@copilotkit/shared"; +import type { CpkLearningView } from "./learning-view.js"; +import { deriveLearningViewState } from "./learning-view.js"; + +function snapshot( + overrides: Partial = {}, +): InspectorLearningSnapshotV1 { + return { + schemaVersion: 1, + projectKey: "project-safe-key", + snapshotVersion: "snapshot-1", + webAppOrigin: "https://app.copilotkit.ai", + configuration: { state: "not_configured" }, + pendingThreadCount: 0, + run: { hasActiveRun: false, hasEverSucceeded: false, latest: null }, + pendingCandidateCount: 0, + skillsPage: { + page: 1, + pageSize: 3, + total: 0, + totalPages: 0, + items: [], + }, + insightsPage: { + page: 1, + pageSize: 4, + total: 0, + totalPages: 0, + items: [], + }, + links: { + learning: "https://app.copilotkit.ai/learning", + candidates: null, + runs: null, + }, + ...overrides, + }; +} + +const state = ( + current: InspectorLearningSnapshotV1 | null, + overrides: Partial[0]> = {}, +) => + deriveLearningViewState({ + supported: true, + loading: false, + error: null, + snapshot: current, + setupActive: false, + ...overrides, + }); + +describe("Learning state precedence", () => { + it("prioritizes capability, initial load, fatal error, and scope failures", () => { + expect(state(null, { supported: false })).toBe("unsupported"); + expect(state(null, { loading: true })).toBe("loading"); + expect(state(null, { error: "offline" })).toBe("error"); + expect( + state(snapshot({ configuration: { state: "selection_required" } })), + ).toBe("selection_required"); + expect( + state( + snapshot({ + configuration: { state: "invalid", reason: "instrumentation" }, + }), + ), + ).toBe("invalid"); + }); + + it("orders results, first run, ready, empty, setup, and landing", () => { + const configured = { + state: "configured" as const, + container: { id: "container-1", name: "Production" }, + }; + expect(state(snapshot({ pendingCandidateCount: 1 }))).toBe("results"); + expect( + state( + snapshot({ + configuration: configured, + run: { hasActiveRun: true, hasEverSucceeded: false, latest: null }, + }), + ), + ).toBe("first_run"); + expect( + state(snapshot({ configuration: configured, pendingThreadCount: 2 })), + ).toBe("ready"); + expect( + state( + snapshot({ + configuration: configured, + run: { hasActiveRun: false, hasEverSucceeded: true, latest: null }, + }), + ), + ).toBe("empty"); + expect(state(snapshot({ configuration: configured }))).toBe("setup"); + expect(state(snapshot(), { setupActive: true })).toBe("setup"); + expect(state(snapshot())).toBe("landing"); + }); +}); + +describe("Learning results hierarchy", () => { + const resultSnapshot = snapshot({ + configuration: { + state: "configured", + container: { id: "container-1", name: "Production" }, + }, + skillsPage: { + page: 1, + pageSize: 3, + total: 1, + totalPages: 1, + items: [ + { + id: "skill-1", + name: "escalation-summary", + description: "Summarize the decision before escalating.", + revision: 2, + skillMd: "---\nname: escalation-summary\n---\n", + sourceInsight: { + id: "source-1", + statement: "Escalations succeed with a decision summary.", + impact: "Reduces repeat questions.", + totalThreadCount: 3, + evidenceTruncated: false, + evidence: [], + }, + }, + ], + }, + insightsPage: { + page: 1, + pageSize: 4, + total: 1, + totalPages: 1, + items: [ + { + id: "insight-1", + statement: "Customers confirm ownership faster with a named owner.", + impact: "Shortens handoffs.", + totalThreadCount: 2, + evidenceTruncated: false, + evidence: [], + }, + ], + }, + }); + + async function renderResults() { + const view = document.createElement("cpk-learning-view") as CpkLearningView; + view.supported = true; + view.snapshot = resultSnapshot; + document.body.append(view); + await view.updateComplete; + return view; + } + + it("keeps Skills first and renders the first SKILL.md in a native disclosure", async () => { + const view = await renderResults(); + const headings = [...view.shadowRoot!.querySelectorAll("h2")].map( + (heading) => heading.textContent?.trim(), + ); + expect(headings).toEqual(["Skills in registry", "More Insights"]); + const disclosure = view.shadowRoot!.querySelector("details"); + expect(disclosure?.open).toBe(true); + expect(disclosure?.querySelector("summary")?.textContent).toContain( + "View SKILL.md", + ); + expect(disclosure?.querySelector("pre")?.textContent).toContain( + "", + ); + expect(disclosure?.querySelector("script")).toBeNull(); + view.remove(); + }); + + it("keeps the empty-result web-app management link quiet and safe", async () => { + const view = document.createElement("cpk-learning-view") as CpkLearningView; + view.supported = true; + view.snapshot = snapshot({ + configuration: { + state: "configured", + container: { id: "container-1", name: "Production" }, + }, + run: { + hasActiveRun: false, + hasEverSucceeded: true, + latest: null, + }, + links: { + learning: "https://app.copilotkit.ai/learning?project=project-safe-key", + candidates: null, + runs: null, + }, + }); + document.body.append(view); + await view.updateComplete; + + const link = + view.shadowRoot!.querySelector("a.quiet-link"); + expect(link?.textContent?.trim()).toBe("Open in web app ↗"); + expect(link?.href).toBe( + "https://app.copilotkit.ai/learning?project=project-safe-key", + ); + expect(link?.target).toBe("_blank"); + expect(link?.rel.split(/\s+/).sort()).toEqual(["noopener", "noreferrer"]); + view.remove(); + }); + + it("labels evidence, shows impact and Thread count, and emits on detail open", async () => { + const view = await renderResults(); + let opened = 0; + view.addEventListener("learning-evidence-opened", () => { + opened += 1; + }); + const labels = [ + ...view.shadowRoot!.querySelectorAll(".list-header span"), + ].map((label) => label.textContent); + expect(labels).toEqual(["Pattern", "Evidence"]); + const row = + view.shadowRoot!.querySelector(".insight-row"); + expect(row?.textContent).toContain("Shortens handoffs."); + expect(row?.textContent).toMatch(/2\s*Threads/); + row?.click(); + await view.updateComplete; + expect(opened).toBe(1); + expect(view.shadowRoot!.textContent).toContain( + "Evidence is no longer available", + ); + view.remove(); + }); + + it("keeps unavailable evidence inert and preserves the unnamed accessible Thread fallback", async () => { + const view = await renderResults(); + view.snapshot = snapshot({ + configuration: { + state: "configured", + container: { id: "container-1", name: "Production" }, + }, + insightsPage: { + page: 1, + pageSize: 4, + total: 1, + totalPages: 1, + items: [ + { + id: "insight-private", + statement: "Evidence availability is checked before navigation.", + impact: "Deleted evidence stays private.", + totalThreadCount: 2, + evidenceTruncated: false, + evidence: [ + { status: "unavailable" }, + { + status: "available", + threadId: "thread-accessible", + threadName: null, + messageIds: ["message-accessible"], + updatedAt: "2026-03-10T09:15:00.000Z", + }, + ], + }, + ], + }, + }); + await view.updateComplete; + view.shadowRoot?.querySelector(".insight-row")?.click(); + await view.updateComplete; + + const unavailable = view.shadowRoot!.querySelector(".evidence-unavailable"); + expect(unavailable?.textContent?.trim()).toBe( + "Evidence is no longer available", + ); + expect(unavailable?.querySelector("button, a")).toBeNull(); + const accessible = + view.shadowRoot!.querySelector(".evidence-link"); + expect(accessible?.textContent).toContain("Thread thread-a"); + expect(view.shadowRoot!.textContent).not.toContain("message-accessible"); + view.remove(); + }); +}); + +describe("Learning setup progress", () => { + async function renderProgress( + current: InspectorLearningSnapshotV1, + setupActive = false, + ) { + const view = document.createElement("cpk-learning-view") as CpkLearningView; + view.supported = true; + view.snapshot = current; + view.setupActive = setupActive; + document.body.append(view); + await view.updateComplete; + return view; + } + + it("shows all three setup steps and keeps analysis disabled while waiting", async () => { + const view = await renderProgress(snapshot(), true); + expect(view.shadowRoot!.textContent).toContain("1 of 3 steps"); + expect(view.shadowRoot!.textContent).toContain( + "Waiting for the first Thread", + ); + expect(view.shadowRoot!.querySelectorAll(".step")).toHaveLength(3); + expect( + view.shadowRoot!.querySelector("button[disabled]") + ?.textContent, + ).toContain("Analyze Threads"); + view.remove(); + }); + + it("marks Thread capture complete before handing a ready run to the web app", async () => { + const view = await renderProgress( + snapshot({ + configuration: { + state: "configured", + container: { id: "container-1", name: "Production" }, + }, + pendingThreadCount: 3, + links: { + learning: "https://app.copilotkit.ai/learning", + candidates: null, + runs: "https://app.copilotkit.ai/learning?tab=runs", + }, + }), + ); + expect(view.shadowRoot!.textContent).toContain("2 of 3 steps"); + expect(view.shadowRoot!.textContent).toContain("Threads ready to analyze"); + expect(view.shadowRoot!.textContent).toMatch(/3\s*New Threads/); + expect(view.shadowRoot!.querySelector("a")?.textContent).toContain( + "Open in web app", + ); + view.remove(); + }); + + it("renders setup failures as an alert at step two", async () => { + const view = await renderProgress( + snapshot({ + configuration: { state: "invalid", reason: "instrumentation" }, + }), + ); + expect(view.shadowRoot!.textContent).toContain("Needs attention"); + expect( + view.shadowRoot!.querySelector('[role="alert"]')?.textContent, + ).toContain("Inspector did not find the Learning container"); + view.remove(); + }); +}); diff --git a/packages/web-inspector/src/components/learning-view.ts b/packages/web-inspector/src/components/learning-view.ts new file mode 100644 index 0000000000..e3f9ddaae3 --- /dev/null +++ b/packages/web-inspector/src/components/learning-view.ts @@ -0,0 +1,1513 @@ +import { LitElement, css, html, nothing } from "lit"; +import type { + InspectorLearningInsight, + InspectorLearningSnapshotV1, +} from "@copilotkit/shared"; + +export type LearningViewState = + | "unsupported" + | "loading" + | "error" + | "selection_required" + | "invalid" + | "results" + | "first_run" + | "ready" + | "empty" + | "setup" + | "landing"; + +export function deriveLearningViewState(input: { + readonly supported: boolean; + readonly loading: boolean; + readonly error: string | null; + readonly snapshot: InspectorLearningSnapshotV1 | null; + readonly setupActive: boolean; +}): LearningViewState { + if (!input.supported) return "unsupported"; + if (!input.snapshot && input.loading) return "loading"; + if (!input.snapshot && input.error) return "error"; + const snapshot = input.snapshot; + if (!snapshot) return "loading"; + if (snapshot.configuration.state === "selection_required") + return "selection_required"; + if (snapshot.configuration.state === "invalid") return "invalid"; + const hasResults = + snapshot.skillsPage.total > 0 || snapshot.insightsPage.total > 0; + if (hasResults || snapshot.pendingCandidateCount > 0) return "results"; + if (snapshot.run.hasActiveRun) return "first_run"; + if (snapshot.run.hasEverSucceeded && snapshot.pendingThreadCount === 0) + return "empty"; + if ( + snapshot.configuration.state === "configured" && + snapshot.pendingThreadCount > 0 + ) + return "ready"; + if (input.setupActive || snapshot.configuration.state === "configured") + return "setup"; + return "landing"; +} + +export class CpkLearningView extends LitElement { + static properties = { + supported: { type: Boolean }, + loading: { type: Boolean }, + refreshing: { type: Boolean }, + error: { attribute: false }, + snapshot: { attribute: false }, + setupActive: { type: Boolean }, + copyState: { attribute: false }, + setupPrompt: { attribute: false }, + }; + + supported = false; + loading = false; + refreshing = false; + error: string | null = null; + snapshot: InspectorLearningSnapshotV1 | null = null; + setupActive = false; + copyState: "idle" | "copied" | "error" = "idle"; + setupPrompt = ""; + private promptOpen = false; + private expandedSkillId: string | null = null; + private selectedInsightId: string | null = null; + private skillPageKey = ""; + + static styles = css` + :host { + --learning-ink: #202127; + --learning-muted: #64656f; + --learning-line: #dcdce4; + --learning-soft: #f7f7fa; + --learning-purple: #7567ff; + --learning-purple-dark: #5549e8; + --learning-soft-purple: #f0edff; + --learning-green: #168b69; + display: block; + height: 100%; + overflow: auto; + color: var(--learning-ink); + background: #fff; + font-family: Inter, ui-sans-serif, system-ui, sans-serif; + } + * { + box-sizing: border-box; + } + button, + a, + summary { + font: inherit; + } + button:focus-visible, + a:focus-visible, + summary:focus-visible { + outline: 2px solid var(--learning-purple); + outline-offset: 2px; + } + .pane-inner { + max-width: 880px; + min-height: 100%; + margin: 0 auto; + padding: 32px 36px 70px; + } + .pane-heading { + display: flex; + align-items: start; + justify-content: space-between; + gap: 24px; + margin-bottom: 24px; + } + .pane-heading h1 { + margin: 0 0 7px; + font-size: 25px; + line-height: 1.2; + letter-spacing: -0.035em; + } + .pane-heading p { + max-width: 630px; + margin: 0; + color: var(--learning-muted); + font-size: 14px; + line-height: 1.5; + } + .refreshing { + color: #858690; + font-size: 11px; + } + .setup-card, + .analysis-card, + .content-card { + border: 1px solid var(--learning-line); + border-radius: 10px; + background: #fff; + } + .setup-card { + padding: 24px; + background: #fbfbfd; + } + .setup-top { + display: flex; + align-items: start; + justify-content: space-between; + gap: 20px; + } + .setup-top h2, + .analysis-card h2 { + margin: 0; + font-size: 19px; + line-height: 1.25; + letter-spacing: -0.02em; + } + .progress-count { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 13px; + font-weight: 750; + white-space: nowrap; + } + .progress-track { + height: 8px; + margin: 20px 0 18px; + overflow: hidden; + background: #e9edf5; + border-radius: 999px; + } + .progress-fill { + height: 100%; + background: var(--learning-purple); + border-radius: inherit; + } + .steps { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 10px; + margin: 0; + padding: 0; + list-style: none; + } + .step { + min-height: 142px; + padding: 15px; + background: #fff; + border: 1px solid var(--learning-line); + border-radius: 8px; + } + .step.current { + background: var(--learning-soft-purple); + border-color: var(--learning-purple); + } + .step.error { + background: #fff4f4; + border-color: #d96a6a; + } + .step.complete { + background: #f7fbf9; + border-color: #b9dfd1; + } + .step-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 18px; + } + .step-number { + display: grid; + place-items: center; + width: 26px; + height: 26px; + color: #555661; + background: #edf0f5; + border-radius: 50%; + font-size: 12px; + font-weight: 800; + } + .step.current .step-number { + color: #fff; + background: var(--learning-purple); + } + .step.complete .step-number { + color: #fff; + background: var(--learning-green); + } + .step-state { + color: #a33a3a; + font-size: 9px; + font-weight: 850; + letter-spacing: 0.06em; + text-transform: uppercase; + } + .step h3 { + margin: 0 0 7px; + font-size: 14px; + } + .step p { + margin: 0; + color: var(--learning-muted); + font-size: 12px; + line-height: 1.45; + } + .setup-support { + margin-top: 14px; + } + .collection-panel { + padding: 15px; + background: #fff; + border: 1px solid var(--learning-line); + border-radius: 8px; + } + .support-heading { + margin-bottom: 12px; + } + .support-heading h3 { + margin: 0; + font-size: 13px; + } + .error-alert { + margin-bottom: 10px; + padding: 11px 12px; + color: #7e2929; + background: #fff4f4; + border: 1px solid #efc7c7; + border-radius: 6px; + } + .error-alert p { + margin: 0; + color: #8c4a4a; + font-size: 11px; + line-height: 1.45; + } + .prompt-link { + display: inline-block; + margin-top: 7px; + padding: 0; + color: #7e2929; + background: none; + border: 0; + font-size: 11px; + font-weight: 750; + text-decoration: underline; + cursor: pointer; + } + .collection-summary { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 10px; + background: var(--learning-soft); + border-radius: 6px; + } + .collection-stat { + display: flex; + min-width: 0; + align-items: center; + gap: 9px; + } + .captured-count { + color: var(--learning-ink); + font-size: 28px; + line-height: 1; + } + .collection-stat span { + font-size: 12px; + font-weight: 700; + } + .technical-details { + margin-top: 10px; + color: #62636d; + font-size: 10px; + } + .technical-details summary { + cursor: pointer; + font-weight: 700; + } + .technical-details dl { + display: grid; + grid-template-columns: auto 1fr; + gap: 5px 12px; + margin: 9px 0 0; + padding: 10px; + background: var(--learning-soft); + border-radius: 5px; + } + .technical-details dt { + color: #8a8b94; + } + .technical-details dd { + margin: 0; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + overflow-wrap: anywhere; + } + .primary, + .secondary { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 36px; + padding: 0 14px; + border-radius: 6px; + font-size: 12px; + font-weight: 750; + text-decoration: none; + cursor: pointer; + } + .primary { + color: #fff; + background: #202127; + border: 1px solid #202127; + } + .secondary { + color: #31323a; + background: #fff; + border: 1px solid #cfcfd7; + } + .primary:disabled, + .primary[aria-disabled="true"] { + color: #9a9ba3; + background: #e5e5ea; + border-color: #e5e5ea; + cursor: not-allowed; + pointer-events: none; + } + .setup-cta:not(:disabled), + .results-cta { + min-width: 170px; + min-height: 40px; + padding: 0 18px; + box-shadow: 0 6px 14px rgba(23, 23, 27, 0.2); + } + .outcome-preview { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + margin-top: 16px; + color: #888993; + font-size: 11px; + } + .outcome-preview span { + padding: 6px 9px; + background: #fff; + border: 1px dashed #cfd0d8; + border-radius: 5px; + } + .outcome-preview b { + color: #b0b1b9; + } + .analysis-card { + padding: 18px 20px; + background: #f8f8fb; + } + .analysis-card.ready { + background: #f5f3ff; + border-color: #cfc8ff; + } + .analysis-card.error { + background: #fff8f8; + border-color: #efc7c7; + } + .analysis-row { + display: flex; + align-items: center; + gap: 20px; + } + .analysis-copy { + flex: 1; + } + .analysis-card h2 { + margin-bottom: 7px; + } + .analysis-card p { + margin: 0; + color: var(--learning-muted); + font-size: 13px; + line-height: 1.5; + } + .eyebrow { + margin: 0 0 6px !important; + color: var(--learning-purple-dark) !important; + font-size: 10px !important; + font-weight: 850; + letter-spacing: 0.09em; + text-transform: uppercase; + } + .retry-strip { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 12px; + padding: 11px 12px; + color: #7e2929; + background: #fff4f4; + border: 1px solid #efc7c7; + border-radius: 6px; + font-size: 11px; + } + .result-section { + margin-top: 14px; + } + .result-section-heading { + display: flex; + align-items: baseline; + gap: 6px; + margin-bottom: 10px; + } + .result-section-heading h2 { + margin: 0; + font-size: 14px; + } + .result-count { + color: #8c8d96; + font-size: 10px; + font-weight: 700; + } + .review-link { + margin-left: auto; + color: var(--learning-purple-dark); + font-size: 11px; + font-weight: 750; + text-decoration: none; + } + .quiet-link { + display: inline-flex; + margin-top: 12px; + color: var(--learning-purple-dark); + font-size: 11px; + font-weight: 750; + text-decoration: none; + } + .quiet-link:hover, + .review-link:hover { + text-decoration: underline; + } + .content-card { + overflow: hidden; + } + .empty-card { + padding: 24px; + color: var(--learning-muted); + background: #fbfbfd; + border: 1px solid var(--learning-line); + border-radius: 8px; + } + .empty-card.compact { + padding: 15px 16px; + } + .empty-card h3 { + margin: 0 0 6px; + color: var(--learning-ink); + font-size: 14px; + } + .empty-card p { + margin: 0; + font-size: 12px; + line-height: 1.5; + } + .active-skill { + padding: 16px; + } + .active-skill + .active-skill { + border-top: 1px solid var(--learning-line); + } + .active-skill h3 { + margin: 0 0 6px; + font-size: 14px; + } + .active-skill > p { + margin: 0; + color: var(--learning-muted); + font-size: 12px; + line-height: 1.45; + } + .skill-lineage { + margin-top: 10px; + padding: 10px 12px; + background: #f8f8fb; + border: 1px solid var(--learning-line); + border-radius: 6px; + } + .skill-lineage > span { + display: block; + margin-bottom: 5px; + color: #858690; + font-size: 9px; + font-weight: 800; + letter-spacing: 0.06em; + text-transform: uppercase; + } + .skill-lineage button { + display: flex; + width: 100%; + align-items: start; + justify-content: space-between; + gap: 14px; + padding: 0; + color: var(--learning-ink); + background: none; + border: 0; + text-align: left; + font-size: 11px; + font-weight: 700; + line-height: 1.4; + cursor: pointer; + } + .skill-lineage button small { + flex: 0 0 auto; + color: var(--learning-purple-dark); + font-size: 10px; + font-weight: 750; + } + .supporting-unavailable { + color: #858690; + font-size: 11px; + font-style: italic; + } + .skill-source { + margin-top: 10px; + } + .skill-source summary { + width: fit-content; + color: var(--learning-purple-dark); + cursor: pointer; + font-size: 11px; + font-weight: 750; + } + .skill-source pre { + margin: 10px 0 0; + padding: 12px; + color: #34353d; + background: var(--learning-soft); + border: 1px solid var(--learning-line); + border-radius: 6px; + font: + 11px/1.5 ui-monospace, + SFMono-Regular, + Menlo, + Monaco, + Consolas, + monospace; + white-space: pre-wrap; + overflow-wrap: anywhere; + } + .list-header { + display: flex; + align-items: center; + padding: 10px 14px; + color: #858690; + background: #f8f8fa; + border-bottom: 1px solid var(--learning-line); + font-size: 10px; + font-weight: 800; + letter-spacing: 0.06em; + text-transform: uppercase; + } + .list-header span:last-child { + margin-left: auto; + } + .insight-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 18px; + width: 100%; + padding: 16px; + color: inherit; + background: #fff; + border: 0; + border-bottom: 1px solid var(--learning-line); + text-align: left; + cursor: pointer; + } + .insight-row:last-child { + border-bottom: 0; + } + .insight-row:hover, + .insight-row[data-selected="true"] { + background: #fafaff; + } + .insight-row h3 { + margin: 0 0 6px; + font-size: 14px; + line-height: 1.35; + } + .insight-row p { + margin: 0; + color: var(--learning-muted); + font-size: 12px; + line-height: 1.45; + } + .evidence-count { + min-width: 90px; + color: var(--learning-purple-dark); + font-size: 11px; + font-weight: 750; + text-align: right; + } + .detail-panel { + margin-top: 14px; + padding: 18px; + background: #fafaff; + border: 1px solid #dcd9ff; + border-radius: 8px; + } + .detail-head { + display: flex; + align-items: start; + gap: 14px; + } + .detail-head div { + flex: 1; + } + .detail-head h3 { + margin: 0 0 5px; + font-size: 14px; + } + .detail-head p { + margin: 0; + color: var(--learning-muted); + font-size: 12px; + line-height: 1.45; + } + .close-detail { + width: 28px; + height: 28px; + color: #666771; + background: #fff; + border: 1px solid var(--learning-line); + border-radius: 5px; + cursor: pointer; + } + .evidence-list { + display: grid; + gap: 7px; + margin-top: 14px; + } + .evidence-link, + .evidence-unavailable { + display: flex; + align-items: center; + gap: 10px; + min-height: 38px; + padding: 10px; + color: #34353d; + background: #fff; + border: 1px solid var(--learning-line); + border-radius: 6px; + font-size: 11px; + text-align: left; + } + .evidence-link { + width: 100%; + cursor: pointer; + } + .evidence-link span { + margin-left: auto; + color: #898a93; + } + .evidence-unavailable { + color: #858690; + font-style: italic; + } + .pagination { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 8px; + margin-top: 10px; + } + .pagination span { + margin-right: auto; + color: var(--learning-muted); + font-size: 11px; + } + .pagination button { + min-height: 30px; + padding: 0 10px; + color: var(--learning-ink); + background: #fff; + border: 1px solid var(--learning-line); + border-radius: 5px; + font-size: 11px; + font-weight: 700; + cursor: pointer; + } + .pagination button:disabled { + color: #aaaab2; + background: #f6f6f8; + cursor: default; + } + .skeleton { + display: grid; + gap: 10px; + } + .skeleton span { + height: 74px; + background: linear-gradient(90deg, #eeeef2, #f8f8fa, #eeeef2); + background-size: 200% 100%; + border-radius: 8px; + animation: shimmer 1.3s infinite; + } + @keyframes shimmer { + to { + background-position: -200% 0; + } + } + .dialog-backdrop { + position: fixed; + z-index: 50; + inset: 0; + display: grid; + place-items: center; + padding: 24px; + background: rgba(15, 15, 20, 0.42); + } + .dialog { + display: flex; + width: min(620px, 100%); + max-height: min(680px, 90vh); + flex-direction: column; + background: #fff; + border: 1px solid #d9d9e1; + border-radius: 13px; + box-shadow: 0 22px 70px rgba(0, 0, 0, 0.22); + } + .dialog header { + display: flex; + align-items: start; + justify-content: space-between; + padding: 18px 19px 13px; + } + .dialog h2 { + margin: 0; + font-size: 16px; + } + .dialog header p { + margin: 4px 0 0; + color: #6d6d75; + font-size: 11px; + } + .dialog-close { + color: #777; + background: transparent; + border: 0; + font-size: 20px; + cursor: pointer; + } + .dialog pre { + max-height: 420px; + overflow: auto; + margin: 0 19px; + padding: 12px; + background: var(--learning-soft); + border: 1px solid var(--learning-line); + border-radius: 6px; + font: + 11px/1.5 ui-monospace, + SFMono-Regular, + Menlo, + monospace; + white-space: pre-wrap; + } + .dialog footer { + display: flex; + justify-content: flex-end; + gap: 8px; + padding: 14px 19px 18px; + } + .copy-error { + margin: 10px 19px 0; + color: #7e2929; + font-size: 11px; + } + @media (max-width: 900px) { + .steps { + grid-template-columns: 1fr; + } + .step { + min-height: auto; + } + } + @media (max-width: 640px) { + .pane-inner { + padding: 24px 18px 60px; + } + .analysis-row, + .collection-summary { + align-items: flex-start; + flex-wrap: wrap; + } + .insight-row { + grid-template-columns: 1fr; + gap: 8px; + } + .evidence-count { + text-align: left; + } + .review-link { + width: 100%; + margin: 4px 0 0; + } + } + `; + + private emit(name: string, detail?: unknown) { + this.dispatchEvent( + new CustomEvent(name, { detail, bubbles: true, composed: true }), + ); + } + + private externalLink( + url: string | null, + label: string, + className = "primary", + category: "learning" | "runs" | "candidates" = "learning", + ) { + return url + ? html` this.emit("learning-web-link", { category })} + >${label}` + : nothing; + } + + private openPrompt() { + this.promptOpen = true; + this.requestUpdate(); + } + + private setupPromptButton(label = "Copy the setup prompt") { + return html``; + } + + private renderSetupProgress( + mode: "setup" | "ready" | "running" | "attention", + ) { + const ready = mode === "ready"; + const running = mode === "running"; + const attention = mode === "attention"; + const completedSteps = ready || running ? 2 : 1; + const pendingThreads = ready ? (this.snapshot?.pendingThreadCount ?? 0) : 0; + const title = attention + ? "Learning setup needs attention" + : mode === "setup" + ? "Waiting for the first Thread" + : ready + ? "Threads ready to analyze" + : "Analysis is running in the web app."; + const container = + this.snapshot?.configuration.state === "configured" + ? this.snapshot.configuration.container + : null; + + return html`
+
+

Set up Learning

+ ${completedSteps} of 3 steps +
+ +
    +
  1. +
    ✓
    +

    Copy the setup prompt

    +

    Nice work. You’ve completed the first step.

    +
  2. +
  3. +
    + ${ready || running ? "✓" : "2"} + ${ + attention + ? html` + Needs attention + ` + : nothing + } +
    +

    Create your first Thread

    +

    Open Checkout Assistant and complete a conversation.

    +
  4. +
  5. +
    3
    +

    Analyze Threads

    +

    We'll find patterns and turn them into insights and skills

    +
  6. +
+
+
+

${title}

+ ${ + attention + ? html`` + : html`
+
+ ${pendingThreads} + New Threads +
+ ${ + ready || running + ? this.externalLink( + this.snapshot?.links.runs ?? null, + "Open in web app", + "primary setup-cta", + "runs", + ) + : html` + + ` + } +
` + } + ${ + attention + ? nothing + : html`
+ Technical details +
+
Container
+
${container?.id ?? "Waiting for setup"}
+
Status
+
+ ${ + ready + ? "Threads available" + : running + ? "Analysis running" + : "Waiting for first Thread" + } +
+
+
` + } +
+
+
+ Threads→Insights→Skills +
+
`; + } + + private renderPagination( + section: "skills" | "insights", + page: number, + totalPages: number, + ) { + if (totalPages <= 1) return nothing; + return html``; + } + + private renderEvidence(insight: InspectorLearningInsight) { + return html`
+
+
+

Evidence

+

${insight.statement}

+
+ +
+
+ ${ + insight.evidence.length === 0 + ? html` +
Evidence is no longer available
+ ` + : insight.evidence.map((evidence) => + evidence.status === "unavailable" + ? html` +
Evidence is no longer available
+ ` + : html``, + ) + } +
+ ${ + insight.evidenceTruncated + ? html` +

Evidence response shortened

+ ` + : nothing + } +
`; + } + + private selectInsight(insight: InspectorLearningInsight) { + this.selectedInsightId = insight.id; + this.emit("learning-evidence-opened"); + this.requestUpdate(); + } + + private supportingInsightLabel(statement: string): string { + const firstStop = statement.indexOf("."); + return firstStop === -1 ? statement : statement.slice(0, firstStop + 1); + } + + private renderSkills(snapshot: InspectorLearningSnapshotV1) { + const firstSkillId = snapshot.skillsPage.items[0]?.id ?? null; + const containerId = + snapshot.configuration.state === "configured" + ? snapshot.configuration.container.id + : ""; + const skillPageKey = `${snapshot.projectKey}|${containerId}|${snapshot.skillsPage.page}|${snapshot.skillsPage.items.map((skill) => skill.id).join(",")}`; + if (skillPageKey !== this.skillPageKey) { + this.skillPageKey = skillPageKey; + this.expandedSkillId = + snapshot.skillsPage.page === 1 ? firstSkillId : null; + } + return html`
+
+

Skills in registry

+ ${snapshot.skillsPage.total} + ${ + snapshot.pendingCandidateCount > 0 + ? this.externalLink( + snapshot.links.candidates, + `${snapshot.pendingCandidateCount} ${snapshot.pendingCandidateCount === 1 ? "Skill" : "Skills"} for review in web app ↗`, + "review-link", + "candidates", + ) + : nothing + } +
+ ${ + snapshot.skillsPage.items.length === 0 + ? html` +
+

No Skills in registry yet

+

+ No Insight has produced a Skill that was approved into the registry yet. +

+
+ ` + : html`
+ ${snapshot.skillsPage.items.map((skill) => { + const open = this.expandedSkillId === skill.id; + return html`
+

${skill.name}

+

${skill.description}

+
+ Supporting Insight + ${ + skill.sourceInsight + ? html`` + : html` +
Supporting Insight unavailable
+ ` + } +
+
{ + const nextOpen = (event.currentTarget as HTMLDetailsElement) + .open; + if (nextOpen === open) return; + this.expandedSkillId = nextOpen ? skill.id : ""; + this.emit("learning-skill-toggle", { + action: nextOpen ? "expanded" : "collapsed", + }); + this.requestUpdate(); + }} + > + View SKILL.md +
${skill.skillMd}
+
+
`; + })} +
` + } + ${this.renderPagination( + "skills", + snapshot.skillsPage.page, + snapshot.skillsPage.totalPages, + )} +
`; + } + + private renderInsights(snapshot: InspectorLearningSnapshotV1) { + const selected = snapshot.insightsPage.items.find( + (insight) => insight.id === this.selectedInsightId, + ); + return html`
+
+

+ ${snapshot.skillsPage.total > 0 ? "More Insights" : "Insights"} +

+ ${snapshot.insightsPage.total} +
+ ${ + snapshot.insightsPage.items.length === 0 + ? html` +

No active Insights

+ ` + : html`
+
+ PatternEvidence +
+ ${snapshot.insightsPage.items.map( + (insight) => html``, + )} +
` + } + ${selected ? this.renderEvidence(selected) : nothing} + ${this.renderPagination( + "insights", + snapshot.insightsPage.page, + snapshot.insightsPage.totalPages, + )} +
`; + } + + private renderResults(snapshot: InspectorLearningSnapshotV1) { + const sourceInsight = snapshot.skillsPage.items + .map((skill) => skill.sourceInsight) + .find((insight) => insight?.id === this.selectedInsightId); + return html` + ${ + snapshot.pendingThreadCount > 0 + ? html`
+
+
+

Find new Insights and Skills

+

You have new threads ready to be analyzed.

+
+ ${this.externalLink( + snapshot.links.runs, + "Open in web app", + "primary results-cta", + "runs", + )} +
+
` + : nothing + } + ${ + this.error + ? html`
+ ${this.error} + +
` + : nothing + } + ${this.renderSkills(snapshot)} + ${sourceInsight ? this.renderEvidence(sourceInsight) : nothing} + ${this.renderInsights(snapshot)} + `; + } + + private renderEmptyResults(snapshot: InspectorLearningSnapshotV1) { + return html`
+
+
+

Analysis complete

+

No new Insights or Skills

+

+ Create more Threads with Checkout Assistant. You can run Learning + again when new Threads are available. +

+
+
+
+
+
+

Skills in registry

0 +
+
+

No Skills from this analysis

+

Learning did not generate a Skill for review.

+
+
+
+
+

Insights

0 +
+
+

No Insights from this analysis

+

Learning did not find a useful pattern in these Threads.

+
+
+ ${this.externalLink( + snapshot.links.learning, + "Open in web app ↗", + "quiet-link", + "learning", + )}`; + } + + private renderCompactState(input: { + readonly title: string; + readonly copy?: string; + readonly action?: unknown; + readonly error?: boolean; + }) { + return html`
+
+
+

${input.title}

+ ${input.copy ? html`

${input.copy}

` : nothing} +
+ ${input.action ?? nothing} +
+
`; + } + + render() { + const state = deriveLearningViewState({ + supported: this.supported, + loading: this.loading, + error: this.error, + snapshot: this.snapshot, + setupActive: this.setupActive, + }); + let content: unknown; + if (state === "unsupported") { + content = this.renderCompactState({ + title: "Learning is not available with this runtime version.", + }); + } else if (state === "loading") { + content = html` +
+ +
+ `; + } else if (state === "error") { + content = this.renderCompactState({ + title: "Learning data is unavailable", + copy: this.error ?? undefined, + error: true, + action: html``, + }); + } else if (state === "selection_required") { + content = this.renderCompactState({ + title: "Inspector cannot choose a Learning container for this agent.", + action: this.externalLink( + this.snapshot!.links.learning, + "Open in web app", + "primary", + "learning", + ), + }); + } else if (state === "invalid") { + content = this.renderSetupProgress("attention"); + } else if (state === "landing") { + // The parent Inspector preserves the existing locked-feature marketing + // surface for Landing. The v5 pane begins only after its copy action. + content = nothing; + } else if (state === "setup") { + content = this.renderSetupProgress("setup"); + } else if (state === "first_run") { + content = this.renderSetupProgress("running"); + } else if (state === "ready") { + content = this.renderSetupProgress("ready"); + } else if (state === "empty") { + content = this.renderEmptyResults(this.snapshot!); + } else { + content = this.renderResults(this.snapshot!); + } + + return html`
+
+
+

Learning

+

Your Agent learns from conversations and improves over time.

+
+ ${ + this.refreshing + ? html` + Refreshing + ` + : nothing + } +
+ ${content} +
+ ${ + this.promptOpen + ? html`
+ +
` + : nothing + }`; + } +} + +if (!customElements.get("cpk-learning-view")) { + customElements.define("cpk-learning-view", CpkLearningView); +} diff --git a/packages/web-inspector/src/index.ts b/packages/web-inspector/src/index.ts index 3cc27dcafd..79d5523553 100644 --- a/packages/web-inspector/src/index.ts +++ b/packages/web-inspector/src/index.ts @@ -36,6 +36,9 @@ import type { RuntimeLicenseStatus, } from "@copilotkit/core"; import type { AbstractAgent, AgentSubscriber, Message } from "@ag-ui/client"; +import type { InspectorLearningSnapshotV1 } from "@copilotkit/shared"; +import { deriveLearningViewState } from "./components/learning-view.js"; +import type { LearningViewState } from "./components/learning-view.js"; import type { Anchor, ContextKey, @@ -70,6 +73,18 @@ import { isValidDockMode, } from "./lib/persistence.js"; import type { PersistedState } from "./lib/persistence.js"; +import { + clearLearningSetupMarker, + learningSetupMarkerMatches, + readLearningSetupMarker, + subscribeToLearningSetupMarker, + writeLearningSetupMarker, +} from "./lib/learning-setup.js"; +import type { LearningSetupMarker } from "./lib/learning-setup.js"; +import { + fetchInspectorLearning, + InspectorLearningUnsupportedError, +} from "./lib/inspector-learning.js"; import { buildPopOutFeatures, ensureBrandFont, @@ -114,6 +129,15 @@ import { trackHomeStoryBeatSelected, trackHomeViewed, trackInspectorOpened, + learningCountBucket, + learningDurationBucket, + trackLearningEvidenceOpened, + trackLearningPageChanged, + trackLearningPaneViewed, + trackLearningSetupPromptClicked, + trackLearningSkillToggled, + trackLearningSnapshotLoaded, + trackLearningWebAppOpened, trackMetadataActionClicked, trackMetadataModuleViewed, trackTalkToEngineerClicked, @@ -6445,6 +6469,21 @@ export class WebInspectorElement extends LitElement { // SDK). Distinct from `_memoriesAvailable` (memory not enabled on an // otherwise-current deployment) so the teaser can show upgrade-the-SDK copy. private _memoryStoreUnsupported = false; + private learningSnapshot: InspectorLearningSnapshotV1 | null = null; + private learningSnapshotScope: string | null = null; + private learningProjectIdentity: string | null = null; + private learningLoading = false; + private learningRefreshing = false; + private learningError: string | null = null; + private learningSupported = false; + private learningRequestGeneration = 0; + private learningAbortController: AbortController | null = null; + private learningPollTimer: ReturnType | null = null; + private learningPollFailureCount = 0; + private learningSetupMarker: LearningSetupMarker | null = null; + private learningSetupUnsubscribe: (() => void) | null = null; + private learningPromptCopyState: "idle" | "copied" | "error" = "idle"; + private learningViewedState: LearningViewState | null = null; // ── Semantic recall (B3) ────────────────────────────────────────────── // `null` = no recall run yet (section hidden). `[]` = ran, no matches. private _recallResults: Memory[] | null = null; @@ -7217,6 +7256,14 @@ export class WebInspectorElement extends LitElement { this._threadsByAgent.set(agentId, threads as ɵThread[]); this.rebuildFlattenedThreads(); this.autoSelectLatestThread(); + if ( + this.selectedMenu === "memories" && + this.shouldPollLearningSetup() && + !this.learningLoading && + !this.learningRefreshing + ) { + void this.refreshLearningSnapshot({ preserve: true }); + } this.requestUpdate(); }); const statusSub = store @@ -7505,6 +7552,10 @@ export class WebInspectorElement extends LitElement { this.updateInspectorMetadataProjection( this.readCoreInspectorMetadata(core), ); + this.learningSupported = core.inspectorLearning; + this.learningProjectIdentity = JSON.stringify( + this.inspectorMetadataProjection.identity ?? null, + ); this.coreSubscriber = { onRuntimeConnectionStatusChanged: ({ status }) => { @@ -7514,11 +7565,16 @@ export class WebInspectorElement extends LitElement { this.threadCapabilityEnabled === true; this.synchronizeThreadCapability(); if (status === "connected") { + this.learningSupported = core.inspectorLearning; if (!core.telemetryDisabled) { ensureTelemetryDistinctId(); maybeShowDisclosure(); } this.flushPendingWhatsNewTelemetry(); + if (this.isOpen && this.selectedMenu === "memories") { + this.clearLearningSnapshot(); + void this.refreshLearningSnapshot({ preserve: false }); + } if ( threadCapabilityWasEnabled && this.areThreadEndpointsAvailable() @@ -7532,6 +7588,7 @@ export class WebInspectorElement extends LitElement { this._threadsByAgent.clear(); this._threads = []; this.clearInspectorUsageRefresh(); + this.clearLearningSnapshot(); } this.requestUpdate(); }, @@ -7550,6 +7607,16 @@ export class WebInspectorElement extends LitElement { return; } this.updateInspectorMetadataProjection(inspectorMetadata); + const identity = JSON.stringify( + this.inspectorMetadataProjection.identity ?? null, + ); + if (identity !== this.learningProjectIdentity) { + this.learningProjectIdentity = identity; + this.clearLearningSnapshot(); + if (this.isOpen && this.selectedMenu === "memories") { + void this.refreshLearningSnapshot({ preserve: false }); + } + } this.requestUpdate(); }, } @@ -7770,6 +7837,375 @@ export class WebInspectorElement extends LitElement { this.requestUpdate(); } + private getLearningAgentId(): string | null { + if ( + this.selectedContext !== "all-agents" && + this.core?.agents[this.selectedContext] + ) { + return this.selectedContext; + } + // `all-agents` is intentionally unscoped. Choosing the first object key + // silently binds Learning to whichever agent happened to be enumerated + // first and can select the wrong container. Omit agentId so Intelligence + // applies its deterministic sole-container / selection-required rules. + return null; + } + + private isLearningSetupActive(): boolean { + const runtimeUrl = this.core?.runtimeUrl; + if (!runtimeUrl) return false; + return learningSetupMarkerMatches( + this.learningSetupMarker, + runtimeUrl, + this.getLearningAgentId(), + ); + } + + private trackLearningViewState(): void { + if ( + !this.isOpen || + this.selectedMenu !== "memories" || + this.core?.telemetryDisabled + ) { + return; + } + const state = deriveLearningViewState({ + supported: this.learningSupported, + loading: this.learningLoading, + error: this.learningError, + snapshot: this.learningSnapshot, + setupActive: this.isLearningSetupActive(), + }); + if (state === this.learningViewedState) return; + this.learningViewedState = state; + trackLearningPaneViewed({ state }); + } + + private cancelLearningPoll(): void { + if (this.learningPollTimer !== null) { + clearTimeout(this.learningPollTimer); + this.learningPollTimer = null; + } + } + + private shouldPollLearningSetup(): boolean { + if ( + !this.isOpen || + this.selectedMenu !== "memories" || + document.visibilityState !== "visible" || + !this.learningSupported + ) { + return false; + } + const snapshot = this.learningSnapshot; + if (!snapshot) return this.isLearningSetupActive(); + if (snapshot.configuration.state === "not_configured") { + return this.isLearningSetupActive(); + } + return ( + snapshot.configuration.state === "configured" && + !snapshot.run.hasEverSucceeded && + !snapshot.run.hasActiveRun && + snapshot.pendingThreadCount === 0 && + snapshot.skillsPage.total === 0 && + snapshot.insightsPage.total === 0 + ); + } + + private scheduleLearningPoll(): void { + this.cancelLearningPoll(); + if (!this.shouldPollLearningSetup()) return; + const delay = + this.learningPollFailureCount === 0 + ? 5_000 + : this.learningPollFailureCount === 1 + ? 10_000 + : 30_000; + this.learningPollTimer = setTimeout(() => { + this.learningPollTimer = null; + void this.refreshLearningSnapshot({ preserve: true }); + }, delay); + } + + private clearLearningSnapshot(): void { + this.learningRequestGeneration += 1; + this.learningAbortController?.abort(); + this.learningAbortController = null; + this.learningSnapshot = null; + this.learningSnapshotScope = null; + this.learningError = null; + this.learningLoading = false; + this.learningRefreshing = false; + this.cancelLearningPoll(); + } + + private refreshLearningSnapshot = async ( + options: { + preserve?: boolean; + skillsPage?: number; + insightsPage?: number; + } = {}, + ): Promise => { + const core = this.core; + const runtimeUrl = core?.runtimeUrl; + this.learningSupported = Boolean(core?.inspectorLearning); + if (!core || !runtimeUrl || !this.learningSupported) { + this.clearLearningSnapshot(); + this.requestUpdate(); + this.trackLearningViewState(); + return; + } + this.cancelLearningPoll(); + const startedAt = performance.now(); + let loadOutcome: "success" | "unsupported" | "failure" = "failure"; + let loadedSkills = 0; + let loadedInsights = 0; + let loadedPendingThreads = 0; + let resetSkillsPage = false; + let resetInsightsPage = false; + const previousSnapshot = this.learningSnapshot; + const agentId = this.getLearningAgentId(); + const requestContext = `${runtimeUrl.replace(/\/+$/u, "")}|${agentId ?? ""}`; + if ( + this.learningSnapshotScope && + !this.learningSnapshotScope.startsWith(`${requestContext}|`) + ) { + this.clearLearningSnapshot(); + } + const generation = ++this.learningRequestGeneration; + this.learningAbortController?.abort(); + const controller = new AbortController(); + this.learningAbortController = controller; + const preserve = + options.preserve === true && this.learningSnapshot !== null; + this.learningLoading = !preserve; + this.learningRefreshing = preserve; + this.learningError = null; + this.requestUpdate(); + try { + const snapshot = await fetchInspectorLearning({ + runtimeUrl, + runtimeTransport: core.runtimeTransport, + request: { + ...(agentId ? { agentId } : {}), + skillsPage: + options.skillsPage ?? this.learningSnapshot?.skillsPage.page ?? 1, + insightsPage: + options.insightsPage ?? + this.learningSnapshot?.insightsPage.page ?? + 1, + }, + fetch: core.ɵruntimeFetch, + headers: core.headers, + credentials: core.credentials, + signal: controller.signal, + }); + if (generation !== this.learningRequestGeneration) return; + if ( + (snapshot.pendingThreadCount > 0 && !snapshot.links.runs) || + (snapshot.pendingCandidateCount > 0 && !snapshot.links.candidates) + ) { + throw new Error( + "Learning snapshot is missing a required web-app link.", + ); + } + const containerId = + snapshot.configuration.state === "configured" + ? snapshot.configuration.container.id + : ""; + const previousContainerId = + previousSnapshot?.configuration.state === "configured" + ? previousSnapshot.configuration.container.id + : ""; + const scopeChanged = + previousSnapshot !== null && + (previousSnapshot.projectKey !== snapshot.projectKey || + previousContainerId !== containerId); + const isBackgroundRefresh = + options.skillsPage === undefined && options.insightsPage === undefined; + resetSkillsPage = Boolean( + isBackgroundRefresh && + previousSnapshot && + previousSnapshot.skillsPage.page > 1 && + (scopeChanged || + JSON.stringify([ + previousSnapshot.skillsPage.total, + previousSnapshot.skillsPage.items.map((skill) => [ + skill.id, + skill.revision, + ]), + ]) !== + JSON.stringify([ + snapshot.skillsPage.total, + snapshot.skillsPage.items.map((skill) => [ + skill.id, + skill.revision, + ]), + ])), + ); + resetInsightsPage = Boolean( + isBackgroundRefresh && + previousSnapshot && + previousSnapshot.insightsPage.page > 1 && + (scopeChanged || + JSON.stringify([ + previousSnapshot.insightsPage.total, + previousSnapshot.insightsPage.items.map((insight) => insight.id), + ]) !== + JSON.stringify([ + snapshot.insightsPage.total, + snapshot.insightsPage.items.map((insight) => insight.id), + ])), + ); + this.learningSnapshot = snapshot; + loadOutcome = "success"; + loadedSkills = snapshot.skillsPage.total; + loadedInsights = snapshot.insightsPage.total; + loadedPendingThreads = snapshot.pendingThreadCount; + this.learningSnapshotScope = `${requestContext}|${snapshot.projectKey}|${containerId}`; + this.learningError = null; + this.learningPollFailureCount = 0; + const setupConfirmed = + snapshot.pendingThreadCount > 0 || + snapshot.run.hasActiveRun || + snapshot.run.hasEverSucceeded || + snapshot.pendingCandidateCount > 0 || + snapshot.skillsPage.total > 0 || + snapshot.insightsPage.total > 0; + if (snapshot.configuration.state === "configured" && setupConfirmed) { + clearLearningSetupMarker(); + this.learningSetupMarker = null; + } + } catch (error) { + if ( + generation !== this.learningRequestGeneration || + controller.signal.aborted + ) + return; + if (error instanceof InspectorLearningUnsupportedError) { + loadOutcome = "unsupported"; + this.learningSupported = false; + this.learningSnapshot = null; + } else { + this.learningError = + error instanceof Error + ? error.message + : "Learning data is unavailable."; + this.learningPollFailureCount += 1; + } + } finally { + if (generation === this.learningRequestGeneration) { + this.learningLoading = false; + this.learningRefreshing = false; + this.learningAbortController = null; + if (!core.telemetryDisabled) { + trackLearningSnapshotLoaded({ + outcome: loadOutcome, + duration_bucket: learningDurationBucket( + performance.now() - startedAt, + ), + skills_bucket: learningCountBucket(loadedSkills), + insights_bucket: learningCountBucket(loadedInsights), + pending_threads_bucket: learningCountBucket(loadedPendingThreads), + }); + } + this.scheduleLearningPoll(); + this.requestUpdate(); + this.trackLearningViewState(); + if (resetSkillsPage || resetInsightsPage) { + void this.refreshLearningSnapshot({ + preserve: true, + ...(resetSkillsPage ? { skillsPage: 1 } : {}), + ...(resetInsightsPage ? { insightsPage: 1 } : {}), + }); + } + } + } + }; + + private copyFeaturePromptToClipboard = async ( + service: HomeFeaturePromptTarget, + event?: Event, + onboardingRunId = createOnboardingRunId(), + ): Promise => { + const clipboard = this.getClipboard(event); + if (!clipboard?.writeText) return false; + try { + await clipboard.writeText( + homeFeatureImplementationPrompt(service, { + onboardingRunId, + }), + ); + return true; + } catch { + return false; + } + }; + + private handleLearningSetupCopy = async (event?: Event): Promise => { + const service = this.getHomeFeaturePromptTarget("threads"); + if (!service || !this.core?.runtimeUrl) return; + const copied = await this.copyFeaturePromptToClipboard( + service, + event, + this.getOnboardingRunId(), + ); + if (!this.core.telemetryDisabled) { + trackLearningSetupPromptClicked({ + outcome: copied ? "success" : "failure", + }); + } + if (!copied) { + this.learningPromptCopyState = "error"; + this.requestUpdate(); + return; + } + this.learningPromptCopyState = "copied"; + this.learningSetupMarker = writeLearningSetupMarker({ + runtimeUrl: this.core.runtimeUrl, + agentId: this.getLearningAgentId(), + }); + this.selectedMenu = "memories"; + this.persistState(); + this.requestUpdate(); + void this.refreshLearningSnapshot({ preserve: false }); + }; + + private handleLearningPage = ( + event: CustomEvent<{ + section: "skills" | "insights"; + page: number; + }>, + ): void => { + const { section, page } = event.detail; + const currentPage = + section === "skills" + ? (this.learningSnapshot?.skillsPage.page ?? 1) + : (this.learningSnapshot?.insightsPage.page ?? 1); + if (!this.core?.telemetryDisabled) { + trackLearningPageChanged({ + section, + direction: page < currentPage ? "previous" : "next", + }); + } + void this.refreshLearningSnapshot({ + preserve: true, + ...(section === "skills" ? { skillsPage: page } : { insightsPage: page }), + }); + }; + + private handleLearningEvidence = ( + event: CustomEvent<{ + threadId: string; + messageId?: string; + }>, + ): void => { + this.focusThread({ + threadId: event.detail.threadId, + ...(event.detail.messageId ? { messageId: event.detail.messageId } : {}), + }); + }; + private detachFromCore(): void { this.threadCapabilityGeneration += 1; this.threadCapabilityEnabled = null; @@ -7800,6 +8236,8 @@ export class WebInspectorElement extends LitElement { this._recallLoading = false; this._recallError = null; this._recallQuery = ""; + this.clearLearningSnapshot(); + this.learningSupported = false; this.coreSubscriber = null; this.runtimeStatus = null; this.cancelThreadRefreshDebounce(); @@ -7835,6 +8273,7 @@ export class WebInspectorElement extends LitElement { private processAgentsChanged( agents: Readonly>, ): void { + const previousLearningAgentId = this.getLearningAgentId(); this.synchronizeThreadCapability(); const seenAgentIds = new Set(); @@ -7861,6 +8300,30 @@ export class WebInspectorElement extends LitElement { } this.updateContextOptions(seenAgentIds); + const learningAgentId = this.getLearningAgentId(); + if ( + learningAgentId && + this.core?.runtimeUrl && + this.learningSetupMarker?.agentId === null && + learningSetupMarkerMatches( + this.learningSetupMarker, + this.core.runtimeUrl, + null, + ) + ) { + this.learningSetupMarker = writeLearningSetupMarker({ + runtimeUrl: this.core.runtimeUrl, + agentId: learningAgentId, + }); + } + if ( + previousLearningAgentId !== learningAgentId && + this.isOpen && + this.selectedMenu === "memories" + ) { + this.clearLearningSnapshot(); + void this.refreshLearningSnapshot({ preserve: false }); + } this.refreshToolsSnapshot(); this.requestUpdate(); } @@ -10876,6 +11339,14 @@ export class WebInspectorElement extends LitElement { // Load state early (before first render) so menu selection is correct this.hydrateStateFromStorageEarly(); + this.learningSetupMarker = readLearningSetupMarker(); + this.learningSetupUnsubscribe = subscribeToLearningSetupMarker( + (marker) => { + this.learningSetupMarker = marker; + this.requestUpdate(); + this.scheduleLearningPoll(); + }, + ); this.refreshInspectorDismissalState(); this.subscribeToSystemColorScheme(); this.exampleTourDismissed = this.readThreadsExampleTourDismissed(); @@ -10908,6 +11379,15 @@ export class WebInspectorElement extends LitElement { ) { this.flushPendingSignalPulse(); } + if ( + document.visibilityState === "visible" && + this.isOpen && + this.selectedMenu === "memories" + ) { + void this.refreshLearningSnapshot({ preserve: true }); + } else { + this.cancelLearningPoll(); + } this.requestUpdate(); }; @@ -10938,6 +11418,9 @@ export class WebInspectorElement extends LitElement { } this.clearIconRailContextCloseTimer(); this.unsubscribeFromInspectorThreadBridge(); + this.learningSetupUnsubscribe?.(); + this.learningSetupUnsubscribe = null; + this.clearLearningSnapshot(); this.stopIntelligenceStory(); this.clearIntelligencePromptReset(); this.homeFeaturePromptCopyGeneration += 1; @@ -12909,20 +13392,11 @@ export class WebInspectorElement extends LitElement { }); } - const clipboard = this.getClipboard(event); - if (!clipboard?.writeText) { - this.showHomeFeaturePromptCopyState(service.id, "error", generation); - return; - } - - try { - await clipboard.writeText( - homeFeatureImplementationPrompt(service, { - onboardingRunId, - }), - ); + if ( + await this.copyFeaturePromptToClipboard(service, event, onboardingRunId) + ) { this.showHomeFeaturePromptCopyState(service.id, "copied", generation); - } catch { + } else { this.showHomeFeaturePromptCopyState(service.id, "error", generation); } }; @@ -12938,13 +13412,18 @@ export class WebInspectorElement extends LitElement { private renderFeatureSetupPrompt( serviceId: HomeFeaturePromptId, className: string, + options?: Readonly<{ + copyState?: HomeFeaturePromptCopyState; + onClick?: (event: Event) => void; + }>, ): TemplateResult | typeof nothing { const service = this.getHomeFeaturePromptTarget(serviceId); if (!service) return nothing; const copyState = - this.homeFeaturePromptCopyState?.serviceId === service.id + options?.copyState ?? + (this.homeFeaturePromptCopyState?.serviceId === service.id ? this.homeFeaturePromptCopyState.state - : "idle"; + : "idle"); const label = copyState === "copied" ? "Copied" @@ -12968,7 +13447,9 @@ export class WebInspectorElement extends LitElement { : `Copy setup prompt for ${service.label}` } @click=${(event: Event) => - this.handleHomeFeaturePromptCopy(service, event)} + options?.onClick + ? options.onClick(event) + : this.handleHomeFeaturePromptCopy(service, event)} > ${this.renderIcon(copyState === "copied" ? "Check" : "Copy")} ${label} @@ -14884,6 +15365,11 @@ export class WebInspectorElement extends LitElement { this.ensureAnnouncementLoading(); this.isOpen = true; + if (this.selectedMenu === "memories") { + void this.refreshLearningSnapshot({ + preserve: this.learningSnapshot !== null, + }); + } // The launcher is gone, so its gesture is gone with it — and the slot it // was holding is free again for whatever beats after the panel closes. this.cancelGestureTail(); @@ -14927,6 +15413,9 @@ export class WebInspectorElement extends LitElement { } this.isOpen = false; + this.cancelLearningPoll(); + this.learningAbortController?.abort(); + this.learningViewedState = null; // Remove docking styles when closing if (this.dockMode !== "floating") { @@ -17585,6 +18074,7 @@ export class WebInspectorElement extends LitElement { videoUrl, videoTitle, outlineItems, + setupPrompt, }: { serviceId: HomeFeaturePromptId; featureName: string; @@ -17593,6 +18083,11 @@ export class WebInspectorElement extends LitElement { videoUrl: string; videoTitle: string; outlineItems: ReadonlyArray; + setupPrompt?: Readonly<{ + serviceId: HomeFeaturePromptId; + copyState: HomeFeaturePromptCopyState; + onClick: (event: Event) => void; + }>; }) { return html`
${description}

${this.renderFeatureSetupPrompt( - serviceId, + setupPrompt?.serviceId ?? serviceId, "inspector-account-cta cpk-locked-feature-setup-cta", + setupPrompt + ? { + copyState: setupPrompt.copyState, + onClick: setupPrompt.onClick, + } + : undefined, )} void this.handleLearningSetupCopy(event), + }, + }); + } + return html` + + this.refreshLearningSnapshot({ + preserve: this.learningSnapshot !== null, + })} + @learning-copy-setup=${(event: Event) => + this.handleLearningSetupCopy(event)} + @learning-page=${(event: CustomEvent) => + this.handleLearningPage( + event as CustomEvent<{ + section: "skills" | "insights"; + page: number; + }>, + )} + @learning-open-evidence=${(event: CustomEvent) => + this.handleLearningEvidence( + event as CustomEvent<{ + threadId: string; + messageId?: string; + }>, + )} + @learning-evidence-opened=${() => { + if (!this.core?.telemetryDisabled) trackLearningEvidenceOpened(); + }} + @learning-skill-toggle=${( + event: CustomEvent<{ action: "expanded" | "collapsed" }>, + ) => { + if (!this.core?.telemetryDisabled) { + trackLearningSkillToggled({ action: event.detail.action }); + } + }} + @learning-web-link=${( + event: CustomEvent<{ + category: "learning" | "runs" | "candidates"; + }>, + ) => { + if (!this.core?.telemetryDisabled) { + trackLearningWebAppOpened({ category: event.detail.category }); + } + }} + > + `; + } + + /** Legacy Memory rendering kept isolated while published Memory APIs remain. */ + private renderLegacyMemoriesView() { // Once the user enters Learning, its lazy subscription is the capability // probe. Preserve the loading state while that request is in flight, then // let an unavailable response fall through to the setup gate. @@ -19274,13 +19861,19 @@ export class WebInspectorElement extends LitElement { } if (key === "memories") { - // Lazily create + subscribe to the memory store on first activation. This - // is the only place that touches getMemoryStore(), so the store/realtime - // are never started just by attaching the inspector. - this.ensureMemorySubscription(); + this.learningSupported = Boolean(this.core?.inspectorLearning); + if (previousMenu !== "memories" || this.learningSnapshot === null) { + void this.refreshLearningSnapshot({ + preserve: previousMenu === "memories", + }); + } if (previousMenu !== "memories" && !this.core?.telemetryDisabled) { trackMemoriesTabClicked(this.getMemoriesTelemetryProps()); } + } else if (previousMenu === "memories") { + this.learningViewedState = null; + this.cancelLearningPoll(); + this.learningAbortController?.abort(); } if (key === "home" && previousMenu !== "home") { @@ -19390,6 +19983,9 @@ export class WebInspectorElement extends LitElement { this.autoSelectLatestThread(); if (this.selectedMenu === "playground") { this.startPlaygroundSession(false); + } else if (this.selectedMenu === "memories") { + this.clearLearningSnapshot(); + void this.refreshLearningSnapshot({ preserve: false }); } } diff --git a/packages/web-inspector/src/lib/__tests__/telemetry.test.ts b/packages/web-inspector/src/lib/__tests__/telemetry.test.ts index 50acf7493d..93701730a4 100644 --- a/packages/web-inspector/src/lib/__tests__/telemetry.test.ts +++ b/packages/web-inspector/src/lib/__tests__/telemetry.test.ts @@ -512,10 +512,10 @@ describe("event catalogue", () => { ]); }); - it("holds twenty-eight event names, all under the owned oss.inspector prefix", () => { + it("holds thirty-five event names, all under the owned oss.inspector prefix", () => { const names = Object.values(TELEMETRY_EVENTS) as string[]; - expect(names).toHaveLength(28); + expect(names).toHaveLength(35); expect(names).toContain("oss.inspector.home_feature_prompt_clicked"); expect(names.filter((name) => !name.startsWith("oss.inspector."))).toEqual( [], diff --git a/packages/web-inspector/src/lib/inspector-learning.spec.ts b/packages/web-inspector/src/lib/inspector-learning.spec.ts new file mode 100644 index 0000000000..4f33972784 --- /dev/null +++ b/packages/web-inspector/src/lib/inspector-learning.spec.ts @@ -0,0 +1,95 @@ +import { describe, expect, it, vi } from "vitest"; +import { + fetchInspectorLearning, + InspectorLearningUnsupportedError, +} from "./inspector-learning.js"; + +const snapshot = { + schemaVersion: 1, + projectKey: "project-safe-key", + snapshotVersion: "snapshot-1", + webAppOrigin: "https://app.copilotkit.ai", + configuration: { state: "not_configured" }, + pendingThreadCount: 0, + run: { hasActiveRun: false, hasEverSucceeded: false, latest: null }, + pendingCandidateCount: 0, + skillsPage: { + page: 1, + pageSize: 3, + total: 0, + totalPages: 0, + items: [], + }, + insightsPage: { + page: 1, + pageSize: 4, + total: 0, + totalPages: 0, + items: [], + }, + links: { + learning: "https://app.copilotkit.ai/learning", + candidates: null, + runs: null, + }, +}; + +describe("fetchInspectorLearning", () => { + it("uses the REST route with runtime auth options", async () => { + const fetch = vi.fn().mockResolvedValue(Response.json(snapshot)); + await fetchInspectorLearning({ + runtimeUrl: "https://runtime.example/api/copilotkit/", + runtimeTransport: "rest", + request: { agentId: "support", skillsPage: 2 }, + fetch, + headers: { Authorization: "Bearer host-session" }, + credentials: "include", + }); + + expect(fetch).toHaveBeenCalledWith( + "https://runtime.example/api/copilotkit/inspector-learning?agentId=support&skillsPage=2", + expect.objectContaining({ + method: "GET", + headers: { Authorization: "Bearer host-session" }, + credentials: "include", + }), + ); + }); + + it("uses the single endpoint envelope and maps 404 to unsupported", async () => { + const fetch = vi.fn().mockResolvedValue(Response.json(snapshot)); + await fetchInspectorLearning({ + runtimeUrl: "https://runtime.example/api/copilotkit", + runtimeTransport: "single", + request: { insightsPage: 3 }, + fetch, + }); + expect(fetch.mock.calls[0]?.[0]).toBe( + "https://runtime.example/api/copilotkit", + ); + expect(JSON.parse(String(fetch.mock.calls[0]?.[1]?.body))).toEqual({ + method: "inspector/learning", + params: { insightsPage: "3" }, + }); + + await expect( + fetchInspectorLearning({ + runtimeUrl: "https://runtime.example/api/copilotkit", + runtimeTransport: "rest", + request: {}, + fetch: vi.fn().mockResolvedValue(new Response(null, { status: 404 })), + }), + ).rejects.toBeInstanceOf(InspectorLearningUnsupportedError); + }); + + it("rejects an invalid response at the browser boundary", async () => { + await expect( + fetchInspectorLearning({ + runtimeUrl: "https://runtime.example/api/copilotkit", + runtimeTransport: "rest", + request: {}, + fetch: vi.fn().mockResolvedValue(Response.json({ schemaVersion: 999 })), + }), + ).rejects.toThrow("response is invalid"); + }); +}); diff --git a/packages/web-inspector/src/lib/inspector-learning.ts b/packages/web-inspector/src/lib/inspector-learning.ts new file mode 100644 index 0000000000..7cdb10aea9 --- /dev/null +++ b/packages/web-inspector/src/lib/inspector-learning.ts @@ -0,0 +1,51 @@ +import { parseInspectorLearningSnapshotV1 } from "@copilotkit/shared"; +import type { + InspectorLearningRequestV1, + InspectorLearningSnapshotV1, +} from "@copilotkit/shared"; + +export class InspectorLearningUnsupportedError extends Error {} + +/** Loads one Learning projection through either negotiated Runtime transport. */ +export async function fetchInspectorLearning(input: { + readonly runtimeUrl: string; + readonly runtimeTransport: "rest" | "single" | "auto"; + readonly request: InspectorLearningRequestV1; + readonly fetch: typeof globalThis.fetch; + readonly headers?: Readonly>; + readonly credentials?: RequestCredentials; + readonly signal?: AbortSignal; +}): Promise { + const base = input.runtimeUrl.replace(/\/+$/u, ""); + const single = input.runtimeTransport === "single"; + const url = single ? base : `${base}/inspector-learning`; + const query = new URLSearchParams(); + if (input.request.agentId) query.set("agentId", input.request.agentId); + if (input.request.skillsPage) + query.set("skillsPage", String(input.request.skillsPage)); + if (input.request.insightsPage) { + query.set("insightsPage", String(input.request.insightsPage)); + } + const response = await input.fetch(single ? url : `${url}?${query}`, { + method: single ? "POST" : "GET", + headers: single + ? { ...input.headers, "Content-Type": "application/json" } + : { ...input.headers }, + credentials: input.credentials, + signal: input.signal, + ...(single + ? { + body: JSON.stringify({ + method: "inspector/learning", + params: Object.fromEntries(query), + }), + } + : {}), + }); + if (response.status === 404) throw new InspectorLearningUnsupportedError(); + if (!response.ok) + throw new Error(`Learning snapshot failed (HTTP ${response.status}).`); + const snapshot = parseInspectorLearningSnapshotV1(await response.json()); + if (!snapshot) throw new Error("Learning snapshot response is invalid."); + return snapshot; +} diff --git a/packages/web-inspector/src/lib/learning-setup.spec.ts b/packages/web-inspector/src/lib/learning-setup.spec.ts new file mode 100644 index 0000000000..271d5a3a68 --- /dev/null +++ b/packages/web-inspector/src/lib/learning-setup.spec.ts @@ -0,0 +1,118 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { + LEARNING_SETUP_MAX_AGE_MS, + LEARNING_SETUP_STORAGE_KEY, + _test, + clearLearningSetupMarker, + learningSetupMarkerMatches, + normalizeLearningRuntimeUrl, + readLearningSetupMarker, + writeLearningSetupMarker, +} from "./learning-setup.js"; + +beforeEach(() => { + localStorage.clear(); + _test.resetMemory(); +}); + +describe("Learning setup marker", () => { + it("normalizes runtime identity and expires after seven days", () => { + expect( + normalizeLearningRuntimeUrl( + "/api/copilotkit/?secret=hidden#fragment", + "https://example.test/app/", + ), + ).toBe("https://example.test/api/copilotkit"); + + const startedAt = new Date("2026-03-01T00:00:00.000Z"); + const marker = writeLearningSetupMarker({ + runtimeUrl: "/api/copilotkit/?secret=hidden", + agentId: "support", + now: startedAt, + }); + expect(marker.runtimeUrl).not.toContain("secret"); + expect( + learningSetupMarkerMatches(marker, "/api/copilotkit", "support"), + ).toBe(true); + expect(learningSetupMarkerMatches(marker, "/api/copilotkit", "other")).toBe( + false, + ); + expect( + readLearningSetupMarker( + startedAt.getTime() + LEARNING_SETUP_MAX_AGE_MS + 1, + ), + ).toBeNull(); + }); + + it("normalizes an absolute Runtime URL when no browser document exists", () => { + vi.stubGlobal("document", undefined); + try { + expect( + normalizeLearningRuntimeUrl( + "https://runtime.example/api/copilotkit/?secret=hidden#fragment", + ), + ).toBe("https://runtime.example/api/copilotkit"); + expect(normalizeLearningRuntimeUrl("/api/copilotkit")).toBeNull(); + } finally { + vi.unstubAllGlobals(); + } + }); + + it("retains a page-local marker when storage is unavailable", () => { + vi.spyOn(Storage.prototype, "setItem").mockImplementation(() => { + throw new Error("storage blocked"); + }); + const marker = writeLearningSetupMarker({ + runtimeUrl: "https://runtime.example/api/copilotkit", + agentId: null, + }); + + expect(readLearningSetupMarker()).toEqual(marker); + clearLearningSetupMarker(); + expect(readLearningSetupMarker()).toBeNull(); + expect(localStorage.getItem(LEARNING_SETUP_STORAGE_KEY)).toBeNull(); + }); + + it.each([ + ["malformed", "not json"], + [ + "unsupported", + JSON.stringify({ + version: 2, + runtimeUrl: "https://runtime.example/api/copilotkit", + agentId: null, + startedAt: "2026-09-03T00:00:00.000Z", + }), + ], + [ + "expired", + JSON.stringify({ + version: 1, + runtimeUrl: "https://runtime.example/api/copilotkit", + agentId: null, + startedAt: "2026-08-01T00:00:00.000Z", + }), + ], + ])("removes a %s persisted record", (_label, raw) => { + localStorage.setItem(LEARNING_SETUP_STORAGE_KEY, raw); + + expect( + readLearningSetupMarker(Date.parse("2026-09-03T00:00:00.000Z")), + ).toBeNull(); + expect(localStorage.getItem(LEARNING_SETUP_STORAGE_KEY)).toBeNull(); + }); + + it("removes invalid persistence without discarding a valid page-local fallback", () => { + const marker = writeLearningSetupMarker({ + runtimeUrl: "https://runtime.example/api/copilotkit", + agentId: "checkout", + now: new Date("2026-09-03T00:00:00.000Z"), + }); + localStorage.setItem(LEARNING_SETUP_STORAGE_KEY, "malformed"); + + expect( + readLearningSetupMarker(Date.parse("2026-09-03T01:00:00.000Z")), + ).toEqual(marker); + expect(localStorage.getItem(LEARNING_SETUP_STORAGE_KEY)).toBeNull(); + }); +}); diff --git a/packages/web-inspector/src/lib/learning-setup.ts b/packages/web-inspector/src/lib/learning-setup.ts new file mode 100644 index 0000000000..b4da644462 --- /dev/null +++ b/packages/web-inspector/src/lib/learning-setup.ts @@ -0,0 +1,144 @@ +export const LEARNING_SETUP_STORAGE_KEY = "cpk:inspector:learning-setup:v1"; +export const LEARNING_SETUP_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1_000; + +export interface LearningSetupMarker { + readonly version: 1; + readonly runtimeUrl: string; + readonly agentId: string | null; + readonly startedAt: string; +} + +let inMemoryMarker: LearningSetupMarker | null = null; + +export function normalizeLearningRuntimeUrl( + runtimeUrl: string, + baseUri?: string, +): string | null { + try { + const browserBaseUri = + baseUri ?? + (typeof document === "undefined" ? undefined : document.baseURI); + const url = browserBaseUri + ? new URL(runtimeUrl, browserBaseUri) + : new URL(runtimeUrl); + url.search = ""; + url.hash = ""; + url.pathname = + url.pathname === "/" ? "/" : url.pathname.replace(/\/+$/u, ""); + return url.toString(); + } catch { + return null; + } +} + +function parseMarker( + raw: string | null, + now: number, +): LearningSetupMarker | null { + if (!raw) return null; + try { + const value = JSON.parse(raw) as Partial; + const started = + typeof value.startedAt === "string" ? Date.parse(value.startedAt) : NaN; + if ( + value.version !== 1 || + typeof value.runtimeUrl !== "string" || + (value.agentId !== null && typeof value.agentId !== "string") || + !Number.isFinite(started) || + started > now || + now - started > LEARNING_SETUP_MAX_AGE_MS + ) { + return null; + } + return value as LearningSetupMarker; + } catch { + return null; + } +} + +export function readLearningSetupMarker( + now = Date.now(), +): LearningSetupMarker | null { + try { + const raw = localStorage.getItem(LEARNING_SETUP_STORAGE_KEY); + const persisted = parseMarker(raw, now); + if (persisted) return persisted; + if (raw !== null) localStorage.removeItem(LEARNING_SETUP_STORAGE_KEY); + } catch { + // The page-local fallback below preserves the interaction. + } + return parseMarker( + inMemoryMarker ? JSON.stringify(inMemoryMarker) : null, + now, + ); +} + +export function writeLearningSetupMarker(input: { + readonly runtimeUrl: string; + readonly agentId: string | null; + readonly now?: Date; +}): LearningSetupMarker { + const runtimeUrl = normalizeLearningRuntimeUrl(input.runtimeUrl); + if (!runtimeUrl) throw new Error("Runtime URL is unavailable."); + const marker: LearningSetupMarker = { + version: 1, + runtimeUrl, + agentId: input.agentId, + startedAt: (input.now ?? new Date()).toISOString(), + }; + inMemoryMarker = marker; + try { + localStorage.setItem(LEARNING_SETUP_STORAGE_KEY, JSON.stringify(marker)); + } catch { + // Storage is optional; retain the marker in memory. + } + return marker; +} + +export function clearLearningSetupMarker(): void { + inMemoryMarker = null; + try { + localStorage.removeItem(LEARNING_SETUP_STORAGE_KEY); + } catch { + // Best effort only. + } +} + +export function learningSetupMarkerMatches( + marker: LearningSetupMarker | null, + runtimeUrl: string, + agentId: string | null, +): boolean { + return ( + marker !== null && + marker.runtimeUrl === normalizeLearningRuntimeUrl(runtimeUrl) && + marker.agentId === agentId + ); +} + +/** Keeps multiple Inspector instances on the same origin in sync. */ +export function subscribeToLearningSetupMarker( + listener: (marker: LearningSetupMarker | null) => void, +): () => void { + const handleStorage = (event: StorageEvent) => { + if (event.key === LEARNING_SETUP_STORAGE_KEY) { + const marker = parseMarker(event.newValue, Date.now()); + if (event.newValue !== null && marker === null) { + try { + localStorage.removeItem(LEARNING_SETUP_STORAGE_KEY); + } catch { + // Storage is optional; still notify the listener below. + } + } + listener(marker); + } + }; + window.addEventListener("storage", handleStorage); + return () => window.removeEventListener("storage", handleStorage); +} + +export const _test = { + resetMemory: () => { + inMemoryMarker = null; + }, +}; diff --git a/packages/web-inspector/src/lib/telemetry.ts b/packages/web-inspector/src/lib/telemetry.ts index 08651882d5..03337343d2 100644 --- a/packages/web-inspector/src/lib/telemetry.ts +++ b/packages/web-inspector/src/lib/telemetry.ts @@ -52,6 +52,13 @@ export const TELEMETRY_EVENTS = { threadsExampleTourCompleted: "oss.inspector.threads_example_tour_completed", threadsExampleTourReopened: "oss.inspector.threads_example_tour_reopened", memoriesTabClicked: "oss.inspector.memories_tab_clicked", + learningPaneViewed: "oss.inspector.learning_pane_viewed", + learningSetupPromptClicked: "oss.inspector.learning_setup_prompt_clicked", + learningSnapshotLoaded: "oss.inspector.learning_snapshot_loaded", + learningSkillToggled: "oss.inspector.learning_skill_toggled", + learningEvidenceOpened: "oss.inspector.learning_evidence_opened", + learningPageChanged: "oss.inspector.learning_page_changed", + learningWebAppOpened: "oss.inspector.learning_web_app_opened", homeViewed: "oss.inspector.home_viewed", homeCtaClicked: "oss.inspector.home_cta_clicked", homeFeaturePromptClicked: "oss.inspector.home_feature_prompt_clicked", @@ -593,6 +600,94 @@ export function trackMemoriesTabClicked( track(TELEMETRY_EVENTS.memoriesTabClicked, props); } +export type InspectorLearningViewState = + | "unsupported" + | "loading" + | "error" + | "selection_required" + | "invalid" + | "results" + | "first_run" + | "ready" + | "empty" + | "setup" + | "landing"; +export type InspectorLearningCountBucket = + | "zero" + | "one" + | "two_to_five" + | "six_to_twenty" + | "twenty_one_plus"; +export type InspectorLearningDurationBucket = + | "under_250ms" + | "250ms_to_1s" + | "1s_to_3s" + | "3s_plus"; + +export function learningCountBucket( + value: number, +): InspectorLearningCountBucket { + if (value <= 0) return "zero"; + if (value === 1) return "one"; + if (value <= 5) return "two_to_five"; + if (value <= 20) return "six_to_twenty"; + return "twenty_one_plus"; +} + +export function learningDurationBucket( + durationMs: number, +): InspectorLearningDurationBucket { + if (durationMs < 250) return "under_250ms"; + if (durationMs < 1_000) return "250ms_to_1s"; + if (durationMs < 3_000) return "1s_to_3s"; + return "3s_plus"; +} + +export function trackLearningPaneViewed(props: { + state: InspectorLearningViewState; +}): void { + track(TELEMETRY_EVENTS.learningPaneViewed, props); +} + +export function trackLearningSetupPromptClicked(props: { + outcome: "success" | "failure"; +}): void { + track(TELEMETRY_EVENTS.learningSetupPromptClicked, props); +} + +export function trackLearningSnapshotLoaded(props: { + outcome: "success" | "unsupported" | "failure"; + duration_bucket: InspectorLearningDurationBucket; + skills_bucket: InspectorLearningCountBucket; + insights_bucket: InspectorLearningCountBucket; + pending_threads_bucket: InspectorLearningCountBucket; +}): void { + track(TELEMETRY_EVENTS.learningSnapshotLoaded, props); +} + +export function trackLearningSkillToggled(props: { + action: "expanded" | "collapsed"; +}): void { + track(TELEMETRY_EVENTS.learningSkillToggled, props); +} + +export function trackLearningEvidenceOpened(): void { + track(TELEMETRY_EVENTS.learningEvidenceOpened); +} + +export function trackLearningPageChanged(props: { + section: "skills" | "insights"; + direction: "previous" | "next"; +}): void { + track(TELEMETRY_EVENTS.learningPageChanged, props); +} + +export function trackLearningWebAppOpened(props: { + category: "learning" | "runs" | "candidates"; +}): void { + track(TELEMETRY_EVENTS.learningWebAppOpened, props); +} + export type InspectorMetadataTelemetryModule = "identity" | "plan" | "action"; export type InspectorMetadataLicenseBucket = | "valid" diff --git a/packages/web-inspector/src/styles/generated.css b/packages/web-inspector/src/styles/generated.css index f62d019297..e2672344da 100644 --- a/packages/web-inspector/src/styles/generated.css +++ b/packages/web-inspector/src/styles/generated.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-green-100:oklch(96.2% .044 156.743);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-700:oklch(49.6% .265 301.924);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--font-weight-semibold:600;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{font-family:var(--font-sans);color:var(--color-slate-900);background-color:#0000;display:block}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.bottom-0{bottom:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-3{margin-block:calc(var(--spacing)*3)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mr-auto{margin-right:auto}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-\[28rem\]{height:28rem}.h-full{height:100%}.max-h-32{max-height:calc(var(--spacing)*32)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-7{min-height:calc(var(--spacing)*7)}.min-h-\[20rem\]{min-height:20rem}.min-h-\[40px\]{min-height:40px}.min-h-\[420px\]{min-height:420px}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-40{width:calc(var(--spacing)*40)}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[80\%\]{max-width:80%}.max-w-\[200px\]{max-width:200px}.max-w-\[240px\]{max-width:240px}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.flex-shrink,.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-\[2px\]{--tw-translate-y:calc(2px*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.list-none{list-style-type:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[16px\]{border-radius:16px}.rounded-\[28px\]{border-radius:28px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-gray-200{border-color:var(--color-gray-200)}.border-purple-200{border-color:var(--color-purple-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-slate-200{border-color:var(--color-slate-200)}.border-violet-200{border-color:var(--color-violet-200)}.bg-\[\#00000014\]{background-color:#00000014}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-black{background-color:var(--color-black)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-50\/50{background-color:#f9fafb80}@supports (color:color-mix(in lab, red, red)){.bg-gray-50\/50{background-color:color-mix(in oklab,var(--color-gray-50)50%,transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-100{background-color:var(--color-green-100)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-white{background-color:var(--color-white)}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white)95%,transparent)}}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-10{padding-block:calc(var(--spacing)*10)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\.5{padding-top:calc(var(--spacing)*1.5)}.pt-8{padding-top:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-4{--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4)}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-\[22px\]{--tw-leading:22px;line-height:22px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[rgb\(13\,13\,13\)\]{color:#0d0d0d}.text-amber-600{color:var(--color-amber-600)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-emerald-700{color:var(--color-emerald-700)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-purple-700{color:var(--color-purple-700)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-950{color:var(--color-rose-950)}.text-slate-500{color:var(--color-slate-500)}.text-slate-800{color:var(--color-slate-800)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-950{color:var(--color-violet-950)}.text-white{color:var(--color-white)}.italic{font-style:italic}.underline{text-decoration-line:underline}.decoration-violet-300{-webkit-text-decoration-color:var(--color-violet-300);-webkit-text-decoration-color:var(--color-violet-300);text-decoration-color:var(--color-violet-300)}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_4px_4px_0_\#0000000a\,0_0_1px_0_\#0000009e\]{--tw-shadow:0 4px 4px 0 var(--tw-shadow-color,#0000000a),0 0 1px 0 var(--tw-shadow-color,#0000009e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-transparent{--tw-ring-color:transparent}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-gray-500::placeholder{color:var(--color-gray-500)}.focus-within\:shadow-\[0_6px_18px_0_\#00000014\,0_0_1px_0_\#0000009e\]:focus-within{--tw-shadow:0 6px 18px 0 var(--tw-shadow-color,#00000014),0 0 1px 0 var(--tw-shadow-color,#0000009e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media (hover:hover){.hover\:border-gray-300:hover{border-color:var(--color-gray-300)}.hover\:bg-blue-50\/50:hover{background-color:#eff6ff80}@supports (color:color-mix(in lab, red, red)){.hover\:bg-blue-50\/50:hover{background-color:color-mix(in oklab,var(--color-blue-50)50%,transparent)}}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-violet-100:hover{background-color:var(--color-violet-100)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-violet-800:hover{color:var(--color-violet-800)}.hover\:decoration-violet-700:hover{-webkit-text-decoration-color:var(--color-violet-700);-webkit-text-decoration-color:var(--color-violet-700);text-decoration-color:var(--color-violet-700)}.hover\:opacity-70:hover{opacity:.7}}.focus\:border-gray-300:focus{border-color:var(--color-gray-300)}.focus\:border-violet-400:focus{border-color:var(--color-violet-400)}.focus\:bg-gray-50:focus{background-color:var(--color-gray-50)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-gray-200:focus{--tw-ring-color:var(--color-gray-200)}.focus\:ring-violet-100:focus{--tw-ring-color:var(--color-violet-100)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:rounded:focus-visible{border-radius:.25rem}.focus-visible\:rounded-sm:focus-visible{border-radius:var(--radius-sm)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-rose-300:focus-visible{--tw-ring-color:var(--color-rose-300)}.focus-visible\:ring-violet-300:focus-visible{--tw-ring-color:var(--color-violet-300)}.focus-visible\:ring-violet-400:focus-visible{--tw-ring-color:var(--color-violet-400)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-\[\#BEC2FF\]:focus-visible{outline-color:#bec2ff}.focus-visible\:outline-gray-300:focus-visible{outline-color:var(--color-gray-300)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:opacity-60:active{opacity:.6}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:text-gray-500:disabled{color:var(--color-gray-500)}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (min-width:48rem){.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\>svg\]\:\!h-8>svg{height:calc(var(--spacing)*8)!important}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing)*3)}.\[\&\>svg\]\:h-3\.5>svg{height:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:h-\[18px\]>svg{height:18px}.\[\&\>svg\]\:\!w-8>svg{width:calc(var(--spacing)*8)!important}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing)*3)}.\[\&\>svg\]\:w-3\.5>svg{width:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:w-\[18px\]>svg{width:18px}.\[\&\>svg\]\:animate-spin>svg{animation:var(--animate-spin)}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}}.cpk-json-block{white-space:pre-wrap;word-break:break-all;color:#57575b;margin:0;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:11px;line-height:1.8;overflow:auto}.inspector-account-strip{border-bottom:1px solid #d8d8e8;width:100%;min-width:0;color:#010507!important;background:#f7f6fd!important}.inspector-account-logo{filter:none}.inspector-account-brand{position:relative}.inspector-account-logo-accent{clip-path:inset(0 0 0 80%);pointer-events:none;display:none;position:absolute;inset:0}.inspector-account-cta{isolation:isolate;color:#3f176f;white-space:nowrap;cursor:pointer;background-color:#eee6fe;border:0;border-radius:5px;flex:none;justify-content:center;align-items:center;gap:7px;min-height:32px;padding:7px 10px;font-size:11px;font-weight:700;line-height:1;text-decoration:none;display:inline-flex;position:relative;overflow:hidden}.inspector-account-cta:after{z-index:0;content:"";opacity:0;pointer-events:none;background:linear-gradient(105deg,#0000 0%,#ffffff14 32%,#ffffffad 50%,#ffffff14 68%,#0000 100%);width:68%;animation:3.8s cubic-bezier(.16,1,.3,1) infinite inspector-account-cta-shimmer;position:absolute;inset:0;transform:translate(-180%)skew(-14deg)}.inspector-account-cta>*{z-index:1;position:relative}.inspector-account-cta[data-motion-paused=true]:after{animation-play-state:paused}@keyframes inspector-account-cta-shimmer{0%{opacity:0;transform:translate(-180%)skew(-14deg)}12%{opacity:1}82%{opacity:.8}to{opacity:0;transform:translate(280%)skew(-14deg)}}.inspector-account-cta:hover{color:#32105d;background-color:#e4d8fc}.inspector-account-cta svg{width:14px;height:14px}@media (prefers-reduced-motion:reduce){.inspector-account-cta:after{animation:none}}.inspector-window-layout{position:relative}.inspector-window-layout-menu{z-index:60;color:#010507;background-color:#fff;border:1px solid #d8d8e8;border-radius:5px;width:188px;padding:4px;display:grid;position:absolute;top:calc(100% + 6px);right:0;overflow:hidden;box-shadow:0 10px 24px #1f173924}.inspector-window-layout-menu button{min-height:34px;color:inherit;text-align:left;cursor:pointer;background-color:#0000;border:0;border-radius:4px;align-items:center;gap:9px;padding:7px 9px;font-size:12px;font-weight:600;display:flex}.inspector-window-layout-menu button:hover,.inspector-window-layout-menu button:focus-visible{color:#3f176f;background-color:#eee6fe;outline:none}.inspector-window-layout-menu button span:first-child{flex:none;display:inline-flex}.inspector-agent-placeholder{color:#68686e;border-color:#c8c8d8}.inspector-primary-navigation,.inspector-child-navigation{display:none}.inspector-shell{background-color:#f7f6fd;flex:auto;min-height:0;display:flex}.inspector-sidebar{z-index:20;background-color:#f7f6fd;border-right:1px solid #d8d8e8;flex-direction:column;flex:none;gap:8px;width:224px;min-width:224px;padding:12px 10px;transition:width .22s,min-width .22s,padding .22s;display:flex;position:relative;overflow:visible}.inspector-sidebar[data-icon-rail=true]{align-items:center;width:52px;min-width:52px;padding:8px}.inspector-sidebar-agent-scope{border-bottom:1px solid #d8d8e8;flex:none;min-width:0;padding-bottom:10px}.inspector-sidebar .inspector-agent-selector{width:100%;min-width:0}.inspector-sidebar .inspector-agent-selector>[data-context-dropdown-root=true]>button{background-color:#fff;border-radius:5px;max-width:none;min-height:34px;padding:6px 8px}.inspector-context-dropdown-icon{color:#68686e;display:inline-flex}.inspector-context-dropdown-icon svg,.inspector-context-dropdown-chevron svg{width:14px;height:14px}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-agent-scope{padding-bottom:8px}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-agent-scope,.inspector-sidebar[data-icon-rail=true] .inspector-agent-selector,.inspector-sidebar[data-icon-rail=true] .inspector-agent-selector>[data-context-dropdown-root=true],.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-footer{flex:none;justify-content:center;align-items:center;width:36px;min-width:36px;max-width:36px;display:flex}.inspector-sidebar[data-icon-rail=true] .inspector-agent-selector>[data-context-dropdown-root=true]>button,.inspector-sidebar[data-icon-rail=true] .inspector-agent-placeholder{box-sizing:border-box;justify-content:center;align-items:center;gap:0;width:36px;min-width:36px;max-width:36px;height:36px;min-height:36px;padding:0;transition:background-color .18s,border-color .18s,color .18s,box-shadow .18s;display:flex;overflow:visible}.inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-label,.inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-chevron,.inspector-sidebar[data-icon-rail=true] .inspector-agent-placeholder span:last-child{display:none}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-agent-scope [data-context-dropdown-root=true]>div{margin-top:0;top:0;left:calc(100% + 8px)}.inspector-icon-rail-menu{transform-origin:0;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .18s,transform .18s,visibility .18s;transform:translate(-8px)scale(.96)}.inspector-icon-rail-menu[data-open=true]{opacity:1;visibility:visible;pointer-events:auto;transform:translate(0)scale(1)}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-section+.inspector-sidebar-section{border-top:1px solid #dbdbe5;margin-top:4px;padding-top:10px}.inspector-sidebar-nav{cursor:default;flex-direction:column;flex:auto;gap:14px;min-height:0;display:flex;overflow:hidden auto}.inspector-sidebar-section{flex-direction:column;gap:4px;display:flex}.inspector-sidebar-label{color:#838389;letter-spacing:.02em;text-align:left;text-transform:none;background:0 0;border:0;width:100%;margin:0 0 2px;padding:0 8px;font-size:11px;font-weight:600;display:block}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-label,.inspector-sidebar[data-icon-rail=true] .inspector-nav-label{display:none}.inspector-sidebar-rail-tooltip{z-index:60;color:#fff;pointer-events:none;white-space:nowrap;background-color:#242331;border-radius:6px;max-width:220px;padding:6px 9px;font-size:11px;font-weight:600;line-height:1.2;position:absolute;left:calc(100% + 8px);transform:translateY(-50%);box-shadow:0 7px 18px #1a172a2e}.inspector-sidebar-control{justify-content:flex-start;width:100%;min-height:36px;display:flex;position:relative}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-nav{overflow:visible}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-control,.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-toggle,.inspector-sidebar[data-icon-rail=true] .inspector-nav-control{box-sizing:border-box;justify-content:center;align-items:center;gap:0;width:36px;min-width:36px;height:36px;min-height:36px;padding:0;overflow:visible}.inspector-sidebar[data-icon-rail=true] .inspector-nav-icon,.inspector-sidebar[data-icon-rail=true] .inspector-nav-icon svg,.inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-icon,.inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-icon svg{width:18px;height:18px;overflow:visible}.inspector-home-badge{background-color:#fa5f67;border-radius:999px;width:7px;height:7px;position:absolute;top:8px;right:8px}.inspector-sidebar[data-icon-rail=true] .inspector-home-badge{top:6px;right:8px}.inspector-sidebar-toggle{color:#57575b;width:100%;min-height:32px;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:5px;flex:none;justify-content:flex-start;align-items:center;gap:6px;padding:6px 9px;font-size:12px;font-weight:600;display:flex}.inspector-sidebar-toggle:hover{color:#010507;background-color:#f0f0f4}.inspector-sidebar-footer{flex-direction:column;flex:none;gap:6px;padding:2px 0 0;display:flex}.inspector-sidebar-status-list{grid-template-columns:minmax(0,1fr);gap:8px;display:grid}.inspector-sidebar-status-card{color:#2b2b2b;background-color:#fff;border:1px solid #d8d8e8;border-radius:7px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;min-height:52px;padding:9px 10px;display:grid;position:relative}.inspector-sidebar-status-copy{flex-direction:column;gap:2px;min-width:0;line-height:1.25;display:flex}.inspector-sidebar-status-copy strong{color:#010507;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:700;overflow:hidden}.inspector-sidebar-status-copy>span{color:#57575b;text-overflow:ellipsis;white-space:nowrap;font-size:10px;overflow:hidden}.inspector-sidebar-status-card[data-state=disconnected] .inspector-sidebar-status-copy>span{color:#68686e}.inspector-sidebar-status-action{color:#3f176f;white-space:nowrap;background-color:#0000;border:0;border-radius:5px;justify-content:center;align-items:center;gap:0;width:28px;height:28px;padding:0;font-size:10px;font-weight:700;text-decoration:none;display:inline-flex}.inspector-sidebar-status-action:hover{color:#6430ab;background-color:#eee7f8;text-decoration:none}.inspector-sidebar-status-action svg{width:12px;height:12px}.inspector-sidebar-status-action-label{display:none}.inspector-sidebar-intelligence-setup{color:#3f176f;cursor:pointer;background-color:#eee7f8;border-color:#bba5df;text-decoration:none;transition:border-color .12s,background-color .12s,box-shadow .3s;animation:3.2s ease-in-out infinite inspector-sidebar-intelligence-setup-glow}@keyframes inspector-sidebar-intelligence-setup-glow{0%,to{box-shadow:0 0 #6430ab00}50%{box-shadow:0 0 16px 2px #6430ab26}}.inspector-sidebar-intelligence-setup:hover{background-color:#e4d9f4;border-color:#8e6fc0}.inspector-sidebar-intelligence-setup .inspector-sidebar-status-copy strong{color:#3f176f}.inspector-sidebar-setup-arrow{background-color:#6430ab1a;border-radius:5px;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex}.inspector-sidebar-setup-arrow svg{width:13px;height:13px}.inspector-main{background-color:#fff;flex-direction:column;flex:auto;min-width:0;display:flex;position:relative}.inspector-home{background-color:#fff;min-height:100%;padding:30px 32px 40px;position:relative;overflow:auto}.inspector-home:before{display:none}.inspector-home>*{width:min(100%,960px);margin-left:auto;margin-right:auto}.inspector-settings{color:#010507;background-color:#fff;min-height:100%;padding:34px 32px 48px;container:inspector-settings/inline-size}.inspector-settings-header{width:min(100%,720px);margin-left:auto;margin-right:auto;padding-bottom:30px}.inspector-settings-title{color:#010507;margin:0;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:30px;font-weight:600;line-height:1.15}.inspector-settings-subtitle{color:#57575b;max-width:60ch;margin:8px 0 0;font-size:14px;line-height:1.5}.inspector-settings-section{border-top:1px solid #d5d3e4;width:min(100%,720px);margin-left:auto;margin-right:auto;padding:24px 0 26px}.inspector-settings-section-heading{align-items:flex-start;gap:12px;margin-bottom:22px;display:flex}.inspector-settings-section-icon{color:#3f176f;background-color:#eee6fe;border:1px solid #bec2ff;border-radius:8px;flex:none;justify-content:center;align-items:center;width:34px;height:34px;display:inline-flex}.inspector-settings-section-icon svg{width:17px;height:17px}.inspector-settings-section-heading h2,.inspector-settings-status-row h3,.inspector-settings-visibility h3{color:#010507;margin:0;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-weight:600}.inspector-settings-section-heading h2{font-size:17px;line-height:1.3}.inspector-settings-section-heading p{color:#68686e;max-width:54ch;margin:4px 0 0;font-size:12px;line-height:1.5}.inspector-settings-privacy{margin-left:46px}.inspector-settings-status-row{justify-content:space-between;align-items:flex-start;gap:24px;display:flex}.inspector-settings-status-row>div,.inspector-settings-visibility>div{min-width:0}.inspector-settings-status-row h3{font-size:14px;line-height:1.3}.inspector-settings-status-row p{color:#57575b;max-width:56ch;margin:8px 0 0;font-size:12px;line-height:1.55}.inspector-settings-status{color:#087653;text-align:center;white-space:nowrap;background-color:#e5f7f1;border:1px solid #85d3bb;border-radius:999px;flex:none;align-items:center;min-height:24px;padding:3px 8px;font-size:11px;font-weight:700;line-height:1;display:inline-flex}.inspector-settings-privacy[data-state=disabled] .inspector-settings-status{color:#7d4d0a;background-color:#fff5df;border-color:#dfc08f}.inspector-settings-private-content{border-top:1px solid #e4e4ec;margin-top:22px;padding-top:18px}.inspector-settings-private-content strong{color:#010507;font-size:13px;font-weight:700}.inspector-settings-private-content>p{color:#68686e;margin:4px 0 0;font-size:11px;line-height:1.45}.inspector-settings-private-content ul{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 18px;margin:12px 0 0;display:grid}.inspector-settings-private-content li{color:#3e3d48;align-items:center;gap:7px;min-width:0;font-size:12px;line-height:1.35;display:flex}.inspector-settings-private-content li span{color:#087653;flex:none;display:inline-flex}.inspector-settings-private-content li svg{width:14px;height:14px}.inspector-settings-policy-link{color:#3f176f;text-underline-offset:3px;outline-offset:2px;outline:2px solid #0000;align-items:center;gap:6px;min-height:36px;margin-top:20px;font-size:12px;font-weight:700;text-decoration:underline;text-decoration-thickness:1px;display:inline-flex}.inspector-settings-policy-link:hover{color:#6430ab}.inspector-settings-policy-link:focus-visible{outline-color:#6430ab}.inspector-settings-policy-link svg{width:14px;height:14px}.inspector-settings-visibility{margin-left:46px}.inspector-settings-visibility h3{font-size:14px;line-height:1.3}.inspector-settings-visibility p{color:#57575b;max-width:48ch;margin:8px 0 0;font-size:12px;line-height:1.55}.inspector-settings-dismiss{color:#3f176f;text-align:center;cursor:pointer;background-color:#f5f2ff;border:1px solid #c9c2e6;border-radius:7px;justify-content:center;align-items:center;gap:7px;min-height:40px;margin-top:16px;padding:8px 12px;font-size:12px;font-weight:700;line-height:1.2;display:inline-flex}.inspector-settings-dismiss:hover{background-color:#eee8ff;border-color:#a69aca}.inspector-settings-dismiss:focus-visible{outline-offset:2px;outline:2px solid #6430ab}.inspector-settings-dismiss svg{width:14px;height:14px}@media (max-width:720px){.inspector-settings{padding:28px 24px 40px}.inspector-settings-section-heading p{max-width:42ch}}@media (max-width:480px){.inspector-settings{padding-left:18px;padding-right:18px}}@container inspector-settings (max-width:520px){.inspector-settings-privacy,.inspector-settings-visibility{margin-left:0}.inspector-settings-status-row{flex-direction:column;gap:12px}.inspector-settings-private-content ul{grid-template-columns:1fr}.inspector-settings-dismiss{width:100%}}.inspector-home-card,.inspector-home-story{background-color:#ffffffd1;border:1px solid #deddea;border-radius:5px;padding:18px 18px 16px;position:relative}.inspector-home-eyebrow,.inspector-home-card-label,.inspector-home-meta{color:#57575b;margin:0;font-size:12px;font-weight:600}.inspector-home-title,.inspector-home-section-title,.inspector-home-card-title{color:#010507;margin:8px 0 0;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:28px;font-weight:600;line-height:1.15}.inspector-home-section-title{letter-spacing:-.015em;margin:0 0 14px;font-size:17px}.inspector-home-card-title{font-size:16px}.inspector-home-body,.inspector-home-card-copy{color:#57575b;max-width:52ch;margin:10px 0 0;font-size:15px;line-height:1.5}.inspector-home-section{margin-top:24px;position:relative}.inspector-home>.inspector-home-section:first-child{margin-top:0}.inspector-whats-new-preview+.inspector-home-section{margin-top:20px}.inspector-home-section-header{justify-content:space-between;align-items:center;gap:16px;margin-bottom:12px;display:flex}.inspector-home-section-header .inspector-home-section-title{margin-bottom:0}.inspector-home-section-header>span{color:#68686e;font-size:11px;font-weight:600;line-height:1.35}.inspector-system-health-header>span[data-tone=success]{color:#087653}.inspector-system-health-header>span[data-tone=checking]{color:#8a5900}.inspector-system-health-header>span[data-tone=offline],.inspector-system-health-header>span[data-tone=error]{color:#b32d3b}.inspector-system-health-section{background-color:#f7f4fe;border:1px solid #c8c6e6;border-radius:5px;overflow:hidden}.inspector-system-health-section .inspector-system-health-header{background-color:#f7f4fe;border-bottom:1px solid #d5d3e4;align-items:center;min-height:76px;margin:0;padding:18px}.inspector-system-health-heading{min-width:0}.inspector-system-health-heading .inspector-home-section-title{color:#010507;letter-spacing:-.025em;font-size:18px}.inspector-system-health-state,.inspector-intelligence-hud-state{color:#087653;background-color:#e5f7f1;border:1px solid #85d3bb;border-radius:999px;flex:none;align-items:center;gap:6px;min-height:24px;padding:4px 8px;font-size:10px;font-weight:700;line-height:1;display:inline-flex}.inspector-system-health-state>span,.inspector-intelligence-hud-state>span{background-color:currentColor;border-radius:999px;width:6px;height:6px}.inspector-system-health-state[data-tone=checking],.inspector-intelligence-hud-state[data-tone=checking]{background-color:#fff5df;border-color:#dfc08f;color:#7d4d0a!important}.inspector-system-health-state[data-tone=offline],.inspector-system-health-state[data-tone=error],.inspector-intelligence-hud-state[data-tone=offline],.inspector-intelligence-hud-state[data-tone=error]{background-color:#fff0f1;border-color:#e7a7ac;color:#b32d3b!important}.inspector-system-health-state[data-tone=unavailable],.inspector-intelligence-hud-state[data-tone=unavailable]{background-color:#f0f0f4;border-color:#c8c8d2;color:#57575b!important}.inspector-system-health{background-color:#d5d3e4;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;display:grid;overflow:hidden}.inspector-system-health-signal{background-color:#fff;grid-template-columns:minmax(0,1fr);align-items:start;min-width:0;min-height:84px;padding:15px 16px 14px;display:grid}.inspector-system-health-copy{flex-direction:column;min-width:0;display:flex}.inspector-system-health-signal dt{color:#68686e;letter-spacing:.035em;text-transform:uppercase;font-size:10px;font-weight:700;line-height:1.3}.inspector-system-health-signal dd{color:#010507;text-overflow:ellipsis;white-space:nowrap;min-width:0;margin:5px 0 0;font-size:15px;font-weight:700;overflow:hidden}.inspector-system-health-signal small{color:#68686e;text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-top:4px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;line-height:1.4;overflow:hidden}small.inspector-system-health-detail{letter-spacing:0;font-family:inherit;font-size:11px;font-weight:500;line-height:1.4}.inspector-system-health-url{cursor:help;outline:none;position:relative;overflow:visible!important}.inspector-system-health-url>span{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.inspector-system-health-url:after{z-index:30;color:#f3f4f8;content:attr(data-full-value);opacity:0;overflow-wrap:anywhere;pointer-events:none;white-space:normal;background-color:#15171e;border:1px solid #3a3d49;border-radius:4px;width:max-content;max-width:min(360px,70vw);padding:7px 9px;font-size:10px;font-weight:500;line-height:1.45;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 7px);left:0;transform:translateY(3px);box-shadow:0 8px 20px #0105072e}.inspector-system-health-url:hover:after,.inspector-system-health-url:focus-visible:after{opacity:1;transform:translateY(0)}.inspector-system-health-url:focus-visible>span{outline-offset:2px;border-radius:3px;outline:2px solid #6430ab}.inspector-system-health-signal[data-tone=success] dd{color:#087653}.inspector-system-health-signal[data-tone=active] dd{color:#8a5900}.inspector-system-health-event-link{width:100%;min-width:0;color:inherit;cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;padding:0;display:block}.inspector-system-health-event-link>span{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.inspector-system-health-event-link>.inspector-system-health-event-type{color:#57575b;letter-spacing:.025em;background-color:#f1f1f3;border-radius:999px;align-items:center;width:fit-content;max-width:100%;padding:3px 6px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;font-weight:700;line-height:1.25;display:inline-flex}.inspector-system-health-event-link>small{color:#68686e;align-items:center;gap:6px;margin:5px 0 0;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:10px;font-weight:500;line-height:1.25;display:flex}.inspector-system-health-event-meta strong{color:#6430ab;text-underline-offset:3px;font-weight:700;-webkit-text-decoration:underline #0000;text-decoration:underline #0000}.inspector-system-health-signal[data-tone=error] .inspector-system-health-event-type{color:#b32d3b;background-color:#fff0f1}.inspector-system-health-signal[data-tone=success] .inspector-system-health-event-type{color:#087653;background-color:#e3f5ee}.inspector-system-health-signal[data-tone=active] .inspector-system-health-event-type{color:#8a5900;background-color:#fff5df}.inspector-system-health-event-link:hover .inspector-system-health-event-meta strong{text-decoration-color:currentColor}.inspector-system-health-event-link:focus-visible{outline-offset:3px;border-radius:3px;outline:2px solid #6430ab}.inspector-intelligence-hud{background-color:#f7f4fe;border:1px solid #c8c6e6;border-radius:5px;overflow:hidden}.inspector-intelligence-hud-header{justify-content:space-between;align-items:center;gap:24px;padding:18px;display:flex}.inspector-intelligence-hud[data-state=disconnected]{border-color:#bba5df}.inspector-intelligence-hud[data-state=disconnected] .inspector-intelligence-hud-header{align-items:center;min-height:132px;padding:22px}.inspector-intelligence-hud[data-state=disconnected] .inspector-intelligence-hud-header-actions{flex-direction:column;align-items:flex-end;gap:10px}.inspector-intelligence-hud-heading{min-width:0}.inspector-intelligence-hud-header-actions{flex:none;align-items:center;gap:8px;display:flex}.inspector-intelligence-hud-heading .inspector-home-section-title{margin:0;font-size:18px}.inspector-intelligence-hud-description{color:#4f4f55;max-width:64ch;margin:10px 0 0;font-size:12px;line-height:1.55}.inspector-intelligence-hud-action{color:#fff;background-color:#6430ab;border:1px solid #6430ab;border-radius:4px;flex:none;justify-content:center;align-items:center;gap:7px;min-height:34px;padding:8px 11px;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:11px;font-weight:700;text-decoration:none;display:inline-flex}.inspector-intelligence-hud-action:hover{background-color:#4e238c;border-color:#4e238c}.inspector-intelligence-hud-action svg{width:13px;height:13px}.inspector-intelligence-hud-connect-action{min-height:38px;padding:10px 14px;font-size:12px}.inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-header{background:linear-gradient(100deg,#fbfaff 0%,#f2eeff 52%,#edfaf5 100%);border-bottom:1px solid #d5d3e4;align-items:center;min-height:76px;padding:18px}.inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-heading .inspector-home-section-title{color:#010507;letter-spacing:-.025em;align-items:center;gap:8px;font-size:18px;display:inline-flex}.inspector-intelligence-mark{flex:none;width:17px;height:17px;display:block}.inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-header-actions{flex-direction:column;align-items:flex-end;gap:6px}.inspector-intelligence-sr-summary{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.inspector-intelligence-copy{padding:16px 18px 0;display:grid}.inspector-intelligence-copy-slide{opacity:0;flex-direction:column;grid-area:1/1;gap:4px;transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .38s cubic-bezier(.22,1,.36,1);display:flex}.inspector-intelligence-copy-slide[data-position=after]{transform:translate(14px)}.inspector-intelligence-copy-slide[data-position=before]{transform:translate(-14px)}.inspector-intelligence-copy-slide[data-position=active]{opacity:1;transform:none}.inspector-intelligence-copy-slide>strong{color:#2b2b31;text-wrap:balance;max-width:52ch;font-size:12.5px;font-weight:650;line-height:1.4}.inspector-intelligence-copy-slide>span{color:#4f4f55;max-width:64ch;font-size:11px;line-height:1.55}.inspector-intelligence-install{justify-content:flex-end;align-items:center;gap:12px;display:flex}.inspector-intelligence-install-copy{cursor:pointer;min-height:34px;transition:background-color .14s,border-color .14s}.inspector-intelligence-install-copy svg{width:13px;height:13px}.inspector-intelligence-install[data-copy-state=copied] .inspector-intelligence-install-copy{color:#4e238c;background-color:#fff;border-color:#bba5df}.inspector-intelligence-install-secondary{color:#6430ab;align-items:center;gap:5px;font-size:11px;font-weight:600;text-decoration:none;display:inline-flex}.inspector-intelligence-install-secondary:hover{text-underline-offset:2px;text-decoration:underline}.inspector-intelligence-install-secondary svg{width:12px;height:12px}.inspector-intelligence-install-hint{color:#68686e;white-space:nowrap;margin:0;font-size:11px;font-weight:600;line-height:1.4}.inspector-intelligence-install-hint[data-tone=success]{color:#4e238c;font-weight:600}.inspector-intelligence-install-hint[data-tone=error]{color:#a3341f;font-weight:600}.inspector-intelligence-install-fallback{color:#4f4f55;-webkit-user-select:all;user-select:all;white-space:pre-wrap;word-break:break-word;background-color:#fff;border-bottom:1px solid #d5d3e4;max-height:96px;padding:10px 18px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10.5px;line-height:1.65;display:block;overflow:auto}.inspector-intelligence-story{background-color:#fff;container:cpk-intel-story/inline-size}.inspector-intelligence-story-stage{padding:16px 18px;display:grid}.inspector-intelligence-beat{visibility:hidden;opacity:0;grid-area:1/1;align-items:center;transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .38s cubic-bezier(.22,1,.36,1),visibility 0s linear .38s;display:flex}.inspector-intelligence-beat[data-position=after]{transform:translate(14px)}.inspector-intelligence-beat[data-position=before]{transform:translate(-14px)}.inspector-intelligence-beat[data-position=active]{visibility:visible;opacity:1;transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .38s cubic-bezier(.22,1,.36,1),visibility;transform:none}.inspector-intelligence-beat[data-beat-id=threads]{flex-direction:column;justify-content:center;gap:6px}.inspector-intelligence-threads{flex-direction:column;gap:6px;width:100%;display:flex}.inspector-intelligence-thread{opacity:0;background-color:#faf9fe;border:1px solid #e6e3f2;border-radius:4px;align-items:center;gap:9px;padding:8px 10px;transition:opacity .3s,transform .3s;display:flex;transform:translateY(3px)}.inspector-intelligence-thread>i{background-color:#9b8cc4;border-radius:999px;flex:none;width:6px;height:6px}.inspector-intelligence-thread>strong{color:#2b2b31;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;overflow:hidden}.inspector-intelligence-thread>small{color:#68686e;flex:none;margin-left:auto;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:9.5px}.inspector-intelligence-thread[data-failed=true]{background-color:#fdf6f4;border-color:#f0d5cf}.inspector-intelligence-thread[data-failed=true]>i{background-color:#c2410c}.inspector-intelligence-thread[data-failed=true]>strong,.inspector-intelligence-thread[data-failed=true]>small{color:#8f2f1c;font-weight:650}.inspector-intelligence-story[data-beat=threads] .inspector-intelligence-thread{opacity:1;transition-delay:calc(var(--thread-index)*80ms + 90ms);transform:none}.inspector-intelligence-beat[data-beat-id=learning]{grid-template-columns:minmax(0,1.15fr) auto minmax(0,.85fr);align-items:center;gap:12px;display:grid}.inspector-intelligence-beat-col{flex-direction:column;gap:6px;min-width:0;display:flex}.inspector-intelligence-beat-label{color:#68686e;letter-spacing:.06em;text-transform:uppercase;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:9px;font-weight:600}.inspector-intelligence-signal,.inspector-intelligence-rule{color:#4f4f55;opacity:0;background-color:#faf9fe;border:1px solid #e6e3f2;border-radius:4px;align-items:flex-start;gap:6px;padding:6px 8px;font-size:10.5px;line-height:1.4;transition:opacity .3s,transform .3s;display:flex;transform:translateY(3px)}.inspector-intelligence-signal{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.inspector-intelligence-rule{color:#21543f;background-color:#f4fbf8;border-color:#cfe9dd;font-weight:600}.inspector-intelligence-rule>i{color:#1f8a5f;flex:none;align-items:center;display:inline-flex}.inspector-intelligence-rule>i svg{stroke-width:2.4px;width:11px;height:11px}.inspector-intelligence-story[data-beat=learning] .inspector-intelligence-signal,.inspector-intelligence-story[data-beat=learning] .inspector-intelligence-rule{opacity:1;transform:none}.inspector-intelligence-story[data-beat=learning] .inspector-intelligence-signal{transition-delay:calc(var(--signal-index)*80ms + .1s)}.inspector-intelligence-story[data-beat=learning] .inspector-intelligence-rule{transition-delay:calc(var(--rule-index)*80ms + .42s)}.inspector-intelligence-beat-flow{color:#9b8cc4;justify-content:center;align-items:center;display:inline-flex}.inspector-intelligence-beat-flow svg{width:15px;height:15px}.inspector-intelligence-beat[data-beat-id=skill]{justify-content:center}.inspector-intelligence-skill-file{background-color:#fff;border:1px solid #d5d3e4;border-radius:5px;width:min(100%,30rem);overflow:hidden;box-shadow:0 1px 2px #100c280f}.inspector-intelligence-skill-file>header{background-color:#faf9fe;border-bottom:1px solid #ebe9f4;align-items:center;gap:7px;padding:7px 10px;display:flex}.inspector-intelligence-skill-file>header svg{color:#6430ab;width:12px;height:12px}.inspector-intelligence-skill-file>header strong{color:#2b2b31;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10.5px;font-weight:600}.inspector-intelligence-skill-file>header em{color:#68686e;letter-spacing:.05em;text-transform:uppercase;margin-left:auto;font-size:9px;font-style:normal;font-weight:600}.inspector-intelligence-skill-code{flex-direction:column;padding:8px 0;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10.5px;line-height:1.75;display:flex}.inspector-intelligence-skill-code>span{color:#4f4f55;gap:10px;padding:0 12px;display:flex}.inspector-intelligence-skill-code>span:before{color:#a9a7bb;content:attr(data-line);text-align:right;min-width:8px}.inspector-intelligence-skill-code>span>b{color:#6430ab;font-weight:600}.inspector-intelligence-skill-code>span[style*=--rule-index]{opacity:0;transition:opacity .26s,transform .26s;transform:translateY(2px)}.inspector-intelligence-story[data-beat=skill] .inspector-intelligence-skill-code>span[style*=--rule-index]{opacity:1;transition-delay:calc(var(--rule-index)*.11s + .26s);transform:none}.inspector-intelligence-beat[data-beat-id=intelligence]{flex-direction:column;justify-content:center;gap:12px}.inspector-intelligence-chain{justify-content:center;align-items:stretch;gap:6px;width:100%;display:flex}.inspector-intelligence-chain-step{opacity:0;background-color:#faf9fe;border:1px solid #e6e3f2;border-radius:5px;flex-direction:column;flex:1 1 0;align-items:flex-start;gap:3px;min-width:0;padding:9px 10px;transition:opacity .28s,transform .28s;display:flex;transform:translateY(4px)}.inspector-intelligence-chain-step>i{color:#6430ab;display:inline-flex}.inspector-intelligence-chain-step>i svg{width:14px;height:14px}.inspector-intelligence-chain-step>strong{color:#2b2b31;font-size:11px;font-weight:700;line-height:1.25}.inspector-intelligence-chain-step>small{color:#68686e;font-size:9.5px;line-height:1.3}.inspector-intelligence-chain-arrow{color:#bba5df;opacity:0;flex:none;align-items:center;transition:opacity .28s;display:inline-flex}.inspector-intelligence-chain-arrow svg{width:13px;height:13px}.inspector-intelligence-story[data-beat=intelligence] .inspector-intelligence-chain-step,.inspector-intelligence-story[data-beat=intelligence] .inspector-intelligence-chain-arrow{opacity:1;transition-delay:calc(var(--step-index)*90ms + 80ms);transform:none}.inspector-intelligence-chain-proof{color:#21543f;opacity:0;background-color:#f4fbf8;border:1px solid #cfe9dd;border-radius:999px;align-self:center;align-items:center;gap:6px;padding:5px 11px;font-size:10.5px;font-weight:600;transition:opacity .3s,transform .3s;display:inline-flex;transform:translateY(3px)}.inspector-intelligence-chain-proof svg{color:#1f8a5f;width:12px;height:12px}.inspector-intelligence-chain-proof code{font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;font-weight:600}.inspector-intelligence-story[data-beat=intelligence] .inspector-intelligence-chain-proof{opacity:1;transition-delay:.46s;transform:none}.inspector-intelligence-story-rail{border-top:1px solid #ebe9f4;align-items:center;gap:2px;padding:8px 18px 9px;display:flex}.inspector-intelligence-story-tab{color:#68686e;cursor:pointer;background:0 0;border:0;border-radius:3px;padding:3px 7px 5px;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:10.5px;font-weight:600;transition:color .16s;position:relative}.inspector-intelligence-story-tab:after{content:"";transform-origin:0;background-color:#6430ab;border-radius:2px;height:1.5px;transition:transform .28s cubic-bezier(.22,1,.36,1);position:absolute;bottom:1px;left:7px;right:7px;transform:scaleX(0)}.inspector-intelligence-story-tab:hover{color:#2b2b31}.inspector-intelligence-story-tab[data-active=true]{color:#4e238c}.inspector-intelligence-story-tab[data-active=true]:after{transform:scaleX(1)}@container cpk-intel-story (max-width:30rem){.inspector-intelligence-chain-step>small{display:none}.inspector-intelligence-story-rail{flex-wrap:wrap}}@media (prefers-reduced-motion:reduce){.inspector-intelligence-copy-slide,.inspector-intelligence-thread,.inspector-intelligence-beat,.inspector-intelligence-signal,.inspector-intelligence-rule,.inspector-intelligence-chain-step,.inspector-intelligence-chain-arrow,.inspector-intelligence-chain-proof,.inspector-intelligence-skill-code>span[style*=--rule-index],.inspector-intelligence-story-tab:after{transition-duration:0s;transition-delay:0s}}.inspector-intelligence-hud-details{background-color:#d5d3e4;border-top:1px solid #d5d3e4;grid-template-columns:minmax(0,1fr) minmax(0,2fr);gap:1px;display:grid}.inspector-intelligence-hud-details>section{background-color:#fff;min-width:0;padding:15px 18px 17px}.inspector-intelligence-hud-detail-label{color:#68686e;font-size:11px;font-weight:600;display:block}.inspector-intelligence-hud-detail-value{color:#010507;text-overflow:ellipsis;white-space:nowrap;min-width:0;margin:5px 0 0;font-size:14px;font-weight:700;display:block;overflow:hidden}.inspector-intelligence-hud-detail-subvalue{color:#68686e;text-transform:capitalize;margin-top:3px;font-size:10px;font-weight:500;display:block}.inspector-intelligence-hud-plan{grid-template-columns:minmax(0,1fr) minmax(120px,1fr);align-items:start;gap:24px;display:grid}.inspector-intelligence-hud-usage{min-width:0}.inspector-intelligence-hud-plan-action{color:#6430ab;text-underline-offset:3px;background-color:#0000;border:0;border-radius:0;gap:4px;min-height:auto;margin-top:9px;padding:0;font-size:10px;font-weight:700;line-height:1.2;-webkit-text-decoration:underline #0000;text-decoration:underline #0000;text-decoration-thickness:1px}.inspector-intelligence-hud-plan-action:hover{color:#4e238c;background-color:#0000;border-color:#0000;text-decoration-color:currentColor}.inspector-intelligence-hud-plan-action svg{width:11px;height:11px}.inspector-home-usage-bar{background-color:#dbdbe5;border-radius:999px;width:min(160px,100%);height:5px;margin-top:8px;display:block;overflow:hidden}.inspector-home-usage-bar>span{background-color:#bec2ff;height:100%;display:block}.inspector-home-feature-groups{grid-template-columns:repeat(auto-fit,minmax(min(100%,250px),1fr));align-items:start;gap:12px;display:grid}.inspector-home-feature-group{background-color:#fff;border:1px solid #d5d3e4;border-radius:5px;overflow:visible}.inspector-home-feature-group-header{color:#57575b;background-color:#f7f7f9;border-bottom:1px solid #e4e4ec;border-radius:4px 4px 0 0;justify-content:space-between;align-items:center;gap:12px;min-height:40px;padding:9px 12px;display:flex}.inspector-home-feature-group-header strong{font-size:12px;font-weight:700}.inspector-home-feature-group-header>span{background-color:#fff;border-radius:999px;justify-content:center;align-items:center;min-width:22px;min-height:20px;padding:2px 6px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;font-weight:700;display:inline-flex}.inspector-home-feature-group[data-feature-state-group=active] .inspector-home-feature-group-header{color:#087653;background-color:#e5f7f1;border-color:#b9e3d6}.inspector-home-feature-list{background-color:#fff;flex-direction:column;margin:0;display:flex}.inspector-home-feature{color:#010507;background-color:#fff;grid-template-columns:18px minmax(0,1fr) auto;align-items:center;gap:8px;min-width:0;min-height:52px;padding:9px 12px;font-size:12px;font-weight:600;display:grid;container-type:inline-size}.inspector-home-feature+.inspector-home-feature{border-top:1px solid #ececf1}.inspector-home-feature:last-child{border-radius:0 0 4px 4px}.inspector-home-feature-group-empty{color:#68686e;margin:0;padding:15px 12px;font-size:11px}.inspector-home-feature:hover{background-color:#f7f7f9}.inspector-home-feature-label{min-width:0;color:inherit;cursor:pointer;align-items:center;gap:4px;text-decoration:none;display:inline-flex}.inspector-home-feature-label>span:first-child{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.inspector-home-feature-label-icon{flex:none;display:inline-flex!important;overflow:visible!important}.inspector-home-feature-label-icon svg{width:12px;height:12px}.inspector-home-feature-label:hover{color:#3f176f;text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px}.inspector-home-feature-label:focus-visible{outline-offset:2px;border-radius:3px;outline:2px solid #6430ab}.inspector-home-feature-actions{justify-content:flex-end;align-items:center;gap:6px;display:inline-flex}.inspector-home-feature-status{flex:none;justify-content:center;align-items:center;width:18px;height:28px;display:inline-flex}.inspector-home-feature-status>span{background-color:#fff;border:1px solid #9ca0ab;border-radius:999px;width:8px;height:8px}.inspector-home-feature[data-state=on] .inspector-home-feature-status>span{background-color:#087653;border-color:#087653}.inspector-home-feature[data-state=off]{color:#68686e}.inspector-home-feature-action{color:#4f4f55;min-width:28px;height:28px;min-height:28px;font:inherit;white-space:nowrap;cursor:pointer;background-color:#fff;border:1px solid #d5d3e4;border-radius:4px;justify-content:center;align-items:center;gap:5px;padding:0 8px;font-size:10px;font-weight:700;line-height:1;text-decoration:none;display:inline-flex}.inspector-home-feature-action svg{width:14px;height:14px}.inspector-home-feature-action-icon{flex:none;display:inline-flex!important;overflow:visible!important}.inspector-home-feature-action-label{line-height:1}.inspector-home-feature-action.inspector-system-health-url:after{content:none;left:50%;right:auto;transform:translate(-50%,3px)}.inspector-home-feature-action.inspector-system-health-url:hover:after,.inspector-home-feature-action.inspector-system-health-url:focus-visible:after{transform:translate(-50%)}.inspector-home-feature-action:hover{color:#3f176f;background-color:#f7f4fe;border-color:#bba5df}.inspector-home-feature-action:focus-visible{outline-offset:2px;outline:2px solid #6430ab}.inspector-home-feature-action[data-copy-state=copied]{color:#087653;background-color:#e5f7f1;border-color:#b9e3d6}.inspector-home-feature-action[data-copy-state=error]{color:#b32d3b;background-color:#fff0f1;border-color:#e7a7ac}@container (max-width:286px){.inspector-home-feature-action{width:28px;padding:0}.inspector-home-feature-action-label{display:none!important}.inspector-home-feature-action.inspector-system-health-url:after{content:attr(data-full-value)}}.inspector-home-features-empty{color:#57575b;border-top:1px solid #deddea;border-bottom:1px solid #deddea;margin:14px 0 0;padding:16px 0;font-size:12px}.inspector-home-news{gap:12px;display:grid}.inspector-whats-new-preview{color:#010507;background-color:#f7f4fe;border:1px solid #c8c6e6;border-radius:5px;align-items:stretch;width:100%;min-height:64px;display:flex;position:relative;overflow:hidden;container-type:inline-size}.inspector-whats-new-preview:has(.inspector-whats-new-preview-body:hover){background-color:#f1ebfc;border-color:#8f91d7}.inspector-whats-new-preview-body{min-width:0;color:inherit;text-align:left;cursor:pointer;background-color:#0000;border:0;flex:auto;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:12px 14px;display:grid}.inspector-whats-new-preview-copy{flex-direction:column;gap:3px;min-width:0;display:flex}.inspector-whats-new-preview-title{align-items:center;gap:8px;min-width:0;display:flex}.inspector-whats-new-preview-copy strong{text-overflow:ellipsis;white-space:nowrap;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:13px;line-height:1.25;overflow:hidden}.inspector-whats-new-preview-copy>span:last-child{color:#4e4c63;text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:1.4;overflow:hidden}.inspector-whats-new-preview-action{color:#3f176f;white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:11px;font-weight:700;display:inline-flex}.inspector-whats-new-preview-action svg{width:15px;height:15px}@container (max-width:640px){.inspector-whats-new-preview-body{grid-template-columns:minmax(0,1fr)}.inspector-whats-new-preview-action{display:none}}.inspector-whats-new-preview-dismiss{color:#68686e;cursor:pointer;background-color:#0000;border:0;border-radius:5px;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex;position:absolute;top:50%;right:12px;transform:translateY(-50%)}.inspector-whats-new-preview-dismiss:hover{color:#3f176f;background-color:#6430ab1a}.inspector-whats-new-preview-dismiss svg{width:14px;height:14px}@media (max-width:720px){.inspector-account-cta{width:32px;padding-inline:0}.inspector-account-cta-label{display:none}.inspector-home{padding:24px 22px 34px}.inspector-intelligence-hud-header{flex-wrap:wrap}.inspector-intelligence-hud-details{grid-template-columns:1fr}.inspector-intelligence-hud-plan{grid-template-columns:repeat(2,minmax(0,1fr))}.inspector-whats-new-preview-action{display:none}}@media (max-width:600px){.inspector-system-health{grid-template-columns:1fr}}@media (max-width:480px){.inspector-home-feature{grid-template-columns:18px minmax(0,1fr);gap:8px}.inspector-home-feature-actions{grid-column:1/-1;justify-content:flex-end}.inspector-system-health-section .inspector-system-health-header{align-items:flex-start}.inspector-intelligence-hud-header{flex-direction:column;align-items:stretch}.inspector-intelligence-hud-header-actions{justify-content:space-between}.inspector-intelligence-hud-header-actions .inspector-intelligence-hud-action,.inspector-intelligence-hud-plan{width:100%}.inspector-intelligence-hud-plan{grid-template-columns:1fr;align-items:stretch}.inspector-intelligence-hud-plan-action{justify-self:start}.inspector-whats-new-header{align-items:center;gap:16px;width:calc(100% - 24px);padding:24px 22px}.inspector-whats-new-document,.inspector-whats-new-empty{padding:20px 22px 36px}.inspector-whats-new-document .announcement-content h1+p{font-size:16px}}.inspector-whats-new-header{background:#f8f7ff;border:1px solid #d8d8e8;border-radius:5px;justify-content:space-between;align-items:center;gap:24px;width:calc(100% - 44px);max-width:calc(70ch - 44px);padding:30px 32px 28px;display:flex;box-shadow:0 12px 28px #26224e0f}.inspector-whats-new-header .inspector-home-title{letter-spacing:-.035em;margin:0;font-size:clamp(27px,3.6vw,36px)}.inspector-whats-new-updated{color:#6c687c;letter-spacing:.01em;white-space:nowrap;flex:none;margin:0;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:11px;font-weight:600}.inspector-whats-new .inspector-home-news{max-width:70ch;margin-top:0}.inspector-whats-new-document,.inspector-whats-new-empty{max-width:70ch;padding:22px 32px 52px}.inspector-whats-new-document .announcement-content{color:#2b2b39;font-size:15px;line-height:1.72}.inspector-whats-new-document .announcement-content h1{color:#15131d;letter-spacing:-.032em;max-width:24ch;margin:0 0 16px;font-size:clamp(26px,3.2vw,34px);line-height:1.1}.inspector-whats-new-document .announcement-content h1+p{color:#504d61;max-width:58ch;margin-top:0;font-size:18px;line-height:1.58}.inspector-whats-new-document .announcement-content>hr:first-child{display:none}.inspector-whats-new-document .announcement-content h2:first-of-type{border-top:0;margin-top:14px;padding-top:0}.inspector-whats-new-document .announcement-content h2{color:#1b1924;letter-spacing:-.024em;border-top:1px solid #dfdeea;margin:44px 0 14px;padding-top:24px;font-size:21px;line-height:1.2}.inspector-whats-new-document .announcement-content p{max-width:70ch;margin:.85rem 0}.inspector-whats-new-document .announcement-content ul,.inspector-whats-new-document .announcement-content ol{max-width:68ch;margin:1.25rem 0 1.5rem;padding-left:1.4rem}.inspector-whats-new-document .announcement-content li+li{margin-top:.7rem}.inspector-whats-new-document .announcement-content a{color:#4e46a5;text-underline-offset:4px;font-weight:600;text-decoration-color:#4e46a56b;text-decoration-thickness:1px;transition:color .16s,text-decoration-color .16s}.inspector-whats-new-document .announcement-content a:hover{color:#312879;text-decoration-color:currentColor}.inspector-whats-new-empty{color:#5e5b70}.inspector-whats-new-empty .inspector-home-card-title{color:#1b1924;margin:0}.inspector-whats-new-empty .inspector-home-card-copy{max-width:48ch;margin:8px 0 0}.inspector-home-story-featured{padding:22px}.inspector-home-story-link{color:inherit;cursor:pointer;text-decoration:none;display:block}.inspector-home-story-link:hover{background-color:#fff;border-color:#8f91d7}.inspector-home-story[data-unread=true]{border-color:#bec2ff;padding-right:64px;box-shadow:0 0 0 1px #6430ab}.inspector-home-story-unread{color:#fff;letter-spacing:.04em;text-transform:uppercase;background-color:#6430ab;border-radius:999px;align-items:center;min-height:18px;padding:0 7px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;font-weight:700;display:inline-flex}.inspector-nav-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;transition:opacity .18s,width .22s;overflow:hidden}.inspector-nav-control{color:#57575b;min-height:32px;font:inherit;text-align:left;outline-offset:-2px;cursor:pointer;background-color:#0000;border:1px solid #0000;border-radius:5px;outline:2px solid #0000;flex:none;justify-content:flex-start;align-items:center;gap:6px;padding:6px 9px;font-size:12px;font-weight:600;line-height:1.25;display:flex}.inspector-nav-control:hover{color:#010507;background-color:#f0f0f4}.inspector-nav-control-active{color:#3f176f;background-color:#eee6fe;border-color:#bec2ff}.inspector-nav-icon{flex:none;align-items:center;display:inline-flex}.inspector-nav-icon svg{width:15px;height:15px}.inspector-nav-control:focus-visible,.inspector-account-control:focus-visible,[data-inspector-thread-cta]:focus-visible,[data-inspector-sidebar-intelligence-action]:focus-visible,[data-inspector-whats-new-preview]:focus-visible,[data-inspector-whats-new-dismiss]:focus-visible,[data-inspector-home-intelligence-action]:focus-visible,.inspector-home-feature:focus-visible,[data-inspector-action-placement=threads-footer]:focus-visible{outline-offset:2px;outline:2px solid #6430ab!important}.inspector-sidebar .inspector-nav-control:focus-visible,.inspector-sidebar .inspector-sidebar-label:focus-visible,.inspector-sidebar [data-inspector-thread-cta]:focus-visible{outline-offset:-2px!important}.inspector-account-control{color:#57575b;font:inherit;outline-offset:2px;cursor:pointer;background-color:#0000;border:1px solid #0000;outline:2px solid #0000;justify-content:center;align-items:center;padding:0;display:inline-flex}.inspector-account-control:hover,.inspector-account-control-active{color:#3f176f;background-color:#6430ab17}:host ::selection{color:#010507;background-color:#cfd2ff}:host *{scrollbar-color:#aaa9c1 transparent;scrollbar-width:thin}:host ::-webkit-scrollbar{width:8px;height:8px}:host ::-webkit-scrollbar-thumb{background:#aaa9c1 padding-box padding-box;border:2px solid #0000;border-radius:999px}.inspector-account-control-icon{flex:none;justify-content:center;align-items:center;display:inline-flex}.inspector-account-control-icon svg{width:15px;height:15px}[data-inspector-thread-cta],[data-inspector-account-strip] button,[data-inspector-account-strip] a{cursor:pointer}@media (prefers-reduced-motion:reduce){.inspector-sidebar,.inspector-nav-label,.inspector-sidebar[data-icon-rail=true] .inspector-agent-selector>[data-context-dropdown-root=true]>button{transition:none}.inspector-icon-rail-menu{transition:none;animation:none}}.inspector-threads-footer{color:#57575b;background-color:#f7f7f9;border-top:1px solid #dbdbe5;flex:none;gap:10px;padding:12px;font-size:11px;line-height:1.35;display:grid}.inspector-threads-usage{gap:6px;display:grid}[data-inspector-thread-count]{color:#010507;font-weight:600}[data-inspector-thread-expiry]{color:#57575b}.inspector-thread-progress{--inspector-thread-progress-color:#189370;width:100%;height:6px;accent-color:var(--inspector-thread-progress-color);border-radius:999px;overflow:hidden}.inspector-thread-progress[data-inspector-thread-capacity=warning]{--inspector-thread-progress-color:#b45309}.inspector-thread-progress[data-inspector-thread-capacity=critical]{--inspector-thread-progress-color:#be123c}.inspector-thread-progress::-webkit-progress-bar{background-color:#dbdbe5;border-radius:999px}.inspector-thread-progress::-webkit-progress-value{background-color:var(--inspector-thread-progress-color);border-radius:999px}.inspector-thread-progress::-moz-progress-bar{background-color:var(--inspector-thread-progress-color);border-radius:999px}[data-inspector-action-placement=threads-footer]{color:#57575b;outline-offset:2px;cursor:pointer;background-color:#0000;border:1px solid #d5d3e4;border-radius:5px;outline:2px solid #0000;justify-content:center;align-items:center;width:100%;min-height:32px;padding:6px 9px;font-size:11px;font-weight:600;line-height:1.25;text-decoration:none;display:inline-flex}[data-inspector-action-placement=threads-footer][data-inspector-action-intent=upgrade]{color:#fff;background-color:#6430ab;border-color:#6430ab}[data-inspector-action-placement=threads-footer][data-inspector-action-intent=upgrade]:hover{color:#fff;background-color:#3f176f;border-color:#3f176f}[data-inspector-action-placement=threads-footer]:hover{color:#010507;background-color:#f7f4fe;border-color:#c8c6e6}.cpk-threads-overview-video{opacity:0;transition:opacity .22s}.cpk-threads-overview{background-color:#f7f7f9;flex:1;justify-content:center;align-items:center;min-width:0;padding:32px;display:flex}.cpk-threads-overview-content{color:#57575b;width:100%;max-width:440px}.cpk-locked-feature{box-sizing:border-box;background:#fff;align-items:flex-start;width:100%;min-height:100%;padding:52px 24px 56px;display:flex;position:relative;overflow:auto;container:cpk-locked-feature/inline-size}.cpk-locked-feature-layout{box-sizing:border-box;width:100%;min-width:0;max-width:600px;margin:0 auto}.cpk-locked-feature-hero{box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:36px;width:100%;min-width:0;margin:0 auto;display:grid}.cpk-locked-feature-copy{color:#57575b;min-width:0}.cpk-locked-feature-name{color:#5558b2;letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:8px;margin-bottom:20px;font-size:11px;font-weight:700;line-height:1.25;display:inline-flex}.cpk-locked-feature-icon{width:15px;height:15px;color:inherit;flex:none;justify-content:center;align-items:center;display:inline-flex}.cpk-locked-feature-icon svg{width:15px;height:15px;display:block}.cpk-locked-feature-title{color:#010507;letter-spacing:-.025em;max-width:680px;margin:0 0 18px;font-size:clamp(25px,2.6vw,34px);font-weight:600;line-height:1.08}.cpk-locked-feature-description{color:#57575b;max-width:680px;margin:0 0 28px;font-size:14px;line-height:1.6}.cpk-locked-feature-media{justify-self:stretch;width:100%;min-width:0}.cpk-threads-overview-video-frame.cpk-locked-feature-video{background:#000;border-color:#e4e4ec;border-radius:12px;width:100%;min-width:0;max-width:none;margin:0;box-shadow:0 14px 32px #2c2b441f}.cpk-locked-feature-outline{box-sizing:border-box;width:100%;max-width:none;margin:40px 0 0}.cpk-locked-feature-outline-list{margin:0;display:block}.cpk-locked-feature-outline-item{min-width:0;padding:0 0 28px;display:block}.cpk-locked-feature-outline-item+.cpk-locked-feature-outline-item{border-top:1px solid #e4e4ec;padding-top:28px}.cpk-locked-feature-outline-item h3,.cpk-locked-feature-outline-item p{margin:0}.cpk-locked-feature-outline-item h3{color:#010507;letter-spacing:-.018em;align-items:center;gap:10px;margin-bottom:10px;font-size:20px;font-weight:600;line-height:1.25;display:flex}.cpk-locked-feature-outline-icon{color:#5558b2;flex:0 0 20px;justify-content:center;align-items:center;width:20px;height:20px;display:inline-flex}.cpk-locked-feature-outline-icon svg{width:18px;height:18px}.cpk-locked-feature-outline-item p{color:#57575b;max-width:68ch;font-size:15px;line-height:1.65}.cpk-threads-overview-title{color:#010507;margin:0 0 10px;font-size:20px;font-weight:600;line-height:1.25}.cpk-threads-overview-copy{color:#57575b;margin:0 0 16px;font-size:13px;line-height:1.55}.cpk-threads-overview-actions{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.cpk-locked-feature .cpk-locked-feature-setup-cta,.cpk-locked-feature .cpk-threads-overview-action{box-sizing:border-box;align-items:center;height:44px;min-height:44px;padding:12px 16px;font-size:13px;font-weight:700;line-height:1}.cpk-threads-overview-action{outline-offset:2px;cursor:pointer;border:1px solid #0000;border-radius:7px;outline:2px solid #0000;justify-content:center;align-items:center;gap:6px;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;line-height:1.25;text-decoration:none;display:inline-flex}[data-inspector-feature-setup-prompt][data-copy-state=copied]{color:#fff;background-color:#087653;border-color:#087653}[data-inspector-feature-setup-prompt][data-copy-state=error]{color:#fff;background-color:#b32d3b;border-color:#b32d3b}[data-inspector-feature-setup-prompt]:focus-visible{outline-offset:2px;outline:2px solid #6430ab}.cpk-threads-overview-action-primary{color:#fff;background-color:#010507;border-color:#010507}.cpk-threads-overview-action-primary:hover{background-color:#2b2b2b;border-color:#2b2b2b}.cpk-threads-overview-action-secondary{color:#010507;background-color:#fff;border-color:#dbdbe5}.cpk-threads-overview-action-secondary:hover{background-color:#fff;border-color:#afafb7}.cpk-threads-overview-video[data-loaded=true]{opacity:1}.cpk-threads-overview-video-control{color:#3f176f;min-height:32px;font:inherit;outline-offset:2px;cursor:pointer;background-color:#fff;border:1px solid #dbdbe5;border-radius:5px;outline:2px solid #0000;justify-content:center;align-items:center;margin:0 0 14px;padding:6px 10px;font-size:12px;font-weight:600;line-height:1.25;display:inline-flex}.cpk-threads-overview-video-control:hover{color:#010507;background-color:#f7f7f9;border-color:#afafb7}.cpk-threads-overview-video-control:focus-visible{outline-offset:2px;outline:2px solid #6430ab}.cpk-threads-overview-video-fallback{color:#57575b;max-width:440px;margin:-4px 0 14px;font-size:12px;line-height:1.5}.cpk-threads-tour-launch{z-index:2;color:#57575b;outline-offset:2px;cursor:pointer;background-color:#fff;border:1px solid #dbdbe5;border-radius:7px;outline:2px solid #0000;padding:7px 10px;font-size:12px;font-weight:600;position:absolute;bottom:16px;right:16px;box-shadow:0 8px 18px #01050714}.cpk-threads-tour{z-index:3;color:#57575b;background-color:#fff;border:1px solid #dbdbe5;border-radius:10px;width:min(340px,100% - 32px);padding:14px;position:absolute;bottom:16px;right:16px;box-shadow:0 16px 36px #01050724}.cpk-threads-tour-step{color:#087653;text-transform:uppercase;margin-bottom:8px;font-family:Spline Sans Mono,monospace;font-size:10px;font-weight:600}.cpk-threads-tour-title{color:#010507;margin-bottom:6px;font-size:14px;font-weight:600;line-height:1.35}.cpk-threads-tour-copy{color:#57575b;font-size:12px;line-height:1.5}.cpk-threads-tour-actions{justify-content:space-between;gap:8px;margin-top:14px;display:flex}.cpk-threads-tour-nav{gap:8px;display:flex}.cpk-threads-tour-skip,.cpk-threads-tour-button{font:inherit;outline-offset:2px;cursor:pointer;border-radius:7px;outline:2px solid #0000;padding:7px 10px;font-size:12px;font-weight:600}.cpk-threads-overview-action:focus-visible,.cpk-threads-tour-launch:focus-visible,.cpk-threads-tour-skip:focus-visible,.cpk-threads-tour-button:focus-visible{outline-color:#6430ab}.cpk-threads-tour-skip{color:#68686e;background-color:#0000;border:0;padding-inline:0}.cpk-threads-tour-button-secondary{color:#57575b;background-color:#fff;border:1px solid #dbdbe5}.cpk-threads-tour-button-primary{color:#fff;background-color:#010507;border:1px solid #010507}.cpk-threads-tour-button:disabled{cursor:not-allowed;opacity:.45}@container cpk-locked-feature (max-width:440px){.cpk-locked-feature .cpk-threads-overview-actions{flex-direction:column;align-items:stretch}.cpk-locked-feature .cpk-locked-feature-setup-cta,.cpk-locked-feature .cpk-threads-overview-action{width:100%}}@media (max-width:720px){.cpk-threads-overview{padding:24px}}@media (prefers-reduced-motion:reduce){.cpk-threads-overview-video{transition:none}}.inspector-window[data-color-scheme=dark]{color-scheme:dark;background-color:var(--cpk-inspector-surface-dark)!important;color:#f3f4f8!important;border-color:#7b7d89!important}.inspector-window[data-color-scheme=dark] .inspector-shell,.inspector-window[data-color-scheme=dark] .inspector-main,.inspector-window[data-color-scheme=dark] #cpk-main-scroll{color:#f3f4f8!important;background-color:#111319!important}.inspector-window[data-color-scheme=dark] .resize-handle,.inspector-window[data-color-scheme=dark] .edge-resize-handle,.inspector-window[data-color-scheme=dark] .dock-resize-handle{background:0 0!important}.inspector-window[data-color-scheme=dark] .drag-handle,.inspector-window[data-color-scheme=dark] .inspector-account-strip{color:#f3f4f8!important;background:#15171e!important;border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .inspector-account-logo{filter:brightness(0)invert();clip-path:inset(0 20% 0 0)}.inspector-window[data-color-scheme=dark] .inspector-account-logo-accent{filter:none;display:block}.inspector-window[data-color-scheme=dark] .inspector-agent-placeholder{color:#b8bbc7!important;border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .inspector-account-control{color:#b8bbc7!important;border:0!important}.inspector-window[data-color-scheme=dark] .inspector-account-control:hover,.inspector-window[data-color-scheme=dark] .inspector-account-control-active{color:#d8d9ff!important;background-color:#292c38!important}.inspector-window[data-color-scheme=dark] .inspector-account-cta{color:#d8d9ff;background-color:#292b43}.inspector-window[data-color-scheme=dark] .inspector-account-cta:hover{color:#fff;background-color:#353854}.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu{box-shadow:0 12px 28px #00000052;color:#f3f4f8!important;background-color:#111319!important;border-color:#5c6173!important}.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button,.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button span{color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button:hover,.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button:focus-visible,.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button:hover span,.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button:focus-visible span{color:#fff!important;background-color:#3a3f52!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar .inspector-agent-selector>[data-context-dropdown-root=true]>button{color:#f3f4f8!important;background-color:#20232c!important;border-color:#464957!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar .inspector-agent-selector>[data-context-dropdown-root=true]>button:hover{background-color:#292c38!important;border-color:#777aae!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar .inspector-agent-selector>[data-context-dropdown-root=true]>button>span:last-child{color:#aeb1bd!important}.inspector-window[data-color-scheme=dark] .inspector-context-dropdown-icon{color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar[data-icon-rail=true] .inspector-agent-selector>[data-context-dropdown-root=true]>button{color:#fff!important;background-color:#2f3340!important;border-color:#8b90a5!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-icon,.inspector-window[data-color-scheme=dark] .inspector-sidebar[data-icon-rail=true] .inspector-agent-placeholder{color:#fff!important}.inspector-window[data-color-scheme=dark] [data-context-dropdown-root=true]>div{color:#f3f4f8!important;box-shadow:none!important;background-color:#191c24!important;border-color:#464957!important}.inspector-window[data-color-scheme=dark] [data-context-dropdown-root=true]>div button:hover,.inspector-window[data-color-scheme=dark] [data-context-dropdown-root=true]>div button:focus{color:#f3f4f8!important;background-color:#343746!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar{color:#f3f4f8;background-color:#15171e;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-sidebar-label{color:#8f93a1}.inspector-window[data-color-scheme=dark] .inspector-sidebar-rail-tooltip{color:#191c24;background-color:#e9e9f1;box-shadow:0 7px 18px #00000047}.inspector-window[data-color-scheme=dark] .inspector-nav-control,.inspector-window[data-color-scheme=dark] .inspector-sidebar-toggle{color:#b8bbc7}.inspector-window[data-color-scheme=dark] .inspector-nav-control:hover,.inspector-window[data-color-scheme=dark] .inspector-sidebar-toggle:hover{color:#fff;background-color:#22252f}.inspector-window[data-color-scheme=dark] .inspector-nav-control-active{color:#d8d9ff;background-color:#292b43;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-sidebar-agent-scope{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-card{background-color:#191c24;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-copy strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-copy>span,.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-card[data-state=disconnected] .inspector-sidebar-status-copy>span{color:#9da1af}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-action{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-action:hover{color:#fff;background-color:#292b43}.inspector-window[data-color-scheme=dark] .inspector-sidebar-intelligence-setup{color:#d8d9ff;background-color:#292b43;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-sidebar-intelligence-setup:hover{background-color:#343653;border-color:#777aae}.inspector-window[data-color-scheme=dark] .inspector-sidebar-intelligence-setup .inspector-sidebar-status-copy strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-sidebar-setup-arrow{background-color:#caccff1f}@media (prefers-reduced-motion:reduce){.inspector-sidebar-intelligence-setup{animation:none}}.inspector-window[data-color-scheme=dark] .inspector-home{background-color:#111319}.inspector-window[data-color-scheme=dark] .inspector-settings{color:#f3f4f8;background-color:#111319}.inspector-window[data-color-scheme=dark] .inspector-settings-header,.inspector-window[data-color-scheme=dark] .inspector-settings-section,.inspector-window[data-color-scheme=dark] .inspector-settings-privacy,.inspector-window[data-color-scheme=dark] .inspector-settings-visibility,.inspector-window[data-color-scheme=dark] .inspector-settings-private-content{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-settings-title,.inspector-window[data-color-scheme=dark] .inspector-settings-section-heading h2,.inspector-window[data-color-scheme=dark] .inspector-settings-status-row h3,.inspector-window[data-color-scheme=dark] .inspector-settings-visibility h3,.inspector-window[data-color-scheme=dark] .inspector-settings-private-content strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-settings-subtitle,.inspector-window[data-color-scheme=dark] .inspector-settings-section-heading p,.inspector-window[data-color-scheme=dark] .inspector-settings-status-row p,.inspector-window[data-color-scheme=dark] .inspector-settings-visibility p,.inspector-window[data-color-scheme=dark] .inspector-settings-private-content>p{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-settings-section-icon{color:#d8d9ff;background-color:#292b43;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-settings-private-content li{color:#c9ccd6}.inspector-window[data-color-scheme=dark] .inspector-settings-private-content li span{color:#75d8b9}.inspector-window[data-color-scheme=dark] .inspector-settings-status{color:#8ce1c5;background-color:#173b32;border-color:#347d69}.inspector-window[data-color-scheme=dark] .inspector-settings-privacy[data-state=disabled] .inspector-settings-status{color:#f2cf8f;background-color:#342916;border-color:#866932}.inspector-window[data-color-scheme=dark] .inspector-settings-policy-link{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-settings-policy-link:hover{color:#fff}.inspector-window[data-color-scheme=dark] .inspector-settings-dismiss{color:#ded7ff;background-color:#272438;border-color:#5d5975}.inspector-window[data-color-scheme=dark] .inspector-settings-dismiss:hover{background-color:#322e47;border-color:#8179a7}.inspector-window[data-color-scheme=dark] .inspector-settings-dismiss:focus-visible{outline-color:#bec2ff}.inspector-window[data-color-scheme=dark] .inspector-home-card,.inspector-window[data-color-scheme=dark] .inspector-home-story,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud,.inspector-window[data-color-scheme=dark] .inspector-home-feature-list,.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview{color:#f3f4f8;background:#191c24;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud[data-state=disconnected]{background-color:#1d1e2b;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud[data-state=disconnected] .inspector-intelligence-hud-description{color:#c5c7d0}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-header{background:linear-gradient(100deg,#1d1e2b 0%,#221f31 54%,#1a2523 100%);border-bottom-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-heading .inspector-home-section-title{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-hint{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-hint[data-tone=success]{color:#d5cbff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-hint[data-tone=error]{color:#ffb3a1}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install[data-copy-state=copied] .inspector-intelligence-install-copy{color:#d5cbff;background-color:#0000;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-secondary{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-fallback{color:#c5c7d0;background-color:#15171e;border-bottom-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story{background-color:#15171e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-beat-label,.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-step>small,.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread>small,.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file>header em{color:#8f93a1}.inspector-window[data-color-scheme=dark] .inspector-intelligence-copy-slide>strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-copy-slide>span{color:#c5c7d0}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread{background-color:#1c1f2b;border-color:#33364a}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread>strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread>i{background-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread[data-failed=true]{background-color:#2a1a16;border-color:#5a3129}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread[data-failed=true]>i{background-color:#f97316}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread[data-failed=true]>strong,.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread[data-failed=true]>small{color:#ffb3a1}.inspector-window[data-color-scheme=dark] .inspector-intelligence-signal{color:#c5c7d0;background-color:#1c1f2b;border-color:#33364a}.inspector-window[data-color-scheme=dark] .inspector-intelligence-rule,.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-proof{color:#8fd9b8;background-color:#16241f;border-color:#2f5748}.inspector-window[data-color-scheme=dark] .inspector-intelligence-rule>i,.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-proof svg{color:#5be4bb}.inspector-window[data-color-scheme=dark] .inspector-intelligence-beat-flow{color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file{box-shadow:none;background-color:#191c24;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file>header{background-color:#1c1f2b;border-bottom-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file>header strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file>header svg,.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-code>span>b,.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-step>i{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-code>span{color:#c5c7d0}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-code>span:before{color:#6d7180}.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-step{background-color:#1c1f2b;border-color:#33364a}.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-step>strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-arrow{color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-rail{border-top-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-tab{color:#8f93a1}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-tab:hover{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-tab[data-active=true]{color:#d5cbff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-tab:after{background-color:#a78bfa}.inspector-window[data-color-scheme=dark] .inspector-system-health,.inspector-window[data-color-scheme=dark] .inspector-system-health-section{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-system-health-section{background-color:#191c24}.inspector-window[data-color-scheme=dark] .inspector-system-health-section .inspector-system-health-header{background-color:#191c24;border-bottom-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-system-health{background-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal{background-color:#191c24}.inspector-window[data-color-scheme=dark] .inspector-system-health-event-link>small{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-system-health-header>span[data-tone=success]{color:#8ce1c5}.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=success],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=success]{background-color:#173b32;border-color:#347d69;color:#8ce1c5!important}.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=checking],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=checking]{background-color:#342916;border-color:#866932;color:#f2cf8f!important}.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=offline],.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=error],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=offline],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=error]{background-color:#3b1c22;border-color:#87424a;color:#ff9aa0!important}.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=unavailable],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=unavailable]{background-color:#242731;border-color:#464957;color:#aeb1bd!important}.inspector-window[data-color-scheme=dark] .inspector-system-health-header>span[data-tone=checking]{color:#f2cf8f}.inspector-window[data-color-scheme=dark] .inspector-system-health-header>span[data-tone=offline],.inspector-window[data-color-scheme=dark] .inspector-system-health-header>span[data-tone=error]{color:#ff9aa0}.inspector-window[data-color-scheme=dark] .inspector-home-story-link:hover,.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview:has(.inspector-whats-new-preview-body:hover){background:#242131;border-color:#777aae}.inspector-window[data-color-scheme=dark] .inspector-home-title,.inspector-window[data-color-scheme=dark] .inspector-home-section-title,.inspector-window[data-color-scheme=dark] .inspector-home-card-title,.inspector-window[data-color-scheme=dark] .inspector-system-health-signal dd,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details .inspector-intelligence-hud-detail-value,.inspector-window[data-color-scheme=dark] .inspector-home-feature{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-home-eyebrow,.inspector-window[data-color-scheme=dark] .inspector-home-card-label,.inspector-window[data-color-scheme=dark] .inspector-home-meta,.inspector-window[data-color-scheme=dark] .inspector-home-body,.inspector-window[data-color-scheme=dark] .inspector-home-card-copy,.inspector-window[data-color-scheme=dark] .inspector-system-health-signal dt,.inspector-window[data-color-scheme=dark] .inspector-system-health-signal small,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-heading p,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details .inspector-intelligence-hud-detail-label,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details .inspector-intelligence-hud-detail-subvalue,.inspector-window[data-color-scheme=dark] .inspector-home-section-header>span,.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview-copy>span:last-child{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details{background-color:#3a3d49;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details>section{background-color:#15171e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-plan-action{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-plan-action:hover{color:#fff;background-color:#0000;border-color:#0000}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal+.inspector-system-health-signal,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details>section+section,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details,.inspector-window[data-color-scheme=dark] .inspector-home-features-empty{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=success] dd,.inspector-window[data-color-scheme=dark] .inspector-home-feature small{color:#8ce1c5}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=active] dd{color:#f2cf8f}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=error] .inspector-system-health-event-type{color:#ff9aa0;background-color:#3b1c22}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=success] .inspector-system-health-event-type{color:#8ce1c5;background-color:#173b32}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=active] .inspector-system-health-event-type{color:#f2cf8f;background-color:#342916}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group{background-color:#191c24;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group-header{color:#c9ccd6;background-color:#20232d;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group-header>span{color:#c9ccd6;background-color:#191c24}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group[data-feature-state-group=active] .inspector-home-feature-group-header{color:#8ce1c5;background-color:#173b32;border-color:#347d69}.inspector-window[data-color-scheme=dark] .inspector-home-feature{background-color:#191c24}.inspector-window[data-color-scheme=dark] .inspector-home-feature:hover{background-color:#20232d}.inspector-window[data-color-scheme=dark] .inspector-home-feature+.inspector-home-feature{border-color:#2f323d}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group-empty{color:#9da1af}.inspector-window[data-color-scheme=dark] .inspector-home-feature[data-state=off]{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-home-feature-status>span{background-color:#191c24;border-color:#6f7484}.inspector-window[data-color-scheme=dark] .inspector-home-feature[data-state=on] .inspector-home-feature-status>span{background-color:#8ce1c5;border-color:#8ce1c5}.inspector-window[data-color-scheme=dark] .inspector-home-feature-action{color:#d4d7e0;background-color:#20232d;border-color:#464957}.inspector-window[data-color-scheme=dark] .inspector-home-feature-label:hover{color:#d8d9ff}.inspector-window[data-color-scheme=dark] .inspector-home-feature-action:hover{color:#fff;background-color:#292b43;border-color:#777aae}.inspector-window[data-color-scheme=dark] .inspector-home-feature-action[data-copy-state=copied]{color:#8ce1c5;background-color:#173b32;border-color:#347d69}.inspector-window[data-color-scheme=dark] .inspector-home-feature-action[data-copy-state=error]{color:#ff9aa0;background-color:#3b1c22;border-color:#87424a}.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview-dismiss{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview-dismiss:hover{color:#fff;background-color:#302a40}.inspector-window[data-color-scheme=dark] .inspector-home-usage-bar{background-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-thread-progress::-webkit-progress-bar{background-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-whats-new-header{box-shadow:none;background-color:#1d1e2b;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-whats-new-updated,.inspector-window[data-color-scheme=dark] .inspector-whats-new-empty{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview-action{color:#d8d9ff}.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview:hover .inspector-whats-new-preview-action{color:#fff}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document,.inspector-window[data-color-scheme=dark] .inspector-whats-new-empty{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content{color:#c9ccd6}.inspector-window[data-color-scheme=dark] .inspector-whats-new-empty .inspector-home-card-title{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h1+p{color:#c9ccd6}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h2{border-top-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h1,.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h2,.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h3,.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content a{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-threads-footer{color:#aeb1bd;background-color:#15171e;border-color:#343742}.inspector-window[data-color-scheme=dark] [data-inspector-thread-count]{color:#f3f4f8}.inspector-window[data-color-scheme=dark] [data-inspector-thread-expiry]{color:#aeb1bd}.inspector-window[data-color-scheme=dark] [data-inspector-action-placement=threads-footer]{color:#d8d9ff;background-color:#191c24;border-color:#464957}.inspector-window[data-color-scheme=dark] [data-inspector-action-placement=threads-footer]:hover{color:#fff;background-color:#20232d;border-color:#777aae}.inspector-window[data-color-scheme=dark] .cpk-threads-overview{background-color:#111319}.inspector-window[data-color-scheme=dark] .cpk-locked-feature{background:#111319}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-copy,.inspector-window[data-color-scheme=dark] .cpk-locked-feature-description{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-name{color:#caccff}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-title{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline{box-shadow:none;background:0 0}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-item h3{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-icon{color:#caccff}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-item{box-shadow:none;color:#f3f4f8;background:0 0}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-item+.cpk-locked-feature-outline-item{border-top-color:#3a3d49}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-item p,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-content,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-copy,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-video-fallback,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-copy{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-title,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-title{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-video-frame{background:linear-gradient(135deg,#666a9e3d,#347d6929),#191c24;border-color:#3a3d49;box-shadow:0 8px 20px #00000038}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-video-control,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action-secondary,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-launch,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button-secondary{color:#d8d9ff;background-color:#191c24;border-color:#464957}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-video-control:hover,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action-secondary:hover,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-launch:hover,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button-secondary:hover{color:#fff;background-color:#242731;border-color:#777aae}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action-primary,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button-primary{color:#171823;background-color:#caccff;border-color:#caccff}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action-primary:hover,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button-primary:hover{background-color:#d8d9ff;border-color:#d8d9ff}.inspector-window[data-color-scheme=dark] .cpk-threads-tour{color:#aeb1bd;background-color:#191c24;border-color:#464957;box-shadow:0 16px 36px #00000052}.inspector-window[data-color-scheme=dark] .cpk-threads-tour-step{color:#8ce1c5}.inspector-window[data-color-scheme=dark] .cpk-threads-tour-skip{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action:focus-visible,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-launch:focus-visible,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-skip:focus-visible,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button:focus-visible{outline-color:#bec2ff}.inspector-window[data-color-scheme=dark] .cpk-agent-overview,.inspector-window[data-color-scheme=dark] .cpk-section-card{background-color:#191c24!important;border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .cpk-section-header{background-color:#242731!important;border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .cpk-section-header h4{color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] .cpk-agent-icon{color:#d8d9ff!important;background-color:#292b43!important}.inspector-window[data-color-scheme=dark] .cpk-stat-card{background-color:#191c24!important;border-color:#464957!important}.inspector-window[data-color-scheme=dark] button.cpk-stat-card:hover{background-color:#20232d!important}.cpk-agent-messages-head{border-bottom:1px solid #e4e4ec}.cpk-agent-message-row+.cpk-agent-message-row{border-top:1px solid #e4e4ec}.inspector-window[data-color-scheme=dark] .cpk-agent-messages-head,.inspector-window[data-color-scheme=dark] .cpk-agent-message-row+.cpk-agent-message-row,.inspector-window[data-color-scheme=dark] .cpk-agent-view .divide-gray-200>:not([hidden])~:not([hidden]),.inspector-window[data-color-scheme=dark] .cpk-agent-view .divide-y>*{border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .cpk-json-block{color:#c9ccd6}.inspector-window[data-color-scheme=dark] [class*=bg-emerald-50],.inspector-window[data-color-scheme=dark] [class*=bg-green-100]{color:#8ce1c5!important;background-color:#173b32!important}.inspector-window[data-color-scheme=dark] [class*=bg-rose-50]{color:#ff9aa0!important;background-color:#3b1c22!important}.inspector-window[data-color-scheme=dark] [data-cpk-event-error] p,.inspector-window[data-color-scheme=dark] [data-playground-error] p{color:inherit!important}.inspector-window[data-color-scheme=dark] [class*=bg-amber-50],.inspector-window[data-color-scheme=dark] [class*=bg-amber-100]{color:#f2cf8f!important;background-color:#342916!important}.inspector-window[data-color-scheme=dark] [class*=bg-blue-50],.inspector-window[data-color-scheme=dark] [class*=bg-blue-100],.inspector-window[data-color-scheme=dark] [class*=bg-sky-50],.inspector-window[data-color-scheme=dark] [class*=bg-violet-50],.inspector-window[data-color-scheme=dark] [class*=bg-purple-50],.inspector-window[data-color-scheme=dark] [class*=bg-fuchsia-50]{color:#d8d9ff!important;background-color:#292b43!important}.inspector-window[data-color-scheme=dark] [class*=bg-white]{background-color:#191c24!important}.inspector-window[data-color-scheme=dark] [class*=bg-gray-50],.inspector-window[data-color-scheme=dark] [class*=bg-slate-50],.inspector-window[data-color-scheme=dark] [class*=bg-gray-100],.inspector-window[data-color-scheme=dark] [class*=bg-slate-100]{background-color:#171a22!important}.inspector-window[data-color-scheme=dark] [class*=text-gray-900],.inspector-window[data-color-scheme=dark] [class*=text-slate-900],.inspector-window[data-color-scheme=dark] [class*=text-gray-800],.inspector-window[data-color-scheme=dark] [class*=text-slate-800],.inspector-window[data-color-scheme=dark] [class*=text-gray-700],.inspector-window[data-color-scheme=dark] [class*=text-slate-700]{color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] [class*=text-gray-600],.inspector-window[data-color-scheme=dark] [class*=text-slate-600],.inspector-window[data-color-scheme=dark] [class*=text-gray-500],.inspector-window[data-color-scheme=dark] [class*=text-slate-500],.inspector-window[data-color-scheme=dark] [class*=text-gray-400],.inspector-window[data-color-scheme=dark] [class*=text-slate-400]{color:#aeb1bd!important}.inspector-window[data-color-scheme=dark] [class*=border-gray-100],.inspector-window[data-color-scheme=dark] [class*=border-slate-100],.inspector-window[data-color-scheme=dark] [class*=border-gray-200],.inspector-window[data-color-scheme=dark] [class*=border-slate-200],.inspector-window[data-color-scheme=dark] [class*=border-gray-300],.inspector-window[data-color-scheme=dark] [class*=border-slate-300]{border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] input,.inspector-window[data-color-scheme=dark] select,.inspector-window[data-color-scheme=dark] textarea{color:#f3f4f8!important;background-color:#191c24!important;border-color:#464957!important}.inspector-window[data-color-scheme=dark] input::placeholder,.inspector-window[data-color-scheme=dark] textarea::placeholder{color:#858996}.inspector-window[data-color-scheme=dark] .cpk-playground-composer{background-color:#2f3340!important;box-shadow:0 0 0 1px #6d7285!important}.inspector-window[data-color-scheme=dark] .cpk-playground-composer:focus-within{box-shadow:0 0 0 1px #c5c8de!important}.inspector-window[data-color-scheme=dark] .cpk-playground-input{color:#f3f4f8!important;caret-color:#f3f4f8!important;background-color:#0000!important}.inspector-window[data-color-scheme=dark] .cpk-playground-input::placeholder{color:#e4e6ef!important;opacity:1!important}.inspector-window[data-color-scheme=dark] .cpk-playground-send:not(:disabled){color:#111319!important;opacity:1!important;background-color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] .cpk-playground-send:disabled{color:#f3f4f8!important;background-color:#f3f4f833!important}.inspector-window[data-color-scheme=dark] ::selection{color:#fff;background-color:#5b5f92}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} \ No newline at end of file +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-green-100:oklch(96.2% .044 156.743);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-700:oklch(49.6% .265 301.924);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--font-weight-semibold:600;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{font-family:var(--font-sans);color:var(--color-slate-900);background-color:#0000;display:block}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.bottom-0{bottom:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-3{margin-block:calc(var(--spacing)*3)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mr-auto{margin-right:auto}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-\[28rem\]{height:28rem}.h-full{height:100%}.max-h-32{max-height:calc(var(--spacing)*32)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-7{min-height:calc(var(--spacing)*7)}.min-h-\[20rem\]{min-height:20rem}.min-h-\[40px\]{min-height:40px}.min-h-\[420px\]{min-height:420px}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-40{width:calc(var(--spacing)*40)}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[80\%\]{max-width:80%}.max-w-\[200px\]{max-width:200px}.max-w-\[240px\]{max-width:240px}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.flex-shrink,.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-\[2px\]{--tw-translate-y:calc(2px*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.list-none{list-style-type:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[16px\]{border-radius:16px}.rounded-\[28px\]{border-radius:28px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-gray-200{border-color:var(--color-gray-200)}.border-purple-200{border-color:var(--color-purple-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-slate-200{border-color:var(--color-slate-200)}.border-violet-200{border-color:var(--color-violet-200)}.bg-\[\#00000014\]{background-color:#00000014}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-black{background-color:var(--color-black)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-50\/50{background-color:#f9fafb80}@supports (color:color-mix(in lab, red, red)){.bg-gray-50\/50{background-color:color-mix(in oklab,var(--color-gray-50)50%,transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-100{background-color:var(--color-green-100)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-white{background-color:var(--color-white)}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white)95%,transparent)}}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-10{padding-block:calc(var(--spacing)*10)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\.5{padding-top:calc(var(--spacing)*1.5)}.pt-8{padding-top:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-4{--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4)}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-\[22px\]{--tw-leading:22px;line-height:22px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[rgb\(13\,13\,13\)\]{color:#0d0d0d}.text-amber-600{color:var(--color-amber-600)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-emerald-700{color:var(--color-emerald-700)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-purple-700{color:var(--color-purple-700)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-950{color:var(--color-rose-950)}.text-slate-500{color:var(--color-slate-500)}.text-slate-800{color:var(--color-slate-800)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-950{color:var(--color-violet-950)}.text-white{color:var(--color-white)}.italic{font-style:italic}.underline{text-decoration-line:underline}.decoration-violet-300{-webkit-text-decoration-color:var(--color-violet-300);-webkit-text-decoration-color:var(--color-violet-300);text-decoration-color:var(--color-violet-300)}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_4px_4px_0_\#0000000a\,0_0_1px_0_\#0000009e\]{--tw-shadow:0 4px 4px 0 var(--tw-shadow-color,#0000000a),0 0 1px 0 var(--tw-shadow-color,#0000009e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-transparent{--tw-ring-color:transparent}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-gray-500::placeholder{color:var(--color-gray-500)}.focus-within\:shadow-\[0_6px_18px_0_\#00000014\,0_0_1px_0_\#0000009e\]:focus-within{--tw-shadow:0 6px 18px 0 var(--tw-shadow-color,#00000014),0 0 1px 0 var(--tw-shadow-color,#0000009e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media (hover:hover){.hover\:border-gray-300:hover{border-color:var(--color-gray-300)}.hover\:bg-blue-50\/50:hover{background-color:#eff6ff80}@supports (color:color-mix(in lab, red, red)){.hover\:bg-blue-50\/50:hover{background-color:color-mix(in oklab,var(--color-blue-50)50%,transparent)}}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-violet-100:hover{background-color:var(--color-violet-100)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-violet-800:hover{color:var(--color-violet-800)}.hover\:decoration-violet-700:hover{-webkit-text-decoration-color:var(--color-violet-700);-webkit-text-decoration-color:var(--color-violet-700);text-decoration-color:var(--color-violet-700)}.hover\:opacity-70:hover{opacity:.7}}.focus\:border-gray-300:focus{border-color:var(--color-gray-300)}.focus\:border-violet-400:focus{border-color:var(--color-violet-400)}.focus\:bg-gray-50:focus{background-color:var(--color-gray-50)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-gray-200:focus{--tw-ring-color:var(--color-gray-200)}.focus\:ring-violet-100:focus{--tw-ring-color:var(--color-violet-100)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:rounded:focus-visible{border-radius:.25rem}.focus-visible\:rounded-sm:focus-visible{border-radius:var(--radius-sm)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-rose-300:focus-visible{--tw-ring-color:var(--color-rose-300)}.focus-visible\:ring-violet-300:focus-visible{--tw-ring-color:var(--color-violet-300)}.focus-visible\:ring-violet-400:focus-visible{--tw-ring-color:var(--color-violet-400)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-\[\#BEC2FF\]:focus-visible{outline-color:#bec2ff}.focus-visible\:outline-gray-300:focus-visible{outline-color:var(--color-gray-300)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:opacity-60:active{opacity:.6}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:text-gray-500:disabled{color:var(--color-gray-500)}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (min-width:48rem){.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\>svg\]\:\!h-8>svg{height:calc(var(--spacing)*8)!important}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing)*3)}.\[\&\>svg\]\:h-3\.5>svg{height:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:h-\[18px\]>svg{height:18px}.\[\&\>svg\]\:\!w-8>svg{width:calc(var(--spacing)*8)!important}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing)*3)}.\[\&\>svg\]\:w-3\.5>svg{width:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:w-\[18px\]>svg{width:18px}.\[\&\>svg\]\:animate-spin>svg{animation:var(--animate-spin)}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}}.cpk-json-block{white-space:pre-wrap;word-break:break-all;color:#57575b;margin:0;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:11px;line-height:1.8;overflow:auto}.inspector-account-strip{border-bottom:1px solid #d8d8e8;width:100%;min-width:0;color:#010507!important;background:#f7f6fd!important}.inspector-account-logo{filter:none}.inspector-account-brand{position:relative}.inspector-account-logo-accent{clip-path:inset(0 0 0 80%);pointer-events:none;display:none;position:absolute;inset:0}.inspector-account-cta{isolation:isolate;color:#3f176f;white-space:nowrap;cursor:pointer;background-color:#eee6fe;border:0;border-radius:5px;flex:none;justify-content:center;align-items:center;gap:7px;min-height:32px;padding:7px 10px;font-size:11px;font-weight:700;line-height:1;text-decoration:none;display:inline-flex;position:relative;overflow:hidden}.inspector-account-cta:after{z-index:0;content:"";opacity:0;pointer-events:none;background:linear-gradient(105deg,#0000 0%,#ffffff14 32%,#ffffffad 50%,#ffffff14 68%,#0000 100%);width:68%;animation:3.8s cubic-bezier(.16,1,.3,1) infinite inspector-account-cta-shimmer;position:absolute;inset:0;transform:translate(-180%)skew(-14deg)}.inspector-account-cta>*{z-index:1;position:relative}.inspector-account-cta[data-motion-paused=true]:after{animation-play-state:paused}@keyframes inspector-account-cta-shimmer{0%{opacity:0;transform:translate(-180%)skew(-14deg)}12%{opacity:1}82%{opacity:.8}to{opacity:0;transform:translate(280%)skew(-14deg)}}.inspector-account-cta:hover{color:#32105d;background-color:#e4d8fc}.inspector-account-cta svg{width:14px;height:14px}@media (prefers-reduced-motion:reduce){.inspector-account-cta:after{animation:none}}.inspector-window-layout{position:relative}.inspector-window-layout-menu{z-index:60;color:#010507;background-color:#fff;border:1px solid #d8d8e8;border-radius:5px;width:188px;padding:4px;display:grid;position:absolute;top:calc(100% + 6px);right:0;overflow:hidden;box-shadow:0 10px 24px #1f173924}.inspector-window-layout-menu button{min-height:34px;color:inherit;text-align:left;cursor:pointer;background-color:#0000;border:0;border-radius:4px;align-items:center;gap:9px;padding:7px 9px;font-size:12px;font-weight:600;display:flex}.inspector-window-layout-menu button:hover,.inspector-window-layout-menu button:focus-visible{color:#3f176f;background-color:#eee6fe;outline:none}.inspector-window-layout-menu button span:first-child{flex:none;display:inline-flex}.inspector-agent-placeholder{color:#68686e;border-color:#c8c8d8}.inspector-primary-navigation,.inspector-child-navigation{display:none}.inspector-shell{background-color:#f7f6fd;flex:auto;min-height:0;display:flex}.inspector-sidebar{z-index:20;background-color:#f7f6fd;border-right:1px solid #d8d8e8;flex-direction:column;flex:none;gap:8px;width:224px;min-width:224px;padding:12px 10px;transition:width .22s,min-width .22s,padding .22s;display:flex;position:relative;overflow:visible}.inspector-sidebar[data-icon-rail=true]{align-items:center;width:52px;min-width:52px;padding:8px}.inspector-sidebar-agent-scope{border-bottom:1px solid #d8d8e8;flex:none;min-width:0;padding-bottom:10px}.inspector-sidebar .inspector-agent-selector{width:100%;min-width:0}.inspector-sidebar .inspector-agent-selector>[data-context-dropdown-root=true]>button{background-color:#fff;border-radius:5px;max-width:none;min-height:34px;padding:6px 8px}.inspector-context-dropdown-icon{color:#68686e;display:inline-flex}.inspector-context-dropdown-icon svg,.inspector-context-dropdown-chevron svg{width:14px;height:14px}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-agent-scope{padding-bottom:8px}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-agent-scope,.inspector-sidebar[data-icon-rail=true] .inspector-agent-selector,.inspector-sidebar[data-icon-rail=true] .inspector-agent-selector>[data-context-dropdown-root=true],.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-footer{flex:none;justify-content:center;align-items:center;width:36px;min-width:36px;max-width:36px;display:flex}.inspector-sidebar[data-icon-rail=true] .inspector-agent-selector>[data-context-dropdown-root=true]>button,.inspector-sidebar[data-icon-rail=true] .inspector-agent-placeholder{box-sizing:border-box;justify-content:center;align-items:center;gap:0;width:36px;min-width:36px;max-width:36px;height:36px;min-height:36px;padding:0;transition:background-color .18s,border-color .18s,color .18s,box-shadow .18s;display:flex;overflow:visible}.inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-label,.inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-chevron,.inspector-sidebar[data-icon-rail=true] .inspector-agent-placeholder span:last-child{display:none}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-agent-scope [data-context-dropdown-root=true]>div{margin-top:0;top:0;left:calc(100% + 8px)}.inspector-icon-rail-menu{transform-origin:0;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .18s,transform .18s,visibility .18s;transform:translate(-8px)scale(.96)}.inspector-icon-rail-menu[data-open=true]{opacity:1;visibility:visible;pointer-events:auto;transform:translate(0)scale(1)}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-section+.inspector-sidebar-section{border-top:1px solid #dbdbe5;margin-top:4px;padding-top:10px}.inspector-sidebar-nav{cursor:default;flex-direction:column;flex:auto;gap:14px;min-height:0;display:flex;overflow:hidden auto}.inspector-sidebar-section{flex-direction:column;gap:4px;display:flex}.inspector-sidebar-label{color:#838389;letter-spacing:.02em;text-align:left;text-transform:none;background:0 0;border:0;width:100%;margin:0 0 2px;padding:0 8px;font-size:11px;font-weight:600;display:block}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-label,.inspector-sidebar[data-icon-rail=true] .inspector-nav-label{display:none}.inspector-sidebar-rail-tooltip{z-index:60;color:#fff;pointer-events:none;white-space:nowrap;background-color:#242331;border-radius:6px;max-width:220px;padding:6px 9px;font-size:11px;font-weight:600;line-height:1.2;position:absolute;left:calc(100% + 8px);transform:translateY(-50%);box-shadow:0 7px 18px #1a172a2e}.inspector-sidebar-control{justify-content:flex-start;width:100%;min-height:36px;display:flex;position:relative}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-nav{overflow:visible}.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-control,.inspector-sidebar[data-icon-rail=true] .inspector-sidebar-toggle,.inspector-sidebar[data-icon-rail=true] .inspector-nav-control{box-sizing:border-box;justify-content:center;align-items:center;gap:0;width:36px;min-width:36px;height:36px;min-height:36px;padding:0;overflow:visible}.inspector-sidebar[data-icon-rail=true] .inspector-nav-icon,.inspector-sidebar[data-icon-rail=true] .inspector-nav-icon svg,.inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-icon,.inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-icon svg{width:18px;height:18px;overflow:visible}.inspector-home-badge{background-color:#fa5f67;border-radius:999px;width:7px;height:7px;position:absolute;top:8px;right:8px}.inspector-sidebar[data-icon-rail=true] .inspector-home-badge{top:6px;right:8px}.inspector-sidebar-toggle{color:#57575b;width:100%;min-height:32px;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:5px;flex:none;justify-content:flex-start;align-items:center;gap:6px;padding:6px 9px;font-size:12px;font-weight:600;display:flex}.inspector-sidebar-toggle:hover{color:#010507;background-color:#f0f0f4}.inspector-sidebar-footer{flex-direction:column;flex:none;gap:6px;padding:2px 0 0;display:flex}.inspector-sidebar-status-list{grid-template-columns:minmax(0,1fr);gap:8px;display:grid}.inspector-sidebar-status-card{color:#2b2b2b;background-color:#fff;border:1px solid #d8d8e8;border-radius:7px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;min-height:52px;padding:9px 10px;display:grid;position:relative}.inspector-sidebar-status-copy{flex-direction:column;gap:2px;min-width:0;line-height:1.25;display:flex}.inspector-sidebar-status-copy strong{color:#010507;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:700;overflow:hidden}.inspector-sidebar-status-copy>span{color:#57575b;text-overflow:ellipsis;white-space:nowrap;font-size:10px;overflow:hidden}.inspector-sidebar-status-card[data-state=disconnected] .inspector-sidebar-status-copy>span{color:#68686e}.inspector-sidebar-status-action{color:#3f176f;white-space:nowrap;background-color:#0000;border:0;border-radius:5px;justify-content:center;align-items:center;gap:0;width:28px;height:28px;padding:0;font-size:10px;font-weight:700;text-decoration:none;display:inline-flex}.inspector-sidebar-status-action:hover{color:#6430ab;background-color:#eee7f8;text-decoration:none}.inspector-sidebar-status-action svg{width:12px;height:12px}.inspector-sidebar-status-action-label{display:none}.inspector-sidebar-intelligence-setup{color:#3f176f;cursor:pointer;background-color:#eee7f8;border-color:#bba5df;text-decoration:none;transition:border-color .12s,background-color .12s,box-shadow .3s;animation:3.2s ease-in-out infinite inspector-sidebar-intelligence-setup-glow}@keyframes inspector-sidebar-intelligence-setup-glow{0%,to{box-shadow:0 0 #6430ab00}50%{box-shadow:0 0 16px 2px #6430ab26}}.inspector-sidebar-intelligence-setup:hover{background-color:#e4d9f4;border-color:#8e6fc0}.inspector-sidebar-intelligence-setup .inspector-sidebar-status-copy strong{color:#3f176f}.inspector-sidebar-setup-arrow{background-color:#6430ab1a;border-radius:5px;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex}.inspector-sidebar-setup-arrow svg{width:13px;height:13px}.inspector-main{background-color:#fff;flex-direction:column;flex:auto;min-width:0;display:flex;position:relative}.inspector-home{background-color:#fff;min-height:100%;padding:30px 32px 40px;position:relative;overflow:auto}.inspector-home:before{display:none}.inspector-home>*{width:min(100%,960px);margin-left:auto;margin-right:auto}.inspector-settings{color:#010507;background-color:#fff;min-height:100%;padding:34px 32px 48px;container:inspector-settings/inline-size}.inspector-settings-header{width:min(100%,720px);margin-left:auto;margin-right:auto;padding-bottom:30px}.inspector-settings-title{color:#010507;margin:0;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:30px;font-weight:600;line-height:1.15}.inspector-settings-subtitle{color:#57575b;max-width:60ch;margin:8px 0 0;font-size:14px;line-height:1.5}.inspector-settings-section{border-top:1px solid #d5d3e4;width:min(100%,720px);margin-left:auto;margin-right:auto;padding:24px 0 26px}.inspector-settings-section-heading{align-items:flex-start;gap:12px;margin-bottom:22px;display:flex}.inspector-settings-section-icon{color:#3f176f;background-color:#eee6fe;border:1px solid #bec2ff;border-radius:8px;flex:none;justify-content:center;align-items:center;width:34px;height:34px;display:inline-flex}.inspector-settings-section-icon svg{width:17px;height:17px}.inspector-settings-section-heading h2,.inspector-settings-status-row h3,.inspector-settings-visibility h3{color:#010507;margin:0;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-weight:600}.inspector-settings-section-heading h2{font-size:17px;line-height:1.3}.inspector-settings-section-heading p{color:#68686e;max-width:54ch;margin:4px 0 0;font-size:12px;line-height:1.5}.inspector-settings-privacy{margin-left:46px}.inspector-settings-status-row{justify-content:space-between;align-items:flex-start;gap:24px;display:flex}.inspector-settings-status-row>div,.inspector-settings-visibility>div{min-width:0}.inspector-settings-status-row h3{font-size:14px;line-height:1.3}.inspector-settings-status-row p{color:#57575b;max-width:56ch;margin:8px 0 0;font-size:12px;line-height:1.55}.inspector-settings-status{color:#087653;text-align:center;white-space:nowrap;background-color:#e5f7f1;border:1px solid #85d3bb;border-radius:999px;flex:none;align-items:center;min-height:24px;padding:3px 8px;font-size:11px;font-weight:700;line-height:1;display:inline-flex}.inspector-settings-privacy[data-state=disabled] .inspector-settings-status{color:#7d4d0a;background-color:#fff5df;border-color:#dfc08f}.inspector-settings-private-content{border-top:1px solid #e4e4ec;margin-top:22px;padding-top:18px}.inspector-settings-private-content strong{color:#010507;font-size:13px;font-weight:700}.inspector-settings-private-content>p{color:#68686e;margin:4px 0 0;font-size:11px;line-height:1.45}.inspector-settings-private-content ul{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 18px;margin:12px 0 0;display:grid}.inspector-settings-private-content li{color:#3e3d48;align-items:center;gap:7px;min-width:0;font-size:12px;line-height:1.35;display:flex}.inspector-settings-private-content li span{color:#087653;flex:none;display:inline-flex}.inspector-settings-private-content li svg{width:14px;height:14px}.inspector-settings-policy-link{color:#3f176f;text-underline-offset:3px;outline-offset:2px;outline:2px solid #0000;align-items:center;gap:6px;min-height:36px;margin-top:20px;font-size:12px;font-weight:700;text-decoration:underline;text-decoration-thickness:1px;display:inline-flex}.inspector-settings-policy-link:hover{color:#6430ab}.inspector-settings-policy-link:focus-visible{outline-color:#6430ab}.inspector-settings-policy-link svg{width:14px;height:14px}.inspector-settings-visibility{margin-left:46px}.inspector-settings-visibility h3{font-size:14px;line-height:1.3}.inspector-settings-visibility p{color:#57575b;max-width:48ch;margin:8px 0 0;font-size:12px;line-height:1.55}.inspector-settings-dismiss{color:#3f176f;text-align:center;cursor:pointer;background-color:#f5f2ff;border:1px solid #c9c2e6;border-radius:7px;justify-content:center;align-items:center;gap:7px;min-height:40px;margin-top:16px;padding:8px 12px;font-size:12px;font-weight:700;line-height:1.2;display:inline-flex}.inspector-settings-dismiss:hover{background-color:#eee8ff;border-color:#a69aca}.inspector-settings-dismiss:focus-visible{outline-offset:2px;outline:2px solid #6430ab}.inspector-settings-dismiss svg{width:14px;height:14px}@media (max-width:720px){.inspector-settings{padding:28px 24px 40px}.inspector-settings-section-heading p{max-width:42ch}}@media (max-width:480px){.inspector-settings{padding-left:18px;padding-right:18px}}@container inspector-settings (max-width:520px){.inspector-settings-privacy,.inspector-settings-visibility{margin-left:0}.inspector-settings-status-row{flex-direction:column;gap:12px}.inspector-settings-private-content ul{grid-template-columns:1fr}.inspector-settings-dismiss{width:100%}}.inspector-home-card,.inspector-home-story{background-color:#ffffffd1;border:1px solid #deddea;border-radius:5px;padding:18px 18px 16px;position:relative}.inspector-home-eyebrow,.inspector-home-card-label,.inspector-home-meta{color:#57575b;margin:0;font-size:12px;font-weight:600}.inspector-home-title,.inspector-home-section-title,.inspector-home-card-title{color:#010507;margin:8px 0 0;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:28px;font-weight:600;line-height:1.15}.inspector-home-section-title{letter-spacing:-.015em;margin:0 0 14px;font-size:17px}.inspector-home-card-title{font-size:16px}.inspector-home-body,.inspector-home-card-copy{color:#57575b;max-width:52ch;margin:10px 0 0;font-size:15px;line-height:1.5}.inspector-home-section{margin-top:24px;position:relative}.inspector-home>.inspector-home-section:first-child{margin-top:0}.inspector-whats-new-preview+.inspector-home-section{margin-top:20px}.inspector-home-section-header{justify-content:space-between;align-items:center;gap:16px;margin-bottom:12px;display:flex}.inspector-home-section-header .inspector-home-section-title{margin-bottom:0}.inspector-home-section-header>span{color:#68686e;font-size:11px;font-weight:600;line-height:1.35}.inspector-system-health-header>span[data-tone=success]{color:#087653}.inspector-system-health-header>span[data-tone=checking]{color:#8a5900}.inspector-system-health-header>span[data-tone=offline],.inspector-system-health-header>span[data-tone=error]{color:#b32d3b}.inspector-system-health-section{background-color:#f7f4fe;border:1px solid #c8c6e6;border-radius:5px;overflow:hidden}.inspector-system-health-section .inspector-system-health-header{background-color:#f7f4fe;border-bottom:1px solid #d5d3e4;align-items:center;min-height:76px;margin:0;padding:18px}.inspector-system-health-heading{min-width:0}.inspector-system-health-heading .inspector-home-section-title{color:#010507;letter-spacing:-.025em;font-size:18px}.inspector-system-health-state,.inspector-intelligence-hud-state{color:#087653;background-color:#e5f7f1;border:1px solid #85d3bb;border-radius:999px;flex:none;align-items:center;gap:6px;min-height:24px;padding:4px 8px;font-size:10px;font-weight:700;line-height:1;display:inline-flex}.inspector-system-health-state>span,.inspector-intelligence-hud-state>span{background-color:currentColor;border-radius:999px;width:6px;height:6px}.inspector-system-health-state[data-tone=checking],.inspector-intelligence-hud-state[data-tone=checking]{background-color:#fff5df;border-color:#dfc08f;color:#7d4d0a!important}.inspector-system-health-state[data-tone=offline],.inspector-system-health-state[data-tone=error],.inspector-intelligence-hud-state[data-tone=offline],.inspector-intelligence-hud-state[data-tone=error]{background-color:#fff0f1;border-color:#e7a7ac;color:#b32d3b!important}.inspector-system-health-state[data-tone=unavailable],.inspector-intelligence-hud-state[data-tone=unavailable]{background-color:#f0f0f4;border-color:#c8c8d2;color:#57575b!important}.inspector-system-health{background-color:#d5d3e4;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;display:grid;overflow:hidden}.inspector-system-health-signal{background-color:#fff;grid-template-columns:minmax(0,1fr);align-items:start;min-width:0;min-height:84px;padding:15px 16px 14px;display:grid}.inspector-system-health-copy{flex-direction:column;min-width:0;display:flex}.inspector-system-health-signal dt{color:#68686e;letter-spacing:.035em;text-transform:uppercase;font-size:10px;font-weight:700;line-height:1.3}.inspector-system-health-signal dd{color:#010507;text-overflow:ellipsis;white-space:nowrap;min-width:0;margin:5px 0 0;font-size:15px;font-weight:700;overflow:hidden}.inspector-system-health-signal small{color:#68686e;text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-top:4px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;line-height:1.4;overflow:hidden}small.inspector-system-health-detail{letter-spacing:0;font-family:inherit;font-size:11px;font-weight:500;line-height:1.4}.inspector-system-health-url{cursor:help;outline:none;position:relative;overflow:visible!important}.inspector-system-health-url>span{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.inspector-system-health-url:after{z-index:30;color:#f3f4f8;content:attr(data-full-value);opacity:0;overflow-wrap:anywhere;pointer-events:none;white-space:normal;background-color:#15171e;border:1px solid #3a3d49;border-radius:4px;width:max-content;max-width:min(360px,70vw);padding:7px 9px;font-size:10px;font-weight:500;line-height:1.45;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 7px);left:0;transform:translateY(3px);box-shadow:0 8px 20px #0105072e}.inspector-system-health-url:hover:after,.inspector-system-health-url:focus-visible:after{opacity:1;transform:translateY(0)}.inspector-system-health-url:focus-visible>span{outline-offset:2px;border-radius:3px;outline:2px solid #6430ab}.inspector-system-health-signal[data-tone=success] dd{color:#087653}.inspector-system-health-signal[data-tone=active] dd{color:#8a5900}.inspector-system-health-event-link{width:100%;min-width:0;color:inherit;cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;padding:0;display:block}.inspector-system-health-event-link>span{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.inspector-system-health-event-link>.inspector-system-health-event-type{color:#57575b;letter-spacing:.025em;background-color:#f1f1f3;border-radius:999px;align-items:center;width:fit-content;max-width:100%;padding:3px 6px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;font-weight:700;line-height:1.25;display:inline-flex}.inspector-system-health-event-link>small{color:#68686e;align-items:center;gap:6px;margin:5px 0 0;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:10px;font-weight:500;line-height:1.25;display:flex}.inspector-system-health-event-meta strong{color:#6430ab;text-underline-offset:3px;font-weight:700;-webkit-text-decoration:underline #0000;text-decoration:underline #0000}.inspector-system-health-signal[data-tone=error] .inspector-system-health-event-type{color:#b32d3b;background-color:#fff0f1}.inspector-system-health-signal[data-tone=success] .inspector-system-health-event-type{color:#087653;background-color:#e3f5ee}.inspector-system-health-signal[data-tone=active] .inspector-system-health-event-type{color:#8a5900;background-color:#fff5df}.inspector-system-health-event-link:hover .inspector-system-health-event-meta strong{text-decoration-color:currentColor}.inspector-system-health-event-link:focus-visible{outline-offset:3px;border-radius:3px;outline:2px solid #6430ab}.inspector-intelligence-hud{background-color:#f7f4fe;border:1px solid #c8c6e6;border-radius:5px;overflow:hidden}.inspector-intelligence-hud-header{justify-content:space-between;align-items:center;gap:24px;padding:18px;display:flex}.inspector-intelligence-hud[data-state=disconnected]{border-color:#bba5df}.inspector-intelligence-hud[data-state=disconnected] .inspector-intelligence-hud-header{align-items:center;min-height:132px;padding:22px}.inspector-intelligence-hud[data-state=disconnected] .inspector-intelligence-hud-header-actions{flex-direction:column;align-items:flex-end;gap:10px}.inspector-intelligence-hud-heading{min-width:0}.inspector-intelligence-hud-header-actions{flex:none;align-items:center;gap:8px;display:flex}.inspector-intelligence-hud-heading .inspector-home-section-title{margin:0;font-size:18px}.inspector-intelligence-hud-description{color:#4f4f55;max-width:64ch;margin:10px 0 0;font-size:12px;line-height:1.55}.inspector-intelligence-hud-action{color:#fff;background-color:#6430ab;border:1px solid #6430ab;border-radius:4px;flex:none;justify-content:center;align-items:center;gap:7px;min-height:34px;padding:8px 11px;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:11px;font-weight:700;text-decoration:none;display:inline-flex}.inspector-intelligence-hud-action:hover{background-color:#4e238c;border-color:#4e238c}.inspector-intelligence-hud-action svg{width:13px;height:13px}.inspector-intelligence-hud-connect-action{min-height:38px;padding:10px 14px;font-size:12px}.inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-header{background:linear-gradient(100deg,#fbfaff 0%,#f2eeff 52%,#edfaf5 100%);border-bottom:1px solid #d5d3e4;align-items:center;min-height:76px;padding:18px}.inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-heading .inspector-home-section-title{color:#010507;letter-spacing:-.025em;align-items:center;gap:8px;font-size:18px;display:inline-flex}.inspector-intelligence-mark{flex:none;width:17px;height:17px;display:block}.inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-header-actions{flex-direction:column;align-items:flex-end;gap:6px}.inspector-intelligence-sr-summary{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.inspector-intelligence-copy{padding:16px 18px 0;display:grid}.inspector-intelligence-copy-slide{opacity:0;flex-direction:column;grid-area:1/1;gap:4px;transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .38s cubic-bezier(.22,1,.36,1);display:flex}.inspector-intelligence-copy-slide[data-position=after]{transform:translate(14px)}.inspector-intelligence-copy-slide[data-position=before]{transform:translate(-14px)}.inspector-intelligence-copy-slide[data-position=active]{opacity:1;transform:none}.inspector-intelligence-copy-slide>strong{color:#2b2b31;text-wrap:balance;max-width:52ch;font-size:12.5px;font-weight:650;line-height:1.4}.inspector-intelligence-copy-slide>span{color:#4f4f55;max-width:64ch;font-size:11px;line-height:1.55}.inspector-intelligence-install{justify-content:flex-end;align-items:center;gap:12px;display:flex}.inspector-intelligence-install-copy{cursor:pointer;min-height:34px;transition:background-color .14s,border-color .14s}.inspector-intelligence-install-copy svg{width:13px;height:13px}.inspector-intelligence-install[data-copy-state=copied] .inspector-intelligence-install-copy{color:#4e238c;background-color:#fff;border-color:#bba5df}.inspector-intelligence-install-secondary{color:#6430ab;align-items:center;gap:5px;font-size:11px;font-weight:600;text-decoration:none;display:inline-flex}.inspector-intelligence-install-secondary:hover{text-underline-offset:2px;text-decoration:underline}.inspector-intelligence-install-secondary svg{width:12px;height:12px}.inspector-intelligence-install-hint{color:#68686e;white-space:nowrap;margin:0;font-size:11px;font-weight:600;line-height:1.4}.inspector-intelligence-install-hint[data-tone=success]{color:#4e238c;font-weight:600}.inspector-intelligence-install-hint[data-tone=error]{color:#a3341f;font-weight:600}.inspector-intelligence-install-fallback{color:#4f4f55;-webkit-user-select:all;user-select:all;white-space:pre-wrap;word-break:break-word;background-color:#fff;border-bottom:1px solid #d5d3e4;max-height:96px;padding:10px 18px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10.5px;line-height:1.65;display:block;overflow:auto}.inspector-intelligence-story{background-color:#fff;container:cpk-intel-story/inline-size}.inspector-intelligence-story-stage{padding:16px 18px;display:grid}.inspector-intelligence-beat{visibility:hidden;opacity:0;grid-area:1/1;align-items:center;transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .38s cubic-bezier(.22,1,.36,1),visibility 0s linear .38s;display:flex}.inspector-intelligence-beat[data-position=after]{transform:translate(14px)}.inspector-intelligence-beat[data-position=before]{transform:translate(-14px)}.inspector-intelligence-beat[data-position=active]{visibility:visible;opacity:1;transition:opacity .32s cubic-bezier(.22,1,.36,1),transform .38s cubic-bezier(.22,1,.36,1),visibility;transform:none}.inspector-intelligence-beat[data-beat-id=threads]{flex-direction:column;justify-content:center;gap:6px}.inspector-intelligence-threads{flex-direction:column;gap:6px;width:100%;display:flex}.inspector-intelligence-thread{opacity:0;background-color:#faf9fe;border:1px solid #e6e3f2;border-radius:4px;align-items:center;gap:9px;padding:8px 10px;transition:opacity .3s,transform .3s;display:flex;transform:translateY(3px)}.inspector-intelligence-thread>i{background-color:#9b8cc4;border-radius:999px;flex:none;width:6px;height:6px}.inspector-intelligence-thread>strong{color:#2b2b31;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;overflow:hidden}.inspector-intelligence-thread>small{color:#68686e;flex:none;margin-left:auto;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:9.5px}.inspector-intelligence-thread[data-failed=true]{background-color:#fdf6f4;border-color:#f0d5cf}.inspector-intelligence-thread[data-failed=true]>i{background-color:#c2410c}.inspector-intelligence-thread[data-failed=true]>strong,.inspector-intelligence-thread[data-failed=true]>small{color:#8f2f1c;font-weight:650}.inspector-intelligence-story[data-beat=threads] .inspector-intelligence-thread{opacity:1;transition-delay:calc(var(--thread-index)*80ms + 90ms);transform:none}.inspector-intelligence-beat[data-beat-id=learning]{grid-template-columns:minmax(0,1.15fr) auto minmax(0,.85fr);align-items:center;gap:12px;display:grid}.inspector-intelligence-beat-col{flex-direction:column;gap:6px;min-width:0;display:flex}.inspector-intelligence-beat-label{color:#68686e;letter-spacing:.06em;text-transform:uppercase;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:9px;font-weight:600}.inspector-intelligence-signal,.inspector-intelligence-rule{color:#4f4f55;opacity:0;background-color:#faf9fe;border:1px solid #e6e3f2;border-radius:4px;align-items:flex-start;gap:6px;padding:6px 8px;font-size:10.5px;line-height:1.4;transition:opacity .3s,transform .3s;display:flex;transform:translateY(3px)}.inspector-intelligence-signal{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.inspector-intelligence-rule{color:#21543f;background-color:#f4fbf8;border-color:#cfe9dd;font-weight:600}.inspector-intelligence-rule>i{color:#1f8a5f;flex:none;align-items:center;display:inline-flex}.inspector-intelligence-rule>i svg{stroke-width:2.4px;width:11px;height:11px}.inspector-intelligence-story[data-beat=learning] .inspector-intelligence-signal,.inspector-intelligence-story[data-beat=learning] .inspector-intelligence-rule{opacity:1;transform:none}.inspector-intelligence-story[data-beat=learning] .inspector-intelligence-signal{transition-delay:calc(var(--signal-index)*80ms + .1s)}.inspector-intelligence-story[data-beat=learning] .inspector-intelligence-rule{transition-delay:calc(var(--rule-index)*80ms + .42s)}.inspector-intelligence-beat-flow{color:#9b8cc4;justify-content:center;align-items:center;display:inline-flex}.inspector-intelligence-beat-flow svg{width:15px;height:15px}.inspector-intelligence-beat[data-beat-id=skill]{justify-content:center}.inspector-intelligence-skill-file{background-color:#fff;border:1px solid #d5d3e4;border-radius:5px;width:min(100%,30rem);overflow:hidden;box-shadow:0 1px 2px #100c280f}.inspector-intelligence-skill-file>header{background-color:#faf9fe;border-bottom:1px solid #ebe9f4;align-items:center;gap:7px;padding:7px 10px;display:flex}.inspector-intelligence-skill-file>header svg{color:#6430ab;width:12px;height:12px}.inspector-intelligence-skill-file>header strong{color:#2b2b31;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10.5px;font-weight:600}.inspector-intelligence-skill-file>header em{color:#68686e;letter-spacing:.05em;text-transform:uppercase;margin-left:auto;font-size:9px;font-style:normal;font-weight:600}.inspector-intelligence-skill-code{flex-direction:column;padding:8px 0;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10.5px;line-height:1.75;display:flex}.inspector-intelligence-skill-code>span{color:#4f4f55;gap:10px;padding:0 12px;display:flex}.inspector-intelligence-skill-code>span:before{color:#a9a7bb;content:attr(data-line);text-align:right;min-width:8px}.inspector-intelligence-skill-code>span>b{color:#6430ab;font-weight:600}.inspector-intelligence-skill-code>span[style*=--rule-index]{opacity:0;transition:opacity .26s,transform .26s;transform:translateY(2px)}.inspector-intelligence-story[data-beat=skill] .inspector-intelligence-skill-code>span[style*=--rule-index]{opacity:1;transition-delay:calc(var(--rule-index)*.11s + .26s);transform:none}.inspector-intelligence-beat[data-beat-id=intelligence]{flex-direction:column;justify-content:center;gap:12px}.inspector-intelligence-chain{justify-content:center;align-items:stretch;gap:6px;width:100%;display:flex}.inspector-intelligence-chain-step{opacity:0;background-color:#faf9fe;border:1px solid #e6e3f2;border-radius:5px;flex-direction:column;flex:1 1 0;align-items:flex-start;gap:3px;min-width:0;padding:9px 10px;transition:opacity .28s,transform .28s;display:flex;transform:translateY(4px)}.inspector-intelligence-chain-step>i{color:#6430ab;display:inline-flex}.inspector-intelligence-chain-step>i svg{width:14px;height:14px}.inspector-intelligence-chain-step>strong{color:#2b2b31;font-size:11px;font-weight:700;line-height:1.25}.inspector-intelligence-chain-step>small{color:#68686e;font-size:9.5px;line-height:1.3}.inspector-intelligence-chain-arrow{color:#bba5df;opacity:0;flex:none;align-items:center;transition:opacity .28s;display:inline-flex}.inspector-intelligence-chain-arrow svg{width:13px;height:13px}.inspector-intelligence-story[data-beat=intelligence] .inspector-intelligence-chain-step,.inspector-intelligence-story[data-beat=intelligence] .inspector-intelligence-chain-arrow{opacity:1;transition-delay:calc(var(--step-index)*90ms + 80ms);transform:none}.inspector-intelligence-chain-proof{color:#21543f;opacity:0;background-color:#f4fbf8;border:1px solid #cfe9dd;border-radius:999px;align-self:center;align-items:center;gap:6px;padding:5px 11px;font-size:10.5px;font-weight:600;transition:opacity .3s,transform .3s;display:inline-flex;transform:translateY(3px)}.inspector-intelligence-chain-proof svg{color:#1f8a5f;width:12px;height:12px}.inspector-intelligence-chain-proof code{font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;font-weight:600}.inspector-intelligence-story[data-beat=intelligence] .inspector-intelligence-chain-proof{opacity:1;transition-delay:.46s;transform:none}.inspector-intelligence-story-rail{border-top:1px solid #ebe9f4;align-items:center;gap:2px;padding:8px 18px 9px;display:flex}.inspector-intelligence-story-tab{color:#68686e;cursor:pointer;background:0 0;border:0;border-radius:3px;padding:3px 7px 5px;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:10.5px;font-weight:600;transition:color .16s;position:relative}.inspector-intelligence-story-tab:after{content:"";transform-origin:0;background-color:#6430ab;border-radius:2px;height:1.5px;transition:transform .28s cubic-bezier(.22,1,.36,1);position:absolute;bottom:1px;left:7px;right:7px;transform:scaleX(0)}.inspector-intelligence-story-tab:hover{color:#2b2b31}.inspector-intelligence-story-tab[data-active=true]{color:#4e238c}.inspector-intelligence-story-tab[data-active=true]:after{transform:scaleX(1)}@container cpk-intel-story (max-width:30rem){.inspector-intelligence-chain-step>small{display:none}.inspector-intelligence-story-rail{flex-wrap:wrap}}@media (prefers-reduced-motion:reduce){.inspector-intelligence-copy-slide,.inspector-intelligence-thread,.inspector-intelligence-beat,.inspector-intelligence-signal,.inspector-intelligence-rule,.inspector-intelligence-chain-step,.inspector-intelligence-chain-arrow,.inspector-intelligence-chain-proof,.inspector-intelligence-skill-code>span[style*=--rule-index],.inspector-intelligence-story-tab:after{transition-duration:0s;transition-delay:0s}}.inspector-intelligence-hud-details{background-color:#d5d3e4;border-top:1px solid #d5d3e4;grid-template-columns:minmax(0,1fr) minmax(0,2fr);gap:1px;display:grid}.inspector-intelligence-hud-details>section{background-color:#fff;min-width:0;padding:15px 18px 17px}.inspector-intelligence-hud-detail-label{color:#68686e;font-size:11px;font-weight:600;display:block}.inspector-intelligence-hud-detail-value{color:#010507;text-overflow:ellipsis;white-space:nowrap;min-width:0;margin:5px 0 0;font-size:14px;font-weight:700;display:block;overflow:hidden}.inspector-intelligence-hud-detail-subvalue{color:#68686e;text-transform:capitalize;margin-top:3px;font-size:10px;font-weight:500;display:block}.inspector-intelligence-hud-plan{grid-template-columns:minmax(0,1fr) minmax(120px,1fr);align-items:start;gap:24px;display:grid}.inspector-intelligence-hud-usage{min-width:0}.inspector-intelligence-hud-plan-action{color:#6430ab;text-underline-offset:3px;background-color:#0000;border:0;border-radius:0;gap:4px;min-height:auto;margin-top:9px;padding:0;font-size:10px;font-weight:700;line-height:1.2;-webkit-text-decoration:underline #0000;text-decoration:underline #0000;text-decoration-thickness:1px}.inspector-intelligence-hud-plan-action:hover{color:#4e238c;background-color:#0000;border-color:#0000;text-decoration-color:currentColor}.inspector-intelligence-hud-plan-action svg{width:11px;height:11px}.inspector-home-usage-bar{background-color:#dbdbe5;border-radius:999px;width:min(160px,100%);height:5px;margin-top:8px;display:block;overflow:hidden}.inspector-home-usage-bar>span{background-color:#bec2ff;height:100%;display:block}.inspector-home-feature-groups{grid-template-columns:repeat(auto-fit,minmax(min(100%,250px),1fr));align-items:start;gap:12px;display:grid}.inspector-home-feature-group{background-color:#fff;border:1px solid #d5d3e4;border-radius:5px;overflow:visible}.inspector-home-feature-group-header{color:#57575b;background-color:#f7f7f9;border-bottom:1px solid #e4e4ec;border-radius:4px 4px 0 0;justify-content:space-between;align-items:center;gap:12px;min-height:40px;padding:9px 12px;display:flex}.inspector-home-feature-group-header strong{font-size:12px;font-weight:700}.inspector-home-feature-group-header>span{background-color:#fff;border-radius:999px;justify-content:center;align-items:center;min-width:22px;min-height:20px;padding:2px 6px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;font-weight:700;display:inline-flex}.inspector-home-feature-group[data-feature-state-group=active] .inspector-home-feature-group-header{color:#087653;background-color:#e5f7f1;border-color:#b9e3d6}.inspector-home-feature-list{background-color:#fff;flex-direction:column;margin:0;display:flex}.inspector-home-feature{color:#010507;background-color:#fff;grid-template-columns:18px minmax(0,1fr) auto;align-items:center;gap:8px;min-width:0;min-height:52px;padding:9px 12px;font-size:12px;font-weight:600;display:grid;container-type:inline-size}.inspector-home-feature+.inspector-home-feature{border-top:1px solid #ececf1}.inspector-home-feature:last-child{border-radius:0 0 4px 4px}.inspector-home-feature-group-empty{color:#68686e;margin:0;padding:15px 12px;font-size:11px}.inspector-home-feature:hover{background-color:#f7f7f9}.inspector-home-feature-label{min-width:0;color:inherit;cursor:pointer;align-items:center;gap:4px;text-decoration:none;display:inline-flex}.inspector-home-feature-label>span:first-child{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.inspector-home-feature-label-icon{flex:none;display:inline-flex!important;overflow:visible!important}.inspector-home-feature-label-icon svg{width:12px;height:12px}.inspector-home-feature-label:hover{color:#3f176f;text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px}.inspector-home-feature-label:focus-visible{outline-offset:2px;border-radius:3px;outline:2px solid #6430ab}.inspector-home-feature-actions{justify-content:flex-end;align-items:center;gap:6px;display:inline-flex}.inspector-home-feature-status{flex:none;justify-content:center;align-items:center;width:18px;height:28px;display:inline-flex}.inspector-home-feature-status>span{background-color:#fff;border:1px solid #9ca0ab;border-radius:999px;width:8px;height:8px}.inspector-home-feature[data-state=on] .inspector-home-feature-status>span{background-color:#087653;border-color:#087653}.inspector-home-feature[data-state=off]{color:#68686e}.inspector-home-feature-action{color:#4f4f55;min-width:28px;height:28px;min-height:28px;font:inherit;white-space:nowrap;cursor:pointer;background-color:#fff;border:1px solid #d5d3e4;border-radius:4px;justify-content:center;align-items:center;gap:5px;padding:0 8px;font-size:10px;font-weight:700;line-height:1;text-decoration:none;display:inline-flex}.inspector-home-feature-action svg{width:14px;height:14px}.inspector-home-feature-action-icon{flex:none;display:inline-flex!important;overflow:visible!important}.inspector-home-feature-action-label{line-height:1}.inspector-home-feature-action.inspector-system-health-url:after{content:none;left:50%;right:auto;transform:translate(-50%,3px)}.inspector-home-feature-action.inspector-system-health-url:hover:after,.inspector-home-feature-action.inspector-system-health-url:focus-visible:after{transform:translate(-50%)}.inspector-home-feature-action:hover{color:#3f176f;background-color:#f7f4fe;border-color:#bba5df}.inspector-home-feature-action:focus-visible{outline-offset:2px;outline:2px solid #6430ab}.inspector-home-feature-action[data-copy-state=copied]{color:#087653;background-color:#e5f7f1;border-color:#b9e3d6}.inspector-home-feature-action[data-copy-state=error]{color:#b32d3b;background-color:#fff0f1;border-color:#e7a7ac}@container (max-width:286px){.inspector-home-feature-action{width:28px;padding:0}.inspector-home-feature-action-label{display:none!important}.inspector-home-feature-action.inspector-system-health-url:after{content:attr(data-full-value)}}.inspector-home-features-empty{color:#57575b;border-top:1px solid #deddea;border-bottom:1px solid #deddea;margin:14px 0 0;padding:16px 0;font-size:12px}.inspector-home-news{gap:12px;display:grid}.inspector-whats-new-preview{color:#010507;background-color:#f7f4fe;border:1px solid #c8c6e6;border-radius:5px;align-items:stretch;width:100%;min-height:64px;display:flex;position:relative;overflow:hidden;container-type:inline-size}.inspector-whats-new-preview:has(.inspector-whats-new-preview-body:hover){background-color:#f1ebfc;border-color:#8f91d7}.inspector-whats-new-preview-body{min-width:0;color:inherit;text-align:left;cursor:pointer;background-color:#0000;border:0;flex:auto;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:12px 14px;display:grid}.inspector-whats-new-preview-copy{flex-direction:column;gap:3px;min-width:0;display:flex}.inspector-whats-new-preview-title{align-items:center;gap:8px;min-width:0;display:flex}.inspector-whats-new-preview-copy strong{text-overflow:ellipsis;white-space:nowrap;font-family:Plus Jakarta Sans,system-ui,sans-serif;font-size:13px;line-height:1.25;overflow:hidden}.inspector-whats-new-preview-copy>span:last-child{color:#4e4c63;text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:1.4;overflow:hidden}.inspector-whats-new-preview-action{color:#3f176f;white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:11px;font-weight:700;display:inline-flex}.inspector-whats-new-preview-action svg{width:15px;height:15px}@container (max-width:640px){.inspector-whats-new-preview-body{grid-template-columns:minmax(0,1fr)}.inspector-whats-new-preview-action{display:none}}.inspector-whats-new-preview-dismiss{color:#68686e;cursor:pointer;background-color:#0000;border:0;border-radius:5px;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex;position:absolute;top:50%;right:12px;transform:translateY(-50%)}.inspector-whats-new-preview-dismiss:hover{color:#3f176f;background-color:#6430ab1a}.inspector-whats-new-preview-dismiss svg{width:14px;height:14px}@media (max-width:720px){.inspector-account-cta{width:32px;padding-inline:0}.inspector-account-cta-label{display:none}.inspector-home{padding:24px 22px 34px}.inspector-intelligence-hud-header{flex-wrap:wrap}.inspector-intelligence-hud-details{grid-template-columns:1fr}.inspector-intelligence-hud-plan{grid-template-columns:repeat(2,minmax(0,1fr))}.inspector-whats-new-preview-action{display:none}}@media (max-width:600px){.inspector-system-health{grid-template-columns:1fr}}@media (max-width:480px){.inspector-home-feature{grid-template-columns:18px minmax(0,1fr);gap:8px}.inspector-home-feature-actions{grid-column:1/-1;justify-content:flex-end}.inspector-system-health-section .inspector-system-health-header{align-items:flex-start}.inspector-intelligence-hud-header{flex-direction:column;align-items:stretch}.inspector-intelligence-hud-header-actions{justify-content:space-between}.inspector-intelligence-hud-header-actions .inspector-intelligence-hud-action,.inspector-intelligence-hud-plan{width:100%}.inspector-intelligence-hud-plan{grid-template-columns:1fr;align-items:stretch}.inspector-intelligence-hud-plan-action{justify-self:start}.inspector-whats-new-header{align-items:center;gap:16px;width:calc(100% - 24px);padding:24px 22px}.inspector-whats-new-document,.inspector-whats-new-empty{padding:20px 22px 36px}.inspector-whats-new-document .announcement-content h1+p{font-size:16px}}.inspector-whats-new-header{background:#f8f7ff;border:1px solid #d8d8e8;border-radius:5px;justify-content:space-between;align-items:center;gap:24px;width:calc(100% - 44px);max-width:calc(70ch - 44px);padding:30px 32px 28px;display:flex;box-shadow:0 12px 28px #26224e0f}.inspector-whats-new-header .inspector-home-title{letter-spacing:-.035em;margin:0;font-size:clamp(27px,3.6vw,36px)}.inspector-whats-new-updated{color:#6c687c;letter-spacing:.01em;white-space:nowrap;flex:none;margin:0;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:11px;font-weight:600}.inspector-whats-new .inspector-home-news{max-width:70ch;margin-top:0}.inspector-whats-new-document,.inspector-whats-new-empty{max-width:70ch;padding:22px 32px 52px}.inspector-whats-new-document .announcement-content{color:#2b2b39;font-size:15px;line-height:1.72}.inspector-whats-new-document .announcement-content h1{color:#15131d;letter-spacing:-.032em;max-width:24ch;margin:0 0 16px;font-size:clamp(26px,3.2vw,34px);line-height:1.1}.inspector-whats-new-document .announcement-content h1+p{color:#504d61;max-width:58ch;margin-top:0;font-size:18px;line-height:1.58}.inspector-whats-new-document .announcement-content>hr:first-child{display:none}.inspector-whats-new-document .announcement-content h2:first-of-type{border-top:0;margin-top:14px;padding-top:0}.inspector-whats-new-document .announcement-content h2{color:#1b1924;letter-spacing:-.024em;border-top:1px solid #dfdeea;margin:44px 0 14px;padding-top:24px;font-size:21px;line-height:1.2}.inspector-whats-new-document .announcement-content p{max-width:70ch;margin:.85rem 0}.inspector-whats-new-document .announcement-content ul,.inspector-whats-new-document .announcement-content ol{max-width:68ch;margin:1.25rem 0 1.5rem;padding-left:1.4rem}.inspector-whats-new-document .announcement-content li+li{margin-top:.7rem}.inspector-whats-new-document .announcement-content a{color:#4e46a5;text-underline-offset:4px;font-weight:600;text-decoration-color:#4e46a56b;text-decoration-thickness:1px;transition:color .16s,text-decoration-color .16s}.inspector-whats-new-document .announcement-content a:hover{color:#312879;text-decoration-color:currentColor}.inspector-whats-new-empty{color:#5e5b70}.inspector-whats-new-empty .inspector-home-card-title{color:#1b1924;margin:0}.inspector-whats-new-empty .inspector-home-card-copy{max-width:48ch;margin:8px 0 0}.inspector-home-story-featured{padding:22px}.inspector-home-story-link{color:inherit;cursor:pointer;text-decoration:none;display:block}.inspector-home-story-link:hover{background-color:#fff;border-color:#8f91d7}.inspector-home-story[data-unread=true]{border-color:#bec2ff;padding-right:64px;box-shadow:0 0 0 1px #6430ab}.inspector-home-story-unread{color:#fff;letter-spacing:.04em;text-transform:uppercase;background-color:#6430ab;border-radius:999px;align-items:center;min-height:18px;padding:0 7px;font-family:Spline Sans Mono,ui-monospace,monospace;font-size:10px;font-weight:700;display:inline-flex}.inspector-nav-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;transition:opacity .18s,width .22s;overflow:hidden}.inspector-nav-control{color:#57575b;min-height:32px;font:inherit;text-align:left;outline-offset:-2px;cursor:pointer;background-color:#0000;border:1px solid #0000;border-radius:5px;outline:2px solid #0000;flex:none;justify-content:flex-start;align-items:center;gap:6px;padding:6px 9px;font-size:12px;font-weight:600;line-height:1.25;display:flex}.inspector-nav-control:hover{color:#010507;background-color:#f0f0f4}.inspector-nav-control-active{color:#3f176f;background-color:#eee6fe;border-color:#bec2ff}.inspector-nav-icon{flex:none;align-items:center;display:inline-flex}.inspector-nav-icon svg{width:15px;height:15px}.inspector-nav-control:focus-visible,.inspector-account-control:focus-visible,[data-inspector-thread-cta]:focus-visible,[data-inspector-sidebar-intelligence-action]:focus-visible,[data-inspector-whats-new-preview]:focus-visible,[data-inspector-whats-new-dismiss]:focus-visible,[data-inspector-home-intelligence-action]:focus-visible,.inspector-home-feature:focus-visible,[data-inspector-action-placement=threads-footer]:focus-visible{outline-offset:2px;outline:2px solid #6430ab!important}.inspector-sidebar .inspector-nav-control:focus-visible,.inspector-sidebar .inspector-sidebar-label:focus-visible,.inspector-sidebar [data-inspector-thread-cta]:focus-visible{outline-offset:-2px!important}.inspector-account-control{color:#57575b;font:inherit;outline-offset:2px;cursor:pointer;background-color:#0000;border:1px solid #0000;outline:2px solid #0000;justify-content:center;align-items:center;padding:0;display:inline-flex}.inspector-account-control:hover,.inspector-account-control-active{color:#3f176f;background-color:#6430ab17}:host ::selection{color:#010507;background-color:#cfd2ff}:host *{scrollbar-color:#aaa9c1 transparent;scrollbar-width:thin}:host ::-webkit-scrollbar{width:8px;height:8px}:host ::-webkit-scrollbar-thumb{background:#aaa9c1 padding-box padding-box;border:2px solid #0000;border-radius:999px}.inspector-account-control-icon{flex:none;justify-content:center;align-items:center;display:inline-flex}.inspector-account-control-icon svg{width:15px;height:15px}[data-inspector-thread-cta],[data-inspector-account-strip] button,[data-inspector-account-strip] a{cursor:pointer}@media (prefers-reduced-motion:reduce){.inspector-sidebar,.inspector-nav-label,.inspector-sidebar[data-icon-rail=true] .inspector-agent-selector>[data-context-dropdown-root=true]>button{transition:none}.inspector-icon-rail-menu{transition:none;animation:none}}.inspector-threads-footer{color:#57575b;background-color:#f7f7f9;border-top:1px solid #dbdbe5;flex:none;gap:10px;padding:12px;font-size:11px;line-height:1.35;display:grid}.inspector-threads-usage{gap:6px;display:grid}[data-inspector-thread-count]{color:#010507;font-weight:600}[data-inspector-thread-expiry]{color:#57575b}.inspector-thread-progress{--inspector-thread-progress-color:#189370;width:100%;height:6px;accent-color:var(--inspector-thread-progress-color);border-radius:999px;overflow:hidden}.inspector-thread-progress[data-inspector-thread-capacity=warning]{--inspector-thread-progress-color:#b45309}.inspector-thread-progress[data-inspector-thread-capacity=critical]{--inspector-thread-progress-color:#be123c}.inspector-thread-progress::-webkit-progress-bar{background-color:#dbdbe5;border-radius:999px}.inspector-thread-progress::-webkit-progress-value{background-color:var(--inspector-thread-progress-color);border-radius:999px}.inspector-thread-progress::-moz-progress-bar{background-color:var(--inspector-thread-progress-color);border-radius:999px}[data-inspector-action-placement=threads-footer]{color:#57575b;outline-offset:2px;cursor:pointer;background-color:#0000;border:1px solid #d5d3e4;border-radius:5px;outline:2px solid #0000;justify-content:center;align-items:center;width:100%;min-height:32px;padding:6px 9px;font-size:11px;font-weight:600;line-height:1.25;text-decoration:none;display:inline-flex}[data-inspector-action-placement=threads-footer][data-inspector-action-intent=upgrade]{color:#fff;background-color:#6430ab;border-color:#6430ab}[data-inspector-action-placement=threads-footer][data-inspector-action-intent=upgrade]:hover{color:#fff;background-color:#3f176f;border-color:#3f176f}[data-inspector-action-placement=threads-footer]:hover{color:#010507;background-color:#f7f4fe;border-color:#c8c6e6}.cpk-threads-overview-video{opacity:0;transition:opacity .22s}.cpk-threads-overview{background-color:#f7f7f9;flex:1;justify-content:center;align-items:center;min-width:0;padding:32px;display:flex}.cpk-threads-overview-content{color:#57575b;width:100%;max-width:440px}.cpk-locked-feature{box-sizing:border-box;background:#fff;align-items:flex-start;width:100%;min-height:100%;padding:52px 24px 56px;display:flex;position:relative;overflow:auto;container:cpk-locked-feature/inline-size}.cpk-locked-feature-layout{box-sizing:border-box;width:100%;min-width:0;max-width:600px;margin:0 auto}.cpk-locked-feature-hero{box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:36px;width:100%;min-width:0;margin:0 auto;display:grid}.cpk-locked-feature-copy{color:#57575b;min-width:0}.cpk-locked-feature-name{color:#5558b2;letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:8px;margin-bottom:20px;font-size:11px;font-weight:700;line-height:1.25;display:inline-flex}.cpk-locked-feature-icon{width:15px;height:15px;color:inherit;flex:none;justify-content:center;align-items:center;display:inline-flex}.cpk-locked-feature-icon svg{width:15px;height:15px;display:block}.cpk-locked-feature-title{color:#010507;letter-spacing:-.025em;max-width:680px;margin:0 0 18px;font-size:clamp(25px,2.6vw,34px);font-weight:600;line-height:1.08}.cpk-locked-feature-description{color:#57575b;max-width:680px;margin:0 0 28px;font-size:14px;line-height:1.6}.cpk-locked-feature-media{justify-self:stretch;width:100%;min-width:0}.cpk-threads-overview-video-frame.cpk-locked-feature-video{background:#000;border-color:#e4e4ec;border-radius:12px;width:100%;min-width:0;max-width:none;margin:0;box-shadow:0 14px 32px #2c2b441f}.cpk-locked-feature-outline{box-sizing:border-box;width:100%;max-width:none;margin:40px 0 0}.cpk-locked-feature-outline-list{margin:0;display:block}.cpk-locked-feature-outline-item{min-width:0;padding:0 0 28px;display:block}.cpk-locked-feature-outline-item+.cpk-locked-feature-outline-item{border-top:1px solid #e4e4ec;padding-top:28px}.cpk-locked-feature-outline-item h3,.cpk-locked-feature-outline-item p{margin:0}.cpk-locked-feature-outline-item h3{color:#010507;letter-spacing:-.018em;align-items:center;gap:10px;margin-bottom:10px;font-size:20px;font-weight:600;line-height:1.25;display:flex}.cpk-locked-feature-outline-icon{color:#5558b2;flex:0 0 20px;justify-content:center;align-items:center;width:20px;height:20px;display:inline-flex}.cpk-locked-feature-outline-icon svg{width:18px;height:18px}.cpk-locked-feature-outline-item p{color:#57575b;max-width:68ch;font-size:15px;line-height:1.65}.cpk-threads-overview-title{color:#010507;margin:0 0 10px;font-size:20px;font-weight:600;line-height:1.25}.cpk-threads-overview-copy{color:#57575b;margin:0 0 16px;font-size:13px;line-height:1.55}.cpk-threads-overview-actions{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.cpk-locked-feature .cpk-locked-feature-setup-cta,.cpk-locked-feature .cpk-threads-overview-action{box-sizing:border-box;align-items:center;height:44px;min-height:44px;padding:12px 16px;font-size:13px;font-weight:700;line-height:1}.cpk-threads-overview-action{outline-offset:2px;cursor:pointer;border:1px solid #0000;border-radius:7px;outline:2px solid #0000;justify-content:center;align-items:center;gap:6px;min-height:34px;padding:8px 12px;font-size:12px;font-weight:600;line-height:1.25;text-decoration:none;display:inline-flex}[data-inspector-feature-setup-prompt][data-copy-state=copied]{color:#fff;background-color:#087653;border-color:#087653}[data-inspector-feature-setup-prompt][data-copy-state=error]{color:#fff;background-color:#b32d3b;border-color:#b32d3b}[data-inspector-feature-setup-prompt]:focus-visible{outline-offset:2px;outline:2px solid #6430ab}.cpk-threads-overview-action-primary{color:#fff;background-color:#010507;border-color:#010507}.cpk-threads-overview-action-primary:hover{background-color:#2b2b2b;border-color:#2b2b2b}.cpk-threads-overview-action-secondary{color:#010507;background-color:#fff;border-color:#dbdbe5}.cpk-threads-overview-action-secondary:hover{background-color:#fff;border-color:#afafb7}.cpk-threads-overview-video[data-loaded=true]{opacity:1}.cpk-threads-overview-video-control{color:#3f176f;min-height:32px;font:inherit;outline-offset:2px;cursor:pointer;background-color:#fff;border:1px solid #dbdbe5;border-radius:5px;outline:2px solid #0000;justify-content:center;align-items:center;margin:0 0 14px;padding:6px 10px;font-size:12px;font-weight:600;line-height:1.25;display:inline-flex}.cpk-threads-overview-video-control:hover{color:#010507;background-color:#f7f7f9;border-color:#afafb7}.cpk-threads-overview-video-control:focus-visible{outline-offset:2px;outline:2px solid #6430ab}.cpk-threads-overview-video-fallback{color:#57575b;max-width:440px;margin:-4px 0 14px;font-size:12px;line-height:1.5}.cpk-threads-tour-launch{z-index:2;color:#57575b;outline-offset:2px;cursor:pointer;background-color:#fff;border:1px solid #dbdbe5;border-radius:7px;outline:2px solid #0000;padding:7px 10px;font-size:12px;font-weight:600;position:absolute;bottom:16px;right:16px;box-shadow:0 8px 18px #01050714}.cpk-threads-tour{z-index:3;color:#57575b;background-color:#fff;border:1px solid #dbdbe5;border-radius:10px;width:min(340px,100% - 32px);padding:14px;position:absolute;bottom:16px;right:16px;box-shadow:0 16px 36px #01050724}.cpk-threads-tour-step{color:#087653;text-transform:uppercase;margin-bottom:8px;font-family:Spline Sans Mono,monospace;font-size:10px;font-weight:600}.cpk-threads-tour-title{color:#010507;margin-bottom:6px;font-size:14px;font-weight:600;line-height:1.35}.cpk-threads-tour-copy{color:#57575b;font-size:12px;line-height:1.5}.cpk-threads-tour-actions{justify-content:space-between;gap:8px;margin-top:14px;display:flex}.cpk-threads-tour-nav{gap:8px;display:flex}.cpk-threads-tour-skip,.cpk-threads-tour-button{font:inherit;outline-offset:2px;cursor:pointer;border-radius:7px;outline:2px solid #0000;padding:7px 10px;font-size:12px;font-weight:600}.cpk-threads-overview-action:focus-visible,.cpk-threads-tour-launch:focus-visible,.cpk-threads-tour-skip:focus-visible,.cpk-threads-tour-button:focus-visible{outline-color:#6430ab}.cpk-threads-tour-skip{color:#68686e;background-color:#0000;border:0;padding-inline:0}.cpk-threads-tour-button-secondary{color:#57575b;background-color:#fff;border:1px solid #dbdbe5}.cpk-threads-tour-button-primary{color:#fff;background-color:#010507;border:1px solid #010507}.cpk-threads-tour-button:disabled{cursor:not-allowed;opacity:.45}@container cpk-locked-feature (max-width:440px){.cpk-locked-feature .cpk-threads-overview-actions{flex-direction:column;align-items:stretch}.cpk-locked-feature .cpk-locked-feature-setup-cta,.cpk-locked-feature .cpk-threads-overview-action{width:100%}}@media (max-width:720px){.cpk-threads-overview{padding:24px}}@media (prefers-reduced-motion:reduce){.cpk-threads-overview-video{transition:none}}.inspector-window[data-color-scheme=dark]{color-scheme:dark;background-color:var(--cpk-inspector-surface-dark)!important;color:#f3f4f8!important;border-color:#7b7d89!important}.inspector-window[data-color-scheme=dark] .inspector-shell,.inspector-window[data-color-scheme=dark] .inspector-main,.inspector-window[data-color-scheme=dark] #cpk-main-scroll{color:#f3f4f8!important;background-color:#111319!important}.inspector-window[data-color-scheme=dark] .resize-handle,.inspector-window[data-color-scheme=dark] .edge-resize-handle,.inspector-window[data-color-scheme=dark] .dock-resize-handle{background:0 0!important}.inspector-window[data-color-scheme=dark] .drag-handle,.inspector-window[data-color-scheme=dark] .inspector-account-strip{color:#f3f4f8!important;background:#15171e!important;border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .inspector-account-logo{filter:brightness(0)invert();clip-path:inset(0 20% 0 0)}.inspector-window[data-color-scheme=dark] .inspector-account-logo-accent{filter:none;display:block}.inspector-window[data-color-scheme=dark] .inspector-agent-placeholder{color:#b8bbc7!important;border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .inspector-account-control{color:#b8bbc7!important;border:0!important}.inspector-window[data-color-scheme=dark] .inspector-account-control:hover,.inspector-window[data-color-scheme=dark] .inspector-account-control-active{color:#d8d9ff!important;background-color:#292c38!important}.inspector-window[data-color-scheme=dark] .inspector-account-cta{color:#d8d9ff;background-color:#292b43}.inspector-window[data-color-scheme=dark] .inspector-account-cta:hover{color:#fff;background-color:#353854}.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu{box-shadow:0 12px 28px #00000052;color:#f3f4f8!important;background-color:#111319!important;border-color:#5c6173!important}.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button,.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button span{color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button:hover,.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button:focus-visible,.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button:hover span,.inspector-window[data-color-scheme=dark] .inspector-window-layout-menu button:focus-visible span{color:#fff!important;background-color:#3a3f52!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar .inspector-agent-selector>[data-context-dropdown-root=true]>button{color:#f3f4f8!important;background-color:#20232c!important;border-color:#464957!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar .inspector-agent-selector>[data-context-dropdown-root=true]>button:hover{background-color:#292c38!important;border-color:#777aae!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar .inspector-agent-selector>[data-context-dropdown-root=true]>button>span:last-child{color:#aeb1bd!important}.inspector-window[data-color-scheme=dark] .inspector-context-dropdown-icon{color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar[data-icon-rail=true] .inspector-agent-selector>[data-context-dropdown-root=true]>button{color:#fff!important;background-color:#2f3340!important;border-color:#8b90a5!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar[data-icon-rail=true] .inspector-context-dropdown-icon,.inspector-window[data-color-scheme=dark] .inspector-sidebar[data-icon-rail=true] .inspector-agent-placeholder{color:#fff!important}.inspector-window[data-color-scheme=dark] [data-context-dropdown-root=true]>div{color:#f3f4f8!important;box-shadow:none!important;background-color:#191c24!important;border-color:#464957!important}.inspector-window[data-color-scheme=dark] [data-context-dropdown-root=true]>div button:hover,.inspector-window[data-color-scheme=dark] [data-context-dropdown-root=true]>div button:focus{color:#f3f4f8!important;background-color:#343746!important}.inspector-window[data-color-scheme=dark] .inspector-sidebar{color:#f3f4f8;background-color:#15171e;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-sidebar-label{color:#8f93a1}.inspector-window[data-color-scheme=dark] .inspector-sidebar-rail-tooltip{color:#191c24;background-color:#e9e9f1;box-shadow:0 7px 18px #00000047}.inspector-window[data-color-scheme=dark] .inspector-nav-control,.inspector-window[data-color-scheme=dark] .inspector-sidebar-toggle{color:#b8bbc7}.inspector-window[data-color-scheme=dark] .inspector-nav-control:hover,.inspector-window[data-color-scheme=dark] .inspector-sidebar-toggle:hover{color:#fff;background-color:#22252f}.inspector-window[data-color-scheme=dark] .inspector-nav-control-active{color:#d8d9ff;background-color:#292b43;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-sidebar-agent-scope{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-card{background-color:#191c24;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-copy strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-copy>span,.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-card[data-state=disconnected] .inspector-sidebar-status-copy>span{color:#9da1af}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-action{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-sidebar-status-action:hover{color:#fff;background-color:#292b43}.inspector-window[data-color-scheme=dark] .inspector-sidebar-intelligence-setup{color:#d8d9ff;background-color:#292b43;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-sidebar-intelligence-setup:hover{background-color:#343653;border-color:#777aae}.inspector-window[data-color-scheme=dark] .inspector-sidebar-intelligence-setup .inspector-sidebar-status-copy strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-sidebar-setup-arrow{background-color:#caccff1f}@media (prefers-reduced-motion:reduce){.inspector-sidebar-intelligence-setup{animation:none}}.inspector-window[data-color-scheme=dark] .inspector-home{background-color:#111319}.inspector-window[data-color-scheme=dark] .inspector-settings{color:#f3f4f8;background-color:#111319}.inspector-window[data-color-scheme=dark] .inspector-settings-header,.inspector-window[data-color-scheme=dark] .inspector-settings-section,.inspector-window[data-color-scheme=dark] .inspector-settings-privacy,.inspector-window[data-color-scheme=dark] .inspector-settings-visibility,.inspector-window[data-color-scheme=dark] .inspector-settings-private-content{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-settings-title,.inspector-window[data-color-scheme=dark] .inspector-settings-section-heading h2,.inspector-window[data-color-scheme=dark] .inspector-settings-status-row h3,.inspector-window[data-color-scheme=dark] .inspector-settings-visibility h3,.inspector-window[data-color-scheme=dark] .inspector-settings-private-content strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-settings-subtitle,.inspector-window[data-color-scheme=dark] .inspector-settings-section-heading p,.inspector-window[data-color-scheme=dark] .inspector-settings-status-row p,.inspector-window[data-color-scheme=dark] .inspector-settings-visibility p,.inspector-window[data-color-scheme=dark] .inspector-settings-private-content>p{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-settings-section-icon{color:#d8d9ff;background-color:#292b43;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-settings-private-content li{color:#c9ccd6}.inspector-window[data-color-scheme=dark] .inspector-settings-private-content li span{color:#75d8b9}.inspector-window[data-color-scheme=dark] .inspector-settings-status{color:#8ce1c5;background-color:#173b32;border-color:#347d69}.inspector-window[data-color-scheme=dark] .inspector-settings-privacy[data-state=disabled] .inspector-settings-status{color:#f2cf8f;background-color:#342916;border-color:#866932}.inspector-window[data-color-scheme=dark] .inspector-settings-policy-link{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-settings-policy-link:hover{color:#fff}.inspector-window[data-color-scheme=dark] .inspector-settings-dismiss{color:#ded7ff;background-color:#272438;border-color:#5d5975}.inspector-window[data-color-scheme=dark] .inspector-settings-dismiss:hover{background-color:#322e47;border-color:#8179a7}.inspector-window[data-color-scheme=dark] .inspector-settings-dismiss:focus-visible{outline-color:#bec2ff}.inspector-window[data-color-scheme=dark] .inspector-home-card,.inspector-window[data-color-scheme=dark] .inspector-home-story,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud,.inspector-window[data-color-scheme=dark] .inspector-home-feature-list,.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview{color:#f3f4f8;background:#191c24;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud[data-state=disconnected]{background-color:#1d1e2b;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud[data-state=disconnected] .inspector-intelligence-hud-description{color:#c5c7d0}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-header{background:linear-gradient(100deg,#1d1e2b 0%,#221f31 54%,#1a2523 100%);border-bottom-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud[data-mode=install] .inspector-intelligence-hud-heading .inspector-home-section-title{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-hint{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-hint[data-tone=success]{color:#d5cbff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-hint[data-tone=error]{color:#ffb3a1}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install[data-copy-state=copied] .inspector-intelligence-install-copy{color:#d5cbff;background-color:#0000;border-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-secondary{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-install-fallback{color:#c5c7d0;background-color:#15171e;border-bottom-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story{background-color:#15171e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-beat-label,.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-step>small,.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread>small,.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file>header em{color:#8f93a1}.inspector-window[data-color-scheme=dark] .inspector-intelligence-copy-slide>strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-copy-slide>span{color:#c5c7d0}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread{background-color:#1c1f2b;border-color:#33364a}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread>strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread>i{background-color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread[data-failed=true]{background-color:#2a1a16;border-color:#5a3129}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread[data-failed=true]>i{background-color:#f97316}.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread[data-failed=true]>strong,.inspector-window[data-color-scheme=dark] .inspector-intelligence-thread[data-failed=true]>small{color:#ffb3a1}.inspector-window[data-color-scheme=dark] .inspector-intelligence-signal{color:#c5c7d0;background-color:#1c1f2b;border-color:#33364a}.inspector-window[data-color-scheme=dark] .inspector-intelligence-rule,.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-proof{color:#8fd9b8;background-color:#16241f;border-color:#2f5748}.inspector-window[data-color-scheme=dark] .inspector-intelligence-rule>i,.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-proof svg{color:#5be4bb}.inspector-window[data-color-scheme=dark] .inspector-intelligence-beat-flow{color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file{box-shadow:none;background-color:#191c24;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file>header{background-color:#1c1f2b;border-bottom-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file>header strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-file>header svg,.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-code>span>b,.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-step>i{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-code>span{color:#c5c7d0}.inspector-window[data-color-scheme=dark] .inspector-intelligence-skill-code>span:before{color:#6d7180}.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-step{background-color:#1c1f2b;border-color:#33364a}.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-step>strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-chain-arrow{color:#666a9e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-rail{border-top-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-tab{color:#8f93a1}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-tab:hover{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-tab[data-active=true]{color:#d5cbff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-story-tab:after{background-color:#a78bfa}.inspector-window[data-color-scheme=dark] .inspector-system-health,.inspector-window[data-color-scheme=dark] .inspector-system-health-section{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-system-health-section{background-color:#191c24}.inspector-window[data-color-scheme=dark] .inspector-system-health-section .inspector-system-health-header{background-color:#191c24;border-bottom-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-system-health{background-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal{background-color:#191c24}.inspector-window[data-color-scheme=dark] .inspector-system-health-event-link>small{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-system-health-header>span[data-tone=success]{color:#8ce1c5}.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=success],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=success]{background-color:#173b32;border-color:#347d69;color:#8ce1c5!important}.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=checking],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=checking]{background-color:#342916;border-color:#866932;color:#f2cf8f!important}.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=offline],.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=error],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=offline],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=error]{background-color:#3b1c22;border-color:#87424a;color:#ff9aa0!important}.inspector-window[data-color-scheme=dark] .inspector-system-health-state[data-tone=unavailable],.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-state[data-tone=unavailable]{background-color:#242731;border-color:#464957;color:#aeb1bd!important}.inspector-window[data-color-scheme=dark] .inspector-system-health-header>span[data-tone=checking]{color:#f2cf8f}.inspector-window[data-color-scheme=dark] .inspector-system-health-header>span[data-tone=offline],.inspector-window[data-color-scheme=dark] .inspector-system-health-header>span[data-tone=error]{color:#ff9aa0}.inspector-window[data-color-scheme=dark] .inspector-home-story-link:hover,.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview:has(.inspector-whats-new-preview-body:hover){background:#242131;border-color:#777aae}.inspector-window[data-color-scheme=dark] .inspector-home-title,.inspector-window[data-color-scheme=dark] .inspector-home-section-title,.inspector-window[data-color-scheme=dark] .inspector-home-card-title,.inspector-window[data-color-scheme=dark] .inspector-system-health-signal dd,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details .inspector-intelligence-hud-detail-value,.inspector-window[data-color-scheme=dark] .inspector-home-feature{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-home-eyebrow,.inspector-window[data-color-scheme=dark] .inspector-home-card-label,.inspector-window[data-color-scheme=dark] .inspector-home-meta,.inspector-window[data-color-scheme=dark] .inspector-home-body,.inspector-window[data-color-scheme=dark] .inspector-home-card-copy,.inspector-window[data-color-scheme=dark] .inspector-system-health-signal dt,.inspector-window[data-color-scheme=dark] .inspector-system-health-signal small,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-heading p,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details .inspector-intelligence-hud-detail-label,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details .inspector-intelligence-hud-detail-subvalue,.inspector-window[data-color-scheme=dark] .inspector-home-section-header>span,.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview-copy>span:last-child{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details{background-color:#3a3d49;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details>section{background-color:#15171e}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-plan-action{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-plan-action:hover{color:#fff;background-color:#0000;border-color:#0000}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal+.inspector-system-health-signal,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details>section+section,.inspector-window[data-color-scheme=dark] .inspector-intelligence-hud-details,.inspector-window[data-color-scheme=dark] .inspector-home-features-empty{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=success] dd,.inspector-window[data-color-scheme=dark] .inspector-home-feature small{color:#8ce1c5}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=active] dd{color:#f2cf8f}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=error] .inspector-system-health-event-type{color:#ff9aa0;background-color:#3b1c22}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=success] .inspector-system-health-event-type{color:#8ce1c5;background-color:#173b32}.inspector-window[data-color-scheme=dark] .inspector-system-health-signal[data-tone=active] .inspector-system-health-event-type{color:#f2cf8f;background-color:#342916}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group{background-color:#191c24;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group-header{color:#c9ccd6;background-color:#20232d;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group-header>span{color:#c9ccd6;background-color:#191c24}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group[data-feature-state-group=active] .inspector-home-feature-group-header{color:#8ce1c5;background-color:#173b32;border-color:#347d69}.inspector-window[data-color-scheme=dark] .inspector-home-feature{background-color:#191c24}.inspector-window[data-color-scheme=dark] .inspector-home-feature:hover{background-color:#20232d}.inspector-window[data-color-scheme=dark] .inspector-home-feature+.inspector-home-feature{border-color:#2f323d}.inspector-window[data-color-scheme=dark] .inspector-home-feature-group-empty{color:#9da1af}.inspector-window[data-color-scheme=dark] .inspector-home-feature[data-state=off]{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-home-feature-status>span{background-color:#191c24;border-color:#6f7484}.inspector-window[data-color-scheme=dark] .inspector-home-feature[data-state=on] .inspector-home-feature-status>span{background-color:#8ce1c5;border-color:#8ce1c5}.inspector-window[data-color-scheme=dark] .inspector-home-feature-action{color:#d4d7e0;background-color:#20232d;border-color:#464957}.inspector-window[data-color-scheme=dark] .inspector-home-feature-label:hover{color:#d8d9ff}.inspector-window[data-color-scheme=dark] .inspector-home-feature-action:hover{color:#fff;background-color:#292b43;border-color:#777aae}.inspector-window[data-color-scheme=dark] .inspector-home-feature-action[data-copy-state=copied]{color:#8ce1c5;background-color:#173b32;border-color:#347d69}.inspector-window[data-color-scheme=dark] .inspector-home-feature-action[data-copy-state=error]{color:#ff9aa0;background-color:#3b1c22;border-color:#87424a}.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview-dismiss{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview-dismiss:hover{color:#fff;background-color:#302a40}.inspector-window[data-color-scheme=dark] .inspector-home-usage-bar{background-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-thread-progress::-webkit-progress-bar{background-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-whats-new-header{box-shadow:none;background-color:#1d1e2b;border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-whats-new-updated,.inspector-window[data-color-scheme=dark] .inspector-whats-new-empty{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview-action{color:#d8d9ff}.inspector-window[data-color-scheme=dark] .inspector-whats-new-preview:hover .inspector-whats-new-preview-action{color:#fff}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document,.inspector-window[data-color-scheme=dark] .inspector-whats-new-empty{border-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content{color:#c9ccd6}.inspector-window[data-color-scheme=dark] .inspector-whats-new-empty .inspector-home-card-title{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h1+p{color:#c9ccd6}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h2{border-top-color:#3a3d49}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h1,.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h2,.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content h3,.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content strong{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .inspector-whats-new-document .announcement-content a{color:#caccff}.inspector-window[data-color-scheme=dark] .inspector-threads-footer{color:#aeb1bd;background-color:#15171e;border-color:#343742}.inspector-window[data-color-scheme=dark] [data-inspector-thread-count]{color:#f3f4f8}.inspector-window[data-color-scheme=dark] [data-inspector-thread-expiry]{color:#aeb1bd}.inspector-window[data-color-scheme=dark] [data-inspector-action-placement=threads-footer]{color:#d8d9ff;background-color:#191c24;border-color:#464957}.inspector-window[data-color-scheme=dark] [data-inspector-action-placement=threads-footer]:hover{color:#fff;background-color:#20232d;border-color:#777aae}.inspector-window[data-color-scheme=dark] .cpk-threads-overview{background-color:#111319}.inspector-window[data-color-scheme=dark] .cpk-locked-feature{background:#111319}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-copy,.inspector-window[data-color-scheme=dark] .cpk-locked-feature-description{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-name{color:#caccff}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-title{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline{box-shadow:none;background:0 0}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-item h3{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-icon{color:#caccff}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-item{box-shadow:none;color:#f3f4f8;background:0 0}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-item+.cpk-locked-feature-outline-item{border-top-color:#3a3d49}.inspector-window[data-color-scheme=dark] .cpk-locked-feature-outline-item p,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-content,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-copy,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-video-fallback,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-copy{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-title,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-title{color:#f3f4f8}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-video-frame{background:linear-gradient(135deg,#666a9e3d,#347d6929),#191c24;border-color:#3a3d49;box-shadow:0 8px 20px #00000038}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-video-control,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action-secondary,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-launch,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button-secondary{color:#d8d9ff;background-color:#191c24;border-color:#464957}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-video-control:hover,.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action-secondary:hover,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-launch:hover,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button-secondary:hover{color:#fff;background-color:#242731;border-color:#777aae}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action-primary,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button-primary{color:#171823;background-color:#caccff;border-color:#caccff}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action-primary:hover,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button-primary:hover{background-color:#d8d9ff;border-color:#d8d9ff}.inspector-window[data-color-scheme=dark] .cpk-threads-tour{color:#aeb1bd;background-color:#191c24;border-color:#464957;box-shadow:0 16px 36px #00000052}.inspector-window[data-color-scheme=dark] .cpk-threads-tour-step{color:#8ce1c5}.inspector-window[data-color-scheme=dark] .cpk-threads-tour-skip{color:#aeb1bd}.inspector-window[data-color-scheme=dark] .cpk-threads-overview-action:focus-visible,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-launch:focus-visible,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-skip:focus-visible,.inspector-window[data-color-scheme=dark] .cpk-threads-tour-button:focus-visible{outline-color:#bec2ff}.inspector-window[data-color-scheme=dark] .cpk-agent-overview,.inspector-window[data-color-scheme=dark] .cpk-section-card{background-color:#191c24!important;border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .cpk-section-header{background-color:#242731!important;border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .cpk-section-header h4{color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] .cpk-agent-icon{color:#d8d9ff!important;background-color:#292b43!important}.inspector-window[data-color-scheme=dark] .cpk-stat-card{background-color:#191c24!important;border-color:#464957!important}.inspector-window[data-color-scheme=dark] button.cpk-stat-card:hover{background-color:#20232d!important}.cpk-agent-messages-head{border-bottom:1px solid #e4e4ec}.cpk-agent-message-row+.cpk-agent-message-row{border-top:1px solid #e4e4ec}.inspector-window[data-color-scheme=dark] .cpk-agent-messages-head,.inspector-window[data-color-scheme=dark] .cpk-agent-message-row+.cpk-agent-message-row,.inspector-window[data-color-scheme=dark] .cpk-agent-view .divide-gray-200>:not([hidden])~:not([hidden]),.inspector-window[data-color-scheme=dark] .cpk-agent-view .divide-y>*{border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] .cpk-json-block{color:#c9ccd6}.inspector-window[data-color-scheme=dark] [class*=bg-emerald-50],.inspector-window[data-color-scheme=dark] [class*=bg-green-100]{color:#8ce1c5!important;background-color:#173b32!important}.inspector-window[data-color-scheme=dark] [class*=bg-rose-50]{color:#ff9aa0!important;background-color:#3b1c22!important}.inspector-window[data-color-scheme=dark] [data-cpk-event-error] p,.inspector-window[data-color-scheme=dark] [data-playground-error] p{color:inherit!important}.inspector-window[data-color-scheme=dark] [class*=bg-amber-50],.inspector-window[data-color-scheme=dark] [class*=bg-amber-100]{color:#f2cf8f!important;background-color:#342916!important}.inspector-window[data-color-scheme=dark] [class*=bg-blue-50],.inspector-window[data-color-scheme=dark] [class*=bg-blue-100],.inspector-window[data-color-scheme=dark] [class*=bg-sky-50],.inspector-window[data-color-scheme=dark] [class*=bg-violet-50],.inspector-window[data-color-scheme=dark] [class*=bg-purple-50],.inspector-window[data-color-scheme=dark] [class*=bg-fuchsia-50]{color:#d8d9ff!important;background-color:#292b43!important}.inspector-window[data-color-scheme=dark] [class*=bg-white]{background-color:#191c24!important}.inspector-window[data-color-scheme=dark] [class*=bg-gray-50],.inspector-window[data-color-scheme=dark] [class*=bg-slate-50],.inspector-window[data-color-scheme=dark] [class*=bg-gray-100],.inspector-window[data-color-scheme=dark] [class*=bg-slate-100]{background-color:#171a22!important}.inspector-window[data-color-scheme=dark] [class*=text-gray-900],.inspector-window[data-color-scheme=dark] [class*=text-slate-900],.inspector-window[data-color-scheme=dark] [class*=text-gray-800],.inspector-window[data-color-scheme=dark] [class*=text-slate-800],.inspector-window[data-color-scheme=dark] [class*=text-gray-700],.inspector-window[data-color-scheme=dark] [class*=text-slate-700]{color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] [class*=text-gray-600],.inspector-window[data-color-scheme=dark] [class*=text-slate-600],.inspector-window[data-color-scheme=dark] [class*=text-gray-500],.inspector-window[data-color-scheme=dark] [class*=text-slate-500],.inspector-window[data-color-scheme=dark] [class*=text-gray-400],.inspector-window[data-color-scheme=dark] [class*=text-slate-400]{color:#aeb1bd!important}.inspector-window[data-color-scheme=dark] [class*=border-gray-100],.inspector-window[data-color-scheme=dark] [class*=border-slate-100],.inspector-window[data-color-scheme=dark] [class*=border-gray-200],.inspector-window[data-color-scheme=dark] [class*=border-slate-200],.inspector-window[data-color-scheme=dark] [class*=border-gray-300],.inspector-window[data-color-scheme=dark] [class*=border-slate-300]{border-color:#3a3d49!important}.inspector-window[data-color-scheme=dark] input,.inspector-window[data-color-scheme=dark] select,.inspector-window[data-color-scheme=dark] textarea{color:#f3f4f8!important;background-color:#191c24!important;border-color:#464957!important}.inspector-window[data-color-scheme=dark] input::placeholder,.inspector-window[data-color-scheme=dark] textarea::placeholder{color:#858996}.inspector-window[data-color-scheme=dark] .cpk-playground-composer{background-color:#2f3340!important;box-shadow:0 0 0 1px #6d7285!important}.inspector-window[data-color-scheme=dark] .cpk-playground-composer:focus-within{box-shadow:0 0 0 1px #c5c8de!important}.inspector-window[data-color-scheme=dark] .cpk-playground-input{color:#f3f4f8!important;caret-color:#f3f4f8!important;background-color:#0000!important}.inspector-window[data-color-scheme=dark] .cpk-playground-input::placeholder{color:#e4e6ef!important;opacity:1!important}.inspector-window[data-color-scheme=dark] .cpk-playground-send:not(:disabled){color:#111319!important;opacity:1!important;background-color:#f3f4f8!important}.inspector-window[data-color-scheme=dark] .cpk-playground-send:disabled{color:#f3f4f8!important;background-color:#f3f4f833!important}.inspector-window[data-color-scheme=dark] ::selection{color:#fff;background-color:#5b5f92}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28f67540e6..e31e39d364 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3769,6 +3769,9 @@ importers: '@copilotkit/typescript-config': specifier: workspace:* version: link:../typescript-config + '@playwright/test': + specifier: ^1.59.1 + version: 1.59.1 '@tailwindcss/cli': specifier: ^4.1.11 version: 4.1.18 diff --git a/scripts/release/public-api/manifest.v1.json b/scripts/release/public-api/manifest.v1.json index 170d23c321..4d1e1ed8e6 100644 --- a/scripts/release/public-api/manifest.v1.json +++ b/scripts/release/public-api/manifest.v1.json @@ -2638,6 +2638,7 @@ "runtime", "basePath", "mode", + "inspectorLearning", "cors", "hooks", "activateChannels" @@ -2765,6 +2766,7 @@ "runtime", "basePath", "mode", + "inspectorLearning", "cors", "hooks", "activateChannels" diff --git a/showcase/shell-docs/src/content/snippets/shared/inspector/open-inspector-pane-learning.mdx b/showcase/shell-docs/src/content/snippets/shared/inspector/open-inspector-pane-learning.mdx index 0a1e28b226..16b6c76e2d 100644 --- a/showcase/shell-docs/src/content/snippets/shared/inspector/open-inspector-pane-learning.mdx +++ b/showcase/shell-docs/src/content/snippets/shared/inspector/open-inspector-pane-learning.mdx @@ -1,6 +1,9 @@ Open Inspector on localhost. Go to **Learning**. - Memory and learning tools for this session appear here. + Review published Skills, their supporting Insights, and the Thread evidence + behind each pattern. Inspector also shows when new Threads are ready for a + Learning run; start runs and review Skill candidates in the Intelligence web + app. More detail: [Inspector](/inspector). diff --git a/skills/inspector-docs/references/pane-map.md b/skills/inspector-docs/references/pane-map.md index 594e916a80..17d7ea8065 100644 --- a/skills/inspector-docs/references/pane-map.md +++ b/skills/inspector-docs/references/pane-map.md @@ -13,7 +13,7 @@ Update this file in the same change that adds or removes a pane. | Frontend Tools | Frontend tools, human-in-the-loop overview | `open-inspector-pane-frontend-tools.mdx` | HITL tools appear here when registered | | State | Shared state | `open-inspector-pane-state.mdx` | Thread detail tab | | Context | `useAgentContext` / agent-readonly | `open-inspector-pane-context.mdx` | Agents group | -| Learning | CopilotKit Intelligence overview | `open-inspector-pane-learning.mdx` | Primary nav | +| Learning | CopilotKit Intelligence overview | `open-inspector-pane-learning.mdx` | Primary nav; published Skills, supporting Insights, and Thread evidence | | Capabilities | no page yet | | Client tool and catalog toggles. No dedicated docs page in this slice | | Messages | no page yet | | Thread detail tab. Covered by Threads Callout | | Angular Inspector | Angular frontend getting-started | `open-inspector-step-angular.mdx` | Install page first |