@tonyclaw/agent-inspector 2.1.18 → 2.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/{CompareDrawer-Fqqw5Lci.js → CompareDrawer-BRCSDHn3.js} +1 -1
- package/.output/public/assets/ProxyViewerContainer-v5Lmx35X.js +106 -0
- package/.output/public/assets/{ReplayDialog-hYhz_i6W.js → ReplayDialog-Dkez3vxu.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-CTuWbtwC.js → RequestAnatomy-CHBODGDF.js} +1 -1
- package/.output/public/assets/{ResponseView-CsZ7S5Gv.js → ResponseView-Dk2dJY-B.js} +2 -2
- package/.output/public/assets/{StreamingChunkSequence-PIbJMotU.js → StreamingChunkSequence-gZpqWwKK.js} +1 -1
- package/.output/public/assets/_sessionId-DziA4ZD4.js +1 -0
- package/.output/public/assets/{index-F7mynwuH.js → index-B1-V3HCD.js} +1 -1
- package/.output/public/assets/index-ChgjUix0.css +1 -0
- package/.output/public/assets/index-DkHcxpXi.js +1 -0
- package/.output/public/assets/{json-viewer-DCXtNmmD.js → json-viewer-CtvzeDPb.js} +1 -1
- package/.output/public/assets/{main-BJZf7_Ib.js → main-CgmDEMGA.js} +2 -2
- package/.output/server/{_sessionId-DjSHDNh8.mjs → _sessionId-CbsSRLSa.mjs} +2 -2
- package/.output/server/_ssr/{CompareDrawer-Dal52IFo.mjs → CompareDrawer-BiSslksi.mjs} +2 -2
- package/.output/server/_ssr/{ProxyViewerContainer-CVqFZGff.mjs → ProxyViewerContainer-DIN2AjhM.mjs} +216 -183
- package/.output/server/_ssr/{ReplayDialog-BOEgdMes.mjs → ReplayDialog-DzoWpTis.mjs} +3 -3
- package/.output/server/_ssr/{RequestAnatomy-gch7_vCV.mjs → RequestAnatomy-D2tbgAPn.mjs} +2 -2
- package/.output/server/_ssr/{ResponseView-lEWPy-H4.mjs → ResponseView-BFP7zo8Z.mjs} +2 -2
- package/.output/server/_ssr/{StreamingChunkSequence-DnudbJ1O.mjs → StreamingChunkSequence-BfiRZW_k.mjs} +2 -2
- package/.output/server/_ssr/{index-Cza8zDrW.mjs → index-OlcgE4Tl.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{json-viewer-C2lIVEX3.mjs → json-viewer-DmhEr-jg.mjs} +2 -2
- package/.output/server/_ssr/{router-bF9uzd1k.mjs → router-BMdwHLHh.mjs} +80 -21
- package/.output/server/{_tanstack-start-manifest_v-ErvW-mtr.mjs → _tanstack-start-manifest_v-CL4qjwkQ.mjs} +1 -1
- package/.output/server/index.mjs +77 -77
- package/package.json +1 -1
- package/src/components/groups/GroupsDialog.tsx +71 -10
- package/src/components/proxy-viewer/ConversationGroupList.tsx +11 -11
- package/src/components/proxy-viewer/ConversationHeader.tsx +7 -7
- package/src/components/proxy-viewer/LogEntry.tsx +15 -26
- package/src/components/proxy-viewer/LogEntryHeader.tsx +11 -14
- package/src/components/proxy-viewer/RequestToolsPanel.tsx +15 -15
- package/src/components/proxy-viewer/ThreadConnector.tsx +3 -3
- package/src/components/proxy-viewer/ToolTraceEvents.tsx +1 -1
- package/src/components/proxy-viewer/TurnGroup.tsx +10 -14
- package/src/lib/groupContract.ts +6 -0
- package/src/proxy/groupStore.ts +24 -0
- package/src/routes/api/groups.ts +41 -1
- package/src/services/groups.ts +8 -0
- package/.output/public/assets/ProxyViewerContainer-CP_RzwW9.js +0 -106
- package/.output/public/assets/_sessionId-CUGA9qU3.js +0 -1
- package/.output/public/assets/index-G4dTUobw.js +0 -1
- package/.output/public/assets/index-gvYkgMPF.css +0 -1
package/.output/server/_ssr/{ProxyViewerContainer-CVqFZGff.mjs → ProxyViewerContainer-DIN2AjhM.mjs}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as reactExports, j as jsxRuntimeExports, a as React } from "../_libs/react.mjs";
|
|
2
|
-
import { I as InspectorGroupsListResponseSchema, C as CapturedLogSchema, D as DEFAULT_CAPTURE_MODE, a as DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS, b as DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS, c as DEFAULT_TIME_DISPLAY_FORMAT, d as RuntimeConfigSchema, p as packageJson, P as ProviderConfigSchema, i as apiFormatForPath, n as
|
|
2
|
+
import { I as InspectorGroupsListResponseSchema, C as CapturedLogSchema, D as DEFAULT_CAPTURE_MODE, a as DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS, b as DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS, c as DEFAULT_TIME_DISPLAY_FORMAT, d as RuntimeConfigSchema, p as packageJson, P as ProviderConfigSchema, i as apiFormatForPath, n as DeleteInspectorGroupsResponseSchema, o as GroupEvidenceExportResultSchema, q as DeleteInspectorGroupResponseSchema, z as createPendingProviderTestResults, B as ProviderTestResultsSchema, E as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, F as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, l as AlertSummarySchema, m as AlertListResponseSchema, G as GroupEvidenceReadResponseSchema, u as maskApiKey, v as PATH_V1_MESSAGES, w as PATH_V1_CHAT_COMPLETIONS, x as PATH_V1_RESPONSES, r as providerHasContextMetadata, t as findProviderModelMetadata, f as parseOpenAIResponse, g as parseOpenAIResponsesResponse, O as OpenAIRequestSchema, h as OpenAIResponsesRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, H as resolveProviderContextWindow, j as getSessionPath, y as previewUpstreamUrl, K as KnowledgeCandidateSchema, J as isPlainRecord, k as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema } from "./router-BMdwHLHh.mjs";
|
|
3
3
|
import { u as useSWR, a as useSWRConfig } from "../_libs/swr.mjs";
|
|
4
4
|
import { J as JSZip } from "../_libs/jszip.mjs";
|
|
5
5
|
import { c as clsx } from "../_libs/clsx.mjs";
|
|
@@ -1481,7 +1481,7 @@ function resolveLogFormat(log) {
|
|
|
1481
1481
|
const pathFormat = apiFormatForPath(log.path);
|
|
1482
1482
|
return pathFormat === "unknown" ? log.apiFormat : pathFormat;
|
|
1483
1483
|
}
|
|
1484
|
-
const HEADER_ACTION_BUTTON_CLASS$1 = "
|
|
1484
|
+
const HEADER_ACTION_BUTTON_CLASS$1 = "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-foreground";
|
|
1485
1485
|
function HeaderMetric({
|
|
1486
1486
|
icon,
|
|
1487
1487
|
children,
|
|
@@ -1492,7 +1492,7 @@ function HeaderMetric({
|
|
|
1492
1492
|
"span",
|
|
1493
1493
|
{
|
|
1494
1494
|
className: cn(
|
|
1495
|
-
"
|
|
1495
|
+
"bg-white/[0.045] inline-flex h-7 min-w-0 items-center gap-1.5 rounded-md px-2 text-xs text-muted-foreground",
|
|
1496
1496
|
className
|
|
1497
1497
|
),
|
|
1498
1498
|
title,
|
|
@@ -1556,8 +1556,8 @@ function ConversationHeader({
|
|
|
1556
1556
|
"data-nav-id": `conv-${conversationId}`,
|
|
1557
1557
|
"data-nav-action": expanded ? "collapse" : "expand",
|
|
1558
1558
|
className: cn(
|
|
1559
|
-
"
|
|
1560
|
-
"hover:
|
|
1559
|
+
"bg-card/80 shadow-sm flex cursor-pointer items-start gap-3 rounded-[8px] px-3 py-2.5 transition-colors",
|
|
1560
|
+
"hover:bg-card",
|
|
1561
1561
|
"select-none",
|
|
1562
1562
|
"sticky top-0 z-10 mb-2",
|
|
1563
1563
|
"focus-visible:ring-1 focus-visible:ring-cyan-300/35 focus-visible:outline-none"
|
|
@@ -1609,7 +1609,7 @@ function ConversationHeader({
|
|
|
1609
1609
|
!isFallbackConversation && showProcessMetadata && clientPid !== null && clientPid !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1610
1610
|
"span",
|
|
1611
1611
|
{
|
|
1612
|
-
className: "
|
|
1612
|
+
className: "bg-white/[0.045] shrink-0 rounded px-1.5 py-0.5 font-mono text-xs tabular-nums text-muted-foreground",
|
|
1613
1613
|
title: `Client process ID ${clientPid}`,
|
|
1614
1614
|
children: [
|
|
1615
1615
|
"PID ",
|
|
@@ -1628,7 +1628,7 @@ function ConversationHeader({
|
|
|
1628
1628
|
showClientIdentity && clientDisplayLabel !== null && clientDisplayLabel !== "" && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1629
1629
|
"span",
|
|
1630
1630
|
{
|
|
1631
|
-
className: "
|
|
1631
|
+
className: "bg-white/[0.045] inline-flex h-6 max-w-[180px] shrink-0 items-center gap-1 rounded-md px-1.5 text-xs text-muted-foreground",
|
|
1632
1632
|
title: clientTooltip ?? clientDisplayLabel,
|
|
1633
1633
|
children: [
|
|
1634
1634
|
/* @__PURE__ */ jsxRuntimeExports.jsx(ClientLogo, { client: clientApp, className: "size-4 shrink-0" }),
|
|
@@ -1678,7 +1678,7 @@ function ConversationHeader({
|
|
|
1678
1678
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1679
1679
|
"span",
|
|
1680
1680
|
{
|
|
1681
|
-
className: "
|
|
1681
|
+
className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-8 shrink-0 items-center justify-center rounded-md text-slate-200",
|
|
1682
1682
|
"aria-hidden": "true",
|
|
1683
1683
|
children: expanded ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4 shrink-0" }) : isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-4 shrink-0 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4 shrink-0" })
|
|
1684
1684
|
}
|
|
@@ -1959,27 +1959,27 @@ function useCopyFeedback(text) {
|
|
|
1959
1959
|
return { copied, copy };
|
|
1960
1960
|
}
|
|
1961
1961
|
const LazyCompareDrawer = reactExports.lazy(
|
|
1962
|
-
() => import("./CompareDrawer-
|
|
1962
|
+
() => import("./CompareDrawer-BiSslksi.mjs").then((m) => ({ default: m.CompareDrawer }))
|
|
1963
1963
|
);
|
|
1964
1964
|
const LazyReplayDialog = reactExports.lazy(
|
|
1965
|
-
() => import("./ReplayDialog-
|
|
1965
|
+
() => import("./ReplayDialog-DzoWpTis.mjs").then((m) => ({ default: m.ReplayDialog }))
|
|
1966
1966
|
);
|
|
1967
1967
|
const LazyRequestAnatomy = reactExports.lazy(
|
|
1968
|
-
() => import("./RequestAnatomy-
|
|
1968
|
+
() => import("./RequestAnatomy-D2tbgAPn.mjs").then((m) => ({ default: m.RequestAnatomy }))
|
|
1969
1969
|
);
|
|
1970
1970
|
const LazyResponseView = reactExports.lazy(
|
|
1971
|
-
() => import("./ResponseView-
|
|
1971
|
+
() => import("./ResponseView-BFP7zo8Z.mjs").then((m) => ({ default: m.ResponseView }))
|
|
1972
1972
|
);
|
|
1973
1973
|
const LazyStreamingChunkSequence = reactExports.lazy(
|
|
1974
|
-
() => import("./StreamingChunkSequence-
|
|
1974
|
+
() => import("./StreamingChunkSequence-BfiRZW_k.mjs").then((m) => ({
|
|
1975
1975
|
default: m.StreamingChunkSequence
|
|
1976
1976
|
}))
|
|
1977
1977
|
);
|
|
1978
1978
|
const LazyJsonViewer = reactExports.lazy(
|
|
1979
|
-
() => import("./json-viewer-
|
|
1979
|
+
() => import("./json-viewer-DmhEr-jg.mjs").then((m) => ({ default: m.JsonViewer }))
|
|
1980
1980
|
);
|
|
1981
1981
|
const LazyJsonViewerFromString = reactExports.lazy(
|
|
1982
|
-
() => import("./json-viewer-
|
|
1982
|
+
() => import("./json-viewer-DmhEr-jg.mjs").then((m) => ({ default: m.JsonViewerFromString }))
|
|
1983
1983
|
);
|
|
1984
1984
|
const HIGHLIGHT_DURATION_MS = 1200;
|
|
1985
1985
|
const MAX_HIGHLIGHT_ATTEMPTS = 12;
|
|
@@ -2439,10 +2439,10 @@ function Badge({
|
|
|
2439
2439
|
);
|
|
2440
2440
|
}
|
|
2441
2441
|
const STATUS_BADGE_CLASSES = {
|
|
2442
|
-
success: "bg-slate-300/[0.08] text-slate-100 border-
|
|
2443
|
-
client_error: "bg-amber-300/[0.10] text-amber-100 border-
|
|
2444
|
-
server_error: "bg-rose-400/[0.10] text-rose-100 border-
|
|
2445
|
-
pending: "bg-cyan-300/[0.08] text-cyan-100 border-
|
|
2442
|
+
success: "bg-slate-300/[0.08] text-slate-100 border-transparent",
|
|
2443
|
+
client_error: "bg-amber-300/[0.10] text-amber-100 border-transparent",
|
|
2444
|
+
server_error: "bg-rose-400/[0.10] text-rose-100 border-transparent",
|
|
2445
|
+
pending: "bg-cyan-300/[0.08] text-cyan-100 border-transparent"
|
|
2446
2446
|
};
|
|
2447
2447
|
const STATUS_CUE_CLASSES = {
|
|
2448
2448
|
success: {
|
|
@@ -2462,8 +2462,8 @@ const STATUS_CUE_CLASSES = {
|
|
|
2462
2462
|
dot: "bg-cyan-200 shadow-[0_0_14px_rgba(103,232,249,0.8)]"
|
|
2463
2463
|
}
|
|
2464
2464
|
};
|
|
2465
|
-
const HEADER_ACTION_BUTTON_CLASS = "border border-
|
|
2466
|
-
const TELEMETRY_CHIP_CLASS = "
|
|
2465
|
+
const HEADER_ACTION_BUTTON_CLASS = "border border-transparent bg-white/[0.045] hover:bg-white/[0.075] size-8 text-muted-foreground shadow-none hover:text-cyan-100";
|
|
2466
|
+
const TELEMETRY_CHIP_CLASS = "bg-white/[0.045] flex h-7 items-center gap-1 rounded-md px-2 text-xs";
|
|
2467
2467
|
function formatElapsed$3(ms) {
|
|
2468
2468
|
if (ms < 1e3) return `${ms}ms`;
|
|
2469
2469
|
return `${(ms / 1e3).toFixed(1)}s`;
|
|
@@ -2537,8 +2537,8 @@ const LogEntryHeader = reactExports.memo(function({
|
|
|
2537
2537
|
"data-nav-action": expanded ? "collapse" : "expand",
|
|
2538
2538
|
className: cn(
|
|
2539
2539
|
"group/header relative isolate flex min-w-0 cursor-pointer items-start gap-2 overflow-hidden px-3 py-2 transition-[background-color,border-color,box-shadow]",
|
|
2540
|
-
expanded ? "bg-white/[0.
|
|
2541
|
-
"select-none
|
|
2540
|
+
expanded ? "bg-white/[0.04]" : "bg-transparent hover:bg-white/[0.035]",
|
|
2541
|
+
"select-none",
|
|
2542
2542
|
"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none"
|
|
2543
2543
|
),
|
|
2544
2544
|
onClick: onToggle,
|
|
@@ -2554,7 +2554,7 @@ const LogEntryHeader = reactExports.memo(function({
|
|
|
2554
2554
|
"span",
|
|
2555
2555
|
{
|
|
2556
2556
|
className: cn(
|
|
2557
|
-
"
|
|
2557
|
+
"inline-flex h-8 shrink-0 items-center gap-2 rounded-md px-2 font-mono",
|
|
2558
2558
|
statusCue.frame
|
|
2559
2559
|
),
|
|
2560
2560
|
children: [
|
|
@@ -2566,7 +2566,7 @@ const LogEntryHeader = reactExports.memo(function({
|
|
|
2566
2566
|
]
|
|
2567
2567
|
}
|
|
2568
2568
|
),
|
|
2569
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "
|
|
2569
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "bg-white/[0.045] flex h-7 shrink-0 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground", children: [
|
|
2570
2570
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
|
|
2571
2571
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", title: log.timestamp, children: formatTimestamp$2(log.timestamp, timeDisplayFormat) })
|
|
2572
2572
|
] }),
|
|
@@ -2823,7 +2823,7 @@ const LogEntryHeader = reactExports.memo(function({
|
|
|
2823
2823
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
2824
2824
|
"span",
|
|
2825
2825
|
{
|
|
2826
|
-
className: "
|
|
2826
|
+
className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-8 shrink-0 items-center justify-center rounded-md text-slate-200",
|
|
2827
2827
|
"aria-hidden": "true",
|
|
2828
2828
|
children: expanded ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4 shrink-0" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4 shrink-0" })
|
|
2829
2829
|
}
|
|
@@ -2911,13 +2911,13 @@ const CATEGORY_LABELS = {
|
|
|
2911
2911
|
other: "other"
|
|
2912
2912
|
};
|
|
2913
2913
|
const CATEGORY_CLASSES = {
|
|
2914
|
-
file: "border-
|
|
2915
|
-
shell: "border-
|
|
2916
|
-
browser: "border-
|
|
2917
|
-
web: "border-
|
|
2918
|
-
mcp: "border-
|
|
2919
|
-
code: "border-
|
|
2920
|
-
other: "border-
|
|
2914
|
+
file: "border-transparent bg-blue-400/5 text-blue-300",
|
|
2915
|
+
shell: "border-transparent bg-teal-400/5 text-teal-300",
|
|
2916
|
+
browser: "border-transparent bg-cyan-400/5 text-cyan-300",
|
|
2917
|
+
web: "border-transparent bg-sky-400/5 text-sky-300",
|
|
2918
|
+
mcp: "border-transparent bg-violet-400/5 text-violet-300",
|
|
2919
|
+
code: "border-transparent bg-emerald-400/5 text-emerald-300",
|
|
2920
|
+
other: "border-transparent bg-muted/30 text-muted-foreground"
|
|
2921
2921
|
};
|
|
2922
2922
|
function CategoryIcon({ category }) {
|
|
2923
2923
|
switch (category) {
|
|
@@ -2960,7 +2960,7 @@ function ToolRow({ tool, called }) {
|
|
|
2960
2960
|
const [open, setOpen] = reactExports.useState(false);
|
|
2961
2961
|
const nameCopy = useCopyFeedback(tool.name);
|
|
2962
2962
|
const hasDetails = tool.description !== null || tool.requiredParameters.length > 0 || tool.schema !== null;
|
|
2963
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "
|
|
2963
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/[0.035] rounded-[8px]", children: [
|
|
2964
2964
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2 px-2.5 py-2", children: [
|
|
2965
2965
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
2966
2966
|
"button",
|
|
@@ -2995,17 +2995,17 @@ function ToolRow({ tool, called }) {
|
|
|
2995
2995
|
"button",
|
|
2996
2996
|
{
|
|
2997
2997
|
type: "button",
|
|
2998
|
-
className: "
|
|
2998
|
+
className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
2999
2999
|
onClick: nameCopy.copy,
|
|
3000
3000
|
"aria-label": nameCopy.copied ? "Copied tool name" : "Copy tool name",
|
|
3001
3001
|
children: nameCopy.copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3.5 text-emerald-400" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3.5" })
|
|
3002
3002
|
}
|
|
3003
3003
|
)
|
|
3004
3004
|
] }),
|
|
3005
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: open && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2
|
|
3005
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: open && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 bg-white/[0.025] px-2.5 py-2", children: [
|
|
3006
3006
|
tool.description !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: tool.description }),
|
|
3007
3007
|
/* @__PURE__ */ jsxRuntimeExports.jsx(RequiredParameters, { names: tool.requiredParameters }),
|
|
3008
|
-
tool.schema !== null && /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "
|
|
3008
|
+
tool.schema !== null && /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "bg-black/[0.16] max-h-64 rounded-[8px] p-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
3009
3009
|
reactExports.Suspense,
|
|
3010
3010
|
{
|
|
3011
3011
|
fallback: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: "Loading JSON..." }),
|
|
@@ -3035,7 +3035,7 @@ const RequestTools = reactExports.memo(function RequestTools2({
|
|
|
3035
3035
|
if (summary === null) return null;
|
|
3036
3036
|
const previewTools = summary.tools.slice(0, 6);
|
|
3037
3037
|
const hiddenPreviewCount = summary.tools.length - previewTools.length;
|
|
3038
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "
|
|
3038
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "bg-black/[0.10] mb-3 overflow-hidden rounded-[8px]", children: [
|
|
3039
3039
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-2 px-3 py-2", children: [
|
|
3040
3040
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
|
|
3041
3041
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Wrench, { className: "size-4 shrink-0 text-sky-300/80" }),
|
|
@@ -3089,7 +3089,7 @@ const RequestTools = reactExports.memo(function RequestTools2({
|
|
|
3089
3089
|
}
|
|
3090
3090
|
)
|
|
3091
3091
|
] }),
|
|
3092
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap gap-1.5
|
|
3092
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap gap-1.5 bg-white/[0.025] px-3 py-2", children: [
|
|
3093
3093
|
previewTools.map((tool) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
3094
3094
|
Badge,
|
|
3095
3095
|
{
|
|
@@ -3107,8 +3107,8 @@ const RequestTools = reactExports.memo(function RequestTools2({
|
|
|
3107
3107
|
hiddenPreviewCount
|
|
3108
3108
|
] })
|
|
3109
3109
|
] }),
|
|
3110
|
-
expanded && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2
|
|
3111
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "
|
|
3110
|
+
expanded && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 bg-black/10 px-3 py-3", children: [
|
|
3111
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "bg-white/[0.045] hover:bg-white/[0.075] flex h-8 items-center gap-2 rounded-md px-2 text-xs", children: [
|
|
3112
3112
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "size-3.5 shrink-0 text-muted-foreground" }),
|
|
3113
3113
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
3114
3114
|
"input",
|
|
@@ -3313,7 +3313,7 @@ const FULL_LOG_HYDRATION_TIMEOUT_MS = 15e3;
|
|
|
3313
3313
|
const BODY_CHUNK_TIMEOUT_MS = 15e3;
|
|
3314
3314
|
const BODY_CHUNK_BYTES = 256 * 1024;
|
|
3315
3315
|
const CHUNKED_BODY_THRESHOLD_BYTES = 1024 * 1024;
|
|
3316
|
-
const TAB_TRIGGER_CLASS = "h-9 flex-none rounded-md border border-transparent bg-transparent px-3 text-xs font-semibold text-muted-foreground shadow-none transition-colors hover:
|
|
3316
|
+
const TAB_TRIGGER_CLASS = "h-9 flex-none rounded-md border border-transparent bg-transparent px-3 text-xs font-semibold text-muted-foreground shadow-none transition-colors hover:bg-white/[0.045] hover:text-foreground data-[state=active]:bg-cyan-300/[0.08] data-[state=active]:text-cyan-100 data-[state=active]:shadow-none";
|
|
3317
3317
|
function createEmptyBodyPreviewState(totalBytes = null) {
|
|
3318
3318
|
return {
|
|
3319
3319
|
status: "idle",
|
|
@@ -3395,7 +3395,7 @@ function ExpandedPanel({
|
|
|
3395
3395
|
"div",
|
|
3396
3396
|
{
|
|
3397
3397
|
className: cn(
|
|
3398
|
-
"
|
|
3398
|
+
"bg-black/[0.14] inspector-scrollbar mx-3 mb-3 max-h-[72vh] overflow-auto rounded-[8px] p-3",
|
|
3399
3399
|
className
|
|
3400
3400
|
),
|
|
3401
3401
|
children
|
|
@@ -3403,15 +3403,15 @@ function ExpandedPanel({
|
|
|
3403
3403
|
);
|
|
3404
3404
|
}
|
|
3405
3405
|
function EmptyState({ children }) {
|
|
3406
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "
|
|
3406
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white/[0.035] rounded-md px-3 py-5 text-center text-xs italic text-muted-foreground", children });
|
|
3407
3407
|
}
|
|
3408
3408
|
function RawTextBlock({ children }) {
|
|
3409
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "
|
|
3409
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "bg-black/[0.18] inspector-scrollbar max-h-[64vh] overflow-auto whitespace-pre-wrap break-words rounded-[8px] p-3 font-mono text-xs leading-relaxed text-muted-foreground", children });
|
|
3410
3410
|
}
|
|
3411
3411
|
const NOTICE_TONE_CLASSES = {
|
|
3412
|
-
loading: "border-
|
|
3413
|
-
warning: "border-
|
|
3414
|
-
danger: "border-
|
|
3412
|
+
loading: "border-transparent bg-cyan-400/[0.06] text-cyan-100",
|
|
3413
|
+
warning: "border-transparent bg-amber-400/[0.08] text-amber-100",
|
|
3414
|
+
danger: "border-transparent bg-rose-400/[0.08] text-rose-100"
|
|
3415
3415
|
};
|
|
3416
3416
|
function NoticeBlock({
|
|
3417
3417
|
tone,
|
|
@@ -3473,12 +3473,12 @@ function HeaderRows({
|
|
|
3473
3473
|
}) {
|
|
3474
3474
|
const entries = headers === void 0 ? [] : Object.entries(headers).sort(([left], [right]) => left.localeCompare(right));
|
|
3475
3475
|
if (entries.length === 0) return /* @__PURE__ */ jsxRuntimeExports.jsx(EmptyState, { children: emptyLabel });
|
|
3476
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "
|
|
3476
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-black/[0.14] overflow-hidden rounded-[8px] font-mono text-xs", children: entries.map(([key, value]) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
3477
3477
|
"div",
|
|
3478
3478
|
{
|
|
3479
|
-
className: "grid min-w-0 grid-cols-[minmax(140px,0.32fr)_minmax(0,1fr)] border-b border-white/
|
|
3479
|
+
className: "grid min-w-0 grid-cols-[minmax(140px,0.32fr)_minmax(0,1fr)] border-b border-white/[0.055] last:border-b-0",
|
|
3480
3480
|
children: [
|
|
3481
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 truncate
|
|
3481
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 truncate bg-white/[0.035] px-2.5 py-2 font-semibold text-cyan-200", children: key }),
|
|
3482
3482
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 truncate px-2.5 py-2 text-muted-foreground", title: value, children: value })
|
|
3483
3483
|
]
|
|
3484
3484
|
},
|
|
@@ -3854,27 +3854,10 @@ const LogEntry = reactExports.memo(function({
|
|
|
3854
3854
|
"div",
|
|
3855
3855
|
{
|
|
3856
3856
|
className: cn(
|
|
3857
|
-
"
|
|
3858
|
-
expanded ? "
|
|
3857
|
+
"bg-card/80 relative mb-1.5 overflow-hidden rounded-[8px] transition-[background-color,box-shadow]",
|
|
3858
|
+
expanded ? "bg-card shadow-[0_18px_60px_rgba(0,0,0,0.30),0_0_0_1px_rgba(103,232,249,0.08)]" : "hover:bg-card"
|
|
3859
3859
|
),
|
|
3860
3860
|
children: [
|
|
3861
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
3862
|
-
"div",
|
|
3863
|
-
{
|
|
3864
|
-
className: cn(
|
|
3865
|
-
"pointer-events-none absolute inset-y-3 left-1 w-px rounded-full",
|
|
3866
|
-
expanded ? "bg-cyan-200/55 shadow-[0_0_20px_rgba(103,232,249,0.26)]" : "bg-white/12"
|
|
3867
|
-
),
|
|
3868
|
-
"aria-hidden": "true"
|
|
3869
|
-
}
|
|
3870
|
-
),
|
|
3871
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
3872
|
-
"div",
|
|
3873
|
-
{
|
|
3874
|
-
className: "pointer-events-none absolute inset-x-3 top-0 h-px bg-gradient-to-r from-transparent via-white/15 to-transparent",
|
|
3875
|
-
"aria-hidden": "true"
|
|
3876
|
-
}
|
|
3877
|
-
),
|
|
3878
3861
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
3879
3862
|
LogEntryHeader,
|
|
3880
3863
|
{
|
|
@@ -3898,7 +3881,7 @@ const LogEntry = reactExports.memo(function({
|
|
|
3898
3881
|
expanded && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
3899
3882
|
"div",
|
|
3900
3883
|
{
|
|
3901
|
-
className: "relative
|
|
3884
|
+
className: "relative bg-black/[0.14] pt-2",
|
|
3902
3885
|
onClick: (e) => e.stopPropagation(),
|
|
3903
3886
|
onKeyDown: (e) => e.stopPropagation(),
|
|
3904
3887
|
children: [
|
|
@@ -3914,7 +3897,7 @@ const LogEntry = reactExports.memo(function({
|
|
|
3914
3897
|
TabsList,
|
|
3915
3898
|
{
|
|
3916
3899
|
variant: "line",
|
|
3917
|
-
className: "
|
|
3900
|
+
className: "bg-white/[0.04] inspector-scrollbar relative mx-3 h-auto w-[calc(100%-1.5rem)] justify-start overflow-x-auto rounded-[8px] p-1",
|
|
3918
3901
|
children: [
|
|
3919
3902
|
viewMode === "full" && /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { className: TAB_TRIGGER_CLASS, value: "raw-headers", children: "Raw Headers" }),
|
|
3920
3903
|
viewMode === "full" && /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { className: TAB_TRIGGER_CLASS, value: "headers", children: "Headers" }),
|
|
@@ -4530,7 +4513,7 @@ function ThreadConnector({
|
|
|
4530
4513
|
onToggle();
|
|
4531
4514
|
};
|
|
4532
4515
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center w-6 shrink-0 pt-0.5 pb-0.5", children: [
|
|
4533
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center h-[calc(0.75rem-8px)]", children: !isFirst && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-
|
|
4516
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center h-[calc(0.75rem-8px)]", children: !isFirst && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px bg-muted-foreground/18 h-full" }) }),
|
|
4534
4517
|
isFusedBoundary ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4535
4518
|
"span",
|
|
4536
4519
|
{
|
|
@@ -4597,7 +4580,7 @@ function ThreadConnector({
|
|
|
4597
4580
|
{
|
|
4598
4581
|
className: cn(
|
|
4599
4582
|
"w-0.5 h-full",
|
|
4600
|
-
isPending ? "border-dashed bg-transparent border-l
|
|
4583
|
+
isPending ? "border-dashed bg-transparent border-l border-muted-foreground/14" : "bg-muted-foreground/18"
|
|
4601
4584
|
)
|
|
4602
4585
|
}
|
|
4603
4586
|
) })
|
|
@@ -4609,7 +4592,7 @@ function ToolTraceEventRow({ event }) {
|
|
|
4609
4592
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
4610
4593
|
"div",
|
|
4611
4594
|
{
|
|
4612
|
-
className: "group/tool-trace flex min-w-0 items-center gap-2 rounded-md
|
|
4595
|
+
className: "group/tool-trace flex min-w-0 items-center gap-2 rounded-md bg-white/[0.035] px-2.5 py-1.5 text-xs",
|
|
4613
4596
|
children: [
|
|
4614
4597
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Wrench, { className: "size-3.5 shrink-0 text-sky-400/70" }),
|
|
4615
4598
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono font-semibold text-foreground/80", children: event.name }),
|
|
@@ -4952,7 +4935,7 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
|
|
|
4952
4935
|
maxElapsed
|
|
4953
4936
|
};
|
|
4954
4937
|
}, [entries, lastIdx]);
|
|
4955
|
-
const bgClass = turnIndex % 2 === 0 ? "bg-white/[0.
|
|
4938
|
+
const bgClass = turnIndex % 2 === 0 ? "bg-white/[0.008]" : "bg-cyan-300/[0.008]";
|
|
4956
4939
|
const aggregateIsSlow = aggregate.maxElapsed !== null && slowResponseThresholdSeconds > 0 && aggregate.maxElapsed > slowResponseThresholdSeconds * 1e3;
|
|
4957
4940
|
const toolEventsByLogId = reactExports.useMemo(() => {
|
|
4958
4941
|
const events = /* @__PURE__ */ new Map();
|
|
@@ -4997,8 +4980,8 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
|
|
|
4997
4980
|
"aria-label": collapsed ? void 0 : turnLabel,
|
|
4998
4981
|
"data-nav-id": collapsed ? void 0 : `turn-${String(firstLogId)}`,
|
|
4999
4982
|
className: cn(
|
|
5000
|
-
"rounded-[8px]
|
|
5001
|
-
isPending ? "
|
|
4983
|
+
"rounded-[8px] transition-[background-color,box-shadow]",
|
|
4984
|
+
isPending ? "bg-amber-300/[0.018] shadow-[0_0_0_1px_rgba(252,211,77,0.035)]" : "",
|
|
5002
4985
|
!collapsed && "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none"
|
|
5003
4986
|
),
|
|
5004
4987
|
children: collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
@@ -5020,14 +5003,14 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
|
|
|
5020
5003
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-5 shrink-0 flex items-start pt-1.5", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] text-muted-foreground/50 font-mono tabular-nums leading-none select-none", children: turnIndex + 1 }) }),
|
|
5021
5004
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-6 shrink-0 flex flex-col items-center pt-1.5 pb-1.5", children: [
|
|
5022
5005
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center h-[calc(0.75rem-8px)]" }),
|
|
5023
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 rounded-full
|
|
5024
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex justify-center min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px bg-muted-foreground/
|
|
5006
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 rounded-full bg-cyan-300/45" }),
|
|
5007
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex justify-center min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px bg-muted-foreground/14 h-full" }) }),
|
|
5025
5008
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
5026
5009
|
"span",
|
|
5027
5010
|
{
|
|
5028
5011
|
className: cn(
|
|
5029
|
-
"size-2 rounded-full
|
|
5030
|
-
isComplete ? "
|
|
5012
|
+
"size-2 rounded-full",
|
|
5013
|
+
isComplete ? "bg-amber-300/45" : "bg-muted-foreground/25"
|
|
5031
5014
|
)
|
|
5032
5015
|
}
|
|
5033
5016
|
)
|
|
@@ -5036,8 +5019,8 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
|
|
|
5036
5019
|
"div",
|
|
5037
5020
|
{
|
|
5038
5021
|
className: cn(
|
|
5039
|
-
"flex-1 min-w-0 mb-0.5 rounded-[8px] py-1.5 px-3 flex items-center gap-3 text-xs
|
|
5040
|
-
"
|
|
5022
|
+
"flex-1 min-w-0 mb-0.5 rounded-[8px] py-1.5 px-3 flex items-center gap-3 text-xs",
|
|
5023
|
+
"bg-card/80 transition-colors hover:bg-card",
|
|
5041
5024
|
bgClass
|
|
5042
5025
|
),
|
|
5043
5026
|
children: [
|
|
@@ -5099,7 +5082,7 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
|
|
|
5099
5082
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
5100
5083
|
"span",
|
|
5101
5084
|
{
|
|
5102
|
-
className: "
|
|
5085
|
+
className: "bg-white/[0.045] inline-flex size-7 shrink-0 items-center justify-center rounded-md text-slate-200",
|
|
5103
5086
|
"aria-hidden": "true",
|
|
5104
5087
|
children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4 shrink-0" })
|
|
5105
5088
|
}
|
|
@@ -6872,10 +6855,86 @@ function useGroups() {
|
|
|
6872
6855
|
mutate: response.mutate
|
|
6873
6856
|
};
|
|
6874
6857
|
}
|
|
6858
|
+
const TRANSIENT_TOAST_AUTO_DISMISS_MS = 3e3;
|
|
6859
|
+
function createNextTransientToast(previous, input) {
|
|
6860
|
+
return {
|
|
6861
|
+
id: (previous?.id ?? 0) + 1,
|
|
6862
|
+
message: input.message,
|
|
6863
|
+
tone: input.tone ?? "error"
|
|
6864
|
+
};
|
|
6865
|
+
}
|
|
6866
|
+
function useTransientToast() {
|
|
6867
|
+
const [notice, setNotice] = reactExports.useState(null);
|
|
6868
|
+
const showToast = reactExports.useCallback((input) => {
|
|
6869
|
+
setNotice((previous) => createNextTransientToast(previous, input));
|
|
6870
|
+
}, []);
|
|
6871
|
+
const dismissToast = reactExports.useCallback(() => {
|
|
6872
|
+
setNotice(null);
|
|
6873
|
+
}, []);
|
|
6874
|
+
reactExports.useEffect(() => {
|
|
6875
|
+
if (notice === null) return void 0;
|
|
6876
|
+
const timeout = window.setTimeout(() => {
|
|
6877
|
+
setNotice(null);
|
|
6878
|
+
}, TRANSIENT_TOAST_AUTO_DISMISS_MS);
|
|
6879
|
+
return () => {
|
|
6880
|
+
window.clearTimeout(timeout);
|
|
6881
|
+
};
|
|
6882
|
+
}, [notice]);
|
|
6883
|
+
return { notice, showToast, dismissToast };
|
|
6884
|
+
}
|
|
6885
|
+
function TransientToast({
|
|
6886
|
+
notice,
|
|
6887
|
+
onDismiss
|
|
6888
|
+
}) {
|
|
6889
|
+
if (notice === null) return null;
|
|
6890
|
+
const isError = notice.tone === "error";
|
|
6891
|
+
const Icon2 = isError ? TriangleAlert : CircleCheck;
|
|
6892
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
6893
|
+
"div",
|
|
6894
|
+
{
|
|
6895
|
+
"aria-atomic": "true",
|
|
6896
|
+
"aria-live": "polite",
|
|
6897
|
+
className: "pointer-events-none fixed top-4 right-4 z-[100] w-[min(calc(100vw-2rem),26rem)]",
|
|
6898
|
+
role: "status",
|
|
6899
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
6900
|
+
"div",
|
|
6901
|
+
{
|
|
6902
|
+
className: cn(
|
|
6903
|
+
"pointer-events-auto flex items-start gap-2 rounded-md border px-3 py-2 text-sm shadow-[0_18px_50px_rgba(0,0,0,0.45)] backdrop-blur",
|
|
6904
|
+
isError ? "border-red-400/30 bg-[#16090b]/95 text-red-100" : "border-cyan-300/25 bg-[#071318]/95 text-cyan-100"
|
|
6905
|
+
),
|
|
6906
|
+
children: [
|
|
6907
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
6908
|
+
Icon2,
|
|
6909
|
+
{
|
|
6910
|
+
className: cn("mt-0.5 size-4 shrink-0", isError ? "text-red-300" : "text-cyan-200")
|
|
6911
|
+
}
|
|
6912
|
+
),
|
|
6913
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 flex-1 break-words leading-5", children: notice.message }),
|
|
6914
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
6915
|
+
"button",
|
|
6916
|
+
{
|
|
6917
|
+
type: "button",
|
|
6918
|
+
className: "inline-flex size-6 shrink-0 items-center justify-center rounded-md text-current/70 transition-colors hover:bg-white/10 hover:text-current",
|
|
6919
|
+
"aria-label": "Dismiss notification",
|
|
6920
|
+
onClick: onDismiss,
|
|
6921
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "size-3.5" })
|
|
6922
|
+
}
|
|
6923
|
+
)
|
|
6924
|
+
]
|
|
6925
|
+
},
|
|
6926
|
+
notice.id
|
|
6927
|
+
)
|
|
6928
|
+
}
|
|
6929
|
+
);
|
|
6930
|
+
}
|
|
6875
6931
|
function groupDeletePath(groupId, deleteEvidence) {
|
|
6876
6932
|
const path = `/api/groups/${encodeURIComponent(groupId)}`;
|
|
6877
6933
|
return deleteEvidence ? `${path}?deleteEvidence=1` : path;
|
|
6878
6934
|
}
|
|
6935
|
+
function groupsClearPath(deleteEvidence) {
|
|
6936
|
+
return "/api/groups";
|
|
6937
|
+
}
|
|
6879
6938
|
function summarizeGroup(group) {
|
|
6880
6939
|
let completedMembers = 0;
|
|
6881
6940
|
let failedMembers = 0;
|
|
@@ -7058,6 +7117,8 @@ function GroupsDialog() {
|
|
|
7058
7117
|
const [deleteEvidence, setDeleteEvidence] = reactExports.useState(false);
|
|
7059
7118
|
const [deletingGroupId, setDeletingGroupId] = reactExports.useState(null);
|
|
7060
7119
|
const [deleteError, setDeleteError] = reactExports.useState(null);
|
|
7120
|
+
const [clearingGroups, setClearingGroups] = reactExports.useState(false);
|
|
7121
|
+
const { notice, showToast, dismissToast } = useTransientToast();
|
|
7061
7122
|
const { groups, isLoading, error, mutate } = useGroups();
|
|
7062
7123
|
const selectedGroup = reactExports.useMemo(
|
|
7063
7124
|
() => selectedGroupFrom(groups, selectedGroupId),
|
|
@@ -7079,6 +7140,43 @@ function GroupsDialog() {
|
|
|
7079
7140
|
const handleRefresh = reactExports.useCallback(() => {
|
|
7080
7141
|
void mutate();
|
|
7081
7142
|
}, [mutate]);
|
|
7143
|
+
const handleClearGroups = reactExports.useCallback(async () => {
|
|
7144
|
+
if (groups.length === 0 || clearingGroups) return;
|
|
7145
|
+
setClearingGroups(true);
|
|
7146
|
+
setDeleteTarget(null);
|
|
7147
|
+
setDeleteEvidence(false);
|
|
7148
|
+
setDeleteError(null);
|
|
7149
|
+
setExportError(null);
|
|
7150
|
+
try {
|
|
7151
|
+
const response = await fetch(groupsClearPath(false), { method: "DELETE" });
|
|
7152
|
+
if (!response.ok) {
|
|
7153
|
+
showToast({
|
|
7154
|
+
message: await readApiError(
|
|
7155
|
+
response,
|
|
7156
|
+
`Clear failed with status ${String(response.status)}`
|
|
7157
|
+
),
|
|
7158
|
+
tone: "error"
|
|
7159
|
+
});
|
|
7160
|
+
return;
|
|
7161
|
+
}
|
|
7162
|
+
const parsed = await parseJsonResponse$1(response, DeleteInspectorGroupsResponseSchema);
|
|
7163
|
+
setExportResult(null);
|
|
7164
|
+
setSelectedGroupId(null);
|
|
7165
|
+
await mutate();
|
|
7166
|
+
await mutateEvidence();
|
|
7167
|
+
showToast({
|
|
7168
|
+
message: `Cleared ${formatNumber(parsed.deleted)} group${parsed.deleted === 1 ? "" : "s"}.`,
|
|
7169
|
+
tone: "success"
|
|
7170
|
+
});
|
|
7171
|
+
} catch (err) {
|
|
7172
|
+
showToast({
|
|
7173
|
+
message: err instanceof Error ? err.message : "Unknown error clearing groups",
|
|
7174
|
+
tone: "error"
|
|
7175
|
+
});
|
|
7176
|
+
} finally {
|
|
7177
|
+
setClearingGroups(false);
|
|
7178
|
+
}
|
|
7179
|
+
}, [clearingGroups, groups.length, mutate, mutateEvidence, showToast]);
|
|
7082
7180
|
const handleExport = reactExports.useCallback(
|
|
7083
7181
|
async (group) => {
|
|
7084
7182
|
setExportingGroupId(group.id);
|
|
@@ -7155,6 +7253,7 @@ function GroupsDialog() {
|
|
|
7155
7253
|
}
|
|
7156
7254
|
}, [deleteEvidence, deleteTarget, mutate, mutateEvidence]);
|
|
7157
7255
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs(Dialog, { open, onOpenChange: setOpen, children: [
|
|
7256
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(TransientToast, { notice, onDismiss: dismissToast }),
|
|
7158
7257
|
/* @__PURE__ */ jsxRuntimeExports.jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
7159
7258
|
Button,
|
|
7160
7259
|
{
|
|
@@ -7179,20 +7278,27 @@ function GroupsDialog() {
|
|
|
7179
7278
|
] }) }),
|
|
7180
7279
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-h-0 items-center justify-between gap-3 border-b border-border pb-3", children: [
|
|
7181
7280
|
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Evaluation batches, model runs, and exported evidence packs." }),
|
|
7182
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
7183
|
-
|
|
7184
|
-
|
|
7185
|
-
|
|
7186
|
-
|
|
7187
|
-
|
|
7188
|
-
|
|
7189
|
-
|
|
7190
|
-
|
|
7191
|
-
|
|
7192
|
-
|
|
7193
|
-
|
|
7194
|
-
|
|
7195
|
-
|
|
7281
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
7282
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
7283
|
+
Button,
|
|
7284
|
+
{
|
|
7285
|
+
type: "button",
|
|
7286
|
+
variant: "outline",
|
|
7287
|
+
size: "sm",
|
|
7288
|
+
disabled: groups.length === 0 || clearingGroups,
|
|
7289
|
+
onClick: () => void handleClearGroups(),
|
|
7290
|
+
title: "Clear all groups. Session logs and run records stay intact.",
|
|
7291
|
+
children: [
|
|
7292
|
+
clearingGroups ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5" }),
|
|
7293
|
+
"Clear"
|
|
7294
|
+
]
|
|
7295
|
+
}
|
|
7296
|
+
),
|
|
7297
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: handleRefresh, children: [
|
|
7298
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
|
|
7299
|
+
"Refresh"
|
|
7300
|
+
] })
|
|
7301
|
+
] })
|
|
7196
7302
|
] }),
|
|
7197
7303
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid min-h-0 flex-1 gap-4 md:grid-cols-[260px_minmax(0,1fr)]", children: [
|
|
7198
7304
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
@@ -11029,7 +11135,7 @@ function SummaryChip({
|
|
|
11029
11135
|
"span",
|
|
11030
11136
|
{
|
|
11031
11137
|
className: cn(
|
|
11032
|
-
"
|
|
11138
|
+
"bg-white/[0.045] inline-flex h-7 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground",
|
|
11033
11139
|
className
|
|
11034
11140
|
),
|
|
11035
11141
|
children: [
|
|
@@ -11097,7 +11203,7 @@ function IdeGroupSection({
|
|
|
11097
11203
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
11098
11204
|
"section",
|
|
11099
11205
|
{
|
|
11100
|
-
className: cn("
|
|
11206
|
+
className: cn("bg-card/75 shadow-sm relative isolate rounded-[8px]"),
|
|
11101
11207
|
"data-ide-group": group.id,
|
|
11102
11208
|
children: [
|
|
11103
11209
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
@@ -11108,7 +11214,7 @@ function IdeGroupSection({
|
|
|
11108
11214
|
onClick: onToggleIde,
|
|
11109
11215
|
"aria-expanded": !collapsed,
|
|
11110
11216
|
children: [
|
|
11111
|
-
group.client === "unknown" ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "
|
|
11217
|
+
group.client === "unknown" ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-white/[0.045] inline-flex size-10 shrink-0 items-center justify-center rounded-[8px] text-slate-200", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Monitor, { className: "size-5" }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ClientLogo, { client: group.client, className: "size-10 rounded-[8px] text-cyan-100" }),
|
|
11112
11218
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "min-w-0 flex-1", children: [
|
|
11113
11219
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [
|
|
11114
11220
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
@@ -11119,7 +11225,7 @@ function IdeGroupSection({
|
|
|
11119
11225
|
children: group.label
|
|
11120
11226
|
}
|
|
11121
11227
|
),
|
|
11122
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded
|
|
11228
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded bg-cyan-300/[0.06] px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-[0.16em] text-cyan-100/75", children: "IDE" })
|
|
11123
11229
|
] }),
|
|
11124
11230
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
|
|
11125
11231
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
|
|
@@ -11143,11 +11249,11 @@ function IdeGroupSection({
|
|
|
11143
11249
|
/* @__PURE__ */ jsxRuntimeExports.jsx(SummaryChip, { label: "IN", value: formatTokenCount(totals.inputTokens) }),
|
|
11144
11250
|
/* @__PURE__ */ jsxRuntimeExports.jsx(SummaryChip, { label: "OUT", value: formatTokenCount(totals.outputTokens) })
|
|
11145
11251
|
] }),
|
|
11146
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "
|
|
11252
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-8 shrink-0 items-center justify-center rounded-md text-slate-200", children: collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4" }) })
|
|
11147
11253
|
]
|
|
11148
11254
|
}
|
|
11149
11255
|
),
|
|
11150
|
-
!collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3
|
|
11256
|
+
!collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3 px-3 pb-3 pt-2 sm:px-4", children: group.processes.map((processGroup) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
11151
11257
|
ProcessGroupSection,
|
|
11152
11258
|
{
|
|
11153
11259
|
group: processGroup,
|
|
@@ -11173,8 +11279,8 @@ function ProcessGroupSection({
|
|
|
11173
11279
|
const logCount = group.logs.length;
|
|
11174
11280
|
const processLabel = group.clientPid !== null && group.clientPid !== void 0 ? `PID ${group.clientPid}` : "process";
|
|
11175
11281
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "relative pl-5", children: [
|
|
11176
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute bottom-
|
|
11177
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "
|
|
11282
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute bottom-1 left-2 top-1 w-px bg-white/[0.055]", "aria-hidden": "true" }),
|
|
11283
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-black/[0.10] overflow-hidden rounded-[8px]", children: [
|
|
11178
11284
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
11179
11285
|
"button",
|
|
11180
11286
|
{
|
|
@@ -11183,7 +11289,7 @@ function ProcessGroupSection({
|
|
|
11183
11289
|
onClick: onToggle,
|
|
11184
11290
|
"aria-expanded": !collapsed,
|
|
11185
11291
|
children: [
|
|
11186
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "
|
|
11292
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-white/[0.045] inline-flex size-8 shrink-0 items-center justify-center rounded-md text-amber-100", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Cpu, { className: "size-4" }) }),
|
|
11187
11293
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "min-w-0 flex-1", children: [
|
|
11188
11294
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1", children: [
|
|
11189
11295
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-xs font-semibold tabular-nums text-slate-100", children: processLabel }),
|
|
@@ -11216,11 +11322,11 @@ function ProcessGroupSection({
|
|
|
11216
11322
|
/* @__PURE__ */ jsxRuntimeExports.jsx(SummaryChip, { label: "IN", value: formatTokenCount(totals.inputTokens) }),
|
|
11217
11323
|
/* @__PURE__ */ jsxRuntimeExports.jsx(SummaryChip, { label: "OUT", value: formatTokenCount(totals.outputTokens) })
|
|
11218
11324
|
] }),
|
|
11219
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "
|
|
11325
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-7 shrink-0 items-center justify-center rounded-md text-slate-200", children: collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4" }) })
|
|
11220
11326
|
]
|
|
11221
11327
|
}
|
|
11222
11328
|
),
|
|
11223
|
-
!collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2
|
|
11329
|
+
!collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2 p-2 pt-1 sm:p-3 sm:pt-2", children: group.sessions.map((session) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
11224
11330
|
ConversationGroup,
|
|
11225
11331
|
{
|
|
11226
11332
|
group: session,
|
|
@@ -13886,79 +13992,6 @@ function ProxyViewer({
|
|
|
13886
13992
|
) })
|
|
13887
13993
|
] });
|
|
13888
13994
|
}
|
|
13889
|
-
const TRANSIENT_TOAST_AUTO_DISMISS_MS = 3e3;
|
|
13890
|
-
function createNextTransientToast(previous, input) {
|
|
13891
|
-
return {
|
|
13892
|
-
id: (previous?.id ?? 0) + 1,
|
|
13893
|
-
message: input.message,
|
|
13894
|
-
tone: input.tone ?? "error"
|
|
13895
|
-
};
|
|
13896
|
-
}
|
|
13897
|
-
function useTransientToast() {
|
|
13898
|
-
const [notice, setNotice] = reactExports.useState(null);
|
|
13899
|
-
const showToast = reactExports.useCallback((input) => {
|
|
13900
|
-
setNotice((previous) => createNextTransientToast(previous, input));
|
|
13901
|
-
}, []);
|
|
13902
|
-
const dismissToast = reactExports.useCallback(() => {
|
|
13903
|
-
setNotice(null);
|
|
13904
|
-
}, []);
|
|
13905
|
-
reactExports.useEffect(() => {
|
|
13906
|
-
if (notice === null) return void 0;
|
|
13907
|
-
const timeout = window.setTimeout(() => {
|
|
13908
|
-
setNotice(null);
|
|
13909
|
-
}, TRANSIENT_TOAST_AUTO_DISMISS_MS);
|
|
13910
|
-
return () => {
|
|
13911
|
-
window.clearTimeout(timeout);
|
|
13912
|
-
};
|
|
13913
|
-
}, [notice]);
|
|
13914
|
-
return { notice, showToast, dismissToast };
|
|
13915
|
-
}
|
|
13916
|
-
function TransientToast({
|
|
13917
|
-
notice,
|
|
13918
|
-
onDismiss
|
|
13919
|
-
}) {
|
|
13920
|
-
if (notice === null) return null;
|
|
13921
|
-
const isError = notice.tone === "error";
|
|
13922
|
-
const Icon2 = isError ? TriangleAlert : CircleCheck;
|
|
13923
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
13924
|
-
"div",
|
|
13925
|
-
{
|
|
13926
|
-
"aria-atomic": "true",
|
|
13927
|
-
"aria-live": "polite",
|
|
13928
|
-
className: "pointer-events-none fixed top-4 right-4 z-[100] w-[min(calc(100vw-2rem),26rem)]",
|
|
13929
|
-
role: "status",
|
|
13930
|
-
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
13931
|
-
"div",
|
|
13932
|
-
{
|
|
13933
|
-
className: cn(
|
|
13934
|
-
"pointer-events-auto flex items-start gap-2 rounded-md border px-3 py-2 text-sm shadow-[0_18px_50px_rgba(0,0,0,0.45)] backdrop-blur",
|
|
13935
|
-
isError ? "border-red-400/30 bg-[#16090b]/95 text-red-100" : "border-cyan-300/25 bg-[#071318]/95 text-cyan-100"
|
|
13936
|
-
),
|
|
13937
|
-
children: [
|
|
13938
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
13939
|
-
Icon2,
|
|
13940
|
-
{
|
|
13941
|
-
className: cn("mt-0.5 size-4 shrink-0", isError ? "text-red-300" : "text-cyan-200")
|
|
13942
|
-
}
|
|
13943
|
-
),
|
|
13944
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 flex-1 break-words leading-5", children: notice.message }),
|
|
13945
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
13946
|
-
"button",
|
|
13947
|
-
{
|
|
13948
|
-
type: "button",
|
|
13949
|
-
className: "inline-flex size-6 shrink-0 items-center justify-center rounded-md text-current/70 transition-colors hover:bg-white/10 hover:text-current",
|
|
13950
|
-
"aria-label": "Dismiss notification",
|
|
13951
|
-
onClick: onDismiss,
|
|
13952
|
-
children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "size-3.5" })
|
|
13953
|
-
}
|
|
13954
|
-
)
|
|
13955
|
-
]
|
|
13956
|
-
},
|
|
13957
|
-
notice.id
|
|
13958
|
-
)
|
|
13959
|
-
}
|
|
13960
|
-
);
|
|
13961
|
-
}
|
|
13962
13995
|
const SSEUpdateSchema = union([
|
|
13963
13996
|
object({
|
|
13964
13997
|
type: literal("init"),
|