@anvia/studio 1.0.0-rc.9 → 1.0.1

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 (99) hide show
  1. package/README.md +1 -0
  2. package/dist/index.d.ts +2 -2
  3. package/dist/index.js +29 -22
  4. package/dist/index.js.map +1 -1
  5. package/dist/ui/assets/{ArrowClockwise.es-CSEY3Qr6.js → ArrowClockwise.es-5vr4h4OH.js} +2 -2
  6. package/dist/ui/assets/{ArrowClockwise.es-CSEY3Qr6.js.map → ArrowClockwise.es-5vr4h4OH.js.map} +1 -1
  7. package/dist/ui/assets/{CaretDown.es-BHAPbv1R.js → CaretDown.es-CXu4Fvbf.js} +2 -2
  8. package/dist/ui/assets/{CaretDown.es-BHAPbv1R.js.map → CaretDown.es-CXu4Fvbf.js.map} +1 -1
  9. package/dist/ui/assets/{Check.es-BLChmggz.js → Check.es-DSXK9-8c.js} +2 -2
  10. package/dist/ui/assets/{Check.es-BLChmggz.js.map → Check.es-DSXK9-8c.js.map} +1 -1
  11. package/dist/ui/assets/{Wrench.es-BL6BmNv7.js → Wrench.es-Cl38Pi3C.js} +2 -2
  12. package/dist/ui/assets/{Wrench.es-BL6BmNv7.js.map → Wrench.es-Cl38Pi3C.js.map} +1 -1
  13. package/dist/ui/assets/{agents-page-DQqt45If.js → agents-page-h-83w9EN.js} +2 -2
  14. package/dist/ui/assets/{agents-page-DQqt45If.js.map → agents-page-h-83w9EN.js.map} +1 -1
  15. package/dist/ui/assets/{badge-CcajoiAt.js → badge-O3YyUN3G.js} +2 -2
  16. package/dist/ui/assets/{badge-CcajoiAt.js.map → badge-O3YyUN3G.js.map} +1 -1
  17. package/dist/ui/assets/{button-07gzSO47.js → button-Dsqwey2_.js} +2 -2
  18. package/dist/ui/assets/{button-07gzSO47.js.map → button-Dsqwey2_.js.map} +1 -1
  19. package/dist/ui/assets/dialog-DN8F1Aaq.js +2 -0
  20. package/dist/ui/assets/{dialog-CNNQ3hoF.js.map → dialog-DN8F1Aaq.js.map} +1 -1
  21. package/dist/ui/assets/{dist-CqMdRzwk.js → dist-CUv0NHNl.js} +2 -2
  22. package/dist/ui/assets/{dist-CqMdRzwk.js.map → dist-CUv0NHNl.js.map} +1 -1
  23. package/dist/ui/assets/dist-PrGeYMiK.js +2 -0
  24. package/dist/ui/assets/{dist-DWqJwN1i.js.map → dist-PrGeYMiK.js.map} +1 -1
  25. package/dist/ui/assets/es2015-Ck1KeeEx.js +42 -0
  26. package/dist/ui/assets/es2015-Ck1KeeEx.js.map +1 -0
  27. package/dist/ui/assets/{icon-CqkMSRbt.js → icon-DyadsXLr.js} +2 -2
  28. package/dist/ui/assets/icon-DyadsXLr.js.map +1 -0
  29. package/dist/ui/assets/index-Dggzi3lZ.js +75 -0
  30. package/dist/ui/assets/index-Dggzi3lZ.js.map +1 -0
  31. package/dist/ui/assets/index-VCdJ2Rb4.css +2 -0
  32. package/dist/ui/assets/{input-BiI6gsxA.js → input-DHvac9Uq.js} +2 -2
  33. package/dist/ui/assets/{input-BiI6gsxA.js.map → input-DHvac9Uq.js.map} +1 -1
  34. package/dist/ui/assets/{knowledge-model-S51n2rKh.js → knowledge-model-B6kRb7zc.js} +1 -1
  35. package/dist/ui/assets/{knowledge-model-S51n2rKh.js.map → knowledge-model-B6kRb7zc.js.map} +1 -1
  36. package/dist/ui/assets/{knowledge-page-DzRhA9qQ.js → knowledge-page-DKnPrmhK.js} +2 -2
  37. package/dist/ui/assets/knowledge-page-DKnPrmhK.js.map +1 -0
  38. package/dist/ui/assets/mcps-page-MSz67ifn.js +2 -0
  39. package/dist/ui/assets/mcps-page-MSz67ifn.js.map +1 -0
  40. package/dist/ui/assets/{memory-page-CRmoZTWz.js → memory-page-2qr2eMrI.js} +2 -2
  41. package/dist/ui/assets/{memory-page-CRmoZTWz.js.map → memory-page-2qr2eMrI.js.map} +1 -1
  42. package/dist/ui/assets/pipelines-page-D1IB1tw-.js +8 -0
  43. package/dist/ui/assets/pipelines-page-D1IB1tw-.js.map +1 -0
  44. package/dist/ui/assets/renderers-BIw5yJkg.js +94 -0
  45. package/dist/ui/assets/renderers-BIw5yJkg.js.map +1 -0
  46. package/dist/ui/assets/{request-7oUPS8zY.js → request-CnFL8L6p.js} +3 -3
  47. package/dist/ui/assets/{request-7oUPS8zY.js.map → request-CnFL8L6p.js.map} +1 -1
  48. package/dist/ui/assets/rfb-NV_fh9Db.js +6 -0
  49. package/dist/ui/assets/{rfb-DiW3PDuT.js.map → rfb-NV_fh9Db.js.map} +1 -1
  50. package/dist/ui/assets/sandboxes-page-DWMtrKYJ.js +2 -0
  51. package/dist/ui/assets/sandboxes-page-DWMtrKYJ.js.map +1 -0
  52. package/dist/ui/assets/select-C1_9fsRu.js +2 -0
  53. package/dist/ui/assets/{select-BOYfrfck.js.map → select-C1_9fsRu.js.map} +1 -1
  54. package/dist/ui/assets/{sessions-page-ClXzRM9K.js → sessions-page-BIk4q-L8.js} +2 -2
  55. package/dist/ui/assets/{sessions-page-ClXzRM9K.js.map → sessions-page-BIk4q-L8.js.map} +1 -1
  56. package/dist/ui/assets/{status-page-DfuQ0fpa.js → status-page-jKTghmnz.js} +2 -2
  57. package/dist/ui/assets/{status-page-DfuQ0fpa.js.map → status-page-jKTghmnz.js.map} +1 -1
  58. package/dist/ui/assets/{studio-CeTsQ4gf.js → studio-Bh00wIF1.js} +2 -2
  59. package/dist/ui/assets/{studio-CeTsQ4gf.js.map → studio-Bh00wIF1.js.map} +1 -1
  60. package/dist/ui/assets/{textarea-DESKg_ZK.js → textarea-CZvhTJxB.js} +2 -2
  61. package/dist/ui/assets/{textarea-DESKg_ZK.js.map → textarea-CZvhTJxB.js.map} +1 -1
  62. package/dist/ui/assets/{tool-runner-Cdrcs2v4.js → tool-runner-BtaZqE3R.js} +2 -2
  63. package/dist/ui/assets/{tool-runner-Cdrcs2v4.js.map → tool-runner-BtaZqE3R.js.map} +1 -1
  64. package/dist/ui/assets/tools-page-D1ewvG0D.js +2 -0
  65. package/dist/ui/assets/tools-page-D1ewvG0D.js.map +1 -0
  66. package/dist/ui/assets/{trace-browser-D93H7Xxs.js → trace-browser-CwRUyCO6.js} +3 -3
  67. package/dist/ui/assets/{trace-browser-D93H7Xxs.js.map → trace-browser-CwRUyCO6.js.map} +1 -1
  68. package/dist/ui/assets/{transcript-item-BadzBIzE.js → transcript-item-ChtaJvPe.js} +2 -2
  69. package/dist/ui/assets/{transcript-item-BadzBIzE.js.map → transcript-item-ChtaJvPe.js.map} +1 -1
  70. package/dist/ui/assets/utils-DzstcfqT.js +2 -0
  71. package/dist/ui/assets/{utils-C9GMruoG.js.map → utils-DzstcfqT.js.map} +1 -1
  72. package/dist/ui/assets/{with-selector-CRZWaZzC.js → with-selector-B8ah9Wvu.js} +2 -2
  73. package/dist/ui/assets/{with-selector-CRZWaZzC.js.map → with-selector-B8ah9Wvu.js.map} +1 -1
  74. package/dist/ui/index.html +19 -20
  75. package/package.json +11 -11
  76. package/dist/ui/assets/chunk-QGX73TSQ-D9QAGlAY.js +0 -65
  77. package/dist/ui/assets/chunk-QGX73TSQ-D9QAGlAY.js.map +0 -1
  78. package/dist/ui/assets/dialog-CNNQ3hoF.js +0 -2
  79. package/dist/ui/assets/dist-DWqJwN1i.js +0 -2
  80. package/dist/ui/assets/es2015-DsZq7PFO.js +0 -42
  81. package/dist/ui/assets/es2015-DsZq7PFO.js.map +0 -1
  82. package/dist/ui/assets/icon-CqkMSRbt.js.map +0 -1
  83. package/dist/ui/assets/index-BGNC3dLD.css +0 -1
  84. package/dist/ui/assets/index-Cd0icc_h.js +0 -12
  85. package/dist/ui/assets/index-Cd0icc_h.js.map +0 -1
  86. package/dist/ui/assets/knowledge-page-DzRhA9qQ.js.map +0 -1
  87. package/dist/ui/assets/mcps-page-ZVngljXI.js +0 -2
  88. package/dist/ui/assets/mcps-page-ZVngljXI.js.map +0 -1
  89. package/dist/ui/assets/pipelines-page-8osYA129.js +0 -8
  90. package/dist/ui/assets/pipelines-page-8osYA129.js.map +0 -1
  91. package/dist/ui/assets/renderers-BPGo4d2i.js +0 -94
  92. package/dist/ui/assets/renderers-BPGo4d2i.js.map +0 -1
  93. package/dist/ui/assets/rfb-DiW3PDuT.js +0 -6
  94. package/dist/ui/assets/sandboxes-page-C6kokYwc.js +0 -2
  95. package/dist/ui/assets/sandboxes-page-C6kokYwc.js.map +0 -1
  96. package/dist/ui/assets/select-BOYfrfck.js +0 -2
  97. package/dist/ui/assets/tools-page-C865VQmM.js +0 -2
  98. package/dist/ui/assets/tools-page-C865VQmM.js.map +0 -1
  99. package/dist/ui/assets/utils-C9GMruoG.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcps-page-MSz67ifn.js","names":[],"sources":["../../../src/ui/app/modules/mcps/mcps-page.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n StudioAgentMcpServerMetadata,\n StudioAgentMcpsSummary,\n StudioAgentMcpToolMetadata,\n StudioAgentToolMetadata,\n StudioConfig,\n StudioToolRunResponse,\n} from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport {\n StudioEmptyState,\n StudioHeaderMetric,\n StudioPageContent,\n StudioPageHeader,\n StudioPageShell,\n} from \"../../components/ui/studio\";\nimport {\n formatJson,\n parseStudioToolRunResponse,\n SchemaBlock,\n schemaPropertyCount,\n sourceBadgeClass,\n ToolRunner,\n} from \"../tools/tool-runner\";\n\nexport function McpsPage(props: {\n agents: StudioConfig[\"agents\"];\n selectedAgentId: string;\n summary: StudioAgentMcpsSummary | undefined;\n enabled: boolean;\n loading: boolean;\n onSelectAgent: (agentId: string) => void;\n}) {\n const selectedAgent =\n props.agents.find((agent) => agent.id === props.selectedAgentId) ?? props.agents[0];\n const servers = useMemo(() => props.summary?.servers ?? [], [props.summary]);\n const toolCount = servers.reduce((total, server) => total + server.toolCount, 0);\n const runnableTools = useMemo(() => mcpRunnableTools(servers), [servers]);\n const [selectedToolKey, setSelectedToolKey] = useState(\"\");\n const [argsText, setArgsText] = useState(\"{}\");\n const [runState, setRunState] = useState<\"idle\" | \"running\">(\"idle\");\n const [runResponse, setRunResponse] = useState<StudioToolRunResponse | undefined>();\n const [runError, setRunError] = useState(\"\");\n const selectedTool = useMemo(\n () => runnableTools.find((tool) => tool.key === selectedToolKey) ?? runnableTools[0],\n [runnableTools, selectedToolKey],\n );\n const lastSelectedToolKeyRef = useRef(\"\");\n const runRequestIdRef = useRef(0);\n\n useEffect(() => {\n if (runnableTools.length === 0) {\n setSelectedToolKey(\"\");\n return;\n }\n if (!runnableTools.some((tool) => tool.key === selectedToolKey)) {\n setSelectedToolKey(runnableTools[0]?.key ?? \"\");\n }\n }, [runnableTools, selectedToolKey]);\n\n useEffect(() => {\n const nextSelectedToolKey = selectedTool?.key ?? \"\";\n if (lastSelectedToolKeyRef.current === nextSelectedToolKey) {\n return;\n }\n lastSelectedToolKeyRef.current = nextSelectedToolKey;\n runRequestIdRef.current += 1;\n setArgsText(\"{}\");\n setRunState(\"idle\");\n setRunError(\"\");\n setRunResponse(undefined);\n }, [selectedTool]);\n\n async function runSelectedTool() {\n if (selectedTool === undefined) {\n return;\n }\n let args: unknown;\n try {\n args = JSON.parse(argsText);\n } catch (parseError) {\n setRunError(parseError instanceof Error ? parseError.message : String(parseError));\n setRunResponse(undefined);\n return;\n }\n\n setRunState(\"running\");\n setRunError(\"\");\n setRunResponse(undefined);\n const runToolKey = selectedTool.key;\n const requestId = runRequestIdRef.current + 1;\n runRequestIdRef.current = requestId;\n const isCurrentRun = () =>\n runRequestIdRef.current === requestId && lastSelectedToolKeyRef.current === runToolKey;\n try {\n const response = await fetch(\n `/agents/${encodeURIComponent(selectedTool.agentId)}/tools/${encodeURIComponent(\n selectedTool.name,\n )}/runs`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ args }),\n },\n );\n const rawBody = await response.json();\n if (!isCurrentRun()) {\n return;\n }\n const body = parseStudioToolRunResponse(rawBody);\n if (body === undefined) {\n setRunError(`Unexpected Studio tool run response: ${formatJson(rawBody)}`);\n return;\n }\n setRunResponse(body);\n if (!response.ok || body.status === \"error\") {\n setRunError(formatJson(body.error ?? body));\n }\n } catch (error) {\n if (isCurrentRun()) {\n setRunError(error instanceof Error ? error.message : String(error));\n }\n } finally {\n if (isCurrentRun()) {\n setRunState(\"idle\");\n }\n }\n }\n\n return (\n <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"MCPs\">\n <StudioPageHeader\n title=\"MCPs\"\n description=\"MCP servers and remote tools registered on Studio agents, grouped by server.\"\n action={\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-2 max-sm:justify-start\">\n <StudioHeaderMetric label=\"servers\" value={servers.length} />\n <StudioHeaderMetric label=\"tools\" value={toolCount} />\n {props.agents.length > 1 ? (\n <Select value={selectedAgent?.id ?? \"\"} onValueChange={props.onSelectAgent}>\n <SelectTrigger className=\"h-8 min-h-8 w-64 rounded-md border-border text-xs max-sm:w-full\">\n <SelectValue placeholder=\"Agent\" />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {props.agents.map((agent) => (\n <SelectItem value={agent.id} key={agent.id}>\n {agent.name ?? agent.id}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n </div>\n }\n />\n\n <StudioPageContent className=\"overflow-auto\">\n {!props.enabled ? (\n <StudioEmptyState\n title=\"MCPs unavailable\"\n text=\"No registered Studio agent exposes MCP tools.\"\n />\n ) : props.loading ? (\n <StudioEmptyState title=\"Loading MCPs\" text=\"Reading registered MCP metadata.\" />\n ) : servers.length === 0 ? (\n <StudioEmptyState\n title=\"No MCPs\"\n text=\"The selected agent has no registered MCP tools.\"\n />\n ) : (\n <div className=\"grid w-full gap-5\">\n {servers.map((server) => (\n <McpServerSection\n selectedToolKey={selectedTool?.key ?? \"\"}\n server={server}\n key={server.name}\n onSelectTool={setSelectedToolKey}\n />\n ))}\n {runnableTools.length === 0 ? null : (\n <ToolRunner\n argsText={argsText}\n runError={runError}\n runResponse={runResponse}\n runState={runState}\n selectedTool={selectedTool}\n onArgsTextChange={setArgsText}\n onRun={() => void runSelectedTool()}\n />\n )}\n </div>\n )}\n </StudioPageContent>\n </StudioPageShell>\n );\n}\n\nfunction McpServerSection(props: {\n server: StudioAgentMcpServerMetadata;\n selectedToolKey: string;\n onSelectTool: (toolKey: string) => void;\n}) {\n return (\n <section className=\"overflow-hidden border-t\">\n <header className=\"grid min-h-14 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 border-b bg-muted/20 px-4\">\n <div className=\"grid min-w-0 gap-1\">\n <h2 className=\"m-0 truncate text-sm font-semibold text-foreground\">\n {props.server.name}\n </h2>\n <span className=\"truncate text-xs font-medium text-muted-foreground\">\n {props.server.agentId}\n </span>\n </div>\n <Badge className=\"border-border/80 bg-background/50 text-muted-foreground\">\n {props.server.toolCount} tools\n </Badge>\n </header>\n <div className=\"mt-1 grid gap-1\">\n {props.server.tools.map((tool) => (\n <McpToolRow\n serverName={props.server.name}\n active={props.selectedToolKey === mcpToolKey(props.server.name, tool)}\n tool={tool}\n key={`${tool.source}:${tool.name}`}\n onSelectTool={props.onSelectTool}\n />\n ))}\n </div>\n </section>\n );\n}\n\nfunction McpToolRow(props: {\n serverName: string;\n active: boolean;\n tool: StudioAgentMcpToolMetadata;\n onSelectTool: (toolKey: string) => void;\n}) {\n const toolKey = mcpToolKey(props.serverName, props.tool);\n return (\n <article className=\"grid grid-cols-[minmax(300px,0.75fr)_minmax(0,1fr)] gap-2 rounded-lg border border-transparent bg-background/25 p-2 transition duration-200 hover:border-border/70 hover:bg-background/35 max-lg:grid-cols-1\">\n <div className=\"grid content-start gap-4 rounded-lg bg-card/25 p-3\">\n <div className=\"grid gap-1\">\n <h3 className=\"m-0 truncate text-sm font-semibold text-foreground\">{props.tool.name}</h3>\n <span className=\" text-xs font-medium text-muted-foreground\">{props.tool.source}</span>\n </div>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n {props.tool.description}\n </p>\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <Badge className={sourceBadgeClass(props.tool.source)}>{props.tool.source}</Badge>\n <Badge className=\"border-border/80 bg-transparent text-muted-foreground\">\n {schemaPropertyCount(props.tool.parameters)} fields\n </Badge>\n </div>\n <Button\n className=\"h-8 min-h-8 w-fit rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n onClick={() => props.onSelectTool(toolKey)}\n >\n {props.active ? \"Selected\" : \"Use\"}\n </Button>\n </div>\n <SchemaBlock value={props.tool.parameters} title=\"Parameter schema\" />\n </article>\n );\n}\n\ntype McpRunnableTool = StudioAgentToolMetadata & {\n key: string;\n mcpServerName: string;\n};\n\nfunction mcpRunnableTools(servers: StudioAgentMcpServerMetadata[]): McpRunnableTool[] {\n return servers.flatMap((server) =>\n server.tools.map((tool) => ({\n key: mcpToolKey(server.name, tool),\n agentId: server.agentId,\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n source: tool.source,\n mcpServerName: server.name,\n approval: tool.approval,\n })),\n );\n}\n\nfunction mcpToolKey(serverName: string, tool: StudioAgentMcpToolMetadata): string {\n return `${serverName}:${tool.source}:${tool.name}`;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{i as e,r as t,s as n}from"./utils-C9GMruoG.js";import{l as r,t as i}from"./button-07gzSO47.js";import{a,i as o,n as s,r as c,t as l}from"./select-BOYfrfck.js";import{a as u,i as d,n as f,r as p,t as m}from"./studio-CeTsQ4gf.js";import{t as h}from"./badge-CcajoiAt.js";import{t as g}from"./renderers-BPGo4d2i.js";function _(e){if(e.role!==`assistant`||!v(e.metadata))return;let t=e.metadata.anvia;if(!v(t))return;let n=t.generation;if(!v(n)||typeof n.provider!=`string`||typeof n.modelId!=`string`||!w(n.usage))return;let r={...n.usage};n.usage.details!==void 0&&(r={...r,details:{...n.usage.details}});let i={provider:n.provider,modelId:n.modelId,usage:r};return k(n.finishReason)&&(i.finishReason=n.finishReason),typeof n.providerFinishReason==`string`&&(i.providerFinishReason=n.providerFinishReason),y(n.contextUsage)&&(i.contextUsage={...n.contextUsage,model:{...n.contextUsage.model,context:{...n.contextUsage.model.context}}}),D(n.sources)&&(i.sources=n.sources.map(e=>({...e}))),O(n.providerToolCalls)&&(i.providerToolCalls=n.providerToolCalls.map(e=>{let t={...e};return e.details!==void 0&&(t={...t,details:{...e.details}}),t})),i}function v(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function y(e){if(!v(e)||!v(e.model))return!1;let t=e.model.context;if(typeof e.model.modelId==`string`&&v(t)&&x(t.contextWindow)&&S(t.maxInputTokens)&&S(t.maxOutputTokens)&&T(e.usedTokens)&&T(e.remainingTokens)&&C(e.usedPercent)&&C(e.remainingPercent)){let n=t.contextWindow,r=Math.max(0,n-e.usedTokens),i=Math.min(100,e.usedTokens/n*100),a=r/n*100;return e.remainingTokens===r&&b(e.usedPercent,i)&&b(e.remainingPercent,a)}return!1}function b(e,t){let n=Math.max(1,Math.abs(e),Math.abs(t));return Math.abs(e-t)<=2**-52*n*8}function x(e){return T(e)&&e>0}function S(e){return e===void 0||x(e)}function C(e){return T(e)&&e<=100}function w(e){return v(e)?T(e.inputTokens)&&T(e.outputTokens)&&T(e.totalTokens)&&T(e.cachedInputTokens)&&T(e.cacheCreationInputTokens)&&E(e.details):!1}function T(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function E(e){if(e===void 0)return!0;if(!v(e))return!1;let t,n=0;for(let[r,i]of Object.entries(e)){if(i===void 0||!T(i))return!1;r===`total`?t=i:n+=i}return t!==void 0&&t===n}function D(e){return Array.isArray(e)&&e.every(e=>v(e)&&e.type===`url`&&typeof e.url==`string`&&(e.title===void 0||typeof e.title==`string`)&&(e.id===void 0||typeof e.id==`string`)&&(e.startIndex===void 0||typeof e.startIndex==`number`)&&(e.endIndex===void 0||typeof e.endIndex==`number`))}function O(e){return Array.isArray(e)&&e.every(e=>v(e)&&typeof e.id==`string`&&typeof e.name==`string`&&(e.status===void 0||typeof e.status==`string`)&&(e.details===void 0||v(e.details)))}function k(e){return e===`stop`||e===`length`||e===`content-filter`||e===`tool-calls`||e===`other`}var A=n(e(),1),j=t();function M(e){return e.flatMap(e=>e.message.role===`assistant`?[{position:e.position,runId:e.runId,turn:e.turn,createdAt:e.createdAt,preview:I(e.message),generation:_(e.message)}]:[])}function N(e){let t=M(e.records);return(0,j.jsxs)(`section`,{className:`grid min-w-0 overflow-hidden border-y border-border/80`,children:[(0,j.jsxs)(`header`,{className:`flex min-h-11 items-center justify-between gap-3 bg-muted/10 px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:[(0,j.jsx)(`span`,{children:`Assistant responses`}),(0,j.jsxs)(`span`,{className:`font-medium normal-case tracking-normal`,children:[t.length,` responses`]})]}),t.length===0?(0,j.jsx)(`div`,{className:`border-t border-border/70 px-4 py-8 text-center text-sm text-muted-foreground`,children:`No persisted assistant responses.`}):(0,j.jsx)(`div`,{className:`grid divide-y divide-border/70 border-t border-border/70`,children:t.map(e=>(0,j.jsx)(P,{row:e},`${e.position}:${e.runId}`))})]})}function P(e){let t=e.row.generation;return(0,j.jsxs)(`article`,{className:`grid min-w-0 gap-3 px-3 py-4`,children:[(0,j.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center justify-between gap-2`,children:[(0,j.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,j.jsxs)(h,{className:`border-border/80 bg-muted/45 text-foreground`,children:[`Turn `,e.row.turn]}),t===void 0?(0,j.jsx)(h,{className:`border-border/80 bg-background/40 text-muted-foreground`,children:`Usage unavailable`}):(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(h,{className:`border-border/80 bg-muted/45 text-foreground`,children:t.provider}),(0,j.jsx)(h,{className:`max-w-full truncate border-border/80 bg-muted/45 text-foreground`,children:t.modelId})]})]}),(0,j.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:r(e.row.createdAt)})]}),(0,j.jsx)(`p`,{className:`m-0 whitespace-pre-wrap break-words text-sm leading-6 text-foreground`,children:e.row.preview}),t===void 0?null:(0,j.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground`,children:[(0,j.jsx)(F,{label:`total`,value:t.usage.totalTokens,suffix:` tokens`}),(0,j.jsx)(F,{label:`input`,value:t.usage.inputTokens}),(0,j.jsx)(F,{label:`output`,value:t.usage.outputTokens}),(0,j.jsx)(F,{label:`cached`,value:t.usage.cachedInputTokens}),(0,j.jsx)(F,{label:`cache create`,value:t.usage.cacheCreationInputTokens})]})]})}function F(e){return(0,j.jsxs)(`span`,{children:[e.label,` `,e.value.toLocaleString(),e.suffix]})}function I(e){if(typeof e.content==`string`)return e.content.trim().length>0?L(e.content):`Assistant response`;let t=e.content.flatMap(e=>e.type===`text`?[e.text]:[]).join(`
1
+ import{i as e,r as t,s as n}from"./utils-DzstcfqT.js";import{l as r,t as i}from"./button-Dsqwey2_.js";import{a,i as o,n as s,r as c,t as l}from"./select-C1_9fsRu.js";import{a as u,i as d,n as f,r as p,t as m}from"./studio-Bh00wIF1.js";import{t as h}from"./badge-O3YyUN3G.js";import{t as g}from"./renderers-BIw5yJkg.js";function _(e){if(e.role!==`assistant`||!v(e.metadata))return;let t=e.metadata.anvia;if(!v(t))return;let n=t.generation;if(!v(n)||typeof n.provider!=`string`||typeof n.modelId!=`string`||!w(n.usage))return;let r={...n.usage};n.usage.details!==void 0&&(r={...r,details:{...n.usage.details}});let i={provider:n.provider,modelId:n.modelId,usage:r};return k(n.finishReason)&&(i.finishReason=n.finishReason),typeof n.providerFinishReason==`string`&&(i.providerFinishReason=n.providerFinishReason),y(n.contextUsage)&&(i.contextUsage={...n.contextUsage,model:{...n.contextUsage.model,context:{...n.contextUsage.model.context}}}),D(n.sources)&&(i.sources=n.sources.map(e=>({...e}))),O(n.providerToolCalls)&&(i.providerToolCalls=n.providerToolCalls.map(e=>{let t={...e};return e.details!==void 0&&(t={...t,details:{...e.details}}),t})),i}function v(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function y(e){if(!v(e)||!v(e.model))return!1;let t=e.model.context;if(typeof e.model.modelId==`string`&&v(t)&&x(t.contextWindow)&&S(t.maxInputTokens)&&S(t.maxOutputTokens)&&T(e.usedTokens)&&T(e.remainingTokens)&&C(e.usedPercent)&&C(e.remainingPercent)){let n=t.contextWindow,r=Math.max(0,n-e.usedTokens),i=Math.min(100,e.usedTokens/n*100),a=r/n*100;return e.remainingTokens===r&&b(e.usedPercent,i)&&b(e.remainingPercent,a)}return!1}function b(e,t){let n=Math.max(1,Math.abs(e),Math.abs(t));return Math.abs(e-t)<=2**-52*n*8}function x(e){return T(e)&&e>0}function S(e){return e===void 0||x(e)}function C(e){return T(e)&&e<=100}function w(e){return v(e)?T(e.inputTokens)&&T(e.outputTokens)&&T(e.totalTokens)&&T(e.cachedInputTokens)&&T(e.cacheCreationInputTokens)&&E(e.details):!1}function T(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function E(e){if(e===void 0)return!0;if(!v(e))return!1;let t,n=0;for(let[r,i]of Object.entries(e)){if(i===void 0||!T(i))return!1;r===`total`?t=i:n+=i}return t!==void 0&&t===n}function D(e){return Array.isArray(e)&&e.every(e=>v(e)&&e.type===`url`&&typeof e.url==`string`&&(e.title===void 0||typeof e.title==`string`)&&(e.id===void 0||typeof e.id==`string`)&&(e.startIndex===void 0||typeof e.startIndex==`number`)&&(e.endIndex===void 0||typeof e.endIndex==`number`))}function O(e){return Array.isArray(e)&&e.every(e=>v(e)&&typeof e.id==`string`&&typeof e.name==`string`&&(e.status===void 0||typeof e.status==`string`)&&(e.details===void 0||v(e.details)))}function k(e){return e===`stop`||e===`length`||e===`content-filter`||e===`tool-calls`||e===`other`}var A=n(e(),1),j=t();function M(e){return e.flatMap(e=>e.message.role===`assistant`?[{position:e.position,runId:e.runId,turn:e.turn,createdAt:e.createdAt,preview:I(e.message),generation:_(e.message)}]:[])}function N(e){let t=M(e.records);return(0,j.jsxs)(`section`,{className:`grid min-w-0 overflow-hidden border-y border-border/80`,children:[(0,j.jsxs)(`header`,{className:`flex min-h-11 items-center justify-between gap-3 bg-muted/10 px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:[(0,j.jsx)(`span`,{children:`Assistant responses`}),(0,j.jsxs)(`span`,{className:`font-medium normal-case tracking-normal`,children:[t.length,` responses`]})]}),t.length===0?(0,j.jsx)(`div`,{className:`border-t border-border/70 px-4 py-8 text-center text-sm text-muted-foreground`,children:`No persisted assistant responses.`}):(0,j.jsx)(`div`,{className:`grid divide-y divide-border/70 border-t border-border/70`,children:t.map(e=>(0,j.jsx)(P,{row:e},`${e.position}:${e.runId}`))})]})}function P(e){let t=e.row.generation;return(0,j.jsxs)(`article`,{className:`grid min-w-0 gap-3 px-3 py-4`,children:[(0,j.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center justify-between gap-2`,children:[(0,j.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,j.jsxs)(h,{className:`border-border/80 bg-muted/45 text-foreground`,children:[`Turn `,e.row.turn]}),t===void 0?(0,j.jsx)(h,{className:`border-border/80 bg-background/40 text-muted-foreground`,children:`Usage unavailable`}):(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(h,{className:`border-border/80 bg-muted/45 text-foreground`,children:t.provider}),(0,j.jsx)(h,{className:`max-w-full truncate border-border/80 bg-muted/45 text-foreground`,children:t.modelId})]})]}),(0,j.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:r(e.row.createdAt)})]}),(0,j.jsx)(`p`,{className:`m-0 whitespace-pre-wrap break-words text-sm leading-6 text-foreground`,children:e.row.preview}),t===void 0?null:(0,j.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground`,children:[(0,j.jsx)(F,{label:`total`,value:t.usage.totalTokens,suffix:` tokens`}),(0,j.jsx)(F,{label:`input`,value:t.usage.inputTokens}),(0,j.jsx)(F,{label:`output`,value:t.usage.outputTokens}),(0,j.jsx)(F,{label:`cached`,value:t.usage.cachedInputTokens}),(0,j.jsx)(F,{label:`cache create`,value:t.usage.cacheCreationInputTokens})]})]})}function F(e){return(0,j.jsxs)(`span`,{children:[e.label,` `,e.value.toLocaleString(),e.suffix]})}function I(e){if(typeof e.content==`string`)return e.content.trim().length>0?L(e.content):`Assistant response`;let t=e.content.flatMap(e=>e.type===`text`?[e.text]:[]).join(`
2
2
  `).trim();if(t.length>0)return L(t);let n=e.content.flatMap(e=>e.type===`tool-call`?[e.toolName]:[]);if(n.length>0)return`Tool call${n.length===1?``:`s`}: ${n.join(`, `)}`;let r=e.content.flatMap(e=>e.type===`reasoning`?[e.text]:[]).join(`
3
3
  `).trim();if(r.length>0)return L(r);let i=e.content.filter(e=>e.type===`image`).length;return i>0?`${i} generated image${i===1?``:`s`}`:`Assistant response`}function L(e){let t=e.replace(/\s+/g,` `).trim();return t.length>220?`${t.slice(0,217)}...`:t}function R(e){let[t,n]=(0,A.useState)([]),[r,h]=(0,A.useState)(``),[g,_]=(0,A.useState)([]),[v,y]=(0,A.useState)([]),[b,x]=(0,A.useState)(``),[S,C]=(0,A.useState)(``),[w,T]=(0,A.useState)(),[E,D]=(0,A.useState)(),[O,k]=(0,A.useState)(!1),[M,N]=(0,A.useState)(!1),[P,F]=(0,A.useState)(!1),[I,L]=(0,A.useState)(``),R=(0,A.useRef)(0),B=t.find(e=>e.ref===r),H=(0,A.useCallback)(async()=>{if(!e.enabled){n([]),h(``);return}k(!0),L(``);try{let e=await fetch(`/memory/sources`);if(!e.ok)throw Error(`Memory sources failed with HTTP ${e.status}`);let t=await e.json();n(t.sources),h(e=>t.sources.some(t=>t.ref===e)?e:Z(t.sources))}catch(e){L(e instanceof Error?e.message:String(e))}finally{k(!1)}},[e.enabled]);(0,A.useEffect)(()=>{H()},[H]);let G=(0,A.useCallback)(async()=>{let t=R.current+1;if(R.current=t,!e.enabled||B===void 0||!B.available){_([]),y([]),T(void 0),D(void 0),N(!1);return}N(!0),L(``);try{let e=`/memory/sources/${encodeURIComponent(B.ref)}`,[n,r]=await Promise.all([fetch(`${e}/users?limit=50`),fetch(`${e}/conversations?limit=100`)]);if(!n.ok)throw Error(`Memory users failed with HTTP ${n.status}`);if(!r.ok)throw Error(`Memory conversations failed with HTTP ${r.status}`);let i=await n.json(),a=await r.json();if(R.current!==t)return;_(i.users),y(a.conversations),C(e=>a.conversations.find(t=>t.ref===e)?.ref??a.conversations[0]?.ref??``)}catch(e){R.current===t&&L(e instanceof Error?e.message:String(e))}finally{R.current===t&&N(!1)}},[e.enabled,B]);(0,A.useEffect)(()=>{x(``),C(``),_([]),y([]),T(void 0),D(void 0),G()},[G]),(0,A.useEffect)(()=>{if(!e.enabled||B===void 0||!B.available||S.length===0){T(void 0),D(void 0);return}let t=B.ref,n=!1;async function r(){F(!0),L(``);try{let e=`/memory/sources/${encodeURIComponent(t)}/conversations/${encodeURIComponent(S)}`,[r,i]=await Promise.all([fetch(`${e}/messages`),fetch(`${e}/steps`)]);if(!r.ok)throw Error(`Conversation messages failed with HTTP ${r.status}`);if(!i.ok)throw Error(`Conversation steps failed with HTTP ${i.status}`);n||(T(await r.json()),D(await i.json()))}catch(e){n||(L(e instanceof Error?e.message:String(e)),T(void 0),D(void 0))}finally{n||F(!1)}}return r(),()=>{n=!0}},[e.enabled,S,B]);let K=(0,A.useMemo)(()=>b.length===0?v:v.filter(e=>e.userId===b),[v,b]),q=(0,A.useMemo)(()=>X(g,v),[v,g]),Q=K.find(e=>e.ref===S)??K[0];return(0,A.useEffect)(()=>{if(K.length===0){C(``);return}K.some(e=>e.ref===S)||C(K[0]?.ref??``)},[S,K]),(0,j.jsxs)(u,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":`Memory`,children:[(0,j.jsx)(d,{title:`Memory`,description:`Inspect persisted agent conversations directly. Studio sessions appear only as a fallback for agents without configured memory.`,action:(0,j.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start`,children:[t.length===0?null:(0,j.jsxs)(l,{value:r,onValueChange:h,children:[(0,j.jsx)(o,{className:`h-8 min-h-8 w-60 rounded-md border-border text-xs max-sm:w-full`,children:(0,j.jsx)(a,{placeholder:`Memory source`})}),(0,j.jsx)(s,{align:`end`,children:t.map(e=>(0,j.jsxs)(c,{value:e.ref,children:[e.label,e.available?``:` (unavailable)`]},e.ref))})]}),(0,j.jsx)(f,{label:`users`,value:q.userCount}),(0,j.jsx)(f,{label:`conversations`,value:q.conversationCount}),(0,j.jsx)(f,{label:`messages`,value:q.messageCount}),(0,j.jsx)(i,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,disabled:O||M,onClick:()=>void H(),children:`Refresh`})]})}),(0,j.jsx)(p,{className:`overflow-hidden`,children:e.enabled?O&&t.length===0?(0,j.jsx)(m,{title:`Loading memory`,text:`Discovering configured memory sources.`}):I.length>0&&t.length===0?(0,j.jsx)(m,{title:`Memory error`,text:I}):B===void 0?(0,j.jsx)(m,{title:`No memory sources`,text:`No registered agent exposes memory.`}):B.available?M&&v.length===0?(0,j.jsx)(m,{title:`Loading memory`,text:`Reading ${B.label}.`}):I.length>0&&v.length===0?(0,j.jsx)(m,{title:`Memory error`,text:I}):v.length===0?(0,j.jsx)(J,{source:B,userCount:g.length,onRefresh:()=>void G()}):(0,j.jsxs)(`div`,{className:[`grid h-full min-h-0 overflow-hidden`,I.length===0?`grid-rows-[minmax(0,1fr)]`:`grid-rows-[auto_minmax(0,1fr)]`].join(` `),children:[I.length===0?null:(0,j.jsx)(Y,{message:I}),(0,j.jsxs)(`div`,{className:`grid min-h-0 grid-cols-[260px_minmax(320px,0.78fr)_minmax(0,1.22fr)] overflow-hidden border-t border-border/80 max-xl:grid-cols-[240px_minmax(0,1fr)] max-xl:grid-rows-[minmax(240px,0.42fr)_minmax(0,1fr)] max-md:grid-cols-1 max-md:grid-rows-[auto_minmax(240px,0.38fr)_minmax(0,1fr)]`,children:[(0,j.jsx)(z,{users:g,selectedUserId:b,totalConversations:v.length,onSelect:x}),(0,j.jsx)(V,{agents:e.agents,conversations:K,selectedConversationRef:Q?.ref??``,source:B,onSelect:C}),(0,j.jsx)(U,{agents:e.agents,conversation:Q,detailLoading:P,messages:w,source:B,steps:E})]})]}):(0,j.jsx)(W,{source:B}):(0,j.jsx)(m,{title:`Memory unavailable`,text:`No agent memory or Studio session store is configured.`})})]})}function z(e){return(0,j.jsx)(`aside`,{className:`min-h-0 overflow-auto border-r border-border/80 pr-3 max-md:border-b max-md:border-r-0 max-md:pr-0`,children:(0,j.jsxs)(`div`,{className:`grid gap-3 py-4 pr-3 max-md:pr-0`,children:[(0,j.jsx)(K,{label:`Users`,value:e.users.length}),(0,j.jsx)(B,{active:e.selectedUserId.length===0,title:`All users`,detail:`${e.totalConversations} conversations`,onClick:()=>e.onSelect(``)}),(0,j.jsx)(`div`,{className:`grid gap-1`,children:e.users.map(t=>(0,j.jsx)(B,{active:e.selectedUserId===t.userId,title:t.userId,detail:`${t.conversationCount} conversations / ${r(t.lastInteractionAt)}`,onClick:()=>e.onSelect(t.userId)},t.userId))})]})})}function B(e){return(0,j.jsxs)(`button`,{className:[`grid min-w-0 gap-1 rounded-lg border border-transparent px-3 py-2.5 text-left transition duration-200 hover:border-border/80 hover:bg-muted/25 focus-visible:border-ring focus-visible:outline-none`,e.active?`border-border/80 bg-muted/35`:``].join(` `),type:`button`,onClick:e.onClick,children:[(0,j.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.title}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-xs leading-5 text-muted-foreground`,children:e.detail})]})}function V(e){return(0,j.jsx)(`section`,{className:`min-h-0 overflow-auto border-r border-border/80 px-4 max-xl:border-r-0 max-xl:pr-0 max-md:border-b max-md:px-0`,children:(0,j.jsxs)(`div`,{className:`grid gap-3 py-4`,children:[(0,j.jsx)(K,{label:`Conversations`,value:e.conversations.length}),e.conversations.length===0?(0,j.jsx)(`div`,{className:`border-y border-dashed border-border/80 px-3 py-8 text-center text-sm text-muted-foreground`,children:`No conversations for this user.`}):(0,j.jsx)(`div`,{className:`grid border-y border-border/80`,children:e.conversations.map(t=>(0,j.jsx)(H,{active:t.ref===e.selectedConversationRef,agentName:$(e.agents,e.source,t.agentIds),conversation:t,onSelect:()=>e.onSelect(t.ref)},t.ref))})]})})}function H(e){return(0,j.jsxs)(`button`,{className:[`grid min-w-0 gap-2 border-b border-border/70 px-3 py-3 text-left transition duration-200 last:border-b-0 hover:bg-muted/20 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,e.active?`bg-muted/35`:``].join(` `),type:`button`,onClick:e.onSelect,children:[(0,j.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,j.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,j.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.conversation.title??e.conversation.sessionId}),(0,j.jsxs)(`span`,{className:`min-w-0 truncate text-xs text-muted-foreground`,children:[e.agentName,` / `,e.conversation.userId]})]}),(0,j.jsx)(`span`,{className:`shrink-0 text-xs tabular-nums text-muted-foreground`,children:e.conversation.messageCount})]}),(0,j.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground`,children:[(0,j.jsx)(`span`,{children:r(e.conversation.updatedAt)}),(0,j.jsx)(`span`,{className:`min-w-0 truncate`,children:e.conversation.sessionId})]})]})}function U(e){return e.conversation===void 0?(0,j.jsx)(`section`,{className:`min-h-0 overflow-auto py-4 pl-5 max-xl:col-span-2 max-xl:pl-0 max-md:col-span-1`,children:(0,j.jsx)(m,{title:`No conversation selected`,text:`Choose a conversation to inspect.`})}):(0,j.jsx)(`section`,{className:`min-h-0 overflow-auto py-4 pl-5 max-xl:col-span-2 max-xl:pl-0 max-md:col-span-1`,children:(0,j.jsxs)(`div`,{className:`grid min-w-0 gap-5`,children:[(0,j.jsxs)(`header`,{className:`grid gap-4 border-b border-border/80 pb-5`,children:[(0,j.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-4 max-md:grid`,children:[(0,j.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,j.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Persisted conversation`}),(0,j.jsx)(`h2`,{className:`m-0 min-w-0 truncate text-2xl font-semibold leading-none text-foreground`,children:e.conversation.title??e.conversation.sessionId}),(0,j.jsx)(`span`,{className:`min-w-0 break-all font-mono text-xs text-muted-foreground`,children:e.conversation.ref})]}),(0,j.jsxs)(`div`,{className:`flex flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,j.jsx)(h,{className:`border-border/80 bg-muted/45 text-foreground`,children:e.source.storeKind??e.source.kind}),(0,j.jsx)(h,{className:`border-border/80 bg-muted/45 text-foreground`,children:$(e.agents,e.source,e.conversation.agentIds)})]})]}),(0,j.jsxs)(`div`,{className:`grid border-y border-border/80 sm:grid-cols-4 sm:divide-x sm:divide-border/80`,children:[(0,j.jsx)(q,{label:`user`,value:e.conversation.userId}),(0,j.jsx)(q,{label:`messages`,value:e.conversation.messageCount}),(0,j.jsx)(q,{label:`created`,value:r(e.conversation.createdAt)}),(0,j.jsx)(q,{label:`updated`,value:r(e.conversation.updatedAt)})]})]}),e.detailLoading?(0,j.jsx)(m,{title:`Loading detail`,text:`Reading persisted messages.`}):(0,j.jsxs)(`div`,{className:`grid gap-4`,children:[e.conversation.metadata===void 0?null:(0,j.jsx)(G,{title:`metadata`,value:e.conversation.metadata}),(0,j.jsx)(N,{records:e.messages?.records??[]}),(0,j.jsx)(G,{title:`messages`,value:e.messages?.messages??[]}),(0,j.jsx)(G,{title:`message records`,value:e.messages?.records??[]}),(0,j.jsx)(G,{title:`derived transcript`,value:e.steps?.steps??[]})]})]})})}function W(e){return(0,j.jsx)(m,{className:`h-full`,title:`${e.source.label} is not inspectable`,text:e.source.reason??`This memory store does not expose read-only discovery.`})}function G(e){let t=Array.isArray(e.value)?e.value.length:void 0;return(0,j.jsxs)(`details`,{className:`group grid min-w-0 overflow-hidden border-y border-border/80`,open:!0,children:[(0,j.jsxs)(`summary`,{className:`flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 bg-muted/10 px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[(0,j.jsx)(`span`,{children:e.title}),(0,j.jsx)(`span`,{className:`font-medium normal-case tracking-normal`,children:t===void 0?`JSON`:`${t} items`})]}),(0,j.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-t border-border/70`,children:(0,j.jsx)(`pre`,{className:`m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground`,children:(0,j.jsx)(`code`,{children:(0,j.jsx)(g,{text:Q(e.value)})})})})]})}function K(e){return(0,j.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,j.jsx)(`h2`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:e.label}),(0,j.jsx)(`span`,{className:`text-xs font-semibold tabular-nums text-muted-foreground`,children:e.value})]})}function q(e){return(0,j.jsxs)(`div`,{className:`grid min-w-0 gap-1 px-3 py-3 first:pl-0 last:pr-0`,children:[(0,j.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.label}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-sm text-foreground`,title:String(e.value),children:e.value})]})}function J(e){return(0,j.jsx)(m,{className:`h-full`,title:`No saved conversations yet`,text:`Conversations will appear here after the connected agent writes to ${e.source.label}. ${e.userCount} users are currently available.`,action:(0,j.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center justify-center gap-3`,children:[(0,j.jsx)(i,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,onClick:e.onRefresh,children:`Refresh`}),(0,j.jsx)(`span`,{className:`text-xs leading-5 text-muted-foreground`,children:`Existing database conversations are discovered automatically.`})]})})}function Y(e){return(0,j.jsx)(`div`,{className:`mb-3 border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive`,children:e.message})}function X(e,t){return{userCount:e.length,conversationCount:t.length,messageCount:t.reduce((e,t)=>e+t.messageCount,0)}}function Z(e){return e.find(e=>e.kind===`agent`&&e.available)?.ref??e.find(e=>e.available)?.ref??e[0]?.ref??``}function Q(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function $(e,t,n){if(n.length===1){let t=n[0]??`agent`;return e.find(e=>e.id===t)?.name??t}return t.label}export{R as MemoryPage};
4
- //# sourceMappingURL=memory-page-CRmoZTWz.js.map
4
+ //# sourceMappingURL=memory-page-2qr2eMrI.js.map