@anvia/studio 1.1.2 → 1.2.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 (116) hide show
  1. package/README.md +52 -0
  2. package/dist/index.d.ts +31 -4
  3. package/dist/index.js +19806 -626
  4. package/dist/index.js.map +1 -1
  5. package/dist/ui/assets/ArrowClockwise.es-Dn4lp0ac.js +2 -0
  6. package/dist/ui/assets/{ArrowClockwise.es-5vr4h4OH.js.map → ArrowClockwise.es-Dn4lp0ac.js.map} +1 -1
  7. package/dist/ui/assets/Check.es-BaQZo8Jl.js +2 -0
  8. package/dist/ui/assets/{Check.es-DgvuCllR.js.map → Check.es-BaQZo8Jl.js.map} +1 -1
  9. package/dist/ui/assets/Combination-Cj4UR5tg.js +42 -0
  10. package/dist/ui/assets/Combination-Cj4UR5tg.js.map +1 -0
  11. package/dist/ui/assets/Copy.es-CU5v9Pav.js +2 -0
  12. package/dist/ui/assets/{Copy.es-DV7tb_eC.js.map → Copy.es-CU5v9Pav.js.map} +1 -1
  13. package/dist/ui/assets/MagnifyingGlass.es-C72UX0bz.js +2 -0
  14. package/dist/ui/assets/{MagnifyingGlass.es-yzEp9c89.js.map → MagnifyingGlass.es-C72UX0bz.js.map} +1 -1
  15. package/dist/ui/assets/Wrench.es-Q3fLRWow.js +2 -0
  16. package/dist/ui/assets/{Wrench.es-rRuP3Mrh.js.map → Wrench.es-Q3fLRWow.js.map} +1 -1
  17. package/dist/ui/assets/agents-page-6DCSMWnZ.js +2 -0
  18. package/dist/ui/assets/{agents-page-ByhvVYOx.js.map → agents-page-6DCSMWnZ.js.map} +1 -1
  19. package/dist/ui/assets/badge-DUs0RCHV.js +2 -0
  20. package/dist/ui/assets/{badge-C3fkxijh.js.map → badge-DUs0RCHV.js.map} +1 -1
  21. package/dist/ui/assets/button-BWxpVW85.js +2 -0
  22. package/dist/ui/assets/{button-B_AoswCu.js.map → button-BWxpVW85.js.map} +1 -1
  23. package/dist/ui/assets/dialog-DauYXFnG.js +2 -0
  24. package/dist/ui/assets/{dialog-BfKpnby4.js.map → dialog-DauYXFnG.js.map} +1 -1
  25. package/dist/ui/assets/dist-BmLOFYIW.js +2 -0
  26. package/dist/ui/assets/{dist-Dr6EWOhl.js.map → dist-BmLOFYIW.js.map} +1 -1
  27. package/dist/ui/assets/dist-CHLp-Np4.js +2 -0
  28. package/dist/ui/assets/dist-CHLp-Np4.js.map +1 -0
  29. package/dist/ui/assets/dist-DD97Shn_.js +2 -0
  30. package/dist/ui/assets/{dist-CUv0NHNl.js.map → dist-DD97Shn_.js.map} +1 -1
  31. package/dist/ui/assets/graphs-page-BA0jzknS.js +2 -0
  32. package/dist/ui/assets/{graphs-page-vBCjLEva.js.map → graphs-page-BA0jzknS.js.map} +1 -1
  33. package/dist/ui/assets/icon-ksPSRwE8.js +2 -0
  34. package/dist/ui/assets/{icon-DyadsXLr.js.map → icon-ksPSRwE8.js.map} +1 -1
  35. package/dist/ui/assets/index-DDzW7QMd.css +2 -0
  36. package/dist/ui/assets/{index-D7rMlAzl.js → index-Dyjst4Yt.js} +5 -5
  37. package/dist/ui/assets/index-Dyjst4Yt.js.map +1 -0
  38. package/dist/ui/assets/input-DdUxz9c8.js +2 -0
  39. package/dist/ui/assets/{input-DuERdYTl.js.map → input-DdUxz9c8.js.map} +1 -1
  40. package/dist/ui/assets/knowledge-page-BVVc4w3w.js +2 -0
  41. package/dist/ui/assets/{knowledge-page-ZeAUXg01.js.map → knowledge-page-BVVc4w3w.js.map} +1 -1
  42. package/dist/ui/assets/mcps-page-BfF4B22U.js +2 -0
  43. package/dist/ui/assets/{mcps-page-BSkygYJM.js.map → mcps-page-BfF4B22U.js.map} +1 -1
  44. package/dist/ui/assets/{memory-page-B2pWZ4in.js → memory-page-BQkt2BAW.js} +2 -2
  45. package/dist/ui/assets/memory-page-BQkt2BAW.js.map +1 -0
  46. package/dist/ui/assets/pipelines-page-Xx2kQNCI.js +2 -0
  47. package/dist/ui/assets/pipelines-page-Xx2kQNCI.js.map +1 -0
  48. package/dist/ui/assets/{renderers-DRD34eUr.js → renderers-CrjMPAR2.js} +5 -5
  49. package/dist/ui/assets/{renderers-DRD34eUr.js.map → renderers-CrjMPAR2.js.map} +1 -1
  50. package/dist/ui/assets/{request-DbgMKweq.js → request-DYxy87Kp.js} +3 -3
  51. package/dist/ui/assets/{request-DbgMKweq.js.map → request-DYxy87Kp.js.map} +1 -1
  52. package/dist/ui/assets/sandboxes-page-BwidNA5G.js +2 -0
  53. package/dist/ui/assets/{sandboxes-page-Bo4S4ILL.js.map → sandboxes-page-BwidNA5G.js.map} +1 -1
  54. package/dist/ui/assets/select-C4MbvpHr.js +2 -0
  55. package/dist/ui/assets/{select-BdCBnmXx.js.map → select-C4MbvpHr.js.map} +1 -1
  56. package/dist/ui/assets/sessions-page-C3dJDjJb.js +2 -0
  57. package/dist/ui/assets/{sessions-page-BMnR-r_F.js.map → sessions-page-C3dJDjJb.js.map} +1 -1
  58. package/dist/ui/assets/status-page-92JD9Hj8.js +2 -0
  59. package/dist/ui/assets/{status-page-CqmMMSo2.js.map → status-page-92JD9Hj8.js.map} +1 -1
  60. package/dist/ui/assets/studio-CtQdOoHK.js +2 -0
  61. package/dist/ui/assets/{studio-DzEdCFsX.js.map → studio-CtQdOoHK.js.map} +1 -1
  62. package/dist/ui/assets/style-CrHHNFw2.js +8 -0
  63. package/dist/ui/assets/{style-FGiH1LIC.js.map → style-CrHHNFw2.js.map} +1 -1
  64. package/dist/ui/assets/team-playground-GcG3j0Hl.js +2 -0
  65. package/dist/ui/assets/team-playground-GcG3j0Hl.js.map +1 -0
  66. package/dist/ui/assets/textarea-gPj9-ALc.js +2 -0
  67. package/dist/ui/assets/{textarea-fAtCF2cf.js.map → textarea-gPj9-ALc.js.map} +1 -1
  68. package/dist/ui/assets/tool-runner-xLspgGPa.js +2 -0
  69. package/dist/ui/assets/{tool-runner-CExWna8k.js.map → tool-runner-xLspgGPa.js.map} +1 -1
  70. package/dist/ui/assets/tools-page-BMyx2xRT.js +2 -0
  71. package/dist/ui/assets/{tools-page-CdkExqNd.js.map → tools-page-BMyx2xRT.js.map} +1 -1
  72. package/dist/ui/assets/trace-browser-Axd-aif6.js +4 -0
  73. package/dist/ui/assets/{trace-browser-Co9iS9HR.js.map → trace-browser-Axd-aif6.js.map} +1 -1
  74. package/dist/ui/assets/transcript-item-Bl3Yl-NT.js +3 -0
  75. package/dist/ui/assets/{transcript-item-D9NWsnsD.js.map → transcript-item-Bl3Yl-NT.js.map} +1 -1
  76. package/dist/ui/assets/with-selector-BIQdjRiO.js +2 -0
  77. package/dist/ui/assets/{with-selector-B8ah9Wvu.js.map → with-selector-BIQdjRiO.js.map} +1 -1
  78. package/dist/ui/index.html +17 -17
  79. package/package.json +8 -8
  80. package/dist/ui/assets/ArrowClockwise.es-5vr4h4OH.js +0 -2
  81. package/dist/ui/assets/Check.es-DgvuCllR.js +0 -2
  82. package/dist/ui/assets/Copy.es-DV7tb_eC.js +0 -2
  83. package/dist/ui/assets/MagnifyingGlass.es-yzEp9c89.js +0 -2
  84. package/dist/ui/assets/Wrench.es-rRuP3Mrh.js +0 -2
  85. package/dist/ui/assets/agents-page-ByhvVYOx.js +0 -2
  86. package/dist/ui/assets/badge-C3fkxijh.js +0 -2
  87. package/dist/ui/assets/button-B_AoswCu.js +0 -2
  88. package/dist/ui/assets/dialog-BfKpnby4.js +0 -2
  89. package/dist/ui/assets/dist-CUv0NHNl.js +0 -2
  90. package/dist/ui/assets/dist-Dr6EWOhl.js +0 -2
  91. package/dist/ui/assets/es2015-DGcxtKLK.js +0 -42
  92. package/dist/ui/assets/es2015-DGcxtKLK.js.map +0 -1
  93. package/dist/ui/assets/graphs-page-vBCjLEva.js +0 -2
  94. package/dist/ui/assets/icon-DyadsXLr.js +0 -2
  95. package/dist/ui/assets/index-BGl7eOVR.css +0 -2
  96. package/dist/ui/assets/index-D7rMlAzl.js.map +0 -1
  97. package/dist/ui/assets/input-DuERdYTl.js +0 -2
  98. package/dist/ui/assets/knowledge-page-ZeAUXg01.js +0 -2
  99. package/dist/ui/assets/mcps-page-BSkygYJM.js +0 -2
  100. package/dist/ui/assets/memory-page-B2pWZ4in.js.map +0 -1
  101. package/dist/ui/assets/pipelines-page-DAqa699J.js +0 -2
  102. package/dist/ui/assets/pipelines-page-DAqa699J.js.map +0 -1
  103. package/dist/ui/assets/sandboxes-page-Bo4S4ILL.js +0 -2
  104. package/dist/ui/assets/select-BdCBnmXx.js +0 -2
  105. package/dist/ui/assets/sessions-page-BMnR-r_F.js +0 -2
  106. package/dist/ui/assets/status-page-CqmMMSo2.js +0 -2
  107. package/dist/ui/assets/studio-DzEdCFsX.js +0 -2
  108. package/dist/ui/assets/style-FGiH1LIC.js +0 -8
  109. package/dist/ui/assets/textarea-fAtCF2cf.js +0 -2
  110. package/dist/ui/assets/tool-runner-CExWna8k.js +0 -2
  111. package/dist/ui/assets/tools-page-CdkExqNd.js +0 -2
  112. package/dist/ui/assets/trace-browser-Co9iS9HR.js +0 -4
  113. package/dist/ui/assets/transcript-item-D9NWsnsD.js +0 -3
  114. package/dist/ui/assets/utils-DzstcfqT.js +0 -2
  115. package/dist/ui/assets/utils-DzstcfqT.js.map +0 -1
  116. package/dist/ui/assets/with-selector-B8ah9Wvu.js +0 -2
@@ -0,0 +1,2 @@
1
+ import{i as e,n as t,r as n,s as r}from"./dist-CHLp-Np4.js";import{i,l as a,t as o}from"./button-BWxpVW85.js";import{a as s,c,i as l,n as u,o as d,r as f,t as p}from"./dialog-DauYXFnG.js";import{n as m,t as h}from"./icon-ksPSRwE8.js";import{a as g,s as _,t as v}from"./studio-CtQdOoHK.js";var y=r(e(),1),b=new Map([[`bold`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,48H180V36A28,28,0,0,0,152,8H104A28,28,0,0,0,76,36V48H40a12,12,0,0,0,0,24h4V208a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V72h4a12,12,0,0,0,0-24ZM100,36a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4V48H100Zm88,168H68V72H188ZM116,104v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Zm48,0v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Z`}))],[`duotone`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M200,56V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V56Z`,opacity:`0.2`}),y.createElement(`path`,{d:`M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z`}))],[`fill`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z`}))],[`light`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,50H174V40a22,22,0,0,0-22-22H104A22,22,0,0,0,82,40V50H40a6,6,0,0,0,0,12H50V208a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V62h10a6,6,0,0,0,0-12ZM94,40a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10V50H94ZM194,208a2,2,0,0,1-2,2H64a2,2,0,0,1-2-2V62H194ZM110,104v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Zm48,0v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Z`}))],[`regular`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z`}))],[`thin`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,52H172V40a20,20,0,0,0-20-20H104A20,20,0,0,0,84,40V52H40a4,4,0,0,0,0,8H52V208a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V60h12a4,4,0,0,0,0-8ZM92,40a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12V52H92ZM196,208a4,4,0,0,1-4,4H64a4,4,0,0,1-4-4V60H196ZM108,104v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Zm48,0v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Z`}))]]),x=y.forwardRef((e,t)=>y.createElement(m,{ref:t,...e,weights:b}));x.displayName=`TrashIcon`;var S=x,C=n();function w(e){return e.sessionsEnabled?e.sessions.length===0?(0,C.jsx)(g,{"aria-label":`Sessions`,children:(0,C.jsx)(v,{title:e.sessionLoadState===`loading`?`Loading sessions`:`No sessions`,text:e.sessionLoadState===`loading`?`Reading saved Studio sessions.`:`Start a chat to create a Studio session.`})}):(0,C.jsx)(g,{className:`overflow-auto pb-6 pr-6`,"aria-label":`Sessions`,children:(0,C.jsxs)(_,{className:`h-full min-w-225`,children:[(0,C.jsxs)(`div`,{className:`sticky top-0 z-10 grid min-h-11 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b bg-header px-4 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground backdrop-blur`,children:[(0,C.jsx)(`span`,{children:`Session`}),(0,C.jsx)(`span`,{children:`Agent`}),(0,C.jsx)(`span`,{children:`Messages`}),(0,C.jsx)(`span`,{children:`Updated`}),(0,C.jsx)(`span`,{className:`sr-only`,children:`Actions`})]}),e.sessions.map(n=>(0,C.jsxs)(`div`,{className:t(`grid min-h-14 w-full min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b px-4 text-left text-muted-foreground transition duration-200 hover:bg-transparent hover:text-foreground`,n.id===e.selectedSessionId&&`bg-row-selected text-foreground`),children:[(0,C.jsxs)(o,{className:`col-span-4 grid h-full min-h-14 min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px] items-center justify-start gap-4 border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit`,type:`button`,variant:`ghost`,onClick:()=>e.onOpenSession(n.id),children:[(0,C.jsxs)(`span`,{className:`grid min-w-0 gap-0.5`,children:[(0,C.jsx)(`strong`,{className:`min-w-0 truncate text-sm font-medium text-foreground`,children:n.title??`Untitled chat`}),(0,C.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium text-muted-foreground`,children:n.id})]}),(0,C.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium`,children:i(e.agents,n.agentId)}),(0,C.jsxs)(`span`,{className:`text-xs font-medium tabular-nums text-muted-foreground`,children:[n.messageCount,` messages`]}),(0,C.jsx)(`time`,{className:`text-xs font-medium text-muted-foreground`,children:a(n.updatedAt)})]}),(0,C.jsxs)(`span`,{className:`flex items-center justify-end gap-1`,children:[(0,C.jsx)(o,{"aria-label":`View tracing for ${n.title??`Untitled chat`}`,className:`h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-foreground hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5`,size:`icon`,type:`button`,variant:`ghost`,onClick:t=>{t.stopPropagation(),e.onViewSessionTracing(n.id)},children:(0,C.jsx)(h,{icon:c,"aria-hidden":`true`})}),(0,C.jsx)(o,{"aria-label":`Delete ${n.title??`Untitled chat`}`,className:`h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-destructive hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5`,size:`icon`,type:`button`,variant:`ghost`,onClick:t=>{t.stopPropagation(),e.onDeleteSession(n)},children:(0,C.jsx)(h,{icon:S,"aria-hidden":`true`})})]})]},n.id))]})}):(0,C.jsx)(g,{"aria-label":`Sessions`,children:(0,C.jsx)(v,{className:`h-full`,title:`Sessions unavailable`,text:`This Studio runtime does not expose saved sessions.`})})}function T(e){let t=e.session?.title??`Untitled chat`;return(0,C.jsx)(p,{open:e.session!==void 0,onOpenChange:e.onOpenChange,children:(0,C.jsxs)(u,{children:[(0,C.jsxs)(s,{children:[(0,C.jsx)(d,{children:`Delete session`}),(0,C.jsxs)(f,{children:[`Delete "`,t,`" and its traces. This cannot be undone.`]})]}),(0,C.jsxs)(l,{children:[(0,C.jsx)(o,{type:`button`,variant:`ghost`,onClick:()=>e.onOpenChange(!1),children:`Cancel`}),(0,C.jsx)(o,{type:`button`,variant:`destructive`,onClick:()=>{e.session!==void 0&&e.onConfirm(e.session)},children:`Delete`})]})]})})}export{T as DeleteSessionDialog,w as SessionsPage};
2
+ //# sourceMappingURL=sessions-page-C3dJDjJb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions-page-BMnR-r_F.js","names":["s","e","t"],"sources":["../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Trash.es.js","../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Trash.es.js","../../../src/ui/app/modules/sessions/sessions-page.tsx"],"sourcesContent":["import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H180V36A28,28,0,0,0,152,8H104A28,28,0,0,0,76,36V48H40a12,12,0,0,0,0,24h4V208a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V72h4a12,12,0,0,0,0-24ZM100,36a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4V48H100Zm88,168H68V72H188ZM116,104v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Zm48,0v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,56V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V56Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,50H174V40a22,22,0,0,0-22-22H104A22,22,0,0,0,82,40V50H40a6,6,0,0,0,0,12H50V208a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V62h10a6,6,0,0,0,0-12ZM94,40a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10V50H94ZM194,208a2,2,0,0,1-2,2H64a2,2,0,0,1-2-2V62H194ZM110,104v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Zm48,0v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,52H172V40a20,20,0,0,0-20-20H104A20,20,0,0,0,84,40V52H40a4,4,0,0,0,0,8H52V208a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V60h12a4,4,0,0,0,0-8ZM92,40a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12V52H92ZM196,208a4,4,0,0,1-4,4H64a4,4,0,0,1-4-4V60H196ZM108,104v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Zm48,0v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Z\" }))\n ]\n]);\nexport {\n e as default\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Trash.es.js\";\nconst r = o.forwardRef((a, e) => /* @__PURE__ */ o.createElement(s, { ref: e, ...a, weights: t }));\nr.displayName = \"TrashIcon\";\nconst n = r;\nexport {\n n as Trash,\n r as TrashIcon\n};\n","import { Pulse, Trash } from \"@phosphor-icons/react\";\nimport type { StudioConfig, StudioSessionSummary } from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../../components/ui/dialog\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { StudioEmptyState, StudioPageShell, StudioSurface } from \"../../components/ui/studio\";\nimport { cn } from \"../../lib/utils\";\nimport { agentLabel, formatRelativeTime } from \"../shared/format\";\nimport type { SessionLoadState } from \"../shared/types\";\n\nexport function SessionsPage(props: {\n agents: StudioConfig[\"agents\"];\n sessions: StudioSessionSummary[];\n sessionsEnabled: boolean;\n sessionLoadState: SessionLoadState;\n selectedSessionId: string;\n onOpenSession: (sessionId: string) => void;\n onViewSessionTracing: (sessionId: string) => void;\n onDeleteSession: (session: StudioSessionSummary) => void;\n}) {\n if (!props.sessionsEnabled) {\n return (\n <StudioPageShell aria-label=\"Sessions\">\n <StudioEmptyState\n className=\"h-full\"\n title=\"Sessions unavailable\"\n text=\"This Studio runtime does not expose saved sessions.\"\n />\n </StudioPageShell>\n );\n }\n if (props.sessions.length === 0) {\n return (\n <StudioPageShell aria-label=\"Sessions\">\n <StudioEmptyState\n title={props.sessionLoadState === \"loading\" ? \"Loading sessions\" : \"No sessions\"}\n text={\n props.sessionLoadState === \"loading\"\n ? \"Reading saved Studio sessions.\"\n : \"Start a chat to create a Studio session.\"\n }\n />\n </StudioPageShell>\n );\n }\n\n return (\n <StudioPageShell className=\"overflow-auto pb-6 pr-6\" aria-label=\"Sessions\">\n <StudioSurface className=\"h-full min-w-225\">\n <div className=\"sticky top-0 z-10 grid min-h-11 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b bg-header px-4 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground backdrop-blur\">\n <span>Session</span>\n <span>Agent</span>\n <span>Messages</span>\n <span>Updated</span>\n <span className=\"sr-only\">Actions</span>\n </div>\n {props.sessions.map((session) => (\n <div\n className={cn(\n \"grid min-h-14 w-full min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b px-4 text-left text-muted-foreground transition duration-200 hover:bg-transparent hover:text-foreground\",\n session.id === props.selectedSessionId && \"bg-row-selected text-foreground\",\n )}\n key={session.id}\n >\n <Button\n className=\"col-span-4 grid h-full min-h-14 min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px] items-center justify-start gap-4 border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onOpenSession(session.id)}\n >\n <span className=\"grid min-w-0 gap-0.5\">\n <strong className=\"min-w-0 truncate text-sm font-medium text-foreground\">\n {session.title ?? \"Untitled chat\"}\n </strong>\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {session.id}\n </span>\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {agentLabel(props.agents, session.agentId)}\n </span>\n <span className=\"text-xs font-medium tabular-nums text-muted-foreground\">\n {session.messageCount} messages\n </span>\n <time className=\"text-xs font-medium text-muted-foreground\">\n {formatRelativeTime(session.updatedAt)}\n </time>\n </Button>\n <span className=\"flex items-center justify-end gap-1\">\n <Button\n aria-label={`View tracing for ${session.title ?? \"Untitled chat\"}`}\n className=\"h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-foreground hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n props.onViewSessionTracing(session.id);\n }}\n >\n <StudioIcon icon={Pulse} aria-hidden=\"true\" />\n </Button>\n <Button\n aria-label={`Delete ${session.title ?? \"Untitled chat\"}`}\n className=\"h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-destructive hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n props.onDeleteSession(session);\n }}\n >\n <StudioIcon icon={Trash} aria-hidden=\"true\" />\n </Button>\n </span>\n </div>\n ))}\n </StudioSurface>\n </StudioPageShell>\n );\n}\n\nexport function DeleteSessionDialog(props: {\n session: StudioSessionSummary | undefined;\n onOpenChange: (open: boolean) => void;\n onConfirm: (session: StudioSessionSummary) => void;\n}) {\n const title = props.session?.title ?? \"Untitled chat\";\n\n return (\n <Dialog open={props.session !== undefined} onOpenChange={props.onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete session</DialogTitle>\n <DialogDescription>\n Delete \"{title}\" and its traces. This cannot be undone.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={() => props.onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={() => {\n if (props.session !== undefined) {\n props.onConfirm(props.session);\n }\n }}\n >\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
1
+ {"version":3,"file":"sessions-page-C3dJDjJb.js","names":["s","e","t"],"sources":["../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Trash.es.js","../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Trash.es.js","../../../src/ui/app/modules/sessions/sessions-page.tsx"],"sourcesContent":["import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H180V36A28,28,0,0,0,152,8H104A28,28,0,0,0,76,36V48H40a12,12,0,0,0,0,24h4V208a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V72h4a12,12,0,0,0,0-24ZM100,36a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4V48H100Zm88,168H68V72H188ZM116,104v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Zm48,0v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,56V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V56Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,50H174V40a22,22,0,0,0-22-22H104A22,22,0,0,0,82,40V50H40a6,6,0,0,0,0,12H50V208a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V62h10a6,6,0,0,0,0-12ZM94,40a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10V50H94ZM194,208a2,2,0,0,1-2,2H64a2,2,0,0,1-2-2V62H194ZM110,104v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Zm48,0v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,52H172V40a20,20,0,0,0-20-20H104A20,20,0,0,0,84,40V52H40a4,4,0,0,0,0,8H52V208a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V60h12a4,4,0,0,0,0-8ZM92,40a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12V52H92ZM196,208a4,4,0,0,1-4,4H64a4,4,0,0,1-4-4V60H196ZM108,104v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Zm48,0v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Z\" }))\n ]\n]);\nexport {\n e as default\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Trash.es.js\";\nconst r = o.forwardRef((a, e) => /* @__PURE__ */ o.createElement(s, { ref: e, ...a, weights: t }));\nr.displayName = \"TrashIcon\";\nconst n = r;\nexport {\n n as Trash,\n r as TrashIcon\n};\n","import { Pulse, Trash } from \"@phosphor-icons/react\";\nimport type { StudioConfig, StudioSessionSummary } from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../../components/ui/dialog\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { StudioEmptyState, StudioPageShell, StudioSurface } from \"../../components/ui/studio\";\nimport { cn } from \"../../lib/utils\";\nimport { agentLabel, formatRelativeTime } from \"../shared/format\";\nimport type { SessionLoadState } from \"../shared/types\";\n\nexport function SessionsPage(props: {\n agents: StudioConfig[\"agents\"];\n sessions: StudioSessionSummary[];\n sessionsEnabled: boolean;\n sessionLoadState: SessionLoadState;\n selectedSessionId: string;\n onOpenSession: (sessionId: string) => void;\n onViewSessionTracing: (sessionId: string) => void;\n onDeleteSession: (session: StudioSessionSummary) => void;\n}) {\n if (!props.sessionsEnabled) {\n return (\n <StudioPageShell aria-label=\"Sessions\">\n <StudioEmptyState\n className=\"h-full\"\n title=\"Sessions unavailable\"\n text=\"This Studio runtime does not expose saved sessions.\"\n />\n </StudioPageShell>\n );\n }\n if (props.sessions.length === 0) {\n return (\n <StudioPageShell aria-label=\"Sessions\">\n <StudioEmptyState\n title={props.sessionLoadState === \"loading\" ? \"Loading sessions\" : \"No sessions\"}\n text={\n props.sessionLoadState === \"loading\"\n ? \"Reading saved Studio sessions.\"\n : \"Start a chat to create a Studio session.\"\n }\n />\n </StudioPageShell>\n );\n }\n\n return (\n <StudioPageShell className=\"overflow-auto pb-6 pr-6\" aria-label=\"Sessions\">\n <StudioSurface className=\"h-full min-w-225\">\n <div className=\"sticky top-0 z-10 grid min-h-11 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b bg-header px-4 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground backdrop-blur\">\n <span>Session</span>\n <span>Agent</span>\n <span>Messages</span>\n <span>Updated</span>\n <span className=\"sr-only\">Actions</span>\n </div>\n {props.sessions.map((session) => (\n <div\n className={cn(\n \"grid min-h-14 w-full min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b px-4 text-left text-muted-foreground transition duration-200 hover:bg-transparent hover:text-foreground\",\n session.id === props.selectedSessionId && \"bg-row-selected text-foreground\",\n )}\n key={session.id}\n >\n <Button\n className=\"col-span-4 grid h-full min-h-14 min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px] items-center justify-start gap-4 border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onOpenSession(session.id)}\n >\n <span className=\"grid min-w-0 gap-0.5\">\n <strong className=\"min-w-0 truncate text-sm font-medium text-foreground\">\n {session.title ?? \"Untitled chat\"}\n </strong>\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {session.id}\n </span>\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {agentLabel(props.agents, session.agentId)}\n </span>\n <span className=\"text-xs font-medium tabular-nums text-muted-foreground\">\n {session.messageCount} messages\n </span>\n <time className=\"text-xs font-medium text-muted-foreground\">\n {formatRelativeTime(session.updatedAt)}\n </time>\n </Button>\n <span className=\"flex items-center justify-end gap-1\">\n <Button\n aria-label={`View tracing for ${session.title ?? \"Untitled chat\"}`}\n className=\"h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-foreground hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n props.onViewSessionTracing(session.id);\n }}\n >\n <StudioIcon icon={Pulse} aria-hidden=\"true\" />\n </Button>\n <Button\n aria-label={`Delete ${session.title ?? \"Untitled chat\"}`}\n className=\"h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-destructive hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n props.onDeleteSession(session);\n }}\n >\n <StudioIcon icon={Trash} aria-hidden=\"true\" />\n </Button>\n </span>\n </div>\n ))}\n </StudioSurface>\n </StudioPageShell>\n );\n}\n\nexport function DeleteSessionDialog(props: {\n session: StudioSessionSummary | undefined;\n onOpenChange: (open: boolean) => void;\n onConfirm: (session: StudioSessionSummary) => void;\n}) {\n const title = props.session?.title ?? \"Untitled chat\";\n\n return (\n <Dialog open={props.session !== undefined} onOpenChange={props.onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete session</DialogTitle>\n <DialogDescription>\n Delete \"{title}\" and its traces. This cannot be undone.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={() => props.onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={() => {\n if (props.session !== undefined) {\n props.onConfirm(props.session);\n }\n }}\n >\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{i as e,r as t,s as n}from"./dist-CHLp-Np4.js";import{l as r,t as i}from"./button-BWxpVW85.js";import{a,i as o,n as s,r as c,t as l}from"./studio-CtQdOoHK.js";import{t as u}from"./badge-DUs0RCHV.js";import{t as d}from"./renderers-CrjMPAR2.js";var f=n(e(),1),p=t();function m(e){let[t,n]=(0,f.useState)(),[r,u]=(0,f.useState)(!1),[d,m]=(0,f.useState)(``),g=(0,f.useCallback)(async()=>{if(!e.enabled){n(void 0);return}u(!0),m(``);try{let e=await fetch(`/status`);if(!e.ok)throw Error(`Status failed with HTTP ${e.status}`);n(await e.json())}catch(e){m(e instanceof Error?e.message:String(e)),n(void 0)}finally{u(!1)}},[e.enabled]);return(0,f.useEffect)(()=>{g()},[g]),(0,p.jsxs)(a,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":`Status`,children:[(0,p.jsx)(o,{title:`Status`,description:`Runtime health, storage adapters, feature capabilities, and current record counts.`,action:(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start`,children:[(0,p.jsx)(s,{label:`agents`,value:t?.counts.agents??0}),(0,p.jsx)(s,{label:`sessions`,value:t?.counts.sessions??`-`}),(0,p.jsx)(s,{label:`traces`,value:t?.counts.traces??`-`}),(0,p.jsx)(i,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,disabled:r,onClick:()=>void g(),children:`Refresh`})]})}),(0,p.jsx)(c,{className:`overflow-auto`,children:e.enabled?r&&t===void 0?(0,p.jsx)(l,{title:`Loading status`,text:`Reading runtime status.`}):d.length>0?(0,p.jsx)(l,{title:`Status error`,text:d}):t===void 0?null:(0,p.jsx)(h,{summary:t}):(0,p.jsx)(l,{title:`Status unavailable`,text:`This Studio runtime did not expose status.`})})]})}function h(e){let t=Object.entries(e.summary.capabilities).filter(([,e])=>e?.enabled===!0).length;return(0,p.jsxs)(`div`,{className:`grid h-full min-h-0 gap-5 border-t border-hair pt-4`,children:[(0,p.jsxs)(`section`,{className:`grid gap-5 xl:grid-cols-[minmax(280px,0.58fr)_minmax(0,1.42fr)]`,children:[(0,p.jsx)(g,{summary:e.summary,enabledCapabilityCount:t}),(0,p.jsxs)(`div`,{className:`grid gap-5 lg:grid-cols-2`,children:[(0,p.jsx)(_,{storage:e.summary.storage}),(0,p.jsx)(v,{counts:e.summary.counts})]})]}),(0,p.jsxs)(`section`,{className:`grid gap-5 xl:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]`,children:[(0,p.jsx)(y,{capabilities:e.summary.capabilities}),(0,p.jsx)(b,{summary:e.summary})]})]})}function g(e){return(0,p.jsxs)(`section`,{className:`grid content-start gap-5 border-b border-hair pb-5 xl:border-b-0 xl:border-r xl:pb-0 xl:pr-5`,children:[(0,p.jsxs)(`div`,{className:`grid gap-3`,children:[(0,p.jsx)(S,{children:`runtime`}),(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,p.jsx)(u,{className:`border-hair bg-muted text-foreground`,children:`online`}),(0,p.jsxs)(u,{className:`border-hair bg-background text-muted-foreground`,children:[e.enabledCapabilityCount,` capabilities`]})]})]}),(0,p.jsxs)(`div`,{className:`grid border-y border-hair`,children:[(0,p.jsx)(C,{label:`id`,value:e.summary.runner.id}),(0,p.jsx)(C,{label:`name`,value:e.summary.runner.name??`-`}),(0,p.jsx)(C,{label:`version`,value:e.summary.runner.version??`-`}),(0,p.jsx)(C,{label:`generated`,value:`${r(e.summary.generatedAt)} / ${e.summary.generatedAt}`})]})]})}function _(e){let t=Object.entries(e.storage);return(0,p.jsxs)(`section`,{className:`grid content-start gap-3`,children:[(0,p.jsx)(x,{title:`storage`,value:`${t.length} adapters`}),t.length===0?(0,p.jsx)(T,{text:`No storage adapters reported.`}):(0,p.jsx)(`div`,{className:`grid border-y border-hair`,children:t.map(([e,t])=>(0,p.jsx)(w,{label:E(e),value:t??`-`,tone:t===void 0?`muted`:`normal`},e))})]})}function v(e){let t=Object.entries(e.counts).filter(e=>typeof e[1]==`number`);return(0,p.jsxs)(`section`,{className:`grid content-start gap-3`,children:[(0,p.jsx)(x,{title:`records`,value:`${t.length} counters`}),(0,p.jsx)(`div`,{className:`grid border-y border-hair`,children:t.map(([e,t])=>(0,p.jsx)(w,{label:E(e),value:t},e))})]})}function y(e){let t=Object.entries(e.capabilities);return(0,p.jsxs)(`section`,{className:`grid content-start gap-3`,children:[(0,p.jsx)(x,{title:`capabilities`,value:`${t.length} reported`}),t.length===0?(0,p.jsx)(T,{text:`No capabilities reported.`}):(0,p.jsx)(`div`,{className:`grid border-y border-hair sm:grid-cols-2 sm:divide-x sm:divide-hair`,children:t.map(([e,n],r)=>(0,p.jsxs)(`div`,{className:[`grid min-w-0 gap-1 border-b border-hair px-3 py-3`,r>=t.length-(t.length%2==0?2:1)?`sm:border-b-0`:``].join(` `),children:[(0,p.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,p.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:E(e)}),(0,p.jsx)(`span`,{className:n?.enabled?`text-xs font-medium text-foreground`:`text-xs font-medium text-muted-foreground`,children:n?.enabled?`enabled`:`disabled`})]}),n?.reason===void 0?null:(0,p.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:n.reason})]},e))})]})}function b(e){return(0,p.jsxs)(`section`,{className:`grid min-w-0 content-start gap-3`,children:[(0,p.jsx)(x,{title:`raw summary`,value:`JSON`}),(0,p.jsxs)(`details`,{className:`group grid min-w-0 overflow-hidden border-y border-hair`,open:!0,children:[(0,p.jsxs)(`summary`,{className:`flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 bg-muted px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[`Payload`,(0,p.jsx)(`span`,{className:`font-medium normal-case tracking-normal group-open:hidden`,children:`Show`}),(0,p.jsx)(`span`,{className:`hidden font-medium normal-case tracking-normal group-open:inline`,children:`Hide`})]}),(0,p.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-t border-hair`,children:(0,p.jsx)(`pre`,{className:`m-0 max-h-[28rem] min-w-max p-4 text-xs leading-5 text-foreground`,children:(0,p.jsx)(`code`,{children:(0,p.jsx)(d,{text:JSON.stringify(e.summary,null,2)})})})})]})]})}function x(e){return(0,p.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,p.jsx)(S,{children:e.title}),(0,p.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:e.value})]})}function S(e){return(0,p.jsx)(`h2`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:e.children})}function C(e){return(0,p.jsxs)(`div`,{className:`grid min-w-0 gap-1 border-b border-hair px-3 py-3 first:pt-3 last:border-b-0`,children:[(0,p.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.label}),(0,p.jsx)(`span`,{className:`min-w-0 truncate text-sm text-foreground`,title:String(e.value),children:e.value})]})}function w(e){return(0,p.jsxs)(`div`,{className:`grid min-w-0 grid-cols-[minmax(120px,0.5fr)_minmax(0,1fr)] gap-3 border-b border-hair px-3 py-3 last:border-b-0`,children:[(0,p.jsx)(`span`,{className:`min-w-0 truncate text-sm font-medium text-muted-foreground`,children:e.label}),(0,p.jsx)(`span`,{className:[`min-w-0 truncate text-right text-sm font-semibold tabular-nums`,e.tone===`muted`?`text-muted-foreground`:`text-foreground`].join(` `),title:String(e.value),children:e.value})]})}function T(e){return(0,p.jsx)(`div`,{className:`border-y border-dashed border-hair px-3 py-8 text-center text-sm text-muted-foreground`,children:e.text})}function E(e){return e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/[_-]+/g,` `).toLowerCase()}export{m as StatusPage};
2
+ //# sourceMappingURL=status-page-92JD9Hj8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-page-CqmMMSo2.js","names":[],"sources":["../../../src/ui/app/modules/status/status-page.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { StudioStatusSummary } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n StudioEmptyState,\n StudioHeaderMetric,\n StudioPageContent,\n StudioPageHeader,\n StudioPageShell,\n} from \"../../components/ui/studio\";\nimport { formatRelativeTime } from \"../shared/format\";\nimport { JsonSyntax } from \"../shared/renderers\";\n\nexport function StatusPage(props: { enabled: boolean }) {\n const [summary, setSummary] = useState<StudioStatusSummary | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const loadStatus = useCallback(async () => {\n if (!props.enabled) {\n setSummary(undefined);\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n const response = await fetch(\"/status\");\n if (!response.ok) {\n throw new Error(`Status failed with HTTP ${response.status}`);\n }\n setSummary((await response.json()) as StudioStatusSummary);\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError));\n setSummary(undefined);\n } finally {\n setLoading(false);\n }\n }, [props.enabled]);\n\n useEffect(() => {\n void loadStatus();\n }, [loadStatus]);\n\n return (\n <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Status\">\n <StudioPageHeader\n title=\"Status\"\n description=\"Runtime health, storage adapters, feature capabilities, and current record counts.\"\n action={\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start\">\n <StudioHeaderMetric label=\"agents\" value={summary?.counts.agents ?? 0} />\n <StudioHeaderMetric label=\"sessions\" value={summary?.counts.sessions ?? \"-\"} />\n <StudioHeaderMetric label=\"traces\" value={summary?.counts.traces ?? \"-\"} />\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n disabled={loading}\n onClick={() => void loadStatus()}\n >\n Refresh\n </Button>\n </div>\n }\n />\n\n <StudioPageContent className=\"overflow-auto\">\n {!props.enabled ? (\n <StudioEmptyState\n title=\"Status unavailable\"\n text=\"This Studio runtime did not expose status.\"\n />\n ) : loading && summary === undefined ? (\n <StudioEmptyState title=\"Loading status\" text=\"Reading runtime status.\" />\n ) : error.length > 0 ? (\n <StudioEmptyState title=\"Status error\" text={error} />\n ) : summary === undefined ? null : (\n <StatusDashboard summary={summary} />\n )}\n </StudioPageContent>\n </StudioPageShell>\n );\n}\n\nfunction StatusDashboard(props: { summary: StudioStatusSummary }) {\n const capabilityEntries = Object.entries(props.summary.capabilities);\n const enabledCapabilityCount = capabilityEntries.filter(\n ([, capability]) => capability?.enabled === true,\n ).length;\n\n return (\n <div className=\"grid h-full min-h-0 gap-5 border-t border-hair pt-4\">\n <section className=\"grid gap-5 xl:grid-cols-[minmax(280px,0.58fr)_minmax(0,1.42fr)]\">\n <RuntimeSummary summary={props.summary} enabledCapabilityCount={enabledCapabilityCount} />\n <div className=\"grid gap-5 lg:grid-cols-2\">\n <StorageMatrix storage={props.summary.storage} />\n <CountsLedger counts={props.summary.counts} />\n </div>\n </section>\n <section className=\"grid gap-5 xl:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]\">\n <CapabilityLedger capabilities={props.summary.capabilities} />\n <RawSummary summary={props.summary} />\n </section>\n </div>\n );\n}\n\nfunction RuntimeSummary(props: { summary: StudioStatusSummary; enabledCapabilityCount: number }) {\n return (\n <section className=\"grid content-start gap-5 border-b border-hair pb-5 xl:border-b-0 xl:border-r xl:pb-0 xl:pr-5\">\n <div className=\"grid gap-3\">\n <SectionLabel>runtime</SectionLabel>\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Badge className=\"border-hair bg-muted text-foreground\">online</Badge>\n <Badge className=\"border-hair bg-background text-muted-foreground\">\n {props.enabledCapabilityCount} capabilities\n </Badge>\n </div>\n </div>\n <div className=\"grid border-y border-hair\">\n <StatusFact label=\"id\" value={props.summary.runner.id} />\n <StatusFact label=\"name\" value={props.summary.runner.name ?? \"-\"} />\n <StatusFact label=\"version\" value={props.summary.runner.version ?? \"-\"} />\n <StatusFact\n label=\"generated\"\n value={`${formatRelativeTime(props.summary.generatedAt)} / ${props.summary.generatedAt}`}\n />\n </div>\n </section>\n );\n}\n\nfunction StorageMatrix(props: { storage: StudioStatusSummary[\"storage\"] }) {\n const entries = Object.entries(props.storage);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"storage\" value={`${entries.length} adapters`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No storage adapters reported.\" />\n ) : (\n <div className=\"grid border-y border-hair\">\n {entries.map(([key, value]) => (\n <StatusRow\n label={humanizeKey(key)}\n value={value ?? \"-\"}\n key={key}\n tone={value === undefined ? \"muted\" : \"normal\"}\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction CountsLedger(props: { counts: StudioStatusSummary[\"counts\"] }) {\n const entries = Object.entries(props.counts).filter((entry): entry is [string, number] => {\n return typeof entry[1] === \"number\";\n });\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"records\" value={`${entries.length} counters`} />\n <div className=\"grid border-y border-hair\">\n {entries.map(([key, value]) => (\n <StatusRow label={humanizeKey(key)} value={value} key={key} />\n ))}\n </div>\n </section>\n );\n}\n\nfunction CapabilityLedger(props: { capabilities: StudioStatusSummary[\"capabilities\"] }) {\n const entries = Object.entries(props.capabilities);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"capabilities\" value={`${entries.length} reported`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No capabilities reported.\" />\n ) : (\n <div className=\"grid border-y border-hair sm:grid-cols-2 sm:divide-x sm:divide-hair\">\n {entries.map(([name, capability], index) => (\n <div\n className={[\n \"grid min-w-0 gap-1 border-b border-hair px-3 py-3\",\n index >= entries.length - (entries.length % 2 === 0 ? 2 : 1) ? \"sm:border-b-0\" : \"\",\n ].join(\" \")}\n key={name}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {humanizeKey(name)}\n </span>\n <span\n className={\n capability?.enabled\n ? \"text-xs font-medium text-foreground\"\n : \"text-xs font-medium text-muted-foreground\"\n }\n >\n {capability?.enabled ? \"enabled\" : \"disabled\"}\n </span>\n </div>\n {capability?.reason === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{capability.reason}</p>\n )}\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction RawSummary(props: { summary: StudioStatusSummary }) {\n return (\n <section className=\"grid min-w-0 content-start gap-3\">\n <SectionHeader title=\"raw summary\" value=\"JSON\" />\n <details className=\"group grid min-w-0 overflow-hidden border-y border-hair\" open>\n <summary className=\"flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 bg-muted px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Payload\n <span className=\"font-medium normal-case tracking-normal group-open:hidden\">Show</span>\n <span className=\"hidden font-medium normal-case tracking-normal group-open:inline\">\n Hide\n </span>\n </summary>\n <div className=\"min-w-0 overflow-x-auto border-t border-hair\">\n <pre className=\"m-0 max-h-[28rem] min-w-max p-4 text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={JSON.stringify(props.summary, null, 2)} />\n </code>\n </pre>\n </div>\n </details>\n </section>\n );\n}\n\nfunction SectionHeader(props: { title: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <SectionLabel>{props.title}</SectionLabel>\n <span className=\"text-xs font-medium text-muted-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction SectionLabel(props: { children: string }) {\n return (\n <h2 className=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n {props.children}\n </h2>\n );\n}\n\nfunction StatusFact(props: { label: string; value: string | number }) {\n return (\n <div className=\"grid min-w-0 gap-1 border-b border-hair px-3 py-3 first:pt-3 last:border-b-0\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.label}\n </span>\n <span className=\"min-w-0 truncate text-sm text-foreground\" title={String(props.value)}>\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction StatusRow(props: { label: string; value: string | number; tone?: \"normal\" | \"muted\" }) {\n return (\n <div className=\"grid min-w-0 grid-cols-[minmax(120px,0.5fr)_minmax(0,1fr)] gap-3 border-b border-hair px-3 py-3 last:border-b-0\">\n <span className=\"min-w-0 truncate text-sm font-medium text-muted-foreground\">\n {props.label}\n </span>\n <span\n className={[\n \"min-w-0 truncate text-right text-sm font-semibold tabular-nums\",\n props.tone === \"muted\" ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n title={String(props.value)}\n >\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction DashedNote(props: { text: string }) {\n return (\n <div className=\"border-y border-dashed border-hair px-3 py-8 text-center text-sm text-muted-foreground\">\n {props.text}\n </div>\n );\n}\n\nfunction humanizeKey(value: string): string {\n return value\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .toLowerCase();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"status-page-92JD9Hj8.js","names":[],"sources":["../../../src/ui/app/modules/status/status-page.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { StudioStatusSummary } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n StudioEmptyState,\n StudioHeaderMetric,\n StudioPageContent,\n StudioPageHeader,\n StudioPageShell,\n} from \"../../components/ui/studio\";\nimport { formatRelativeTime } from \"../shared/format\";\nimport { JsonSyntax } from \"../shared/renderers\";\n\nexport function StatusPage(props: { enabled: boolean }) {\n const [summary, setSummary] = useState<StudioStatusSummary | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const loadStatus = useCallback(async () => {\n if (!props.enabled) {\n setSummary(undefined);\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n const response = await fetch(\"/status\");\n if (!response.ok) {\n throw new Error(`Status failed with HTTP ${response.status}`);\n }\n setSummary((await response.json()) as StudioStatusSummary);\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError));\n setSummary(undefined);\n } finally {\n setLoading(false);\n }\n }, [props.enabled]);\n\n useEffect(() => {\n void loadStatus();\n }, [loadStatus]);\n\n return (\n <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Status\">\n <StudioPageHeader\n title=\"Status\"\n description=\"Runtime health, storage adapters, feature capabilities, and current record counts.\"\n action={\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start\">\n <StudioHeaderMetric label=\"agents\" value={summary?.counts.agents ?? 0} />\n <StudioHeaderMetric label=\"sessions\" value={summary?.counts.sessions ?? \"-\"} />\n <StudioHeaderMetric label=\"traces\" value={summary?.counts.traces ?? \"-\"} />\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n disabled={loading}\n onClick={() => void loadStatus()}\n >\n Refresh\n </Button>\n </div>\n }\n />\n\n <StudioPageContent className=\"overflow-auto\">\n {!props.enabled ? (\n <StudioEmptyState\n title=\"Status unavailable\"\n text=\"This Studio runtime did not expose status.\"\n />\n ) : loading && summary === undefined ? (\n <StudioEmptyState title=\"Loading status\" text=\"Reading runtime status.\" />\n ) : error.length > 0 ? (\n <StudioEmptyState title=\"Status error\" text={error} />\n ) : summary === undefined ? null : (\n <StatusDashboard summary={summary} />\n )}\n </StudioPageContent>\n </StudioPageShell>\n );\n}\n\nfunction StatusDashboard(props: { summary: StudioStatusSummary }) {\n const capabilityEntries = Object.entries(props.summary.capabilities);\n const enabledCapabilityCount = capabilityEntries.filter(\n ([, capability]) => capability?.enabled === true,\n ).length;\n\n return (\n <div className=\"grid h-full min-h-0 gap-5 border-t border-hair pt-4\">\n <section className=\"grid gap-5 xl:grid-cols-[minmax(280px,0.58fr)_minmax(0,1.42fr)]\">\n <RuntimeSummary summary={props.summary} enabledCapabilityCount={enabledCapabilityCount} />\n <div className=\"grid gap-5 lg:grid-cols-2\">\n <StorageMatrix storage={props.summary.storage} />\n <CountsLedger counts={props.summary.counts} />\n </div>\n </section>\n <section className=\"grid gap-5 xl:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]\">\n <CapabilityLedger capabilities={props.summary.capabilities} />\n <RawSummary summary={props.summary} />\n </section>\n </div>\n );\n}\n\nfunction RuntimeSummary(props: { summary: StudioStatusSummary; enabledCapabilityCount: number }) {\n return (\n <section className=\"grid content-start gap-5 border-b border-hair pb-5 xl:border-b-0 xl:border-r xl:pb-0 xl:pr-5\">\n <div className=\"grid gap-3\">\n <SectionLabel>runtime</SectionLabel>\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Badge className=\"border-hair bg-muted text-foreground\">online</Badge>\n <Badge className=\"border-hair bg-background text-muted-foreground\">\n {props.enabledCapabilityCount} capabilities\n </Badge>\n </div>\n </div>\n <div className=\"grid border-y border-hair\">\n <StatusFact label=\"id\" value={props.summary.runner.id} />\n <StatusFact label=\"name\" value={props.summary.runner.name ?? \"-\"} />\n <StatusFact label=\"version\" value={props.summary.runner.version ?? \"-\"} />\n <StatusFact\n label=\"generated\"\n value={`${formatRelativeTime(props.summary.generatedAt)} / ${props.summary.generatedAt}`}\n />\n </div>\n </section>\n );\n}\n\nfunction StorageMatrix(props: { storage: StudioStatusSummary[\"storage\"] }) {\n const entries = Object.entries(props.storage);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"storage\" value={`${entries.length} adapters`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No storage adapters reported.\" />\n ) : (\n <div className=\"grid border-y border-hair\">\n {entries.map(([key, value]) => (\n <StatusRow\n label={humanizeKey(key)}\n value={value ?? \"-\"}\n key={key}\n tone={value === undefined ? \"muted\" : \"normal\"}\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction CountsLedger(props: { counts: StudioStatusSummary[\"counts\"] }) {\n const entries = Object.entries(props.counts).filter((entry): entry is [string, number] => {\n return typeof entry[1] === \"number\";\n });\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"records\" value={`${entries.length} counters`} />\n <div className=\"grid border-y border-hair\">\n {entries.map(([key, value]) => (\n <StatusRow label={humanizeKey(key)} value={value} key={key} />\n ))}\n </div>\n </section>\n );\n}\n\nfunction CapabilityLedger(props: { capabilities: StudioStatusSummary[\"capabilities\"] }) {\n const entries = Object.entries(props.capabilities);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"capabilities\" value={`${entries.length} reported`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No capabilities reported.\" />\n ) : (\n <div className=\"grid border-y border-hair sm:grid-cols-2 sm:divide-x sm:divide-hair\">\n {entries.map(([name, capability], index) => (\n <div\n className={[\n \"grid min-w-0 gap-1 border-b border-hair px-3 py-3\",\n index >= entries.length - (entries.length % 2 === 0 ? 2 : 1) ? \"sm:border-b-0\" : \"\",\n ].join(\" \")}\n key={name}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {humanizeKey(name)}\n </span>\n <span\n className={\n capability?.enabled\n ? \"text-xs font-medium text-foreground\"\n : \"text-xs font-medium text-muted-foreground\"\n }\n >\n {capability?.enabled ? \"enabled\" : \"disabled\"}\n </span>\n </div>\n {capability?.reason === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{capability.reason}</p>\n )}\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction RawSummary(props: { summary: StudioStatusSummary }) {\n return (\n <section className=\"grid min-w-0 content-start gap-3\">\n <SectionHeader title=\"raw summary\" value=\"JSON\" />\n <details className=\"group grid min-w-0 overflow-hidden border-y border-hair\" open>\n <summary className=\"flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 bg-muted px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Payload\n <span className=\"font-medium normal-case tracking-normal group-open:hidden\">Show</span>\n <span className=\"hidden font-medium normal-case tracking-normal group-open:inline\">\n Hide\n </span>\n </summary>\n <div className=\"min-w-0 overflow-x-auto border-t border-hair\">\n <pre className=\"m-0 max-h-[28rem] min-w-max p-4 text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={JSON.stringify(props.summary, null, 2)} />\n </code>\n </pre>\n </div>\n </details>\n </section>\n );\n}\n\nfunction SectionHeader(props: { title: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <SectionLabel>{props.title}</SectionLabel>\n <span className=\"text-xs font-medium text-muted-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction SectionLabel(props: { children: string }) {\n return (\n <h2 className=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n {props.children}\n </h2>\n );\n}\n\nfunction StatusFact(props: { label: string; value: string | number }) {\n return (\n <div className=\"grid min-w-0 gap-1 border-b border-hair px-3 py-3 first:pt-3 last:border-b-0\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.label}\n </span>\n <span className=\"min-w-0 truncate text-sm text-foreground\" title={String(props.value)}>\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction StatusRow(props: { label: string; value: string | number; tone?: \"normal\" | \"muted\" }) {\n return (\n <div className=\"grid min-w-0 grid-cols-[minmax(120px,0.5fr)_minmax(0,1fr)] gap-3 border-b border-hair px-3 py-3 last:border-b-0\">\n <span className=\"min-w-0 truncate text-sm font-medium text-muted-foreground\">\n {props.label}\n </span>\n <span\n className={[\n \"min-w-0 truncate text-right text-sm font-semibold tabular-nums\",\n props.tone === \"muted\" ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n title={String(props.value)}\n >\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction DashedNote(props: { text: string }) {\n return (\n <div className=\"border-y border-dashed border-hair px-3 py-8 text-center text-sm text-muted-foreground\">\n {props.text}\n </div>\n );\n}\n\nfunction humanizeKey(value: string): string {\n return value\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .toLowerCase();\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{n as e,r as t}from"./dist-CHLp-Np4.js";var n=t();function r({className:t,...r}){return(0,n.jsx)(`section`,{className:e(`grid h-full min-h-0 min-w-0 max-h-full max-w-full overflow-hidden bg-background`,t),...r})}function i(t){let{title:r,description:i,action:a,className:o,...s}=t;return(0,n.jsxs)(`header`,{className:e(`flex flex-col gap-3 px-4 pt-4 sm:flex-row sm:items-end sm:justify-between md:px-6 md:pt-6`,o),...s,children:[(0,n.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,n.jsx)(`h1`,{className:`m-0 font-heading text-2xl font-medium tracking-tight`,children:r}),(0,n.jsx)(`p`,{className:`m-0 max-w-[68ch] text-sm text-muted-foreground`,children:i})]}),a]})}function a({className:t,...r}){return(0,n.jsx)(`div`,{className:e(`min-h-0 min-w-0 px-4 pb-4 pt-6 md:px-6 md:pb-6`,t),...r})}function o(t){return(0,n.jsxs)(`span`,{className:e(`inline-flex h-8 items-center gap-2 rounded-md border border-hair px-2.5 text-xs font-medium text-muted-foreground`,t.className),children:[(0,n.jsx)(`span`,{className:`font-medium tabular-nums text-foreground`,children:t.value}),t.label]})}function s({className:t,...r}){return(0,n.jsx)(`div`,{className:e(`min-h-0 min-w-0 overflow-hidden bg-background`,t),...r})}function c(t){return(0,n.jsxs)(`div`,{"data-size":t.size??`default`,"data-slot":`studio-empty-state`,className:e(`flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-none border border-dashed border-border p-6 text-center text-balance`,t.size===`compact`?`min-h-32`:`h-full min-h-64`,t.className),children:[(0,n.jsxs)(`div`,{className:`flex max-w-sm flex-col items-center gap-2`,children:[(0,n.jsx)(`h2`,{className:`m-0 font-heading text-sm font-medium tracking-tight text-foreground`,children:t.title}),(0,n.jsx)(`p`,{className:`m-0 text-sm/relaxed text-muted-foreground`,children:t.text})]}),t.action?(0,n.jsx)(`div`,{className:`flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance`,children:t.action}):null]})}function l({className:t,...r}){return(0,n.jsx)(`span`,{className:e(`inline-flex h-5 items-center rounded-4xl bg-secondary px-2 py-0.5 text-xs font-medium text-secondary-foreground`,t),...r})}function u({className:t,...r}){return(0,n.jsx)(`div`,{className:e(`grid gap-1 rounded-lg bg-muted p-1`,t),...r})}export{r as a,u as c,i,o as n,l as o,a as r,s,c as t};
2
+ //# sourceMappingURL=studio-CtQdOoHK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"studio-DzEdCFsX.js","names":[],"sources":["../../../src/ui/app/components/ui/studio.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function StudioPageShell({ className, ...props }: React.ComponentProps<\"section\">) {\n return (\n <section\n className={cn(\n \"grid h-full min-h-0 min-w-0 max-h-full max-w-full overflow-hidden bg-background\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function StudioPageHeader(\n props: {\n title: string;\n description: string;\n action?: React.ReactNode;\n } & Omit<React.ComponentProps<\"header\">, \"children\">,\n) {\n const { title, description, action, className, ...headerProps } = props;\n return (\n <header\n className={cn(\n \"flex flex-col gap-3 px-4 pt-4 sm:flex-row sm:items-end sm:justify-between md:px-6 md:pt-6\",\n className,\n )}\n {...headerProps}\n >\n <div className=\"grid min-w-0 gap-1\">\n <h1 className=\"m-0 font-heading text-2xl font-medium tracking-tight\">{title}</h1>\n <p className=\"m-0 max-w-[68ch] text-sm text-muted-foreground\">{description}</p>\n </div>\n {action}\n </header>\n );\n}\n\nexport function StudioPageContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div className={cn(\"min-h-0 min-w-0 px-4 pb-4 pt-6 md:px-6 md:pb-6\", className)} {...props} />\n );\n}\n\nexport function StudioHeaderMetric(props: {\n label: string;\n value: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"inline-flex h-8 items-center gap-2 rounded-md border border-hair px-2.5 text-xs font-medium text-muted-foreground\",\n props.className,\n )}\n >\n <span className=\"font-medium tabular-nums text-foreground\">{props.value}</span>\n {props.label}\n </span>\n );\n}\n\nexport function StudioSurface({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div className={cn(\"min-h-0 min-w-0 overflow-hidden bg-background\", className)} {...props} />\n );\n}\n\nexport function StudioSection({ className, ...props }: React.ComponentProps<\"section\">) {\n return (\n <section\n className={cn(\"grid gap-3 rounded-none border border-border bg-card p-4\", className)}\n {...props}\n />\n );\n}\n\nexport function StudioMetric(props: { label: string; value: React.ReactNode; className?: string }) {\n return (\n <div\n className={cn(\"grid gap-1 rounded-none border border-border bg-card p-4\", props.className)}\n >\n <span className=\"text-xs font-medium text-muted-foreground\">{props.label}</span>\n <span className=\"text-lg font-semibold tabular-nums text-foreground\">{props.value}</span>\n </div>\n );\n}\n\nexport function StudioEmptyState(props: {\n title: string;\n text: string;\n action?: React.ReactNode;\n size?: \"default\" | \"compact\";\n className?: string;\n}) {\n return (\n <div\n data-size={props.size ?? \"default\"}\n data-slot=\"studio-empty-state\"\n className={cn(\n \"flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-none border border-dashed border-border p-6 text-center text-balance\",\n props.size === \"compact\" ? \"min-h-32\" : \"h-full min-h-64\",\n props.className,\n )}\n >\n <div className=\"flex max-w-sm flex-col items-center gap-2\">\n <h2 className=\"m-0 font-heading text-sm font-medium tracking-tight text-foreground\">\n {props.title}\n </h2>\n <p className=\"m-0 text-sm/relaxed text-muted-foreground\">{props.text}</p>\n </div>\n {props.action ? (\n <div className=\"flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance\">\n {props.action}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function StudioStatusBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"inline-flex h-5 items-center rounded-4xl bg-secondary px-2 py-0.5 text-xs font-medium text-secondary-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function StudioTabs({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"grid gap-1 rounded-lg bg-muted p-1\", className)} {...props} />;\n}\n"],"mappings":"oDAGA,SAAgB,EAAgB,CAAE,YAAW,GAAG,GAA0C,CACxF,OACE,EAAA,EAAA,IAAA,CAAC,UAAD,CACE,UAAW,EACT,kFACA,CACF,EACA,GAAI,CACL,CAAA,CAEL,CAEA,SAAgB,EACd,EAKA,CACA,GAAM,CAAE,QAAO,cAAa,SAAQ,YAAW,GAAG,GAAgB,EAClE,OACE,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,UAAW,EACT,4FACA,CACF,EACA,GAAI,EALN,SAAA,EAOE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,uDAAwD,SAAA,CAAU,CAAA,GAChF,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,iDAAkD,SAAA,CAAe,CAAA,CAC3E,CACJ,CAAA,EAAA,CACK,GAEZ,CAEA,SAAgB,EAAkB,CAAE,YAAW,GAAG,GAAsC,CACtF,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAG,iDAAkD,CAAS,EAAG,GAAI,CAAQ,CAAA,CAEjG,CAEA,SAAgB,EAAmB,EAIhC,CACD,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CACE,UAAW,EACT,oHACA,EAAM,SACR,EAJF,SAAA,EAME,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,2CAA4C,SAAA,EAAM,KAAY,CAAA,EAC7E,EAAM,KACH,GAEV,CAEA,SAAgB,EAAc,CAAE,YAAW,GAAG,GAAsC,CAClF,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAG,gDAAiD,CAAS,EAAG,GAAI,CAAQ,CAAA,CAEhG,CAsBA,SAAgB,EAAiB,EAM9B,CACD,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,YAAW,EAAM,MAAQ,UACzB,YAAU,qBACV,UAAW,EACT,qJACA,EAAM,OAAS,UAAY,WAAa,kBACxC,EAAM,SACR,EAPF,SAAA,EASE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,4CAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,sEACX,SAAA,EAAM,KACL,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,4CAA6C,SAAA,EAAM,IAAQ,CAAA,CACrE,CACJ,CAAA,EAAA,EAAM,QACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,kFACZ,SAAA,EAAM,MACJ,CAAA,EACH,IACD,GAET,CAEA,SAAgB,EAAkB,CAAE,YAAW,GAAG,GAAuC,CACvF,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,UAAW,EACT,kHACA,CACF,EACA,GAAI,CACL,CAAA,CAEL,CAEA,SAAgB,EAAW,CAAE,YAAW,GAAG,GAAsC,CAC/E,OAAO,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAG,qCAAsC,CAAS,EAAG,GAAI,CAAQ,CAAA,CAC1F"}
1
+ {"version":3,"file":"studio-CtQdOoHK.js","names":[],"sources":["../../../src/ui/app/components/ui/studio.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function StudioPageShell({ className, ...props }: React.ComponentProps<\"section\">) {\n return (\n <section\n className={cn(\n \"grid h-full min-h-0 min-w-0 max-h-full max-w-full overflow-hidden bg-background\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function StudioPageHeader(\n props: {\n title: string;\n description: string;\n action?: React.ReactNode;\n } & Omit<React.ComponentProps<\"header\">, \"children\">,\n) {\n const { title, description, action, className, ...headerProps } = props;\n return (\n <header\n className={cn(\n \"flex flex-col gap-3 px-4 pt-4 sm:flex-row sm:items-end sm:justify-between md:px-6 md:pt-6\",\n className,\n )}\n {...headerProps}\n >\n <div className=\"grid min-w-0 gap-1\">\n <h1 className=\"m-0 font-heading text-2xl font-medium tracking-tight\">{title}</h1>\n <p className=\"m-0 max-w-[68ch] text-sm text-muted-foreground\">{description}</p>\n </div>\n {action}\n </header>\n );\n}\n\nexport function StudioPageContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div className={cn(\"min-h-0 min-w-0 px-4 pb-4 pt-6 md:px-6 md:pb-6\", className)} {...props} />\n );\n}\n\nexport function StudioHeaderMetric(props: {\n label: string;\n value: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"inline-flex h-8 items-center gap-2 rounded-md border border-hair px-2.5 text-xs font-medium text-muted-foreground\",\n props.className,\n )}\n >\n <span className=\"font-medium tabular-nums text-foreground\">{props.value}</span>\n {props.label}\n </span>\n );\n}\n\nexport function StudioSurface({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div className={cn(\"min-h-0 min-w-0 overflow-hidden bg-background\", className)} {...props} />\n );\n}\n\nexport function StudioSection({ className, ...props }: React.ComponentProps<\"section\">) {\n return (\n <section\n className={cn(\"grid gap-3 rounded-none border border-border bg-card p-4\", className)}\n {...props}\n />\n );\n}\n\nexport function StudioMetric(props: { label: string; value: React.ReactNode; className?: string }) {\n return (\n <div\n className={cn(\"grid gap-1 rounded-none border border-border bg-card p-4\", props.className)}\n >\n <span className=\"text-xs font-medium text-muted-foreground\">{props.label}</span>\n <span className=\"text-lg font-semibold tabular-nums text-foreground\">{props.value}</span>\n </div>\n );\n}\n\nexport function StudioEmptyState(props: {\n title: string;\n text: string;\n action?: React.ReactNode;\n size?: \"default\" | \"compact\";\n className?: string;\n}) {\n return (\n <div\n data-size={props.size ?? \"default\"}\n data-slot=\"studio-empty-state\"\n className={cn(\n \"flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-none border border-dashed border-border p-6 text-center text-balance\",\n props.size === \"compact\" ? \"min-h-32\" : \"h-full min-h-64\",\n props.className,\n )}\n >\n <div className=\"flex max-w-sm flex-col items-center gap-2\">\n <h2 className=\"m-0 font-heading text-sm font-medium tracking-tight text-foreground\">\n {props.title}\n </h2>\n <p className=\"m-0 text-sm/relaxed text-muted-foreground\">{props.text}</p>\n </div>\n {props.action ? (\n <div className=\"flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance\">\n {props.action}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function StudioStatusBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"inline-flex h-5 items-center rounded-4xl bg-secondary px-2 py-0.5 text-xs font-medium text-secondary-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function StudioTabs({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"grid gap-1 rounded-lg bg-muted p-1\", className)} {...props} />;\n}\n"],"mappings":"wDAGA,SAAgB,EAAgB,CAAE,YAAW,GAAG,GAA0C,CACxF,OACE,EAAA,EAAA,IAAA,CAAC,UAAD,CACE,UAAW,EACT,kFACA,CACF,EACA,GAAI,CACL,CAAA,CAEL,CAEA,SAAgB,EACd,EAKA,CACA,GAAM,CAAE,QAAO,cAAa,SAAQ,YAAW,GAAG,GAAgB,EAClE,OACE,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,UAAW,EACT,4FACA,CACF,EACA,GAAI,EALN,SAAA,EAOE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,uDAAwD,SAAA,CAAU,CAAA,GAChF,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,iDAAkD,SAAA,CAAe,CAAA,CAC3E,CACJ,CAAA,EAAA,CACK,GAEZ,CAEA,SAAgB,EAAkB,CAAE,YAAW,GAAG,GAAsC,CACtF,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAG,iDAAkD,CAAS,EAAG,GAAI,CAAQ,CAAA,CAEjG,CAEA,SAAgB,EAAmB,EAIhC,CACD,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CACE,UAAW,EACT,oHACA,EAAM,SACR,EAJF,SAAA,EAME,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,2CAA4C,SAAA,EAAM,KAAY,CAAA,EAC7E,EAAM,KACH,GAEV,CAEA,SAAgB,EAAc,CAAE,YAAW,GAAG,GAAsC,CAClF,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAG,gDAAiD,CAAS,EAAG,GAAI,CAAQ,CAAA,CAEhG,CAsBA,SAAgB,EAAiB,EAM9B,CACD,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,YAAW,EAAM,MAAQ,UACzB,YAAU,qBACV,UAAW,EACT,qJACA,EAAM,OAAS,UAAY,WAAa,kBACxC,EAAM,SACR,EAPF,SAAA,EASE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,4CAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,sEACX,SAAA,EAAM,KACL,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,4CAA6C,SAAA,EAAM,IAAQ,CAAA,CACrE,CACJ,CAAA,EAAA,EAAM,QACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,kFACZ,SAAA,EAAM,MACJ,CAAA,EACH,IACD,GAET,CAEA,SAAgB,EAAkB,CAAE,YAAW,GAAG,GAAuC,CACvF,OACE,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,UAAW,EACT,kHACA,CACF,EACA,GAAI,CACL,CAAA,CAEL,CAEA,SAAgB,EAAW,CAAE,YAAW,GAAG,GAAsC,CAC/E,OAAO,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAG,qCAAsC,CAAS,EAAG,GAAI,CAAQ,CAAA,CAC1F"}