@assistant-ui/react-devtools 1.2.9 → 1.2.10

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 (54) hide show
  1. package/dist/DevToolsModal.js.map +1 -1
  2. package/dist/DevToolsModalImpl.js.map +1 -1
  3. package/dist/shell/DevToolsOverlay.js.map +1 -1
  4. package/dist/shell/DevToolsPanel.js.map +1 -1
  5. package/dist/shell/SplitLayout.js.map +1 -1
  6. package/dist/shell/tabs/ActivityTab.js.map +1 -1
  7. package/dist/shell/tabs/ContextTab.js.map +1 -1
  8. package/dist/shell/tabs/RawTab.js.map +1 -1
  9. package/dist/shell/tabs/ThreadTab.js.map +1 -1
  10. package/dist/styles/panel.generated.d.ts +1 -1
  11. package/dist/styles/panel.generated.js +1 -1
  12. package/dist/styles/panel.generated.js.map +1 -1
  13. package/dist/views/activity/EventLogRow.js.map +1 -1
  14. package/dist/views/activity/EventStreamPane.js.map +1 -1
  15. package/dist/views/activity/OrphansPane.js.map +1 -1
  16. package/dist/views/activity/RunDetailPane.js.map +1 -1
  17. package/dist/views/activity/activityNodes.d.ts.map +1 -1
  18. package/dist/views/attachments/AttachmentList.js.map +1 -1
  19. package/dist/views/attachments/MediaPartView.js.map +1 -1
  20. package/dist/views/context/ToolUIsView.js.map +1 -1
  21. package/dist/views/mcp/McpView.js.map +1 -1
  22. package/dist/views/message/ChainOfThought.js.map +1 -1
  23. package/dist/views/message/MessageDetailPane.js.map +1 -1
  24. package/dist/views/message/MessageItem.js.map +1 -1
  25. package/dist/views/message/MessageList.js.map +1 -1
  26. package/dist/views/message/MessageMetrics.js.map +1 -1
  27. package/dist/views/message/MessageTimeline.js.map +1 -1
  28. package/dist/views/message/PartDisclosure.js.map +1 -1
  29. package/dist/views/message/PartView.js.map +1 -1
  30. package/dist/views/message/RoleLabel.js.map +1 -1
  31. package/dist/views/message/StatusBadge.js.map +1 -1
  32. package/dist/views/message/ToolCallView.js.map +1 -1
  33. package/dist/views/message/TtftBar.js.map +1 -1
  34. package/dist/views/model-context/ModelContextView.js.map +1 -1
  35. package/dist/views/raw/RawDetail.js.map +1 -1
  36. package/dist/views/raw/statePreview.js.map +1 -1
  37. package/dist/views/runs/PayloadDiff.js.map +1 -1
  38. package/dist/views/scopes/ScopesView.js.map +1 -1
  39. package/dist/views/thread/ComposerFlags.js.map +1 -1
  40. package/dist/views/thread/ComposerQueue.js.map +1 -1
  41. package/dist/views/thread/ConversationList.js.map +1 -1
  42. package/dist/views/thread/ThreadDetails.js.map +1 -1
  43. package/dist/views/thread/Transcript.js.map +1 -1
  44. package/dist/views/ui/CopyButton.js.map +1 -1
  45. package/dist/views/ui/InfoCard.js.map +1 -1
  46. package/dist/views/ui/JSONTree.js.map +1 -1
  47. package/dist/views/ui/PaneHeader.js.map +1 -1
  48. package/dist/views/ui/RailTime.js.map +1 -1
  49. package/dist/views/ui/SelectableRow.d.ts.map +1 -1
  50. package/dist/views/ui/Sparkline.js.map +1 -1
  51. package/dist/views/ui/SummaryItem.js.map +1 -1
  52. package/dist/views/ui/useCopyToClipboard.d.ts.map +1 -1
  53. package/package.json +8 -8
  54. package/src/styles/panel.generated.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PayloadDiff.js","names":["clsx","diffValues","DiffEntry","SIGN","Record","mark","tone","added","removed","changed","format","value","JSON","stringify","PayloadDiff","t0","$","_c","before","after","t1","t2","t3","Symbol","for","bb0","entries","length","t4","map","_temp","entry","index","kind","path"],"sources":["../../../src/views/runs/PayloadDiff.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { diffValues } from \"../../utils/diff\";\nimport type { DiffEntry } from \"../../utils/diff\";\n\nconst SIGN: Record<DiffEntry[\"kind\"], { mark: string; tone: string }> = {\n added: { mark: \"+\", tone: \"text-emerald-600 dark:text-emerald-400\" },\n removed: { mark: \"−\", tone: \"text-red-600 dark:text-red-400\" },\n changed: { mark: \"~\", tone: \"text-amber-600 dark:text-amber-400\" },\n};\n\nconst format = (value: unknown) =>\n typeof value === \"string\" ? `\"${value}\"` : JSON.stringify(value);\n\nexport const PayloadDiff = ({\n before,\n after,\n}: {\n before: unknown;\n after: unknown;\n}) => {\n const entries = diffValues(before, after);\n\n if (entries.length === 0) {\n return (\n <div className=\"text-muted-foreground text-[11px]\">\n no change from the previous event in this scope\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-0.5 font-mono text-[11px]\">\n {entries.map((entry, index) => {\n const { mark, tone } = SIGN[entry.kind];\n return (\n <div key={index} className=\"flex flex-wrap items-baseline gap-1.5\">\n <span className={clsx(\"shrink-0\", tone)}>{mark}</span>\n <span className=\"text-muted-foreground\">{entry.path}</span>\n <span className=\"text-foreground break-all\">\n {entry.kind === \"changed\"\n ? `${format(entry.before)} → ${format(entry.after)}`\n : format(entry.kind === \"added\" ? entry.after : entry.before)}\n </span>\n </div>\n );\n })}\n </div>\n );\n};\n"],"mappings":";;;;;AAIA,MAAMG,OAAkE;CACtEI,OAAO;EAAEF,MAAM;EAAKC,MAAM;CAAyC;CACnEE,SAAS;EAAEH,MAAM;EAAKC,MAAM;CAAiC;CAC7DG,SAAS;EAAEJ,MAAM;EAAKC,MAAM;CAAqC;AACnE;AAEA,MAAMI,UAAUC,UACd,OAAOA,UAAU,WAAW,IAAIA,MAAK,KAAMC,KAAKC,UAAUF,KAAK;AAEjE,MAAaG,eAAcC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,QAAAC,UAAAJ;CAM3B,IAAAK;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAN,EAAA,OAAAG,SAAAH,EAAA,OAAAE,QAAA;EAKKI,KAAAC,OAEMC,IAFN,6BAEK;EAACC,KAAA;GANV,MAAAC,UAAgBzB,WAAWiB,QAAQC,KAAK;GAExC,IAAIO,QAAOC,WAAY,GAAC;IAAA,IAAAC;IAAA,IAAAZ,EAAA,OAAAO,OAAAC,IAAA,2BAAA,GAAA;KAEpBI,KAAA,oBAAA,OAAA;MAAe,WAAA;gBAAoC;KAE7C,CAAA;KAAAZ,EAAA,KAAAY;IAAA,OAAAA,KAAAZ,EAAA;IAFNM,KAAAM;IAAA,MAAAH;GAEM;GAKOL,KAAA;GACZC,KAAAK,QAAOG,IAAKC,KAaZ;EAAC;EAAAd,EAAA,KAAAG;EAAAH,EAAA,KAAAE;EAAAF,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAA;EAAAF,KAAAJ,EAAA;EAAAK,KAAAL,EAAA;EAAAM,KAAAN,EAAA;CAAA;CAAA,IAAAM,OAAAC,OAAAC,IAAA,6BAAA,GAAA,OAAAF;CAAA,IAAAM;CAAA,IAAAZ,EAAA,OAAAI,MAAAJ,EAAA,OAAAK,IAAA;EAdJO,KAAA,oBAAA,OAAA;GAAe,WAAAR;aACZC;EAcG,CAAA;EAAAL,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,OAfNY;AAeM;AAjCiB,SAAAE,MAAAC,OAAAC,OAAA;CAoBnB,MAAA,EAAA3B,MAAAC,SAAuBH,KAAK4B,MAAKE;CAAO,OAEtC,qBAAA,OAAA;EAA2B,WAAA;YAA3B;GACE,oBAAA,QAAA;IAAiB,WAAAjC,KAAK,YAAYM,IAAI;cAAID;GAAY,CAAA;GACtD,oBAAA,QAAA;IAAgB,WAAA;cAAyB0B,MAAKG;GAAa,CAAA;GAC3D,oBAAA,QAAA;IAAgB,WAAA;cACbH,MAAKE,SAAU,YAAf,GACMvB,OAAOqB,MAAKb,MAAO,EAAC,KAAMR,OAAOqB,MAAKZ,KAAM,MAC/CT,OAAOqB,MAAKE,SAAU,UAAUF,MAAKZ,QAASY,MAAKb,MAAO;GACzD,CAAA;EACH;IARIc,KAQJ;AAAA"}
1
+ {"version":3,"file":"PayloadDiff.js","names":["clsx","diffValues","DiffEntry","SIGN","Record","mark","tone","added","removed","changed","format","value","JSON","stringify","PayloadDiff","t0","$","_c","before","after","t1","t2","t3","Symbol","for","bb0","entries","length","t4","map","_temp","entry","index","kind","path"],"sources":["../../../src/views/runs/PayloadDiff.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { diffValues } from \"../../utils/diff\";\nimport type { DiffEntry } from \"../../utils/diff\";\n\nconst SIGN: Record<DiffEntry[\"kind\"], { mark: string; tone: string }> = {\n added: { mark: \"+\", tone: \"text-emerald-600 dark:text-emerald-400\" },\n removed: { mark: \"−\", tone: \"text-red-600 dark:text-red-400\" },\n changed: { mark: \"~\", tone: \"text-amber-600 dark:text-amber-400\" },\n};\n\nconst format = (value: unknown) =>\n typeof value === \"string\" ? `\"${value}\"` : JSON.stringify(value);\n\nexport const PayloadDiff = ({\n before,\n after,\n}: {\n before: unknown;\n after: unknown;\n}) => {\n const entries = diffValues(before, after);\n\n if (entries.length === 0) {\n return (\n <div className=\"text-muted-foreground text-[11px]\">\n no change from the previous event in this scope\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-0.5 font-mono text-[11px]\">\n {entries.map((entry, index) => {\n const { mark, tone } = SIGN[entry.kind];\n return (\n <div key={index} className=\"flex flex-wrap items-baseline gap-1.5\">\n <span className={clsx(\"shrink-0\", tone)}>{mark}</span>\n <span className=\"text-muted-foreground\">{entry.path}</span>\n <span className=\"text-foreground break-all\">\n {entry.kind === \"changed\"\n ? `${format(entry.before)} → ${format(entry.after)}`\n : format(entry.kind === \"added\" ? entry.after : entry.before)}\n </span>\n </div>\n );\n })}\n </div>\n );\n};\n"],"mappings":";;;;;AAIA,MAAMG,OAAkE;CACtEI,OAAO;EAAEF,MAAM;EAAKC,MAAM;CAAyC;CACnEE,SAAS;EAAEH,MAAM;EAAKC,MAAM;CAAiC;CAC7DG,SAAS;EAAEJ,MAAM;EAAKC,MAAM;CAAqC;AACnE;AAEA,MAAMI,UAAUC,UACd,OAAOA,UAAU,WAAW,IAAIA,MAAK,KAAMC,KAAKC,UAAUF,KAAK;AAEjE,MAAaG,eAAcC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,QAAAC,UAAAJ;CAM3B,IAAAK;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAN,EAAA,OAAAG,SAAAH,EAAA,OAAAE,QAAA;EAKKI,KAAAC,OAEMC,IAFN,6BAEK;EAACC,KAAA;GANV,MAAAC,UAAgBzB,WAAWiB,QAAQC,KAAK;GAExC,IAAIO,QAAOC,WAAY,GAAC;IAAA,IAAAC;IAAA,IAAAZ,EAAA,OAAAO,OAAAC,IAAA,2BAAA,GAAA;KAEpBI,KAAA,oBAAA,OAAA;MAAe,WAAA;MAAoC,UAAA;KAE7C,CAAA;KAAAZ,EAAA,KAAAY;IAAA,OAAAA,KAAAZ,EAAA;IAFNM,KAAAM;IAAA,MAAAH;GAEM;GAKOL,KAAA;GACZC,KAAAK,QAAOG,IAAKC,KAaZ;EAAC;EAAAd,EAAA,KAAAG;EAAAH,EAAA,KAAAE;EAAAF,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAA;EAAAF,KAAAJ,EAAA;EAAAK,KAAAL,EAAA;EAAAM,KAAAN,EAAA;CAAA;CAAA,IAAAM,OAAAC,OAAAC,IAAA,6BAAA,GAAA,OAAAF;CAAA,IAAAM;CAAA,IAAAZ,EAAA,OAAAI,MAAAJ,EAAA,OAAAK,IAAA;EAdJO,KAAA,oBAAA,OAAA;GAAe,WAAAR;GACZC,UAAAA;EAcG,CAAA;EAAAL,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,OAfNY;AAeM;AAjCiB,SAAAE,MAAAC,OAAAC,OAAA;CAoBnB,MAAA,EAAA3B,MAAAC,SAAuBH,KAAK4B,MAAKE;CAAO,OAEtC,qBAAA,OAAA;EAA2B,WAAA;EAA3B,UAAA;GACE,oBAAA,QAAA;IAAiB,WAAAjC,KAAK,YAAYM,IAAI;IAAID,UAAAA;GAAY,CAAA;GACtD,oBAAA,QAAA;IAAgB,WAAA;IAAyB0B,UAAAA,MAAKG;GAAa,CAAA;GAC3D,oBAAA,QAAA;IAAgB,WAAA;IACbH,UAAAA,MAAKE,SAAU,YAAf,GACMvB,OAAOqB,MAAKb,MAAO,EAAC,KAAMR,OAAOqB,MAAKZ,KAAM,MAC/CT,OAAOqB,MAAKE,SAAU,UAAUF,MAAKZ,QAASY,MAAKb,MAAO;GACzD,CAAA;EACH;CARIc,GAAAA,KAQJ;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScopesView.js","names":["isRecord","Chip","EmptyState","SummaryItem","SummaryList","ToneBadge","parseScopes","ScopePreview","SourceBadge","t0","$","_c","source","t1","Symbol","for","ScopeNode","scope","scopes","path","query","Object","keys","length","hasQuery","t2","methods","name","children","has","filter","candidate","t3","Set","add","nextPath","t4","t5","t6","JSON","stringify","t7","t8","map","_temp","child","ScopesView","bb0","list","names","_temp2","roots","scope_0","String","t9","scope_1","method"],"sources":["../../../src/views/scopes/ScopesView.tsx"],"sourcesContent":["import { isRecord } from \"../../utils/common\";\nimport { Chip, EmptyState, SummaryItem, SummaryList, ToneBadge } from \"../ui\";\nimport { parseScopes } from \"./parse\";\nimport type { ScopePreview } from \"./types\";\n\nconst SourceBadge = ({ source }: { source: string | null }) => {\n if (!source) return null;\n if (source === \"root\") return <ToneBadge tone=\"emerald\">root</ToneBadge>;\n return <Chip>← {source}</Chip>;\n};\n\nconst ScopeNode = ({\n scope,\n scopes,\n path,\n}: {\n scope: ScopePreview;\n scopes: readonly ScopePreview[];\n path: ReadonlySet<string>;\n}) => {\n const hasQuery = isRecord(scope.query) && Object.keys(scope.query).length > 0;\n const children = path.has(scope.name)\n ? []\n : scopes.filter((candidate) => candidate.source === scope.name);\n const nextPath = new Set(path).add(scope.name);\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-foreground text-[13px] font-medium\">\n {scope.name}\n </span>\n <SourceBadge source={scope.source} />\n {hasQuery ? (\n <span className=\"text-muted-foreground font-mono text-[11px]\">\n {JSON.stringify(scope.query)}\n </span>\n ) : null}\n </div>\n\n {scope.methods.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {scope.methods.map((method) => (\n <Chip key={method} className=\"font-mono\">\n {method}\n </Chip>\n ))}\n </div>\n ) : null}\n\n {children.length ? (\n <div className=\"border-border/60 ms-1 mt-1 flex flex-col gap-3 border-s ps-3\">\n {children.map((child) => (\n <ScopeNode\n key={child.name}\n scope={child}\n scopes={scopes}\n path={nextPath}\n />\n ))}\n </div>\n ) : null}\n </div>\n );\n};\n\nexport const ScopesView = ({ scopes }: { scopes?: unknown }) => {\n const list = parseScopes(scopes);\n\n if (list.length === 0) {\n return (\n <EmptyState>\n No scopes reported. Update `@assistant-ui/react-devtools` to forward the\n scope graph.\n </EmptyState>\n );\n }\n\n const names = new Set(list.map((scope) => scope.name));\n const roots = list.filter(\n (scope) =>\n scope.source === \"root\" ||\n scope.source === null ||\n !names.has(scope.source),\n );\n\n return (\n <div className=\"flex flex-col gap-4\">\n <SummaryList>\n <SummaryItem label=\"Scopes\" value={String(list.length)} />\n <SummaryItem label=\"Roots\" value={String(roots.length)} />\n </SummaryList>\n <div className=\"flex flex-col gap-3\">\n {roots.map((scope) => (\n <ScopeNode\n key={scope.name}\n scope={scope}\n scopes={list}\n path={new Set()}\n />\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScopesView.js","names":["isRecord","Chip","EmptyState","SummaryItem","SummaryList","ToneBadge","parseScopes","ScopePreview","SourceBadge","t0","$","_c","source","t1","Symbol","for","ScopeNode","scope","scopes","path","query","Object","keys","length","hasQuery","t2","methods","name","children","has","filter","candidate","t3","Set","add","nextPath","t4","t5","t6","JSON","stringify","t7","t8","map","_temp","child","ScopesView","bb0","list","names","_temp2","roots","scope_0","String","t9","scope_1","method"],"sources":["../../../src/views/scopes/ScopesView.tsx"],"sourcesContent":["import { isRecord } from \"../../utils/common\";\nimport { Chip, EmptyState, SummaryItem, SummaryList, ToneBadge } from \"../ui\";\nimport { parseScopes } from \"./parse\";\nimport type { ScopePreview } from \"./types\";\n\nconst SourceBadge = ({ source }: { source: string | null }) => {\n if (!source) return null;\n if (source === \"root\") return <ToneBadge tone=\"emerald\">root</ToneBadge>;\n return <Chip>← {source}</Chip>;\n};\n\nconst ScopeNode = ({\n scope,\n scopes,\n path,\n}: {\n scope: ScopePreview;\n scopes: readonly ScopePreview[];\n path: ReadonlySet<string>;\n}) => {\n const hasQuery = isRecord(scope.query) && Object.keys(scope.query).length > 0;\n const children = path.has(scope.name)\n ? []\n : scopes.filter((candidate) => candidate.source === scope.name);\n const nextPath = new Set(path).add(scope.name);\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-foreground text-[13px] font-medium\">\n {scope.name}\n </span>\n <SourceBadge source={scope.source} />\n {hasQuery ? (\n <span className=\"text-muted-foreground font-mono text-[11px]\">\n {JSON.stringify(scope.query)}\n </span>\n ) : null}\n </div>\n\n {scope.methods.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {scope.methods.map((method) => (\n <Chip key={method} className=\"font-mono\">\n {method}\n </Chip>\n ))}\n </div>\n ) : null}\n\n {children.length ? (\n <div className=\"border-border/60 ms-1 mt-1 flex flex-col gap-3 border-s ps-3\">\n {children.map((child) => (\n <ScopeNode\n key={child.name}\n scope={child}\n scopes={scopes}\n path={nextPath}\n />\n ))}\n </div>\n ) : null}\n </div>\n );\n};\n\nexport const ScopesView = ({ scopes }: { scopes?: unknown }) => {\n const list = parseScopes(scopes);\n\n if (list.length === 0) {\n return (\n <EmptyState>\n No scopes reported. Update `@assistant-ui/react-devtools` to forward the\n scope graph.\n </EmptyState>\n );\n }\n\n const names = new Set(list.map((scope) => scope.name));\n const roots = list.filter(\n (scope) =>\n scope.source === \"root\" ||\n scope.source === null ||\n !names.has(scope.source),\n );\n\n return (\n <div className=\"flex flex-col gap-4\">\n <SummaryList>\n <SummaryItem label=\"Scopes\" value={String(list.length)} />\n <SummaryItem label=\"Roots\" value={String(roots.length)} />\n </SummaryList>\n <div className=\"flex flex-col gap-3\">\n {roots.map((scope) => (\n <ScopeNode\n key={scope.name}\n scope={scope}\n scopes={list}\n path={new Set()}\n />\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerFlags.js","names":["formatBoolean","ComposerPreview","ComposerFlags","t0","$","_c","composer","t1","isEditing","t2","canCancel","t3","canSend","t4","isEmpty","t5"],"sources":["../../../src/views/thread/ComposerFlags.tsx"],"sourcesContent":["import { formatBoolean } from \"../../utils/common\";\nimport type { ComposerPreview } from \"./types\";\n\nexport const ComposerFlags = ({ composer }: { composer: ComposerPreview }) => (\n <div className=\"text-muted-foreground flex flex-wrap gap-2 text-[11px]\">\n {typeof composer.isEditing === \"boolean\" ? (\n <span>Edit: {formatBoolean(composer.isEditing)}</span>\n ) : null}\n {typeof composer.canCancel === \"boolean\" ? (\n <span>Can cancel: {formatBoolean(composer.canCancel)}</span>\n ) : null}\n {typeof composer.canSend === \"boolean\" ? (\n <span>Can send: {formatBoolean(composer.canSend)}</span>\n ) : null}\n {typeof composer.isEmpty === \"boolean\" ? (\n <span>Empty: {formatBoolean(composer.isEmpty)}</span>\n ) : null}\n </div>\n);\n"],"mappings":";;;;AAGA,MAAaE,iBAAgBC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,aAAAH;CAA2C,IAAAI;CAAA,IAAAH,EAAA,OAAAE,SAAAE,WAAA;EAEpED,KAAA,OAAOD,SAAQE,cAAe,YAC7B,qBAAA,QAAA,EAAA,UAAA,CAAM,UAAOR,cAAcM,SAAQE,SAAU,CAAS,EAAA,CAAA,IADvD;EAEOJ,EAAA,KAAAE,SAAAE;EAAAJ,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAE,SAAAI,WAAA;EACPD,KAAA,OAAOH,SAAQI,cAAe,YAC7B,qBAAA,QAAA,EAAA,UAAA,CAAM,gBAAaV,cAAcM,SAAQI,SAAU,CAAS,EAAA,CAAA,IAD7D;EAEON,EAAA,KAAAE,SAAAI;EAAAN,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAE,SAAAM,SAAA;EACPD,KAAA,OAAOL,SAAQM,YAAa,YAC3B,qBAAA,QAAA,EAAA,UAAA,CAAM,cAAWZ,cAAcM,SAAQM,OAAQ,CAAS,EAAA,CAAA,IADzD;EAEOR,EAAA,KAAAE,SAAAM;EAAAR,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAE,SAAAQ,SAAA;EACPD,KAAA,OAAOP,SAAQQ,YAAa,YAC3B,qBAAA,QAAA,EAAA,UAAA,CAAM,WAAQd,cAAcM,SAAQQ,OAAQ,CAAS,EAAA,CAAA,IADtD;EAEOV,EAAA,KAAAE,SAAAQ;EAAAV,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,OAAAG,MAAAH,EAAA,OAAAK,MAAAL,EAAA,QAAAO,MAAAP,EAAA,QAAAS,IAAA;EAZVE,KAAA,qBAAA,OAAA;GAAe,WAAA;aAAf;IACGR;IAGAE;IAGAE;IAGAE;GAGG;;EAAAT,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,MAAAO;EAAAP,EAAA,MAAAS;EAAAT,EAAA,MAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OAbNW;AAaM"}
1
+ {"version":3,"file":"ComposerFlags.js","names":["formatBoolean","ComposerPreview","ComposerFlags","t0","$","_c","composer","t1","isEditing","t2","canCancel","t3","canSend","t4","isEmpty","t5"],"sources":["../../../src/views/thread/ComposerFlags.tsx"],"sourcesContent":["import { formatBoolean } from \"../../utils/common\";\nimport type { ComposerPreview } from \"./types\";\n\nexport const ComposerFlags = ({ composer }: { composer: ComposerPreview }) => (\n <div className=\"text-muted-foreground flex flex-wrap gap-2 text-[11px]\">\n {typeof composer.isEditing === \"boolean\" ? (\n <span>Edit: {formatBoolean(composer.isEditing)}</span>\n ) : null}\n {typeof composer.canCancel === \"boolean\" ? (\n <span>Can cancel: {formatBoolean(composer.canCancel)}</span>\n ) : null}\n {typeof composer.canSend === \"boolean\" ? (\n <span>Can send: {formatBoolean(composer.canSend)}</span>\n ) : null}\n {typeof composer.isEmpty === \"boolean\" ? (\n <span>Empty: {formatBoolean(composer.isEmpty)}</span>\n ) : null}\n </div>\n);\n"],"mappings":";;;;AAGA,MAAaE,iBAAgBC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,aAAAH;CAA2C,IAAAI;CAAA,IAAAH,EAAA,OAAAE,SAAAE,WAAA;EAEpED,KAAA,OAAOD,SAAQE,cAAe,YAC7B,qBAAA,QAAA,EAAA,UAAA,CAAM,UAAOR,cAAcM,SAAQE,SAAU,CAAS,EAAA,CAAA,IADvD;EAEOJ,EAAA,KAAAE,SAAAE;EAAAJ,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAE,SAAAI,WAAA;EACPD,KAAA,OAAOH,SAAQI,cAAe,YAC7B,qBAAA,QAAA,EAAA,UAAA,CAAM,gBAAaV,cAAcM,SAAQI,SAAU,CAAS,EAAA,CAAA,IAD7D;EAEON,EAAA,KAAAE,SAAAI;EAAAN,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAE,SAAAM,SAAA;EACPD,KAAA,OAAOL,SAAQM,YAAa,YAC3B,qBAAA,QAAA,EAAA,UAAA,CAAM,cAAWZ,cAAcM,SAAQM,OAAQ,CAAS,EAAA,CAAA,IADzD;EAEOR,EAAA,KAAAE,SAAAM;EAAAR,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAE,SAAAQ,SAAA;EACPD,KAAA,OAAOP,SAAQQ,YAAa,YAC3B,qBAAA,QAAA,EAAA,UAAA,CAAM,WAAQd,cAAcM,SAAQQ,OAAQ,CAAS,EAAA,CAAA,IADtD;EAEOV,EAAA,KAAAE,SAAAQ;EAAAV,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,OAAAG,MAAAH,EAAA,OAAAK,MAAAL,EAAA,QAAAO,MAAAP,EAAA,QAAAS,IAAA;EAZVE,KAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA;IACGR;IAGAE;IAGAE;IAGAE;GAGG;;EAAAT,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,MAAAO;EAAAP,EAAA,MAAAS;EAAAT,EAAA,MAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OAbNW;AAaM"}
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerQueue.js","names":["SectionLabel","ComposerQueueItem","ComposerQueue","t0","$","_c","queue","length","t1","t2","map","_temp","t3","t4","item","index","id","prompt"],"sources":["../../../src/views/thread/ComposerQueue.tsx"],"sourcesContent":["import { SectionLabel } from \"../ui\";\nimport type { ComposerQueueItem } from \"./types\";\n\nexport const ComposerQueue = ({\n queue,\n}: {\n queue: readonly ComposerQueueItem[];\n}) => {\n if (!queue.length) return null;\n\n return (\n <div className=\"bg-card rounded-md border p-3\">\n <SectionLabel>Message queue ({queue.length})</SectionLabel>\n <ol className=\"text-foreground mt-1 list-decimal space-y-0.5 pl-5 text-[11px]\">\n {queue.map((item, index) => (\n <li\n key={item.id ?? index}\n className=\"wrap-break-word whitespace-pre-wrap\"\n >\n {item.prompt || \"(empty)\"}\n </li>\n ))}\n </ol>\n </div>\n );\n};\n"],"mappings":";;;;AAGA,MAAaE,iBAAgBC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,UAAAH;CAK5B,IAAI,CAACG,MAAKC,QAAO,OAAS;CAAK,IAAAC;CAAA,IAAAJ,EAAA,OAAAE,MAAAC,QAAA;EAI3BC,KAAA,qBAAC,cAAD,EAAA,UAAA;GAAc;GAAgBF,MAAKC;GAAQ;EAA9B,EAAA,CAAA;EAA8CH,EAAA,KAAAE,MAAAC;EAAAH,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAE,OAAA;EAExDG,KAAAH,MAAKI,IAAKC,KAOV;EAACP,EAAA,KAAAE;EAAAF,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAQ;CAAA,IAAAR,EAAA,OAAAK,IAAA;EARJG,KAAA,oBAAA,MAAA;GAAc,WAAA;aACXH;EAQE,CAAA;EAAAL,EAAA,KAAAK;EAAAL,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAI,MAAAJ,EAAA,OAAAQ,IAAA;EAXPC,KAAA,qBAAA,OAAA;GAAe,WAAA;aAAf,CACEL,IACAI,EAUI;;EAAAR,EAAA,KAAAI;EAAAJ,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAZNS;AAYM;AApBmB,SAAAF,MAAAG,MAAAC,OAAA;CAAA,OAYnB,oBAAA,MAAA;EAEY,WAAA;YAETD,KAAIG,UAAJ;CACE,GAJEH,KAAIE,MAAJD,KAIF;AAAA"}
1
+ {"version":3,"file":"ComposerQueue.js","names":["SectionLabel","ComposerQueueItem","ComposerQueue","t0","$","_c","queue","length","t1","t2","map","_temp","t3","t4","item","index","id","prompt"],"sources":["../../../src/views/thread/ComposerQueue.tsx"],"sourcesContent":["import { SectionLabel } from \"../ui\";\nimport type { ComposerQueueItem } from \"./types\";\n\nexport const ComposerQueue = ({\n queue,\n}: {\n queue: readonly ComposerQueueItem[];\n}) => {\n if (!queue.length) return null;\n\n return (\n <div className=\"bg-card rounded-md border p-3\">\n <SectionLabel>Message queue ({queue.length})</SectionLabel>\n <ol className=\"text-foreground mt-1 list-decimal space-y-0.5 pl-5 text-[11px]\">\n {queue.map((item, index) => (\n <li\n key={item.id ?? index}\n className=\"wrap-break-word whitespace-pre-wrap\"\n >\n {item.prompt || \"(empty)\"}\n </li>\n ))}\n </ol>\n </div>\n );\n};\n"],"mappings":";;;;AAGA,MAAaE,iBAAgBC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,UAAAH;CAK5B,IAAI,CAACG,MAAKC,QAAO,OAAS;CAAK,IAAAC;CAAA,IAAAJ,EAAA,OAAAE,MAAAC,QAAA;EAI3BC,KAAA,qBAAC,cAAD,EAAA,UAAA;GAAc;GAAgBF,MAAKC;GAAQ;EAA9B,EAAA,CAAA;EAA8CH,EAAA,KAAAE,MAAAC;EAAAH,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAE,OAAA;EAExDG,KAAAH,MAAKI,IAAKC,KAOV;EAACP,EAAA,KAAAE;EAAAF,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAQ;CAAA,IAAAR,EAAA,OAAAK,IAAA;EARJG,KAAA,oBAAA,MAAA;GAAc,WAAA;GACXH,UAAAA;EAQE,CAAA;EAAAL,EAAA,KAAAK;EAAAL,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAI,MAAAJ,EAAA,OAAAQ,IAAA;EAXPC,KAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACEL,IACAI,EAUI;;EAAAR,EAAA,KAAAI;EAAAJ,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAZNS;AAYM;AApBmB,SAAAF,MAAAG,MAAAC,OAAA;CAAA,OAYnB,oBAAA,MAAA;EAEY,WAAA;EAETD,UAAAA,KAAIG,UAAJ;CACE,GAJEH,KAAIE,MAAJD,KAIF;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationList.js","names":["truncate","PaneHeader","RailTime","SelectableRow","ConversationStatusDot","ThreadListItemPreview","ThreadListPreview","parseThreadPreview","lastMessageAt","snapshots","Readonly","Record","threadId","fallback","raw","thread","messages","at","createdAt","conversationListHeader","threadList","regular","threadIds","length","archived","archivedThreadIds","ROW","ConversationRow","t0","$","_c","item","selected","mainThreadId","main","onSelect","T0","t1","t2","t3","t4","t5","t6","t7","t8","whenSource","title","trim","t9","id","t10","t11","t12","ConversationList","selectedId","threadItems","itemsById","Map","map","_temp","get","filter","_temp2","id_0","_temp3","item_2","item_3","item_0","Boolean","item_1"],"sources":["../../../src/views/thread/ConversationList.tsx"],"sourcesContent":["import { truncate } from \"../../utils/common\";\nimport { PaneHeader, RailTime, SelectableRow } from \"../ui\";\nimport { ConversationStatusDot } from \"./ConversationStatusDot\";\nimport type { ThreadListItemPreview, ThreadListPreview } from \"./types\";\nimport { parseThreadPreview } from \"./utils\";\n\nconst lastMessageAt = (\n snapshots: Readonly<Record<string, unknown>> | undefined,\n threadId: string,\n fallback?: string,\n) => {\n if (fallback) return fallback;\n const raw = snapshots?.[threadId];\n const thread = raw ? parseThreadPreview(raw) : null;\n return thread?.messages.at(-1)?.createdAt;\n};\n\nexport const conversationListHeader = (threadList: ThreadListPreview) => {\n const regular = threadList.threadIds.length;\n const archived = threadList.archivedThreadIds.length;\n\n return (\n <PaneHeader>\n {regular} conversation{regular === 1 ? \"\" : \"s\"}\n {archived ? ` · ${archived} archived` : null}\n </PaneHeader>\n );\n};\n\nconst ROW = \"flex h-8 items-center gap-1.5\";\n\nconst ConversationRow = ({\n item,\n selected,\n mainThreadId,\n main,\n snapshots,\n onSelect,\n}: {\n item: ThreadListItemPreview;\n selected: boolean;\n mainThreadId: string | undefined;\n main: ThreadListPreview[\"main\"];\n snapshots: Readonly<Record<string, unknown>> | undefined;\n onSelect: () => void;\n}) => {\n const title = item.title?.trim() || \"(untitled)\";\n const whenSource = lastMessageAt(snapshots, item.id, item.lastMessageAt);\n\n return (\n <SelectableRow selected={selected} onSelect={onSelect} dense>\n <div className={ROW} title={title}>\n <ConversationStatusDot\n item={item}\n mainThreadId={mainThreadId}\n main={main}\n snapshots={snapshots}\n />\n <span className=\"text-foreground min-w-0 flex-1 truncate text-[12px] font-medium\">\n {truncate(title, 64)}\n </span>\n {whenSource ? <RailTime value={whenSource} /> : null}\n </div>\n </SelectableRow>\n );\n};\n\nexport const ConversationList = ({\n threadList,\n snapshots,\n selectedId,\n onSelect,\n}: {\n threadList: ThreadListPreview;\n snapshots: Readonly<Record<string, unknown>> | undefined;\n selectedId: string;\n onSelect: (threadId: string) => void;\n}) => {\n const itemsById = new Map(\n threadList.threadItems.map((item) => [item.id, item]),\n );\n\n const regular = threadList.threadIds\n .map((id) => itemsById.get(id))\n .filter((item): item is ThreadListItemPreview => Boolean(item));\n\n const archived = threadList.archivedThreadIds\n .map((id) => itemsById.get(id))\n .filter((item): item is ThreadListItemPreview => Boolean(item));\n\n const mainThreadId = threadList.mainThreadId;\n const main = threadList.main;\n\n return (\n <>\n {regular.map((item) => (\n <ConversationRow\n key={item.id}\n item={item}\n selected={selectedId === item.id}\n mainThreadId={mainThreadId}\n main={main}\n snapshots={snapshots}\n onSelect={() => onSelect(item.id)}\n />\n ))}\n {archived.length ? (\n <div className=\"border-border border-t\">\n <div className=\"text-muted-foreground px-3 py-1 text-[9px] font-medium tracking-wide uppercase\">\n Archived\n </div>\n {archived.map((item) => (\n <ConversationRow\n key={item.id}\n item={item}\n selected={selectedId === item.id}\n mainThreadId={mainThreadId}\n main={main}\n snapshots={snapshots}\n onSelect={() => onSelect(item.id)}\n />\n ))}\n </div>\n ) : null}\n </>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ConversationList.js","names":["truncate","PaneHeader","RailTime","SelectableRow","ConversationStatusDot","ThreadListItemPreview","ThreadListPreview","parseThreadPreview","lastMessageAt","snapshots","Readonly","Record","threadId","fallback","raw","thread","messages","at","createdAt","conversationListHeader","threadList","regular","threadIds","length","archived","archivedThreadIds","ROW","ConversationRow","t0","$","_c","item","selected","mainThreadId","main","onSelect","T0","t1","t2","t3","t4","t5","t6","t7","t8","whenSource","title","trim","t9","id","t10","t11","t12","ConversationList","selectedId","threadItems","itemsById","Map","map","_temp","get","filter","_temp2","id_0","_temp3","item_2","item_3","item_0","Boolean","item_1"],"sources":["../../../src/views/thread/ConversationList.tsx"],"sourcesContent":["import { truncate } from \"../../utils/common\";\nimport { PaneHeader, RailTime, SelectableRow } from \"../ui\";\nimport { ConversationStatusDot } from \"./ConversationStatusDot\";\nimport type { ThreadListItemPreview, ThreadListPreview } from \"./types\";\nimport { parseThreadPreview } from \"./utils\";\n\nconst lastMessageAt = (\n snapshots: Readonly<Record<string, unknown>> | undefined,\n threadId: string,\n fallback?: string,\n) => {\n if (fallback) return fallback;\n const raw = snapshots?.[threadId];\n const thread = raw ? parseThreadPreview(raw) : null;\n return thread?.messages.at(-1)?.createdAt;\n};\n\nexport const conversationListHeader = (threadList: ThreadListPreview) => {\n const regular = threadList.threadIds.length;\n const archived = threadList.archivedThreadIds.length;\n\n return (\n <PaneHeader>\n {regular} conversation{regular === 1 ? \"\" : \"s\"}\n {archived ? ` · ${archived} archived` : null}\n </PaneHeader>\n );\n};\n\nconst ROW = \"flex h-8 items-center gap-1.5\";\n\nconst ConversationRow = ({\n item,\n selected,\n mainThreadId,\n main,\n snapshots,\n onSelect,\n}: {\n item: ThreadListItemPreview;\n selected: boolean;\n mainThreadId: string | undefined;\n main: ThreadListPreview[\"main\"];\n snapshots: Readonly<Record<string, unknown>> | undefined;\n onSelect: () => void;\n}) => {\n const title = item.title?.trim() || \"(untitled)\";\n const whenSource = lastMessageAt(snapshots, item.id, item.lastMessageAt);\n\n return (\n <SelectableRow selected={selected} onSelect={onSelect} dense>\n <div className={ROW} title={title}>\n <ConversationStatusDot\n item={item}\n mainThreadId={mainThreadId}\n main={main}\n snapshots={snapshots}\n />\n <span className=\"text-foreground min-w-0 flex-1 truncate text-[12px] font-medium\">\n {truncate(title, 64)}\n </span>\n {whenSource ? <RailTime value={whenSource} /> : null}\n </div>\n </SelectableRow>\n );\n};\n\nexport const ConversationList = ({\n threadList,\n snapshots,\n selectedId,\n onSelect,\n}: {\n threadList: ThreadListPreview;\n snapshots: Readonly<Record<string, unknown>> | undefined;\n selectedId: string;\n onSelect: (threadId: string) => void;\n}) => {\n const itemsById = new Map(\n threadList.threadItems.map((item) => [item.id, item]),\n );\n\n const regular = threadList.threadIds\n .map((id) => itemsById.get(id))\n .filter((item): item is ThreadListItemPreview => Boolean(item));\n\n const archived = threadList.archivedThreadIds\n .map((id) => itemsById.get(id))\n .filter((item): item is ThreadListItemPreview => Boolean(item));\n\n const mainThreadId = threadList.mainThreadId;\n const main = threadList.main;\n\n return (\n <>\n {regular.map((item) => (\n <ConversationRow\n key={item.id}\n item={item}\n selected={selectedId === item.id}\n mainThreadId={mainThreadId}\n main={main}\n snapshots={snapshots}\n onSelect={() => onSelect(item.id)}\n />\n ))}\n {archived.length ? (\n <div className=\"border-border border-t\">\n <div className=\"text-muted-foreground px-3 py-1 text-[9px] font-medium tracking-wide uppercase\">\n Archived\n </div>\n {archived.map((item) => (\n <ConversationRow\n key={item.id}\n item={item}\n selected={selectedId === item.id}\n mainThreadId={mainThreadId}\n main={main}\n snapshots={snapshots}\n onSelect={() => onSelect(item.id)}\n />\n ))}\n </div>\n ) : null}\n </>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadDetails.js","names":["formatBoolean","MessageList","Chip","InfoCard","SummaryItem","SummaryList","ComposerAttachments","ComposerFlags","ComposerQueue","ThreadPreview","ThreadDetails","t0","$","_c","thread","title","t1","t2","String","messages","length","t3","t4","isLoading","t5","isRunning","t6","isDisabled","undefined","t7","t8","t9","capabilities","map","_temp","t10","t11","suggestions","_temp2","t12","composer","role","textLength","attachments","type","queue","t13","capability","suggestion","index","prompt"],"sources":["../../../src/views/thread/ThreadDetails.tsx"],"sourcesContent":["import { formatBoolean } from \"../../utils/common\";\nimport { MessageList } from \"../message\";\nimport { Chip, InfoCard, SummaryItem, SummaryList } from \"../ui\";\nimport { ComposerAttachments } from \"./ComposerAttachments\";\nimport { ComposerFlags } from \"./ComposerFlags\";\nimport { ComposerQueue } from \"./ComposerQueue\";\nimport type { ThreadPreview } from \"./types\";\n\nexport const ThreadDetails = ({\n thread,\n title,\n}: {\n thread: ThreadPreview;\n title?: string;\n}) => (\n <div className=\"flex flex-col gap-6\">\n <InfoCard title={title ?? \"Thread\"}>\n <SummaryList>\n <SummaryItem label=\"Messages\" value={String(thread.messages.length)} />\n {typeof thread.isLoading === \"boolean\" ? (\n <SummaryItem\n label=\"Loading\"\n value={formatBoolean(thread.isLoading) ?? \"—\"}\n />\n ) : null}\n {typeof thread.isRunning === \"boolean\" ? (\n <SummaryItem\n label=\"Running\"\n value={formatBoolean(thread.isRunning) ?? \"—\"}\n />\n ) : null}\n {thread.isDisabled !== undefined ? (\n <SummaryItem\n label=\"Disabled\"\n value={formatBoolean(thread.isDisabled) ?? \"—\"}\n />\n ) : null}\n </SummaryList>\n </InfoCard>\n\n {thread.capabilities.length ? (\n <InfoCard title=\"Capabilities\" count={thread.capabilities.length}>\n <div className=\"flex flex-wrap gap-1.5\">\n {thread.capabilities.map((capability) => (\n <Chip key={capability}>{capability}</Chip>\n ))}\n </div>\n </InfoCard>\n ) : null}\n\n <MessageList messages={thread.messages} />\n\n {thread.suggestions.length ? (\n <InfoCard title=\"Suggestions\" count={thread.suggestions.length}>\n <ul className=\"text-foreground list-disc space-y-1 pl-4 text-[12px]\">\n {thread.suggestions.map((suggestion, index) => (\n <li key={index}>{suggestion.prompt || \"(empty)\"}</li>\n ))}\n </ul>\n </InfoCard>\n ) : null}\n\n {thread.composer ? (\n <InfoCard title=\"Composer\">\n <SummaryList>\n <SummaryItem label=\"Role\" value={thread.composer.role ?? \"—\"} />\n <SummaryItem\n label=\"Text length\"\n value={String(thread.composer.textLength)}\n />\n <SummaryItem\n label=\"Attachments\"\n value={String(thread.composer.attachments.length)}\n />\n {typeof thread.composer.type === \"string\" ? (\n <SummaryItem label=\"Mode\" value={thread.composer.type} />\n ) : null}\n </SummaryList>\n <ComposerFlags composer={thread.composer} />\n <ComposerAttachments attachments={thread.composer.attachments} />\n <ComposerQueue queue={thread.composer.queue} />\n </InfoCard>\n ) : null}\n </div>\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadDetails.js","names":["formatBoolean","MessageList","Chip","InfoCard","SummaryItem","SummaryList","ComposerAttachments","ComposerFlags","ComposerQueue","ThreadPreview","ThreadDetails","t0","$","_c","thread","title","t1","t2","String","messages","length","t3","t4","isLoading","t5","isRunning","t6","isDisabled","undefined","t7","t8","t9","capabilities","map","_temp","t10","t11","suggestions","_temp2","t12","composer","role","textLength","attachments","type","queue","t13","capability","suggestion","index","prompt"],"sources":["../../../src/views/thread/ThreadDetails.tsx"],"sourcesContent":["import { formatBoolean } from \"../../utils/common\";\nimport { MessageList } from \"../message\";\nimport { Chip, InfoCard, SummaryItem, SummaryList } from \"../ui\";\nimport { ComposerAttachments } from \"./ComposerAttachments\";\nimport { ComposerFlags } from \"./ComposerFlags\";\nimport { ComposerQueue } from \"./ComposerQueue\";\nimport type { ThreadPreview } from \"./types\";\n\nexport const ThreadDetails = ({\n thread,\n title,\n}: {\n thread: ThreadPreview;\n title?: string;\n}) => (\n <div className=\"flex flex-col gap-6\">\n <InfoCard title={title ?? \"Thread\"}>\n <SummaryList>\n <SummaryItem label=\"Messages\" value={String(thread.messages.length)} />\n {typeof thread.isLoading === \"boolean\" ? (\n <SummaryItem\n label=\"Loading\"\n value={formatBoolean(thread.isLoading) ?? \"—\"}\n />\n ) : null}\n {typeof thread.isRunning === \"boolean\" ? (\n <SummaryItem\n label=\"Running\"\n value={formatBoolean(thread.isRunning) ?? \"—\"}\n />\n ) : null}\n {thread.isDisabled !== undefined ? (\n <SummaryItem\n label=\"Disabled\"\n value={formatBoolean(thread.isDisabled) ?? \"—\"}\n />\n ) : null}\n </SummaryList>\n </InfoCard>\n\n {thread.capabilities.length ? (\n <InfoCard title=\"Capabilities\" count={thread.capabilities.length}>\n <div className=\"flex flex-wrap gap-1.5\">\n {thread.capabilities.map((capability) => (\n <Chip key={capability}>{capability}</Chip>\n ))}\n </div>\n </InfoCard>\n ) : null}\n\n <MessageList messages={thread.messages} />\n\n {thread.suggestions.length ? (\n <InfoCard title=\"Suggestions\" count={thread.suggestions.length}>\n <ul className=\"text-foreground list-disc space-y-1 pl-4 text-[12px]\">\n {thread.suggestions.map((suggestion, index) => (\n <li key={index}>{suggestion.prompt || \"(empty)\"}</li>\n ))}\n </ul>\n </InfoCard>\n ) : null}\n\n {thread.composer ? (\n <InfoCard title=\"Composer\">\n <SummaryList>\n <SummaryItem label=\"Role\" value={thread.composer.role ?? \"—\"} />\n <SummaryItem\n label=\"Text length\"\n value={String(thread.composer.textLength)}\n />\n <SummaryItem\n label=\"Attachments\"\n value={String(thread.composer.attachments.length)}\n />\n {typeof thread.composer.type === \"string\" ? (\n <SummaryItem label=\"Mode\" value={thread.composer.type} />\n ) : null}\n </SummaryList>\n <ComposerFlags composer={thread.composer} />\n <ComposerAttachments attachments={thread.composer.attachments} />\n <ComposerQueue queue={thread.composer.queue} />\n </InfoCard>\n ) : null}\n </div>\n);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Transcript.js","names":["memo","useCallback","useEffect","useMemo","useRef","useState","clsx","truncate","StatusBadge","MessagePreview","PartPreview","messageStepCount","RoleLabel","Chip","PaneHeader","PaneHeaderStack","RailTime","RAIL_STATUS_BADGE_CLASS","SelectableRow","Sparkline","ToneBadge","ComposerPreview","ThreadPreview","MetricSeries","label","values","format","value","messageNodeId","id","formatTokens","toFixed","String","textOf","parts","filter","part","Extract","type","map","text","join","trim","rowSummary","message","tool","find","toolName","rowStepHint","tools","texts","hints","push","length","railStatus","isOptimistic","status","railAttachmentCount","attachments","TurnRow","t0","$","_c","selected","nodeId","onSelect","rowRef","t1","t2","summary","t3","stepHint","attachmentCount","t4","t5","t6","role","t7","reason","undefined","t8","t9","t10","createdAt","t11","t12","t13","t14","t15","t16","GhostComposer","composer","Symbol","for","textLength","canSend","queue","collect","messages","pick","metricSeries","timing","tokensPerSecond","firstTokenTime","streamStartTime","Math","round","usage","outputTokens","series","TranscriptHeader","thread","expanded","setExpanded","reduce","_temp2","_temp3","errors","tokens","_temp4","Boolean","statParts","trendSeries","stats","canExpand","isRunning","_temp5","titleRow","t17","_temp6","t18","Transcript","selection","selectedRef","prevSelectionRef","handleSelect","current","scrollIntoView","block","nodeId_0","_temp","sum","message_0","sum_0","message_1","inputTokens","prev","entry"],"sources":["../../../src/views/thread/Transcript.tsx"],"sourcesContent":["import { memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { truncate } from \"../../utils/common\";\nimport { StatusBadge } from \"../message\";\nimport type { MessagePreview, PartPreview } from \"../message\";\nimport { messageStepCount } from \"../message/MessageTimeline\";\nimport { RoleLabel } from \"../message/RoleLabel\";\nimport {\n Chip,\n PaneHeader,\n PaneHeaderStack,\n RailTime,\n RAIL_STATUS_BADGE_CLASS,\n SelectableRow,\n Sparkline,\n ToneBadge,\n} from \"../ui\";\nimport type { ComposerPreview, ThreadPreview } from \"./types\";\n\ninterface MetricSeries {\n label: string;\n values: number[];\n format: (value: number) => string;\n}\n\nexport const messageNodeId = (id: string) => `msg:${id}`;\n\nconst formatTokens = (value: number) =>\n value >= 1000 ? `${(value / 1000).toFixed(1)}k` : String(value);\n\nconst textOf = (parts: readonly PartPreview[]) =>\n parts\n .filter(\n (part): part is Extract<PartPreview, { type: \"text\" }> =>\n part.type === \"text\",\n )\n .map((part) => part.text)\n .join(\"\\n\")\n .trim();\n\nconst rowSummary = (message: MessagePreview) => {\n const text = textOf(message.parts);\n if (text) return truncate(text, 72);\n const tool = message.parts.find(\n (part): part is Extract<PartPreview, { type: \"tool-call\" }> =>\n part.type === \"tool-call\",\n );\n if (tool) return tool.toolName;\n return \"—\";\n};\n\nconst rowStepHint = (message: MessagePreview) => {\n const { tools, texts } = messageStepCount(message.parts);\n const hints: string[] = [];\n if (tools > 1) hints.push(`${tools} tools`);\n if (texts > 1) hints.push(`${texts} msgs`);\n return hints.length ? hints.join(\" · \") : null;\n};\n\nconst railStatus = (message: MessagePreview) => {\n if (message.isOptimistic) return null;\n if (!message.status || message.status.type === \"complete\") return null;\n return message.status;\n};\n\nconst railAttachmentCount = (message: MessagePreview) => {\n if (message.attachments.length > 0) return message.attachments.length;\n return message.parts.filter(\n (part) =>\n part.type === \"image\" || part.type === \"file\" || part.type === \"audio\",\n ).length;\n};\n\nconst TurnRow = memo(function TurnRow({\n message,\n selected,\n nodeId,\n onSelect,\n rowRef,\n}: {\n message: MessagePreview;\n selected: boolean;\n nodeId: string;\n onSelect: (nodeId: string) => void;\n rowRef?: React.Ref<HTMLButtonElement> | undefined;\n}) {\n const status = railStatus(message);\n const summary = rowSummary(message);\n const stepHint = rowStepHint(message);\n const attachmentCount = railAttachmentCount(message);\n\n return (\n <SelectableRow\n ref={rowRef}\n selected={selected}\n onSelect={() => onSelect(nodeId)}\n dense\n >\n <div\n className=\"flex h-10 flex-col justify-center gap-0.5\"\n title={stepHint ? `${stepHint}\\n${summary}` : summary}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-2\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <RoleLabel role={message.role} compact />\n {message.isOptimistic ? (\n <ToneBadge\n tone=\"amber\"\n size=\"sm\"\n className={RAIL_STATUS_BADGE_CLASS}\n >\n opt\n </ToneBadge>\n ) : status ? (\n <StatusBadge\n type={status.type}\n reason={\"reason\" in status ? status.reason : undefined}\n compact\n size=\"sm\"\n className={RAIL_STATUS_BADGE_CLASS}\n />\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {attachmentCount > 0 ? (\n <span\n className=\"text-muted-foreground text-[10px] leading-none\"\n title={`${attachmentCount} attachment${attachmentCount === 1 ? \"\" : \"s\"}`}\n >\n 📎{attachmentCount}\n </span>\n ) : null}\n <RailTime value={message.createdAt} />\n </div>\n </div>\n <p className=\"text-foreground min-w-0 truncate text-[12px] leading-tight\">\n {stepHint ? (\n <span className=\"text-muted-foreground\">{stepHint} · </span>\n ) : null}\n {summary}\n </p>\n </div>\n </SelectableRow>\n );\n});\n\nconst GhostComposer = ({ composer }: { composer: ComposerPreview }) => (\n <div className=\"border-border text-muted-foreground flex items-center gap-2 border-t px-3 py-2 text-[11px]\">\n <span className=\"text-foreground font-medium\">draft</span>\n <span>{composer.role ?? \"user\"}</span>\n <span>· {composer.textLength} chars</span>\n {composer.canSend ? <Chip>can send</Chip> : null}\n {composer.queue.length ? <Chip>{composer.queue.length} queued</Chip> : null}\n </div>\n);\n\nconst collect = (\n messages: readonly MessagePreview[],\n pick: (message: MessagePreview) => number | undefined,\n): number[] =>\n messages.map(pick).filter((value): value is number => value !== undefined);\n\nconst metricSeries = (messages: readonly MessagePreview[]): MetricSeries[] =>\n [\n {\n label: \"tok/s\",\n values: collect(messages, (message) => message.timing?.tokensPerSecond),\n format: (value: number) => value.toFixed(1),\n },\n {\n label: \"TTFT\",\n values: collect(messages, (message) =>\n message.timing?.firstTokenTime !== undefined &&\n message.timing?.streamStartTime !== undefined\n ? message.timing.firstTokenTime - message.timing.streamStartTime\n : undefined,\n ),\n format: (value: number) => `${Math.round(value)}ms`,\n },\n {\n label: \"output\",\n values: collect(messages, (message) => message.usage?.outputTokens),\n format: (value: number) => String(value),\n },\n ].filter((series) => series.values.length >= 3);\n\nexport const TranscriptHeader = memo(function TranscriptHeader({\n thread,\n}: {\n thread: ThreadPreview;\n}) {\n const [expanded, setExpanded] = useState(false);\n const messages = thread.messages;\n\n const { stats, series, canExpand } = useMemo(() => {\n const tools = messages.reduce(\n (sum, message) =>\n sum + message.parts.filter((part) => part.type === \"tool-call\").length,\n 0,\n );\n const errors = messages.filter(\n (message) => message.status?.type === \"incomplete\",\n ).length;\n const tokens = messages.reduce(\n (sum, message) =>\n sum +\n (message.usage\n ? message.usage.inputTokens + message.usage.outputTokens\n : 0),\n 0,\n );\n\n const statParts = [\n `${messages.length} msg${messages.length === 1 ? \"\" : \"s\"}`,\n tokens ? `${formatTokens(tokens)} tok` : null,\n tools ? `${tools} tool${tools === 1 ? \"\" : \"s\"}` : null,\n errors ? `${errors} err` : null,\n ].filter(Boolean);\n\n const trendSeries = metricSeries(messages);\n\n return {\n stats: statParts,\n series: trendSeries,\n canExpand: trendSeries.length > 0,\n };\n }, [messages]);\n\n const titleRow = (\n <PaneHeader\n borderless={canExpand && expanded}\n trailing={\n <>\n {thread.isRunning ? (\n <ToneBadge tone=\"blue\" size=\"sm\">\n running\n </ToneBadge>\n ) : null}\n {canExpand ? (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"text-muted-foreground hover:text-foreground text-[11px] leading-none\"\n >\n <span\n className={clsx(\n \"inline-block transition-transform\",\n expanded && \"rotate-90\",\n )}\n >\n ›\n </span>{\" \"}\n trends\n </button>\n ) : null}\n </>\n }\n >\n {stats.join(\" · \")}\n </PaneHeader>\n );\n\n if (canExpand && expanded) {\n return (\n <PaneHeaderStack header={titleRow}>\n {series.map((entry) => (\n <div\n key={entry.label}\n className=\"flex items-center justify-between gap-3 px-3 py-1.5\"\n >\n <div className=\"flex flex-col\">\n <span className=\"text-muted-foreground text-[10px]\">\n {entry.label}\n </span>\n <span className=\"text-foreground text-[12px] font-medium tabular-nums\">\n {entry.format(entry.values[entry.values.length - 1]!)}\n </span>\n </div>\n <Sparkline values={entry.values} className=\"h-6 w-24\" />\n </div>\n ))}\n </PaneHeaderStack>\n );\n }\n\n return titleRow;\n});\n\nexport const Transcript = ({\n thread,\n selection,\n onSelect,\n}: {\n thread: ThreadPreview;\n selection: string | null;\n onSelect: (nodeId: string) => void;\n}) => {\n const selectedRef = useRef<HTMLButtonElement>(null);\n const prevSelectionRef = useRef(selection);\n const handleSelect = useCallback(\n (nodeId: string) => onSelect(nodeId),\n [onSelect],\n );\n\n useEffect(() => {\n if (prevSelectionRef.current === selection) return;\n prevSelectionRef.current = selection;\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selection]);\n\n return (\n <>\n {thread.messages.map((message) => {\n const nodeId = messageNodeId(message.id);\n const selected = selection === nodeId;\n return (\n <TurnRow\n key={message.id}\n message={message}\n nodeId={nodeId}\n selected={selected}\n onSelect={handleSelect}\n rowRef={selected ? selectedRef : undefined}\n />\n );\n })}\n {thread.composer && thread.composer.textLength > 0 ? (\n <GhostComposer composer={thread.composer} />\n ) : null}\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAyBA,MAAa4B,iBAAiBC,OAAe,OAAOA;AAEpD,MAAMC,gBAAgBH,UACpBA,SAAS,MAAO,IAAIA,QAAQ,IAAA,CAAMI,QAAQ,CAAC,EAAC,KAAMC,OAAOL,KAAK;AAEhE,MAAMM,UAAUC,UACdA,MACGC,QACEC,SACCA,KAAKE,SAAS,MAClB,CAAC,CACAC,KAAKH,SAASA,KAAKI,IAAI,CAAC,CACxBC,KAAK,IAAI,CAAC,CACVC,KAAK;AAEV,MAAMC,cAAcC,YAA4B;CAC9C,MAAMJ,OAAOP,OAAOW,QAAQV,KAAK;CACjC,IAAIM,MAAM,OAAOjC,SAASiC,MAAM,EAAE;CAClC,MAAMK,OAAOD,QAAQV,MAAMY,MACxBV,SACCA,KAAKE,SAAS,WAClB;CACA,IAAIO,MAAM,OAAOA,KAAKE;CACtB,OAAO;AACT;AAEA,MAAMC,eAAeJ,YAA4B;CAC/C,MAAM,EAAEK,OAAOC,UAAUvC,iBAAiBiC,QAAQV,KAAK;CACvD,MAAMiB,QAAkB,CAAA;CACxB,IAAIF,QAAQ,GAAGE,MAAMC,KAAK,GAAGH,MAAK,OAAQ;CAC1C,IAAIC,QAAQ,GAAGC,MAAMC,KAAK,GAAGF,MAAK,MAAO;CACzC,OAAOC,MAAME,SAASF,MAAMV,KAAK,KAAK,IAAI;AAC5C;AAEA,MAAMa,cAAcV,YAA4B;CAC9C,IAAIA,QAAQW,cAAc,OAAO;CACjC,IAAI,CAACX,QAAQY,UAAUZ,QAAQY,OAAOlB,SAAS,YAAY,OAAO;CAClE,OAAOM,QAAQY;AACjB;AAEA,MAAMC,uBAAuBb,YAA4B;CACvD,IAAIA,QAAQc,YAAYL,SAAS,GAAG,OAAOT,QAAQc,YAAYL;CAC/D,OAAOT,QAAQV,MAAMC,QAClBC,SACCA,KAAKE,SAAS,WAAWF,KAAKE,SAAS,UAAUF,KAAKE,SAAS,OACnE,CAAC,CAACe;AACJ;AAEA,MAAMM,UAAU3D,KAAK,SAAA2D,QAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAiB,MAAA,EAAAlB,SAAAmB,UAAAC,QAAAC,UAAAC,WAAAN;CAYrC,IAAAO;CAAA,IAAAN,EAAA,OAAAjB,SAAA;EACgBuB,KAAAb,WAAWV,OAAO;EAACiB,EAAA,KAAAjB;EAAAiB,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAlC,MAAAL,SAAeW;CAAoB,IAAAC;CAAA,IAAAP,EAAA,OAAAjB,SAAA;EACnBwB,KAAAzB,WAAWC,OAAO;EAACiB,EAAA,KAAAjB;EAAAiB,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAnC,MAAAQ,UAAgBD;CAAoB,IAAAE;CAAA,IAAAT,EAAA,OAAAjB,SAAA;EACnB0B,KAAAtB,YAAYJ,OAAO;EAACiB,EAAA,KAAAjB;EAAAiB,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAArC,MAAAU,WAAiBD;CACjB,MAAAE,kBAAwBf,oBAAoBb,OAAO;CAAE,IAAA6B;CAAA,IAAAZ,EAAA,OAAAG,UAAAH,EAAA,OAAAI,UAAA;EAMvCQ,WAAMR,SAASD,MAAM;EAACH,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAKvB,MAAAa,KAAAH,WAAA,GAAcA,SAAQ,IAAKF,YAA3BA;CAA8C,IAAAM;CAAA,IAAAd,EAAA,OAAAjB,QAAAgC,MAAA;EAIjDD,KAAA,oBAAC,WAAD;GAAiB,MAAA/B,QAAOgC;GAAO,SAAA;EAAO,CAAA;EAAGf,EAAA,KAAAjB,QAAAgC;EAAAf,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,IAAAgB;CAAA,IAAAhB,EAAA,QAAAjB,QAAAW,gBAAAM,EAAA,QAAAL,QAAA;EACxCqB,KAAAjC,QAAOW,eACN,oBAAC,WAAD;GACO,MAAA;GACA,MAAA;GACMtC,WAAAA;aACZ;EAJS,CAAA,IAORuC,SACF,oBAAC,aAAD;GACQ,MAAAA,OAAMlB;GACJ,QAAA,YAAYkB,SAASA,OAAMsB,SAA3BC,KAAAA;GACR,SAAA;GACK,MAAA;GACM9D,WAAAA;EAAuB,CAAA,IANlC;EAQI4C,EAAA,MAAAjB,QAAAW;EAAAM,EAAA,MAAAL;EAAAK,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAAA,IAAAmB;CAAA,IAAAnB,EAAA,QAAAc,MAAAd,EAAA,QAAAgB,IAAA;EAlBVG,KAAA,qBAAA,OAAA;GAAe,WAAA;aAAf,CACEL,IACCE,EAiBG;;EAAAhB,EAAA,MAAAc;EAAAd,EAAA,MAAAgB;EAAAhB,EAAA,MAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAAA,IAAAoB;CAAA,IAAApB,EAAA,QAAAW,iBAAA;EAEHS,KAAAT,kBAAkB,IACjB,qBAAA,QAAA;GACY,WAAA;GACH,OAAA,GAAGA,gBAAe,aAAcA,oBAAoB,IAApB,KAAA;aAFzC,CAGC,MACIA,eACE;OANR;EAOOX,EAAA,MAAAW;EAAAX,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAAA,IAAAqB;CAAA,IAAArB,EAAA,QAAAjB,QAAAuC,WAAA;EACRD,MAAA,oBAAC,UAAD,EAAiB,OAAAtC,QAAOuC,UAAU,CAAA;EAAItB,EAAA,MAAAjB,QAAAuC;EAAAtB,EAAA,MAAAqB;CAAA,OAAAA,MAAArB,EAAA;CAAA,IAAAuB;CAAA,IAAAvB,EAAA,QAAAqB,OAAArB,EAAA,QAAAoB,IAAA;EATxCG,MAAA,qBAAA,OAAA;GAAe,WAAA;aAAf,CACGH,IAQDC,GACI;;EAAArB,EAAA,MAAAqB;EAAArB,EAAA,MAAAoB;EAAApB,EAAA,MAAAuB;CAAA,OAAAA,MAAAvB,EAAA;CAAA,IAAAwB;CAAA,IAAAxB,EAAA,QAAAuB,OAAAvB,EAAA,QAAAmB,IAAA;EA/BRK,MAAA,qBAAA,OAAA;GAAe,WAAA;aAAf,CACEL,IAoBAI,GAWI;;EAAAvB,EAAA,MAAAuB;EAAAvB,EAAA,MAAAmB;EAAAnB,EAAA,MAAAwB;CAAA,OAAAA,MAAAxB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAAU,UAAA;EAEHe,MAAAf,WACC,qBAAA,QAAA;GAAgB,WAAA;aAAhB,CAAyCA,UAAS,KAAU;OAD7D;EAEOV,EAAA,MAAAU;EAAAV,EAAA,MAAAyB;CAAA,OAAAA,MAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,QAAAQ,WAAAR,EAAA,QAAAyB,KAAA;EAHVC,MAAA,qBAAA,KAAA;GAAa,WAAA;aAAb,CACGD,KAGAjB,OACC;;EAAAR,EAAA,MAAAQ;EAAAR,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;CAAA,OAAAA,MAAA1B,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAAwB,OAAAxB,EAAA,QAAA0B,OAAA1B,EAAA,QAAAa,IAAA;EA1CNc,MAAA,qBAAA,OAAA;GACY,WAAA;GACH,OAAAd;aAFT,CAIEW,KAiCAE,GAMI;;EAAA1B,EAAA,MAAAwB;EAAAxB,EAAA,MAAA0B;EAAA1B,EAAA,MAAAa;EAAAb,EAAA,MAAA2B;CAAA,OAAAA,MAAA3B,EAAA;CAAA,IAAA4B;CAAA,IAAA5B,EAAA,QAAAK,UAAAL,EAAA,QAAAE,YAAAF,EAAA,QAAA2B,OAAA3B,EAAA,QAAAY,IAAA;EAjDRgB,MAAA,oBAAC,eAAD;GACOvB,KAAAA;GACKH;GACA,UAAAU;GACV,OAAA;aAEAe;EANY,CAAA;EAkDE3B,EAAA,MAAAK;EAAAL,EAAA,MAAAE;EAAAF,EAAA,MAAA2B;EAAA3B,EAAA,MAAAY;EAAAZ,EAAA,MAAA4B;CAAA,OAAAA,MAAA5B,EAAA;CAAA,OAlDhB4B;AAkDgB,CAEnB;AAED,MAAMC,iBAAgB9B,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAA6B,aAAA/B;CAA2C,IAAAO;CAAA,IAAAN,EAAA,OAAA+B,OAAAC,IAAA,2BAAA,GAAA;EAE9D1B,KAAA,oBAAA,QAAA;GAAgB,WAAA;aAA8B;EAAY,CAAA;EAAAN,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CACnD,MAAAO,KAAAuB,SAAQf,QAAR;CAAuB,IAAAN;CAAA,IAAAT,EAAA,OAAAO,IAAA;EAA9BE,KAAA,oBAAA,QAAA,EAAA,UAAOF,GAA+B,CAAA;EAAAP,EAAA,KAAAO;EAAAP,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAA8B,SAAAG,YAAA;EACtCrB,KAAA,qBAAA,QAAA,EAAA,UAAA;GAAM;GAAGkB,SAAQG;GAAY;EAAa,EAAA,CAAA;EAAAjC,EAAA,KAAA8B,SAAAG;EAAAjC,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAa;CAAA,IAAAb,EAAA,OAAA8B,SAAAI,SAAA;EACzCrB,KAAAiB,SAAQI,UAAW,oBAAC,MAAD,EAAA,UAAM,WAAD,CAAA,IAAxB;EAA+ClC,EAAA,KAAA8B,SAAAI;EAAAlC,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,OAAA8B,SAAAK,MAAA3C,QAAA;EAC/CsB,KAAAgB,SAAQK,MAAM3C,SAAU,qBAAC,MAAD,EAAA,UAAA,CAAOsC,SAAQK,MAAM3C,QAAQ,SAAxB,EAAA,CAAA,IAA7B;EAA0EQ,EAAA,KAAA8B,SAAAK,MAAA3C;EAAAQ,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,IAAAgB;CAAA,IAAAhB,EAAA,OAAAS,MAAAT,EAAA,QAAAY,MAAAZ,EAAA,QAAAa,MAAAb,EAAA,QAAAc,IAAA;EAL7EE,KAAA,qBAAA,OAAA;GAAe,WAAA;aAAf;IACEV;IACAG;IACAG;IACCC;IACAC;GACG;;EAAAd,EAAA,KAAAS;EAAAT,EAAA,MAAAY;EAAAZ,EAAA,MAAAa;EAAAb,EAAA,MAAAc;EAAAd,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAAA,OANNgB;AAMM;AAGR,MAAMoB,WACJC,UACAC,SAEAD,SAAS3D,IAAI4D,IAAI,CAAC,CAAChE,QAAQR,UAA2BA,UAAUoD,KAAAA,CAAS;AAE3E,MAAMqB,gBAAgBF,aACpB;CACE;EACE1E,OAAO;EACPC,QAAQwE,QAAQC,WAAWtD,YAAYA,QAAQyD,QAAQC,eAAe;EACtE5E,SAASC,UAAkBA,MAAMI,QAAQ,CAAC;CAC5C;CACA;EACEP,OAAO;EACPC,QAAQwE,QAAQC,WAAWtD,YACzBA,QAAQyD,QAAQE,mBAAmBxB,KAAAA,KACnCnC,QAAQyD,QAAQG,oBAAoBzB,KAAAA,IAChCnC,QAAQyD,OAAOE,iBAAiB3D,QAAQyD,OAAOG,kBAC/CzB,KAAAA,CACN;EACArD,SAASC,UAAkB,GAAG8E,KAAKC,MAAM/E,KAAK,EAAC;CACjD;CACA;EACEH,OAAO;EACPC,QAAQwE,QAAQC,WAAWtD,YAAYA,QAAQ+D,OAAOC,YAAY;EAClElF,SAASC,UAAkBK,OAAOL,KAAK;CACzC;AAAC,CACF,CAACQ,QAAQ0E,WAAWA,OAAOpF,OAAO4B,UAAU,CAAC;AAEhD,MAAayD,mBAAmB9G,KAAK,SAAA8G,iBAAAlD,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAA0B,MAAA,EAAAiD,WAAAnD;CAK7D,MAAA,CAAAoD,UAAAC,eAAgC5G,SAAS,KAAK;CAC9C,MAAA6F,WAAiBa,OAAMb;CAAU,IAAA/B;CAAA,IAAAN,EAAA,OAAAqC,UAAA;EAGjB/B,KAAA+B,SAAQgB,OACpBC,QAEA,CACF;EAACtD,EAAA,KAAAqC;EAAArC,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAJD,MAAAZ,QAAckB;CAIZ,IAAAC;CAAA,IAAAP,EAAA,OAAAqC,UAAA;EACa9B,KAAA8B,SAAQ/D,OACrBiF,MACF;EAACvD,EAAA,KAAAqC;EAAArC,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAFD,MAAAwD,SAAejD,GAEdf;CAAQ,IAAAiB;CAAA,IAAAG;CAAA,IAAAZ,EAAA,OAAAqC,UAAA;EACT,MAAAoB,SAAepB,SAAQgB,OACrBK,QAKA,CACF;EAGEjD,KAAA,GAAG4B,SAAQ7C,OAAO,MAAO6C,SAAQ7C,WAAY,IAApB,KAAA;EACzBoB,KAAA6C,SAAA,GAAYxF,aAAawF,MAAM,EAAC,QAAhC;EAA6CzD,EAAA,KAAAqC;EAAArC,EAAA,KAAAS;EAAAT,EAAA,KAAAY;CAAA,OAAA;EAAAH,KAAAT,EAAA;EAAAY,KAAAZ,EAAA;CAAA;CAC7C,MAAAa,KAAAzB,QAAA,GAAWA,MAAK,OAAQA,UAAU,IAAV,KAAA,QAAxB;CACA,MAAA0B,KAAA0C,SAAA,GAAYA,OAAM,QAAlB;CAA+B,IAAAxC;CAAA,IAAAhB,EAAA,OAAAS,MAAAT,EAAA,OAAAY,MAAAZ,EAAA,OAAAa,MAAAb,EAAA,QAAAc,IAAA;EAJfE,KAAA;GAChBP;GACAG;GACAC;GACAC;EAA+B,CAChC,CAAAxC,OAAQqF,OAAO;EAAC3D,EAAA,KAAAS;EAAAT,EAAA,KAAAY;EAAAZ,EAAA,KAAAa;EAAAb,EAAA,MAAAc;EAAAd,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CALjB,MAAA4D,YAAkB5C;CAKA,IAAAG;CAAA,IAAAnB,EAAA,QAAAqC,UAAA;EAEElB,KAAAoB,aAAaF,QAAQ;EAACrC,EAAA,MAAAqC;EAAArC,EAAA,MAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAA1C,MAAA6D,cAAoB1C;CAKP,MAAAC,KAAAyC,YAAWrE,SAAU;CAAC,IAAA6B;CAAA,IAAArB,EAAA,QAAA4D,aAAA5D,EAAA,QAAAoB,MAAApB,EAAA,QAAA6D,aAAA;EAH5BxC,MAAA;GAAAyC,OACEF;GAASZ,QACRa;GAAWE,WACR3C;EACb;EAACpB,EAAA,MAAA4D;EAAA5D,EAAA,MAAAoB;EAAApB,EAAA,MAAA6D;EAAA7D,EAAA,MAAAqB;CAAA,OAAAA,MAAArB,EAAA;CA/BH,MAAA,EAAA8D,OAAAd,QAAAe,cA2BE1C;CASc,MAAAE,MAAAwC,aAAAZ;CAAqB,IAAA3B;CAAA,IAAAxB,EAAA,QAAAkD,OAAAc,WAAA;EAG5BxC,MAAA0B,OAAMc,YACL,oBAAC,WAAD;GAAgB,MAAA;GAAY,MAAA;aAAK;EAAvB,CAAA,IADX;EAIOhE,EAAA,MAAAkD,OAAAc;EAAAhE,EAAA,MAAAwB;CAAA,OAAAA,MAAAxB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAA+D,aAAA/D,EAAA,QAAAmD,UAAA;EACP1B,MAAAsC,YACC,qBAAA,UAAA;GACO,MAAA;GACI,eAAMX,YAAYa,MAAe;GAChC,WAAA;aAHZ;IAKE,oBAAA,QAAA;KACa,WAAAxH,KACT,qCACA0G,YAAA,WACF;eACD;IAEM,CAAA;IAAC;IAAI;GAEL;OAfV;EAgBOnD,EAAA,MAAA+D;EAAA/D,EAAA,MAAAmD;EAAAnD,EAAA,MAAAyB;CAAA,OAAAA,MAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,QAAAwB,OAAAxB,EAAA,QAAAyB,KAAA;EAtBVC,MAAA,qBAAA,YAAA,EAAA,UAAA,CACGF,KAKAC,GAgBO,EAAA,CAAA;EACPzB,EAAA,MAAAwB;EAAAxB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;CAAA,OAAAA,MAAA1B,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAA8D,OAAA;EAGJnC,MAAAmC,MAAKlF,KAAM,KAAK;EAACoB,EAAA,MAAA8D;EAAA9D,EAAA,MAAA2B;CAAA,OAAAA,MAAA3B,EAAA;CAAA,IAAA4B;CAAA,IAAA5B,EAAA,QAAAuB,OAAAvB,EAAA,QAAA0B,OAAA1B,EAAA,QAAA2B,KAAA;EA7BpBC,MAAA,oBAAC,YAAD;GACc,YAAAL;GAEV,UAAAG;aA0BDC;EA7BQ,CAAA;EA8BE3B,EAAA,MAAAuB;EAAAvB,EAAA,MAAA0B;EAAA1B,EAAA,MAAA2B;EAAA3B,EAAA,MAAA4B;CAAA,OAAAA,MAAA5B,EAAA;CA/Bf,MAAAkE,WACEtC;CAiCF,IAAImC,aAAAZ,UAAqB;EAAA,IAAAgB;EAAA,IAAAnE,EAAA,QAAAgD,QAAA;GAGlBmB,MAAAnB,OAAMtE,IAAK0F,MAeX;GAACpE,EAAA,MAAAgD;GAAAhD,EAAA,MAAAmE;EAAA,OAAAA,MAAAnE,EAAA;EAAA,IAAAqE;EAAA,IAAArE,EAAA,QAAAmE,OAAAnE,EAAA,QAAAkE,UAAA;GAhBJG,MAAA,oBAAC,iBAAD;IAAyBH,QAAAA;cACtBC;GADa,CAAA;GAiBEnE,EAAA,MAAAmE;GAAAnE,EAAA,MAAAkE;GAAAlE,EAAA,MAAAqE;EAAA,OAAAA,MAAArE,EAAA;EAAA,OAjBlBqE;CAiBkB;CAErB,OAEMH;AAAQ,CAChB;AAED,MAAaI,cAAavE,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAiD,QAAAqB,WAAAnE,aAAAL;CASzB,MAAAyE,cAAoBjI,OAA0B,IAAI;CAClD,MAAAkI,mBAAyBlI,OAAOgI,SAAS;CAAE,IAAAjE;CAAA,IAAAN,EAAA,OAAAI,UAAA;EAEzCE,MAAAH,WAAoBC,SAASD,MAAM;EAACH,EAAA,KAAAI;EAAAJ,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CADtC,MAAA0E,eAAqBpE;CAGnB,IAAAC;CAAA,IAAAE;CAAA,IAAAT,EAAA,OAAAuE,WAAA;EAEQhE,WAAA;GACR,IAAIkE,iBAAgBE,YAAaJ,WAAS;GAC1CE,iBAAgBE,UAAWJ;GAC3BC,YAAWG,SAAwBC,eAAC,EAAAC,OAAS,UAAU,CAAC;EAAC;EACxDpE,KAAA,CAAC8D,SAAS;EAACvE,EAAA,KAAAuE;EAAAvE,EAAA,KAAAO;EAAAP,EAAA,KAAAS;CAAA,OAAA;EAAAF,KAAAP,EAAA;EAAAS,KAAAT,EAAA;CAAA;CAJd3D,UAAUkE,IAIPE,EAAW;CAAC,IAAAG;CAAA,IAAAZ,EAAA,OAAA0E,gBAAA1E,EAAA,OAAAuE,aAAAvE,EAAA,OAAAkD,OAAAb,UAAA;EAIVzB,KAAAsC,OAAMb,SAAS3D,KAAKK,YAAA;GACnB,MAAA+F,WAAe/G,cAAcgB,QAAOf,EAAG;GACvC,MAAAkC,WAAiBqE,cAAcpE;GAAO,OAEpC,oBAAC,SAAD;IAEWpB;IACDoB,QAAAA;IACED;IACAwE,UAAAA;IACF,QAAAxE,WAAAsE,cAAAtD,KAAAA;GAAkC,GALrCnC,QAAOf,EAK8B;EAC1C,CAEL;EAACgC,EAAA,KAAA0E;EAAA1E,EAAA,KAAAuE;EAAAvE,EAAA,KAAAkD,OAAAb;EAAArC,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAa;CAAA,IAAAb,EAAA,OAAAkD,OAAApB,UAAA;EACDjB,KAAAqC,OAAMpB,YAAaoB,OAAMpB,SAASG,aAAc,IAC/C,oBAAC,eAAD,EAAyB,UAAAiB,OAAMpB,SAAS,CAAA,IADzC;EAEO9B,EAAA,KAAAkD,OAAApB;EAAA9B,EAAA,MAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,QAAAY,MAAAZ,EAAA,QAAAa,IAAA;EAjBVC,KAAA,qBAAA,YAAA,EAAA,UAAA,CACGF,IAcAC,EAEO,EAAA,CAAA;EACPb,EAAA,MAAAY;EAAAZ,EAAA,MAAAa;EAAAb,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAlBHc;AAkBG;AA/I8B,SAAAiE,MAAAxG,MAAA;CAAA,OAWQA,KAAIE,SAAU;AAAW;AAXjC,SAAA6E,OAAA0B,KAAAjG,SAAA;CAAA,OAW7BiG,MAAMjG,QAAOV,MAAMC,OAAQyG,KAAmC,CAAC,CAAAvF;AAAO;AAXzC,SAAA+D,OAAA0B,WAAA;CAAA,OAelBlG,UAAOY,QAAalB,SAAK;AAAY;AAfnB,SAAAiF,OAAAwB,OAAAC,WAAA;CAAA,OAmB7BH,SACCjG,UAAO+D,QACJ/D,UAAO+D,MAAMsC,cAAerG,UAAO+D,MAAMC,eAD5C;AAEK;AAtBuB,SAAAkB,OAAAoB,MAAA;CAAA,OAuDc,CAACA;AAAI;AAvDnB,SAAAjB,OAAAkB,OAAA;CAAA,OAgF3B,qBAAA,OAAA;EAEY,WAAA;YAFZ,CAIE,qBAAA,OAAA;GAAe,WAAA;aAAf,CACE,oBAAA,QAAA;IAAgB,WAAA;cACbA,MAAK3H;GACD,CAAA,GACP,oBAAA,QAAA;IAAgB,WAAA;cACb2H,MAAKzH,OAAQyH,MAAK1H,OAAQ0H,MAAK1H,OAAO4B,SAAU,EAAG;GAC/C,CAAA,CACH;MACN,oBAAC,WAAD;GAAmB,QAAA8F,MAAK1H;GAAmB,WAAA;EAAU,CAAA,CACjD;IAZC0H,MAAK3H,KAYN;AAAA"}
1
+ {"version":3,"file":"Transcript.js","names":["memo","useCallback","useEffect","useMemo","useRef","useState","clsx","truncate","StatusBadge","MessagePreview","PartPreview","messageStepCount","RoleLabel","Chip","PaneHeader","PaneHeaderStack","RailTime","RAIL_STATUS_BADGE_CLASS","SelectableRow","Sparkline","ToneBadge","ComposerPreview","ThreadPreview","MetricSeries","label","values","format","value","messageNodeId","id","formatTokens","toFixed","String","textOf","parts","filter","part","Extract","type","map","text","join","trim","rowSummary","message","tool","find","toolName","rowStepHint","tools","texts","hints","push","length","railStatus","isOptimistic","status","railAttachmentCount","attachments","TurnRow","t0","$","_c","selected","nodeId","onSelect","rowRef","t1","t2","summary","t3","stepHint","attachmentCount","t4","t5","t6","role","t7","reason","undefined","t8","t9","t10","createdAt","t11","t12","t13","t14","t15","t16","GhostComposer","composer","Symbol","for","textLength","canSend","queue","collect","messages","pick","metricSeries","timing","tokensPerSecond","firstTokenTime","streamStartTime","Math","round","usage","outputTokens","series","TranscriptHeader","thread","expanded","setExpanded","reduce","_temp2","_temp3","errors","tokens","_temp4","Boolean","statParts","trendSeries","stats","canExpand","isRunning","_temp5","titleRow","t17","_temp6","t18","Transcript","selection","selectedRef","prevSelectionRef","handleSelect","current","scrollIntoView","block","nodeId_0","_temp","sum","message_0","sum_0","message_1","inputTokens","prev","entry"],"sources":["../../../src/views/thread/Transcript.tsx"],"sourcesContent":["import { memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { truncate } from \"../../utils/common\";\nimport { StatusBadge } from \"../message\";\nimport type { MessagePreview, PartPreview } from \"../message\";\nimport { messageStepCount } from \"../message/MessageTimeline\";\nimport { RoleLabel } from \"../message/RoleLabel\";\nimport {\n Chip,\n PaneHeader,\n PaneHeaderStack,\n RailTime,\n RAIL_STATUS_BADGE_CLASS,\n SelectableRow,\n Sparkline,\n ToneBadge,\n} from \"../ui\";\nimport type { ComposerPreview, ThreadPreview } from \"./types\";\n\ninterface MetricSeries {\n label: string;\n values: number[];\n format: (value: number) => string;\n}\n\nexport const messageNodeId = (id: string) => `msg:${id}`;\n\nconst formatTokens = (value: number) =>\n value >= 1000 ? `${(value / 1000).toFixed(1)}k` : String(value);\n\nconst textOf = (parts: readonly PartPreview[]) =>\n parts\n .filter(\n (part): part is Extract<PartPreview, { type: \"text\" }> =>\n part.type === \"text\",\n )\n .map((part) => part.text)\n .join(\"\\n\")\n .trim();\n\nconst rowSummary = (message: MessagePreview) => {\n const text = textOf(message.parts);\n if (text) return truncate(text, 72);\n const tool = message.parts.find(\n (part): part is Extract<PartPreview, { type: \"tool-call\" }> =>\n part.type === \"tool-call\",\n );\n if (tool) return tool.toolName;\n return \"—\";\n};\n\nconst rowStepHint = (message: MessagePreview) => {\n const { tools, texts } = messageStepCount(message.parts);\n const hints: string[] = [];\n if (tools > 1) hints.push(`${tools} tools`);\n if (texts > 1) hints.push(`${texts} msgs`);\n return hints.length ? hints.join(\" · \") : null;\n};\n\nconst railStatus = (message: MessagePreview) => {\n if (message.isOptimistic) return null;\n if (!message.status || message.status.type === \"complete\") return null;\n return message.status;\n};\n\nconst railAttachmentCount = (message: MessagePreview) => {\n if (message.attachments.length > 0) return message.attachments.length;\n return message.parts.filter(\n (part) =>\n part.type === \"image\" || part.type === \"file\" || part.type === \"audio\",\n ).length;\n};\n\nconst TurnRow = memo(function TurnRow({\n message,\n selected,\n nodeId,\n onSelect,\n rowRef,\n}: {\n message: MessagePreview;\n selected: boolean;\n nodeId: string;\n onSelect: (nodeId: string) => void;\n rowRef?: React.Ref<HTMLButtonElement> | undefined;\n}) {\n const status = railStatus(message);\n const summary = rowSummary(message);\n const stepHint = rowStepHint(message);\n const attachmentCount = railAttachmentCount(message);\n\n return (\n <SelectableRow\n ref={rowRef}\n selected={selected}\n onSelect={() => onSelect(nodeId)}\n dense\n >\n <div\n className=\"flex h-10 flex-col justify-center gap-0.5\"\n title={stepHint ? `${stepHint}\\n${summary}` : summary}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-2\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <RoleLabel role={message.role} compact />\n {message.isOptimistic ? (\n <ToneBadge\n tone=\"amber\"\n size=\"sm\"\n className={RAIL_STATUS_BADGE_CLASS}\n >\n opt\n </ToneBadge>\n ) : status ? (\n <StatusBadge\n type={status.type}\n reason={\"reason\" in status ? status.reason : undefined}\n compact\n size=\"sm\"\n className={RAIL_STATUS_BADGE_CLASS}\n />\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {attachmentCount > 0 ? (\n <span\n className=\"text-muted-foreground text-[10px] leading-none\"\n title={`${attachmentCount} attachment${attachmentCount === 1 ? \"\" : \"s\"}`}\n >\n 📎{attachmentCount}\n </span>\n ) : null}\n <RailTime value={message.createdAt} />\n </div>\n </div>\n <p className=\"text-foreground min-w-0 truncate text-[12px] leading-tight\">\n {stepHint ? (\n <span className=\"text-muted-foreground\">{stepHint} · </span>\n ) : null}\n {summary}\n </p>\n </div>\n </SelectableRow>\n );\n});\n\nconst GhostComposer = ({ composer }: { composer: ComposerPreview }) => (\n <div className=\"border-border text-muted-foreground flex items-center gap-2 border-t px-3 py-2 text-[11px]\">\n <span className=\"text-foreground font-medium\">draft</span>\n <span>{composer.role ?? \"user\"}</span>\n <span>· {composer.textLength} chars</span>\n {composer.canSend ? <Chip>can send</Chip> : null}\n {composer.queue.length ? <Chip>{composer.queue.length} queued</Chip> : null}\n </div>\n);\n\nconst collect = (\n messages: readonly MessagePreview[],\n pick: (message: MessagePreview) => number | undefined,\n): number[] =>\n messages.map(pick).filter((value): value is number => value !== undefined);\n\nconst metricSeries = (messages: readonly MessagePreview[]): MetricSeries[] =>\n [\n {\n label: \"tok/s\",\n values: collect(messages, (message) => message.timing?.tokensPerSecond),\n format: (value: number) => value.toFixed(1),\n },\n {\n label: \"TTFT\",\n values: collect(messages, (message) =>\n message.timing?.firstTokenTime !== undefined &&\n message.timing?.streamStartTime !== undefined\n ? message.timing.firstTokenTime - message.timing.streamStartTime\n : undefined,\n ),\n format: (value: number) => `${Math.round(value)}ms`,\n },\n {\n label: \"output\",\n values: collect(messages, (message) => message.usage?.outputTokens),\n format: (value: number) => String(value),\n },\n ].filter((series) => series.values.length >= 3);\n\nexport const TranscriptHeader = memo(function TranscriptHeader({\n thread,\n}: {\n thread: ThreadPreview;\n}) {\n const [expanded, setExpanded] = useState(false);\n const messages = thread.messages;\n\n const { stats, series, canExpand } = useMemo(() => {\n const tools = messages.reduce(\n (sum, message) =>\n sum + message.parts.filter((part) => part.type === \"tool-call\").length,\n 0,\n );\n const errors = messages.filter(\n (message) => message.status?.type === \"incomplete\",\n ).length;\n const tokens = messages.reduce(\n (sum, message) =>\n sum +\n (message.usage\n ? message.usage.inputTokens + message.usage.outputTokens\n : 0),\n 0,\n );\n\n const statParts = [\n `${messages.length} msg${messages.length === 1 ? \"\" : \"s\"}`,\n tokens ? `${formatTokens(tokens)} tok` : null,\n tools ? `${tools} tool${tools === 1 ? \"\" : \"s\"}` : null,\n errors ? `${errors} err` : null,\n ].filter(Boolean);\n\n const trendSeries = metricSeries(messages);\n\n return {\n stats: statParts,\n series: trendSeries,\n canExpand: trendSeries.length > 0,\n };\n }, [messages]);\n\n const titleRow = (\n <PaneHeader\n borderless={canExpand && expanded}\n trailing={\n <>\n {thread.isRunning ? (\n <ToneBadge tone=\"blue\" size=\"sm\">\n running\n </ToneBadge>\n ) : null}\n {canExpand ? (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"text-muted-foreground hover:text-foreground text-[11px] leading-none\"\n >\n <span\n className={clsx(\n \"inline-block transition-transform\",\n expanded && \"rotate-90\",\n )}\n >\n ›\n </span>{\" \"}\n trends\n </button>\n ) : null}\n </>\n }\n >\n {stats.join(\" · \")}\n </PaneHeader>\n );\n\n if (canExpand && expanded) {\n return (\n <PaneHeaderStack header={titleRow}>\n {series.map((entry) => (\n <div\n key={entry.label}\n className=\"flex items-center justify-between gap-3 px-3 py-1.5\"\n >\n <div className=\"flex flex-col\">\n <span className=\"text-muted-foreground text-[10px]\">\n {entry.label}\n </span>\n <span className=\"text-foreground text-[12px] font-medium tabular-nums\">\n {entry.format(entry.values[entry.values.length - 1]!)}\n </span>\n </div>\n <Sparkline values={entry.values} className=\"h-6 w-24\" />\n </div>\n ))}\n </PaneHeaderStack>\n );\n }\n\n return titleRow;\n});\n\nexport const Transcript = ({\n thread,\n selection,\n onSelect,\n}: {\n thread: ThreadPreview;\n selection: string | null;\n onSelect: (nodeId: string) => void;\n}) => {\n const selectedRef = useRef<HTMLButtonElement>(null);\n const prevSelectionRef = useRef(selection);\n const handleSelect = useCallback(\n (nodeId: string) => onSelect(nodeId),\n [onSelect],\n );\n\n useEffect(() => {\n if (prevSelectionRef.current === selection) return;\n prevSelectionRef.current = selection;\n selectedRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [selection]);\n\n return (\n <>\n {thread.messages.map((message) => {\n const nodeId = messageNodeId(message.id);\n const selected = selection === nodeId;\n return (\n <TurnRow\n key={message.id}\n message={message}\n nodeId={nodeId}\n selected={selected}\n onSelect={handleSelect}\n rowRef={selected ? selectedRef : undefined}\n />\n );\n })}\n {thread.composer && thread.composer.textLength > 0 ? (\n <GhostComposer composer={thread.composer} />\n ) : null}\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAyBA,MAAa4B,iBAAiBC,OAAe,OAAOA;AAEpD,MAAMC,gBAAgBH,UACpBA,SAAS,MAAO,IAAIA,QAAQ,IAAA,CAAMI,QAAQ,CAAC,EAAC,KAAMC,OAAOL,KAAK;AAEhE,MAAMM,UAAUC,UACdA,MACGC,QACEC,SACCA,KAAKE,SAAS,MAClB,CAAC,CACAC,KAAKH,SAASA,KAAKI,IAAI,CAAC,CACxBC,KAAK,IAAI,CAAC,CACVC,KAAK;AAEV,MAAMC,cAAcC,YAA4B;CAC9C,MAAMJ,OAAOP,OAAOW,QAAQV,KAAK;CACjC,IAAIM,MAAM,OAAOjC,SAASiC,MAAM,EAAE;CAClC,MAAMK,OAAOD,QAAQV,MAAMY,MACxBV,SACCA,KAAKE,SAAS,WAClB;CACA,IAAIO,MAAM,OAAOA,KAAKE;CACtB,OAAO;AACT;AAEA,MAAMC,eAAeJ,YAA4B;CAC/C,MAAM,EAAEK,OAAOC,UAAUvC,iBAAiBiC,QAAQV,KAAK;CACvD,MAAMiB,QAAkB,CAAA;CACxB,IAAIF,QAAQ,GAAGE,MAAMC,KAAK,GAAGH,MAAK,OAAQ;CAC1C,IAAIC,QAAQ,GAAGC,MAAMC,KAAK,GAAGF,MAAK,MAAO;CACzC,OAAOC,MAAME,SAASF,MAAMV,KAAK,KAAK,IAAI;AAC5C;AAEA,MAAMa,cAAcV,YAA4B;CAC9C,IAAIA,QAAQW,cAAc,OAAO;CACjC,IAAI,CAACX,QAAQY,UAAUZ,QAAQY,OAAOlB,SAAS,YAAY,OAAO;CAClE,OAAOM,QAAQY;AACjB;AAEA,MAAMC,uBAAuBb,YAA4B;CACvD,IAAIA,QAAQc,YAAYL,SAAS,GAAG,OAAOT,QAAQc,YAAYL;CAC/D,OAAOT,QAAQV,MAAMC,QAClBC,SACCA,KAAKE,SAAS,WAAWF,KAAKE,SAAS,UAAUF,KAAKE,SAAS,OACnE,CAAC,CAACe;AACJ;AAEA,MAAMM,UAAU3D,KAAK,SAAA2D,QAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAiB,MAAA,EAAAlB,SAAAmB,UAAAC,QAAAC,UAAAC,WAAAN;CAYrC,IAAAO;CAAA,IAAAN,EAAA,OAAAjB,SAAA;EACgBuB,KAAAb,WAAWV,OAAO;EAACiB,EAAA,KAAAjB;EAAAiB,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAlC,MAAAL,SAAeW;CAAoB,IAAAC;CAAA,IAAAP,EAAA,OAAAjB,SAAA;EACnBwB,KAAAzB,WAAWC,OAAO;EAACiB,EAAA,KAAAjB;EAAAiB,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAnC,MAAAQ,UAAgBD;CAAoB,IAAAE;CAAA,IAAAT,EAAA,OAAAjB,SAAA;EACnB0B,KAAAtB,YAAYJ,OAAO;EAACiB,EAAA,KAAAjB;EAAAiB,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAArC,MAAAU,WAAiBD;CACjB,MAAAE,kBAAwBf,oBAAoBb,OAAO;CAAE,IAAA6B;CAAA,IAAAZ,EAAA,OAAAG,UAAAH,EAAA,OAAAI,UAAA;EAMvCQ,WAAMR,SAASD,MAAM;EAACH,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAKvB,MAAAa,KAAAH,WAAA,GAAcA,SAAQ,IAAKF,YAA3BA;CAA8C,IAAAM;CAAA,IAAAd,EAAA,OAAAjB,QAAAgC,MAAA;EAIjDD,KAAA,oBAAC,WAAD;GAAiB,MAAA/B,QAAOgC;GAAO,SAAA;EAAO,CAAA;EAAGf,EAAA,KAAAjB,QAAAgC;EAAAf,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,IAAAgB;CAAA,IAAAhB,EAAA,QAAAjB,QAAAW,gBAAAM,EAAA,QAAAL,QAAA;EACxCqB,KAAAjC,QAAOW,eACN,oBAAC,WAAD;GACO,MAAA;GACA,MAAA;GACMtC,WAAAA;GACZ,UAAA;EAJS,CAAA,IAORuC,SACF,oBAAC,aAAD;GACQ,MAAAA,OAAMlB;GACJ,QAAA,YAAYkB,SAASA,OAAMsB,SAA3BC,KAAAA;GACR,SAAA;GACK,MAAA;GACM9D,WAAAA;EAAuB,CAAA,IANlC;EAQI4C,EAAA,MAAAjB,QAAAW;EAAAM,EAAA,MAAAL;EAAAK,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAAA,IAAAmB;CAAA,IAAAnB,EAAA,QAAAc,MAAAd,EAAA,QAAAgB,IAAA;EAlBVG,KAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACEL,IACCE,EAiBG;;EAAAhB,EAAA,MAAAc;EAAAd,EAAA,MAAAgB;EAAAhB,EAAA,MAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAAA,IAAAoB;CAAA,IAAApB,EAAA,QAAAW,iBAAA;EAEHS,KAAAT,kBAAkB,IACjB,qBAAA,QAAA;GACY,WAAA;GACH,OAAA,GAAGA,gBAAe,aAAcA,oBAAoB,IAApB,KAAA;GAFzC,UAAA,CAGC,MACIA,eACE;EANR,CAAA,IAAA;EAOOX,EAAA,MAAAW;EAAAX,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAAA,IAAAqB;CAAA,IAAArB,EAAA,QAAAjB,QAAAuC,WAAA;EACRD,MAAA,oBAAC,UAAD,EAAiB,OAAAtC,QAAOuC,UAAU,CAAA;EAAItB,EAAA,MAAAjB,QAAAuC;EAAAtB,EAAA,MAAAqB;CAAA,OAAAA,MAAArB,EAAA;CAAA,IAAAuB;CAAA,IAAAvB,EAAA,QAAAqB,OAAArB,EAAA,QAAAoB,IAAA;EATxCG,MAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACGH,IAQDC,GACI;;EAAArB,EAAA,MAAAqB;EAAArB,EAAA,MAAAoB;EAAApB,EAAA,MAAAuB;CAAA,OAAAA,MAAAvB,EAAA;CAAA,IAAAwB;CAAA,IAAAxB,EAAA,QAAAuB,OAAAvB,EAAA,QAAAmB,IAAA;EA/BRK,MAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACEL,IAoBAI,GAWI;;EAAAvB,EAAA,MAAAuB;EAAAvB,EAAA,MAAAmB;EAAAnB,EAAA,MAAAwB;CAAA,OAAAA,MAAAxB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAAU,UAAA;EAEHe,MAAAf,WACC,qBAAA,QAAA;GAAgB,WAAA;GAAhB,UAAA,CAAyCA,UAAS,KAAU;EAD7D,CAAA,IAAA;EAEOV,EAAA,MAAAU;EAAAV,EAAA,MAAAyB;CAAA,OAAAA,MAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,QAAAQ,WAAAR,EAAA,QAAAyB,KAAA;EAHVC,MAAA,qBAAA,KAAA;GAAa,WAAA;GAAb,UAAA,CACGD,KAGAjB,OACC;;EAAAR,EAAA,MAAAQ;EAAAR,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;CAAA,OAAAA,MAAA1B,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAAwB,OAAAxB,EAAA,QAAA0B,OAAA1B,EAAA,QAAAa,IAAA;EA1CNc,MAAA,qBAAA,OAAA;GACY,WAAA;GACH,OAAAd;GAFT,UAAA,CAIEW,KAiCAE,GAMI;;EAAA1B,EAAA,MAAAwB;EAAAxB,EAAA,MAAA0B;EAAA1B,EAAA,MAAAa;EAAAb,EAAA,MAAA2B;CAAA,OAAAA,MAAA3B,EAAA;CAAA,IAAA4B;CAAA,IAAA5B,EAAA,QAAAK,UAAAL,EAAA,QAAAE,YAAAF,EAAA,QAAA2B,OAAA3B,EAAA,QAAAY,IAAA;EAjDRgB,MAAA,oBAAC,eAAD;GACOvB,KAAAA;GACKH;GACA,UAAAU;GACV,OAAA;GAEAe,UAAAA;EANY,CAAA;EAkDE3B,EAAA,MAAAK;EAAAL,EAAA,MAAAE;EAAAF,EAAA,MAAA2B;EAAA3B,EAAA,MAAAY;EAAAZ,EAAA,MAAA4B;CAAA,OAAAA,MAAA5B,EAAA;CAAA,OAlDhB4B;AAkDgB,CAEnB;AAED,MAAMC,iBAAgB9B,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAA6B,aAAA/B;CAA2C,IAAAO;CAAA,IAAAN,EAAA,OAAA+B,OAAAC,IAAA,2BAAA,GAAA;EAE9D1B,KAAA,oBAAA,QAAA;GAAgB,WAAA;GAA8B,UAAA;EAAY,CAAA;EAAAN,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CACnD,MAAAO,KAAAuB,SAAQf,QAAR;CAAuB,IAAAN;CAAA,IAAAT,EAAA,OAAAO,IAAA;EAA9BE,KAAA,oBAAA,QAAA,EAAA,UAAOF,GAA+B,CAAA;EAAAP,EAAA,KAAAO;EAAAP,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAA8B,SAAAG,YAAA;EACtCrB,KAAA,qBAAA,QAAA,EAAA,UAAA;GAAM;GAAGkB,SAAQG;GAAY;EAAa,EAAA,CAAA;EAAAjC,EAAA,KAAA8B,SAAAG;EAAAjC,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAa;CAAA,IAAAb,EAAA,OAAA8B,SAAAI,SAAA;EACzCrB,KAAAiB,SAAQI,UAAW,oBAAC,MAAD,EAAA,UAAM,WAAD,CAAA,IAAxB;EAA+ClC,EAAA,KAAA8B,SAAAI;EAAAlC,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,OAAA8B,SAAAK,MAAA3C,QAAA;EAC/CsB,KAAAgB,SAAQK,MAAM3C,SAAU,qBAAC,MAAD,EAAA,UAAA,CAAOsC,SAAQK,MAAM3C,QAAQ,SAAxB,EAAA,CAAA,IAA7B;EAA0EQ,EAAA,KAAA8B,SAAAK,MAAA3C;EAAAQ,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,IAAAgB;CAAA,IAAAhB,EAAA,OAAAS,MAAAT,EAAA,QAAAY,MAAAZ,EAAA,QAAAa,MAAAb,EAAA,QAAAc,IAAA;EAL7EE,KAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA;IACEV;IACAG;IACAG;IACCC;IACAC;GACG;;EAAAd,EAAA,KAAAS;EAAAT,EAAA,MAAAY;EAAAZ,EAAA,MAAAa;EAAAb,EAAA,MAAAc;EAAAd,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAAA,OANNgB;AAMM;AAGR,MAAMoB,WACJC,UACAC,SAEAD,SAAS3D,IAAI4D,IAAI,CAAC,CAAChE,QAAQR,UAA2BA,UAAUoD,KAAAA,CAAS;AAE3E,MAAMqB,gBAAgBF,aACpB;CACE;EACE1E,OAAO;EACPC,QAAQwE,QAAQC,WAAWtD,YAAYA,QAAQyD,QAAQC,eAAe;EACtE5E,SAASC,UAAkBA,MAAMI,QAAQ,CAAC;CAC5C;CACA;EACEP,OAAO;EACPC,QAAQwE,QAAQC,WAAWtD,YACzBA,QAAQyD,QAAQE,mBAAmBxB,KAAAA,KACnCnC,QAAQyD,QAAQG,oBAAoBzB,KAAAA,IAChCnC,QAAQyD,OAAOE,iBAAiB3D,QAAQyD,OAAOG,kBAC/CzB,KAAAA,CACN;EACArD,SAASC,UAAkB,GAAG8E,KAAKC,MAAM/E,KAAK,EAAC;CACjD;CACA;EACEH,OAAO;EACPC,QAAQwE,QAAQC,WAAWtD,YAAYA,QAAQ+D,OAAOC,YAAY;EAClElF,SAASC,UAAkBK,OAAOL,KAAK;CACzC;AAAC,CACF,CAACQ,QAAQ0E,WAAWA,OAAOpF,OAAO4B,UAAU,CAAC;AAEhD,MAAayD,mBAAmB9G,KAAK,SAAA8G,iBAAAlD,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAA0B,MAAA,EAAAiD,WAAAnD;CAK7D,MAAA,CAAAoD,UAAAC,eAAgC5G,SAAS,KAAK;CAC9C,MAAA6F,WAAiBa,OAAMb;CAAU,IAAA/B;CAAA,IAAAN,EAAA,OAAAqC,UAAA;EAGjB/B,KAAA+B,SAAQgB,OACpBC,QAEA,CACF;EAACtD,EAAA,KAAAqC;EAAArC,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAJD,MAAAZ,QAAckB;CAIZ,IAAAC;CAAA,IAAAP,EAAA,OAAAqC,UAAA;EACa9B,KAAA8B,SAAQ/D,OACrBiF,MACF;EAACvD,EAAA,KAAAqC;EAAArC,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAFD,MAAAwD,SAAejD,GAEdf;CAAQ,IAAAiB;CAAA,IAAAG;CAAA,IAAAZ,EAAA,OAAAqC,UAAA;EACT,MAAAoB,SAAepB,SAAQgB,OACrBK,QAKA,CACF;EAGEjD,KAAA,GAAG4B,SAAQ7C,OAAO,MAAO6C,SAAQ7C,WAAY,IAApB,KAAA;EACzBoB,KAAA6C,SAAA,GAAYxF,aAAawF,MAAM,EAAC,QAAhC;EAA6CzD,EAAA,KAAAqC;EAAArC,EAAA,KAAAS;EAAAT,EAAA,KAAAY;CAAA,OAAA;EAAAH,KAAAT,EAAA;EAAAY,KAAAZ,EAAA;CAAA;CAC7C,MAAAa,KAAAzB,QAAA,GAAWA,MAAK,OAAQA,UAAU,IAAV,KAAA,QAAxB;CACA,MAAA0B,KAAA0C,SAAA,GAAYA,OAAM,QAAlB;CAA+B,IAAAxC;CAAA,IAAAhB,EAAA,OAAAS,MAAAT,EAAA,OAAAY,MAAAZ,EAAA,OAAAa,MAAAb,EAAA,QAAAc,IAAA;EAJfE,KAAA;GAChBP;GACAG;GACAC;GACAC;EAA+B,CAChC,CAAAxC,OAAQqF,OAAO;EAAC3D,EAAA,KAAAS;EAAAT,EAAA,KAAAY;EAAAZ,EAAA,KAAAa;EAAAb,EAAA,MAAAc;EAAAd,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CALjB,MAAA4D,YAAkB5C;CAKA,IAAAG;CAAA,IAAAnB,EAAA,QAAAqC,UAAA;EAEElB,KAAAoB,aAAaF,QAAQ;EAACrC,EAAA,MAAAqC;EAAArC,EAAA,MAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAA1C,MAAA6D,cAAoB1C;CAKP,MAAAC,KAAAyC,YAAWrE,SAAU;CAAC,IAAA6B;CAAA,IAAArB,EAAA,QAAA4D,aAAA5D,EAAA,QAAAoB,MAAApB,EAAA,QAAA6D,aAAA;EAH5BxC,MAAA;GAAAyC,OACEF;GAASZ,QACRa;GAAWE,WACR3C;EACb;EAACpB,EAAA,MAAA4D;EAAA5D,EAAA,MAAAoB;EAAApB,EAAA,MAAA6D;EAAA7D,EAAA,MAAAqB;CAAA,OAAAA,MAAArB,EAAA;CA/BH,MAAA,EAAA8D,OAAAd,QAAAe,cA2BE1C;CASc,MAAAE,MAAAwC,aAAAZ;CAAqB,IAAA3B;CAAA,IAAAxB,EAAA,QAAAkD,OAAAc,WAAA;EAG5BxC,MAAA0B,OAAMc,YACL,oBAAC,WAAD;GAAgB,MAAA;GAAY,MAAA;GAAK,UAAA;EAAvB,CAAA,IADX;EAIOhE,EAAA,MAAAkD,OAAAc;EAAAhE,EAAA,MAAAwB;CAAA,OAAAA,MAAAxB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAA+D,aAAA/D,EAAA,QAAAmD,UAAA;EACP1B,MAAAsC,YACC,qBAAA,UAAA;GACO,MAAA;GACI,eAAMX,YAAYa,MAAe;GAChC,WAAA;GAHZ,UAAA;IAKE,oBAAA,QAAA;KACa,WAAAxH,KACT,qCACA0G,YAAA,WACF;KACD,UAAA;IAEM,CAAA;IAAC;IAAI;GAEL;EAfV,CAAA,IAAA;EAgBOnD,EAAA,MAAA+D;EAAA/D,EAAA,MAAAmD;EAAAnD,EAAA,MAAAyB;CAAA,OAAAA,MAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,QAAAwB,OAAAxB,EAAA,QAAAyB,KAAA;EAtBVC,MAAA,qBAAA,YAAA,EAAA,UAAA,CACGF,KAKAC,GAgBO,EAAA,CAAA;EACPzB,EAAA,MAAAwB;EAAAxB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;CAAA,OAAAA,MAAA1B,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAA8D,OAAA;EAGJnC,MAAAmC,MAAKlF,KAAM,KAAK;EAACoB,EAAA,MAAA8D;EAAA9D,EAAA,MAAA2B;CAAA,OAAAA,MAAA3B,EAAA;CAAA,IAAA4B;CAAA,IAAA5B,EAAA,QAAAuB,OAAAvB,EAAA,QAAA0B,OAAA1B,EAAA,QAAA2B,KAAA;EA7BpBC,MAAA,oBAAC,YAAD;GACc,YAAAL;GAEV,UAAAG;GA0BDC,UAAAA;EA7BQ,CAAA;EA8BE3B,EAAA,MAAAuB;EAAAvB,EAAA,MAAA0B;EAAA1B,EAAA,MAAA2B;EAAA3B,EAAA,MAAA4B;CAAA,OAAAA,MAAA5B,EAAA;CA/Bf,MAAAkE,WACEtC;CAiCF,IAAImC,aAAAZ,UAAqB;EAAA,IAAAgB;EAAA,IAAAnE,EAAA,QAAAgD,QAAA;GAGlBmB,MAAAnB,OAAMtE,IAAK0F,MAeX;GAACpE,EAAA,MAAAgD;GAAAhD,EAAA,MAAAmE;EAAA,OAAAA,MAAAnE,EAAA;EAAA,IAAAqE;EAAA,IAAArE,EAAA,QAAAmE,OAAAnE,EAAA,QAAAkE,UAAA;GAhBJG,MAAA,oBAAC,iBAAD;IAAyBH,QAAAA;IACtBC,UAAAA;GADa,CAAA;GAiBEnE,EAAA,MAAAmE;GAAAnE,EAAA,MAAAkE;GAAAlE,EAAA,MAAAqE;EAAA,OAAAA,MAAArE,EAAA;EAAA,OAjBlBqE;CAiBkB;CAErB,OAEMH;AAAQ,CAChB;AAED,MAAaI,cAAavE,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAiD,QAAAqB,WAAAnE,aAAAL;CASzB,MAAAyE,cAAoBjI,OAA0B,IAAI;CAClD,MAAAkI,mBAAyBlI,OAAOgI,SAAS;CAAE,IAAAjE;CAAA,IAAAN,EAAA,OAAAI,UAAA;EAEzCE,MAAAH,WAAoBC,SAASD,MAAM;EAACH,EAAA,KAAAI;EAAAJ,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CADtC,MAAA0E,eAAqBpE;CAGnB,IAAAC;CAAA,IAAAE;CAAA,IAAAT,EAAA,OAAAuE,WAAA;EAEQhE,WAAA;GACR,IAAIkE,iBAAgBE,YAAaJ,WAAS;GAC1CE,iBAAgBE,UAAWJ;GAC3BC,YAAWG,SAAwBC,eAAC,EAAAC,OAAS,UAAU,CAAC;EAAC;EACxDpE,KAAA,CAAC8D,SAAS;EAACvE,EAAA,KAAAuE;EAAAvE,EAAA,KAAAO;EAAAP,EAAA,KAAAS;CAAA,OAAA;EAAAF,KAAAP,EAAA;EAAAS,KAAAT,EAAA;CAAA;CAJd3D,UAAUkE,IAIPE,EAAW;CAAC,IAAAG;CAAA,IAAAZ,EAAA,OAAA0E,gBAAA1E,EAAA,OAAAuE,aAAAvE,EAAA,OAAAkD,OAAAb,UAAA;EAIVzB,KAAAsC,OAAMb,SAAS3D,KAAKK,YAAA;GACnB,MAAA+F,WAAe/G,cAAcgB,QAAOf,EAAG;GACvC,MAAAkC,WAAiBqE,cAAcpE;GAAO,OAEpC,oBAAC,SAAD;IAEWpB;IACDoB,QAAAA;IACED;IACAwE,UAAAA;IACF,QAAAxE,WAAAsE,cAAAtD,KAAAA;GAAkC,GALrCnC,QAAOf,EAK8B;EAC1C,CAEL;EAACgC,EAAA,KAAA0E;EAAA1E,EAAA,KAAAuE;EAAAvE,EAAA,KAAAkD,OAAAb;EAAArC,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAa;CAAA,IAAAb,EAAA,OAAAkD,OAAApB,UAAA;EACDjB,KAAAqC,OAAMpB,YAAaoB,OAAMpB,SAASG,aAAc,IAC/C,oBAAC,eAAD,EAAyB,UAAAiB,OAAMpB,SAAS,CAAA,IADzC;EAEO9B,EAAA,KAAAkD,OAAApB;EAAA9B,EAAA,MAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,QAAAY,MAAAZ,EAAA,QAAAa,IAAA;EAjBVC,KAAA,qBAAA,YAAA,EAAA,UAAA,CACGF,IAcAC,EAEO,EAAA,CAAA;EACPb,EAAA,MAAAY;EAAAZ,EAAA,MAAAa;EAAAb,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAlBHc;AAkBG;AA/I8B,SAAAiE,MAAAxG,MAAA;CAAA,OAWQA,KAAIE,SAAU;AAAW;AAXjC,SAAA6E,OAAA0B,KAAAjG,SAAA;CAAA,OAW7BiG,MAAMjG,QAAOV,MAAMC,OAAQyG,KAAmC,CAAC,CAAAvF;AAAO;AAXzC,SAAA+D,OAAA0B,WAAA;CAAA,OAelBlG,UAAOY,QAAalB,SAAK;AAAY;AAfnB,SAAAiF,OAAAwB,OAAAC,WAAA;CAAA,OAmB7BH,SACCjG,UAAO+D,QACJ/D,UAAO+D,MAAMsC,cAAerG,UAAO+D,MAAMC,eAD5C;AAEK;AAtBuB,SAAAkB,OAAAoB,MAAA;CAAA,OAuDc,CAACA;AAAI;AAvDnB,SAAAjB,OAAAkB,OAAA;CAAA,OAgF3B,qBAAA,OAAA;EAEY,WAAA;EAFZ,UAAA,CAIE,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACE,oBAAA,QAAA;IAAgB,WAAA;IACbA,UAAAA,MAAK3H;GACD,CAAA,GACP,oBAAA,QAAA;IAAgB,WAAA;IACb2H,UAAAA,MAAKzH,OAAQyH,MAAK1H,OAAQ0H,MAAK1H,OAAO4B,SAAU,EAAG;GAC/C,CAAA,CACH;EACN,CAAA,GAAA,oBAAC,WAAD;GAAmB,QAAA8F,MAAK1H;GAAmB,WAAA;EAAU,CAAA,CACjD;CAZC0H,GAAAA,MAAK3H,KAYN;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"CopyButton.js","names":["clsx","useCopyToClipboard","ClipboardIcon","t0","$","_c","size","t1","undefined","t2","t3","Symbol","for","t4","CopyButton","value","label","copiedLabel","className","iconOnly","isCopied","copy","t5","trim","empty","iconPx","t6","t7","t8","event","stopPropagation","t9","t10","t11","t12","t13"],"sources":["../../../src/views/ui/CopyButton.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useCopyToClipboard } from \"./useCopyToClipboard\";\n\nconst ClipboardIcon = ({ size = 12 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"9\"\n y=\"9\"\n width=\"11\"\n height=\"11\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n />\n <path\n d=\"M7 15H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport const CopyButton = ({\n value,\n label = \"Copy\",\n copiedLabel = \"Copied\",\n className,\n iconOnly = false,\n size = \"default\",\n}: {\n value: string;\n label?: string;\n copiedLabel?: string;\n className?: string | undefined;\n iconOnly?: boolean;\n size?: \"default\" | \"sm\";\n}) => {\n const { isCopied, copy } = useCopyToClipboard();\n const empty = !value.trim();\n const iconPx = size === \"sm\" ? 10 : 12;\n\n return (\n <button\n type=\"button\"\n disabled={empty}\n aria-label={isCopied ? copiedLabel : label}\n title={isCopied ? copiedLabel : label}\n onClick={(event) => {\n event.stopPropagation();\n copy(value);\n }}\n className={clsx(\n \"text-muted-foreground hover:text-foreground inline-flex shrink-0 items-center justify-center rounded transition-colors disabled:pointer-events-none disabled:opacity-40\",\n iconOnly\n ? size === \"sm\"\n ? \"hover:bg-accent/60 size-4\"\n : \"hover:bg-accent/60 size-6\"\n : \"hover:bg-accent/60 h-6 gap-1 px-1.5 text-[10px] font-medium\",\n className,\n )}\n >\n <ClipboardIcon size={iconPx} />\n {!iconOnly ? <span>{isCopied ? copiedLabel : label}</span> : null}\n </button>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"CopyButton.js","names":["clsx","useCopyToClipboard","ClipboardIcon","t0","$","_c","size","t1","undefined","t2","t3","Symbol","for","t4","CopyButton","value","label","copiedLabel","className","iconOnly","isCopied","copy","t5","trim","empty","iconPx","t6","t7","t8","event","stopPropagation","t9","t10","t11","t12","t13"],"sources":["../../../src/views/ui/CopyButton.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useCopyToClipboard } from \"./useCopyToClipboard\";\n\nconst ClipboardIcon = ({ size = 12 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"9\"\n y=\"9\"\n width=\"11\"\n height=\"11\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n />\n <path\n d=\"M7 15H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport const CopyButton = ({\n value,\n label = \"Copy\",\n copiedLabel = \"Copied\",\n className,\n iconOnly = false,\n size = \"default\",\n}: {\n value: string;\n label?: string;\n copiedLabel?: string;\n className?: string | undefined;\n iconOnly?: boolean;\n size?: \"default\" | \"sm\";\n}) => {\n const { isCopied, copy } = useCopyToClipboard();\n const empty = !value.trim();\n const iconPx = size === \"sm\" ? 10 : 12;\n\n return (\n <button\n type=\"button\"\n disabled={empty}\n aria-label={isCopied ? copiedLabel : label}\n title={isCopied ? copiedLabel : label}\n onClick={(event) => {\n event.stopPropagation();\n copy(value);\n }}\n className={clsx(\n \"text-muted-foreground hover:text-foreground inline-flex shrink-0 items-center justify-center rounded transition-colors disabled:pointer-events-none disabled:opacity-40\",\n iconOnly\n ? size === \"sm\"\n ? \"hover:bg-accent/60 size-4\"\n : \"hover:bg-accent/60 size-6\"\n : \"hover:bg-accent/60 h-6 gap-1 px-1.5 text-[10px] font-medium\",\n className,\n )}\n >\n <ClipboardIcon size={iconPx} />\n {!iconOnly ? <span>{isCopied ? copiedLabel : label}</span> : null}\n </button>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"InfoCard.js","names":["ReactNode","InfoCard","t0","$","_c","title","count","action","children","t1","t2"],"sources":["../../../src/views/ui/InfoCard.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/**\n * A flat content section: a header row (title + optional count/action) over its\n * content. No box, no nesting; sections are separated by whitespace on the\n * panel surface.\n */\nexport const InfoCard = ({\n title,\n count,\n action,\n children,\n}: {\n title?: ReactNode;\n count?: ReactNode;\n action?: ReactNode;\n children: ReactNode;\n}) => (\n <section className=\"flex flex-col gap-2\">\n {title != null || action != null ? (\n <div className=\"flex h-5 items-center justify-between gap-2\">\n <h3 className=\"text-foreground flex items-center gap-1.5 text-[13px] font-medium\">\n {title}\n {count != null ? (\n <span className=\"text-muted-foreground text-[11px] font-normal tabular-nums\">\n {count}\n </span>\n ) : null}\n </h3>\n {action}\n </div>\n ) : null}\n {children}\n </section>\n);\n"],"mappings":";;;;;;;;AAOA,MAAaC,YAAWC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,OAAAC,OAAAC,QAAAC,aAAAN;CAUxB,IAAAO;CAAA,IAAAN,EAAA,OAAAI,UAAAJ,EAAA,OAAAG,SAAAH,EAAA,OAAAE,OAAA;EAEII,KAAAJ,SAAS,QAAQE,UAAU,OAC1B,qBAAA,OAAA;GAAe,WAAA;aAAf,CACE,qBAAA,MAAA;IAAc,WAAA;cAAd,CACGF,OACAC,SAAS,OACR,oBAAA,QAAA;KAAgB,WAAA;eACbA;IACI,CAAA,IAHR,IAKE;OACJC,MACG;OAXP;EAYOJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAG;EAAAH,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAK,YAAAL,EAAA,OAAAM,IAAA;EAbVC,KAAA,qBAAA,WAAA;GAAmB,WAAA;aAAnB,CACGD,IAaAD,QACO;;EAAAL,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,OAfVO;AAeU"}
1
+ {"version":3,"file":"InfoCard.js","names":["ReactNode","InfoCard","t0","$","_c","title","count","action","children","t1","t2"],"sources":["../../../src/views/ui/InfoCard.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/**\n * A flat content section: a header row (title + optional count/action) over its\n * content. No box, no nesting; sections are separated by whitespace on the\n * panel surface.\n */\nexport const InfoCard = ({\n title,\n count,\n action,\n children,\n}: {\n title?: ReactNode;\n count?: ReactNode;\n action?: ReactNode;\n children: ReactNode;\n}) => (\n <section className=\"flex flex-col gap-2\">\n {title != null || action != null ? (\n <div className=\"flex h-5 items-center justify-between gap-2\">\n <h3 className=\"text-foreground flex items-center gap-1.5 text-[13px] font-medium\">\n {title}\n {count != null ? (\n <span className=\"text-muted-foreground text-[11px] font-normal tabular-nums\">\n {count}\n </span>\n ) : null}\n </h3>\n {action}\n </div>\n ) : null}\n {children}\n </section>\n);\n"],"mappings":";;;;;;;;AAOA,MAAaC,YAAWC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,OAAAC,OAAAC,QAAAC,aAAAN;CAUxB,IAAAO;CAAA,IAAAN,EAAA,OAAAI,UAAAJ,EAAA,OAAAG,SAAAH,EAAA,OAAAE,OAAA;EAEII,KAAAJ,SAAS,QAAQE,UAAU,OAC1B,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACE,qBAAA,MAAA;IAAc,WAAA;IAAd,UAAA,CACGF,OACAC,SAAS,OACR,oBAAA,QAAA;KAAgB,WAAA;KACbA,UAAAA;IACI,CAAA,IAHR,IAKE;GACJC,CAAAA,GAAAA,MACG;EAXP,CAAA,IAAA;EAYOJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAG;EAAAH,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAK,YAAAL,EAAA,OAAAM,IAAA;EAbVC,KAAA,qBAAA,WAAA;GAAmB,WAAA;GAAnB,UAAA,CACGD,IAaAD,QACO;;EAAAL,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,OAfVO;AAeU"}
@@ -1 +1 @@
1
- {"version":3,"file":"JSONTree.js","names":["useMemo","useState","clsx","CopyButton","ENTRY_LIMIT","INLINE_MAX","isContainer","value","Entry","key","entriesOf","Array","isArray","map","item","index","String","Object","entries","Record","summaryOf","length","keys","serialize","compact","JSON","stringify","isInline","Leaf","t0","$","_c","t1","undefined","t2","TreeNode","name","depth","openDepth","open","setOpen","showAll","setShowAll","t3","t4","t5","shown","slice","hidden","Symbol","for","_temp","t6","t7","t8","t9","t10","t11","entry","InlineJson","serialized","copyText","TreeWithCopy","JSONTree","isLeaf","prev"],"sources":["../../../src/views/ui/JSONTree.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { CopyButton } from \"./CopyButton\";\n\nconst ENTRY_LIMIT = 100;\nconst INLINE_MAX = 88;\n\nconst isContainer = (value: unknown): value is object =>\n value !== null && typeof value === \"object\";\n\ntype Entry = { key: string; value: unknown };\n\nconst entriesOf = (value: unknown): Entry[] => {\n if (Array.isArray(value)) {\n return value.map((item, index) => ({ key: String(index), value: item }));\n }\n return Object.entries(value as Record<string, unknown>).map(\n ([key, value]) => ({ key, value }),\n );\n};\n\nconst summaryOf = (value: unknown): string => {\n if (Array.isArray(value)) return `[${value.length}]`;\n return `{${Object.keys(value as object).length}}`;\n};\n\nconst serialize = (value: unknown, compact: boolean) =>\n JSON.stringify(value, null, compact ? 0 : 2);\n\nconst isInline = (value: unknown, compact: boolean) => {\n if (!compact) return false;\n if (!isContainer(value)) return true;\n return serialize(value, true).length <= INLINE_MAX;\n};\n\nconst Leaf = ({ value }: { value: unknown }) => {\n if (typeof value === \"string\") {\n return (\n <span className=\"text-foreground break-all\">&quot;{value}&quot;</span>\n );\n }\n if (value === null || value === undefined) {\n return (\n <span className=\"text-muted-foreground italic\">{String(value)}</span>\n );\n }\n return (\n <span className=\"text-muted-foreground break-all\">{String(value)}</span>\n );\n};\n\nconst TreeNode = ({\n name,\n value,\n depth,\n openDepth,\n compact,\n}: {\n name?: string;\n value: unknown;\n depth: number;\n openDepth: number;\n compact: boolean;\n}) => {\n const [open, setOpen] = useState(depth < openDepth);\n const [showAll, setShowAll] = useState(false);\n\n if (!isContainer(value)) {\n return (\n <div\n className={clsx(\"flex min-w-0\", compact ? \"gap-1 py-px\" : \"gap-1.5\")}\n >\n {name !== undefined ? (\n <span className=\"text-muted-foreground shrink-0\">{name}:</span>\n ) : null}\n <Leaf value={value} />\n </div>\n );\n }\n\n const entries = entriesOf(value);\n const shown = showAll ? entries : entries.slice(0, ENTRY_LIMIT);\n const hidden = entries.length - shown.length;\n\n return (\n <div className=\"min-w-0\">\n <button\n type=\"button\"\n onClick={() => setOpen((prev) => !prev)}\n className={clsx(\n \"text-muted-foreground hover:text-foreground flex items-center\",\n compact ? \"gap-0.5 py-px\" : \"gap-1\",\n )}\n >\n <span\n className={clsx(\n \"inline-block transition-transform\",\n open && \"rotate-90\",\n )}\n >\n ›\n </span>\n {name !== undefined ? <span>{name}</span> : null}\n <span className=\"opacity-60\">{summaryOf(value)}</span>\n </button>\n {open ? (\n <div\n className={clsx(\n \"border-border/60 border-s\",\n compact ? \"ms-1 ps-2\" : \"ms-[5px] ps-3\",\n )}\n >\n {shown.map((entry) => (\n <TreeNode\n key={entry.key}\n name={entry.key}\n value={entry.value}\n depth={depth + 1}\n openDepth={openDepth}\n compact={compact}\n />\n ))}\n {hidden > 0 ? (\n <button\n type=\"button\"\n onClick={() => setShowAll(true)}\n className=\"text-muted-foreground hover:text-foreground text-[10px]\"\n >\n +{hidden} more\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n};\n\nconst InlineJson = ({\n serialized,\n copyText,\n compact,\n}: {\n serialized: string;\n copyText: string;\n compact: boolean;\n}) => (\n <div className=\"flex min-w-0 items-start gap-0.5\">\n <code\n className={clsx(\n \"text-foreground min-w-0 flex-1 font-mono leading-snug break-all\",\n compact ? \"text-[10px]\" : \"text-[11px]\",\n )}\n title={serialized}\n >\n {serialized}\n </code>\n <CopyButton\n value={copyText}\n label=\"Copy JSON\"\n iconOnly\n size={compact ? \"sm\" : \"default\"}\n />\n </div>\n);\n\nconst TreeWithCopy = ({\n value,\n openDepth,\n copyText,\n compact,\n}: {\n value: unknown;\n openDepth: number;\n copyText: string;\n compact: boolean;\n}) => (\n <div className=\"flex min-w-0 items-start gap-0.5\">\n <div\n className={clsx(\n \"min-w-0 flex-1 overflow-auto font-mono [font-variant-numeric:tabular-nums] [font-variant-ligatures:none]\",\n compact\n ? \"max-h-32 text-[10px] leading-snug\"\n : \"border-border bg-muted/40 max-h-[360px] rounded-md border p-3 text-[11px] leading-relaxed\",\n )}\n >\n <TreeNode\n value={value}\n depth={0}\n openDepth={openDepth}\n compact={compact}\n />\n </div>\n <CopyButton\n value={copyText}\n label=\"Copy JSON\"\n iconOnly\n size={compact ? \"sm\" : \"default\"}\n className=\"pt-px\"\n />\n </div>\n);\n\n/**\n * Recursive JSON view. `compact` fits tool rows; copy always provides formatted JSON.\n */\nexport const JSONTree = ({\n value,\n openDepth = 1,\n compact = false,\n}: {\n value: unknown;\n openDepth?: number;\n compact?: boolean;\n}) => {\n const isLeaf = isInline(value, compact) || !isContainer(value);\n const serialized = useMemo(\n () => (isLeaf ? serialize(value, compact) : \"\"),\n [value, compact, isLeaf],\n );\n const copyText = useMemo(() => JSON.stringify(value, null, 2), [value]);\n\n if (isLeaf) {\n return (\n <InlineJson\n serialized={serialized}\n copyText={copyText}\n compact={compact}\n />\n );\n }\n\n return (\n <TreeWithCopy\n value={value}\n openDepth={openDepth}\n copyText={copyText}\n compact={compact}\n />\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"JSONTree.js","names":["useMemo","useState","clsx","CopyButton","ENTRY_LIMIT","INLINE_MAX","isContainer","value","Entry","key","entriesOf","Array","isArray","map","item","index","String","Object","entries","Record","summaryOf","length","keys","serialize","compact","JSON","stringify","isInline","Leaf","t0","$","_c","t1","undefined","t2","TreeNode","name","depth","openDepth","open","setOpen","showAll","setShowAll","t3","t4","t5","shown","slice","hidden","Symbol","for","_temp","t6","t7","t8","t9","t10","t11","entry","InlineJson","serialized","copyText","TreeWithCopy","JSONTree","isLeaf","prev"],"sources":["../../../src/views/ui/JSONTree.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { CopyButton } from \"./CopyButton\";\n\nconst ENTRY_LIMIT = 100;\nconst INLINE_MAX = 88;\n\nconst isContainer = (value: unknown): value is object =>\n value !== null && typeof value === \"object\";\n\ntype Entry = { key: string; value: unknown };\n\nconst entriesOf = (value: unknown): Entry[] => {\n if (Array.isArray(value)) {\n return value.map((item, index) => ({ key: String(index), value: item }));\n }\n return Object.entries(value as Record<string, unknown>).map(\n ([key, value]) => ({ key, value }),\n );\n};\n\nconst summaryOf = (value: unknown): string => {\n if (Array.isArray(value)) return `[${value.length}]`;\n return `{${Object.keys(value as object).length}}`;\n};\n\nconst serialize = (value: unknown, compact: boolean) =>\n JSON.stringify(value, null, compact ? 0 : 2);\n\nconst isInline = (value: unknown, compact: boolean) => {\n if (!compact) return false;\n if (!isContainer(value)) return true;\n return serialize(value, true).length <= INLINE_MAX;\n};\n\nconst Leaf = ({ value }: { value: unknown }) => {\n if (typeof value === \"string\") {\n return (\n <span className=\"text-foreground break-all\">&quot;{value}&quot;</span>\n );\n }\n if (value === null || value === undefined) {\n return (\n <span className=\"text-muted-foreground italic\">{String(value)}</span>\n );\n }\n return (\n <span className=\"text-muted-foreground break-all\">{String(value)}</span>\n );\n};\n\nconst TreeNode = ({\n name,\n value,\n depth,\n openDepth,\n compact,\n}: {\n name?: string;\n value: unknown;\n depth: number;\n openDepth: number;\n compact: boolean;\n}) => {\n const [open, setOpen] = useState(depth < openDepth);\n const [showAll, setShowAll] = useState(false);\n\n if (!isContainer(value)) {\n return (\n <div\n className={clsx(\"flex min-w-0\", compact ? \"gap-1 py-px\" : \"gap-1.5\")}\n >\n {name !== undefined ? (\n <span className=\"text-muted-foreground shrink-0\">{name}:</span>\n ) : null}\n <Leaf value={value} />\n </div>\n );\n }\n\n const entries = entriesOf(value);\n const shown = showAll ? entries : entries.slice(0, ENTRY_LIMIT);\n const hidden = entries.length - shown.length;\n\n return (\n <div className=\"min-w-0\">\n <button\n type=\"button\"\n onClick={() => setOpen((prev) => !prev)}\n className={clsx(\n \"text-muted-foreground hover:text-foreground flex items-center\",\n compact ? \"gap-0.5 py-px\" : \"gap-1\",\n )}\n >\n <span\n className={clsx(\n \"inline-block transition-transform\",\n open && \"rotate-90\",\n )}\n >\n ›\n </span>\n {name !== undefined ? <span>{name}</span> : null}\n <span className=\"opacity-60\">{summaryOf(value)}</span>\n </button>\n {open ? (\n <div\n className={clsx(\n \"border-border/60 border-s\",\n compact ? \"ms-1 ps-2\" : \"ms-[5px] ps-3\",\n )}\n >\n {shown.map((entry) => (\n <TreeNode\n key={entry.key}\n name={entry.key}\n value={entry.value}\n depth={depth + 1}\n openDepth={openDepth}\n compact={compact}\n />\n ))}\n {hidden > 0 ? (\n <button\n type=\"button\"\n onClick={() => setShowAll(true)}\n className=\"text-muted-foreground hover:text-foreground text-[10px]\"\n >\n +{hidden} more\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n};\n\nconst InlineJson = ({\n serialized,\n copyText,\n compact,\n}: {\n serialized: string;\n copyText: string;\n compact: boolean;\n}) => (\n <div className=\"flex min-w-0 items-start gap-0.5\">\n <code\n className={clsx(\n \"text-foreground min-w-0 flex-1 font-mono leading-snug break-all\",\n compact ? \"text-[10px]\" : \"text-[11px]\",\n )}\n title={serialized}\n >\n {serialized}\n </code>\n <CopyButton\n value={copyText}\n label=\"Copy JSON\"\n iconOnly\n size={compact ? \"sm\" : \"default\"}\n />\n </div>\n);\n\nconst TreeWithCopy = ({\n value,\n openDepth,\n copyText,\n compact,\n}: {\n value: unknown;\n openDepth: number;\n copyText: string;\n compact: boolean;\n}) => (\n <div className=\"flex min-w-0 items-start gap-0.5\">\n <div\n className={clsx(\n \"min-w-0 flex-1 overflow-auto font-mono [font-variant-numeric:tabular-nums] [font-variant-ligatures:none]\",\n compact\n ? \"max-h-32 text-[10px] leading-snug\"\n : \"border-border bg-muted/40 max-h-[360px] rounded-md border p-3 text-[11px] leading-relaxed\",\n )}\n >\n <TreeNode\n value={value}\n depth={0}\n openDepth={openDepth}\n compact={compact}\n />\n </div>\n <CopyButton\n value={copyText}\n label=\"Copy JSON\"\n iconOnly\n size={compact ? \"sm\" : \"default\"}\n className=\"pt-px\"\n />\n </div>\n);\n\n/**\n * Recursive JSON view. `compact` fits tool rows; copy always provides formatted JSON.\n */\nexport const JSONTree = ({\n value,\n openDepth = 1,\n compact = false,\n}: {\n value: unknown;\n openDepth?: number;\n compact?: boolean;\n}) => {\n const isLeaf = isInline(value, compact) || !isContainer(value);\n const serialized = useMemo(\n () => (isLeaf ? serialize(value, compact) : \"\"),\n [value, compact, isLeaf],\n );\n const copyText = useMemo(() => JSON.stringify(value, null, 2), [value]);\n\n if (isLeaf) {\n return (\n <InlineJson\n serialized={serialized}\n copyText={copyText}\n compact={compact}\n />\n );\n }\n\n return (\n <TreeWithCopy\n value={value}\n openDepth={openDepth}\n copyText={copyText}\n compact={compact}\n />\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PaneHeader.js","names":["ReactNode","PaneHeader","t0","$","_c","children","trailing","borderless","t1","undefined","t2","t3","t4","t5","PaneHeaderStack","header"],"sources":["../../../src/views/ui/PaneHeader.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/**\n * Fixed-height rail header. Every column in a split layout should use this so\n * titles line up across columns.\n */\nexport const PaneHeader = ({\n children,\n trailing,\n borderless = false,\n}: {\n children: ReactNode;\n trailing?: ReactNode | undefined;\n borderless?: boolean;\n}) => (\n <div\n className={\n borderless\n ? \"bg-background flex h-8 max-h-8 min-h-8 shrink-0 items-center justify-between gap-2 overflow-hidden px-3\"\n : \"border-border bg-background flex h-8 max-h-8 min-h-8 shrink-0 items-center justify-between gap-2 overflow-hidden border-b px-3\"\n }\n >\n <div className=\"text-muted-foreground flex min-w-0 flex-1 items-center truncate text-[11px] leading-none tabular-nums\">\n {children}\n </div>\n {trailing ? (\n <div className=\"text-muted-foreground flex shrink-0 items-center gap-1.5 text-[10px] leading-none\">\n {trailing}\n </div>\n ) : null}\n </div>\n);\n\n/** Header that grows below a {@link PaneHeader}-height title row. */\nexport const PaneHeaderStack = ({\n header,\n children,\n}: {\n header: ReactNode;\n children?: ReactNode | undefined;\n}) => (\n <div className=\"border-border bg-background shrink-0 border-b\">\n {header}\n {children ? <div className=\"border-border border-t\">{children}</div> : null}\n </div>\n);\n"],"mappings":";;;;;;;AAMA,MAAaC,cAAaC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,UAAAC,UAAAC,YAAAC,OAAAN;CAWrB,MAAAQ,MARJF,OAAAC,KAAAA,IAAA,QAAAD,MAQI,4GAAA;CAEoI,IAAAG;CAAA,IAAAR,EAAA,OAAAE,UAAA;EAGtIM,KAAA,oBAAA,OAAA;GAAe,WAAA;GACZN;EACG,CAAA;EAAAF,EAAA,KAAAE;EAAAF,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAG,UAAA;EACLM,KAAAN,WACC,oBAAA,OAAA;GAAe,WAAA;aACZA;EACG,CAAA,IAHP;EAIOH,EAAA,KAAAG;EAAAH,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAU;CAAA,IAAAV,EAAA,OAAAO,MAAAP,EAAA,OAAAQ,MAAAR,EAAA,OAAAS,IAAA;EAdVC,KAAA,qBAAA,OAAA;GAEI,WAAAH;aAFJ,CAOEC,IAGCC,EAKG;;EAAAT,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;EAAAT,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAAA,OAfNU;AAeM;;AAIR,MAAaC,mBAAkBZ,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAW,QAAAV,aAAAH;CAM/B,IAAAM;CAAA,IAAAL,EAAA,OAAAE,UAAA;EAGIG,KAAAH,WAAW,oBAAA,OAAA;GAAe,WAAA;GAA0BA;EAAe,CAAA,IAAnE;EAA0EF,EAAA,KAAAE;EAAAF,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAY,UAAAZ,EAAA,OAAAK,IAAA;EAF7EE,KAAA,qBAAA,OAAA;GAAe,WAAA;aAAf,CACGK,QACAP,EACG;;EAAAL,EAAA,KAAAY;EAAAZ,EAAA,KAAAK;EAAAL,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,OAHNO;AAGM"}
1
+ {"version":3,"file":"PaneHeader.js","names":["ReactNode","PaneHeader","t0","$","_c","children","trailing","borderless","t1","undefined","t2","t3","t4","t5","PaneHeaderStack","header"],"sources":["../../../src/views/ui/PaneHeader.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/**\n * Fixed-height rail header. Every column in a split layout should use this so\n * titles line up across columns.\n */\nexport const PaneHeader = ({\n children,\n trailing,\n borderless = false,\n}: {\n children: ReactNode;\n trailing?: ReactNode | undefined;\n borderless?: boolean;\n}) => (\n <div\n className={\n borderless\n ? \"bg-background flex h-8 max-h-8 min-h-8 shrink-0 items-center justify-between gap-2 overflow-hidden px-3\"\n : \"border-border bg-background flex h-8 max-h-8 min-h-8 shrink-0 items-center justify-between gap-2 overflow-hidden border-b px-3\"\n }\n >\n <div className=\"text-muted-foreground flex min-w-0 flex-1 items-center truncate text-[11px] leading-none tabular-nums\">\n {children}\n </div>\n {trailing ? (\n <div className=\"text-muted-foreground flex shrink-0 items-center gap-1.5 text-[10px] leading-none\">\n {trailing}\n </div>\n ) : null}\n </div>\n);\n\n/** Header that grows below a {@link PaneHeader}-height title row. */\nexport const PaneHeaderStack = ({\n header,\n children,\n}: {\n header: ReactNode;\n children?: ReactNode | undefined;\n}) => (\n <div className=\"border-border bg-background shrink-0 border-b\">\n {header}\n {children ? <div className=\"border-border border-t\">{children}</div> : null}\n </div>\n);\n"],"mappings":";;;;;;;AAMA,MAAaC,cAAaC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,UAAAC,UAAAC,YAAAC,OAAAN;CAWrB,MAAAQ,MARJF,OAAAC,KAAAA,IAAA,QAAAD,MAQI,4GAAA;CAEoI,IAAAG;CAAA,IAAAR,EAAA,OAAAE,UAAA;EAGtIM,KAAA,oBAAA,OAAA;GAAe,WAAA;GACZN;EACG,CAAA;EAAAF,EAAA,KAAAE;EAAAF,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAG,UAAA;EACLM,KAAAN,WACC,oBAAA,OAAA;GAAe,WAAA;GACZA,UAAAA;EACG,CAAA,IAHP;EAIOH,EAAA,KAAAG;EAAAH,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAU;CAAA,IAAAV,EAAA,OAAAO,MAAAP,EAAA,OAAAQ,MAAAR,EAAA,OAAAS,IAAA;EAdVC,KAAA,qBAAA,OAAA;GAEI,WAAAH;GAFJ,UAAA,CAOEC,IAGCC,EAKG;;EAAAT,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;EAAAT,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAAA,OAfNU;AAeM;;AAIR,MAAaC,mBAAkBZ,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAW,QAAAV,aAAAH;CAM/B,IAAAM;CAAA,IAAAL,EAAA,OAAAE,UAAA;EAGIG,KAAAH,WAAW,oBAAA,OAAA;GAAe,WAAA;GAA0BA;EAAe,CAAA,IAAnE;EAA0EF,EAAA,KAAAE;EAAAF,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAY,UAAAZ,EAAA,OAAAK,IAAA;EAF7EE,KAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACGK,QACAP,EACG;;EAAAL,EAAA,KAAAY;EAAAZ,EAAA,KAAAK;EAAAL,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,OAHNO;AAGM"}
@@ -1 +1 @@
1
- {"version":3,"file":"RailTime.js","names":["clsx","formatWhen","formatWhenLabel","RailTime","t0","$","_c","value","className","t1","when","t2","t3","t4"],"sources":["../../../src/views/ui/RailTime.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { formatWhen, formatWhenLabel } from \"../../utils/common\";\n\n/** Compact timestamp for narrow rails; full value goes in the tooltip. */\nexport const RailTime = ({\n value,\n className,\n}: {\n value: string | undefined;\n className?: string | undefined;\n}) => {\n const when = formatWhen(value);\n if (!when) return null;\n\n return (\n <time\n dateTime={value}\n title={formatWhenLabel(value)}\n className={clsx(\n \"text-muted-foreground font-mono text-[10px] leading-none whitespace-nowrap tabular-nums\",\n className,\n )}\n >\n {when}\n </time>\n );\n};\n"],"mappings":";;;;;;AAIA,MAAaG,YAAWC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,OAAAC,cAAAJ;CAMxB,IAAAK;CAAA,IAAAJ,EAAA,OAAAE,OAAA;EACcE,KAAAR,WAAWM,KAAK;EAACF,EAAA,KAAAE;EAAAF,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAA9B,MAAAK,OAAaD;CACb,IAAI,CAACC,MAAI,OAAS;CAAK,IAAAC;CAAA,IAAAN,EAAA,OAAAE,OAAA;EAKZI,KAAAT,gBAAgBK,KAAK;EAACF,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAG,WAAA;EAClBI,KAAAZ,KACT,2FACAQ,SACF;EAACH,EAAA,KAAAG;EAAAH,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,IAAAQ;CAAA,IAAAR,EAAA,OAAAM,MAAAN,EAAA,OAAAO,MAAAP,EAAA,OAAAE,SAAAF,EAAA,OAAAK,MAAA;EANHG,KAAA,oBAAA,QAAA;GACYN,UAAAA;GACH,OAAAI;GACI,WAAAC;aAKVF;EACI,CAAA;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAE;EAAAF,EAAA,KAAAK;EAAAL,EAAA,MAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,OATPQ;AASO"}
1
+ {"version":3,"file":"RailTime.js","names":["clsx","formatWhen","formatWhenLabel","RailTime","t0","$","_c","value","className","t1","when","t2","t3","t4"],"sources":["../../../src/views/ui/RailTime.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { formatWhen, formatWhenLabel } from \"../../utils/common\";\n\n/** Compact timestamp for narrow rails; full value goes in the tooltip. */\nexport const RailTime = ({\n value,\n className,\n}: {\n value: string | undefined;\n className?: string | undefined;\n}) => {\n const when = formatWhen(value);\n if (!when) return null;\n\n return (\n <time\n dateTime={value}\n title={formatWhenLabel(value)}\n className={clsx(\n \"text-muted-foreground font-mono text-[10px] leading-none whitespace-nowrap tabular-nums\",\n className,\n )}\n >\n {when}\n </time>\n );\n};\n"],"mappings":";;;;;;AAIA,MAAaG,YAAWC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,OAAAC,cAAAJ;CAMxB,IAAAK;CAAA,IAAAJ,EAAA,OAAAE,OAAA;EACcE,KAAAR,WAAWM,KAAK;EAACF,EAAA,KAAAE;EAAAF,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAA9B,MAAAK,OAAaD;CACb,IAAI,CAACC,MAAI,OAAS;CAAK,IAAAC;CAAA,IAAAN,EAAA,OAAAE,OAAA;EAKZI,KAAAT,gBAAgBK,KAAK;EAACF,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAG,WAAA;EAClBI,KAAAZ,KACT,2FACAQ,SACF;EAACH,EAAA,KAAAG;EAAAH,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,IAAAQ;CAAA,IAAAR,EAAA,OAAAM,MAAAN,EAAA,OAAAO,MAAAP,EAAA,OAAAE,SAAAF,EAAA,OAAAK,MAAA;EANHG,KAAA,oBAAA,QAAA;GACYN,UAAAA;GACH,OAAAI;GACI,WAAAC;GAKVF,UAAAA;EACI,CAAA;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAE;EAAAF,EAAA,KAAAK;EAAAL,EAAA,MAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,OATPQ;AASO"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectableRow.d.ts","names":[],"sources":["../../../src/views/ui/SelectableRow.tsx"],"mappings":";;;;;;;cAQa,+BAAa;;;;;;YAQZ;kCAAA"}
1
+ {"version":3,"file":"SelectableRow.d.ts","names":[],"sources":["../../../src/views/ui/SelectableRow.tsx"],"mappings":";;;;;;;cAQa,+BAAa;EAGX;EACA;EACC;;EAEJ;EACE,UAAA;oBAwBZ,cAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Sparkline.js","names":["clsx","Sparkline","t0","$","_c","values","className","length","max","Math","min","range","step","t1","value","index","toFixed","point","t2","map","join","points","lastValue","t3","split","lastX","lastY","t4","t5","t6","t7"],"sources":["../../../src/views/ui/Sparkline.tsx"],"sourcesContent":["import clsx from \"clsx\";\n\n/**\n * A monochrome trend line drawn as an SVG polyline. No axes, legend, or\n * gridlines: it answers \"is this metric rising, falling, or spiking\" at a\n * glance and nothing more. Renders nothing below 2 points; color comes from the\n * surrounding text color (`currentColor`).\n */\nexport const Sparkline = ({\n values,\n className,\n}: {\n values: readonly number[];\n className?: string;\n}) => {\n if (values.length < 2) return null;\n\n const width = 100;\n const height = 24;\n const max = Math.max(...values);\n const min = Math.min(...values);\n const range = max - min || 1;\n const step = width / (values.length - 1);\n\n const point = (value: number, index: number) =>\n `${(index * step).toFixed(1)},${(height - ((value - min) / range) * height).toFixed(1)}`;\n const points = values.map(point).join(\" \");\n const lastValue = values[values.length - 1]!;\n const [lastX, lastY] = point(lastValue, values.length - 1).split(\",\");\n\n return (\n <svg\n viewBox={`0 0 ${width} ${height}`}\n className={clsx(\"text-muted-foreground\", className)}\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n <polyline\n points={points}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n <circle cx={lastX} cy={lastY} r=\"2\" fill=\"currentColor\" />\n </svg>\n );\n};\n"],"mappings":";;;;;;;;;;AAQA,MAAaC,aAAYC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,QAAAC,cAAAJ;CAOxB,IAAIG,OAAME,SAAU,GAAC,OAAS;CAI9B,MAAAC,MAAYC,KAAID,IAAI,GAAIH,MAAM;CAC9B,MAAAK,MAAYD,KAAIC,IAAI,GAAIL,MAAM;CAC9B,MAAAM,QAAcH,MAAME,OAAN;CACd,MAAAE,OALc,OAKQP,OAAME,SAAU;CAAG,IAAAM;CAAA,IAAAV,EAAA,OAAAO,OAAAP,EAAA,OAAAQ,SAAAR,EAAA,OAAAS,MAAA;EAE3BC,MAAAC,OAAAC,UACZ,IAAIA,QAAQH,KAAAA,CAAII,QAAU,CAAC,EAAC,IAPf,MAO+BF,QAAQJ,OAAOC,QAP9C,GAAA,CAO6DK,QAAU,CAAC;EAAGb,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;EAAAT,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAD1F,MAAAc,QAAcJ;CAC6E,IAAAK;CAAA,IAAAf,EAAA,OAAAc,SAAAd,EAAA,OAAAE,QAAA;EAC5Ea,KAAAb,OAAMc,IAAKF,KAAK,CAAC,CAAAG,KAAM,GAAG;EAACjB,EAAA,KAAAc;EAAAd,EAAA,KAAAE;EAAAF,EAAA,KAAAe;CAAA,OAAAA,KAAAf,EAAA;CAA1C,MAAAkB,SAAeH;CACf,MAAAI,YAAkBjB,OAAOA,OAAME,SAAU;CAAI,IAAAgB;CAAA,IAAApB,EAAA,OAAAmB,aAAAnB,EAAA,OAAAc,SAAAd,EAAA,OAAAE,OAAAE,QAAA;EACtBgB,KAAAN,MAAMK,WAAWjB,OAAME,SAAU,CAAC,CAAC,CAAAiB,MAAO,GAAG;EAACrB,EAAA,KAAAmB;EAAAnB,EAAA,KAAAc;EAAAd,EAAA,KAAAE,OAAAE;EAAAJ,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAArE,MAAA,CAAAsB,OAAAC,SAAuBH;CAA+C,IAAAI;CAAA,IAAAxB,EAAA,QAAAG,WAAA;EAKvDqB,KAAA3B,KAAK,yBAAyBM,SAAS;EAACH,EAAA,MAAAG;EAAAH,EAAA,MAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAAkB,QAAA;EAInDO,KAAA,oBAAA,YAAA;GACUP;GACH,MAAA;GACE,QAAA;GACK,aAAA;GACG,gBAAA;GACF,cAAA;EAAoB,CAAA;EACjClB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,QAAAsB,SAAAtB,EAAA,QAAAuB,OAAA;EACFG,KAAA,oBAAA,UAAA;GAAYJ,IAAAA;GAAWC,IAAAA;GAAS,GAAA;GAAS,MAAA;EAAc,CAAA;EAAGvB,EAAA,MAAAsB;EAAAtB,EAAA,MAAAuB;EAAAvB,EAAA,MAAA0B;CAAA,OAAAA,KAAA1B,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAAwB,MAAAxB,EAAA,QAAAyB,MAAAzB,EAAA,QAAA0B,IAAA;EAd5DC,KAAA,qBAAA,OAAA;GACW,SAAA;GACE,WAAAH;GACS,qBAAA;GACR,eAAA;aAJd,CAMEC,IAQAC,EACI;;EAAA1B,EAAA,MAAAwB;EAAAxB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;EAAA1B,EAAA,MAAA2B;CAAA,OAAAA,KAAA3B,EAAA;CAAA,OAfN2B;AAeM"}
1
+ {"version":3,"file":"Sparkline.js","names":["clsx","Sparkline","t0","$","_c","values","className","length","max","Math","min","range","step","t1","value","index","toFixed","point","t2","map","join","points","lastValue","t3","split","lastX","lastY","t4","t5","t6","t7"],"sources":["../../../src/views/ui/Sparkline.tsx"],"sourcesContent":["import clsx from \"clsx\";\n\n/**\n * A monochrome trend line drawn as an SVG polyline. No axes, legend, or\n * gridlines: it answers \"is this metric rising, falling, or spiking\" at a\n * glance and nothing more. Renders nothing below 2 points; color comes from the\n * surrounding text color (`currentColor`).\n */\nexport const Sparkline = ({\n values,\n className,\n}: {\n values: readonly number[];\n className?: string;\n}) => {\n if (values.length < 2) return null;\n\n const width = 100;\n const height = 24;\n const max = Math.max(...values);\n const min = Math.min(...values);\n const range = max - min || 1;\n const step = width / (values.length - 1);\n\n const point = (value: number, index: number) =>\n `${(index * step).toFixed(1)},${(height - ((value - min) / range) * height).toFixed(1)}`;\n const points = values.map(point).join(\" \");\n const lastValue = values[values.length - 1]!;\n const [lastX, lastY] = point(lastValue, values.length - 1).split(\",\");\n\n return (\n <svg\n viewBox={`0 0 ${width} ${height}`}\n className={clsx(\"text-muted-foreground\", className)}\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n <polyline\n points={points}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n <circle cx={lastX} cy={lastY} r=\"2\" fill=\"currentColor\" />\n </svg>\n );\n};\n"],"mappings":";;;;;;;;;;AAQA,MAAaC,aAAYC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,QAAAC,cAAAJ;CAOxB,IAAIG,OAAME,SAAU,GAAC,OAAS;CAI9B,MAAAC,MAAYC,KAAID,IAAI,GAAIH,MAAM;CAC9B,MAAAK,MAAYD,KAAIC,IAAI,GAAIL,MAAM;CAC9B,MAAAM,QAAcH,MAAME,OAAN;CACd,MAAAE,OALc,OAKQP,OAAME,SAAU;CAAG,IAAAM;CAAA,IAAAV,EAAA,OAAAO,OAAAP,EAAA,OAAAQ,SAAAR,EAAA,OAAAS,MAAA;EAE3BC,MAAAC,OAAAC,UACZ,IAAIA,QAAQH,KAAAA,CAAII,QAAU,CAAC,EAAC,IAPf,MAO+BF,QAAQJ,OAAOC,QAP9C,GAAA,CAO6DK,QAAU,CAAC;EAAGb,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;EAAAT,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAD1F,MAAAc,QAAcJ;CAC6E,IAAAK;CAAA,IAAAf,EAAA,OAAAc,SAAAd,EAAA,OAAAE,QAAA;EAC5Ea,KAAAb,OAAMc,IAAKF,KAAK,CAAC,CAAAG,KAAM,GAAG;EAACjB,EAAA,KAAAc;EAAAd,EAAA,KAAAE;EAAAF,EAAA,KAAAe;CAAA,OAAAA,KAAAf,EAAA;CAA1C,MAAAkB,SAAeH;CACf,MAAAI,YAAkBjB,OAAOA,OAAME,SAAU;CAAI,IAAAgB;CAAA,IAAApB,EAAA,OAAAmB,aAAAnB,EAAA,OAAAc,SAAAd,EAAA,OAAAE,OAAAE,QAAA;EACtBgB,KAAAN,MAAMK,WAAWjB,OAAME,SAAU,CAAC,CAAC,CAAAiB,MAAO,GAAG;EAACrB,EAAA,KAAAmB;EAAAnB,EAAA,KAAAc;EAAAd,EAAA,KAAAE,OAAAE;EAAAJ,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAArE,MAAA,CAAAsB,OAAAC,SAAuBH;CAA+C,IAAAI;CAAA,IAAAxB,EAAA,QAAAG,WAAA;EAKvDqB,KAAA3B,KAAK,yBAAyBM,SAAS;EAACH,EAAA,MAAAG;EAAAH,EAAA,MAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAAkB,QAAA;EAInDO,KAAA,oBAAA,YAAA;GACUP;GACH,MAAA;GACE,QAAA;GACK,aAAA;GACG,gBAAA;GACF,cAAA;EAAoB,CAAA;EACjClB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,QAAAsB,SAAAtB,EAAA,QAAAuB,OAAA;EACFG,KAAA,oBAAA,UAAA;GAAYJ,IAAAA;GAAWC,IAAAA;GAAS,GAAA;GAAS,MAAA;EAAc,CAAA;EAAGvB,EAAA,MAAAsB;EAAAtB,EAAA,MAAAuB;EAAAvB,EAAA,MAAA0B;CAAA,OAAAA,KAAA1B,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAAwB,MAAAxB,EAAA,QAAAyB,MAAAzB,EAAA,QAAA0B,IAAA;EAd5DC,KAAA,qBAAA,OAAA;GACW,SAAA;GACE,WAAAH;GACS,qBAAA;GACR,eAAA;GAJd,UAAA,CAMEC,IAQAC,EACI;;EAAA1B,EAAA,MAAAwB;EAAAxB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;EAAA1B,EAAA,MAAA2B;CAAA,OAAAA,KAAA3B,EAAA;CAAA,OAfN2B;AAeM"}
@@ -1 +1 @@
1
- {"version":3,"file":"SummaryItem.js","names":["ReactNode","SummaryItem","t0","$","_c","label","value","t1","t2","t3","SummaryList","children"],"sources":["../../../src/views/ui/SummaryItem.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/**\n * A key/value row: label left, value right on one baseline. Flat (no box). Group\n * a sequence in `SummaryList` for hairline dividers.\n */\nexport const SummaryItem = ({\n label,\n value,\n}: {\n label: string;\n value: ReactNode;\n}) => (\n <div className=\"flex min-h-7 items-baseline justify-between gap-2 py-1 text-[11px]\">\n <span className=\"text-muted-foreground shrink-0\">{label}</span>\n <span className=\"text-foreground min-w-0 truncate text-right font-medium tabular-nums\">\n {value}\n </span>\n </div>\n);\n\n/** Divided list of `SummaryItem` rows. Unboxed: dividers do the grouping. */\nexport const SummaryList = ({ children }: { children: ReactNode }) => (\n <div className=\"divide-border divide-y\">{children}</div>\n);\n"],"mappings":";;;;;;;AAMA,MAAaC,eAAcC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,OAAAC,UAAAJ;CAM3B,IAAAK;CAAA,IAAAJ,EAAA,OAAAE,OAAA;EAEGE,KAAA,oBAAA,QAAA;GAAgB,WAAA;aAAkCF;EAAa,CAAA;EAAAF,EAAA,KAAAE;EAAAF,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAG,OAAA;EAC/DE,KAAA,oBAAA,QAAA;GAAgB,WAAA;aACbF;EACI,CAAA;EAAAH,EAAA,KAAAG;EAAAH,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAI,MAAAJ,EAAA,OAAAK,IAAA;EAJTC,KAAA,qBAAA,OAAA;GAAe,WAAA;aAAf,CACEF,IACAC,EAGI;;EAAAL,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,OALNM;AAKM;;AAIR,MAAaC,eAAcR,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAO,aAAAT;CAAqC,IAAAK;CAAA,IAAAJ,EAAA,OAAAQ,UAAA;EAC/DJ,KAAA,oBAAA,OAAA;GAAe,WAAA;GAA0BI;EAAe,CAAA;EAAAR,EAAA,KAAAQ;EAAAR,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,OAAxDI;AAAwD"}
1
+ {"version":3,"file":"SummaryItem.js","names":["ReactNode","SummaryItem","t0","$","_c","label","value","t1","t2","t3","SummaryList","children"],"sources":["../../../src/views/ui/SummaryItem.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/**\n * A key/value row: label left, value right on one baseline. Flat (no box). Group\n * a sequence in `SummaryList` for hairline dividers.\n */\nexport const SummaryItem = ({\n label,\n value,\n}: {\n label: string;\n value: ReactNode;\n}) => (\n <div className=\"flex min-h-7 items-baseline justify-between gap-2 py-1 text-[11px]\">\n <span className=\"text-muted-foreground shrink-0\">{label}</span>\n <span className=\"text-foreground min-w-0 truncate text-right font-medium tabular-nums\">\n {value}\n </span>\n </div>\n);\n\n/** Divided list of `SummaryItem` rows. Unboxed: dividers do the grouping. */\nexport const SummaryList = ({ children }: { children: ReactNode }) => (\n <div className=\"divide-border divide-y\">{children}</div>\n);\n"],"mappings":";;;;;;;AAMA,MAAaC,eAAcC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,OAAAC,UAAAJ;CAM3B,IAAAK;CAAA,IAAAJ,EAAA,OAAAE,OAAA;EAEGE,KAAA,oBAAA,QAAA;GAAgB,WAAA;GAAkCF,UAAAA;EAAa,CAAA;EAAAF,EAAA,KAAAE;EAAAF,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAG,OAAA;EAC/DE,KAAA,oBAAA,QAAA;GAAgB,WAAA;GACbF,UAAAA;EACI,CAAA;EAAAH,EAAA,KAAAG;EAAAH,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAI,MAAAJ,EAAA,OAAAK,IAAA;EAJTC,KAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACEF,IACAC,EAGI;;EAAAL,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,OALNM;AAKM;;AAIR,MAAaC,eAAcR,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAO,aAAAT;CAAqC,IAAAK;CAAA,IAAAJ,EAAA,OAAAQ,UAAA;EAC/DJ,KAAA,oBAAA,OAAA;GAAe,WAAA;GAA0BI;EAAe,CAAA;EAAAR,EAAA,KAAAQ;EAAAR,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,OAAxDI;AAAwD"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCopyToClipboard.d.ts","names":[],"sources":["../../../src/views/ui/useCopyToClipboard.ts"],"mappings":";cAEa,uBAAsB;EAGjC"}
1
+ {"version":3,"file":"useCopyToClipboard.d.ts","names":[],"sources":["../../../src/views/ui/useCopyToClipboard.ts"],"mappings":";cAEa,uBAAsB;EAGjC;;;EAKU,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react-devtools",
3
- "version": "1.2.9",
3
+ "version": "1.2.10",
4
4
  "description": "React development tools for assistant-ui components",
5
5
  "keywords": [
6
6
  "assistant-ui",
@@ -47,17 +47,17 @@
47
47
  }
48
48
  },
49
49
  "devDependencies": {
50
- "@tailwindcss/cli": "^4.3.2",
50
+ "@tailwindcss/cli": "^4.3.3",
51
51
  "@types/node": "^26.1.1",
52
52
  "@types/react": "^19.2.17",
53
53
  "@types/react-dom": "^19.2.3",
54
- "react": "^19.2.7",
55
- "react-dom": "^19.2.7",
56
- "tailwindcss": "^4.3.2",
54
+ "react": "^19.2.8",
55
+ "react-dom": "^19.2.8",
56
+ "tailwindcss": "^4.3.3",
57
57
  "vitest": "^4.1.10",
58
- "@assistant-ui/react": "0.14.27",
59
- "@assistant-ui/tap": "0.9.4",
60
- "@assistant-ui/x-buildutils": "0.0.18"
58
+ "@assistant-ui/react": "0.14.28",
59
+ "@assistant-ui/tap": "0.9.5",
60
+ "@assistant-ui/x-buildutils": "0.0.19"
61
61
  },
62
62
  "publishConfig": {
63
63
  "access": "public",