@tonyclaw/agent-inspector 2.1.19 → 2.1.21

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.
Files changed (37) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-CHXN5HYU.js → CompareDrawer-Pii_cIqn.js} +1 -1
  3. package/.output/public/assets/{ProxyViewerContainer-TZJV7HhE.js → ProxyViewerContainer-BxselkhN.js} +28 -28
  4. package/.output/public/assets/{ReplayDialog-DQ7nS5Rr.js → ReplayDialog-BqnYC8ze.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-DXWweH_2.js → RequestAnatomy-I8iBshz1.js} +1 -1
  6. package/.output/public/assets/{ResponseView-3PimPfiD.js → ResponseView-wZzskUas.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-4v52v-7a.js → StreamingChunkSequence-BrSx21IQ.js} +1 -1
  8. package/.output/public/assets/_sessionId-ByxbBMbE.js +1 -0
  9. package/.output/public/assets/index-BjzVMXJq.css +1 -0
  10. package/.output/public/assets/index-DRCRDo_E.js +1 -0
  11. package/.output/public/assets/{index-BuhFRImh.js → index-Dw-jXKKY.js} +1 -1
  12. package/.output/public/assets/{json-viewer-d2gWBDLO.js → json-viewer-D5mzV0oV.js} +1 -1
  13. package/.output/public/assets/{main-Do-E-46G.js → main-B7OIQMeA.js} +2 -2
  14. package/.output/server/{_sessionId-B82aMW2A.mjs → _sessionId-DeU_JdSX.mjs} +2 -2
  15. package/.output/server/_ssr/{CompareDrawer-Bud_yIrM.mjs → CompareDrawer-DgDbG4oF.mjs} +2 -2
  16. package/.output/server/_ssr/{ProxyViewerContainer-DqgVb0So.mjs → ProxyViewerContainer-BOszhOJD.mjs} +190 -100
  17. package/.output/server/_ssr/{ReplayDialog-DKbV5fnW.mjs → ReplayDialog-Cj4gWQv5.mjs} +3 -3
  18. package/.output/server/_ssr/{RequestAnatomy-MStxp1Wp.mjs → RequestAnatomy-CVzNAA03.mjs} +2 -2
  19. package/.output/server/_ssr/{ResponseView-HLTCpJcF.mjs → ResponseView-DLNpai6P.mjs} +2 -2
  20. package/.output/server/_ssr/{StreamingChunkSequence-DEiyiUs_.mjs → StreamingChunkSequence-BiH8EEQB.mjs} +2 -2
  21. package/.output/server/_ssr/{index-DamOPFDI.mjs → index-DaWXoUgf.mjs} +2 -2
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{json-viewer-MmTWKxqh.mjs → json-viewer-CqqNYbmS.mjs} +2 -2
  24. package/.output/server/_ssr/{router-50BIB6ED.mjs → router-Di7D0Bcm.mjs} +80 -21
  25. package/.output/server/{_tanstack-start-manifest_v-TSwb1vFc.mjs → _tanstack-start-manifest_v-BR0YvW29.mjs} +1 -1
  26. package/.output/server/index.mjs +71 -71
  27. package/package.json +1 -1
  28. package/src/components/groups/GroupsDialog.tsx +71 -10
  29. package/src/components/proxy-viewer/ConversationGroupList.tsx +36 -3
  30. package/src/components/proxy-viewer/ConversationHeader.tsx +17 -1
  31. package/src/lib/groupContract.ts +6 -0
  32. package/src/proxy/groupStore.ts +24 -0
  33. package/src/routes/api/groups.ts +41 -1
  34. package/src/services/groups.ts +8 -0
  35. package/.output/public/assets/_sessionId-DfkBPvCC.js +0 -1
  36. package/.output/public/assets/index-ChgjUix0.css +0 -1
  37. package/.output/public/assets/index-Uf87L52J.js +0 -1
@@ -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 GroupEvidenceExportResultSchema, o as DeleteInspectorGroupResponseSchema, y as createPendingProviderTestResults, z as ProviderTestResultsSchema, B as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, E as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, l as AlertSummarySchema, m as AlertListResponseSchema, G as GroupEvidenceReadResponseSchema, t as maskApiKey, u as PATH_V1_MESSAGES, v as PATH_V1_CHAT_COMPLETIONS, w as PATH_V1_RESPONSES, q as providerHasContextMetadata, r as findProviderModelMetadata, f as parseOpenAIResponse, g as parseOpenAIResponsesResponse, O as OpenAIRequestSchema, h as OpenAIResponsesRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, F as resolveProviderContextWindow, j as getSessionPath, x as previewUpstreamUrl, K as KnowledgeCandidateSchema, H as isPlainRecord, k as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema } from "./router-50BIB6ED.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 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-Di7D0Bcm.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";
@@ -1556,7 +1556,7 @@ function ConversationHeader({
1556
1556
  "data-nav-id": `conv-${conversationId}`,
1557
1557
  "data-nav-action": expanded ? "collapse" : "expand",
1558
1558
  className: cn(
1559
- "bg-card/80 shadow-sm flex cursor-pointer items-start gap-3 rounded-[8px] px-3 py-2.5 transition-colors",
1559
+ "bg-card/80 shadow-sm relative flex cursor-pointer items-start gap-3 overflow-hidden rounded-[8px] px-3 py-2.5 transition-colors",
1560
1560
  "hover:bg-card",
1561
1561
  "select-none",
1562
1562
  "sticky top-0 z-10 mb-2",
@@ -1635,7 +1635,11 @@ function ConversationHeader({
1635
1635
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate font-mono tabular-nums", children: clientDisplayLabel })
1636
1636
  ]
1637
1637
  }
1638
- )
1638
+ ),
1639
+ isLoading && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex h-6 shrink-0 items-center gap-1.5 rounded-md bg-cyan-300/[0.08] px-1.5 font-mono text-[10px] uppercase tracking-[0.14em] text-cyan-100/85", children: [
1640
+ /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin" }),
1641
+ "Working"
1642
+ ] })
1639
1643
  ] }),
1640
1644
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mt-1.5 flex min-w-0 flex-wrap items-center gap-1.5", children: [
1641
1645
  /* @__PURE__ */ jsxRuntimeExports.jsx(HeaderMetric, { icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3 shrink-0" }), title: timeLabel, children: timeLabel }),
@@ -1684,6 +1688,14 @@ function ConversationHeader({
1684
1688
  }
1685
1689
  )
1686
1690
  ] }),
1691
+ isLoading && /* @__PURE__ */ jsxRuntimeExports.jsx(
1692
+ "span",
1693
+ {
1694
+ className: "pointer-events-none absolute inset-x-3 bottom-0 h-px overflow-hidden rounded-full bg-white/[0.06]",
1695
+ "aria-hidden": "true",
1696
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute inset-y-0 left-0 w-1/3 animate-pulse rounded-full bg-cyan-200/55 shadow-[0_0_14px_rgba(103,232,249,0.35)]" })
1697
+ }
1698
+ ),
1687
1699
  /* @__PURE__ */ jsxRuntimeExports.jsx(
1688
1700
  ConfirmDialog,
1689
1701
  {
@@ -1959,27 +1971,27 @@ function useCopyFeedback(text) {
1959
1971
  return { copied, copy };
1960
1972
  }
1961
1973
  const LazyCompareDrawer = reactExports.lazy(
1962
- () => import("./CompareDrawer-Bud_yIrM.mjs").then((m) => ({ default: m.CompareDrawer }))
1974
+ () => import("./CompareDrawer-DgDbG4oF.mjs").then((m) => ({ default: m.CompareDrawer }))
1963
1975
  );
1964
1976
  const LazyReplayDialog = reactExports.lazy(
1965
- () => import("./ReplayDialog-DKbV5fnW.mjs").then((m) => ({ default: m.ReplayDialog }))
1977
+ () => import("./ReplayDialog-Cj4gWQv5.mjs").then((m) => ({ default: m.ReplayDialog }))
1966
1978
  );
1967
1979
  const LazyRequestAnatomy = reactExports.lazy(
1968
- () => import("./RequestAnatomy-MStxp1Wp.mjs").then((m) => ({ default: m.RequestAnatomy }))
1980
+ () => import("./RequestAnatomy-CVzNAA03.mjs").then((m) => ({ default: m.RequestAnatomy }))
1969
1981
  );
1970
1982
  const LazyResponseView = reactExports.lazy(
1971
- () => import("./ResponseView-HLTCpJcF.mjs").then((m) => ({ default: m.ResponseView }))
1983
+ () => import("./ResponseView-DLNpai6P.mjs").then((m) => ({ default: m.ResponseView }))
1972
1984
  );
1973
1985
  const LazyStreamingChunkSequence = reactExports.lazy(
1974
- () => import("./StreamingChunkSequence-DEiyiUs_.mjs").then((m) => ({
1986
+ () => import("./StreamingChunkSequence-BiH8EEQB.mjs").then((m) => ({
1975
1987
  default: m.StreamingChunkSequence
1976
1988
  }))
1977
1989
  );
1978
1990
  const LazyJsonViewer = reactExports.lazy(
1979
- () => import("./json-viewer-MmTWKxqh.mjs").then((m) => ({ default: m.JsonViewer }))
1991
+ () => import("./json-viewer-CqqNYbmS.mjs").then((m) => ({ default: m.JsonViewer }))
1980
1992
  );
1981
1993
  const LazyJsonViewerFromString = reactExports.lazy(
1982
- () => import("./json-viewer-MmTWKxqh.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1994
+ () => import("./json-viewer-CqqNYbmS.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1983
1995
  );
1984
1996
  const HIGHLIGHT_DURATION_MS = 1200;
1985
1997
  const MAX_HIGHLIGHT_ATTEMPTS = 12;
@@ -6855,10 +6867,86 @@ function useGroups() {
6855
6867
  mutate: response.mutate
6856
6868
  };
6857
6869
  }
6870
+ const TRANSIENT_TOAST_AUTO_DISMISS_MS = 3e3;
6871
+ function createNextTransientToast(previous, input) {
6872
+ return {
6873
+ id: (previous?.id ?? 0) + 1,
6874
+ message: input.message,
6875
+ tone: input.tone ?? "error"
6876
+ };
6877
+ }
6878
+ function useTransientToast() {
6879
+ const [notice, setNotice] = reactExports.useState(null);
6880
+ const showToast = reactExports.useCallback((input) => {
6881
+ setNotice((previous) => createNextTransientToast(previous, input));
6882
+ }, []);
6883
+ const dismissToast = reactExports.useCallback(() => {
6884
+ setNotice(null);
6885
+ }, []);
6886
+ reactExports.useEffect(() => {
6887
+ if (notice === null) return void 0;
6888
+ const timeout = window.setTimeout(() => {
6889
+ setNotice(null);
6890
+ }, TRANSIENT_TOAST_AUTO_DISMISS_MS);
6891
+ return () => {
6892
+ window.clearTimeout(timeout);
6893
+ };
6894
+ }, [notice]);
6895
+ return { notice, showToast, dismissToast };
6896
+ }
6897
+ function TransientToast({
6898
+ notice,
6899
+ onDismiss
6900
+ }) {
6901
+ if (notice === null) return null;
6902
+ const isError = notice.tone === "error";
6903
+ const Icon2 = isError ? TriangleAlert : CircleCheck;
6904
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
6905
+ "div",
6906
+ {
6907
+ "aria-atomic": "true",
6908
+ "aria-live": "polite",
6909
+ className: "pointer-events-none fixed top-4 right-4 z-[100] w-[min(calc(100vw-2rem),26rem)]",
6910
+ role: "status",
6911
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
6912
+ "div",
6913
+ {
6914
+ className: cn(
6915
+ "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",
6916
+ isError ? "border-red-400/30 bg-[#16090b]/95 text-red-100" : "border-cyan-300/25 bg-[#071318]/95 text-cyan-100"
6917
+ ),
6918
+ children: [
6919
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
6920
+ Icon2,
6921
+ {
6922
+ className: cn("mt-0.5 size-4 shrink-0", isError ? "text-red-300" : "text-cyan-200")
6923
+ }
6924
+ ),
6925
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 flex-1 break-words leading-5", children: notice.message }),
6926
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
6927
+ "button",
6928
+ {
6929
+ type: "button",
6930
+ 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",
6931
+ "aria-label": "Dismiss notification",
6932
+ onClick: onDismiss,
6933
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "size-3.5" })
6934
+ }
6935
+ )
6936
+ ]
6937
+ },
6938
+ notice.id
6939
+ )
6940
+ }
6941
+ );
6942
+ }
6858
6943
  function groupDeletePath(groupId, deleteEvidence) {
6859
6944
  const path = `/api/groups/${encodeURIComponent(groupId)}`;
6860
6945
  return deleteEvidence ? `${path}?deleteEvidence=1` : path;
6861
6946
  }
6947
+ function groupsClearPath(deleteEvidence) {
6948
+ return "/api/groups";
6949
+ }
6862
6950
  function summarizeGroup(group) {
6863
6951
  let completedMembers = 0;
6864
6952
  let failedMembers = 0;
@@ -7041,6 +7129,8 @@ function GroupsDialog() {
7041
7129
  const [deleteEvidence, setDeleteEvidence] = reactExports.useState(false);
7042
7130
  const [deletingGroupId, setDeletingGroupId] = reactExports.useState(null);
7043
7131
  const [deleteError, setDeleteError] = reactExports.useState(null);
7132
+ const [clearingGroups, setClearingGroups] = reactExports.useState(false);
7133
+ const { notice, showToast, dismissToast } = useTransientToast();
7044
7134
  const { groups, isLoading, error, mutate } = useGroups();
7045
7135
  const selectedGroup = reactExports.useMemo(
7046
7136
  () => selectedGroupFrom(groups, selectedGroupId),
@@ -7062,6 +7152,43 @@ function GroupsDialog() {
7062
7152
  const handleRefresh = reactExports.useCallback(() => {
7063
7153
  void mutate();
7064
7154
  }, [mutate]);
7155
+ const handleClearGroups = reactExports.useCallback(async () => {
7156
+ if (groups.length === 0 || clearingGroups) return;
7157
+ setClearingGroups(true);
7158
+ setDeleteTarget(null);
7159
+ setDeleteEvidence(false);
7160
+ setDeleteError(null);
7161
+ setExportError(null);
7162
+ try {
7163
+ const response = await fetch(groupsClearPath(false), { method: "DELETE" });
7164
+ if (!response.ok) {
7165
+ showToast({
7166
+ message: await readApiError(
7167
+ response,
7168
+ `Clear failed with status ${String(response.status)}`
7169
+ ),
7170
+ tone: "error"
7171
+ });
7172
+ return;
7173
+ }
7174
+ const parsed = await parseJsonResponse$1(response, DeleteInspectorGroupsResponseSchema);
7175
+ setExportResult(null);
7176
+ setSelectedGroupId(null);
7177
+ await mutate();
7178
+ await mutateEvidence();
7179
+ showToast({
7180
+ message: `Cleared ${formatNumber(parsed.deleted)} group${parsed.deleted === 1 ? "" : "s"}.`,
7181
+ tone: "success"
7182
+ });
7183
+ } catch (err) {
7184
+ showToast({
7185
+ message: err instanceof Error ? err.message : "Unknown error clearing groups",
7186
+ tone: "error"
7187
+ });
7188
+ } finally {
7189
+ setClearingGroups(false);
7190
+ }
7191
+ }, [clearingGroups, groups.length, mutate, mutateEvidence, showToast]);
7065
7192
  const handleExport = reactExports.useCallback(
7066
7193
  async (group) => {
7067
7194
  setExportingGroupId(group.id);
@@ -7138,6 +7265,7 @@ function GroupsDialog() {
7138
7265
  }
7139
7266
  }, [deleteEvidence, deleteTarget, mutate, mutateEvidence]);
7140
7267
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(Dialog, { open, onOpenChange: setOpen, children: [
7268
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TransientToast, { notice, onDismiss: dismissToast }),
7141
7269
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
7142
7270
  Button,
7143
7271
  {
@@ -7162,20 +7290,27 @@ function GroupsDialog() {
7162
7290
  ] }) }),
7163
7291
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-h-0 items-center justify-between gap-3 border-b border-border pb-3", children: [
7164
7292
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Evaluation batches, model runs, and exported evidence packs." }),
7165
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
7166
- Button,
7167
- {
7168
- type: "button",
7169
- variant: "outline",
7170
- size: "sm",
7171
- className: "shrink-0",
7172
- onClick: handleRefresh,
7173
- children: [
7174
- /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
7175
- "Refresh"
7176
- ]
7177
- }
7178
- )
7293
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
7294
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
7295
+ Button,
7296
+ {
7297
+ type: "button",
7298
+ variant: "outline",
7299
+ size: "sm",
7300
+ disabled: groups.length === 0 || clearingGroups,
7301
+ onClick: () => void handleClearGroups(),
7302
+ title: "Clear all groups. Session logs and run records stay intact.",
7303
+ children: [
7304
+ clearingGroups ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5" }),
7305
+ "Clear"
7306
+ ]
7307
+ }
7308
+ ),
7309
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: handleRefresh, children: [
7310
+ /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
7311
+ "Refresh"
7312
+ ] })
7313
+ ] })
7179
7314
  ] }),
7180
7315
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid min-h-0 flex-1 gap-4 md:grid-cols-[260px_minmax(0,1fr)]", children: [
7181
7316
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -10853,6 +10988,9 @@ function compareField(previous, current) {
10853
10988
  if (current < previous) return { direction: "down", delta: previous - current };
10854
10989
  return null;
10855
10990
  }
10991
+ function hasPendingLogs(logs) {
10992
+ return logs.some((log) => log.responseStatus === null);
10993
+ }
10856
10994
  function firstUserAgent(logs) {
10857
10995
  for (const log of logs) {
10858
10996
  const userAgent = log.userAgent;
@@ -11022,6 +11160,22 @@ function SummaryChip({
11022
11160
  }
11023
11161
  );
11024
11162
  }
11163
+ function WorkingBadge({ label = "Working" }) {
11164
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex h-6 shrink-0 items-center gap-1.5 rounded-md bg-cyan-300/[0.08] px-1.5 font-mono text-[10px] uppercase tracking-[0.14em] text-cyan-100/85", children: [
11165
+ /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin" }),
11166
+ label
11167
+ ] });
11168
+ }
11169
+ function LoadingSweep() {
11170
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
11171
+ "span",
11172
+ {
11173
+ className: "pointer-events-none absolute inset-x-3 bottom-0 h-px overflow-hidden rounded-full bg-white/[0.06]",
11174
+ "aria-hidden": "true",
11175
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute inset-y-0 left-0 w-1/3 animate-pulse rounded-full bg-cyan-200/55 shadow-[0_0_14px_rgba(103,232,249,0.35)]" })
11176
+ }
11177
+ );
11178
+ }
11025
11179
  function ConversationGroupList({
11026
11180
  groups,
11027
11181
  ...groupProps
@@ -11077,10 +11231,14 @@ function IdeGroupSection({
11077
11231
  const totals = tokenTotals(group.logs);
11078
11232
  const sessionCount = countSessions(group.processes);
11079
11233
  const logCount = group.logs.length;
11234
+ const isWorking = hasPendingLogs(group.logs);
11080
11235
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
11081
11236
  "section",
11082
11237
  {
11083
- className: cn("bg-card/75 shadow-sm relative isolate rounded-[8px]"),
11238
+ className: cn(
11239
+ "bg-card/75 shadow-sm relative isolate overflow-hidden rounded-[8px]",
11240
+ isWorking && "bg-card/85"
11241
+ ),
11084
11242
  "data-ide-group": group.id,
11085
11243
  children: [
11086
11244
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -11102,7 +11260,8 @@ function IdeGroupSection({
11102
11260
  children: group.label
11103
11261
  }
11104
11262
  ),
11105
- /* @__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" })
11263
+ /* @__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" }),
11264
+ isWorking && /* @__PURE__ */ jsxRuntimeExports.jsx(WorkingBadge, {})
11106
11265
  ] }),
11107
11266
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
11108
11267
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
@@ -11130,6 +11289,7 @@ function IdeGroupSection({
11130
11289
  ]
11131
11290
  }
11132
11291
  ),
11292
+ isWorking && /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSweep, {}),
11133
11293
  !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(
11134
11294
  ProcessGroupSection,
11135
11295
  {
@@ -11154,10 +11314,11 @@ function ProcessGroupSection({
11154
11314
  const projectLabel = shortProjectPath(group.clientProjectFolder);
11155
11315
  const sessionCount = group.sessions.length;
11156
11316
  const logCount = group.logs.length;
11317
+ const isWorking = hasPendingLogs(group.logs);
11157
11318
  const processLabel = group.clientPid !== null && group.clientPid !== void 0 ? `PID ${group.clientPid}` : "process";
11158
11319
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "relative pl-5", children: [
11159
11320
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute bottom-1 left-2 top-1 w-px bg-white/[0.055]", "aria-hidden": "true" }),
11160
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-black/[0.10] overflow-hidden rounded-[8px]", children: [
11321
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-black/[0.10] relative overflow-hidden rounded-[8px]", children: [
11161
11322
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
11162
11323
  "button",
11163
11324
  {
@@ -11170,6 +11331,7 @@ function ProcessGroupSection({
11170
11331
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "min-w-0 flex-1", children: [
11171
11332
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1", children: [
11172
11333
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-xs font-semibold tabular-nums text-slate-100", children: processLabel }),
11334
+ isWorking && /* @__PURE__ */ jsxRuntimeExports.jsx(WorkingBadge, { label: "Active" }),
11173
11335
  projectLabel !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs(
11174
11336
  "span",
11175
11337
  {
@@ -11203,6 +11365,7 @@ function ProcessGroupSection({
11203
11365
  ]
11204
11366
  }
11205
11367
  ),
11368
+ isWorking && /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSweep, {}),
11206
11369
  !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(
11207
11370
  ConversationGroup,
11208
11371
  {
@@ -13869,79 +14032,6 @@ function ProxyViewer({
13869
14032
  ) })
13870
14033
  ] });
13871
14034
  }
13872
- const TRANSIENT_TOAST_AUTO_DISMISS_MS = 3e3;
13873
- function createNextTransientToast(previous, input) {
13874
- return {
13875
- id: (previous?.id ?? 0) + 1,
13876
- message: input.message,
13877
- tone: input.tone ?? "error"
13878
- };
13879
- }
13880
- function useTransientToast() {
13881
- const [notice, setNotice] = reactExports.useState(null);
13882
- const showToast = reactExports.useCallback((input) => {
13883
- setNotice((previous) => createNextTransientToast(previous, input));
13884
- }, []);
13885
- const dismissToast = reactExports.useCallback(() => {
13886
- setNotice(null);
13887
- }, []);
13888
- reactExports.useEffect(() => {
13889
- if (notice === null) return void 0;
13890
- const timeout = window.setTimeout(() => {
13891
- setNotice(null);
13892
- }, TRANSIENT_TOAST_AUTO_DISMISS_MS);
13893
- return () => {
13894
- window.clearTimeout(timeout);
13895
- };
13896
- }, [notice]);
13897
- return { notice, showToast, dismissToast };
13898
- }
13899
- function TransientToast({
13900
- notice,
13901
- onDismiss
13902
- }) {
13903
- if (notice === null) return null;
13904
- const isError = notice.tone === "error";
13905
- const Icon2 = isError ? TriangleAlert : CircleCheck;
13906
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
13907
- "div",
13908
- {
13909
- "aria-atomic": "true",
13910
- "aria-live": "polite",
13911
- className: "pointer-events-none fixed top-4 right-4 z-[100] w-[min(calc(100vw-2rem),26rem)]",
13912
- role: "status",
13913
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
13914
- "div",
13915
- {
13916
- className: cn(
13917
- "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",
13918
- isError ? "border-red-400/30 bg-[#16090b]/95 text-red-100" : "border-cyan-300/25 bg-[#071318]/95 text-cyan-100"
13919
- ),
13920
- children: [
13921
- /* @__PURE__ */ jsxRuntimeExports.jsx(
13922
- Icon2,
13923
- {
13924
- className: cn("mt-0.5 size-4 shrink-0", isError ? "text-red-300" : "text-cyan-200")
13925
- }
13926
- ),
13927
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 flex-1 break-words leading-5", children: notice.message }),
13928
- /* @__PURE__ */ jsxRuntimeExports.jsx(
13929
- "button",
13930
- {
13931
- type: "button",
13932
- 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",
13933
- "aria-label": "Dismiss notification",
13934
- onClick: onDismiss,
13935
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "size-3.5" })
13936
- }
13937
- )
13938
- ]
13939
- },
13940
- notice.id
13941
- )
13942
- }
13943
- );
13944
- }
13945
14035
  const SSEUpdateSchema = union([
13946
14036
  object({
13947
14037
  type: literal("init"),
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { u as useProviders, D as Dialog, d as DialogContent, e as DialogHeader, h as DialogTitle, T as Tabs, i as TabsList, j as TabsTrigger, k as TabsContent, l as Button, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, q as dispatchLogFocusRequest } from "./ProxyViewerContainer-DqgVb0So.mjs";
3
- import { ResponseView } from "./ResponseView-HLTCpJcF.mjs";
4
- import { C as CapturedLogSchema } from "./router-50BIB6ED.mjs";
2
+ import { u as useProviders, D as Dialog, d as DialogContent, e as DialogHeader, h as DialogTitle, T as Tabs, i as TabsList, j as TabsTrigger, k as TabsContent, l as Button, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, q as dispatchLogFocusRequest } from "./ProxyViewerContainer-BOszhOJD.mjs";
3
+ import { ResponseView } from "./ResponseView-DLNpai6P.mjs";
4
+ import { C as CapturedLogSchema } from "./router-Di7D0Bcm.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/modelcontextprotocol__server.mjs";
7
7
  import { ae as RotateCcw, ar as Braces, as as Minimize2 } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { u as useProviders, s as analyzeContextIntelligence, f as formatTokens, m as TooltipProvider, c as cn, n as Tooltip, o as TooltipTrigger, p as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, A as ANATOMY_ROLE_LABELS, t as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-DqgVb0So.mjs";
3
- import "./router-50BIB6ED.mjs";
2
+ import { u as useProviders, s as analyzeContextIntelligence, f as formatTokens, m as TooltipProvider, c as cn, n as Tooltip, o as TooltipTrigger, p as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, A as ANATOMY_ROLE_LABELS, t as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-BOszhOJD.mjs";
3
+ import "./router-Di7D0Bcm.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { I as Info, a as ChevronDown, h as ChevronRight } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, f as formatTokens, c as cn, v as getStatusCategory, B as Badge, w as Collapsible, x as CollapsibleTrigger, y as CollapsibleContent, z as ScrollArea, E as LazyJsonViewer, F as safeJsonValue } from "./ProxyViewerContainer-DqgVb0So.mjs";
3
- import { s as safeGetOwnProperty } from "./router-50BIB6ED.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, v as getStatusCategory, B as Badge, w as Collapsible, x as CollapsibleTrigger, y as CollapsibleContent, z as ScrollArea, E as LazyJsonViewer, F as safeJsonValue } from "./ProxyViewerContainer-BOszhOJD.mjs";
3
+ import { s as safeGetOwnProperty } from "./router-Di7D0Bcm.mjs";
4
4
  import "../_libs/jszip.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import { Z as Zap, T as TriangleAlert, at as CircleStop, N as Brain, a as ChevronDown, h as ChevronRight, q as Terminal } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { m as TooltipProvider, n as Tooltip, o as TooltipTrigger, B as Badge, p as TooltipContent, E as LazyJsonViewer } from "./ProxyViewerContainer-DqgVb0So.mjs";
3
- import "./router-50BIB6ED.mjs";
2
+ import { m as TooltipProvider, n as Tooltip, o as TooltipTrigger, B as Badge, p as TooltipContent, E as LazyJsonViewer } from "./ProxyViewerContainer-BOszhOJD.mjs";
3
+ import "./router-Di7D0Bcm.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { a as ChevronDown, h as ChevronRight, L as LoaderCircle } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
- import { P as ProxyViewerContainer } from "./ProxyViewerContainer-DqgVb0So.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-BOszhOJD.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-50BIB6ED.mjs";
3
+ import "./router-Di7D0Bcm.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/swr.mjs";
@@ -198,7 +198,7 @@ function getResponse() {
198
198
  return event.res;
199
199
  }
200
200
  async function getStartManifest(matchedRoutes) {
201
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-TSwb1vFc.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-BR0YvW29.mjs");
202
202
  const startManifest = tsrStartManifest();
203
203
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
204
204
  rootRoute.assets = rootRoute.assets || [];
@@ -776,7 +776,7 @@ let entriesPromise;
776
776
  let baseManifestPromise;
777
777
  let cachedFinalManifestPromise;
778
778
  async function loadEntries() {
779
- const routerEntry = await import("./router-50BIB6ED.mjs").then((n) => n.J);
779
+ const routerEntry = await import("./router-Di7D0Bcm.mjs").then((n) => n.N);
780
780
  const startEntry = await import("./start-HYkvq4Ni.mjs");
781
781
  return { startEntry, routerEntry };
782
782
  }
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { G as parseJsonText, c as cn, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, b as copyTextToClipboard } from "./ProxyViewerContainer-DqgVb0So.mjs";
3
- import "./router-50BIB6ED.mjs";
2
+ import { G as parseJsonText, c as cn, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, b as copyTextToClipboard } from "./ProxyViewerContainer-BOszhOJD.mjs";
3
+ import "./router-Di7D0Bcm.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { b as Check, e as Copy, a as ChevronDown, h as ChevronRight, ab as ChevronsDown } from "../_libs/lucide-react.mjs";