@tonyclaw/agent-inspector 2.1.7 → 2.1.9

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 (36) hide show
  1. package/.output/cli.js +274 -140
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/assets/{CompareDrawer-BLS7CVvA.js → CompareDrawer-Dv423tJJ.js} +1 -1
  4. package/.output/public/assets/{ProxyViewerContainer-BFZ1WG07.js → ProxyViewerContainer-6mRRv0F1.js} +35 -35
  5. package/.output/public/assets/{ReplayDialog-DIGF807X.js → ReplayDialog-Bury80WZ.js} +1 -1
  6. package/.output/public/assets/{RequestAnatomy-C3Nlvp9P.js → RequestAnatomy-Bh07p6Yj.js} +1 -1
  7. package/.output/public/assets/{ResponseView-BbZywqHe.js → ResponseView-C8_ZLXNd.js} +1 -1
  8. package/.output/public/assets/{StreamingChunkSequence-Dk27PfPn.js → StreamingChunkSequence-BKvT1lyU.js} +1 -1
  9. package/.output/public/assets/_sessionId-DnxfC3cB.js +1 -0
  10. package/.output/public/assets/index-B1naZUTb.js +1 -0
  11. package/.output/public/assets/index-CmtfjQPv.css +1 -0
  12. package/.output/public/assets/{main-BxHXMs6B.js → main-D9YPHKL0.js} +2 -2
  13. package/.output/server/{_sessionId-D5HNwb9A.mjs → _sessionId-D2z4VD7h.mjs} +3 -3
  14. package/.output/server/_ssr/{CompareDrawer-QNk1twf8.mjs → CompareDrawer-DNDkVh7T.mjs} +3 -3
  15. package/.output/server/_ssr/{ProxyViewerContainer-DGhc2le_.mjs → ProxyViewerContainer-CI-fjnaf.mjs} +284 -217
  16. package/.output/server/_ssr/{ReplayDialog-D8wg4VNL.mjs → ReplayDialog-Dx4um0uS.mjs} +4 -4
  17. package/.output/server/_ssr/{RequestAnatomy-BtJHKVl2.mjs → RequestAnatomy-CKPBN_PB.mjs} +3 -3
  18. package/.output/server/_ssr/{ResponseView-CndDItiU.mjs → ResponseView-3wkt24-z.mjs} +3 -3
  19. package/.output/server/_ssr/{StreamingChunkSequence-D5Ywpbr7.mjs → StreamingChunkSequence-CSK53g5a.mjs} +3 -3
  20. package/.output/server/_ssr/{index-DtcUTHAX.mjs → index-1uaJ_KuG.mjs} +3 -3
  21. package/.output/server/_ssr/index.mjs +2 -2
  22. package/.output/server/_ssr/{router-C0apgqfC.mjs → router-KEX70DxH.mjs} +17 -8
  23. package/.output/server/{_tanstack-start-manifest_v-BoTPaB-V.mjs → _tanstack-start-manifest_v-VhueDt-w.mjs} +1 -1
  24. package/.output/server/index.mjs +63 -63
  25. package/README.md +10 -6
  26. package/package.json +1 -1
  27. package/src/cli/detect-tools.ts +2 -1
  28. package/src/cli/onboard.ts +334 -167
  29. package/src/components/providers/SettingsDialog.tsx +47 -0
  30. package/src/components/proxy-viewer/ConversationGroup.tsx +31 -9
  31. package/src/components/proxy-viewer/ConversationHeader.tsx +97 -37
  32. package/src/components/proxy-viewer/LogEntryHeader.tsx +3 -12
  33. package/src/mcp/server.ts +18 -4
  34. package/.output/public/assets/_sessionId-BHpX8AVf.js +0 -1
  35. package/.output/public/assets/index-BXHM9OMb.js +0 -1
  36. package/.output/public/assets/index-DP4NzCZ5.css +0 -1
@@ -1,11 +1,11 @@
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, g as apiFormatForPath, l as GroupEvidenceExportResultSchema, m as DeleteInspectorGroupResponseSchema, r as createPendingProviderTestResults, t as ProviderTestResultsSchema, u as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, v as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, h as getSessionPath, f as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, w as resolveProviderContextWindow, j as AlertSummarySchema, k as AlertListResponseSchema, G as GroupEvidenceReadResponseSchema, q as maskApiKey, n as providerHasContextMetadata, o as findProviderModelMetadata, K as KnowledgeCandidateSchema, i as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema, x as isPlainRecord } from "./router-C0apgqfC.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, g as apiFormatForPath, l as GroupEvidenceExportResultSchema, m as DeleteInspectorGroupResponseSchema, r as createPendingProviderTestResults, t as ProviderTestResultsSchema, u as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, v as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, h as getSessionPath, f as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, w as resolveProviderContextWindow, j as AlertSummarySchema, k as AlertListResponseSchema, G as GroupEvidenceReadResponseSchema, q as maskApiKey, n as providerHasContextMetadata, o as findProviderModelMetadata, K as KnowledgeCandidateSchema, i as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema, x as isPlainRecord } from "./router-KEX70DxH.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";
6
6
  import { t as twMerge } from "../_libs/tailwind-merge.mjs";
7
- import { c as cva } from "../_libs/class-variance-authority.mjs";
8
7
  import { R as Root, T as Trigger$1, C as Content, a as Close, b as Title, D as Description, P as Portal$2, O as Overlay } from "../_libs/radix-ui__react-dialog.mjs";
8
+ import { c as cva } from "../_libs/class-variance-authority.mjs";
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";
@@ -609,41 +609,6 @@ function useProviders() {
609
609
  mutate: response.mutate
610
610
  };
611
611
  }
612
- const badgeVariants = cva(
613
- "inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
614
- {
615
- variants: {
616
- variant: {
617
- default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
618
- secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
619
- destructive: "bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
620
- outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
621
- ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
622
- link: "text-primary underline-offset-4 [a&]:hover:underline"
623
- }
624
- },
625
- defaultVariants: {
626
- variant: "default"
627
- }
628
- }
629
- );
630
- function Badge({
631
- className,
632
- variant = "default",
633
- asChild = false,
634
- ...props
635
- }) {
636
- const Comp = asChild ? Slot : "span";
637
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
638
- Comp,
639
- {
640
- "data-slot": "badge",
641
- "data-variant": variant,
642
- className: cn(badgeVariants({ variant }), className),
643
- ...props
644
- }
645
- );
646
- }
647
612
  function Dialog({
648
613
  ...props
649
614
  }) {
@@ -807,6 +772,128 @@ function ConfirmDialog({
807
772
  ] })
808
773
  ] }) });
809
774
  }
775
+ const AnthropicLogoSvg = "data:image/svg+xml,%3csvg%20height='2500'%20viewBox='0%206.603%201192.672%201193.397'%20width='2500'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m233.96%20800.215%20234.684-131.678%203.947-11.436-3.947-6.363h-11.436l-39.221-2.416-134.094-3.624-116.296-4.832-112.67-6.04-28.35-6.04-26.577-35.035%202.738-17.477%2023.84-16.027%2034.147%202.98%2075.463%205.155%20113.235%207.812%2082.147%204.832%20121.692%2012.644h19.329l2.738-7.812-6.604-4.832-5.154-4.832-117.182-79.41-126.845-83.92-66.443-48.321-35.92-24.484-18.12-22.953-7.813-50.093%2032.618-35.92%2043.812%202.98%2011.195%202.98%2044.375%2034.147%2094.792%2073.37%20123.786%2091.167%2018.12%2015.06%207.249-5.154.886-3.624-8.135-13.61-67.329-121.692-71.838-123.785-31.974-51.302-8.456-30.765c-2.98-12.645-5.154-23.275-5.154-36.242l37.127-50.416%2020.537-6.604%2049.53%206.604%2020.86%2018.121%2030.765%2070.39%2049.852%20110.818%2077.315%20150.684%2022.631%2044.698%2012.08%2041.396%204.51%2012.645h7.813v-7.248l6.362-84.886%2011.759-104.215%2011.436-134.094%203.946-37.772%2018.685-45.262%2037.127-24.482%2028.994%2013.852%2023.839%2034.148-3.303%2022.067-14.174%2092.134-27.785%20144.323-18.121%2096.644h10.55l12.08-12.08%2048.887-64.913%2082.147-102.685%2036.242-40.752%2042.282-45.02%2027.14-21.423h51.303l37.772%2056.135-16.913%2057.986-52.832%2067.007-43.812%2056.779-62.82%2084.563-39.22%2067.651%203.623%205.396%209.343-.886%20141.906-30.201%2076.671-13.852%2091.49-15.705%2041.396%2019.329%204.51%2019.65-16.269%2040.189-97.852%2024.16-114.764%2022.954-170.9%2040.43-2.093%201.53%202.416%202.98%2076.993%207.248%2032.94%201.771h80.617l150.12%2011.195%2039.222%2025.933%2023.517%2031.732-3.946%2024.16-60.403%2030.766-81.503-19.33-190.228-45.26-65.235-16.27h-9.02v5.397l54.362%2053.154%2099.624%2089.96%20124.752%20115.973%206.362%2028.671-16.027%2022.63-16.912-2.415-109.611-82.47-42.282-37.127-95.758-80.618h-6.363v8.456l22.067%2032.296%20116.537%20175.167%206.04%2053.719-8.456%2017.476-30.201%2010.55-33.181-6.04-68.215-95.758-70.39-107.84-56.778-96.644-6.926%203.947-33.503%20360.886-15.705%2018.443-36.243%2013.852-30.201-22.953-16.027-37.127%2016.027-73.37%2019.329-95.758%2015.704-76.107%2014.175-94.55%208.456-31.41-.563-2.094-6.927.886-71.275%2097.852-108.402%20146.497-85.772%2091.812-20.537%208.134-35.597-18.443%203.301-32.94%2019.893-29.315%20118.712-151.007%2071.597-93.583%2046.228-54.04-.322-7.813h-2.738l-315.302%20204.725-56.135%207.248-24.16-22.63%202.98-37.128%2011.435-12.08%2094.792-65.236-.322.323z'%20fill='%23d97757'/%3e%3c/svg%3e";
776
+ const OpenAILogoSvg = "data:image/svg+xml,%3csvg%20height='2500'%20viewBox='-1%20-.1%20949.1%20959.8'%20width='2474'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m925.8%20456.3c10.4%2023.2%2017%2048%2019.7%2073.3%202.6%2025.3%201.3%2050.9-4.1%2075.8-5.3%2024.9-14.5%2048.8-27.3%2070.8-8.4%2014.7-18.3%2028.5-29.7%2041.2-11.3%2012.6-23.9%2024-37.6%2034-13.8%2010-28.5%2018.4-44.1%2025.3-15.5%206.8-31.7%2012-48.3%2015.4-7.8%2024.2-19.4%2047.1-34.4%2067.7-14.9%2020.6-33%2038.7-53.6%2053.6-20.6%2015-43.4%2026.6-67.6%2034.4-24.2%207.9-49.5%2011.8-75%2011.8-16.9.1-33.9-1.7-50.5-5.1-16.5-3.5-32.7-8.8-48.2-15.7s-30.2-15.5-43.9-25.5c-13.6-10-26.2-21.5-37.4-34.2-25%205.4-50.6%206.7-75.9%204.1-25.3-2.7-50.1-9.3-73.4-19.7-23.2-10.3-44.7-24.3-63.6-41.4s-35-37.1-47.7-59.1c-8.5-14.7-15.5-30.2-20.8-46.3s-8.8-32.7-10.6-49.6c-1.8-16.8-1.7-33.8.1-50.7%201.8-16.8%205.5-33.4%2010.8-49.5-17-18.9-31-40.4-41.4-63.6-10.3-23.3-17-48-19.6-73.3-2.7-25.3-1.3-50.9%204-75.8s14.5-48.8%2027.3-70.8c8.4-14.7%2018.3-28.6%2029.6-41.2s24-24%2037.7-34%2028.5-18.5%2044-25.3c15.6-6.9%2031.8-12%2048.4-15.4%207.8-24.3%2019.4-47.1%2034.3-67.7%2015-20.6%2033.1-38.7%2053.7-53.7%2020.6-14.9%2043.4-26.5%2067.6-34.4%2024.2-7.8%2049.5-11.8%2075-11.7%2016.9-.1%2033.9%201.6%2050.5%205.1s32.8%208.7%2048.3%2015.6c15.5%207%2030.2%2015.5%2043.9%2025.5%2013.7%2010.1%2026.3%2021.5%2037.5%2034.2%2024.9-5.3%2050.5-6.6%2075.8-4s50%209.3%2073.3%2019.6c23.2%2010.4%2044.7%2024.3%2063.6%2041.4%2018.9%2017%2035%2036.9%2047.7%2059%208.5%2014.6%2015.5%2030.1%2020.8%2046.3%205.3%2016.1%208.9%2032.7%2010.6%2049.6%201.8%2016.9%201.8%2033.9-.1%2050.8-1.8%2016.9-5.5%2033.5-10.8%2049.6%2017.1%2018.9%2031%2040.3%2041.4%2063.6zm-333.2%20426.9c21.8-9%2041.6-22.3%2058.3-39s30-36.5%2039-58.4c9-21.8%2013.7-45.2%2013.7-68.8v-223q-.1-.3-.2-.7-.1-.3-.3-.6-.2-.3-.5-.5-.3-.3-.6-.4l-80.7-46.6v269.4c0%202.7-.4%205.5-1.1%208.1-.7%202.7-1.7%205.2-3.1%207.6s-3%204.6-5%206.5a32.1%2032.1%200%200%201%20-6.5%205l-191.1%20110.3c-1.6%201-4.3%202.4-5.7%203.2%207.9%206.7%2016.5%2012.6%2025.5%2017.8%209.1%205.2%2018.5%209.6%2028.3%2013.2%209.8%203.5%2019.9%206.2%2030.1%208%2010.3%201.8%2020.7%202.7%2031.1%202.7%2023.6%200%2047-4.7%2068.8-13.8zm-455.1-151.4c11.9%2020.5%2027.6%2038.3%2046.3%2052.7%2018.8%2014.4%2040.1%2024.9%2062.9%2031s46.6%207.7%2070%204.6%2045.9-10.7%2066.4-22.5l193.2-111.5.5-.5q.2-.2.3-.6.2-.3.3-.6v-94l-233.2%20134.9c-2.4%201.4-4.9%202.4-7.5%203.2-2.7.7-5.4%201-8.2%201-2.7%200-5.4-.3-8.1-1-2.6-.8-5.2-1.8-7.6-3.2l-191.1-110.4c-1.7-1-4.2-2.5-5.6-3.4-1.8%2010.3-2.7%2020.7-2.7%2031.1s1%2020.8%202.8%2031.1c1.8%2010.2%204.6%2020.3%208.1%2030.1%203.6%209.8%208%2019.2%2013.2%2028.2zm-50.2-417c-11.8%2020.5-19.4%2043.1-22.5%2066.5s-1.5%2047.1%204.6%2070c6.1%2022.8%2016.6%2044.1%2031%2062.9%2014.4%2018.7%2032.3%2034.4%2052.7%2046.2l193.1%20111.6q.3.1.7.2h.7q.4%200%20.7-.2.3-.1.6-.3l81-46.8-233.2-134.6c-2.3-1.4-4.5-3.1-6.5-5a32.1%2032.1%200%200%201%20-5-6.5c-1.3-2.4-2.4-4.9-3.1-7.6-.7-2.6-1.1-5.3-1-8.1v-227.1c-9.8%203.6-19.3%208-28.3%2013.2-9%205.3-17.5%2011.3-25.5%2018-7.9%206.7-15.3%2014.1-22%2022.1-6.7%207.9-12.6%2016.5-17.8%2025.5zm663.3%20154.4c2.4%201.4%204.6%203%206.6%205%201.9%201.9%203.6%204.1%205%206.5%201.3%202.4%202.4%205%203.1%207.6.6%202.7%201%205.4.9%208.2v227.1c32.1-11.8%2060.1-32.5%2080.8-59.7%2020.8-27.2%2033.3-59.7%2036.2-93.7s-3.9-68.2-19.7-98.5-39.9-55.5-69.5-72.5l-193.1-111.6q-.3-.1-.7-.2h-.7q-.3.1-.7.2-.3.1-.6.3l-80.6%2046.6%20233.2%20134.7zm80.5-121h-.1v.1zm-.1-.1c5.8-33.6%201.9-68.2-11.3-99.7-13.1-31.5-35-58.6-63-78.2-28-19.5-61-30.7-95.1-32.2-34.2-1.4-68%206.9-97.6%2023.9l-193.1%20111.5q-.3.2-.5.5l-.4.6q-.1.3-.2.7-.1.3-.1.7v93.2l233.2-134.7c2.4-1.4%205-2.4%207.6-3.2%202.7-.7%205.4-1%208.1-1%202.8%200%205.5.3%208.2%201%202.6.8%205.1%201.8%207.5%203.2l191.1%20110.4c1.7%201%204.2%202.4%205.6%203.3zm-505.3-103.2c0-2.7.4-5.4%201.1-8.1.7-2.6%201.7-5.2%203.1-7.6%201.4-2.3%203-4.5%205-6.5%201.9-1.9%204.1-3.6%206.5-4.9l191.1-110.3c1.8-1.1%204.3-2.5%205.7-3.2-26.2-21.9-58.2-35.9-92.1-40.2-33.9-4.4-68.3%201-99.2%2015.5-31%2014.5-57.2%2037.6-75.5%2066.4-18.3%2028.9-28%2062.3-28%2096.5v223q.1.4.2.7.1.3.3.6.2.3.5.6.2.2.6.4l80.7%2046.6zm43.8%20294.7%20103.9%2060%20103.9-60v-119.9l-103.8-60-103.9%2060z'/%3e%3c/svg%3e";
777
+ const DeepSeekLogoSvg = "data:image/svg+xml,%3csvg%20fill='none'%20height='1320'%20viewBox='3.771%206.973%2023.993%2017.652'%20width='2500'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m27.501%208.469c-.252-.123-.36.111-.508.23-.05.04-.093.09-.135.135-.368.395-.797.652-1.358.621-.821-.045-1.521.213-2.14.842-.132-.776-.57-1.238-1.235-1.535-.349-.155-.701-.309-.944-.645-.171-.238-.217-.504-.303-.765-.054-.159-.108-.32-.29-.348-.197-.031-.274.135-.352.273-.31.567-.43%201.192-.419%201.825.028%201.421.628%202.554%201.82%203.36.136.093.17.186.128.321-.081.278-.178.547-.264.824-.054.178-.135.217-.324.14a5.448%205.448%200%200%201%20-1.719-1.169c-.848-.82-1.614-1.726-2.57-2.435-.225-.166-.449-.32-.681-.467-.976-.95.128-1.729.383-1.82.267-.096.093-.428-.77-.424s-1.653.293-2.659.677a2.782%202.782%200%200%201%20-.46.135%209.554%209.554%200%200%200%20-2.853-.1c-1.866.21-3.356%201.092-4.452%202.6-1.315%201.81-1.625%203.87-1.246%206.018.399%202.261%201.552%204.136%203.326%205.601%201.837%201.518%203.955%202.262%206.37%202.12%201.466-.085%203.1-.282%204.942-1.842.465.23.952.322%201.762.392.623.059%201.223-.031%201.687-.127.728-.154.677-.828.414-.953-2.132-.994-1.665-.59-2.09-.916%201.084-1.285%202.717-2.619%203.356-6.94.05-.343.007-.558%200-.837-.004-.168.034-.235.228-.254a4.084%204.084%200%200%200%201.529-.47c1.382-.757%201.938-1.997%202.07-3.485.02-.227-.004-.463-.243-.582zm-12.041%2013.391c-2.067-1.627-3.07-2.162-3.483-2.138-.387.021-.318.465-.233.754.089.285.205.482.368.732.113.166.19.414-.112.598-.666.414-1.823-.139-1.878-.166-1.347-.793-2.473-1.842-3.267-3.276-.765-1.38-1.21-2.861-1.284-4.441-.02-.383.093-.518.472-.586a4.692%204.692%200%200%201%201.514-.04c2.109.31%203.905%201.255%205.41%202.749.86.853%201.51%201.871%202.18%202.865.711%201.057%201.478%202.063%202.454%202.887.343.289.619.51.881.672-.792.088-2.117.107-3.022-.61zm.99-6.38a.304.304%200%201%201%20.609%200c0%20.17-.136.304-.306.304a.3.3%200%200%201%20-.303-.305zm3.077%201.581c-.197.08-.394.15-.584.159a1.246%201.246%200%200%201%20-.79-.252c-.27-.227-.463-.354-.546-.752a1.752%201.752%200%200%201%20.016-.582c.07-.324-.008-.531-.235-.72-.187-.155-.422-.196-.682-.196a.551.551%200%200%201%20-.252-.078c-.108-.055-.197-.19-.112-.356.027-.053.159-.183.19-.207.352-.201.758-.135%201.134.016.349.142.611.404.99.773.388.448.457.573.678.906.174.264.333.534.441.842.066.192-.02.35-.248.448z'%20fill='%234d6bfe'/%3e%3c/svg%3e";
778
+ const MiniMaxLogoSvg = "/assets/minimax-BPMzvuL-.jpeg";
779
+ const AlibabaLogoSvg = "/assets/alibaba-TTwafVwX.svg";
780
+ const QwenLogoSvg = "/assets/qwen-CONDcHqt.png";
781
+ const ZhipuAILogoSvg = "/assets/zhipuai-BPNAnxo-.svg";
782
+ const PROVIDER_MAP = {
783
+ "claude-": "anthropic",
784
+ "gpt-": "openai",
785
+ "o1-": "openai",
786
+ "o3-": "openai",
787
+ "deepseek-": "deepseek",
788
+ MiniMax: "minimax",
789
+ qwen: "qwen",
790
+ "glm-": "zhipuai"
791
+ };
792
+ function detectProvider(model) {
793
+ if (model === null) return "unknown";
794
+ const modelLower = model.toLowerCase();
795
+ for (const [prefix, provider] of Object.entries(PROVIDER_MAP)) {
796
+ if (modelLower.startsWith(prefix.toLowerCase())) {
797
+ return provider;
798
+ }
799
+ }
800
+ return "unknown";
801
+ }
802
+ const sizeStyle = { width: 24, height: 24, objectFit: "contain" };
803
+ const AnthropicLogo = React.memo(
804
+ ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: AnthropicLogoSvg, alt: "Anthropic", className, style: sizeStyle })
805
+ );
806
+ const OpenAILogo = React.memo(
807
+ ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
808
+ "img",
809
+ {
810
+ src: OpenAILogoSvg,
811
+ alt: "OpenAI",
812
+ className,
813
+ style: { ...sizeStyle, background: "white", borderRadius: "4px" }
814
+ }
815
+ )
816
+ );
817
+ const DeepSeekLogo = React.memo(
818
+ ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: DeepSeekLogoSvg, alt: "DeepSeek", className, style: sizeStyle })
819
+ );
820
+ const MiniMaxLogo = React.memo(
821
+ ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: MiniMaxLogoSvg, alt: "MiniMax", className, style: sizeStyle })
822
+ );
823
+ const AlibabaLogo = React.memo(
824
+ ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: AlibabaLogoSvg, alt: "Alibaba", className, style: sizeStyle })
825
+ );
826
+ const QwenLogo = React.memo(
827
+ ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: QwenLogoSvg, alt: "Qwen", className, style: sizeStyle })
828
+ );
829
+ const ZhipuAILogo = React.memo(
830
+ ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: ZhipuAILogoSvg, alt: "ZhipuAI", className, style: sizeStyle })
831
+ );
832
+ function ProviderLogo({
833
+ provider,
834
+ className
835
+ }) {
836
+ switch (provider) {
837
+ case "anthropic":
838
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(AnthropicLogo, { className });
839
+ case "openai":
840
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(OpenAILogo, { className });
841
+ case "deepseek":
842
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(DeepSeekLogo, { className });
843
+ case "minimax":
844
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MiniMaxLogo, { className });
845
+ case "alibaba":
846
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(AlibabaLogo, { className });
847
+ case "qwen":
848
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(QwenLogo, { className });
849
+ case "zhipuai":
850
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ZhipuAILogo, { className });
851
+ case "unknown":
852
+ return null;
853
+ }
854
+ }
855
+ function TooltipProvider({
856
+ delayDuration = 0,
857
+ ...props
858
+ }) {
859
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
860
+ Provider,
861
+ {
862
+ "data-slot": "tooltip-provider",
863
+ delayDuration,
864
+ ...props
865
+ }
866
+ );
867
+ }
868
+ function Tooltip({ ...props }) {
869
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Root3, { "data-slot": "tooltip", ...props });
870
+ }
871
+ function TooltipTrigger({ ...props }) {
872
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Trigger$3, { "data-slot": "tooltip-trigger", ...props });
873
+ }
874
+ function TooltipContent({
875
+ className,
876
+ sideOffset = 0,
877
+ children,
878
+ ...props
879
+ }) {
880
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Portal$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
881
+ Content2$1,
882
+ {
883
+ "data-slot": "tooltip-content",
884
+ sideOffset,
885
+ className: cn(
886
+ "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
887
+ className
888
+ ),
889
+ ...props,
890
+ children: [
891
+ children,
892
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Arrow2, { className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" })
893
+ ]
894
+ }
895
+ ) });
896
+ }
810
897
  function forEachCodePoint(text, visit) {
811
898
  for (const ch of Array.from(text)) {
812
899
  visit(ch);
@@ -1113,11 +1200,6 @@ function resolveLogFormat(log) {
1113
1200
  const pathFormat = apiFormatForPath(log.path);
1114
1201
  return pathFormat === "unknown" ? log.apiFormat : pathFormat;
1115
1202
  }
1116
- const API_FORMAT_LABELS = {
1117
- anthropic: "Anthropic",
1118
- openai: "OpenAI",
1119
- unknown: "Unknown"
1120
- };
1121
1203
  function ConversationHeader({
1122
1204
  conversationId,
1123
1205
  startTime,
@@ -1125,12 +1207,13 @@ function ConversationHeader({
1125
1207
  totalCalls,
1126
1208
  totalInputTokens,
1127
1209
  totalOutputTokens,
1128
- apiFormat,
1129
1210
  expanded,
1130
1211
  onToggle,
1131
- hideApiFormat = false,
1212
+ providers,
1132
1213
  isLoading = false,
1133
1214
  userAgent,
1215
+ clientPid,
1216
+ clientProjectFolder,
1134
1217
  timeDisplayFormat,
1135
1218
  onClear
1136
1219
  }) {
@@ -1171,14 +1254,47 @@ function ConversationHeader({
1171
1254
  },
1172
1255
  children: [
1173
1256
  expanded ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4 text-muted-foreground shrink-0" }) : isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-4 animate-spin text-muted-foreground shrink-0" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4 text-muted-foreground shrink-0" }),
1174
- /* @__PURE__ */ jsxRuntimeExports.jsx(
1175
- "span",
1176
- {
1177
- className: "text-purple-400/90 font-mono text-xs font-semibold shrink-0",
1178
- title: conversationId,
1179
- children: conversationId.startsWith("PID:") || conversationId.includes("|") ? conversationId : conversationId.length > 24 ? conversationId.slice(0, 12) + "..." + conversationId.slice(-12) : conversationId
1180
- }
1181
- ),
1257
+ conversationId.startsWith("PID:") || conversationId.includes("|") ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
1258
+ clientPid !== null && clientPid !== void 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
1259
+ "span",
1260
+ {
1261
+ className: "text-purple-400/90 font-mono text-xs font-semibold shrink-0",
1262
+ title: `PID ${clientPid}`,
1263
+ children: [
1264
+ "PID ",
1265
+ clientPid
1266
+ ]
1267
+ }
1268
+ ) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-purple-400/90 font-mono text-xs font-semibold shrink-0", children: conversationId }),
1269
+ clientProjectFolder !== null && clientProjectFolder !== void 0 && clientProjectFolder !== "" && /* @__PURE__ */ jsxRuntimeExports.jsx(
1270
+ "span",
1271
+ {
1272
+ className: "text-muted-foreground text-xs font-mono truncate max-w-[200px] shrink-0",
1273
+ title: clientProjectFolder,
1274
+ children: clientProjectFolder
1275
+ }
1276
+ )
1277
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
1278
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1279
+ "span",
1280
+ {
1281
+ className: "text-purple-400/90 font-mono text-xs font-semibold shrink-0",
1282
+ title: conversationId,
1283
+ children: conversationId.length > 24 ? conversationId.slice(0, 12) + "..." + conversationId.slice(-12) : conversationId
1284
+ }
1285
+ ),
1286
+ clientPid !== null && clientPid !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
1287
+ "span",
1288
+ {
1289
+ className: "text-muted-foreground text-xs font-mono tabular-nums shrink-0 px-1.5 py-0.5 rounded border border-border bg-muted/40",
1290
+ title: `Client process ID ${clientPid}`,
1291
+ children: [
1292
+ "PID ",
1293
+ clientPid
1294
+ ]
1295
+ }
1296
+ )
1297
+ ] }),
1182
1298
  userAgent !== null && userAgent !== void 0 && userAgent !== "" && /* @__PURE__ */ jsxRuntimeExports.jsxs(
1183
1299
  "span",
1184
1300
  {
@@ -1190,19 +1306,17 @@ function ConversationHeader({
1190
1306
  ]
1191
1307
  }
1192
1308
  ),
1193
- !hideApiFormat && /* @__PURE__ */ jsxRuntimeExports.jsx(
1194
- Badge,
1309
+ providers !== void 0 && providers.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { delayDuration: 150, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
1310
+ "span",
1195
1311
  {
1196
- variant: "outline",
1197
- className: cn(
1198
- "text-[10px] px-1.5 py-0 h-5 font-mono shrink-0",
1199
- apiFormat === "openai" && "border-blue-500/40 text-blue-400",
1200
- apiFormat === "anthropic" && "border-orange-500/40 text-orange-400",
1201
- apiFormat === "unknown" && "border-muted text-muted-foreground"
1202
- ),
1203
- children: API_FORMAT_LABELS[apiFormat]
1312
+ className: "flex items-center gap-0.5 shrink-0",
1313
+ "aria-label": "Models used in this session",
1314
+ children: providers.map(({ provider, models }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
1315
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderLogo, { provider, className: "size-4" }) }) }),
1316
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: models.length === 1 ? models[0] : models.join(", ") })
1317
+ ] }, provider))
1204
1318
  }
1205
- ),
1319
+ ) }),
1206
1320
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1 text-muted-foreground text-xs shrink-0", children: [
1207
1321
  /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
1208
1322
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatTimestampRange(startTime, endTime, timeDisplayFormat) })
@@ -1269,26 +1383,6 @@ function ConversationHeader({
1269
1383
  }
1270
1384
  );
1271
1385
  }
1272
- function getGroupApiFormat(logs) {
1273
- for (const log of logs) {
1274
- const apiFormat = resolveLogFormat(log);
1275
- if (apiFormat !== "unknown") {
1276
- return apiFormat;
1277
- }
1278
- }
1279
- return "unknown";
1280
- }
1281
- function hasMixedApiFormat(logs) {
1282
- let hasAnthropic = false;
1283
- let hasOpenai = false;
1284
- for (const log of logs) {
1285
- const apiFormat = resolveLogFormat(log);
1286
- if (apiFormat === "anthropic") hasAnthropic = true;
1287
- else if (apiFormat === "openai") hasOpenai = true;
1288
- if (hasAnthropic && hasOpenai) return true;
1289
- }
1290
- return false;
1291
- }
1292
1386
  function getConversationId(log) {
1293
1387
  if (log.isTest === true) return "provider-test";
1294
1388
  if (log.sessionId !== null && log.sessionId !== "" && log.sessionId !== void 0) {
@@ -1704,128 +1798,6 @@ function getInteriorCrabVariantIndex(seed) {
1704
1798
  function getInteriorCrabVariant(seed) {
1705
1799
  return getCrabVariant(getInteriorCrabVariantIndex(seed));
1706
1800
  }
1707
- const AnthropicLogoSvg = "data:image/svg+xml,%3csvg%20height='2500'%20viewBox='0%206.603%201192.672%201193.397'%20width='2500'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m233.96%20800.215%20234.684-131.678%203.947-11.436-3.947-6.363h-11.436l-39.221-2.416-134.094-3.624-116.296-4.832-112.67-6.04-28.35-6.04-26.577-35.035%202.738-17.477%2023.84-16.027%2034.147%202.98%2075.463%205.155%20113.235%207.812%2082.147%204.832%20121.692%2012.644h19.329l2.738-7.812-6.604-4.832-5.154-4.832-117.182-79.41-126.845-83.92-66.443-48.321-35.92-24.484-18.12-22.953-7.813-50.093%2032.618-35.92%2043.812%202.98%2011.195%202.98%2044.375%2034.147%2094.792%2073.37%20123.786%2091.167%2018.12%2015.06%207.249-5.154.886-3.624-8.135-13.61-67.329-121.692-71.838-123.785-31.974-51.302-8.456-30.765c-2.98-12.645-5.154-23.275-5.154-36.242l37.127-50.416%2020.537-6.604%2049.53%206.604%2020.86%2018.121%2030.765%2070.39%2049.852%20110.818%2077.315%20150.684%2022.631%2044.698%2012.08%2041.396%204.51%2012.645h7.813v-7.248l6.362-84.886%2011.759-104.215%2011.436-134.094%203.946-37.772%2018.685-45.262%2037.127-24.482%2028.994%2013.852%2023.839%2034.148-3.303%2022.067-14.174%2092.134-27.785%20144.323-18.121%2096.644h10.55l12.08-12.08%2048.887-64.913%2082.147-102.685%2036.242-40.752%2042.282-45.02%2027.14-21.423h51.303l37.772%2056.135-16.913%2057.986-52.832%2067.007-43.812%2056.779-62.82%2084.563-39.22%2067.651%203.623%205.396%209.343-.886%20141.906-30.201%2076.671-13.852%2091.49-15.705%2041.396%2019.329%204.51%2019.65-16.269%2040.189-97.852%2024.16-114.764%2022.954-170.9%2040.43-2.093%201.53%202.416%202.98%2076.993%207.248%2032.94%201.771h80.617l150.12%2011.195%2039.222%2025.933%2023.517%2031.732-3.946%2024.16-60.403%2030.766-81.503-19.33-190.228-45.26-65.235-16.27h-9.02v5.397l54.362%2053.154%2099.624%2089.96%20124.752%20115.973%206.362%2028.671-16.027%2022.63-16.912-2.415-109.611-82.47-42.282-37.127-95.758-80.618h-6.363v8.456l22.067%2032.296%20116.537%20175.167%206.04%2053.719-8.456%2017.476-30.201%2010.55-33.181-6.04-68.215-95.758-70.39-107.84-56.778-96.644-6.926%203.947-33.503%20360.886-15.705%2018.443-36.243%2013.852-30.201-22.953-16.027-37.127%2016.027-73.37%2019.329-95.758%2015.704-76.107%2014.175-94.55%208.456-31.41-.563-2.094-6.927.886-71.275%2097.852-108.402%20146.497-85.772%2091.812-20.537%208.134-35.597-18.443%203.301-32.94%2019.893-29.315%20118.712-151.007%2071.597-93.583%2046.228-54.04-.322-7.813h-2.738l-315.302%20204.725-56.135%207.248-24.16-22.63%202.98-37.128%2011.435-12.08%2094.792-65.236-.322.323z'%20fill='%23d97757'/%3e%3c/svg%3e";
1708
- const OpenAILogoSvg = "data:image/svg+xml,%3csvg%20height='2500'%20viewBox='-1%20-.1%20949.1%20959.8'%20width='2474'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m925.8%20456.3c10.4%2023.2%2017%2048%2019.7%2073.3%202.6%2025.3%201.3%2050.9-4.1%2075.8-5.3%2024.9-14.5%2048.8-27.3%2070.8-8.4%2014.7-18.3%2028.5-29.7%2041.2-11.3%2012.6-23.9%2024-37.6%2034-13.8%2010-28.5%2018.4-44.1%2025.3-15.5%206.8-31.7%2012-48.3%2015.4-7.8%2024.2-19.4%2047.1-34.4%2067.7-14.9%2020.6-33%2038.7-53.6%2053.6-20.6%2015-43.4%2026.6-67.6%2034.4-24.2%207.9-49.5%2011.8-75%2011.8-16.9.1-33.9-1.7-50.5-5.1-16.5-3.5-32.7-8.8-48.2-15.7s-30.2-15.5-43.9-25.5c-13.6-10-26.2-21.5-37.4-34.2-25%205.4-50.6%206.7-75.9%204.1-25.3-2.7-50.1-9.3-73.4-19.7-23.2-10.3-44.7-24.3-63.6-41.4s-35-37.1-47.7-59.1c-8.5-14.7-15.5-30.2-20.8-46.3s-8.8-32.7-10.6-49.6c-1.8-16.8-1.7-33.8.1-50.7%201.8-16.8%205.5-33.4%2010.8-49.5-17-18.9-31-40.4-41.4-63.6-10.3-23.3-17-48-19.6-73.3-2.7-25.3-1.3-50.9%204-75.8s14.5-48.8%2027.3-70.8c8.4-14.7%2018.3-28.6%2029.6-41.2s24-24%2037.7-34%2028.5-18.5%2044-25.3c15.6-6.9%2031.8-12%2048.4-15.4%207.8-24.3%2019.4-47.1%2034.3-67.7%2015-20.6%2033.1-38.7%2053.7-53.7%2020.6-14.9%2043.4-26.5%2067.6-34.4%2024.2-7.8%2049.5-11.8%2075-11.7%2016.9-.1%2033.9%201.6%2050.5%205.1s32.8%208.7%2048.3%2015.6c15.5%207%2030.2%2015.5%2043.9%2025.5%2013.7%2010.1%2026.3%2021.5%2037.5%2034.2%2024.9-5.3%2050.5-6.6%2075.8-4s50%209.3%2073.3%2019.6c23.2%2010.4%2044.7%2024.3%2063.6%2041.4%2018.9%2017%2035%2036.9%2047.7%2059%208.5%2014.6%2015.5%2030.1%2020.8%2046.3%205.3%2016.1%208.9%2032.7%2010.6%2049.6%201.8%2016.9%201.8%2033.9-.1%2050.8-1.8%2016.9-5.5%2033.5-10.8%2049.6%2017.1%2018.9%2031%2040.3%2041.4%2063.6zm-333.2%20426.9c21.8-9%2041.6-22.3%2058.3-39s30-36.5%2039-58.4c9-21.8%2013.7-45.2%2013.7-68.8v-223q-.1-.3-.2-.7-.1-.3-.3-.6-.2-.3-.5-.5-.3-.3-.6-.4l-80.7-46.6v269.4c0%202.7-.4%205.5-1.1%208.1-.7%202.7-1.7%205.2-3.1%207.6s-3%204.6-5%206.5a32.1%2032.1%200%200%201%20-6.5%205l-191.1%20110.3c-1.6%201-4.3%202.4-5.7%203.2%207.9%206.7%2016.5%2012.6%2025.5%2017.8%209.1%205.2%2018.5%209.6%2028.3%2013.2%209.8%203.5%2019.9%206.2%2030.1%208%2010.3%201.8%2020.7%202.7%2031.1%202.7%2023.6%200%2047-4.7%2068.8-13.8zm-455.1-151.4c11.9%2020.5%2027.6%2038.3%2046.3%2052.7%2018.8%2014.4%2040.1%2024.9%2062.9%2031s46.6%207.7%2070%204.6%2045.9-10.7%2066.4-22.5l193.2-111.5.5-.5q.2-.2.3-.6.2-.3.3-.6v-94l-233.2%20134.9c-2.4%201.4-4.9%202.4-7.5%203.2-2.7.7-5.4%201-8.2%201-2.7%200-5.4-.3-8.1-1-2.6-.8-5.2-1.8-7.6-3.2l-191.1-110.4c-1.7-1-4.2-2.5-5.6-3.4-1.8%2010.3-2.7%2020.7-2.7%2031.1s1%2020.8%202.8%2031.1c1.8%2010.2%204.6%2020.3%208.1%2030.1%203.6%209.8%208%2019.2%2013.2%2028.2zm-50.2-417c-11.8%2020.5-19.4%2043.1-22.5%2066.5s-1.5%2047.1%204.6%2070c6.1%2022.8%2016.6%2044.1%2031%2062.9%2014.4%2018.7%2032.3%2034.4%2052.7%2046.2l193.1%20111.6q.3.1.7.2h.7q.4%200%20.7-.2.3-.1.6-.3l81-46.8-233.2-134.6c-2.3-1.4-4.5-3.1-6.5-5a32.1%2032.1%200%200%201%20-5-6.5c-1.3-2.4-2.4-4.9-3.1-7.6-.7-2.6-1.1-5.3-1-8.1v-227.1c-9.8%203.6-19.3%208-28.3%2013.2-9%205.3-17.5%2011.3-25.5%2018-7.9%206.7-15.3%2014.1-22%2022.1-6.7%207.9-12.6%2016.5-17.8%2025.5zm663.3%20154.4c2.4%201.4%204.6%203%206.6%205%201.9%201.9%203.6%204.1%205%206.5%201.3%202.4%202.4%205%203.1%207.6.6%202.7%201%205.4.9%208.2v227.1c32.1-11.8%2060.1-32.5%2080.8-59.7%2020.8-27.2%2033.3-59.7%2036.2-93.7s-3.9-68.2-19.7-98.5-39.9-55.5-69.5-72.5l-193.1-111.6q-.3-.1-.7-.2h-.7q-.3.1-.7.2-.3.1-.6.3l-80.6%2046.6%20233.2%20134.7zm80.5-121h-.1v.1zm-.1-.1c5.8-33.6%201.9-68.2-11.3-99.7-13.1-31.5-35-58.6-63-78.2-28-19.5-61-30.7-95.1-32.2-34.2-1.4-68%206.9-97.6%2023.9l-193.1%20111.5q-.3.2-.5.5l-.4.6q-.1.3-.2.7-.1.3-.1.7v93.2l233.2-134.7c2.4-1.4%205-2.4%207.6-3.2%202.7-.7%205.4-1%208.1-1%202.8%200%205.5.3%208.2%201%202.6.8%205.1%201.8%207.5%203.2l191.1%20110.4c1.7%201%204.2%202.4%205.6%203.3zm-505.3-103.2c0-2.7.4-5.4%201.1-8.1.7-2.6%201.7-5.2%203.1-7.6%201.4-2.3%203-4.5%205-6.5%201.9-1.9%204.1-3.6%206.5-4.9l191.1-110.3c1.8-1.1%204.3-2.5%205.7-3.2-26.2-21.9-58.2-35.9-92.1-40.2-33.9-4.4-68.3%201-99.2%2015.5-31%2014.5-57.2%2037.6-75.5%2066.4-18.3%2028.9-28%2062.3-28%2096.5v223q.1.4.2.7.1.3.3.6.2.3.5.6.2.2.6.4l80.7%2046.6zm43.8%20294.7%20103.9%2060%20103.9-60v-119.9l-103.8-60-103.9%2060z'/%3e%3c/svg%3e";
1709
- const DeepSeekLogoSvg = "data:image/svg+xml,%3csvg%20fill='none'%20height='1320'%20viewBox='3.771%206.973%2023.993%2017.652'%20width='2500'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m27.501%208.469c-.252-.123-.36.111-.508.23-.05.04-.093.09-.135.135-.368.395-.797.652-1.358.621-.821-.045-1.521.213-2.14.842-.132-.776-.57-1.238-1.235-1.535-.349-.155-.701-.309-.944-.645-.171-.238-.217-.504-.303-.765-.054-.159-.108-.32-.29-.348-.197-.031-.274.135-.352.273-.31.567-.43%201.192-.419%201.825.028%201.421.628%202.554%201.82%203.36.136.093.17.186.128.321-.081.278-.178.547-.264.824-.054.178-.135.217-.324.14a5.448%205.448%200%200%201%20-1.719-1.169c-.848-.82-1.614-1.726-2.57-2.435-.225-.166-.449-.32-.681-.467-.976-.95.128-1.729.383-1.82.267-.096.093-.428-.77-.424s-1.653.293-2.659.677a2.782%202.782%200%200%201%20-.46.135%209.554%209.554%200%200%200%20-2.853-.1c-1.866.21-3.356%201.092-4.452%202.6-1.315%201.81-1.625%203.87-1.246%206.018.399%202.261%201.552%204.136%203.326%205.601%201.837%201.518%203.955%202.262%206.37%202.12%201.466-.085%203.1-.282%204.942-1.842.465.23.952.322%201.762.392.623.059%201.223-.031%201.687-.127.728-.154.677-.828.414-.953-2.132-.994-1.665-.59-2.09-.916%201.084-1.285%202.717-2.619%203.356-6.94.05-.343.007-.558%200-.837-.004-.168.034-.235.228-.254a4.084%204.084%200%200%200%201.529-.47c1.382-.757%201.938-1.997%202.07-3.485.02-.227-.004-.463-.243-.582zm-12.041%2013.391c-2.067-1.627-3.07-2.162-3.483-2.138-.387.021-.318.465-.233.754.089.285.205.482.368.732.113.166.19.414-.112.598-.666.414-1.823-.139-1.878-.166-1.347-.793-2.473-1.842-3.267-3.276-.765-1.38-1.21-2.861-1.284-4.441-.02-.383.093-.518.472-.586a4.692%204.692%200%200%201%201.514-.04c2.109.31%203.905%201.255%205.41%202.749.86.853%201.51%201.871%202.18%202.865.711%201.057%201.478%202.063%202.454%202.887.343.289.619.51.881.672-.792.088-2.117.107-3.022-.61zm.99-6.38a.304.304%200%201%201%20.609%200c0%20.17-.136.304-.306.304a.3.3%200%200%201%20-.303-.305zm3.077%201.581c-.197.08-.394.15-.584.159a1.246%201.246%200%200%201%20-.79-.252c-.27-.227-.463-.354-.546-.752a1.752%201.752%200%200%201%20.016-.582c.07-.324-.008-.531-.235-.72-.187-.155-.422-.196-.682-.196a.551.551%200%200%201%20-.252-.078c-.108-.055-.197-.19-.112-.356.027-.053.159-.183.19-.207.352-.201.758-.135%201.134.016.349.142.611.404.99.773.388.448.457.573.678.906.174.264.333.534.441.842.066.192-.02.35-.248.448z'%20fill='%234d6bfe'/%3e%3c/svg%3e";
1710
- const MiniMaxLogoSvg = "/assets/minimax-BPMzvuL-.jpeg";
1711
- const AlibabaLogoSvg = "/assets/alibaba-TTwafVwX.svg";
1712
- const QwenLogoSvg = "/assets/qwen-CONDcHqt.png";
1713
- const ZhipuAILogoSvg = "/assets/zhipuai-BPNAnxo-.svg";
1714
- const PROVIDER_MAP = {
1715
- "claude-": "anthropic",
1716
- "gpt-": "openai",
1717
- "o1-": "openai",
1718
- "o3-": "openai",
1719
- "deepseek-": "deepseek",
1720
- MiniMax: "minimax",
1721
- qwen: "qwen",
1722
- "glm-": "zhipuai"
1723
- };
1724
- function detectProvider(model) {
1725
- if (model === null) return "unknown";
1726
- const modelLower = model.toLowerCase();
1727
- for (const [prefix, provider] of Object.entries(PROVIDER_MAP)) {
1728
- if (modelLower.startsWith(prefix.toLowerCase())) {
1729
- return provider;
1730
- }
1731
- }
1732
- return "unknown";
1733
- }
1734
- const sizeStyle = { width: 24, height: 24, objectFit: "contain" };
1735
- const AnthropicLogo = React.memo(
1736
- ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: AnthropicLogoSvg, alt: "Anthropic", className, style: sizeStyle })
1737
- );
1738
- const OpenAILogo = React.memo(
1739
- ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1740
- "img",
1741
- {
1742
- src: OpenAILogoSvg,
1743
- alt: "OpenAI",
1744
- className,
1745
- style: { ...sizeStyle, background: "white", borderRadius: "4px" }
1746
- }
1747
- )
1748
- );
1749
- const DeepSeekLogo = React.memo(
1750
- ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: DeepSeekLogoSvg, alt: "DeepSeek", className, style: sizeStyle })
1751
- );
1752
- const MiniMaxLogo = React.memo(
1753
- ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: MiniMaxLogoSvg, alt: "MiniMax", className, style: sizeStyle })
1754
- );
1755
- const AlibabaLogo = React.memo(
1756
- ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: AlibabaLogoSvg, alt: "Alibaba", className, style: sizeStyle })
1757
- );
1758
- const QwenLogo = React.memo(
1759
- ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: QwenLogoSvg, alt: "Qwen", className, style: sizeStyle })
1760
- );
1761
- const ZhipuAILogo = React.memo(
1762
- ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: ZhipuAILogoSvg, alt: "ZhipuAI", className, style: sizeStyle })
1763
- );
1764
- function ProviderLogo({
1765
- provider,
1766
- className
1767
- }) {
1768
- switch (provider) {
1769
- case "anthropic":
1770
- return /* @__PURE__ */ jsxRuntimeExports.jsx(AnthropicLogo, { className });
1771
- case "openai":
1772
- return /* @__PURE__ */ jsxRuntimeExports.jsx(OpenAILogo, { className });
1773
- case "deepseek":
1774
- return /* @__PURE__ */ jsxRuntimeExports.jsx(DeepSeekLogo, { className });
1775
- case "minimax":
1776
- return /* @__PURE__ */ jsxRuntimeExports.jsx(MiniMaxLogo, { className });
1777
- case "alibaba":
1778
- return /* @__PURE__ */ jsxRuntimeExports.jsx(AlibabaLogo, { className });
1779
- case "qwen":
1780
- return /* @__PURE__ */ jsxRuntimeExports.jsx(QwenLogo, { className });
1781
- case "zhipuai":
1782
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ZhipuAILogo, { className });
1783
- case "unknown":
1784
- return null;
1785
- }
1786
- }
1787
- function TooltipProvider({
1788
- delayDuration = 0,
1789
- ...props
1790
- }) {
1791
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
1792
- Provider,
1793
- {
1794
- "data-slot": "tooltip-provider",
1795
- delayDuration,
1796
- ...props
1797
- }
1798
- );
1799
- }
1800
- function Tooltip({ ...props }) {
1801
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Root3, { "data-slot": "tooltip", ...props });
1802
- }
1803
- function TooltipTrigger({ ...props }) {
1804
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Trigger$3, { "data-slot": "tooltip-trigger", ...props });
1805
- }
1806
- function TooltipContent({
1807
- className,
1808
- sideOffset = 0,
1809
- children,
1810
- ...props
1811
- }) {
1812
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Portal$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
1813
- Content2$1,
1814
- {
1815
- "data-slot": "tooltip-content",
1816
- sideOffset,
1817
- className: cn(
1818
- "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
1819
- className
1820
- ),
1821
- ...props,
1822
- children: [
1823
- children,
1824
- /* @__PURE__ */ jsxRuntimeExports.jsx(Arrow2, { className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" })
1825
- ]
1826
- }
1827
- ) });
1828
- }
1829
1801
  function getJsonExpansionPolicy(_value) {
1830
1802
  return { depth: Number.POSITIVE_INFINITY };
1831
1803
  }
@@ -1989,19 +1961,19 @@ function useCopyFeedback(text) {
1989
1961
  return { copied, copy };
1990
1962
  }
1991
1963
  const LazyCompareDrawer = reactExports.lazy(
1992
- () => import("./CompareDrawer-QNk1twf8.mjs").then((m) => ({ default: m.CompareDrawer }))
1964
+ () => import("./CompareDrawer-DNDkVh7T.mjs").then((m) => ({ default: m.CompareDrawer }))
1993
1965
  );
1994
1966
  const LazyReplayDialog = reactExports.lazy(
1995
- () => import("./ReplayDialog-D8wg4VNL.mjs").then((m) => ({ default: m.ReplayDialog }))
1967
+ () => import("./ReplayDialog-Dx4um0uS.mjs").then((m) => ({ default: m.ReplayDialog }))
1996
1968
  );
1997
1969
  const LazyRequestAnatomy = reactExports.lazy(
1998
- () => import("./RequestAnatomy-BtJHKVl2.mjs").then((m) => ({ default: m.RequestAnatomy }))
1970
+ () => import("./RequestAnatomy-CKPBN_PB.mjs").then((m) => ({ default: m.RequestAnatomy }))
1999
1971
  );
2000
1972
  const LazyResponseView = reactExports.lazy(
2001
- () => import("./ResponseView-CndDItiU.mjs").then((m) => ({ default: m.ResponseView }))
1973
+ () => import("./ResponseView-3wkt24-z.mjs").then((m) => ({ default: m.ResponseView }))
2002
1974
  );
2003
1975
  const LazyStreamingChunkSequence = reactExports.lazy(
2004
- () => import("./StreamingChunkSequence-D5Ywpbr7.mjs").then((m) => ({
1976
+ () => import("./StreamingChunkSequence-CSK53g5a.mjs").then((m) => ({
2005
1977
  default: m.StreamingChunkSequence
2006
1978
  }))
2007
1979
  );
@@ -2397,6 +2369,41 @@ function SplitRows({ lines }) {
2397
2369
  )) });
2398
2370
  }
2399
2371
  const DiffView = reactExports.memo(DiffViewInner);
2372
+ const badgeVariants = cva(
2373
+ "inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
2374
+ {
2375
+ variants: {
2376
+ variant: {
2377
+ default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
2378
+ secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
2379
+ destructive: "bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
2380
+ outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
2381
+ ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
2382
+ link: "text-primary underline-offset-4 [a&]:hover:underline"
2383
+ }
2384
+ },
2385
+ defaultVariants: {
2386
+ variant: "default"
2387
+ }
2388
+ }
2389
+ );
2390
+ function Badge({
2391
+ className,
2392
+ variant = "default",
2393
+ asChild = false,
2394
+ ...props
2395
+ }) {
2396
+ const Comp = asChild ? Slot : "span";
2397
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
2398
+ Comp,
2399
+ {
2400
+ "data-slot": "badge",
2401
+ "data-variant": variant,
2402
+ className: cn(badgeVariants({ variant }), className),
2403
+ ...props
2404
+ }
2405
+ );
2406
+ }
2400
2407
  const STATUS_BADGE_CLASSES = {
2401
2408
  success: "bg-emerald-500/15 text-emerald-400 border-emerald-500/25",
2402
2409
  client_error: "bg-amber-500/15 text-amber-400 border-amber-500/25",
@@ -2476,10 +2483,6 @@ const LogEntryHeader = reactExports.memo(function({
2476
2483
  /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
2477
2484
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", title: log.timestamp, children: formatTimestamp$2(log.timestamp, timeDisplayFormat) })
2478
2485
  ] }),
2479
- log.model !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
2480
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderLogo, { provider: detectProvider(log.model), className: "size-4" }) }) }),
2481
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: log.model })
2482
- ] }),
2483
2486
  statusCategory !== "success" && /* @__PURE__ */ jsxRuntimeExports.jsxs(
2484
2487
  Badge,
2485
2488
  {
@@ -5584,6 +5587,24 @@ function computeStats(logs) {
5584
5587
  }
5585
5588
  return { totalInputTokens: totalInput, totalOutputTokens: totalOutput };
5586
5589
  }
5590
+ function collectProviders(logs) {
5591
+ const buckets = /* @__PURE__ */ new Map();
5592
+ for (const log of logs) {
5593
+ if (log.model === null) continue;
5594
+ const provider = detectProvider(log.model);
5595
+ if (provider === "unknown") continue;
5596
+ let models = buckets.get(provider);
5597
+ if (models === void 0) {
5598
+ models = /* @__PURE__ */ new Set();
5599
+ buckets.set(provider, models);
5600
+ }
5601
+ models.add(log.model);
5602
+ }
5603
+ return [...buckets.entries()].map(([provider, models]) => ({
5604
+ provider,
5605
+ models: [...models]
5606
+ }));
5607
+ }
5587
5608
  const ConversationGroup = reactExports.memo(function({
5588
5609
  group,
5589
5610
  viewMode = "simple",
@@ -5612,9 +5633,9 @@ const ConversationGroup = reactExports.memo(function({
5612
5633
  [onExpandedChange]
5613
5634
  );
5614
5635
  const stats = reactExports.useMemo(() => computeStats(group.logs), [group.logs]);
5636
+ const providers = reactExports.useMemo(() => collectProviders(group.logs), [group.logs]);
5615
5637
  const startTime = group.logs[0]?.timestamp ?? (/* @__PURE__ */ new Date()).toISOString();
5616
5638
  const endTime = group.logs[group.logs.length - 1]?.timestamp ?? (/* @__PURE__ */ new Date()).toISOString();
5617
- const mixed = hasMixedApiFormat(group.logs);
5618
5639
  const isLoading = group.logs.some((log) => log.responseStatus === null);
5619
5640
  const showTraceRollupMetrics = standalone && !hasPinnedSessionContext;
5620
5641
  const turnGroups = reactExports.useMemo(() => buildTurnGroups(group.logs), [group.logs]);
@@ -5641,12 +5662,13 @@ const ConversationGroup = reactExports.memo(function({
5641
5662
  totalCalls: group.logs.length,
5642
5663
  totalInputTokens: stats.totalInputTokens,
5643
5664
  totalOutputTokens: stats.totalOutputTokens,
5644
- apiFormat: getGroupApiFormat(group.logs),
5645
5665
  expanded,
5646
5666
  onToggle: () => setExpanded(!expanded),
5647
- hideApiFormat: mixed,
5667
+ providers,
5648
5668
  isLoading,
5649
5669
  userAgent: group.logs[0]?.userAgent ?? null,
5670
+ clientPid: group.logs[0]?.clientPid ?? null,
5671
+ clientProjectFolder: group.logs[0]?.clientProjectFolder ?? null,
5650
5672
  timeDisplayFormat,
5651
5673
  onClear: () => onClearGroup(group.logs.map((l) => l.id))
5652
5674
  }
@@ -9770,6 +9792,18 @@ function OnboardingSettingsTab() {
9770
9792
  },
9771
9793
  { id: "opencode-verify", label: "OpenCode verify", value: "opencode mcp list" },
9772
9794
  { id: "opencode-proxy", label: "OpenCode proxy", value: `LLM_BASE_URL=${origin}/proxy` },
9795
+ {
9796
+ id: "mimo-config",
9797
+ label: "MiMo Code config",
9798
+ value: "agent-inspector onboard --mimo-only"
9799
+ },
9800
+ {
9801
+ id: "mimo-status",
9802
+ label: "MiMo Code status",
9803
+ value: "agent-inspector onboard --status --mimo-only"
9804
+ },
9805
+ { id: "mimo-verify", label: "MiMo Code verify", value: "mimo mcp list" },
9806
+ { id: "mimo-proxy", label: "MiMo Code proxy", value: `OPENAI_BASE_URL=${origin}/proxy` },
9773
9807
  { id: "mcp", label: "MCP URL", value: `${origin}/api/mcp` },
9774
9808
  { id: "proxy", label: "Proxy URL", value: `${origin}/proxy` },
9775
9809
  { id: "anthropic", label: "Anthropic base", value: `ANTHROPIC_BASE_URL=${origin}/proxy` },
@@ -9833,6 +9867,22 @@ function OnboardingSettingsTab() {
9833
9867
  "."
9834
9868
  ] })
9835
9869
  ] }),
9870
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-2", children: [
9871
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "mt-0.5 size-3.5 text-emerald-500" }),
9872
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
9873
+ "MiMo Code onboarding safely merges",
9874
+ " ",
9875
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 font-mono text-[11px] text-foreground", children: "mcp.agent-inspector" }),
9876
+ " ",
9877
+ "into",
9878
+ " ",
9879
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 font-mono text-[11px] text-foreground", children: "mimocode.jsonc" }),
9880
+ ", then route OpenAI-format traffic with",
9881
+ " ",
9882
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 font-mono text-[11px] text-foreground", children: "OPENAI_BASE_URL" }),
9883
+ "."
9884
+ ] })
9885
+ ] }),
9836
9886
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-2", children: [
9837
9887
  /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "mt-0.5 size-3.5 text-emerald-500" }),
9838
9888
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "If your AI tool runs in another container or host, replace localhost with an address reachable from that tool and verify the network/firewall path." })
@@ -9924,6 +9974,23 @@ function McpSettingsTab() {
9924
9974
  2
9925
9975
  )
9926
9976
  },
9977
+ {
9978
+ id: "mimo-local",
9979
+ label: "MiMo Code local MCP",
9980
+ value: JSON.stringify(
9981
+ {
9982
+ mcp: {
9983
+ "agent-inspector": {
9984
+ type: "local",
9985
+ command: ["agent-inspector-mcp", "stdio", "--url", endpoint],
9986
+ enabled: true
9987
+ }
9988
+ }
9989
+ },
9990
+ null,
9991
+ 2
9992
+ )
9993
+ },
9927
9994
  {
9928
9995
  id: "codex-toml",
9929
9996
  label: "Codex TOML",