@llmops/app 0.1.5 → 0.1.6-beta.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 (90) hide show
  1. package/dist/.vite/manifest.json +337 -298
  2. package/dist/assets/{Form-B1rZ0Hvr.js → Form-Bh6BPtQ_.js} +1 -1
  3. package/dist/assets/{InternalBackdrop-CXjGP6a9.js → InternalBackdrop-Za9lpJi7.js} +1 -1
  4. package/dist/assets/_environment-COxSWJ9w.js +1 -0
  5. package/dist/assets/_observability-C8wSXZk2.js +1 -0
  6. package/dist/assets/{_observability-DPSeR4-h.css → _observability-CBX-o26D.css} +1 -1
  7. package/dist/assets/{_settings-Bv8acMq8.js → _settings-DOmj1R7I.js} +1 -1
  8. package/dist/assets/{_tabs-Bi-rsAVV.js → _tabs-D9USU0yw.js} +1 -1
  9. package/dist/assets/{_tabs-oKfgxR5m.js → _tabs-DaucGqpx.js} +1 -1
  10. package/dist/assets/{_variant-Zg5HjNSN.js → _variant-DxME2BL0.js} +2 -2
  11. package/dist/assets/{_variants-B36Lo8m_.js → _variants-Bjp8ZEvO.js} +1 -1
  12. package/dist/assets/{area.css-DTnbbu5M.js → area.css-CSjofvHM.js} +1 -1
  13. package/dist/assets/{button-DftzA6-1.js → button-CMZqhyXB.js} +1 -1
  14. package/dist/assets/check-D9E8RKB4.js +1 -0
  15. package/dist/assets/{chevron-down-BjDiaa62.js → chevron-down-BJFxhYkh.js} +1 -1
  16. package/dist/assets/{chevron-right-Dz77YeP_.js → chevron-right-fMWRsRLZ.js} +1 -1
  17. package/dist/assets/combobox-iSbUYz0A.js +1 -0
  18. package/dist/assets/configs-BflhBVlY.js +1 -0
  19. package/dist/assets/{copy-D-DZB-6Z.js → copy-DADLeZ69.js} +1 -1
  20. package/dist/assets/costs-Fh0OPnEw.js +1 -0
  21. package/dist/assets/environments-ChldQPyq.js +1 -0
  22. package/dist/assets/{getDisabledMountTransitionStyles-CKUvhO4q.js → getDisabledMountTransitionStyles-TZFYxPIU.js} +1 -1
  23. package/dist/assets/{index-BS3B2BG5.js → index-BDsrc1Q7.js} +1 -1
  24. package/dist/assets/{index-BiCR_Kj2.css → index-BFe2NM3q.css} +1 -1
  25. package/dist/assets/{index-D841new6.js → index-BWU02PnY.js} +1 -1
  26. package/dist/assets/{index-xdhK5tU9.js → index-Cns5MLjo.js} +1 -1
  27. package/dist/assets/{index-CnOYeKc1.js → index-DW-cTzEh.js} +1 -1
  28. package/dist/assets/{index-CpAxLUl2.js → index-DYoud8po.js} +1 -1
  29. package/dist/assets/{index-DvzXLQL6.js → index-DeuSY0Yv.js} +1 -1
  30. package/dist/assets/{index-BCY9aD4r.js → index-FrTQ7TcS.js} +3 -3
  31. package/dist/assets/index.esm-oCSEvUVx.js +1 -0
  32. package/dist/assets/info-box.css-DuVI9M9-.js +1 -0
  33. package/dist/assets/{llmops-C5uyvq6E.js → llmops-CdOQq40D.js} +1 -1
  34. package/dist/assets/{observability-C5jdcUSg.css → observability-DEEfw22p.css} +1 -1
  35. package/dist/assets/observability.css-wgjHtY3p.js +1 -0
  36. package/dist/assets/overview-D1QIYPBL.js +33 -0
  37. package/dist/assets/{plus-C_L0BpbU.js → plus-JQ0TORpd.js} +1 -1
  38. package/dist/assets/{popover-CSR0ctop.js → popover-DXj4s-ni.js} +1 -1
  39. package/dist/assets/popupStateMapping-DolkyTT3.js +1 -0
  40. package/dist/assets/requests-CzvYwfwV.js +1 -0
  41. package/dist/assets/reselect-DVmmTZGf.js +1 -0
  42. package/dist/assets/{route-vfMzB8KR.js → route-CjAw8hSU.js} +1 -1
  43. package/dist/assets/{route-CI77gokb.js → route-Df57lqxl.js} +1 -1
  44. package/dist/assets/{route-wrnLt3bn.js → route-DmWZbVk6.js} +1 -1
  45. package/dist/assets/{route-CZ2yCnzN.js → route-timDYxX2.js} +1 -1
  46. package/dist/assets/{secrets-B9u5jvFm.js → secrets-BxFGEuKj.js} +1 -1
  47. package/dist/assets/settings-DpSRw7LL.js +1 -0
  48. package/dist/assets/settings-pgWZnVf6.js +1 -0
  49. package/dist/assets/{table-xLf4iXV8.js → table-DggTSlPh.js} +1 -1
  50. package/dist/assets/{tabs.css-fttLH8Xj.js → tabs.css-CG5ugi0p.js} +1 -1
  51. package/dist/assets/{targeting-DZIwwaYV.js → targeting-CkqRTjnZ.js} +1 -1
  52. package/dist/assets/{tooltip-BKoDpdAC.js → tooltip-BuSsMQ8P.js} +1 -1
  53. package/dist/assets/{update-or-create-name-ChWLK2jI.js → update-or-create-name-B-M46wHl.js} +1 -1
  54. package/dist/assets/useAnalytics-DTf81POS.js +1 -0
  55. package/dist/assets/useButton-CsZ8hBM8.js +1 -0
  56. package/dist/assets/{useConfigList-Du__Gu7q.js → useConfigList-CAf01_dV.js} +1 -1
  57. package/dist/assets/{useConfigVariants-C8frrCcZ.js → useConfigVariants-CLc_hPw1.js} +1 -1
  58. package/dist/assets/{useEnvironments-CYkrqAdO.js → useEnvironments-Bu_0SIUj.js} +1 -1
  59. package/dist/assets/{useFocus-Du1aH2j1.js → useFocus-9TCY0h5x.js} +1 -1
  60. package/dist/assets/{useMutation-VUB-GXkv.js → useMutation-D4JglXWk.js} +1 -1
  61. package/dist/assets/{usePopupAutoResize-ddPHogUJ.js → usePopupAutoResize-D6RSlB-m.js} +1 -1
  62. package/dist/assets/{useRole-DP91D1OX.js → useRole-CiSaVva3.js} +1 -1
  63. package/dist/assets/useSetTargeting-bk0Ixhqq.js +1 -0
  64. package/dist/assets/{useSyncedFloatingRootContext-BzuhbdSw.js → useSyncedFloatingRootContext-BKbVh8Gq.js} +1 -1
  65. package/dist/assets/{useTargetingRules-DS57orU0.js → useTargetingRules-BrgaEdxR.js} +1 -1
  66. package/dist/assets/{useValueChanged-vz8uKgCk.js → useValueChanged-CTjBqaGs.js} +1 -1
  67. package/dist/assets/{user-profile-Bt3_D9Gr.js → user-profile-BB3dPOc5.js} +1 -1
  68. package/dist/assets/{variants-CYXSNKzX.js → variants-BH682hHM.js} +1 -1
  69. package/dist/assets/variants.css-rCWHZycz.js +1 -0
  70. package/dist/assets/{workspace-general-BRMpUqb-.js → workspace-general-DYXfOF9H.js} +1 -1
  71. package/dist/index.cjs +82 -14
  72. package/dist/index.mjs +82 -14
  73. package/package.json +4 -3
  74. package/dist/assets/_environment-zVjmOhBI.js +0 -1
  75. package/dist/assets/_observability-CQ4Ll_WT.js +0 -1
  76. package/dist/assets/check-PaWYhFn6.js +0 -1
  77. package/dist/assets/configs-CtNuMmVR.js +0 -1
  78. package/dist/assets/costs-DwVSRTwW.js +0 -1
  79. package/dist/assets/environments-BB95BiC0.js +0 -1
  80. package/dist/assets/index.esm-COTq2pHX.js +0 -1
  81. package/dist/assets/info-box.css-HIaMvhbC.js +0 -1
  82. package/dist/assets/observability.css-dztiak5K.js +0 -1
  83. package/dist/assets/overview-BwCF8A1G.js +0 -1
  84. package/dist/assets/popupStateMapping-DkOpwBhG.js +0 -1
  85. package/dist/assets/requests-D8wE_E2M.js +0 -1
  86. package/dist/assets/settings-24qWHZEq.js +0 -1
  87. package/dist/assets/settings-BLt538aO.js +0 -1
  88. package/dist/assets/useButton-Ct8hIyjz.js +0 -1
  89. package/dist/assets/useSetTargeting-D1rPM8vz.js +0 -1
  90. package/dist/assets/variants.css-BjGKD3Nv.js +0 -1
@@ -1 +1 @@
1
- import{r as n}from"./index-BCY9aD4r.js";import{J as T,ah as W,I as C}from"./popupStateMapping-DkOpwBhG.js";import{E as F}from"./useButton-Ct8hIyjz.js";const R="ArrowUp",E="ArrowDown",S="ArrowLeft",I="ArrowRight",A="Home",w="End",H=new Set([S,I]),N=new Set([R,E]),Y=new Set([...H,...N]);[...Y];const J=new Set([R,E,S,I,A,w]),h=new Map([["select","listbox"],["combobox","listbox"],["label",!1]]);function U(c,O={}){const s="rootStore"in c?c.rootStore:c,a=s.useState("open"),u=s.useState("floatingId"),M=s.useState("domReferenceElement"),d=s.useState("floatingElement"),{enabled:m=!0,role:o="dialog"}=O,x=T(),l=M?.id||x,t=n.useMemo(()=>W(d)?.id||u,[d,u]),e=h.get(o)??o,p=C()!=null,i=n.useMemo(()=>e==="tooltip"||o==="label"?F:{"aria-haspopup":e==="alertdialog"?"dialog":e,"aria-expanded":"false",...e==="listbox"&&{role:"combobox"},...e==="menu"&&p&&{role:"menuitem"},...o==="select"&&{"aria-autocomplete":"none"},...o==="combobox"&&{"aria-autocomplete":"list"}},[e,p,o]),f=n.useMemo(()=>e==="tooltip"||o==="label"?{[`aria-${o==="label"?"labelledby":"describedby"}`]:a?t:void 0}:{...i,"aria-expanded":a?"true":"false","aria-controls":a?t:void 0,...e==="menu"&&{id:l}},[e,t,a,l,o,i]),b=n.useMemo(()=>{const r={id:t,...e&&{role:e}};return e==="tooltip"||o==="label"?r:{...r,...e==="menu"&&{"aria-labelledby":l}}},[e,t,l,o]),g=n.useCallback(({active:r,selected:_})=>{const P={role:"option",...r&&{id:`${t}-fui-option`}};switch(o){case"select":case"combobox":return{...P,"aria-selected":_}}return{}},[t,o]);return n.useMemo(()=>m?{reference:f,floating:b,item:g,trigger:i}:{},[m,f,b,i,g])}export{S as A,J as C,w as E,A as H,E as a,I as b,R as c,U as u};
1
+ import{r as n}from"./index-FrTQ7TcS.js";import{J as T,ah as W,I as C}from"./popupStateMapping-DolkyTT3.js";import{E as F}from"./useButton-CsZ8hBM8.js";const R="ArrowUp",E="ArrowDown",S="ArrowLeft",I="ArrowRight",A="Home",w="End",H=new Set([S,I]),N=new Set([R,E]),Y=new Set([...H,...N]);[...Y];const J=new Set([R,E,S,I,A,w]),h=new Map([["select","listbox"],["combobox","listbox"],["label",!1]]);function U(c,O={}){const s="rootStore"in c?c.rootStore:c,a=s.useState("open"),u=s.useState("floatingId"),M=s.useState("domReferenceElement"),d=s.useState("floatingElement"),{enabled:m=!0,role:o="dialog"}=O,x=T(),l=M?.id||x,t=n.useMemo(()=>W(d)?.id||u,[d,u]),e=h.get(o)??o,p=C()!=null,i=n.useMemo(()=>e==="tooltip"||o==="label"?F:{"aria-haspopup":e==="alertdialog"?"dialog":e,"aria-expanded":"false",...e==="listbox"&&{role:"combobox"},...e==="menu"&&p&&{role:"menuitem"},...o==="select"&&{"aria-autocomplete":"none"},...o==="combobox"&&{"aria-autocomplete":"list"}},[e,p,o]),f=n.useMemo(()=>e==="tooltip"||o==="label"?{[`aria-${o==="label"?"labelledby":"describedby"}`]:a?t:void 0}:{...i,"aria-expanded":a?"true":"false","aria-controls":a?t:void 0,...e==="menu"&&{id:l}},[e,t,a,l,o,i]),b=n.useMemo(()=>{const r={id:t,...e&&{role:e}};return e==="tooltip"||o==="label"?r:{...r,...e==="menu"&&{"aria-labelledby":l}}},[e,t,l,o]),g=n.useCallback(({active:r,selected:_})=>{const P={role:"option",...r&&{id:`${t}-fui-option`}};switch(o){case"select":case"combobox":return{...P,"aria-selected":_}}return{}},[t,o]);return n.useMemo(()=>m?{reference:f,floating:b,item:g,trigger:i}:{},[m,f,b,i,g])}export{S as A,J as C,w as E,A as H,E as a,I as b,R as c,U as u};
@@ -0,0 +1 @@
1
+ import{l as o,a as n,t as i,H as c,i as r,g as u}from"./index-FrTQ7TcS.js";import{u as v}from"./useMutation-D4JglXWk.js";import{g as p}from"./useTargetingRules-BrgaEdxR.js";const y=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],V=o("save",y);var w="_1oq6p8e0",h="_1oq6p8e1",I="_1oq6p8e3",Q="_1oq6p8e4",k="_1oq6p8e5",C="_1oq6p8e6",H="_1oq6p8e7",$="_1oq6p8e8",b="_1oq6p8e9";const d=e=>["variant-versions",e],m=e=>c({queryKey:d(e),queryFn:async()=>{const a=await(await r.v1.variants[":id"].versions.$get({param:{id:e}})).json();return"data"in a?a.data:[]},enabled:!!e,staleTime:1e3*60*5}),F=e=>{const t=n.c(2);let a;return t[0]!==e?(a=m(e),t[0]=e,t[1]=a):a=t[1],i(a)},K=()=>{const e=n.c(2),t=u();let a;return e[0]!==t?(a={mutationFn:g,onSuccess:(l,s)=>{t.invalidateQueries({queryKey:p(s.configId)})}},e[0]=t,e[1]=a):a=e[1],v(a)};async function g(e){const t=await r.v1.targeting.set.$post({json:{environmentId:e.environmentId,configId:e.configId,configVariantId:e.configVariantId,variantVersionId:e.variantVersionId}}),a=await t.json();if(!t.ok||!("data"in a))throw new Error("message"in a?a.message:"Failed to set targeting");return a.data}export{V as S,k as a,b,C as c,Q as d,F as e,w as f,d as g,h,I as i,$ as m,K as u,H as v};
@@ -1 +1 @@
1
- import{r as f}from"./index-BCY9aD4r.js";import{a as T,u as m,E as p,b as S,n as C}from"./useButton-Ct8hIyjz.js";import{ai as x,s as I,aj as E,P as O,d as i,J as P,I as R}from"./popupStateMapping-DkOpwBhG.js";function y(e,n){const t=f.useRef(null);return f.useCallback(o=>{e!==void 0&&(t.current!==null&&(n.context.triggerElements.delete(t.current),t.current=null),o!==null&&(t.current=e,n.context.triggerElements.add(e,o)))},[n,e])}function F(e,n,t,o){const r=t.useState("isMountedByTrigger",e),l=y(e,t),s=T(a=>{l(a),a!==null&&t.select("open")&&t.select("activeTriggerId")==null&&t.update({activeTriggerId:e,activeTriggerElement:a,...o})});return m(()=>{r&&t.update({activeTriggerElement:n.current,...o})},[r,t,n,...Object.values(o)]),{registerTrigger:s,isMountedByThisTrigger:r}}function w(e){const n=e.useState("open");m(()=>{if(n&&!e.select("activeTriggerId")&&e.context.triggerElements.size===1){const t=e.context.triggerElements.entries().next();if(!t.done){const[o,r]=t.value;e.update({activeTriggerId:o,activeTriggerElement:r})}}},[n,e])}function U(e,n,t){const{mounted:o,setMounted:r,transitionStatus:l}=x(e);n.useSyncedValues({mounted:o,transitionStatus:l});const s=T(()=>{r(!1),n.update({activeTriggerId:null,activeTriggerElement:null,mounted:!1}),t?.(),n.context.onOpenChangeComplete?.(!1)}),a=n.useState("preventUnmountingOnClose");return I({enabled:!a,open:e,ref:n.context.popupRef,onComplete(){e||s()}}),{forceUnmount:s,transitionStatus:l}}function b(){return new E({open:!1,floatingElement:null,referenceElement:null,triggerElements:new O,floatingId:"",nested:!1,noEmit:!1,onOpenChange:void 0})}function A(){return{open:!1,mounted:!1,transitionStatus:"idle",floatingRootContext:b(),preventUnmountingOnClose:!1,payload:void 0,activeTriggerId:null,activeTriggerElement:null,popupElement:null,positionerElement:null,activeTriggerProps:p,inactiveTriggerProps:p,popupProps:p}}const j={open:i(e=>e.open),mounted:i(e=>e.mounted),transitionStatus:i(e=>e.transitionStatus),floatingRootContext:i(e=>e.floatingRootContext),preventUnmountingOnClose:i(e=>e.preventUnmountingOnClose),payload:i(e=>e.payload),activeTriggerId:i(e=>e.activeTriggerId),activeTriggerElement:i(e=>e.mounted?e.activeTriggerElement:null),isTriggerActive:i((e,n)=>n!==void 0&&e.activeTriggerId===n),isOpenedByTrigger:i((e,n)=>n!==void 0&&e.activeTriggerId===n&&e.open),isMountedByTrigger:i((e,n)=>n!==void 0&&e.activeTriggerId===n&&e.mounted),triggerProps:i((e,n)=>n?e.activeTriggerProps:e.inactiveTriggerProps),popupProps:i(e=>e.popupProps),popupElement:i(e=>e.popupElement),positionerElement:i(e=>e.positionerElement)};function k(e){const{popupStore:n,noEmit:t=!1,treatPopupAsFloatingElement:o=!1,onOpenChange:r}=e,l=P(),s=R()!=null,a=n.useState("open"),g=n.useState("activeTriggerElement"),c=n.useState(o?"popupElement":"positionerElement"),v=n.context.triggerElements,u=S(()=>new E({open:a,referenceElement:g,floatingElement:c,triggerElements:v,onOpenChange:r,floatingId:l,nested:s,noEmit:t})).current;return m(()=>{const d={open:a,floatingId:l,referenceElement:g,floatingElement:c};C(g)&&(d.domReferenceElement=g),u.update(d)},[a,l,g,c,u]),u.context.onOpenChange=r,u.context.nested=s,u.context.noEmit=t,u}export{w as a,U as b,A as c,F as d,y as e,j as p,k as u};
1
+ import{r as f}from"./index-FrTQ7TcS.js";import{a as T,u as m,E as p,b as S,n as C}from"./useButton-CsZ8hBM8.js";import{ai as x,s as I,aj as E,P as O,d as i,J as P,I as R}from"./popupStateMapping-DolkyTT3.js";function y(e,n){const t=f.useRef(null);return f.useCallback(o=>{e!==void 0&&(t.current!==null&&(n.context.triggerElements.delete(t.current),t.current=null),o!==null&&(t.current=e,n.context.triggerElements.add(e,o)))},[n,e])}function F(e,n,t,o){const r=t.useState("isMountedByTrigger",e),l=y(e,t),s=T(a=>{l(a),a!==null&&t.select("open")&&t.select("activeTriggerId")==null&&t.update({activeTriggerId:e,activeTriggerElement:a,...o})});return m(()=>{r&&t.update({activeTriggerElement:n.current,...o})},[r,t,n,...Object.values(o)]),{registerTrigger:s,isMountedByThisTrigger:r}}function w(e){const n=e.useState("open");m(()=>{if(n&&!e.select("activeTriggerId")&&e.context.triggerElements.size===1){const t=e.context.triggerElements.entries().next();if(!t.done){const[o,r]=t.value;e.update({activeTriggerId:o,activeTriggerElement:r})}}},[n,e])}function U(e,n,t){const{mounted:o,setMounted:r,transitionStatus:l}=x(e);n.useSyncedValues({mounted:o,transitionStatus:l});const s=T(()=>{r(!1),n.update({activeTriggerId:null,activeTriggerElement:null,mounted:!1}),t?.(),n.context.onOpenChangeComplete?.(!1)}),a=n.useState("preventUnmountingOnClose");return I({enabled:!a,open:e,ref:n.context.popupRef,onComplete(){e||s()}}),{forceUnmount:s,transitionStatus:l}}function b(){return new E({open:!1,floatingElement:null,referenceElement:null,triggerElements:new O,floatingId:"",nested:!1,noEmit:!1,onOpenChange:void 0})}function A(){return{open:!1,mounted:!1,transitionStatus:"idle",floatingRootContext:b(),preventUnmountingOnClose:!1,payload:void 0,activeTriggerId:null,activeTriggerElement:null,popupElement:null,positionerElement:null,activeTriggerProps:p,inactiveTriggerProps:p,popupProps:p}}const j={open:i(e=>e.open),mounted:i(e=>e.mounted),transitionStatus:i(e=>e.transitionStatus),floatingRootContext:i(e=>e.floatingRootContext),preventUnmountingOnClose:i(e=>e.preventUnmountingOnClose),payload:i(e=>e.payload),activeTriggerId:i(e=>e.activeTriggerId),activeTriggerElement:i(e=>e.mounted?e.activeTriggerElement:null),isTriggerActive:i((e,n)=>n!==void 0&&e.activeTriggerId===n),isOpenedByTrigger:i((e,n)=>n!==void 0&&e.activeTriggerId===n&&e.open),isMountedByTrigger:i((e,n)=>n!==void 0&&e.activeTriggerId===n&&e.mounted),triggerProps:i((e,n)=>n?e.activeTriggerProps:e.inactiveTriggerProps),popupProps:i(e=>e.popupProps),popupElement:i(e=>e.popupElement),positionerElement:i(e=>e.positionerElement)};function k(e){const{popupStore:n,noEmit:t=!1,treatPopupAsFloatingElement:o=!1,onOpenChange:r}=e,l=P(),s=R()!=null,a=n.useState("open"),g=n.useState("activeTriggerElement"),c=n.useState(o?"popupElement":"positionerElement"),v=n.context.triggerElements,u=S(()=>new E({open:a,referenceElement:g,floatingElement:c,triggerElements:v,onOpenChange:r,floatingId:l,nested:s,noEmit:t})).current;return m(()=>{const d={open:a,floatingId:l,referenceElement:g,floatingElement:c};C(g)&&(d.domReferenceElement=g),u.update(d)},[a,l,g,c,u]),u.context.onOpenChange=r,u.context.nested=s,u.context.noEmit=t,u}export{w as a,U as b,A as c,F as d,y as e,j as p,k as u};
@@ -1 +1 @@
1
- import{a as l,t as o,i}from"./index-BCY9aD4r.js";const p=t=>["targeting-rules",t],g=t=>{const e=l.c(8);let s;e[0]!==t?(s=p(t),e[0]=t,e[1]=s):s=e[1];let a;e[2]!==t?(a=async()=>{const u=await(await i.v1.targeting.config[":configId"].$get({param:{configId:t}})).json();return"data"in u?u.data:[]},e[2]=t,e[3]=a):a=e[3];const n=!!t;let r;return e[4]!==s||e[5]!==a||e[6]!==n?(r={queryKey:s,queryFn:a,enabled:n},e[4]=s,e[5]=a,e[6]=n,e[7]=r):r=e[7],o(r)};export{p as g,g as u};
1
+ import{a as l,t as o,i}from"./index-FrTQ7TcS.js";const p=t=>["targeting-rules",t],g=t=>{const e=l.c(8);let s;e[0]!==t?(s=p(t),e[0]=t,e[1]=s):s=e[1];let a;e[2]!==t?(a=async()=>{const u=await(await i.v1.targeting.config[":configId"].$get({param:{configId:t}})).json();return"data"in u?u.data:[]},e[2]=t,e[3]=a):a=e[3];const n=!!t;let r;return e[4]!==s||e[5]!==a||e[6]!==n?(r={queryKey:s,queryFn:a,enabled:n},e[4]=s,e[5]=a,e[6]=n,e[7]=r):r=e[7],o(r)};export{p as g,g as u};
@@ -1 +1 @@
1
- import{r}from"./index-BCY9aD4r.js";import{N as a,a as u,u as n}from"./useButton-Ct8hIyjz.js";const c=r.createContext({formRef:{current:{fields:new Map}},errors:{},clearErrors:a,validationMode:"onSubmit",submitAttemptedRef:{current:!1}});function m(){return r.useContext(c)}function C(e,s){const t=r.useRef(e),o=u(s);n(()=>{t.current!==e&&o(t.current)},[e,o]),n(()=>{t.current=e},[e])}export{c as F,m as a,C as u};
1
+ import{r}from"./index-FrTQ7TcS.js";import{N as a,a as u,u as n}from"./useButton-CsZ8hBM8.js";const c=r.createContext({formRef:{current:{fields:new Map}},errors:{},clearErrors:a,validationMode:"onSubmit",submitAttemptedRef:{current:!1}});function m(){return r.useContext(c)}function C(e,s){const t=r.useRef(e),o=u(s);n(()=>{t.current!==e&&o(t.current)},[e,o]),n(()=>{t.current=e},[e])}export{c as F,m as a,C as u};
@@ -1 +1 @@
1
- import{l as n,a as s,j as t}from"./index-BCY9aD4r.js";import{i as c}from"./info-box.css-HIaMvhbC.js";/* empty css */const a=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],r=n("info",a);function p(){const e=s.c(2);if((window.bootstrapData?.authType||"basic")==="basic"){let i;return e[0]===Symbol.for("react.memo_cache_sentinel")?(i=t.jsx("div",{children:t.jsxs("div",{className:c,children:[t.jsx(r,{size:16}),t.jsx("span",{children:"You are using basic authentication. Profile settings cannot be changed in this mode."})]})}),e[0]=i):i=e[0],i}let o;return e[1]===Symbol.for("react.memo_cache_sentinel")?(o=t.jsx("div",{children:t.jsx("h2",{children:"Profile"})}),e[1]=o):o=e[1],o}export{p as component};
1
+ import{l as n,a as s,j as t}from"./index-FrTQ7TcS.js";import{i as c}from"./info-box.css-DuVI9M9-.js";/* empty css */const a=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],r=n("info",a);function p(){const e=s.c(2);if((window.bootstrapData?.authType||"basic")==="basic"){let i;return e[0]===Symbol.for("react.memo_cache_sentinel")?(i=t.jsx("div",{children:t.jsxs("div",{className:c,children:[t.jsx(r,{size:16}),t.jsx("span",{children:"You are using basic authentication. Profile settings cannot be changed in this mode."})]})}),e[0]=i):i=e[0],i}let o;return e[1]===Symbol.for("react.memo_cache_sentinel")?(o=t.jsx("div",{children:t.jsx("h2",{children:"Profile"})}),e[1]=o):o=e[1],o}export{p as component};
@@ -1 +1 @@
1
- import{a as v,E as g,g as C,d as y,j as s,F as b,I as V}from"./index-BCY9aD4r.js";import{B as I}from"./button-DftzA6-1.js";import{b as p,e as c,a as T,c as x,T as N,d as _}from"./table-xLf4iXV8.js";import{u as $}from"./useConfigVariants-C8frrCcZ.js";import{v as k,a as R}from"./variants.css-BjGKD3Nv.js";import{P as w}from"./plus-C_L0BpbU.js";/* empty css */import"./useButton-Ct8hIyjz.js";function L(){const e=v.c(18),{id:a}=g.useParams(),j=C(),{data:d,isLoading:u}=$(a),i=y();if(u){let n;return e[0]===Symbol.for("react.memo_cache_sentinel")?(n=s.jsx("div",{children:"Loading variants..."}),e[0]=n):n=e[0],n}let t;e[1]!==a||e[2]!==i?(t=()=>{i({to:"/configs/$id/variants/$variant",params:{id:a,variant:"new"}})},e[1]=a,e[2]=i,e[3]=t):t=e[3];let m;e[4]===Symbol.for("react.memo_cache_sentinel")?(m=s.jsx(V,{icon:w}),e[4]=m):m=e[4];let r;e[5]!==t?(r=s.jsx("div",{className:k,children:s.jsxs(I,{variant:"ghost",onClick:t,children:[m,"Add Variant"]})}),e[5]=t,e[6]=r):r=e[6];let f;e[7]===Symbol.for("react.memo_cache_sentinel")?(f=s.jsx(T,{children:s.jsxs(p,{children:[s.jsx(x,{children:"Name"}),s.jsx(x,{children:"Provider"}),s.jsx(x,{children:"Model"}),s.jsx(x,{children:"Current Version"})]})}),e[7]=f):f=e[7];let o;e[8]!==a||e[9]!==d||e[10]!==i||e[11]!==j?(o=d&&d.length>0?d.map(n=>s.jsxs(p,{interactive:!0,onMouseEnter:()=>{j.prefetchQuery(b(n.variantId))},onClick:()=>i({to:"/configs/$id/variants/$variant",params:{id:a,variant:n.variantId}}),children:[s.jsx(c,{children:n.name||"Unnamed Variant"}),s.jsx(c,{children:n.provider||"Unknown"}),s.jsx(c,{children:n.modelName||"Unknown"}),s.jsx(c,{children:n.latestVersion?.version?`v${n.latestVersion.version}`:"-"})]},n.variantId)):s.jsx(p,{children:s.jsx(c,{colSpan:4,style:{textAlign:"center",padding:"2rem"},children:'No variants added yet. Click "Add Variant" to get started.'})}),e[8]=a,e[9]=d,e[10]=i,e[11]=j,e[12]=o):o=e[12];let l;e[13]!==o?(l=s.jsxs(N,{children:[f,s.jsx(_,{children:o})]}),e[13]=o,e[14]=l):l=e[14];let h;return e[15]!==r||e[16]!==l?(h=s.jsxs("div",{className:R,children:[r,l]}),e[15]=r,e[16]=l,e[17]=h):h=e[17],h}export{L as component};
1
+ import{a as v,K as g,g as C,d as y,j as s,M as b,I as V}from"./index-FrTQ7TcS.js";import{B as I}from"./button-CMZqhyXB.js";import{b as p,e as c,a as T,c as x,T as N,d as _}from"./table-DggTSlPh.js";import{u as $}from"./useConfigVariants-CLc_hPw1.js";import{v as k,a as R}from"./variants.css-rCWHZycz.js";import{P as w}from"./plus-JQ0TORpd.js";/* empty css */import"./useButton-CsZ8hBM8.js";function U(){const e=v.c(18),{id:a}=g.useParams(),j=C(),{data:d,isLoading:u}=$(a),i=y();if(u){let n;return e[0]===Symbol.for("react.memo_cache_sentinel")?(n=s.jsx("div",{children:"Loading variants..."}),e[0]=n):n=e[0],n}let t;e[1]!==a||e[2]!==i?(t=()=>{i({to:"/configs/$id/variants/$variant",params:{id:a,variant:"new"}})},e[1]=a,e[2]=i,e[3]=t):t=e[3];let m;e[4]===Symbol.for("react.memo_cache_sentinel")?(m=s.jsx(V,{icon:w}),e[4]=m):m=e[4];let r;e[5]!==t?(r=s.jsx("div",{className:k,children:s.jsxs(I,{variant:"ghost",onClick:t,children:[m,"Add Variant"]})}),e[5]=t,e[6]=r):r=e[6];let f;e[7]===Symbol.for("react.memo_cache_sentinel")?(f=s.jsx(T,{children:s.jsxs(p,{children:[s.jsx(x,{children:"Name"}),s.jsx(x,{children:"Provider"}),s.jsx(x,{children:"Model"}),s.jsx(x,{children:"Current Version"})]})}),e[7]=f):f=e[7];let o;e[8]!==a||e[9]!==d||e[10]!==i||e[11]!==j?(o=d&&d.length>0?d.map(n=>s.jsxs(p,{interactive:!0,onMouseEnter:()=>{j.prefetchQuery(b(n.variantId))},onClick:()=>i({to:"/configs/$id/variants/$variant",params:{id:a,variant:n.variantId}}),children:[s.jsx(c,{children:n.name||"Unnamed Variant"}),s.jsx(c,{children:n.provider||"Unknown"}),s.jsx(c,{children:n.modelName||"Unknown"}),s.jsx(c,{children:n.latestVersion?.version?`v${n.latestVersion.version}`:"-"})]},n.variantId)):s.jsx(p,{children:s.jsx(c,{colSpan:4,style:{textAlign:"center",padding:"2rem"},children:'No variants added yet. Click "Add Variant" to get started.'})}),e[8]=a,e[9]=d,e[10]=i,e[11]=j,e[12]=o):o=e[12];let l;e[13]!==o?(l=s.jsxs(N,{children:[f,s.jsx(_,{children:o})]}),e[13]=o,e[14]=l):l=e[14];let h;return e[15]!==r||e[16]!==l?(h=s.jsxs("div",{className:R,children:[r,l]}),e[15]=r,e[16]=l,e[17]=h):h=e[17],h}export{U as component};
@@ -0,0 +1 @@
1
+ import"./index-FrTQ7TcS.js";var r="tye0o0",t="tye0o1";export{r as a,t as v};
@@ -1 +1 @@
1
- import{a as g,t as w,i as h,g as x,r as _,j as a}from"./index-BCY9aD4r.js";import{u as S}from"./useMutation-VUB-GXkv.js";/* empty css */const k=()=>["workspace-settings"],N=()=>{const e=g.c(1);let t;return e[0]===Symbol.for("react.memo_cache_sentinel")?(t={queryKey:k(),queryFn:$},e[0]=t):t=e[0],w(t)};async function $(){const t=await(await h.v1["workspace-settings"].$get()).json();return"data"in t?t.data:null}const E=()=>{const e=g.c(2),t=x();let s;return e[0]!==t?(s={mutationFn:C,onSuccess:()=>{t.invalidateQueries({queryKey:k()})}},e[0]=t,e[1]=s):s=e[1],S(s)};async function C(e){const t=await h.v1["workspace-settings"].$patch({json:{name:e.name}}),s=await t.json();if(!t.ok||!("data"in s))throw new Error("message"in s?s.message:"Failed to update workspace settings");return s.data}var y="_1ervu4v0",F="_1ervu4v1",K="_1ervu4v2",q="_1ervu4v5",Q="_1ervu4v7 _1ervu4v6 _1lg22bkv0 _1lg22bkuc _1lg22bk26 _1lg22bk2u _1lg22bkbc _1lg22bkj9";function B(){const e=g.c(14),{data:t,isLoading:s}=N(),p=E(),[r,f]=_.useState("");let o;e[0]!==t?(o=()=>{t?.name!==void 0&&f(t.name??"")},e[0]=t,e[1]=o):o=e[1];const d=t?.name;let i;e[2]!==d?(i=[d],e[2]=d,e[3]=i):i=e[3],_.useEffect(o,i);let c;e[4]!==r||e[5]!==t?.name||e[6]!==p?(c=()=>{const n=r.trim(),j=t?.name??"";n!==j&&p.mutate({name:n||null})},e[4]=r,e[5]=t?.name,e[6]=p,e[7]=c):c=e[7],t?.name;const v=c,b=L;if(s){let n;return e[8]===Symbol.for("react.memo_cache_sentinel")?(n=a.jsx("div",{className:y,children:"Loading..."}),e[8]=n):n=e[8],n}let l;e[9]===Symbol.for("react.memo_cache_sentinel")?(l=a.jsx("label",{className:q,children:"Name of your workspace"}),e[9]=l):l=e[9];let u;e[10]===Symbol.for("react.memo_cache_sentinel")?(u=n=>f(n.target.value),e[10]=u):u=e[10];let m;return e[11]!==v||e[12]!==r?(m=a.jsx("div",{className:y,children:a.jsx("div",{className:F,children:a.jsx("div",{className:K,children:a.jsxs("div",{children:[l,a.jsx("input",{type:"text",className:Q,value:r,onChange:u,onBlur:v,onKeyDown:b,placeholder:"Workspace name"})]})})})}),e[11]=v,e[12]=r,e[13]=m):m=e[13],m}function L(e){e.key==="Enter"&&e.currentTarget.blur()}export{B as component};
1
+ import{a as g,t as w,i as h,g as x,r as _,j as a}from"./index-FrTQ7TcS.js";import{u as S}from"./useMutation-D4JglXWk.js";/* empty css */const k=()=>["workspace-settings"],N=()=>{const e=g.c(1);let t;return e[0]===Symbol.for("react.memo_cache_sentinel")?(t={queryKey:k(),queryFn:$},e[0]=t):t=e[0],w(t)};async function $(){const t=await(await h.v1["workspace-settings"].$get()).json();return"data"in t?t.data:null}const E=()=>{const e=g.c(2),t=x();let s;return e[0]!==t?(s={mutationFn:C,onSuccess:()=>{t.invalidateQueries({queryKey:k()})}},e[0]=t,e[1]=s):s=e[1],S(s)};async function C(e){const t=await h.v1["workspace-settings"].$patch({json:{name:e.name}}),s=await t.json();if(!t.ok||!("data"in s))throw new Error("message"in s?s.message:"Failed to update workspace settings");return s.data}var y="_1ervu4v0",F="_1ervu4v1",K="_1ervu4v2",q="_1ervu4v5",Q="_1ervu4v7 _1ervu4v6 _1lg22bkv0 _1lg22bkuc _1lg22bk26 _1lg22bk2u _1lg22bkbc _1lg22bkj9";function B(){const e=g.c(14),{data:t,isLoading:s}=N(),p=E(),[r,f]=_.useState("");let o;e[0]!==t?(o=()=>{t?.name!==void 0&&f(t.name??"")},e[0]=t,e[1]=o):o=e[1];const d=t?.name;let i;e[2]!==d?(i=[d],e[2]=d,e[3]=i):i=e[3],_.useEffect(o,i);let c;e[4]!==r||e[5]!==t?.name||e[6]!==p?(c=()=>{const n=r.trim(),j=t?.name??"";n!==j&&p.mutate({name:n||null})},e[4]=r,e[5]=t?.name,e[6]=p,e[7]=c):c=e[7],t?.name;const v=c,b=L;if(s){let n;return e[8]===Symbol.for("react.memo_cache_sentinel")?(n=a.jsx("div",{className:y,children:"Loading..."}),e[8]=n):n=e[8],n}let l;e[9]===Symbol.for("react.memo_cache_sentinel")?(l=a.jsx("label",{className:q,children:"Name of your workspace"}),e[9]=l):l=e[9];let u;e[10]===Symbol.for("react.memo_cache_sentinel")?(u=n=>f(n.target.value),e[10]=u):u=e[10];let m;return e[11]!==v||e[12]!==r?(m=a.jsx("div",{className:y,children:a.jsx("div",{className:F,children:a.jsx("div",{className:K,children:a.jsxs("div",{children:[l,a.jsx("input",{type:"text",className:Q,value:r,onChange:u,onBlur:v,onKeyDown:b,placeholder:"Workspace name"})]})})})}),e[11]=v,e[12]=r,e[13]=m):m=e[13],m}function L(e){e.key==="Enter"&&e.currentTarget.blur()}export{B as component};
package/dist/index.cjs CHANGED
@@ -63,7 +63,7 @@ let node_process = require("node:process");
63
63
  let __llmops_core_db = require("@llmops/core/db");
64
64
 
65
65
  //#region src/client/index.tsx?url
66
- var client_default = "/assets/index-BCY9aD4r.js";
66
+ var client_default = "/assets/index-FrTQ7TcS.js";
67
67
 
68
68
  //#endregion
69
69
  //#region src/client/styles/styles.css?url
@@ -12793,28 +12793,65 @@ const dateRangeSchema = zod_default.object({
12793
12793
  endDate: isoDateString.transform(parseEndDate)
12794
12794
  });
12795
12795
  /**
12796
+ * Date range query schema with optional filters
12797
+ */
12798
+ const dateRangeWithFiltersSchema = dateRangeSchema.extend({
12799
+ configId: zod_default.string().uuid().optional(),
12800
+ variantId: zod_default.string().uuid().optional(),
12801
+ environmentId: zod_default.string().uuid().optional(),
12802
+ tags: zod_default.string().optional()
12803
+ });
12804
+ /**
12805
+ * Parse tags JSON string to Record<string, string[]>
12806
+ */
12807
+ function parseTags(tagsJson) {
12808
+ if (!tagsJson) return void 0;
12809
+ try {
12810
+ return JSON.parse(tagsJson);
12811
+ } catch {
12812
+ return;
12813
+ }
12814
+ }
12815
+ /**
12796
12816
  * Analytics API routes for cost and usage tracking
12797
12817
  */
12798
12818
  const app$10 = new hono.Hono().get("/requests", zv("query", zod_default.object({
12799
12819
  limit: zod_default.string().transform(Number).optional(),
12800
12820
  offset: zod_default.string().transform(Number).optional(),
12801
12821
  configId: zod_default.string().uuid().optional(),
12822
+ variantId: zod_default.string().uuid().optional(),
12823
+ environmentId: zod_default.string().uuid().optional(),
12802
12824
  provider: zod_default.string().optional(),
12803
12825
  model: zod_default.string().optional(),
12804
12826
  startDate: isoDateString.optional(),
12805
- endDate: isoDateString.optional()
12827
+ endDate: isoDateString.optional(),
12828
+ tags: zod_default.string().optional()
12806
12829
  })), async (c) => {
12807
12830
  const db = c.get("db");
12808
12831
  const query = c.req.valid("query");
12832
+ console.log("[Analytics] Request filters:", {
12833
+ configId: query.configId,
12834
+ variantId: query.variantId,
12835
+ environmentId: query.environmentId,
12836
+ startDate: query.startDate,
12837
+ endDate: query.endDate
12838
+ });
12839
+ let parsedTags;
12840
+ if (query.tags) try {
12841
+ parsedTags = JSON.parse(query.tags);
12842
+ } catch {}
12809
12843
  try {
12810
12844
  const requests = await db.listRequests({
12811
12845
  limit: query.limit,
12812
12846
  offset: query.offset,
12813
12847
  configId: query.configId,
12848
+ variantId: query.variantId,
12849
+ environmentId: query.environmentId,
12814
12850
  provider: query.provider,
12815
12851
  model: query.model,
12816
12852
  startDate: query.startDate ? parseStartDate(query.startDate) : void 0,
12817
- endDate: query.endDate ? parseEndDate(query.endDate) : void 0
12853
+ endDate: query.endDate ? parseEndDate(query.endDate) : void 0,
12854
+ tags: parsedTags
12818
12855
  });
12819
12856
  return c.json(successResponse(requests, 200));
12820
12857
  } catch (error$45) {
@@ -12832,13 +12869,17 @@ const app$10 = new hono.Hono().get("/requests", zv("query", zod_default.object({
12832
12869
  console.error("Error fetching request:", error$45);
12833
12870
  return c.json(internalServerError("Failed to fetch request", 500), 500);
12834
12871
  }
12835
- }).get("/costs/total", zv("query", dateRangeSchema), async (c) => {
12872
+ }).get("/costs/total", zv("query", dateRangeWithFiltersSchema), async (c) => {
12836
12873
  const db = c.get("db");
12837
- const { startDate, endDate } = c.req.valid("query");
12874
+ const { startDate, endDate, configId, variantId, environmentId, tags } = c.req.valid("query");
12838
12875
  try {
12839
12876
  const data = await db.getTotalCost({
12840
12877
  startDate,
12841
- endDate
12878
+ endDate,
12879
+ configId,
12880
+ variantId,
12881
+ environmentId,
12882
+ tags: parseTags(tags)
12842
12883
  });
12843
12884
  if (!data) return c.json(successResponse({
12844
12885
  totalCost: 0,
@@ -12912,7 +12953,7 @@ const app$10 = new hono.Hono().get("/requests", zv("query", zod_default.object({
12912
12953
  console.error("Error fetching daily costs:", error$45);
12913
12954
  return c.json(internalServerError("Failed to fetch daily costs", 500), 500);
12914
12955
  }
12915
- }).get("/costs/summary", zv("query", dateRangeSchema.extend({ groupBy: zod_default.enum([
12956
+ }).get("/costs/summary", zv("query", dateRangeWithFiltersSchema.extend({ groupBy: zod_default.enum([
12916
12957
  "day",
12917
12958
  "hour",
12918
12959
  "model",
@@ -12920,25 +12961,33 @@ const app$10 = new hono.Hono().get("/requests", zv("query", zod_default.object({
12920
12961
  "config"
12921
12962
  ]).optional() })), async (c) => {
12922
12963
  const db = c.get("db");
12923
- const { startDate, endDate, groupBy } = c.req.valid("query");
12964
+ const { startDate, endDate, groupBy, configId, variantId, environmentId, tags } = c.req.valid("query");
12924
12965
  try {
12925
12966
  const data = await db.getCostSummary({
12926
12967
  startDate,
12927
12968
  endDate,
12928
- groupBy
12969
+ groupBy,
12970
+ configId,
12971
+ variantId,
12972
+ environmentId,
12973
+ tags: parseTags(tags)
12929
12974
  });
12930
12975
  return c.json(successResponse(data, 200));
12931
12976
  } catch (error$45) {
12932
12977
  console.error("Error fetching cost summary:", error$45);
12933
12978
  return c.json(internalServerError("Failed to fetch cost summary", 500), 500);
12934
12979
  }
12935
- }).get("/stats", zv("query", dateRangeSchema), async (c) => {
12980
+ }).get("/stats", zv("query", dateRangeWithFiltersSchema), async (c) => {
12936
12981
  const db = c.get("db");
12937
- const { startDate, endDate } = c.req.valid("query");
12982
+ const { startDate, endDate, configId, variantId, environmentId, tags } = c.req.valid("query");
12938
12983
  try {
12939
12984
  const data = await db.getRequestStats({
12940
12985
  startDate,
12941
- endDate
12986
+ endDate,
12987
+ configId,
12988
+ variantId,
12989
+ environmentId,
12990
+ tags: parseTags(tags)
12942
12991
  });
12943
12992
  if (!data) return c.json(successResponse({
12944
12993
  totalRequests: 0,
@@ -12958,6 +13007,15 @@ const app$10 = new hono.Hono().get("/requests", zv("query", zod_default.object({
12958
13007
  console.error("Error fetching request stats:", error$45);
12959
13008
  return c.json(internalServerError("Failed to fetch request stats", 500), 500);
12960
13009
  }
13010
+ }).get("/tags", async (c) => {
13011
+ const db = c.get("db");
13012
+ try {
13013
+ const tags = await db.getDistinctTags();
13014
+ return c.json(successResponse(tags, 200));
13015
+ } catch (error$45) {
13016
+ console.error("Error fetching distinct tags:", error$45);
13017
+ return c.json(internalServerError("Failed to fetch tags", 500), 500);
13018
+ }
12961
13019
  });
12962
13020
  var analytics_default = app$10;
12963
13021
 
@@ -13806,6 +13864,9 @@ const createGatewayAdapterMiddleware = () => {
13806
13864
  c.set("variantModel", variantConfig.model || data.modelName);
13807
13865
  c.set("configId", data.configId);
13808
13866
  c.set("variantId", data.variantId);
13867
+ c.set("environmentId", data.environmentId);
13868
+ c.set("environmentId", data.environmentId);
13869
+ c.set("environmentId", data.environmentId);
13809
13870
  await next();
13810
13871
  } catch (error$45) {
13811
13872
  console.error("Gateway adapter error:", error$45);
@@ -14189,6 +14250,8 @@ function createCostTrackingMiddleware(config$1 = {}) {
14189
14250
  if (llmopsConfigHeader) try {
14190
14251
  provider = JSON.parse(llmopsConfigHeader).provider || provider;
14191
14252
  } catch {}
14253
+ let customTags = {};
14254
+ if (body.metadata && typeof body.metadata === "object") customTags = Object.fromEntries(Object.entries(body.metadata).filter(([k, v]) => typeof k === "string" && typeof v === "string"));
14192
14255
  if (!variantModel) {
14193
14256
  log(`Skipping request tracking - no model info`);
14194
14257
  return;
@@ -14208,6 +14271,7 @@ function createCostTrackingMiddleware(config$1 = {}) {
14208
14271
  model: variantModel,
14209
14272
  configId: c.get("configId"),
14210
14273
  variantId: c.get("variantId"),
14274
+ environmentId: c.get("environmentId"),
14211
14275
  endpoint: context.endpoint,
14212
14276
  statusCode,
14213
14277
  latencyMs,
@@ -14218,6 +14282,7 @@ function createCostTrackingMiddleware(config$1 = {}) {
14218
14282
  totalTokens: usage.totalTokens,
14219
14283
  cachedTokens: usage.cachedTokens
14220
14284
  } : null,
14285
+ tags: customTags,
14221
14286
  batchWriter,
14222
14287
  trackErrors,
14223
14288
  log
@@ -14244,11 +14309,13 @@ function createCostTrackingMiddleware(config$1 = {}) {
14244
14309
  model: variantModel,
14245
14310
  configId: c.get("configId"),
14246
14311
  variantId: c.get("variantId"),
14312
+ environmentId: c.get("environmentId"),
14247
14313
  endpoint: context.endpoint,
14248
14314
  statusCode,
14249
14315
  latencyMs,
14250
14316
  isStreaming: false,
14251
14317
  usage,
14318
+ tags: customTags,
14252
14319
  batchWriter,
14253
14320
  trackErrors,
14254
14321
  log
@@ -14260,7 +14327,7 @@ function createCostTrackingMiddleware(config$1 = {}) {
14260
14327
  * Process usage data and log to batch writer
14261
14328
  */
14262
14329
  async function processUsageAndLog(params) {
14263
- const { requestId, provider, model, configId, variantId, endpoint, statusCode, latencyMs, isStreaming, usage, batchWriter, trackErrors, log } = params;
14330
+ const { requestId, provider, model, configId, variantId, environmentId, endpoint, statusCode, latencyMs, isStreaming, usage, tags = {}, batchWriter, trackErrors, log } = params;
14264
14331
  if (!trackErrors && statusCode >= 400) {
14265
14332
  log(`Skipping error response (${statusCode})`);
14266
14333
  return;
@@ -14287,6 +14354,7 @@ async function processUsageAndLog(params) {
14287
14354
  requestId,
14288
14355
  configId: configId || null,
14289
14356
  variantId: variantId || null,
14357
+ environmentId: environmentId || null,
14290
14358
  provider,
14291
14359
  model,
14292
14360
  promptTokens: usage?.promptTokens || 0,
@@ -14300,7 +14368,7 @@ async function processUsageAndLog(params) {
14300
14368
  statusCode,
14301
14369
  latencyMs,
14302
14370
  isStreaming,
14303
- tags: {}
14371
+ tags
14304
14372
  };
14305
14373
  batchWriter.enqueue(requestData);
14306
14374
  log(`Enqueued request ${requestId} for logging`);
package/dist/index.mjs CHANGED
@@ -37,7 +37,7 @@ var __export = (all, symbols) => {
37
37
 
38
38
  //#endregion
39
39
  //#region src/client/index.tsx?url
40
- var client_default = "/assets/index-BCY9aD4r.js";
40
+ var client_default = "/assets/index-FrTQ7TcS.js";
41
41
 
42
42
  //#endregion
43
43
  //#region src/client/styles/styles.css?url
@@ -12767,28 +12767,65 @@ const dateRangeSchema = zod_default.object({
12767
12767
  endDate: isoDateString.transform(parseEndDate)
12768
12768
  });
12769
12769
  /**
12770
+ * Date range query schema with optional filters
12771
+ */
12772
+ const dateRangeWithFiltersSchema = dateRangeSchema.extend({
12773
+ configId: zod_default.string().uuid().optional(),
12774
+ variantId: zod_default.string().uuid().optional(),
12775
+ environmentId: zod_default.string().uuid().optional(),
12776
+ tags: zod_default.string().optional()
12777
+ });
12778
+ /**
12779
+ * Parse tags JSON string to Record<string, string[]>
12780
+ */
12781
+ function parseTags(tagsJson) {
12782
+ if (!tagsJson) return void 0;
12783
+ try {
12784
+ return JSON.parse(tagsJson);
12785
+ } catch {
12786
+ return;
12787
+ }
12788
+ }
12789
+ /**
12770
12790
  * Analytics API routes for cost and usage tracking
12771
12791
  */
12772
12792
  const app$10 = new Hono().get("/requests", zv("query", zod_default.object({
12773
12793
  limit: zod_default.string().transform(Number).optional(),
12774
12794
  offset: zod_default.string().transform(Number).optional(),
12775
12795
  configId: zod_default.string().uuid().optional(),
12796
+ variantId: zod_default.string().uuid().optional(),
12797
+ environmentId: zod_default.string().uuid().optional(),
12776
12798
  provider: zod_default.string().optional(),
12777
12799
  model: zod_default.string().optional(),
12778
12800
  startDate: isoDateString.optional(),
12779
- endDate: isoDateString.optional()
12801
+ endDate: isoDateString.optional(),
12802
+ tags: zod_default.string().optional()
12780
12803
  })), async (c) => {
12781
12804
  const db = c.get("db");
12782
12805
  const query = c.req.valid("query");
12806
+ console.log("[Analytics] Request filters:", {
12807
+ configId: query.configId,
12808
+ variantId: query.variantId,
12809
+ environmentId: query.environmentId,
12810
+ startDate: query.startDate,
12811
+ endDate: query.endDate
12812
+ });
12813
+ let parsedTags;
12814
+ if (query.tags) try {
12815
+ parsedTags = JSON.parse(query.tags);
12816
+ } catch {}
12783
12817
  try {
12784
12818
  const requests = await db.listRequests({
12785
12819
  limit: query.limit,
12786
12820
  offset: query.offset,
12787
12821
  configId: query.configId,
12822
+ variantId: query.variantId,
12823
+ environmentId: query.environmentId,
12788
12824
  provider: query.provider,
12789
12825
  model: query.model,
12790
12826
  startDate: query.startDate ? parseStartDate(query.startDate) : void 0,
12791
- endDate: query.endDate ? parseEndDate(query.endDate) : void 0
12827
+ endDate: query.endDate ? parseEndDate(query.endDate) : void 0,
12828
+ tags: parsedTags
12792
12829
  });
12793
12830
  return c.json(successResponse(requests, 200));
12794
12831
  } catch (error$45) {
@@ -12806,13 +12843,17 @@ const app$10 = new Hono().get("/requests", zv("query", zod_default.object({
12806
12843
  console.error("Error fetching request:", error$45);
12807
12844
  return c.json(internalServerError("Failed to fetch request", 500), 500);
12808
12845
  }
12809
- }).get("/costs/total", zv("query", dateRangeSchema), async (c) => {
12846
+ }).get("/costs/total", zv("query", dateRangeWithFiltersSchema), async (c) => {
12810
12847
  const db = c.get("db");
12811
- const { startDate, endDate } = c.req.valid("query");
12848
+ const { startDate, endDate, configId, variantId, environmentId, tags } = c.req.valid("query");
12812
12849
  try {
12813
12850
  const data = await db.getTotalCost({
12814
12851
  startDate,
12815
- endDate
12852
+ endDate,
12853
+ configId,
12854
+ variantId,
12855
+ environmentId,
12856
+ tags: parseTags(tags)
12816
12857
  });
12817
12858
  if (!data) return c.json(successResponse({
12818
12859
  totalCost: 0,
@@ -12886,7 +12927,7 @@ const app$10 = new Hono().get("/requests", zv("query", zod_default.object({
12886
12927
  console.error("Error fetching daily costs:", error$45);
12887
12928
  return c.json(internalServerError("Failed to fetch daily costs", 500), 500);
12888
12929
  }
12889
- }).get("/costs/summary", zv("query", dateRangeSchema.extend({ groupBy: zod_default.enum([
12930
+ }).get("/costs/summary", zv("query", dateRangeWithFiltersSchema.extend({ groupBy: zod_default.enum([
12890
12931
  "day",
12891
12932
  "hour",
12892
12933
  "model",
@@ -12894,25 +12935,33 @@ const app$10 = new Hono().get("/requests", zv("query", zod_default.object({
12894
12935
  "config"
12895
12936
  ]).optional() })), async (c) => {
12896
12937
  const db = c.get("db");
12897
- const { startDate, endDate, groupBy } = c.req.valid("query");
12938
+ const { startDate, endDate, groupBy, configId, variantId, environmentId, tags } = c.req.valid("query");
12898
12939
  try {
12899
12940
  const data = await db.getCostSummary({
12900
12941
  startDate,
12901
12942
  endDate,
12902
- groupBy
12943
+ groupBy,
12944
+ configId,
12945
+ variantId,
12946
+ environmentId,
12947
+ tags: parseTags(tags)
12903
12948
  });
12904
12949
  return c.json(successResponse(data, 200));
12905
12950
  } catch (error$45) {
12906
12951
  console.error("Error fetching cost summary:", error$45);
12907
12952
  return c.json(internalServerError("Failed to fetch cost summary", 500), 500);
12908
12953
  }
12909
- }).get("/stats", zv("query", dateRangeSchema), async (c) => {
12954
+ }).get("/stats", zv("query", dateRangeWithFiltersSchema), async (c) => {
12910
12955
  const db = c.get("db");
12911
- const { startDate, endDate } = c.req.valid("query");
12956
+ const { startDate, endDate, configId, variantId, environmentId, tags } = c.req.valid("query");
12912
12957
  try {
12913
12958
  const data = await db.getRequestStats({
12914
12959
  startDate,
12915
- endDate
12960
+ endDate,
12961
+ configId,
12962
+ variantId,
12963
+ environmentId,
12964
+ tags: parseTags(tags)
12916
12965
  });
12917
12966
  if (!data) return c.json(successResponse({
12918
12967
  totalRequests: 0,
@@ -12932,6 +12981,15 @@ const app$10 = new Hono().get("/requests", zv("query", zod_default.object({
12932
12981
  console.error("Error fetching request stats:", error$45);
12933
12982
  return c.json(internalServerError("Failed to fetch request stats", 500), 500);
12934
12983
  }
12984
+ }).get("/tags", async (c) => {
12985
+ const db = c.get("db");
12986
+ try {
12987
+ const tags = await db.getDistinctTags();
12988
+ return c.json(successResponse(tags, 200));
12989
+ } catch (error$45) {
12990
+ console.error("Error fetching distinct tags:", error$45);
12991
+ return c.json(internalServerError("Failed to fetch tags", 500), 500);
12992
+ }
12935
12993
  });
12936
12994
  var analytics_default = app$10;
12937
12995
 
@@ -13780,6 +13838,9 @@ const createGatewayAdapterMiddleware = () => {
13780
13838
  c.set("variantModel", variantConfig.model || data.modelName);
13781
13839
  c.set("configId", data.configId);
13782
13840
  c.set("variantId", data.variantId);
13841
+ c.set("environmentId", data.environmentId);
13842
+ c.set("environmentId", data.environmentId);
13843
+ c.set("environmentId", data.environmentId);
13783
13844
  await next();
13784
13845
  } catch (error$45) {
13785
13846
  console.error("Gateway adapter error:", error$45);
@@ -14163,6 +14224,8 @@ function createCostTrackingMiddleware(config$1 = {}) {
14163
14224
  if (llmopsConfigHeader) try {
14164
14225
  provider = JSON.parse(llmopsConfigHeader).provider || provider;
14165
14226
  } catch {}
14227
+ let customTags = {};
14228
+ if (body.metadata && typeof body.metadata === "object") customTags = Object.fromEntries(Object.entries(body.metadata).filter(([k, v]) => typeof k === "string" && typeof v === "string"));
14166
14229
  if (!variantModel) {
14167
14230
  log(`Skipping request tracking - no model info`);
14168
14231
  return;
@@ -14182,6 +14245,7 @@ function createCostTrackingMiddleware(config$1 = {}) {
14182
14245
  model: variantModel,
14183
14246
  configId: c.get("configId"),
14184
14247
  variantId: c.get("variantId"),
14248
+ environmentId: c.get("environmentId"),
14185
14249
  endpoint: context.endpoint,
14186
14250
  statusCode,
14187
14251
  latencyMs,
@@ -14192,6 +14256,7 @@ function createCostTrackingMiddleware(config$1 = {}) {
14192
14256
  totalTokens: usage.totalTokens,
14193
14257
  cachedTokens: usage.cachedTokens
14194
14258
  } : null,
14259
+ tags: customTags,
14195
14260
  batchWriter,
14196
14261
  trackErrors,
14197
14262
  log
@@ -14218,11 +14283,13 @@ function createCostTrackingMiddleware(config$1 = {}) {
14218
14283
  model: variantModel,
14219
14284
  configId: c.get("configId"),
14220
14285
  variantId: c.get("variantId"),
14286
+ environmentId: c.get("environmentId"),
14221
14287
  endpoint: context.endpoint,
14222
14288
  statusCode,
14223
14289
  latencyMs,
14224
14290
  isStreaming: false,
14225
14291
  usage,
14292
+ tags: customTags,
14226
14293
  batchWriter,
14227
14294
  trackErrors,
14228
14295
  log
@@ -14234,7 +14301,7 @@ function createCostTrackingMiddleware(config$1 = {}) {
14234
14301
  * Process usage data and log to batch writer
14235
14302
  */
14236
14303
  async function processUsageAndLog(params) {
14237
- const { requestId, provider, model, configId, variantId, endpoint, statusCode, latencyMs, isStreaming, usage, batchWriter, trackErrors, log } = params;
14304
+ const { requestId, provider, model, configId, variantId, environmentId, endpoint, statusCode, latencyMs, isStreaming, usage, tags = {}, batchWriter, trackErrors, log } = params;
14238
14305
  if (!trackErrors && statusCode >= 400) {
14239
14306
  log(`Skipping error response (${statusCode})`);
14240
14307
  return;
@@ -14261,6 +14328,7 @@ async function processUsageAndLog(params) {
14261
14328
  requestId,
14262
14329
  configId: configId || null,
14263
14330
  variantId: variantId || null,
14331
+ environmentId: environmentId || null,
14264
14332
  provider,
14265
14333
  model,
14266
14334
  promptTokens: usage?.promptTokens || 0,
@@ -14274,7 +14342,7 @@ async function processUsageAndLog(params) {
14274
14342
  statusCode,
14275
14343
  latencyMs,
14276
14344
  isStreaming,
14277
- tags: {}
14345
+ tags
14278
14346
  };
14279
14347
  batchWriter.enqueue(requestData);
14280
14348
  log(`Enqueued request ${requestId} for logging`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llmops/app",
3
- "version": "0.1.5",
3
+ "version": "0.1.6-beta.1",
4
4
  "description": "LLMOps application with server and client",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -64,8 +64,9 @@
64
64
  "motion": "^12.23.25",
65
65
  "react-aria-components": "^1.13.0",
66
66
  "react-hook-form": "^7.68.0",
67
- "@llmops/core": "^0.1.5",
68
- "@llmops/gateway": "^0.1.5"
67
+ "recharts": "^3.6.0",
68
+ "@llmops/core": "^0.1.6-beta.1",
69
+ "@llmops/gateway": "^0.1.6-beta.1"
69
70
  },
70
71
  "peerDependencies": {
71
72
  "react": "^19.2.1",
@@ -1 +0,0 @@
1
- import{a as Q,a0 as X,j as i,d as Y,r as D,I as Z}from"./index-BCY9aD4r.js";import{B as ee}from"./button-DftzA6-1.js";import{p as te,q as ne,j as G,v as J,k as K,i as M,S as ie,r as se,t as ae}from"./useSetTargeting-D1rPM8vz.js";import{u as re}from"./useEnvironments-CYkrqAdO.js";import{u as oe}from"./useConfigVariants-C8frrCcZ.js";import{u as le}from"./useTargetingRules-DS57orU0.js";import{i as ce,a as de}from"./info-box.css-HIaMvhbC.js";/* empty css */import"./useButton-Ct8hIyjz.js";import"./popupStateMapping-DkOpwBhG.js";import"./getDisabledMountTransitionStyles-CKUvhO4q.js";import"./InternalBackdrop-CXjGP6a9.js";import"./useValueChanged-vz8uKgCk.js";import"./useMutation-VUB-GXkv.js";function Le(){const t=Q.c(17),{id:e,environment:a}=X.useParams(),{data:c,isLoading:j}=re(),{data:o,isLoading:y}=oe(e),{data:L,isLoading:I}=le(e);if(j||y||I){let s;return t[0]===Symbol.for("react.memo_cache_sentinel")?(s=i.jsx("div",{children:"Loading..."}),t[0]=s):s=t[0],s}let n;t[1]!==a||t[2]!==c?(n=c?.find(s=>s.id===a),t[1]=a,t[2]=c,t[3]=n):n=t[3];const S=n;if(!S){let s;return t[4]===Symbol.for("react.memo_cache_sentinel")?(s=i.jsx("div",{children:"Environment not found"}),t[4]=s):s=t[4],s}let r;t[5]!==a||t[6]!==L?(r=L?.find(s=>s.environmentId===a),t[5]=a,t[6]=L,t[7]=r):r=t[7];const R=r;let l;t[8]!==o?(l=o??[],t[8]=o,t[9]=l):l=t[9];const B=R?.configVariantId??null,E=R?.variantVersionId??null;let g;return t[10]!==e||t[11]!==S||t[12]!==a||t[13]!==l||t[14]!==B||t[15]!==E?(g=i.jsx(me,{configId:e,environmentId:a,environment:S,variants:l,initialVariantId:B,initialVariantVersionId:E}),t[10]=e,t[11]=S,t[12]=a,t[13]=l,t[14]=B,t[15]=E,t[16]=g):g=t[16],g}function me(t){const e=Q.c(67),{configId:a,environmentId:c,environment:j,variants:o,initialVariantId:y,initialVariantVersionId:L}=t,I=Y(),v=te(),[n,S]=D.useState(y),[r,R]=D.useState(L??null);let l;if(e[0]!==n||e[1]!==o){let m;e[3]!==n?(m=P=>P.id===n,e[3]=n,e[4]=m):m=e[4],l=o.find(m),e[0]=n,e[1]=o,e[2]=l}else l=e[2];const E=l?.variantId??"",{data:g,isLoading:s}=ne(E);let $,w;e[5]!==y||e[6]!==n?($=()=>{n!==y&&R(null)},w=[n,y],e[5]=y,e[6]=n,e[7]=$,e[8]=w):($=e[7],w=e[8]),D.useEffect($,w);let k;e[9]!==o?(k=o.map(ge),e[9]=o,e[10]=k):k=e[10];const u=k;let p,b,h,x,V,N,d;if(e[11]!==a||e[12]!==j.name||e[13]!==c||e[14]!==s||e[15]!==I||e[16]!==n||e[17]!==r||e[18]!==v||e[19]!==u||e[20]!==o||e[21]!==g){d=g?.map(ve)??[];let m;e[29]!==a||e[30]!==c||e[31]!==I||e[32]!==n||e[33]!==r||e[34]!==v?(m=async()=>{if(!(!n||!r))try{await v.mutateAsync({environmentId:c,configId:a,configVariantId:n,variantVersionId:r}),I({to:"/configs/$id/targeting",params:{id:a}})}catch(f){console.error("Error setting targeting:",f)}},e[29]=a,e[30]=c,e[31]=I,e[32]=n,e[33]=r,e[34]=v,e[35]=m):m=e[35];const P=m;let z;e[36]===Symbol.for("react.memo_cache_sentinel")?(z={justifyContent:"flex-end"},e[36]=z):z=e[36];const W=!n||!r||v.isPending;let F;e[37]===Symbol.for("react.memo_cache_sentinel")?(F=i.jsx(Z,{icon:ie,size:"sm"}),e[37]=F):F=e[37];const A=v.isPending?"Saving...":"Save";e[38]!==P||e[39]!==W||e[40]!==A?(p=i.jsx("div",{className:se,style:z,children:i.jsxs(ee,{variant:"primary",onClick:P,disabled:W,children:[F,A]})}),e[38]=P,e[39]=W,e[40]=A,e[41]=p):p=e[41],b=ae,e[42]!==j.name?(h=i.jsxs("div",{className:ce,children:["The selected variant will be served to all requests in the"," ",i.jsx("span",{className:de,children:j.name})," ","environment"]}),e[42]=j.name,e[43]=h):h=e[43];let H;e[44]===Symbol.for("react.memo_cache_sentinel")?(H=i.jsx("div",{className:J,style:{minWidth:"120px"},children:"Variant"}),e[44]=H):H=e[44];let T;e[45]!==o?(T=f=>{if(!f)return"";const O=o.find(U=>U.id===f);return O?O.name:f},e[45]=o,e[46]=T):T=e[46],e[47]!==n||e[48]!==T||e[49]!==u?(x=i.jsxs("div",{className:G,children:[H,i.jsx("div",{className:K,children:i.jsx(M,{items:u,value:n,onValueChange:S,placeholder:"Select a variant...",itemToString:T})})]}),e[47]=n,e[48]=T,e[49]=u,e[50]=x):x=e[50],e[51]!==u.length?(V=u.length===0&&i.jsx("div",{style:{marginTop:"1rem",opacity:.6},children:"No variants available. Create a variant first to configure targeting."}),e[51]=u.length,e[52]=V):V=e[52],N=n&&i.jsxs("div",{className:G,children:[i.jsx("div",{className:J,style:{minWidth:"120px"},children:"Version"}),i.jsx("div",{className:K,children:s?i.jsx("span",{style:{opacity:.6},children:"Loading versions..."}):d.length===0?i.jsx("span",{style:{opacity:.6},children:"No versions available"}):i.jsx(M,{items:d,value:d.find(f=>f.id===r)??null,onValueChange:f=>R(f?.id??null),placeholder:"Select version...",itemToString:fe})})]}),e[11]=a,e[12]=j.name,e[13]=c,e[14]=s,e[15]=I,e[16]=n,e[17]=r,e[18]=v,e[19]=u,e[20]=o,e[21]=g,e[22]=p,e[23]=b,e[24]=h,e[25]=x,e[26]=V,e[27]=N,e[28]=d}else p=e[22],b=e[23],h=e[24],x=e[25],V=e[26],N=e[27],d=e[28];let C;e[53]!==n||e[54]!==r||e[55]!==d?(C=n&&!r&&d.length>0&&i.jsx("div",{style:{marginTop:"0.5rem",fontSize:"0.75rem",color:"var(--gray9)"},children:"Select a version to deploy to this environment."}),e[53]=n,e[54]=r,e[55]=d,e[56]=C):C=e[56];let _;e[57]!==C||e[58]!==b||e[59]!==h||e[60]!==x||e[61]!==V||e[62]!==N?(_=i.jsxs("div",{className:b,children:[h,x,V,N,C]}),e[57]=C,e[58]=b,e[59]=h,e[60]=x,e[61]=V,e[62]=N,e[63]=_):_=e[63];let q;return e[64]!==p||e[65]!==_?(q=i.jsxs("div",{children:[p,_]}),e[64]=p,e[65]=_,e[66]=q):q=e[66],q}function fe(t){return t?.label??""}function ve(t){return{id:t.id,label:`Version ${t.version}`,version:t.version}}function ge(t){return t.id}export{Le as component};
@@ -1 +0,0 @@
1
- import{l as ue,a as le,j as t,L as ae,I as U,C as ve,D as ke,p as ye,q as fe,d as ge,r as se,u as xe,b as Se,e as je,O as we}from"./index-BCY9aD4r.js";import{w as De,b as Ne,C as Ce,c as Te,B as Pe,h as Le,H as Ie,a as Oe,g as Re}from"./area.css-DTnbbu5M.js";import{B as Ee}from"./button-DftzA6-1.js";import{P as Be,a as $e,b as Me}from"./popover-CSR0ctop.js";import{C as Ae}from"./chevron-down-BjDiaa62.js";import{C as qe}from"./chevron-right-Dz77YeP_.js";/* empty css */import"./useButton-Ct8hIyjz.js";import"./InternalBackdrop-CXjGP6a9.js";import"./popupStateMapping-DkOpwBhG.js";import"./useSyncedFloatingRootContext-BzuhbdSw.js";import"./useRole-DP91D1OX.js";import"./usePopupAutoResize-ddPHogUJ.js";import"./getDisabledMountTransitionStyles-CKUvhO4q.js";const ze=[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]],Fe=ue("calendar",ze);const He=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Ue=ue("refresh-cw",He);var Ge="_5mtmrw0",We="_5mtmrw2 _5mtmrw1 _1lg22bks0 _1lg22bksi _1lg22bktr _1lg22bk6 _1lg22bkpr",ie="_5mtmrw4 _5mtmrw3 _1lg22bks0 _1lg22bksi _1lg22bkto",ce="_5mtmrw6 _5mtmrw5 _1lg22bkux _1lg22bkw0 _1lg22bkj3 _1lg22bk3",ne="_5mtmrw8 _5mtmrw7 _1lg22bks0 _1lg22bk3 _1lg22bkv0 _1lg22bkj9 _1lg22bkw0",Ye="_5mtmrwa _5mtmrw9 _1lg22bk9";function Je(){const e=le.c(5);let s;e[0]===Symbol.for("react.memo_cache_sentinel")?(s=t.jsx("span",{className:ce,children:"Analytics"}),e[0]=s):s=e[0];let a;e[1]===Symbol.for("react.memo_cache_sentinel")?(a=t.jsxs(ae,{to:"/observability/overview",className:ne,children:[t.jsx(U,{icon:ve}),"Overview"]}),e[1]=a):a=e[1];let l;e[2]===Symbol.for("react.memo_cache_sentinel")?(l=t.jsxs("div",{className:ie,children:[s,a,t.jsxs(ae,{to:"/observability/costs",className:ne,children:[t.jsx(U,{icon:ke}),"Costs"]})]}),e[2]=l):l=e[2];let m;e[3]===Symbol.for("react.memo_cache_sentinel")?(m=t.jsx("span",{className:ce,children:"Logs"}),e[3]=m):m=e[3];let i;return e[4]===Symbol.for("react.memo_cache_sentinel")?(i=t.jsxs("nav",{className:We,children:[l,t.jsxs("div",{className:ie,children:[m,t.jsxs(ae,{to:"/observability/requests",className:ne,children:[t.jsx(U,{icon:ye}),"Requests"]})]})]}),e[4]=i):i=e[4],i}var Ke="_1ey9mxp0",Qe="_1ey9mxp2 _1ey9mxp1 _1lg22bks0 _1lg22bkto _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",me="_1ey9mxp3",Ve="_1ey9mxp4",Xe="_1ey9mxp6 _1ey9mxp5 _1lg22bkuf",Ze="_1ey9mxp8 _1ey9mxp7 _1lg22bk6 _1lg22bkux _1lg22bkw0",et="_1ey9mxp9",tt="_1ey9mxpb _1ey9mxpa _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",at="_1ey9mxpd",st="_1ey9mxpf _1ey9mxpe _1lg22bkux _1lg22bkw0 _1lg22bkj3",lt="_1ey9mxpg",be="_1ey9mxpi _1ey9mxph _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",rt="_1ey9mxpk _1ey9mxpj _1lg22bkv0 _1lg22bkw0 _1lg22bkj3",ot="_1ey9mxpm _1ey9mxpl _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",nt="_1ey9mxpo _1ey9mxpn _1lg22bk3 _1lg22bkuc",it="_1ey9mxpq";const de=[{label:"Last 15 minutes",value:"15m"},{label:"Last 1 hour",value:"1h"},{label:"Last 3 hours",value:"3h"},{label:"Last 6 hours",value:"6h"},{label:"Last 12 hours",value:"12h"},{label:"Last 24 hours",value:"24h"},{label:"Last 2 days",value:"2d"},{label:"Last 7 days",value:"7d"},{label:"Last 30 days",value:"30d"},{label:"Last 90 days",value:"90d"}],he=e=>{const s=new Date;let a=new Date;switch(e){case"15m":a=new Date(s.getTime()-900*1e3);break;case"1h":a=new Date(s.getTime()-3600*1e3);break;case"3h":a=new Date(s.getTime()-10800*1e3);break;case"6h":a=new Date(s.getTime()-360*60*1e3);break;case"12h":a=new Date(s.getTime()-720*60*1e3);break;case"24h":a=new Date(s.getTime()-1440*60*1e3);break;case"2d":a=new Date(s.getTime()-2880*60*1e3);break;case"7d":a=new Date(s.getTime()-10080*60*1e3);break;case"30d":a=new Date(s.getTime()-720*60*60*1e3);break;case"90d":a=new Date(s.getTime()-2160*60*60*1e3);break;default:a=new Date(s.getTime()-10080*60*1e3)}return{from:a.toISOString(),to:s.toISOString()}},_e=e=>e?new Date(e).toISOString().split("T")[0]:"",ct=e=>new Date(e+"T00:00:00").toISOString(),mt=e=>new Date(e+"T23:59:59.999").toISOString();function bt(){const e=le.c(83);let s;e[0]===Symbol.for("react.memo_cache_sentinel")?(s={from:"/(app)/observability"},e[0]=s):s=e[0];const a=fe(s),l=ge(),[m,i]=se.useState(!1);let c;e[1]!==a.from?(c=_e(a.from),e[1]=a.from,e[2]=c):c=e[2];const[o,_]=se.useState(c);let n;e[3]!==a.to?(n=_e(a.to),e[3]=a.to,e[4]=n):n=e[4];const[r,u]=se.useState(n),b=a.range??"7d";let d,f,g,k,y,x,S,j,w,D,N,C,v,T;if(e[5]!==r||e[6]!==o||e[7]!==m||e[8]!==l||e[9]!==a.from||e[10]!==a.to||e[11]!==b){const h=de.find(p=>p.value===b)?.label??"Custom";let Z;e[26]!==l?(Z=p=>{const F=he(p);l({to:".",search:H=>({...H,range:p,from:F.from,to:F.to}),replace:!0}),i(!1)},e[26]=l,e[27]=Z):Z=e[27],k=Z;let ee;e[28]!==r||e[29]!==o||e[30]!==l?(ee=()=>{o&&r&&(l({to:".",search:p=>({...p,range:"custom",from:ct(o),to:mt(r)}),replace:!0}),i(!1))},e[28]=r,e[29]=o,e[30]=l,e[31]=ee):ee=e[31],g=ee;const pe=()=>{if(b!=="custom")return h;const p=a.from,F=a.to;if(!p||!F)return"Custom";const H=new Date(p),oe=new Date(F),te={month:"short",day:"numeric"};return H.getFullYear()!==oe.getFullYear()?`${H.toLocaleDateString("en-US",{...te,year:"numeric"})} - ${oe.toLocaleDateString("en-US",{...te,year:"numeric"})}`:`${H.toLocaleDateString("en-US",te)} - ${oe.toLocaleDateString("en-US",te)}`};S=Ke,f=Be,y=m,x=i,d=$e,T=!0,D="button",N=Qe,C=m?"open":"closed",e[32]===Symbol.for("react.memo_cache_sentinel")?(v=t.jsx(Fe,{size:14,className:me}),e[32]=v):v=e[32],j=Ve,w=pe(),e[5]=r,e[6]=o,e[7]=m,e[8]=l,e[9]=a.from,e[10]=a.to,e[11]=b,e[12]=d,e[13]=f,e[14]=g,e[15]=k,e[16]=y,e[17]=x,e[18]=S,e[19]=j,e[20]=w,e[21]=D,e[22]=N,e[23]=C,e[24]=v,e[25]=T}else d=e[12],f=e[13],g=e[14],k=e[15],y=e[16],x=e[17],S=e[18],j=e[19],w=e[20],D=e[21],N=e[22],C=e[23],v=e[24],T=e[25];let P;e[33]!==j||e[34]!==w?(P=t.jsx("span",{className:j,children:w}),e[33]=j,e[34]=w,e[35]=P):P=e[35];let G;e[36]===Symbol.for("react.memo_cache_sentinel")?(G=t.jsx(Ae,{size:14,className:me}),e[36]=G):G=e[36];let L;e[37]!==P||e[38]!==D||e[39]!==N||e[40]!==C||e[41]!==v?(L=t.jsxs("button",{type:D,className:N,"data-state":C,children:[v,P,G]}),e[37]=P,e[38]=D,e[39]=N,e[40]=C,e[41]=v,e[42]=L):L=e[42];let I;e[43]!==d||e[44]!==L||e[45]!==T?(I=t.jsx(d,{asChild:T,children:L}),e[43]=d,e[44]=L,e[45]=T,e[46]=I):I=e[46];let W;e[47]===Symbol.for("react.memo_cache_sentinel")?(W=t.jsx("div",{className:Ze,children:"Time range"}),e[47]=W):W=e[47];let O;e[48]!==k||e[49]!==b?(O=de.map(h=>t.jsx("button",{type:"button",className:tt,"data-selected":b===h.value,onClick:()=>k(h.value),children:h.label},h.value)),e[48]=k,e[49]=b,e[50]=O):O=e[50];let R;e[51]!==O?(R=t.jsx("div",{className:et,children:O}),e[51]=O,e[52]=R):R=e[52];let Y;e[53]===Symbol.for("react.memo_cache_sentinel")?(Y=t.jsx("span",{className:st,children:"Custom range"}),e[53]=Y):Y=e[53];let J;e[54]===Symbol.for("react.memo_cache_sentinel")?(J=h=>_(h.target.value),e[54]=J):J=e[54];let E;e[55]!==o?(E=t.jsx("input",{type:"date",className:be,value:o,onChange:J}),e[55]=o,e[56]=E):E=e[56];let K;e[57]===Symbol.for("react.memo_cache_sentinel")?(K=t.jsx("span",{className:rt,children:"to"}),e[57]=K):K=e[57];let Q;e[58]===Symbol.for("react.memo_cache_sentinel")?(Q=h=>u(h.target.value),e[58]=Q):Q=e[58];let B;e[59]!==r?(B=t.jsx("input",{type:"date",className:be,value:r,onChange:Q}),e[59]=r,e[60]=B):B=e[60];let $;e[61]!==E||e[62]!==B?($=t.jsxs("div",{className:lt,children:[E,K,B]}),e[61]=E,e[62]=B,e[63]=$):$=e[63];const re=!o||!r;let M;e[64]!==g||e[65]!==re?(M=t.jsx("button",{type:"button",className:ot,onClick:g,disabled:re,children:"Apply"}),e[64]=g,e[65]=re,e[66]=M):M=e[66];let A;e[67]!==$||e[68]!==M?(A=t.jsxs("div",{className:at,children:[Y,$,M]}),e[67]=$,e[68]=M,e[69]=A):A=e[69];let q;e[70]!==R||e[71]!==A?(q=t.jsxs(Me,{align:"end",sideOffset:4,className:Xe,children:[W,R,A]}),e[70]=R,e[71]=A,e[72]=q):q=e[72];let z;e[73]!==f||e[74]!==y||e[75]!==x||e[76]!==I||e[77]!==q?(z=t.jsxs(f,{open:y,onOpenChange:x,children:[I,q]}),e[73]=f,e[74]=y,e[75]=x,e[76]=I,e[77]=q,e[78]=z):z=e[78];let V;e[79]===Symbol.for("react.memo_cache_sentinel")?(V=t.jsx(dt,{}),e[79]=V):V=e[79];let X;return e[80]!==S||e[81]!==z?(X=t.jsxs("div",{className:S,children:[z,V]}),e[80]=S,e[81]=z,e[82]=X):X=e[82],X}function dt(){const e=le.c(9);let s;e[0]===Symbol.for("react.memo_cache_sentinel")?(s={from:"/(app)/observability"},e[0]=s):s=e[0];const a=fe(s),l=ge(),[m,i]=se.useState(!1);let c;e[1]!==l||e[2]!==a.range?(c=()=>{i(!0);const u=a.range??"7d";if(u!=="custom"){const b=he(u);l({to:".",search:d=>({...d,from:b.from,to:b.to}),replace:!0})}setTimeout(()=>i(!1),500)},e[1]=l,e[2]=a.range,e[3]=c):c=e[3];const o=c,_=m?it:void 0;let n;e[4]!==_?(n=t.jsx(Ue,{size:14,className:_}),e[4]=_,e[5]=n):n=e[5];let r;return e[6]!==o||e[7]!==n?(r=t.jsx("button",{type:"button",className:nt,onClick:o,title:"Refresh data",children:n}),e[6]=o,e[7]=n,e[8]=r):r=e[8],r}function Tt(){const e=le.c(19),{toggleSidebar:s}=xe(),a=Se();let l;e[0]!==a?(l=a.filter(ut).map(_t),e[0]=a,e[1]=l):l=e[1];const m=l;let i;e[2]===Symbol.for("react.memo_cache_sentinel")?(i=t.jsx(U,{icon:Ce}),e[2]=i):i=e[2];let c;e[3]!==s?(c=t.jsx(Ee,{onClick:s,size:"icon",variant:"ghost",scheme:"gray",children:i}),e[3]=s,e[4]=c):c=e[4];let o;e[5]===Symbol.for("react.memo_cache_sentinel")?(o=t.jsx(U,{icon:qe,className:Te}),e[5]=o):o=e[5];let _;e[6]!==m?(_=t.jsx(Pe,{items:m}),e[6]=m,e[7]=_):_=e[7];let n;e[8]!==c||e[9]!==_?(n=t.jsxs("div",{className:Le,children:[c,o,_]}),e[8]=c,e[9]=_,e[10]=n):n=e[10];let r;e[11]===Symbol.for("react.memo_cache_sentinel")?(r=t.jsx(bt,{}),e[11]=r):r=e[11];let u;e[12]!==n?(u=t.jsxs(Ie,{className:Oe,children:[n,r]}),e[12]=n,e[13]=u):u=e[13];let b,d;e[14]===Symbol.for("react.memo_cache_sentinel")?(b=je(De,Ge),d=t.jsx(Je,{}),e[14]=b,e[15]=d):(b=e[14],d=e[15]);let f;e[16]===Symbol.for("react.memo_cache_sentinel")?(f=t.jsx("div",{className:Re,children:t.jsxs("div",{className:b,children:[d,t.jsx("div",{className:Ye,children:t.jsx(we,{})})]})}),e[16]=f):f=e[16];let g;return e[17]!==u?(g=t.jsxs(t.Fragment,{children:[u,f]}),e[17]=u,e[18]=g):g=e[18],g}function _t(e){const s=e.loaderData?.title,a=e.staticData.customData?.title,l=s??a;return{key:e.id,label:t.jsx(ae,{to:e.pathname,className:Ne,children:l}),prefix:e.staticData.customData?.icon}}function ut(e){return!!e.staticData.customData?.title||!!e.loaderData?.title}export{Tt as component};
@@ -1 +0,0 @@
1
- import{l as c}from"./index-BCY9aD4r.js";const e=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],t=c("check",e);export{t as C};