🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@copilotkit/web-inspector

Package Overview
Dependencies
Maintainers
1
Versions
85
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@copilotkit/web-inspector - npm Package Compare versions

Comparing version
1.61.2
to
1.62.0
+31
dev/css-raw-import.spec.ts
// @vitest-environment node
import { describe, expect, it } from "vitest";
import viteConfig from "./vite.config.js";
describe("web-inspector dev vite config", () => {
it("throws when the generated stylesheet import is missing from src/index.ts", () => {
const plugin = Array.isArray(viteConfig.plugins)
? viteConfig.plugins.find(
(candidate) =>
candidate != null &&
typeof candidate === "object" &&
"name" in candidate &&
candidate.name === "web-inspector-css-raw-import",
)
: undefined;
if (!plugin || !("transform" in plugin) || !plugin.transform) {
throw new Error("web-inspector-css-raw-import plugin not found");
}
expect(() =>
plugin.transform.call(
{} as never,
'import tailwindStyles from "./styles/other.css";',
"/repo/packages/web-inspector/src/index.ts",
),
).toThrow("generated.css import");
});
});
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CopilotKit Web Inspector Standalone</title>
<script type="module" src="/main.ts"></script>
<style>
:root {
color-scheme: light;
font-family:
Inter,
ui-sans-serif,
system-ui,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
sans-serif;
background: #f7f7f9;
color: #010507;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
}
main {
display: grid;
grid-template-rows: auto 1fr;
min-height: 100vh;
}
header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 18px;
border-bottom: 1px solid #dbdbe5;
background: #ffffff;
}
h1 {
margin: 0;
font-size: 15px;
font-weight: 650;
}
p {
margin: 4px 0 0;
color: #57575b;
font-size: 12px;
}
.controls {
display: flex;
gap: 8px;
}
button {
border: 1px solid #dbdbe5;
border-radius: 6px;
background: #ffffff;
color: #010507;
cursor: pointer;
font: inherit;
font-size: 12px;
padding: 7px 10px;
}
button:hover {
border-color: #bec2ff;
}
#inspector-host {
min-height: 0;
padding: 16px;
}
cpk-thread-inspector {
display: block;
height: calc(100vh - 98px);
min-height: 520px;
border: 1px solid #dbdbe5;
border-radius: 8px;
overflow: hidden;
background: #ffffff;
}
</style>
</head>
<body>
<main>
<header>
<div>
<h1>Web Inspector Standalone Thread Detail</h1>
<p>
Demo provider data only. Product validation still needs a real
Intelligence backend.
</p>
</div>
<div class="controls" aria-label="Demo scenarios">
<button type="button" data-scenario="events">AG-UI events</button>
<button type="button" data-scenario="messages">Messages only</button>
<button type="button" data-scenario="raw">Raw event only</button>
</div>
</header>
<section id="inspector-host"></section>
</main>
</body>
</html>
import "../src/index.ts";
import type {
CpkThreadInspector,
ThreadDebuggerProvider,
} from "../src/index.ts";
type Scenario = "events" | "messages" | "raw";
const host = document.querySelector<HTMLElement>("#inspector-host");
if (!host) {
throw new Error("Missing standalone inspector host element.");
}
const inspector = document.createElement(
"cpk-thread-inspector",
) as CpkThreadInspector;
host.appendChild(inspector);
const scenarios: Record<
Scenario,
{
label: string;
threadId: string;
provider: ThreadDebuggerProvider;
}
> = {
events: {
label: "AG-UI events",
threadId: "demo-events-thread",
provider: {
getThreadMetadata: async () => ({
id: "demo-events-thread",
name: "AG-UI event-backed thread",
agentId: "demo-agent",
endUserId: "demo-user",
status: "completed",
createdAt: "2026-06-25T10:00:00.000Z",
updatedAt: "2026-06-25T10:00:04.000Z",
}),
getEvents: async () => [
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: { runId: "run-1" },
},
{
type: "TEXT_MESSAGE_START",
timestamp: "2026-06-25T10:00:01.000Z",
payload: { messageId: "m1", role: "assistant" },
},
{
type: "TEXT_MESSAGE_CONTENT",
timestamp: "2026-06-25T10:00:02.000Z",
payload: {
messageId: "m1",
delta: "Here is the event-derived timeline row.",
},
},
{
type: "TOOL_CALL_START",
timestamp: "2026-06-25T10:00:03.000Z",
payload: { toolCallId: "tc1", toolCallName: "lookup_docs" },
},
{
type: "TOOL_CALL_ARGS",
timestamp: "2026-06-25T10:00:03.250Z",
payload: { toolCallId: "tc1", args: { query: "threads" } },
},
{
type: "RUN_FINISHED",
timestamp: "2026-06-25T10:00:04.000Z",
payload: { runId: "run-1" },
},
],
getState: async () => ({ phase: "complete", selectedScenario: "events" }),
},
},
messages: {
label: "Messages only",
threadId: "demo-messages-thread",
provider: {
getThreadMetadata: async () => ({
id: "demo-messages-thread",
name: "Message-backed thread",
agentId: "demo-agent",
endUserId: "demo-user",
status: "completed",
}),
getEvents: async () => [],
getMessages: async () => [
{
id: "u1",
role: "user",
content: "Show me the thread timeline.",
},
{
id: "a1",
role: "assistant",
content: "This fallback is rendered from persisted messages.",
},
],
getState: async () => ({ selectedScenario: "messages" }),
},
},
raw: {
label: "Raw event only",
threadId: "demo-raw-thread",
provider: {
getThreadMetadata: async () => ({
id: "demo-raw-thread",
name: "Raw event-backed thread",
agentId: "demo-agent",
endUserId: "demo-user",
status: "active",
}),
getEvents: async () => [
{
type: "THREAD_STATE_WRITTEN",
timestamp: "2026-06-25T10:00:00.000Z",
payload: {
checkpointId: "checkpoint-1",
note: "Unsupported event types still render as raw timeline rows.",
},
},
],
getState: async () => ({ selectedScenario: "raw" }),
},
},
};
function selectScenario(scenario: Scenario): void {
const selected = scenarios[scenario];
inspector.provider = selected.provider;
inspector.threadId = selected.threadId;
inspector.thread = null;
for (const button of document.querySelectorAll<HTMLButtonElement>(
"[data-scenario]",
)) {
const active = button.dataset.scenario === scenario;
button.setAttribute("aria-pressed", String(active));
button.style.background = active ? "#eee6fe" : "#ffffff";
}
document.title = `CopilotKit Web Inspector Standalone - ${selected.label}`;
}
for (const button of document.querySelectorAll<HTMLButtonElement>(
"[data-scenario]",
)) {
button.addEventListener("click", () => {
const scenario = button.dataset.scenario;
if (
scenario === "events" ||
scenario === "messages" ||
scenario === "raw"
) {
selectScenario(scenario);
}
});
}
selectScenario("events");
import { defineConfig } from "vite";
/**
* Mirrors the package bundler's CSS-as-string behavior for the standalone
* harness. The inspector injects generated.css into Shadow DOM via unsafeCSS,
* so the dev server rewrites that package-local import to Vite's raw string
* loader without changing production source.
*/
export default defineConfig({
plugins: [
{
name: "web-inspector-css-raw-import",
enforce: "pre",
transform(code, id) {
if (!id.endsWith("/src/index.ts")) return null;
const cssImport =
'import tailwindStyles from "./styles/generated.css";';
if (!code.includes(cssImport)) {
throw new Error(
"web-inspector dev CSS transform expected src/index.ts to include the generated.css import",
);
}
return code.replace(
cssImport,
'import tailwindStyles from "./styles/generated.css?raw";',
);
},
},
],
});
# @copilotkit/web-inspector
## Standalone Thread Inspector QA
Run the shared inspector without an app shell:
```bash
pnpm nx run @copilotkit/web-inspector:dev:standalone
```
Open [http://127.0.0.1:5177/](http://127.0.0.1:5177/).
Validation steps:
1. Confirm the initial `AG-UI events` scenario opens on the Timeline tab and renders run, message, and tool rows.
2. Click `Messages only` and confirm the first-visible Timeline renders persisted message content instead of an empty Timeline.
3. Click `Raw event only` and confirm the Timeline renders a `THREAD_STATE_WRITTEN` row with a source-event link.
4. Use a Timeline source-event link and confirm it opens the Raw AG-UI Events tab on the corresponding event.
5. Open the State tab and confirm the demo state is visible.
This harness uses demo provider data only. Manual product validation for Intelligence-backed threads still needs a real Intelligence backend.
+90
-6

@@ -8,2 +8,41 @@ import { Anchor } from "./lib/types.cjs";

declare const WEB_INSPECTOR_TAG: "cpk-web-inspector";
declare const THREAD_INSPECTOR_TAG: "cpk-thread-inspector";
type ThreadDebuggerProviderLoadOptions = {
signal: AbortSignal;
};
type ThreadDebuggerToolCall = {
id: string;
name: string;
args: string | Record<string, unknown>;
};
type ThreadDebuggerMessage = {
id: string;
role: string;
content?: string;
toolCalls?: ThreadDebuggerToolCall[];
toolCallId?: string; /** Present when role === "activity" (Generative UI output). */
activityType?: string;
};
type ThreadDebuggerEvent = {
type: string;
timestamp: string | number;
payload?: Record<string, unknown>;
[key: string]: unknown;
};
type ThreadDebuggerMetadata = {
id: string;
name?: string | null;
agentId?: string | null;
endUserId?: string | null;
createdById?: string | null;
status?: string | null;
createdAt?: string | null;
updatedAt?: string | null;
};
type ThreadDebuggerProvider = {
getThreadMetadata?: (threadId: string, options: ThreadDebuggerProviderLoadOptions) => Promise<ThreadDebuggerMetadata | null>;
getMessages?: (threadId: string, options: ThreadDebuggerProviderLoadOptions) => Promise<ThreadDebuggerMessage[]>;
getEvents?: (threadId: string, options: ThreadDebuggerProviderLoadOptions) => Promise<ThreadDebuggerEvent[]>;
getState?: (threadId: string, options: ThreadDebuggerProviderLoadOptions) => Promise<Record<string, unknown> | null>;
};
interface ApiAgentEvent {

@@ -13,4 +52,7 @@ type: string;

payload: Record<string, unknown>;
sourceIndex?: number;
rawEvent?: ThreadDebuggerEvent;
}
declare class ɵCpkThreadDetails extends LitElement {
type ThreadDetailsTab = "timeline" | "state" | "raw-events";
declare class CpkThreadInspector extends LitElement {
static properties: {

@@ -20,2 +62,5 @@ threadId: {

};
provider: {
attribute: boolean;
};
thread: {

@@ -45,2 +90,5 @@ attribute: boolean;

};
_fetchedMetadata: {
state: boolean;
};
_conversation: {

@@ -99,3 +147,4 @@ state: boolean;

threadId: string | null;
thread: ɵThread | null;
provider: ThreadDebuggerProvider | null;
thread: ThreadDebuggerMetadata | ɵThread | null;
runtimeUrl: string;

@@ -114,2 +163,3 @@ headers: Record<string, string>;

private _tab;
private _fetchedMetadata;
private _conversation;

@@ -147,3 +197,3 @@ private _fetchedEvents;

*
* Reset to {"conversation"} when the selected thread changes.
* Reset to {"timeline"} when the selected thread changes.
*/

@@ -162,2 +212,4 @@ private _activatedTabs;

private _panelTplCache;
private _timelineItemsCache;
private _liveEventsWithSourceIndexCache;
/**

@@ -175,4 +227,5 @@ * Tracks whether we've fetched events for the current thread yet. Events

private _stateFetched;
private _lastFetchedThreadId;
private _lastLoadKey;
private _lastSeenLiveMessageVersion;
private _metadataAbort;
private _messagesAbort;

@@ -186,3 +239,15 @@ private _eventsAbort;

static readonly COLLAPSE_THRESHOLD = 800;
private static readonly TAB_LIST;
static readonly TAB_LIST: ReadonlyArray<{
id: ThreadDetailsTab;
label: string;
}>;
private static providerIds;
private static nextProviderId;
private static providerLoadKey;
/**
* Build a deterministic signature for runtime fetch headers so auth/CSRF
* changes invalidate cached thread data even when the selected thread is
* otherwise unchanged.
*/
private static headersLoadKey;
private renderTabContent;

@@ -193,2 +258,8 @@ private activateTab;

updated(_changed: Map<string, unknown>): void;
private canFetchMessages;
private canFetchEvents;
private canFetchState;
private currentLoadKey;
private resetLoadedThreadData;
private fetchMetadata;
/**

@@ -207,5 +278,11 @@ * Fetch the canonical conversation for `threadId` from the runtime.

private fetchState;
private fetchRuntimeMessages;
private fetchRuntimeEvents;
private fetchRuntimeState;
private getThreadInspectionUrl;
private mapMessages;
private mapApiEvents;
private get activeTimelineItems();
private timelineItemsForEvents;
private timelineItemsFromEvents;
private get renderItems();

@@ -220,2 +297,3 @@ private get activityCounts();

private shortId;
private get metadata();
private fmtTime;

@@ -226,2 +304,6 @@ private onDetailDividerDown;

render(): TemplateResult<1>;
private renderMetadataStrip;
private revealSourceEvent;
private renderTimeline;
private renderTimelineItem;
private renderConversation;

@@ -238,2 +320,3 @@ /**

private cachedPanelTpl;
private getCachedPanelTpl;
private renderRenderItem;

@@ -249,2 +332,3 @@ private renderBubble;

}
declare class ɵCpkThreadDetails extends CpkThreadInspector {}
declare class WebInspectorElement extends LitElement {

@@ -506,3 +590,3 @@ static properties: {

//#endregion
export { type Anchor, WEB_INSPECTOR_TAG, WebInspectorElement, defineWebInspector, ɵCpkThreadDetails };
export { type Anchor, CpkThreadInspector, THREAD_INSPECTOR_TAG, ThreadDebuggerEvent, ThreadDebuggerMessage, ThreadDebuggerMetadata, ThreadDebuggerProvider, ThreadDebuggerProviderLoadOptions, ThreadDebuggerToolCall, WEB_INSPECTOR_TAG, WebInspectorElement, defineWebInspector, ɵCpkThreadDetails };
//# sourceMappingURL=index.d.cts.map
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;cAqEa,iBAAA;AAAA,UAmNH,aAAA;EACR,IAAA;EACA,SAAA;EACA,OAAA,EAAS,MAAA;AAAA;AAAA,cAkZE,iBAAA,SAA0B,UAAA;EAAA,OAC9B,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BP,QAAA;EACA,MAAA,EAAQ,OAAA;EACR,UAAA;EACA,OAAA,EAAS,MAAA;EACT,yBAAA;EACA,eAAA,EAAiB,MAAA;EACjB,gBAAA,EAAkB,aAAA;EAOlB;;;;;;EAAA,kBAAA;EAAA,QAEQ,IAAA;EAAA,QACA,aAAA;EAAA,QACA,cAAA;EAAA,QACA,aAAA;EAAA,QACA,gBAAA;EAAA,QACA,cAAA;EAAA,QACA,aAAA;EAAA,QACA,cAAA;EAAA,QACA,YAAA;EAAA,QACA,WAAA;EAAA,QACA,cAAA;EAAA,QACA,iBAAA;EAAA,QACA,gBAAA;EAAA,QACA,iBAAA;EAgDA;EAAA,QA9CA,mBAAA;EAgDA;EAAA,QA9CA,kBAAA;EAgDA;;;;;;EAAA,QAzCA,kBAAA;EAiDgB;;;;;;;;;;EAAA,QAtChB,cAAA;EAyxBM;;;;;;;;;;EAAA,QA9wBN,cAAA;EAi/BA;;;;;;EAAA,QAv+BA,cAAA;EAyhCF;;;;EAAA,QAphCE,aAAA;EAAA,QACA,oBAAA;EAAA,QACA,2BAAA;EAAA,QACA,cAAA;EAAA,QACA,YAAA;EAAA,QACA,WAAA;EAAA,QACA,gBAAA;EAAA,QACA,iBAAA;EAAA,QACA,cAAA;EAAA,QACA,kBAAA;EAAA,gBAEQ,kBAAA;EAAA,wBACQ,QAAA;EAAA,QAShB,gBAAA;EAAA,QAMA,WAAA;EAAA,QAqBA,iBAAA;EAAA,OAiBD,MAAA,EAvIwB,GAAA,CAuIlB,SAAA;EA0iBb,OAAA,CAAQ,QAAA,EAAU,GAAA;EA05FZ;;;;;;;;;;EAAA,QA71FQ,aAAA;EAAA,QAwCA,WAAA;EAAA,QA+CA,UAAA;EAAA,QAwCN,sBAAA;EAAA,QAOA,WAAA;EAAA,QAiFA,YAAA;EAAA,YAgBI,WAAA,CAAA;EAAA,YAyBA,cAAA,CAAA;EAAA,YAgBA,QAAA,CAAA;EAAA,QAcJ,gBAAA;EAAA,QAOA,mBAAA;EAAA,YAOI,YAAA,CAAA;EAAA,YASA,WAAA,CAAA;EAAA,QAKJ,kBAAA;EAAA,QAKA,OAAA;EAAA,QAKA,OAAA;EAAA,QAYA,mBAAA;EAAA,QASA,mBAAA;EAAA,QAUA,iBAAA;EASR,MAAA,CAAA,GAAM,cAAA;EAAA,QAkFE,kBAAA;EAmeA;;;;;;;;;EAAA,QA7aA,cAAA;EAAA,QAkBA,gBAAA;EAAA,QA0BA,YAAA;EAAA,QAqCA,eAAA;EAAA,QA4DA,eAAA;EAAA,QAWA,kBAAA;EAAA,QAgBA,WAAA;EAAA,QAoEA,YAAA;EAAA,QAuDA,iBAAA;EAAA,QA6BA,iBAAA;AAAA;AAAA,cAwEG,mBAAA,SAA4B,UAAA;EAAA,OAChC,UAAA;IAAA;;;;;;;;UAKC,KAAA;EAAA,QACA,cAAA;EAAA,QACA,eAAA;EAAA,QACA,aAAA;EAAA,QACA,cAAA;EAAA,QACA,aAAA;EAAA,QAIA,kBAAA;EAAA,QACA,WAAA;EAAA,QACA,aAAA;EAAA,QAMA,kBAAA;EAAA,QACA,WAAA;EAAA,QACA,eAAA;EAAA,QACA,YAAA;EAAA,QACA,YAAA;EAAA,QAKA,SAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAAA,QACA,UAAA;EAAA,QACA,cAAA;EAAA,QACA,MAAA;EAAA,QACA,wBAAA;EAAA,QACA,qBAAA;EAAA,QACA,YAAA;EAAA,QACA,gBAAA;EAAA,QACA,eAAA;EAAA,QACA,qBAAA;EAAA,QACA,sBAAA;EAAA,QACA,mBAAA;EAAA,QACA,uBAAA;EAAA,QACA,QAAA;EAAA,QACA,yBAAA;EAAA,QACA,eAAA;EAAA,QAKA,oBAAA;EAAA,QAEA,kBAAA;EAAA,QACA,eAAA;EAAA,QACA,QAAA;EAAA,QACA,mBAAA;EAAA,QACA,mBAAA;EAAA,QACA,wBAAA;EAAA,QAEA,sBAAA;EAAA,QACA,cAAA;EAAA,QACA,mBAAA;EAAA,QACA,WAAA;EAAA,QACA,aAAA;EAAA,QACA,eAAA;EAAA,QACA,eAAA;EAAA,QAEA,YAAA;EAAA,QACA,aAAA;EAAA,QAMA,gBAAA;EAAA,QACA,qBAAA;EAAA,QACA,uBAAA;EAAA,QAOA,oBAAA;EAAA,QACA,qBAAA;EAAA,QACA,kBAAA;EAAA,QACA,mBAAA;EAAA,QACA,uBAAA;EAAA,QACA,oBAAA;EAAA,QAMA,sBAAA;EAAA,QACA,mBAAA;EAAA,QAOA,gBAAA;EAAA,QACA,4BAAA;EAAA,IAEJ,IAAA,CAAA,GAAQ,cAAA;EAAA,IAIR,IAAA,CAAK,KAAA,EAAO,cAAA;EAAA,iBAgBC,YAAA;EAAA,QAeT,iBAAA;EAAA,QAKA,eAAA;EAAA,QACA,WAAA;EAAA,QACA,iBAAA;EAAA,QACA,UAAA;EAAA,iBAES,cAAA;EAAA,YAIL,SAAA,CAAA;EAAA,QA+BJ,sBAAA;EAAA,QAQA,2BAAA;EAAA,QAIA,wBAAA;EAAA,QA0BA,wBAAA;EAAA,QAIA,oBAAA;EAAA,QAIA,sBAAA;EAAA,QAkCA,sBAAA;EAAA,QAWA,gCAAA;EAAA,QAUA,sBAAA;EAAA,QAwBA,uBAAA;EAAA,QAYA,6BAAA;EAAA,QAeA,sBAAA;EAAA,QAQA,yBAAA;EAAA,QAQA,YAAA;EAAA,QAyFA,cAAA;EAAA,QAgBA,0BAAA;EAAA,QAYA,oBAAA;EAAA,QAgCA,oBAAA;EAAA,QA4BA,iBAAA;EAAA,QA8BA,gBAAA;EAAA,QAoIA,oBAAA;EAAA,QAQA,yBAAA;EAAA,QA0BA,gBAAA;EAAA,QA8BA,iBAAA;EAAA,QAqCA,cAAA;EAAA,QAuBA,oBAAA;EAAA,QAmEA,2BAAA;EAAA,QAQA,YAAA;EAAA,QA2BA,sBAAA;EAAA,QAcA,yBAAA;EAAA,QAOA,cAAA;EAAA,QAiCA,aAAA;EAAA,QA6BA,qBAAA;EAAA,QAyCA,uBAAA;EAAA,QAyBA,kBAAA;EAAA,QAqBA,qBAAA;EAAA,QA6BA,oBAAA;EAAA,QAmCA,gBAAA;EAAA,QAeA,uBAAA;EAAA,QASM,eAAA;EAAA,OAgBP,MAAA,EA3jCuB,GAAA,CA2jCjB,SAAA;EA2tBb,iBAAA,CAAA;EAAA,QAiBQ,gBAAA;EAWR,oBAAA,CAAA;EAsBA,YAAA,CAAA;EAwCA,MAAA,CAAA,GAAM,cAAA;EAAA,QAIE,YAAA;EAAA,QAqEA,YAAA;EAAA,QA+LA,4BAAA;EAAA,QAqCA,uBAAA;EAAA,YAqDI,aAAA,CAAA;EAAA,QAIJ,iBAAA;EAAA,QAkCA,iBAAA;EAAA,QA+BA,eAAA;EAAA,QAsCA,mBAAA;EAAA,QAaA,iBAAA;EAAA,QAkBA,sBAAA;EAAA,QAKA,gBAAA;EAAA,QAIA,uBAAA;EAAA,QAmBA,uBAAA;EAAA,QAyCA,qBAAA;EAAA,QAqBA,yBAAA;EAAA,QAqBA,YAAA;EAAA,QAcA,cAAA;EAAA,QAcA,aAAA;EAAA,QAgBA,qBAAA;EAAA,QAqBA,mBAAA;EAAA,QAiBA,0BAAA;EAAA,QAaA,eAAA;EAAA,QAQA,YAAA;EAAA,QAyBA,eAAA;EAAA,QAwBA,WAAA;EAAA,QAgCA,mBAAA;EAAA,QAaA,eAAA;EAAA,QAkCA,gBAAA;EAAA,QAmCA,mBAAA;EAAA,QAcA,WAAA;EAAA,QAOA,wBAAA;EAAA,QAYA,kBAAA;EAAA,QA4BA,mBAAA;EAAA,QAcA,mBAAA;EAAA,QAOA,oBAAA;EAAA,QAQA,aAAA;EAAA,QAkCA,cAAA;EAAA,QAqBA,UAAA;EAAA,QAwBA,kBAAA;EAAA,QA8BA,qBAAA;EAAA,QAsBA,eAAA;EAAA,QAIA,mBAAA;EAAA,QAiBA,kBAAA;EAAA,QAgEA,qBAAA;EAAA,QAcA,uBAAA;EAAA,QA+BA,kBAAA;EAAA,QA0CA,qBAAA;EAAA,QAwBA,sBAAA;EAAA,QAYA,qBAAA;EAAA,QA8BA,cAAA;EAAA,QAIA,eAAA;EAAA,QACA,YAAA;EAAA,QACA,YAAA;EAAA,QACA,aAAA;EAAA,QACA,oBAAA;EAAA,QACA,kBAAA;EAAA,QAEA,uBAAA;EAAA,QA0BA,oBAAA;EAAA,QAmDA,iBAAA;EAAA,QA4BA,mBAAA;EAAA,QAqCA,sBAAA;EAAA,QAcA,yBAAA;EAAA,QAaA,oCAAA;EAAA,QAaA,gCAAA;EAAA,QAaA,8BAAA;EAAA,QASA,8BAAA;EAAA,QAcA,4BAAA;EAAA,QASA,yBAAA;EAAA,QAkBA,mCAAA;EAAA,QA2JA,uBAAA;EAAA,QA8IA,iBAAA;EAAA,QAyIA,iBAAA;EAAA,QAsPA,sBAAA;EAAA,QAMA,qBAAA;EAAA,QAUA,iBAAA;EAAA,QAMA,oBAAA;EAAA,QAWA,mBAAA;EAAA,QASA,kBAAA;EAAA,QAIA,iBAAA;EAAA,QAgBA,YAAA;EAAA,QAeA,gBAAA;EAAA,QAyOA,qBAAA;EAAA,QAmEA,gBAAA;EAAA,QA6DA,2BAAA;EAAA,QAOA,yBAAA;EAAA,QAeA,eAAA;EAAA,QAsDA,sBAAA;EAAA,QAqFA,cAAA;EAAA,QAqLA,iBAAA;EAAA,QAkGA,aAAA;EAAA,QAmBA,mBAAA;EAAA,QAuEA,mBAAA;EAAA,QASA,iBAAA;EAAA,QAoCA,iBAAA;EAAA,QAuHA,sBAAA;EAAA,QA6BA,kBAAA;EAAA,QAoBM,gBAAA;EAAA,QAuBN,sBAAA;EAAA,QASA,uBAAA;EAAA,QAkBA,kBAAA;EAAA,QAeA,wBAAA;EAAA,QAqEA,wBAAA;EAAA,QAUA,yBAAA;EAAA,QAWA,yBAAA;EAAA,QAkCA,8BAAA;EAAA,QAWA,gCAAA;EAAA,QAOA,yBAAA;EAAA,QAKM,iBAAA;EAAA,QAmEA,qBAAA;EAAA,QAwBN,sBAAA;EAAA,QAkBA,iBAAA;EAAA,QAEA,YAAA;EAAA,QAWA,YAAA;EAAA,QAUA,8BAAA;EAAA,QAyCA,cAAA;EAAA,QAoCA,uBAAA;EAAA,QAKA,cAAA;EAAA,QAIA,+BAAA;EAAA,QAqBA,4BAAA;EAAA,QAYA,oBAAA;AAAA;AAAA,iBAqBM,kBAAA,CAAA;AAAA,QAQR,MAAA;EAAA,UACI,qBAAA;IACR,mBAAA,EAAqB,mBAAA;EAAA;AAAA"}
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":"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"}

@@ -8,2 +8,41 @@ import { Anchor } from "./lib/types.mjs";

declare const WEB_INSPECTOR_TAG: "cpk-web-inspector";
declare const THREAD_INSPECTOR_TAG: "cpk-thread-inspector";
type ThreadDebuggerProviderLoadOptions = {
signal: AbortSignal;
};
type ThreadDebuggerToolCall = {
id: string;
name: string;
args: string | Record<string, unknown>;
};
type ThreadDebuggerMessage = {
id: string;
role: string;
content?: string;
toolCalls?: ThreadDebuggerToolCall[];
toolCallId?: string; /** Present when role === "activity" (Generative UI output). */
activityType?: string;
};
type ThreadDebuggerEvent = {
type: string;
timestamp: string | number;
payload?: Record<string, unknown>;
[key: string]: unknown;
};
type ThreadDebuggerMetadata = {
id: string;
name?: string | null;
agentId?: string | null;
endUserId?: string | null;
createdById?: string | null;
status?: string | null;
createdAt?: string | null;
updatedAt?: string | null;
};
type ThreadDebuggerProvider = {
getThreadMetadata?: (threadId: string, options: ThreadDebuggerProviderLoadOptions) => Promise<ThreadDebuggerMetadata | null>;
getMessages?: (threadId: string, options: ThreadDebuggerProviderLoadOptions) => Promise<ThreadDebuggerMessage[]>;
getEvents?: (threadId: string, options: ThreadDebuggerProviderLoadOptions) => Promise<ThreadDebuggerEvent[]>;
getState?: (threadId: string, options: ThreadDebuggerProviderLoadOptions) => Promise<Record<string, unknown> | null>;
};
interface ApiAgentEvent {

@@ -13,4 +52,7 @@ type: string;

payload: Record<string, unknown>;
sourceIndex?: number;
rawEvent?: ThreadDebuggerEvent;
}
declare class ɵCpkThreadDetails extends LitElement {
type ThreadDetailsTab = "timeline" | "state" | "raw-events";
declare class CpkThreadInspector extends LitElement {
static properties: {

@@ -20,2 +62,5 @@ threadId: {

};
provider: {
attribute: boolean;
};
thread: {

@@ -45,2 +90,5 @@ attribute: boolean;

};
_fetchedMetadata: {
state: boolean;
};
_conversation: {

@@ -99,3 +147,4 @@ state: boolean;

threadId: string | null;
thread: ɵThread | null;
provider: ThreadDebuggerProvider | null;
thread: ThreadDebuggerMetadata | ɵThread | null;
runtimeUrl: string;

@@ -114,2 +163,3 @@ headers: Record<string, string>;

private _tab;
private _fetchedMetadata;
private _conversation;

@@ -147,3 +197,3 @@ private _fetchedEvents;

*
* Reset to {"conversation"} when the selected thread changes.
* Reset to {"timeline"} when the selected thread changes.
*/

@@ -162,2 +212,4 @@ private _activatedTabs;

private _panelTplCache;
private _timelineItemsCache;
private _liveEventsWithSourceIndexCache;
/**

@@ -175,4 +227,5 @@ * Tracks whether we've fetched events for the current thread yet. Events

private _stateFetched;
private _lastFetchedThreadId;
private _lastLoadKey;
private _lastSeenLiveMessageVersion;
private _metadataAbort;
private _messagesAbort;

@@ -186,3 +239,15 @@ private _eventsAbort;

static readonly COLLAPSE_THRESHOLD = 800;
private static readonly TAB_LIST;
static readonly TAB_LIST: ReadonlyArray<{
id: ThreadDetailsTab;
label: string;
}>;
private static providerIds;
private static nextProviderId;
private static providerLoadKey;
/**
* Build a deterministic signature for runtime fetch headers so auth/CSRF
* changes invalidate cached thread data even when the selected thread is
* otherwise unchanged.
*/
private static headersLoadKey;
private renderTabContent;

@@ -193,2 +258,8 @@ private activateTab;

updated(_changed: Map<string, unknown>): void;
private canFetchMessages;
private canFetchEvents;
private canFetchState;
private currentLoadKey;
private resetLoadedThreadData;
private fetchMetadata;
/**

@@ -207,5 +278,11 @@ * Fetch the canonical conversation for `threadId` from the runtime.

private fetchState;
private fetchRuntimeMessages;
private fetchRuntimeEvents;
private fetchRuntimeState;
private getThreadInspectionUrl;
private mapMessages;
private mapApiEvents;
private get activeTimelineItems();
private timelineItemsForEvents;
private timelineItemsFromEvents;
private get renderItems();

@@ -220,2 +297,3 @@ private get activityCounts();

private shortId;
private get metadata();
private fmtTime;

@@ -226,2 +304,6 @@ private onDetailDividerDown;

render(): TemplateResult<1>;
private renderMetadataStrip;
private revealSourceEvent;
private renderTimeline;
private renderTimelineItem;
private renderConversation;

@@ -238,2 +320,3 @@ /**

private cachedPanelTpl;
private getCachedPanelTpl;
private renderRenderItem;

@@ -249,2 +332,3 @@ private renderBubble;

}
declare class ɵCpkThreadDetails extends CpkThreadInspector {}
declare class WebInspectorElement extends LitElement {

@@ -506,3 +590,3 @@ static properties: {

//#endregion
export { type Anchor, WEB_INSPECTOR_TAG, WebInspectorElement, defineWebInspector, ɵCpkThreadDetails };
export { type Anchor, CpkThreadInspector, THREAD_INSPECTOR_TAG, ThreadDebuggerEvent, ThreadDebuggerMessage, ThreadDebuggerMetadata, ThreadDebuggerProvider, ThreadDebuggerProviderLoadOptions, ThreadDebuggerToolCall, WEB_INSPECTOR_TAG, WebInspectorElement, defineWebInspector, ɵCpkThreadDetails };
//# sourceMappingURL=index.d.mts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":"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"}
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;cAqEa,iBAAA;AAAA,cACA,oBAAA;AAAA,KAqID,iCAAA;EACV,MAAA,EAAQ,WAAA;AAAA;AAAA,KAGE,sBAAA;EACV,EAAA;EACA,IAAA;EACA,IAAA,WAAe,MAAA;AAAA;AAAA,KAGL,qBAAA;EACV,EAAA;EACA,IAAA;EACA,OAAA;EACA,SAAA,GAAY,sBAAA;EACZ,UAAA,WAXU;EAaV,YAAA;AAAA;AAAA,KAGU,mBAAA;EACV,IAAA;EACA,SAAA;EACA,OAAA,GAAU,MAAA;EAAA,CACT,GAAA;AAAA;AAAA,KAGS,sBAAA;EACV,EAAA;EACA,IAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,MAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,KAGU,sBAAA;EACV,iBAAA,IACE,QAAA,UACA,OAAA,EAAS,iCAAA,KACN,OAAA,CAAQ,sBAAA;EACb,WAAA,IACE,QAAA,UACA,OAAA,EAAS,iCAAA,KACN,OAAA,CAAQ,qBAAA;EACb,SAAA,IACE,QAAA,UACA,OAAA,EAAS,iCAAA,KACN,OAAA,CAAQ,mBAAA;EACb,QAAA,IACE,QAAA,UACA,OAAA,EAAS,iCAAA,KACN,OAAA,CAAQ,MAAA;AAAA;AAAA,UAuEL,aAAA;EACR,IAAA;EACA,SAAA;EACA,OAAA,EAAS,MAAA;EACT,WAAA;EACA,QAAA,GAAW,mBAAA;AAAA;AAAA,KAGR,gBAAA;AAAA,cAqaQ,kBAAA,SAA2B,UAAA;EAAA,OAC/B,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BP,QAAA;EACA,QAAA,EAAU,sBAAA;EACV,MAAA,EAAQ,sBAAA,GAAyB,OAAA;EACjC,UAAA;EACA,OAAA,EAAS,MAAA;EACT,yBAAA;EACA,eAAA,EAAiB,MAAA;EACjB,gBAAA,EAAkB,aAAA;;;;;;;EAOlB,kBAAA;EAAA,QAEQ,IAAA;EAAA,QACA,gBAAA;EAAA,QACA,aAAA;EAAA,QACA,cAAA;EAAA,QACA,aAAA;EAAA,QACA,gBAAA;EAAA,QACA,cAAA;EAAA,QACA,aAAA;EAAA,QACA,cAAA;EAAA,QACA,YAAA;EAAA,QACA,WAAA;EAAA,QACA,cAAA;EAAA,QACA,iBAAA;EAAA,QACA,gBAAA;EAAA,QACA,iBAAA;;UAEA,mBAAA;;UAEA,kBAAA;;;;;;;UAOA,kBAAA;;;;;;;;;;;UAWA,cAAA;;;;;;;;;;;UAWA,cAAA;EAAA,QAIA,mBAAA;EAAA,QAIA,+BAAA;EAtER;;;;;;EAAA,QAgFQ,cAAA;EA7EC;;;;EAAA,QAkFD,aAAA;EAAA,QACA,YAAA;EAAA,QACA,2BAAA;EAAA,QACA,cAAA;EAAA,QACA,cAAA;EAAA,QACA,YAAA;EAAA,QACA,WAAA;EAAA,QACA,gBAAA;EAAA,QACA,iBAAA;EAAA,QACA,cAAA;EAAA,QACA,kBAAA;EAAA,gBAEQ,kBAAA;EAAA,gBACA,QAAA,EAAU,aAAA;IACxB,EAAA,EAAI,gBAAA;IACJ,KAAA;EAAA;EAAA,eAOa,WAAA;EAAA,eACA,cAAA;EAAA,eAEA,eAAA;EA7EP;;;;;EAAA,eAqGO,cAAA;EAAA,QAQP,gBAAA;EAAA,QAMA,WAAA;EAAA,QAqBA,iBAAA;EAAA,OAiBD,MAAA,EAxFgC,GAAA,CAwF1B,SAAA;EAypBb,OAAA,CAAQ,QAAA,EAAU,GAAA;EAAA,QA0CV,gBAAA;EAAA,QAOA,cAAA;EAAA,QAOA,aAAA;EAAA,QAOA,cAAA;EAAA,QAUA,qBAAA;EAAA,QAmCM,aAAA;EAh2BN;;;;;;;;;;EAAA,QA43BM,aAAA;EAAA,QAuCA,WAAA;EAAA,QAqDA,UAAA;EAAA,QAuCA,oBAAA;EAAA,QAaA,kBAAA;EAAA,QAkBA,iBAAA;EAAA,QAkBN,sBAAA;EAAA,QAOA,WAAA;EAAA,QAkFA,YAAA;EAAA,YAgBI,mBAAA,CAAA;EAAA,QAIJ,sBAAA;EAAA,QASA,uBAAA;EAAA,YAyPI,WAAA,CAAA;EAAA,YAyBA,cAAA,CAAA;EAAA,YAgBA,QAAA,CAAA;EAAA,QAcJ,gBAAA;EAAA,QAOA,mBAAA;EAAA,YAOI,YAAA,CAAA;EAAA,YAkBA,WAAA,CAAA;EAAA,QAKJ,kBAAA;EAAA,QAKA,OAAA;EAAA,YAKI,QAAA,CAAA;EAAA,QAIJ,OAAA;EAAA,QAYA,mBAAA;EAAA,QASA,mBAAA;EAAA,QAUA,iBAAA;EASR,MAAA,CAAA,GAAM,cAAA;EAAA,QAmFE,mBAAA;EAAA,QA8BA,iBAAA;EAAA,QAYA,cAAA;EAAA,QAiDA,kBAAA;EAAA,QAqCA,kBAAA;EAhSI;;;;;;;;;EAAA,QAsVJ,cAAA;EAAA,QAYA,iBAAA;EAAA,QAeA,gBAAA;EAAA,QA0BA,YAAA;EAAA,QAqCA,eAAA;EAAA,QA4DA,eAAA;EAAA,QAWA,kBAAA;EAAA,QAgBA,WAAA;EAAA,QAoEA,YAAA;EAAA,QAuDA,iBAAA;EAAA,QA6BA,iBAAA;AAAA;AAAA,cAiFG,iBAAA,SAA0B,kBAAA;AAAA,cAY1B,mBAAA,SAA4B,UAAA;EAAA,OAChC,UAAA;IAAA;;;;;;;;UAKC,KAAA;EAAA,QACA,cAAA;EAAA,QACA,eAAA;EAAA,QACA,aAAA;EAAA,QACA,cAAA;EAAA,QACA,aAAA;EAAA,QAIA,kBAAA;EAAA,QACA,WAAA;EAAA,QACA,aAAA;EAAA,QAMA,kBAAA;EAAA,QACA,WAAA;EAAA,QACA,eAAA;EAAA,QACA,YAAA;EAAA,QACA,YAAA;EAAA,QAKA,SAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAAA,QACA,UAAA;EAAA,QACA,cAAA;EAAA,QACA,MAAA;EAAA,QACA,wBAAA;EAAA,QACA,qBAAA;EAAA,QACA,YAAA;EAAA,QACA,gBAAA;EAAA,QACA,eAAA;EAAA,QACA,qBAAA;EAAA,QACA,sBAAA;EAAA,QACA,mBAAA;EAAA,QACA,uBAAA;EAAA,QACA,QAAA;EAAA,QACA,yBAAA;EAAA,QACA,eAAA;EAAA,QAKA,oBAAA;EAAA,QAEA,kBAAA;EAAA,QACA,eAAA;EAAA,QACA,QAAA;EAAA,QACA,mBAAA;EAAA,QACA,mBAAA;EAAA,QACA,wBAAA;EAAA,QAEA,sBAAA;EAAA,QACA,cAAA;EAAA,QACA,mBAAA;EAAA,QACA,WAAA;EAAA,QACA,aAAA;EAAA,QACA,eAAA;EAAA,QACA,eAAA;EAAA,QAEA,YAAA;EAAA,QACA,aAAA;EAAA,QAMA,gBAAA;EAAA,QACA,qBAAA;EAAA,QACA,uBAAA;EAAA,QAOA,oBAAA;EAAA,QACA,qBAAA;EAAA,QACA,kBAAA;EAAA,QACA,mBAAA;EAAA,QACA,uBAAA;EAAA,QACA,oBAAA;EAAA,QAMA,sBAAA;EAAA,QACA,mBAAA;EAAA,QAOA,gBAAA;EAAA,QACA,4BAAA;EAAA,IAEJ,IAAA,CAAA,GAAQ,cAAA;EAAA,IAIR,IAAA,CAAK,KAAA,EAAO,cAAA;EAAA,iBAgBC,YAAA;EAAA,QAeT,iBAAA;EAAA,QAKA,eAAA;EAAA,QACA,WAAA;EAAA,QACA,iBAAA;EAAA,QACA,UAAA;EAAA,iBAES,cAAA;EAAA,YAIL,SAAA,CAAA;EAAA,QA+BJ,sBAAA;EAAA,QAQA,2BAAA;EAAA,QAIA,wBAAA;EAAA,QA0BA,wBAAA;EAAA,QAIA,oBAAA;EAAA,QAIA,sBAAA;EAAA,QAkCA,sBAAA;EAAA,QAWA,gCAAA;EAAA,QAUA,sBAAA;EAAA,QAwBA,uBAAA;EAAA,QAYA,6BAAA;EAAA,QAeA,sBAAA;EAAA,QAQA,yBAAA;EAAA,QAQA,YAAA;EAAA,QAkGA,cAAA;EAAA,QAgBA,0BAAA;EAAA,QAYA,oBAAA;EAAA,QAgCA,oBAAA;EAAA,QA4BA,iBAAA;EAAA,QA8BA,gBAAA;EAAA,QAoIA,oBAAA;EAAA,QAQA,yBAAA;EAAA,QA0BA,gBAAA;EAAA,QA8BA,iBAAA;EAAA,QAqCA,cAAA;EAAA,QAuBA,oBAAA;EAAA,QAmEA,2BAAA;EAAA,QAQA,YAAA;EAAA,QA2BA,sBAAA;EAAA,QAcA,yBAAA;EAAA,QAOA,cAAA;EAAA,QAiCA,aAAA;EAAA,QA6BA,qBAAA;EAAA,QAyCA,uBAAA;EAAA,QAyBA,kBAAA;EAAA,QAqBA,qBAAA;EAAA,QA6BA,oBAAA;EAAA,QAmCA,gBAAA;EAAA,QAeA,uBAAA;EAAA,QASM,eAAA;EAAA,OAgBP,MAAA,EApkCuB,GAAA,CAokCjB,SAAA;EA2tBb,iBAAA,CAAA;EAAA,QAiBQ,gBAAA;EAWR,oBAAA,CAAA;EAsBA,YAAA,CAAA;EAwCA,MAAA,CAAA,GAAM,cAAA;EAAA,QAIE,YAAA;EAAA,QAqEA,YAAA;EAAA,QA+LA,4BAAA;EAAA,QAqCA,uBAAA;EAAA,YAqDI,aAAA,CAAA;EAAA,QAIJ,iBAAA;EAAA,QAkCA,iBAAA;EAAA,QA+BA,eAAA;EAAA,QAsCA,mBAAA;EAAA,QAaA,iBAAA;EAAA,QAkBA,sBAAA;EAAA,QAKA,gBAAA;EAAA,QAIA,uBAAA;EAAA,QAmBA,uBAAA;EAAA,QAyCA,qBAAA;EAAA,QAqBA,yBAAA;EAAA,QAqBA,YAAA;EAAA,QAcA,cAAA;EAAA,QAcA,aAAA;EAAA,QAgBA,qBAAA;EAAA,QAqBA,mBAAA;EAAA,QAiBA,0BAAA;EAAA,QAaA,eAAA;EAAA,QAQA,YAAA;EAAA,QAyBA,eAAA;EAAA,QAwBA,WAAA;EAAA,QAgCA,mBAAA;EAAA,QAaA,eAAA;EAAA,QAkCA,gBAAA;EAAA,QAmCA,mBAAA;EAAA,QAcA,WAAA;EAAA,QAOA,wBAAA;EAAA,QAYA,kBAAA;EAAA,QA4BA,mBAAA;EAAA,QAcA,mBAAA;EAAA,QAOA,oBAAA;EAAA,QAQA,aAAA;EAAA,QAkCA,cAAA;EAAA,QAqBA,UAAA;EAAA,QAwBA,kBAAA;EAAA,QA8BA,qBAAA;EAAA,QAsBA,eAAA;EAAA,QAIA,mBAAA;EAAA,QAiBA,kBAAA;EAAA,QAgEA,qBAAA;EAAA,QAcA,uBAAA;EAAA,QA+BA,kBAAA;EAAA,QA0CA,qBAAA;EAAA,QAwBA,sBAAA;EAAA,QAYA,qBAAA;EAAA,QA8BA,cAAA;EAAA,QAIA,eAAA;EAAA,QACA,YAAA;EAAA,QACA,YAAA;EAAA,QACA,aAAA;EAAA,QACA,oBAAA;EAAA,QACA,kBAAA;EAAA,QAEA,uBAAA;EAAA,QA0BA,oBAAA;EAAA,QAmDA,iBAAA;EAAA,QA4BA,mBAAA;EAAA,QAwCA,sBAAA;EAAA,QAcA,yBAAA;EAAA,QAaA,oCAAA;EAAA,QAaA,gCAAA;EAAA,QAaA,8BAAA;EAAA,QASA,8BAAA;EAAA,QAcA,4BAAA;EAAA,QASA,yBAAA;EAAA,QAkBA,mCAAA;EAAA,QA2JA,uBAAA;EAAA,QA8IA,iBAAA;EAAA,QAyIA,iBAAA;EAAA,QAwPA,sBAAA;EAAA,QAMA,qBAAA;EAAA,QAUA,iBAAA;EAAA,QAMA,oBAAA;EAAA,QAWA,mBAAA;EAAA,QASA,kBAAA;EAAA,QAIA,iBAAA;EAAA,QAgBA,YAAA;EAAA,QAeA,gBAAA;EAAA,QAiPA,qBAAA;EAAA,QAmEA,gBAAA;EAAA,QA6DA,2BAAA;EAAA,QAOA,yBAAA;EAAA,QAeA,eAAA;EAAA,QAsDA,sBAAA;EAAA,QAqFA,cAAA;EAAA,QAqLA,iBAAA;EAAA,QAkGA,aAAA;EAAA,QAmBA,mBAAA;EAAA,QAuEA,mBAAA;EAAA,QASA,iBAAA;EAAA,QAoCA,iBAAA;EAAA,QAuHA,sBAAA;EAAA,QA6BA,kBAAA;EAAA,QAoBM,gBAAA;EAAA,QAuBN,sBAAA;EAAA,QASA,uBAAA;EAAA,QAkBA,kBAAA;EAAA,QAeA,wBAAA;EAAA,QA6EA,wBAAA;EAAA,QAUA,yBAAA;EAAA,QAWA,yBAAA;EAAA,QAkCA,8BAAA;EAAA,QAWA,gCAAA;EAAA,QAOA,yBAAA;EAAA,QAKM,iBAAA;EAAA,QAmEA,qBAAA;EAAA,QAwBN,sBAAA;EAAA,QAkBA,iBAAA;EAAA,QAEA,YAAA;EAAA,QAWA,YAAA;EAAA,QAUA,8BAAA;EAAA,QAyCA,cAAA;EAAA,QAoCA,uBAAA;EAAA,QAKA,cAAA;EAAA,QAIA,+BAAA;EAAA,QAqBA,4BAAA;EAAA,QAYA,oBAAA;AAAA;AAAA,iBAqBM,kBAAA,CAAA;AAAA,QAQR,MAAA;EAAA,UACI,qBAAA;IACR,mBAAA,EAAqB,mBAAA;EAAA;AAAA"}
//#region package.json
var version = "1.61.2";
var version = "1.62.0";

@@ -5,0 +5,0 @@ //#endregion

//#region package.json
var version = "1.61.2";
var version = "1.62.0";

@@ -4,0 +4,0 @@ //#endregion

{
"name": "@copilotkit/web-inspector",
"version": "1.61.2",
"version": "1.62.0",
"description": "Lit-based web component for the CopilotKit web inspector",

@@ -30,3 +30,3 @@ "repository": {

"marked": "^12.0.2",
"@copilotkit/core": "1.61.2"
"@copilotkit/core": "1.62.0"
},

@@ -40,2 +40,3 @@ "devDependencies": {

"typescript": "5.8.2",
"vite": "^7.3.2",
"vitest": "^3.0.5",

@@ -53,2 +54,3 @@ "@copilotkit/typescript-config": "1.55.0-next.8"

"dev:css": "tailwindcss -i ./src/styles/tailwind.css -o ./src/styles/generated.css --watch --minify",
"dev:standalone": "vite dev dev --config dev/vite.config.ts --host 127.0.0.1 --port 5177",
"check-types": "pnpm run build:css && tsc --noEmit",

@@ -55,0 +57,0 @@ "test": "pnpm run build:css && vitest run",

@@ -1,2 +0,7 @@

import { WebInspectorElement, ɵCpkThreadDetails } from "../index.js";
import {
CpkThreadInspector,
WebInspectorElement,
ɵCpkThreadDetails,
} from "../index.js";
import type { ThreadDebuggerProvider } from "../index.js";
import type { CopilotKitCore } from "@copilotkit/core";

@@ -19,2 +24,14 @@ import { CopilotKitCoreRuntimeConnectionStatus } from "@copilotkit/core";

type InspectorThreadViewInternals = {
isOpen: boolean;
selectedMenu: "threads";
selectedThreadId: string | null;
_threads: Array<{
id: string;
name?: string | null;
agentId: string;
updatedAt?: string | null;
}>;
};
type InspectorContextInternals = {

@@ -299,3 +316,3 @@ contextStore: Record<string, { description?: string; value: unknown }>;

//
// The conversation / agent-state / events panels each cache the rendered
// The timeline / state / raw-events panels each cache the rendered
// TemplateResult by reference of the underlying data so tab switches don't

@@ -315,5 +332,12 @@ // re-iterate over hundreds of items. These tests pin down the cache-key

liveMessageVersion: number;
provider: ThreadDebuggerProvider | null;
_fetchedMetadata: Record<string, unknown> | null;
_conversation: Array<Record<string, unknown>>;
agentEventsInput: Array<Record<string, unknown>>;
_fetchedState: Record<string, unknown> | null;
_fetchedEvents: Array<unknown> | null;
_fetchedEvents: Array<Record<string, unknown>> | null;
_timelineItemsCache: {
events: Array<Record<string, unknown>>;
items: Array<Record<string, unknown>>;
} | null;
_expandedTools: Set<string>;

@@ -326,2 +350,3 @@ _expandedMessages: Set<string>;

_loadingEvents: boolean;
activeTimelineItems: Array<Record<string, unknown>>;
_panelTplCache: Map<string, { key: readonly unknown[]; tpl: unknown }>;

@@ -331,5 +356,9 @@ fetchMessages: (threadId: string) => Promise<void>;

fetchState: (threadId: string) => Promise<void>;
renderTimeline: () => unknown;
renderConversation: () => unknown;
renderState: () => unknown;
renderEvents: () => unknown;
timelineItemsFromEvents: (
events: Array<Record<string, unknown>>,
) => Array<Record<string, unknown>>;
};

@@ -349,2 +378,31 @@

function createThreadInspector(): {
el: CpkThreadInspector;
internals: ThreadDetailsInternals;
} {
const el = new CpkThreadInspector();
document.body.appendChild(el);
const internals = el as unknown as ThreadDetailsInternals;
return { el, internals };
}
async function flushProviderWork(el: CpkThreadInspector): Promise<void> {
await Promise.resolve();
await el.updateComplete;
}
function createDeferred<T>(): {
promise: Promise<T>;
resolve: (value: T) => void;
reject: (reason?: unknown) => void;
} {
let resolve!: (value: T) => void;
let reject!: (reason?: unknown) => void;
const promise = new Promise<T>((res, rej) => {
resolve = res;
reject = rej;
});
return { promise, resolve, reject };
}
describe("ɵCpkThreadDetails caching", () => {

@@ -373,3 +431,3 @@ beforeEach(() => {

it("threadId change drops all three template caches", async () => {
it("threadId change drops template and timeline item caches", async () => {
const { el, internals } = createThreadDetails();

@@ -381,5 +439,14 @@ await settleThread(el, internals, "t1");

// is what the assertion below checks for; what they hold is irrelevant.
internals._panelTplCache.set("conversation", { key: [], tpl: "c" });
internals._panelTplCache.set("agent-state", { key: [], tpl: "s" });
internals._panelTplCache.set("ag-ui-events", { key: [], tpl: "e" });
internals._panelTplCache.set("timeline", { key: [], tpl: "c" });
internals._panelTplCache.set("state", { key: [], tpl: "s" });
internals._panelTplCache.set("raw-events", { key: [], tpl: "e" });
internals.agentEventsInput = [
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: {},
},
];
internals.renderTimeline();
expect(internals._timelineItemsCache).not.toBeNull();

@@ -392,2 +459,3 @@ // Switch to thread t2 — the threadId branch in `updated()` should

expect(internals._panelTplCache.size).toBe(0);
expect(internals._timelineItemsCache).toBeNull();
});

@@ -446,7 +514,17 @@

expect(fetchSpy.mock.calls.map((call) => String(call[0]))).toEqual([
const requestedUrls = fetchSpy.mock.calls.map((call) => String(call[0]));
expect(requestedUrls).toContain(
"http://localhost:4000/api/threads/thread%20one/messages",
);
expect(requestedUrls).toContain(
"http://localhost:4000/api/threads/thread%20one/events",
);
expect(requestedUrls).toContain(
"http://localhost:4000/api/threads/thread%20one/state",
]);
);
expect(
requestedUrls.every(
(url) => !url.includes("/api//threads/") && !url.includes("one//"),
),
).toBe(true);
} finally {

@@ -466,3 +544,3 @@ fetchSpy.mockRestore();

const tplA = internals.renderConversation();
expect(internals._panelTplCache.get("conversation")?.tpl).toBe(tplA);
expect(internals._panelTplCache.get("timeline-fallback")?.tpl).toBe(tplA);

@@ -482,3 +560,3 @@ // Cache hit: same array reference, same expand sets — same TemplateResult.

expect(tplB).not.toBe(tplA);
expect(internals._panelTplCache.get("conversation")?.tpl).toBe(tplB);
expect(internals._panelTplCache.get("timeline-fallback")?.tpl).toBe(tplB);
});

@@ -522,2 +600,78 @@

it("keeps timeline and message fallback template caches separate", async () => {
const { el, internals } = createThreadDetails();
await settleThread(el, internals, "t1");
const events = [
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: {},
sourceIndex: 1,
},
];
internals._fetchedEvents = events;
const timelineTpl = internals.renderTimeline();
expect(internals._panelTplCache.get("timeline")?.tpl).toBe(timelineTpl);
internals._fetchedEvents = [];
internals._conversation = [
{ id: "m1", type: "user", content: "fallback", createdAt: "" },
];
const fallbackTpl = internals.renderTimeline();
expect(fallbackTpl).not.toBe(timelineTpl);
expect(internals._panelTplCache.get("timeline")?.tpl).toBe(timelineTpl);
expect(internals._panelTplCache.get("timeline-fallback")?.tpl).toBe(
fallbackTpl,
);
internals._fetchedEvents = events;
expect(internals.renderTimeline()).toBe(timelineTpl);
});
it("does not recompute timeline items when renderTimeline returns a cached template", async () => {
const { el, internals } = createThreadDetails();
await settleThread(el, internals, "t1");
internals._fetchedEvents = [
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: {},
sourceIndex: 1,
},
];
const normalizeSpy = vi.spyOn(internals, "timelineItemsFromEvents");
const timelineTpl = internals.renderTimeline();
expect(internals.renderTimeline()).toBe(timelineTpl);
expect(normalizeSpy).toHaveBeenCalledTimes(1);
});
it("keeps live fallback event references stable for timeline and raw event caches", async () => {
const { el, internals } = createThreadDetails();
await settleThread(el, internals, "t1");
internals.agentEventsInput = [
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: {},
},
];
const normalizeSpy = vi.spyOn(internals, "timelineItemsFromEvents");
const timelineTpl = internals.renderTimeline();
const eventsTpl = internals.renderEvents();
expect(internals.renderTimeline()).toBe(timelineTpl);
expect(internals.renderEvents()).toBe(eventsTpl);
expect(normalizeSpy).toHaveBeenCalledTimes(1);
});
it("state and events caches invalidate when their fetched data is reassigned", async () => {

@@ -528,3 +682,10 @@ const { el, internals } = createThreadDetails();

internals._fetchedState = { foo: "bar" };
internals._fetchedEvents = [{ type: "RUN_STARTED" }];
internals._fetchedEvents = [
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: {},
sourceIndex: 1,
},
];

@@ -538,3 +699,10 @@ const stateA = internals.renderState();

internals._fetchedState = { foo: "baz" };
internals._fetchedEvents = [{ type: "RUN_FINISHED" }];
internals._fetchedEvents = [
{
type: "RUN_FINISHED",
timestamp: "2026-06-25T10:00:01.000Z",
payload: {},
sourceIndex: 1,
},
];

@@ -546,2 +714,469 @@ expect(internals.renderState()).not.toBe(stateA);

describe("CpkThreadInspector provider contract", () => {
beforeEach(() => {
document.body.innerHTML = "";
});
afterEach(() => {
vi.unstubAllGlobals();
});
it("registers the stable custom element and renders a normalized provider-backed timeline", async () => {
expect(customElements.get("cpk-thread-inspector")).toBe(CpkThreadInspector);
const provider: ThreadDebuggerProvider = {
getThreadMetadata: vi.fn().mockResolvedValue({
id: "thread-1234567890",
agentId: "agent-a",
endUserId: "user-a",
status: "active",
createdAt: "2026-06-25T10:00:00.000Z",
updatedAt: "2026-06-25T10:00:01.000Z",
}),
getMessages: vi.fn().mockResolvedValue([]),
getEvents: vi.fn().mockResolvedValue([
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: { runId: "run-1" },
},
{
type: "TEXT_MESSAGE_START",
timestamp: "2026-06-25T10:00:00.100Z",
payload: { messageId: "m1", role: "assistant" },
},
{
type: "TEXT_MESSAGE_CONTENT",
timestamp: "2026-06-25T10:00:00.200Z",
payload: { messageId: "m1", delta: "hello from events" },
},
{
type: "TOOL_CALL_START",
timestamp: "2026-06-25T10:00:00.300Z",
payload: { toolCallId: "tc1", toolCallName: "lookup_docs" },
},
{
type: "TOOL_CALL_ARGS",
timestamp: "2026-06-25T10:00:00.400Z",
payload: { toolCallId: "tc1", delta: '{"broken":' },
},
{
type: "TOOL_CALL_END",
timestamp: "2026-06-25T10:00:00.500Z",
payload: { toolCallId: "tc1" },
},
]),
};
const { el, internals } = createThreadInspector();
internals.provider = provider;
internals.threadId = "thread-1234567890";
await flushProviderWork(el);
expect(provider.getThreadMetadata).toHaveBeenCalledWith(
"thread-1234567890",
expect.objectContaining({ signal: expect.any(AbortSignal) }),
);
expect(provider.getEvents).toHaveBeenCalledWith(
"thread-1234567890",
expect.objectContaining({ signal: expect.any(AbortSignal) }),
);
expect(provider.getMessages).not.toHaveBeenCalled();
expect(internals._fetchedMetadata?.agentId).toBe("agent-a");
expect(internals._fetchedEvents).toHaveLength(6);
const text = el.shadowRoot?.textContent ?? "";
expect(text).toContain("Timeline");
expect(text).toContain("Raw AG-UI Events");
expect(text).toContain("State");
expect(text).toContain("Run started");
expect(text).toContain("assistant message");
expect(text).toContain("hello from events");
expect(text).toContain("lookup_docs");
expect(text).toContain("Could not decode tool call arguments");
expect(text).toContain("Source event #1");
expect(text).toContain("Source event #6");
expect(text).toContain("agent-a");
expect(text).toContain("user-a");
expect(text).not.toContain("Rename");
expect(text).not.toContain("Archive");
expect(text).not.toContain("Delete");
});
it("source-event references reveal raw events and state stays lazy-loaded", async () => {
const provider: ThreadDebuggerProvider = {
getMessages: vi.fn().mockResolvedValue([]),
getEvents: vi.fn().mockResolvedValue([
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: { runId: "run-1" },
},
]),
getState: vi.fn().mockResolvedValue({ step: 1 }),
};
const { el, internals } = createThreadInspector();
internals.provider = provider;
internals.threadId = "thread-1";
await flushProviderWork(el);
expect(provider.getEvents).toHaveBeenCalledTimes(1);
expect(provider.getState).not.toHaveBeenCalled();
expect(internals._fetchedEvents?.[0]).toMatchObject({
type: "RUN_STARTED",
payload: { runId: "run-1" },
});
el.shadowRoot
?.querySelector<HTMLButtonElement>(".cpk-td__source-link")
?.click();
await flushProviderWork(el);
expect(
el.shadowRoot?.querySelector<HTMLElement>(
'.cpk-td__event[data-source-index="1"]',
),
).not.toBeNull();
expect(provider.getEvents).toHaveBeenCalledTimes(1);
el.shadowRoot
?.querySelectorAll<HTMLButtonElement>('[role="tab"]')[2]
?.click();
await flushProviderWork(el);
expect(provider.getState).toHaveBeenCalledWith(
"thread-1",
expect.objectContaining({ signal: expect.any(AbortSignal) }),
);
expect(internals._fetchedState).toEqual({ step: 1 });
});
it("reloads when a provider arrives after threadId and when provider identity swaps for the same thread", async () => {
const firstEvents =
createDeferred<
Awaited<ReturnType<NonNullable<ThreadDebuggerProvider["getEvents"]>>>
>();
const firstSignals: AbortSignal[] = [];
const firstProvider: ThreadDebuggerProvider = {
getEvents: vi.fn((_threadId, options) => {
firstSignals.push(options.signal);
return firstEvents.promise;
}),
};
const secondProvider: ThreadDebuggerProvider = {
getEvents: vi.fn().mockResolvedValue([
{
type: "RUN_FINISHED",
timestamp: "2026-06-25T10:00:01.000Z",
payload: { runId: "second-run" },
},
]),
};
const { el, internals } = createThreadInspector();
internals.threadId = "thread-1";
await flushProviderWork(el);
expect(firstProvider.getEvents).not.toHaveBeenCalled();
internals.provider = firstProvider;
await flushProviderWork(el);
expect(firstProvider.getEvents).toHaveBeenCalledWith(
"thread-1",
expect.objectContaining({ signal: expect.any(AbortSignal) }),
);
internals.provider = secondProvider;
await flushProviderWork(el);
expect(firstSignals[0]?.aborted).toBe(true);
await vi.waitFor(() => {
expect(secondProvider.getEvents).toHaveBeenCalledWith(
"thread-1",
expect.objectContaining({ signal: expect.any(AbortSignal) }),
);
expect(internals._fetchedEvents?.[0]?.type).toBe("RUN_FINISHED");
expect(internals._fetchedEvents?.[0]?.payload).toEqual({
runId: "second-run",
});
});
firstEvents.resolve([
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: { runId: "stale-run" },
},
]);
await Promise.resolve();
expect(internals._fetchedEvents?.[0]?.payload).toEqual({
runId: "second-run",
});
});
it("renders raw AG-UI events with top-level fields preserved when payload is present", async () => {
const provider: ThreadDebuggerProvider = {
getEvents: vi.fn().mockResolvedValue([
{
type: "TEXT_MESSAGE_CONTENT",
timestamp: "2026-06-25T10:00:00.000Z",
payload: { messageId: "m1", delta: "hello" },
runId: "top-level-run",
sequence: 42,
},
]),
};
const { el, internals } = createThreadInspector();
internals.provider = provider;
internals.threadId = "thread-raw";
await flushProviderWork(el);
expect(internals._fetchedEvents?.[0]?.payload).toEqual({
messageId: "m1",
delta: "hello",
});
expect(internals._fetchedEvents?.[0]?.rawEvent).toMatchObject({
runId: "top-level-run",
sequence: 42,
payload: { messageId: "m1", delta: "hello" },
});
el.shadowRoot
?.querySelector<HTMLButtonElement>(".cpk-td__source-link")
?.click();
await flushProviderWork(el);
const text = el.shadowRoot?.textContent ?? "";
expect(text).toContain("top-level-run");
expect(text).toContain("sequence");
expect(text).toContain("messageId");
expect(text).toContain("hello");
});
it("ignores stale runtime 501 availability results after the selected thread changes", async () => {
const t1Events = createDeferred<Response>();
const t1State = createDeferred<Response>();
const t2Events = createDeferred<Response>();
const t2State = createDeferred<Response>();
const fetchMock = vi.fn((url: string) => {
if (url.endsWith("/threads/t1/events")) return t1Events.promise;
if (url.endsWith("/threads/t1/state")) return t1State.promise;
if (url.endsWith("/threads/t2/events")) return t2Events.promise;
if (url.endsWith("/threads/t2/state")) return t2State.promise;
if (url.endsWith("/threads/t2/messages")) {
return Promise.resolve(
new Response(JSON.stringify({ messages: [] }), { status: 200 }),
);
}
return Promise.reject(new Error(`Unexpected URL ${url}`));
});
vi.stubGlobal("fetch", fetchMock);
const { el, internals } = createThreadInspector();
internals.runtimeUrl = "http://runtime";
internals.threadInspectionAvailable = true;
internals.threadId = "t1";
await flushProviderWork(el);
const t1StatePromise = internals.fetchState("t1");
internals.threadId = "t2";
await flushProviderWork(el);
const t2StatePromise = internals.fetchState("t2");
t1Events.resolve(new Response(null, { status: 501 }));
t1State.resolve(new Response(null, { status: 501 }));
t2Events.resolve(
new Response(
JSON.stringify({
events: [
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: { runId: "fresh" },
},
],
}),
{ status: 200 },
),
);
t2State.resolve(
new Response(JSON.stringify({ state: { current: "fresh" } }), {
status: 200,
}),
);
await Promise.all([t1StatePromise, t2StatePromise]);
await vi.waitFor(() => {
expect(internals._eventsNotAvailable).toBe(false);
expect(internals._stateNotAvailable).toBe(false);
expect(internals._fetchedEvents?.[0]?.payload).toEqual({
runId: "fresh",
});
expect(internals._fetchedState).toEqual({ current: "fresh" });
});
});
it("refetches runtime thread data when headers change for the same thread", async () => {
const fetchMock = vi.fn(
(_url: string, init?: { headers?: Record<string, string> }) =>
Promise.resolve(
new Response(
JSON.stringify({
events: [
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: {
auth: init?.headers?.Authorization,
},
},
],
}),
{ status: 200 },
),
),
);
vi.stubGlobal("fetch", fetchMock);
const { el, internals } = createThreadInspector();
internals.runtimeUrl = "http://runtime";
internals.threadInspectionAvailable = true;
internals.headers = { Authorization: "Bearer first" };
internals.threadId = "thread-1";
await flushProviderWork(el);
await vi.waitFor(() => {
expect(fetchMock).toHaveBeenCalledTimes(1);
expect(internals._fetchedEvents?.[0]?.payload).toEqual({
auth: "Bearer first",
});
});
internals.headers = { Authorization: "Bearer second" };
await flushProviderWork(el);
await vi.waitFor(() => {
expect(fetchMock).toHaveBeenCalledTimes(2);
expect(internals._fetchedEvents?.[0]?.payload).toEqual({
auth: "Bearer second",
});
});
expect(headersOf(fetchMock.mock.calls.at(-1)!)).toMatchObject({
Authorization: "Bearer second",
});
});
it("loads runtime messages when event history is empty so timeline fallback and counts work", async () => {
const fetchMock = vi.fn((url: string) => {
if (url.endsWith("/threads/thread-1/events")) {
return Promise.resolve(
new Response(JSON.stringify({ events: [] }), { status: 200 }),
);
}
if (url.endsWith("/threads/thread-1/messages")) {
return Promise.resolve(
new Response(
JSON.stringify({
messages: [
{ id: "u1", role: "user", content: "historical hello" },
{ id: "a1", role: "assistant", content: "historical reply" },
],
}),
{ status: 200 },
),
);
}
return Promise.reject(new Error(`Unexpected URL ${url}`));
});
vi.stubGlobal("fetch", fetchMock);
const { el, internals } = createThreadInspector();
internals.runtimeUrl = "http://runtime";
internals.threadInspectionAvailable = true;
internals.threadId = "thread-1";
await flushProviderWork(el);
await vi.waitFor(() => {
expect(internals._fetchedEvents).toEqual([]);
expect(internals._conversation).toHaveLength(2);
expect(el.shadowRoot?.textContent ?? "").toContain("historical hello");
expect(el.shadowRoot?.textContent ?? "").toContain("historical reply");
});
el.shadowRoot
?.querySelector<HTMLButtonElement>(".cpk-td__panel-toggle")
?.click();
await flushProviderWork(el);
expect(el.shadowRoot?.textContent ?? "").toContain("Messages");
expect(el.shadowRoot?.textContent ?? "").toContain("2");
});
it("renders unsupported raw events as timeline rows instead of leaving the first tab empty", async () => {
const provider: ThreadDebuggerProvider = {
getEvents: vi.fn().mockResolvedValue([
{
type: "THREAD_STATE_WRITTEN",
timestamp: "2026-06-25T10:00:00.000Z",
payload: { checkpointId: "state-1", status: "ok" },
},
]),
};
const { el, internals } = createThreadInspector();
internals.provider = provider;
internals.threadId = "thread-raw-event-only";
await flushProviderWork(el);
expect(internals.activeTimelineItems).toHaveLength(1);
expect(el.shadowRoot?.textContent ?? "").toContain("THREAD_STATE_WRITTEN");
expect(el.shadowRoot?.textContent ?? "").toContain("checkpointId");
expect(el.shadowRoot?.textContent ?? "").toContain("Source event #1");
expect(el.shadowRoot?.textContent ?? "").not.toContain(
"No timeline events captured",
);
});
it("keeps the first-visible timeline intentional while provider message fallback is loading", async () => {
const messages =
createDeferred<
Awaited<ReturnType<NonNullable<ThreadDebuggerProvider["getMessages"]>>>
>();
const provider: ThreadDebuggerProvider = {
getEvents: vi.fn().mockResolvedValue([]),
getMessages: vi.fn().mockReturnValue(messages.promise),
};
const { el, internals } = createThreadInspector();
internals.provider = provider;
internals.threadId = "thread-messages-only";
await flushProviderWork(el);
expect(provider.getMessages).toHaveBeenCalledWith(
"thread-messages-only",
expect.objectContaining({ signal: expect.any(AbortSignal) }),
);
expect(internals._loadingMessages).toBe(true);
expect(el.shadowRoot?.textContent ?? "").toContain("Loading messages");
expect(el.shadowRoot?.textContent ?? "").not.toContain(
"No timeline events captured",
);
messages.resolve([
{ id: "u1", role: "user", content: "provider hello" },
{ id: "a1", role: "assistant", content: "provider reply" },
]);
await vi.waitFor(() => {
const text = el.shadowRoot?.textContent ?? "";
expect(text).toContain("provider hello");
expect(text).toContain("provider reply");
});
});
});
// ─────────────────────────────────────────────────────────────────────────

@@ -836,2 +1471,71 @@ // Announcement preview (popout) dismissal MUST persist

it("rerenders selected thread details so core header changes refetch events with new headers", async () => {
fetchMock.mockImplementation(
(url: string, init?: { headers?: Record<string, string> }) => {
if (url.endsWith("/threads/thread-1/events")) {
return Promise.resolve(
new Response(
JSON.stringify({
events: [
{
type: "RUN_STARTED",
timestamp: "2026-06-25T10:00:00.000Z",
payload: { csrf: init?.headers?.["X-CSRF"] },
},
],
}),
{ status: 200 },
),
);
}
if (url.includes("/threads?")) {
return Promise.resolve(
new Response(JSON.stringify({ threads: [] }), { status: 200 }),
);
}
return Promise.reject(new Error(`Unexpected URL ${url}`));
},
);
const harness = createHeaderMockCore({}, { "X-CSRF": "1" });
const inspector = new WebInspectorElement();
document.body.appendChild(inspector);
inspector.core = harness.core as unknown as WebInspectorElement["core"];
const internals = inspector as unknown as InspectorThreadViewInternals;
internals.isOpen = true;
internals.selectedMenu = "threads";
internals.selectedThreadId = "thread-1";
internals._threads = [
{
id: "thread-1",
name: "Thread 1",
agentId: "alpha",
updatedAt: "2026-06-25T10:00:00.000Z",
},
];
inspector.requestUpdate();
await inspector.updateComplete;
await vi.waitFor(() => {
expect(
fetchMock.mock.calls.filter((call) =>
String(call[0]).endsWith("/threads/thread-1/events"),
),
).toHaveLength(1);
});
harness.emitHeadersChanged({ "X-CSRF": "2" });
await vi.waitFor(() => {
expect(
fetchMock.mock.calls.filter((call) =>
String(call[0]).endsWith("/threads/thread-1/events"),
),
).toHaveLength(2);
});
expect(headersOf(fetchMock.mock.calls.at(-1)!)).toMatchObject({
"X-CSRF": "2",
});
});
it("shows the locked Intelligence state when thread listing is unavailable without fetching threads", async () => {

@@ -838,0 +1542,0 @@ const { agent } = createMockAgent("alpha");

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display