@tonyclaw/agent-inspector 2.0.31 → 2.0.32

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 (33) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-tIUf2EJm.js → CompareDrawer-Dgi0hhg5.js} +1 -1
  3. package/.output/public/assets/{ProxyViewerContainer-BxRaXhKR.js → ProxyViewerContainer-4dG0nLRp.js} +28 -28
  4. package/.output/public/assets/{ReplayDialog-D6v1xcuC.js → ReplayDialog-BL6BwDuI.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-D6PniTlx.js → RequestAnatomy-DZMmiIiD.js} +1 -1
  6. package/.output/public/assets/{ResponseView-Sx8PjuvU.js → ResponseView-DJLOiTYq.js} +1 -1
  7. package/.output/public/assets/{StreamingChunkSequence-D-Rbfnxh.js → StreamingChunkSequence--SxZ5cxc.js} +1 -1
  8. package/.output/public/assets/_sessionId-C4z6gu9i.js +1 -0
  9. package/.output/public/assets/index-Drpb2qR5.js +1 -0
  10. package/.output/public/assets/{index-Byk60-jA.css → index-fUUi8iQF.css} +1 -1
  11. package/.output/public/assets/{main-B1kdhY98.js → main-CbRIHhJ5.js} +2 -2
  12. package/.output/server/_libs/lucide-react.mjs +9 -9
  13. package/.output/server/{_sessionId-BceHFKf4.mjs → _sessionId-DNfumR8F.mjs} +2 -2
  14. package/.output/server/_ssr/{CompareDrawer-uSxK5Ei5.mjs → CompareDrawer-CzgjhnUa.mjs} +3 -3
  15. package/.output/server/_ssr/{ProxyViewerContainer-_npQ_f2i.mjs → ProxyViewerContainer-BqOcZ7en.mjs} +258 -87
  16. package/.output/server/_ssr/{ReplayDialog-BHAzSLCT.mjs → ReplayDialog-DmEknIL8.mjs} +3 -3
  17. package/.output/server/_ssr/{RequestAnatomy-DjlZLXBd.mjs → RequestAnatomy-DNoiMudY.mjs} +3 -3
  18. package/.output/server/_ssr/{ResponseView-BuDEJ3fl.mjs → ResponseView-C_cRrleT.mjs} +3 -3
  19. package/.output/server/_ssr/{StreamingChunkSequence-DFcu0bD8.mjs → StreamingChunkSequence-DHZ9Q_dL.mjs} +3 -3
  20. package/.output/server/_ssr/{index-Bw6Fw33c.mjs → index-coYS9XyS.mjs} +2 -2
  21. package/.output/server/_ssr/index.mjs +2 -2
  22. package/.output/server/_ssr/{router-D90tMCb3.mjs → router-DUb5lKw1.mjs} +138 -39
  23. package/.output/server/{_tanstack-start-manifest_v-BVM4AUlx.mjs → _tanstack-start-manifest_v-xcG1o8Vt.mjs} +1 -1
  24. package/.output/server/index.mjs +67 -67
  25. package/package.json +1 -1
  26. package/src/components/groups/GroupsDialog.tsx +291 -78
  27. package/src/lib/groupContract.ts +13 -0
  28. package/src/mcp/server.ts +16 -0
  29. package/src/mcp/toolHandlers.ts +22 -0
  30. package/src/proxy/groupStore.ts +52 -2
  31. package/src/routes/api/groups.$groupId.ts +38 -1
  32. package/.output/public/assets/_sessionId-BhNTuZ31.js +0 -1
  33. package/.output/public/assets/index-Kxptlkpg.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 { 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, u as packageJson, h as GroupEvidenceExportResultSchema, d as RuntimeConfigSchema, P as ProviderConfigSchema, r as requestFormatForPath, k as createPendingProviderTestResults, l as ProviderTestResultsSchema, n as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, o as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, m as maskApiKey, i as providerHasContextMetadata, j as findProviderModelMetadata, g as getSessionPath, p as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, q as resolveProviderContextWindow, K as KnowledgeCandidateSchema, f as stripClaudeCodeBillingHeader, t as isPlainRecord, G as GroupEvidenceReadResponseSchema$1, I as InspectorGroupsListResponseSchema } from "./router-D90tMCb3.mjs";
2
+ import { 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, v as packageJson, h as GroupEvidenceExportResultSchema, i as DeleteInspectorGroupResponseSchema, d as RuntimeConfigSchema, P as ProviderConfigSchema, r as requestFormatForPath, l as createPendingProviderTestResults, n as ProviderTestResultsSchema, o as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, q as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, m as maskApiKey, j as providerHasContextMetadata, k as findProviderModelMetadata, g as getSessionPath, p as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, t as resolveProviderContextWindow, K as KnowledgeCandidateSchema, f as stripClaudeCodeBillingHeader, u as isPlainRecord, G as GroupEvidenceReadResponseSchema$1, I as InspectorGroupsListResponseSchema } from "./router-DUb5lKw1.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";
@@ -9,7 +9,7 @@ import { R as Root, T as Trigger$2, C as Content, a as Close, b as Title, P as P
9
9
  import { d as diffJson, a as diffLines } from "../_libs/diff.mjs";
10
10
  import { u as useWindowVirtualizer, a as useVirtualizer } from "../_libs/tanstack__react-virtual.mjs";
11
11
  import { R as Root2, T as Trigger, I as Icon, V as Value, P as Portal, C as Content2, a as Viewport, b as Item, c as ItemIndicator, d as ItemText, S as ScrollUpButton, e as ScrollDownButton } from "../_libs/radix-ui__react-select.mjs";
12
- import { C as Check, X, P as Plus, D as Download, L as Layers, a as LoaderCircle, R as RefreshCw, S as Settings, A as ArrowLeft, b as Copy, c as ChevronDown, U as Upload, d as Scan, e as CircleAlert, T as Terminal, f as ChevronUp, E as EyeOff, g as Eye, h as ExternalLink, i as RotateCw, j as Clock, k as ChevronRight, l as Pencil, m as Trash2, n as ArrowUpRight, o as ArrowDownRight, p as User, M as MessageSquare, Z as Zap, W as Wrench, q as TriangleAlert, B as Brain, r as Minus, s as CircleCheckBig, t as CircleX, u as ShieldCheck, v as Save, F as FileSearch, w as CircleCheck, x as CloudUpload, O as OctagonAlert, y as Radio, G as Gauge, z as Globe, H as FileTerminal, I as ChevronsUp, J as ChevronsDown, K as FileDiff, N as History, Q as RotateCcw, V as Search, Y as GitCompareArrows, _ as CircleQuestionMark, $ as Server, a0 as Lock, a1 as Wifi, a2 as WifiOff, a3 as ArrowUp, a4 as ArrowDown, a5 as Ellipsis, a6 as CodeXml, a7 as Blocks, a8 as MousePointerClick, a9 as FileText, aa as Rows3, ab as Columns2 } from "../_libs/lucide-react.mjs";
12
+ import { C as Check, X, P as Plus, D as Download, L as Layers, a as LoaderCircle, R as RefreshCw, S as Settings, A as ArrowLeft, b as Copy, c as ChevronDown, T as Trash2, U as Upload, d as Scan, e as CircleAlert, f as Terminal, g as ChevronUp, E as EyeOff, h as Eye, i as ExternalLink, j as RotateCw, k as Clock, l as ChevronRight, m as Pencil, n as ArrowUpRight, o as ArrowDownRight, p as User, M as MessageSquare, Z as Zap, W as Wrench, q as TriangleAlert, B as Brain, r as Minus, s as CircleCheckBig, t as CircleX, u as ShieldCheck, v as Save, F as FileSearch, w as CircleCheck, x as CloudUpload, O as OctagonAlert, y as Radio, G as Gauge, z as Globe, H as FileTerminal, I as ChevronsUp, J as ChevronsDown, K as FileDiff, N as History, Q as RotateCcw, V as Search, Y as GitCompareArrows, _ as CircleQuestionMark, $ as Server, a0 as Lock, a1 as Wifi, a2 as WifiOff, a3 as ArrowUp, a4 as ArrowDown, a5 as Ellipsis, a6 as CodeXml, a7 as Blocks, a8 as MousePointerClick, a9 as FileText, aa as Rows3, ab as Columns2 } from "../_libs/lucide-react.mjs";
13
13
  import { M as Markdown } from "../_libs/react-markdown.mjs";
14
14
  import { u as union, d as object, a as array, l as literal, b as string, n as number, c as boolean, _ as _enum } from "../_libs/zod.mjs";
15
15
  import { P as Provider, R as Root3, T as Trigger$1, a as Portal$1, C as Content2$1, A as Arrow2 } from "../_libs/radix-ui__react-tooltip.mjs";
@@ -1572,19 +1572,19 @@ function useCopyFeedback(text) {
1572
1572
  return { copied, copy };
1573
1573
  }
1574
1574
  const LazyCompareDrawer = reactExports.lazy(
1575
- () => import("./CompareDrawer-uSxK5Ei5.mjs").then((m) => ({ default: m.CompareDrawer }))
1575
+ () => import("./CompareDrawer-CzgjhnUa.mjs").then((m) => ({ default: m.CompareDrawer }))
1576
1576
  );
1577
1577
  const LazyReplayDialog = reactExports.lazy(
1578
- () => import("./ReplayDialog-BHAzSLCT.mjs").then((m) => ({ default: m.ReplayDialog }))
1578
+ () => import("./ReplayDialog-DmEknIL8.mjs").then((m) => ({ default: m.ReplayDialog }))
1579
1579
  );
1580
1580
  const LazyRequestAnatomy = reactExports.lazy(
1581
- () => import("./RequestAnatomy-DjlZLXBd.mjs").then((m) => ({ default: m.RequestAnatomy }))
1581
+ () => import("./RequestAnatomy-DNoiMudY.mjs").then((m) => ({ default: m.RequestAnatomy }))
1582
1582
  );
1583
1583
  const LazyResponseView = reactExports.lazy(
1584
- () => import("./ResponseView-BuDEJ3fl.mjs").then((m) => ({ default: m.ResponseView }))
1584
+ () => import("./ResponseView-C_cRrleT.mjs").then((m) => ({ default: m.ResponseView }))
1585
1585
  );
1586
1586
  const LazyStreamingChunkSequence = reactExports.lazy(
1587
- () => import("./StreamingChunkSequence-DFcu0bD8.mjs").then((m) => ({
1587
+ () => import("./StreamingChunkSequence-DHZ9Q_dL.mjs").then((m) => ({
1588
1588
  default: m.StreamingChunkSequence
1589
1589
  }))
1590
1590
  );
@@ -5449,6 +5449,10 @@ function useGroups() {
5449
5449
  mutate: response.mutate
5450
5450
  };
5451
5451
  }
5452
+ function groupDeletePath(groupId, deleteEvidence) {
5453
+ const path = `/api/groups/${encodeURIComponent(groupId)}`;
5454
+ return deleteEvidence ? `${path}?deleteEvidence=1` : path;
5455
+ }
5452
5456
  function summarizeGroup(group) {
5453
5457
  let completedMembers = 0;
5454
5458
  let failedMembers = 0;
@@ -5594,6 +5598,10 @@ function GroupsDialog() {
5594
5598
  const [exportingGroupId, setExportingGroupId] = reactExports.useState(null);
5595
5599
  const [exportError, setExportError] = reactExports.useState(null);
5596
5600
  const [exportResult, setExportResult] = reactExports.useState(null);
5601
+ const [deleteTarget, setDeleteTarget] = reactExports.useState(null);
5602
+ const [deleteEvidence, setDeleteEvidence] = reactExports.useState(false);
5603
+ const [deletingGroupId, setDeletingGroupId] = reactExports.useState(null);
5604
+ const [deleteError, setDeleteError] = reactExports.useState(null);
5597
5605
  const { groups, isLoading, error, mutate } = useGroups();
5598
5606
  const selectedGroup = reactExports.useMemo(
5599
5607
  () => selectedGroupFrom(groups, selectedGroupId),
@@ -5643,72 +5651,134 @@ function GroupsDialog() {
5643
5651
  },
5644
5652
  [mutate, mutateEvidence]
5645
5653
  );
5646
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(Dialog, { open, onOpenChange: setOpen, children: [
5647
- /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
5648
- Button,
5649
- {
5650
- type: "button",
5651
- variant: "ghost",
5652
- size: "icon",
5653
- className: "relative size-8",
5654
- "aria-label": "Evaluation groups",
5655
- title: "Evaluation groups",
5656
- children: [
5657
- /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "size-4" }),
5658
- isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "absolute -right-0.5 -top-0.5 size-3 animate-spin text-muted-foreground" }) : groups.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute -right-1 -top-1 min-w-4 rounded-full bg-primary px-1 text-[10px] leading-4 text-primary-foreground", children: groups.length }) : null,
5659
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Evaluation groups" })
5660
- ]
5654
+ const handleRequestDelete = reactExports.useCallback((group) => {
5655
+ setDeleteTarget(group);
5656
+ setDeleteEvidence(false);
5657
+ setDeleteError(null);
5658
+ }, []);
5659
+ const handleDeleteDialogOpenChange = reactExports.useCallback(
5660
+ (nextOpen) => {
5661
+ if (nextOpen || deletingGroupId !== null) return;
5662
+ setDeleteTarget(null);
5663
+ setDeleteEvidence(false);
5664
+ setDeleteError(null);
5665
+ },
5666
+ [deletingGroupId]
5667
+ );
5668
+ const handleDelete = reactExports.useCallback(async () => {
5669
+ const group = deleteTarget;
5670
+ if (group === null) return;
5671
+ setDeletingGroupId(group.id);
5672
+ setDeleteError(null);
5673
+ try {
5674
+ const response = await fetch(groupDeletePath(group.id, deleteEvidence), {
5675
+ method: "DELETE"
5676
+ });
5677
+ if (!response.ok) {
5678
+ setDeleteError(
5679
+ await readApiError(response, `Delete failed with status ${String(response.status)}`)
5680
+ );
5681
+ return;
5661
5682
  }
5662
- ) }),
5663
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "flex max-h-[85vh] max-w-5xl flex-col overflow-hidden", children: [
5664
- /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogTitle, { className: "flex items-center gap-2 pr-8", children: [
5665
- /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "size-5 text-muted-foreground" }),
5666
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Groups" }),
5667
- /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", children: formatNumber(groups.length) })
5668
- ] }) }),
5669
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-h-0 items-center justify-between gap-3 border-b border-border pb-3", children: [
5670
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Evaluation batches, model runs, and exported evidence packs." }),
5671
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
5672
- Button,
5673
- {
5674
- type: "button",
5675
- variant: "outline",
5676
- size: "sm",
5677
- className: "shrink-0",
5678
- onClick: handleRefresh,
5679
- children: [
5680
- /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
5681
- "Refresh"
5682
- ]
5683
- }
5684
- )
5685
- ] }),
5686
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid min-h-0 flex-1 gap-4 md:grid-cols-[260px_minmax(0,1fr)]", children: [
5687
- /* @__PURE__ */ jsxRuntimeExports.jsx(
5688
- GroupList,
5689
- {
5690
- groups,
5691
- selectedGroupId: selectedGroup?.id ?? null,
5692
- isLoading,
5693
- error,
5694
- onSelect: setSelectedGroupId
5695
- }
5696
- ),
5697
- /* @__PURE__ */ jsxRuntimeExports.jsx(
5698
- GroupDetails,
5699
- {
5700
- group: selectedGroup,
5701
- exportResult: selectedExportResult,
5702
- evidenceResponse,
5703
- evidenceLoading,
5704
- evidenceError,
5705
- exportError,
5706
- exportingGroupId,
5707
- onExport: handleExport
5708
- }
5709
- )
5683
+ await parseJsonResponse$1(response, DeleteInspectorGroupResponseSchema);
5684
+ setExportResult(
5685
+ (current) => current !== null && current.group.id === group.id ? null : current
5686
+ );
5687
+ setSelectedGroupId((current) => current === group.id ? null : current);
5688
+ setDeleteTarget(null);
5689
+ setDeleteEvidence(false);
5690
+ await mutate();
5691
+ await mutateEvidence();
5692
+ } catch (err) {
5693
+ setDeleteError(err instanceof Error ? err.message : String(err));
5694
+ } finally {
5695
+ setDeletingGroupId(null);
5696
+ }
5697
+ }, [deleteEvidence, deleteTarget, mutate, mutateEvidence]);
5698
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
5699
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Dialog, { open, onOpenChange: setOpen, children: [
5700
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
5701
+ Button,
5702
+ {
5703
+ type: "button",
5704
+ variant: "ghost",
5705
+ size: "icon",
5706
+ className: "relative size-8",
5707
+ "aria-label": "Evaluation groups",
5708
+ title: "Evaluation groups",
5709
+ children: [
5710
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "size-4" }),
5711
+ isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "absolute -right-0.5 -top-0.5 size-3 animate-spin text-muted-foreground" }) : groups.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute -right-1 -top-1 min-w-4 rounded-full bg-primary px-1 text-[10px] leading-4 text-primary-foreground", children: groups.length }) : null,
5712
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Evaluation groups" })
5713
+ ]
5714
+ }
5715
+ ) }),
5716
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "flex max-h-[85vh] max-w-5xl flex-col overflow-hidden", children: [
5717
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogTitle, { className: "flex items-center gap-2 pr-8", children: [
5718
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "size-5 text-muted-foreground" }),
5719
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Groups" }),
5720
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", children: formatNumber(groups.length) })
5721
+ ] }) }),
5722
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-h-0 items-center justify-between gap-3 border-b border-border pb-3", children: [
5723
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Evaluation batches, model runs, and exported evidence packs." }),
5724
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
5725
+ Button,
5726
+ {
5727
+ type: "button",
5728
+ variant: "outline",
5729
+ size: "sm",
5730
+ className: "shrink-0",
5731
+ onClick: handleRefresh,
5732
+ children: [
5733
+ /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
5734
+ "Refresh"
5735
+ ]
5736
+ }
5737
+ )
5738
+ ] }),
5739
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid min-h-0 flex-1 gap-4 md:grid-cols-[260px_minmax(0,1fr)]", children: [
5740
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5741
+ GroupList,
5742
+ {
5743
+ groups,
5744
+ selectedGroupId: selectedGroup?.id ?? null,
5745
+ isLoading,
5746
+ error,
5747
+ onSelect: setSelectedGroupId
5748
+ }
5749
+ ),
5750
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5751
+ GroupDetails,
5752
+ {
5753
+ group: selectedGroup,
5754
+ exportResult: selectedExportResult,
5755
+ evidenceResponse,
5756
+ evidenceLoading,
5757
+ evidenceError,
5758
+ exportError,
5759
+ deleteError,
5760
+ exportingGroupId,
5761
+ deletingGroupId,
5762
+ onExport: handleExport,
5763
+ onRequestDelete: handleRequestDelete
5764
+ }
5765
+ )
5766
+ ] })
5710
5767
  ] })
5711
- ] })
5768
+ ] }),
5769
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5770
+ DeleteGroupDialog,
5771
+ {
5772
+ group: deleteTarget,
5773
+ open: deleteTarget !== null,
5774
+ deleteEvidence,
5775
+ isDeleting: deleteTarget !== null && deletingGroupId === deleteTarget.id,
5776
+ error: deleteError,
5777
+ onDeleteEvidenceChange: setDeleteEvidence,
5778
+ onOpenChange: handleDeleteDialogOpenChange,
5779
+ onConfirm: () => void handleDelete()
5780
+ }
5781
+ )
5712
5782
  ] });
5713
5783
  }
5714
5784
  function GroupList({
@@ -5764,8 +5834,11 @@ function GroupDetails({
5764
5834
  evidenceLoading,
5765
5835
  evidenceError,
5766
5836
  exportError,
5837
+ deleteError,
5767
5838
  exportingGroupId,
5768
- onExport
5839
+ deletingGroupId,
5840
+ onExport,
5841
+ onRequestDelete
5769
5842
  }) {
5770
5843
  if (group === null) {
5771
5844
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex min-h-48 items-center justify-center rounded-md border border-dashed border-border text-xs text-muted-foreground", children: "Select a group to inspect." });
@@ -5776,6 +5849,7 @@ function GroupDetails({
5776
5849
  const evidence = evidenceFor(group, exportResult);
5777
5850
  const rows = buildGroupMemberRows(group, exportResult);
5778
5851
  const isExporting = exportingGroupId === group.id;
5852
+ const isDeleting = deletingGroupId === group.id;
5779
5853
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-0 overflow-y-auto pr-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
5780
5854
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
5781
5855
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 space-y-1", children: [
@@ -5792,21 +5866,37 @@ function GroupDetails({
5792
5866
  ] })
5793
5867
  ] })
5794
5868
  ] }),
5795
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
5796
- Button,
5797
- {
5798
- type: "button",
5799
- variant: "default",
5800
- size: "sm",
5801
- className: "shrink-0",
5802
- disabled: isExporting,
5803
- onClick: () => void onExport(group),
5804
- children: [
5805
- isExporting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Download, { className: "size-3.5" }),
5806
- "Export evidence"
5807
- ]
5808
- }
5809
- )
5869
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
5870
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5871
+ Button,
5872
+ {
5873
+ type: "button",
5874
+ variant: "outline",
5875
+ size: "icon",
5876
+ className: "size-8 text-red-600 hover:text-red-700",
5877
+ "aria-label": "Delete group",
5878
+ title: "Delete group",
5879
+ disabled: isDeleting,
5880
+ onClick: () => onRequestDelete(group),
5881
+ children: isDeleting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5" })
5882
+ }
5883
+ ),
5884
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
5885
+ Button,
5886
+ {
5887
+ type: "button",
5888
+ variant: "default",
5889
+ size: "sm",
5890
+ className: "shrink-0",
5891
+ disabled: isExporting || isDeleting,
5892
+ onClick: () => void onExport(group),
5893
+ children: [
5894
+ isExporting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Download, { className: "size-3.5" }),
5895
+ "Export evidence"
5896
+ ]
5897
+ }
5898
+ )
5899
+ ] })
5810
5900
  ] }),
5811
5901
  group.task !== null && group.task.trim().length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "rounded-md border border-border bg-muted/20 px-3 py-2 text-xs text-muted-foreground", children: group.task }),
5812
5902
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-2 sm:grid-cols-4", children: [
@@ -5832,9 +5922,90 @@ function GroupDetails({
5832
5922
  ),
5833
5923
  /* @__PURE__ */ jsxRuntimeExports.jsx(EvidencePaths, { evidence }),
5834
5924
  exportError !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-md border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700", children: exportError }),
5925
+ deleteError !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-md border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700", children: deleteError }),
5835
5926
  /* @__PURE__ */ jsxRuntimeExports.jsx(MemberTable, { rows })
5836
5927
  ] }) });
5837
5928
  }
5929
+ function DeleteGroupDialog({
5930
+ group,
5931
+ open,
5932
+ deleteEvidence,
5933
+ isDeleting,
5934
+ error,
5935
+ onDeleteEvidenceChange,
5936
+ onOpenChange,
5937
+ onConfirm
5938
+ }) {
5939
+ const title = group?.title ?? "this group";
5940
+ const hasEvidence = group?.evidence !== null && group?.evidence !== void 0;
5941
+ const evidencePath = group?.evidence?.markdownPath ?? "No evidence pack exported.";
5942
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "max-w-md", children: [
5943
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogTitle, { className: "flex items-center gap-2 pr-8", children: [
5944
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-5 text-red-600" }),
5945
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Delete group" })
5946
+ ] }) }),
5947
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
5948
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-muted-foreground", children: [
5949
+ "Delete ",
5950
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: title }),
5951
+ "? Session logs and run records stay intact."
5952
+ ] }),
5953
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
5954
+ "label",
5955
+ {
5956
+ className: cn(
5957
+ "flex items-start gap-3 rounded-md border border-border bg-muted/20 px-3 py-2 text-sm",
5958
+ hasEvidence ? "cursor-pointer" : "opacity-60"
5959
+ ),
5960
+ children: [
5961
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5962
+ "input",
5963
+ {
5964
+ type: "checkbox",
5965
+ className: "mt-0.5 size-4",
5966
+ checked: deleteEvidence,
5967
+ disabled: !hasEvidence || isDeleting,
5968
+ onChange: (event) => onDeleteEvidenceChange(event.currentTarget.checked)
5969
+ }
5970
+ ),
5971
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "min-w-0", children: [
5972
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block font-medium", children: "Also delete exported evidence files" }),
5973
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "mt-1 block truncate font-mono text-[11px] text-muted-foreground", children: evidencePath })
5974
+ ] })
5975
+ ]
5976
+ }
5977
+ ),
5978
+ error !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-md border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700", children: error })
5979
+ ] }),
5980
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-end gap-2 pt-1", children: [
5981
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5982
+ Button,
5983
+ {
5984
+ type: "button",
5985
+ variant: "outline",
5986
+ size: "sm",
5987
+ disabled: isDeleting,
5988
+ onClick: () => onOpenChange(false),
5989
+ children: "Cancel"
5990
+ }
5991
+ ),
5992
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
5993
+ Button,
5994
+ {
5995
+ type: "button",
5996
+ variant: "destructive",
5997
+ size: "sm",
5998
+ disabled: isDeleting || group === null,
5999
+ onClick: onConfirm,
6000
+ children: [
6001
+ isDeleting ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5" }),
6002
+ "Delete"
6003
+ ]
6004
+ }
6005
+ )
6006
+ ] })
6007
+ ] }) });
6008
+ }
5838
6009
  function SummaryStat({ label, value }) {
5839
6010
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-md border border-border bg-muted/20 px-3 py-2", children: [
5840
6011
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[11px] font-medium uppercase text-muted-foreground", children: label }),
@@ -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, b as DialogContent, d as DialogHeader, e as DialogTitle, T as Tabs, h as TabsList, i as TabsTrigger, j as TabsContent, k as Button, l as TooltipProvider, m as Tooltip, n as TooltipTrigger, o as TooltipContent, p as dispatchLogFocusRequest } from "./ProxyViewerContainer-_npQ_f2i.mjs";
3
- import { ResponseView } from "./ResponseView-BuDEJ3fl.mjs";
4
- import { C as CapturedLogSchema } from "./router-D90tMCb3.mjs";
2
+ import { u as useProviders, D as Dialog, b as DialogContent, d as DialogHeader, e as DialogTitle, T as Tabs, h as TabsList, i as TabsTrigger, j as TabsContent, k as Button, l as TooltipProvider, m as Tooltip, n as TooltipTrigger, o as TooltipContent, p as dispatchLogFocusRequest } from "./ProxyViewerContainer-BqOcZ7en.mjs";
3
+ import { ResponseView } from "./ResponseView-C_cRrleT.mjs";
4
+ import { C as CapturedLogSchema } from "./router-DUb5lKw1.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/modelcontextprotocol__server.mjs";
7
7
  import { Q as RotateCcw, ad as Braces, ae as Minimize2 } from "../_libs/lucide-react.mjs";
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { u as useProviders, q as analyzeContextIntelligence, f as formatTokens, l as TooltipProvider, c as cn, m as Tooltip, n as TooltipTrigger, o as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, A as ANATOMY_ROLE_LABELS, s as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-_npQ_f2i.mjs";
3
- import "./router-D90tMCb3.mjs";
2
+ import { u as useProviders, q as analyzeContextIntelligence, f as formatTokens, l as TooltipProvider, c as cn, m as Tooltip, n as TooltipTrigger, o as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, A as ANATOMY_ROLE_LABELS, s as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-BqOcZ7en.mjs";
3
+ import "./router-DUb5lKw1.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
- import { af as Info, c as ChevronDown, k as ChevronRight } from "../_libs/lucide-react.mjs";
6
+ import { af as Info, c as ChevronDown, l as ChevronRight } from "../_libs/lucide-react.mjs";
7
7
  import "../_libs/swr.mjs";
8
8
  import "../_libs/use-sync-external-store.mjs";
9
9
  import "../_libs/dequal.mjs";
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, f as formatTokens, c as cn, t as getStatusCategory, B as Badge, v as Collapsible, w as CollapsibleTrigger, x as CollapsibleContent, y as ScrollArea, z as JsonViewer, E as safeJsonValue } from "./ProxyViewerContainer-_npQ_f2i.mjs";
3
- import "./router-D90tMCb3.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, t as getStatusCategory, B as Badge, v as Collapsible, w as CollapsibleTrigger, x as CollapsibleContent, y as ScrollArea, z as JsonViewer, E as safeJsonValue } from "./ProxyViewerContainer-BqOcZ7en.mjs";
3
+ import "./router-DUb5lKw1.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
- import { Z as Zap, q as TriangleAlert, ag as CircleStop, B as Brain, c as ChevronDown, k as ChevronRight, T as Terminal } from "../_libs/lucide-react.mjs";
6
+ import { Z as Zap, q as TriangleAlert, ag as CircleStop, B as Brain, c as ChevronDown, l as ChevronRight, f as Terminal } from "../_libs/lucide-react.mjs";
7
7
  import { M as Markdown } from "../_libs/react-markdown.mjs";
8
8
  import { R as Root } from "../_libs/radix-ui__react-separator.mjs";
9
9
  import "../_libs/swr.mjs";
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { l as TooltipProvider, m as Tooltip, n as TooltipTrigger, B as Badge, o as TooltipContent, z as JsonViewer } from "./ProxyViewerContainer-_npQ_f2i.mjs";
3
- import "./router-D90tMCb3.mjs";
2
+ import { l as TooltipProvider, m as Tooltip, n as TooltipTrigger, B as Badge, o as TooltipContent, z as JsonViewer } from "./ProxyViewerContainer-BqOcZ7en.mjs";
3
+ import "./router-DUb5lKw1.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
- import { c as ChevronDown, k as ChevronRight, a as LoaderCircle } from "../_libs/lucide-react.mjs";
6
+ import { c as ChevronDown, l as ChevronRight, a as LoaderCircle } from "../_libs/lucide-react.mjs";
7
7
  import "../_libs/swr.mjs";
8
8
  import "../_libs/use-sync-external-store.mjs";
9
9
  import "../_libs/dequal.mjs";
@@ -1,6 +1,6 @@
1
- import { P as ProxyViewerContainer } from "./ProxyViewerContainer-_npQ_f2i.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-BqOcZ7en.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-D90tMCb3.mjs";
3
+ import "./router-DUb5lKw1.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-BVM4AUlx.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-xcG1o8Vt.mjs");
202
202
  const startManifest = tsrStartManifest();
203
203
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
204
204
  rootRoute.assets = rootRoute.assets || [];
@@ -767,7 +767,7 @@ let entriesPromise;
767
767
  let baseManifestPromise;
768
768
  let cachedFinalManifestPromise;
769
769
  async function loadEntries() {
770
- const routerEntry = await import("./router-D90tMCb3.mjs").then((n) => n.v);
770
+ const routerEntry = await import("./router-DUb5lKw1.mjs").then((n) => n.w);
771
771
  const startEntry = await import("./start-HYkvq4Ni.mjs");
772
772
  return { startEntry, routerEntry };
773
773
  }