@odigos/ui-kit 0.0.239 → 0.0.240

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 (123) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/lib/chunks/helpers-D-6cJlOn.js +19 -0
  3. package/lib/chunks/index-RUJS9Blu.js +147 -0
  4. package/lib/chunks/source-instrument-form-context-CEgbaSRi.js +1 -0
  5. package/lib/chunks/ui-components-B0BVzW_z.js +1570 -0
  6. package/lib/chunks/{vendor-C150cdxb.js → vendor-Be0cOokr.js} +1 -1
  7. package/lib/components/_v2/button/index.d.ts +1 -1
  8. package/lib/components/_v2/condition/index.d.ts +1 -0
  9. package/lib/components/_v2/drop-data/index.d.ts +2 -2
  10. package/lib/components/_v2/input-table/types.d.ts +2 -0
  11. package/lib/components/index.d.ts +0 -22
  12. package/lib/components/v2.js +1 -1
  13. package/lib/components.js +1 -1
  14. package/lib/constants/sources/index.d.ts +5 -5
  15. package/lib/constants/strings/index.d.ts +3 -0
  16. package/lib/constants.js +1 -1
  17. package/lib/containers/_v2/_drawers/add-source-drawer/strings.d.ts +54 -0
  18. package/lib/containers/_v2/_drawers/edit-source-drawer/helpers.d.ts +3 -3
  19. package/lib/containers/_v2/_drawers/edit-source-drawer/index.d.ts +3 -3
  20. package/lib/containers/_v2/_drawers/edit-source-drawer/overview/containers-card/index.d.ts +2 -2
  21. package/lib/containers/_v2/_drawers/edit-source-drawer/overview/health-card.d.ts +2 -2
  22. package/lib/containers/_v2/_drawers/edit-source-drawer/overview/index.d.ts +3 -2
  23. package/lib/containers/_v2/_drawers/edit-source-drawer/overview/main-card.d.ts +2 -2
  24. package/lib/containers/_v2/_drawers/edit-source-drawer/overview/pods-card/index.d.ts +2 -2
  25. package/lib/containers/_v2/_drawers/edit-source-drawer/overview/pods-card/pods-list/helpers.d.ts +5 -2
  26. package/lib/containers/_v2/_drawers/edit-source-drawer/overview/pods-card/pods-list/process-row.d.ts +1 -0
  27. package/lib/containers/_v2/_drawers/edit-source-drawer/overview/statuses-card.d.ts +3 -2
  28. package/lib/containers/_v2/_drawers/edit-source-drawer/peers/index.d.ts +2 -2
  29. package/lib/containers/_v2/_drawers/edit-source-drawer/pods/containers-card/index.d.ts +2 -2
  30. package/lib/containers/_v2/_drawers/edit-source-drawer/pods/containers-card/process-card.d.ts +3 -1
  31. package/lib/containers/_v2/_drawers/edit-source-drawer/pods/index.d.ts +2 -2
  32. package/lib/containers/_v2/_drawers/edit-source-drawer/profiling/index.d.ts +2 -2
  33. package/lib/containers/_v2/overview/columns/column/index.d.ts +2 -2
  34. package/lib/containers/_v2/overview/columns/column/list-item.d.ts +2 -2
  35. package/lib/containers/_v2/overview/columns/column/source-visual-state.d.ts +3 -3
  36. package/lib/containers/_v2/overview/drawers/index.d.ts +1 -1
  37. package/lib/containers/_v2/overview/search/builder.d.ts +4 -4
  38. package/lib/containers/index.d.ts +0 -3
  39. package/lib/containers/service-map/helpers/build-map-nodes.d.ts +2 -2
  40. package/lib/containers/v2.js +162 -122
  41. package/lib/containers.js +19 -49
  42. package/lib/contexts/source-edit-form-context.d.ts +2 -2
  43. package/lib/contexts.js +1 -1
  44. package/lib/functions/filter-sources/index.d.ts +2 -2
  45. package/lib/functions/filter-sources-by-stream/index.d.ts +2 -2
  46. package/lib/functions/get-conditions-booleans/index.d.ts +5 -3
  47. package/lib/functions/get-containers-counts/index.d.ts +2 -2
  48. package/lib/functions/get-containers-icons/index.d.ts +5 -5
  49. package/lib/functions/get-entity-id/index.d.ts +8 -4
  50. package/lib/functions/get-main-container-language/index.d.ts +2 -2
  51. package/lib/functions/get-workload-id/index.d.ts +2 -2
  52. package/lib/functions/is-pod-injected-with-agent/index.d.ts +1 -0
  53. package/lib/functions/map-desired-status-to-condition-status/index.d.ts +1 -1
  54. package/lib/functions.js +1 -1
  55. package/lib/hooks/index.d.ts +0 -1
  56. package/lib/hooks/useActionFormData.d.ts +1 -1
  57. package/lib/hooks/useSourceFormData.d.ts +2 -2
  58. package/lib/hooks/useTimeAgo.d.ts +11 -0
  59. package/lib/hooks.js +1 -1
  60. package/lib/mock-data/index.d.ts +0 -1
  61. package/lib/mock-data/sources/index.d.ts +4 -7
  62. package/lib/snippets/_v2/delete-modal/index.d.ts +3 -0
  63. package/lib/snippets/_v2/dynamic-field/index.d.ts +2 -3
  64. package/lib/snippets/index.d.ts +0 -4
  65. package/lib/snippets/v2.js +1 -1
  66. package/lib/snippets.js +49 -1
  67. package/lib/store/useEntityStore.d.ts +2 -2
  68. package/lib/store/useFilterStore.d.ts +8 -14
  69. package/lib/store/useSelectedStore.d.ts +2 -2
  70. package/lib/store/useSetupStore.d.ts +10 -15
  71. package/lib/store.js +1 -1
  72. package/lib/theme.js +1 -1
  73. package/lib/types/destinations/index.d.ts +3 -3
  74. package/lib/types/namespaces/index.d.ts +3 -3
  75. package/lib/types/sources/index.d.ts +3 -44
  76. package/lib/types/workload/index.d.ts +16 -51
  77. package/lib/types.js +1 -1
  78. package/lib/visuals.js +1 -1
  79. package/package.json +1 -1
  80. package/lib/chunks/index-B5PgIL40.js +0 -3
  81. package/lib/chunks/index-Dy4pkeq6.js +0 -145
  82. package/lib/chunks/index-uXyrp4Xe.js +0 -41
  83. package/lib/chunks/ui-components-BPdnIOmj.js +0 -2248
  84. package/lib/components/badge/index.d.ts +0 -11
  85. package/lib/components/button/index.d.ts +0 -6
  86. package/lib/components/cancel-warning/index.d.ts +0 -10
  87. package/lib/components/checkbox/index.d.ts +0 -15
  88. package/lib/components/condition-details/index.d.ts +0 -10
  89. package/lib/components/data-card/data-card-fields/index.d.ts +0 -23
  90. package/lib/components/data-card/index.d.ts +0 -17
  91. package/lib/components/data-tab/index.d.ts +0 -43
  92. package/lib/components/delete-warning/index.d.ts +0 -13
  93. package/lib/components/describe-row/index.d.ts +0 -13
  94. package/lib/components/drawer/drawer-footer/index.d.ts +0 -16
  95. package/lib/components/drawer/drawer-header/index.d.ts +0 -24
  96. package/lib/components/drawer/index.d.ts +0 -15
  97. package/lib/components/dropdown/index.d.ts +0 -25
  98. package/lib/components/extend-arrow/index.d.ts +0 -8
  99. package/lib/components/field-error/index.d.ts +0 -4
  100. package/lib/components/field-label/index.d.ts +0 -11
  101. package/lib/components/input/index.d.ts +0 -15
  102. package/lib/components/modal/index.d.ts +0 -14
  103. package/lib/components/monitors-icons/index.d.ts +0 -11
  104. package/lib/components/no-data-found/index.d.ts +0 -6
  105. package/lib/components/popup-form/index.d.ts +0 -18
  106. package/lib/components/status/index.d.ts +0 -17
  107. package/lib/components/tab-list/index.d.ts +0 -18
  108. package/lib/components/warning-modal/index.d.ts +0 -24
  109. package/lib/containers/overview-drawer/index.d.ts +0 -27
  110. package/lib/containers/source-drawer/build-card.d.ts +0 -3
  111. package/lib/containers/source-drawer/describe/index.d.ts +0 -13
  112. package/lib/containers/source-drawer/index.d.ts +0 -23
  113. package/lib/containers/source-drawer/libraries/index.d.ts +0 -12
  114. package/lib/containers/source-drawer/odigos-health/index.d.ts +0 -5
  115. package/lib/containers/source-drawer/peers/index.d.ts +0 -12
  116. package/lib/containers/source-form/index.d.ts +0 -8
  117. package/lib/hooks/useSourceSelectionFormData.d.ts +0 -32
  118. package/lib/mock-data/workload/index.d.ts +0 -2
  119. package/lib/snippets/add-button/index.d.ts +0 -9
  120. package/lib/snippets/copy-text/index.d.ts +0 -7
  121. package/lib/snippets/pod-container/index.d.ts +0 -5
  122. package/lib/snippets/source-container/index.d.ts +0 -6
  123. package/lib/snippets/source-container/override-runtime.d.ts +0 -10
package/lib/containers.js CHANGED
@@ -1,14 +1,14 @@
1
- import{jsxs as e,jsx as t,Fragment as i}from"react/jsx-runtime";import n,{useTheme as r}from"styled-components";import{r as a,s as o,I as s,t as l,v as c,w as d,q as u,x as p,y as h,z as m,E as g,F as v,G as y,H as f,J as S,K as b,M as x,O as w,Q as k,R as N,U as C,V as $,W as E,X as T,Y as D,Z as O,_ as P,$ as I,a0 as R,a1 as L,a2 as A,a3 as M,a4 as K,a5 as z,a6 as _,a7 as F,a8 as B,b as G,a9 as V,aa as W,ab as j,ac as Y,ad as q,ae as H,af as U,g as J,ag as X,ah as Q,ai as Z,aj as ee,ak as te,al as ie,am as ne,an as re,ao as ae,ap as oe,P as se,aq as le,ar as ce,as as de,at as ue}from"./chunks/ui-components-BPdnIOmj.js";import{NotificationIcon as pe,TrashIcon as he,EditIcon as me,UserIcon as ge,ImageErrorIcon as ve,ChevronDownIcon as ye,ChevronRightIcon as fe,RefreshIcon as Se,RefreshLeftArrowIcon as be}from"./icons.js";import{forwardRef as xe,useState as we,useRef as ke,useImperativeHandle as Ne,useEffect as Ce,useCallback as $e,Children as Ee,Fragment as Te,useMemo as De}from"react";import{MarkerType as Oe,useNodesState as Pe,useEdgesState as Ie}from"@xyflow/react";import{E as Re}from"./chunks/vendor-C150cdxb.js";import{Y as Le}from"./chunks/index-B5PgIL40.js";import{P as Ae}from"./chunks/index-uXyrp4Xe.js";import"zustand";import"javascript-time-ago";import"react-dom";import"prism-react-renderer";import"react-error-boundary";import"virtua";const Me=n.div`
1
+ import{jsxs as e,jsx as t,Fragment as r}from"react/jsx-runtime";import i,{useTheme as n}from"styled-components";import{d as o,u as a,I as s,a as c,N as d,e as l,F as p,f as g,g as h,C as u,S as m,h as y,i as f,j as v,k as x,D as b,E as w,l as N,m as S,n as k,o as T,p as $,q as K,r as C,s as M}from"./chunks/ui-components-B0BVzW_z.js";import{NotificationIcon as z,TrashIcon as E,UserIcon as I,ImageErrorIcon as R,ChevronDownIcon as G,ChevronRightIcon as _}from"./icons.js";import{useState as D,useRef as V,useCallback as A,useEffect as O}from"react";import{MarkerType as j,useNodesState as q,useEdgesState as B}from"@xyflow/react";import{E as F}from"./chunks/vendor-Be0cOokr.js";import{Flow as L}from"./snippets.js";import"zustand";import"javascript-time-ago";import"prism-react-renderer";import"react-error-boundary";import"react-dom";import"virtua";const P=i.div`
2
2
  position: relative;
3
3
  width: fit-content;
4
- `,Ke=n(v)`
4
+ `,W=i(y)`
5
5
  gap: 12px;
6
6
  padding: 0 12px;
7
- `,ze=n(u)`
7
+ `,H=i(p)`
8
8
  gap: 12px;
9
9
  max-height: 400px;
10
10
  overflow-y: auto;
11
- `,_e=n.div`
11
+ `,U=i.div`
12
12
  position: absolute;
13
13
  bottom: 0;
14
14
  left: 0;
@@ -17,19 +17,19 @@ import{jsxs as e,jsx as t,Fragment as i}from"react/jsx-runtime";import n,{useThe
17
17
  border-radius: 0 0 24px 24px;
18
18
  background: ${({theme:e})=>`linear-gradient(to top, ${e.colors.dropdown_bg}, transparent)`};
19
19
  pointer-events: none;
20
- `,Fe=n(d)`
20
+ `,X=i(l)`
21
21
  background-color: ${({theme:e})=>e.colors.orange_soft};
22
22
  color: ${({theme:e})=>e.text.primary};
23
23
  border-radius: 32px;
24
24
  width: fit-content;
25
25
  padding: 2px 8px;
26
- `,Be=()=>{const i=r(),{notifications:n,markAsSeen:u}=a(),p=n.filter(({hideFromHistory:e})=>!e),h=p.filter(({seen:e})=>!e),m=h.length,{popupRef:g,popupOpen:v,setPopupOpen:y,popupPosition:f,handlePosition:S}=o({defaultClientHeight:420,defaultClientwidth:400,onClickOutside:()=>{m&&h.forEach(({id:e})=>u(e))}});return e(Me,{children:[t(s,{onClick:()=>{S(0,0),y(e=>!e)},tooltip:"Notifications",withPing:!!m,pingColor:i.colors.orange_og,children:t(pe,{size:18})}),e(l,{ref:g,isOpen:v,right:f.left,maxWidth:"400px",header:e(Ke,{children:[t(d,{size:20,children:"Notifications"}),!!m&&e(Fe,{size:12,family:"secondary",children:[m," new"]})]}),children:[t(ze,{children:p.length?p.map(e=>t(qe,{...e,onClick:()=>y(!1)},`notification-${e.id}`)):t(c,{title:"No notifications",subTitle:""})}),t(_e,{})]})]})},Ge=n.div`
26
+ `,J=()=>{const r=n(),{notifications:i,markAsSeen:p}=o(),g=i.filter(({hideFromHistory:e})=>!e),h=g.filter(({seen:e})=>!e),u=h.length,{popupRef:m,popupOpen:y,setPopupOpen:f,popupPosition:v,handlePosition:x}=a({defaultClientHeight:420,defaultClientwidth:400,onClickOutside:()=>{u&&h.forEach(({id:e})=>p(e))}});return e(P,{children:[t(s,{onClick:()=>{x(0,0),f(e=>!e)},tooltip:"Notifications",withPing:!!u,pingColor:r.colors.orange_og,children:t(z,{size:18})}),e(c,{ref:m,isOpen:y,right:v.left,maxWidth:"400px",header:e(W,{children:[t(l,{size:20,children:"Notifications"}),!!u&&e(X,{size:12,family:"secondary",children:[u," new"]})]}),children:[t(H,{children:g.length?g.map(e=>t(re,{...e,onClick:()=>f(!1)},`notification-${e.id}`)):t(d,{title:"No notifications",subTitle:""})}),t(U,{})]})]})},Q=i.div`
27
27
  display: flex;
28
28
  align-items: flex-start;
29
29
  gap: 12px;
30
30
  padding: 16px;
31
31
  border-radius: 16px;
32
- background-color: ${({theme:e})=>e.colors.dropdown_bg_2+y["080"]};
32
+ background-color: ${({theme:e})=>e.colors.dropdown_bg_2+f["080"]};
33
33
  cursor: not-allowed;
34
34
  &.click-enabled {
35
35
  cursor: pointer;
@@ -37,30 +37,30 @@ import{jsxs as e,jsx as t,Fragment as i}from"react/jsx-runtime";import n,{useThe
37
37
  background-color: ${({theme:e})=>e.colors.dropdown_bg_2};
38
38
  }
39
39
  }
40
- `,Ve=n.div`
41
- background-color: ${({$type:e,theme:t})=>t.text[e]+y["015"]};
40
+ `,Y=i.div`
41
+ background-color: ${({$type:e,theme:t})=>t.text[e]+f["015"]};
42
42
  border-radius: 8px;
43
43
  width: 36px;
44
44
  height: 36px;
45
45
  display: flex;
46
46
  align-items: center;
47
47
  justify-content: center;
48
- `,We=n.div`
48
+ `,Z=i.div`
49
49
  width: 290px;
50
- `,je=n.div`
50
+ `,ee=i.div`
51
51
  margin-bottom: 6px;
52
- `,Ye=n.div`
52
+ `,te=i.div`
53
53
  display: flex;
54
54
  align-items: center;
55
55
  gap: 6px;
56
- `,qe=({id:n,seen:a,type:o,title:s,message:l,time:c,crdType:u,target:v,onClick:y})=>{const S=r(),{formatTimeAgo:b}=p(),{onClickNotification:x}=h(),w=!!u&&!!v,k=s?.toLowerCase().includes(m.Delete.toLowerCase())||!1,N=f(o,S);return e(Ge,{className:w?"click-enabled":"",onClick:()=>{w&&(y(),x({id:n,crdType:u,target:v}))},children:[t(Ve,{$type:k?g.Error:o,children:t(k?he:N,{})}),e(We,{children:[t(je,{children:t(d,{size:14,children:l})}),e(Ye,{children:[t(d,{size:10,color:S.text.grey,children:b(c)}),!a&&e(i,{children:[t(d,{size:10,children:"·"}),t(d,{size:10,color:S.colors.orange_soft,children:"new"})]})]})]})]},`notification-${n}`)},He=xe(({children:n,width:a=640,title:o,titleTooltip:s,hideEditTitleFromEdit:l,icons:c,iconSrcs:u,isEdit:p=!1,isFormDirty:h=!1,isLastItem:m=!1,onClose:g,onEdit:v,onSave:y,onDelete:f,onCancel:$,tabs:E,headerActionButtons:T},D)=>{const O=r(),{drawerType:P,setDrawerType:I,setDrawerEntityId:R}=S();b({key:"Enter",active:p},()=>j());const[L,A]=we(!1),[M,K]=we(!1),z=ke(null),_=P===C.Source,F=()=>{A(!1),K(!1)},B=()=>{F(),v&&v(!1),I(null),R(null),g?.()};Ne(D,()=>({closeDrawer:B}));const G=()=>{z.current?.clearTitle(),$&&$(),F()},V=()=>{const e=z.current?.isTitleDirty();h||e?K(!0):G()},W=()=>{A(!0)},j=()=>{y&&y(z.current?.getTitle()||"")},Y=T||[];return v&&!p&&Y.push({"data-id":"drawer-edit",variant:"tertiary",onClick:()=>v(!0),children:e(i,{children:[t(me,{}),t(d,{size:14,family:"secondary",decoration:"underline",children:"Edit"})]})}),f&&!p&&Y.push({"data-id":"drawer-delete",variant:"tertiary",onClick:W,children:e(i,{children:[t(he,{}),t(d,{color:O.text.error,size:14,family:"secondary",decoration:"underline",children:_?x.UNINSTRUMENT:x.DELETE})]})}),e(i,{children:[t(w,{isOpen:!0,onClose:p?V:B,closeOnEscape:!L&&!M,width:"number"==typeof a?`${a+64}px`:a,header:{icons:c,iconSrcs:u,title:o,titleTooltip:s,replaceTitleWith:!l&&p?t(Ue,{ref:z,title:o}):void 0,actionButtons:Y,tabs:E},footer:{isOpen:p,leftButtons:[{"data-id":"drawer-save",variant:"primary",onClick:j,children:x.SAVE},{"data-id":"drawer-cancel",variant:"secondary",onClick:V,children:x.CANCEL}],rightButtons:f?[{"data-id":"drawer-delete",variant:"tertiary",onClick:W,children:e(i,{children:[t(he,{}),t(d,{size:14,color:O.text.error,family:"secondary",decoration:"underline",children:x.DELETE})]})}]:[]},children:n}),t(k,{isOpen:L,noOverlay:!0,name:`${P}${o?` (${o})`:""}`,type:P,isLastItem:m,onApprove:()=>{f&&f(),F()},onDeny:F}),t(N,{isOpen:M,noOverlay:!0,name:"edit mode",onApprove:G,onDeny:F})]})}),Ue=xe(({title:e},i)=>{const[n,r]=we(e);return Ce(()=>{r(e)},[e]),Ne(i,()=>({getTitle:()=>n||e,isTitleDirty:()=>n!==e,clearTitle:()=>r(e)})),t($,{"data-id":"title",value:n,onChange:e=>r(e.target.value)})});Ue.displayName=Ue.name,He.displayName=He.name;const Je=e=>`${C.Source}-${e}-${E.MapItem}`,Xe=(e,t,i)=>{const n=e.isVirtual,r=i?[ge]:n?[D(e)]:t?O(t):[ve],{priorotizedStatus:a}=n?{priorotizedStatus:void 0}:P(t?.conditions||[]);return{id:e.graphKey,title:e.serviceName,icons:r,isVirtual:n,status:a,aggService:e}},Qe=e=>!(!e||"user"!==e.otelServiceName||e.namespace||e.name||e.kind),Ze=({theme:e,nodes:t,aggregatedServiceMap:i})=>{const n=[],r=new Map(t.map(e=>[e.id,e]));for(const t of i){const i=Je(t.graphKey),a=r.get(i);if(!a)continue;const o=a.data?.status===g.Error;for(const a of t.connections){const s=Je(a.targetGraphKey);r.has(s)&&n.push({id:`${i}-to-${s}`,type:"smoothstep",source:i,target:s,data:{sourceGraphKey:t.graphKey,targetGraphKey:a.targetGraphKey},markerEnd:{type:Oe.ArrowClosed},style:{stroke:o?e?.colors.dark_red:e?.colors.border}})}}return n},et=e=>{const t=e.lastIndexOf("|");return-1===t?{graphKey:e,detail:""}:{graphKey:e.substring(0,t),detail:e.substring(t+1)}},tt=new Re,it=`${C.Source}-user-${E.MapItem}`,nt={"elk.algorithm":"layered","elk.direction":"RIGHT","elk.layered.spacing.nodeNodeBetweenLayers":"150","elk.spacing.nodeNode":"120","elk.layered.nodePlacement.strategy":"NETWORK_SIMPLEX","elk.layered.spacing.edgeEdgeBetweenLayers":"30","elk.layered.spacing.edgeNodeBetweenLayers":"40"},rt=n.div`
56
+ `,re=({id:i,seen:o,type:a,title:s,message:c,time:d,crdType:p,target:y,onClick:f})=>{const x=n(),{formatTimeAgo:b}=g(),{onClickNotification:w}=h(),N=!!p&&!!y,S=s?.toLowerCase().includes(u.Delete.toLowerCase())||!1,k=v(a,x);return e(Q,{className:N?"click-enabled":"",onClick:()=>{N&&(f(),w({id:i,crdType:p,target:y}))},children:[t(Y,{$type:S?m.Error:a,children:t(S?E:k,{})}),e(Z,{children:[t(ee,{children:t(l,{size:14,children:c})}),e(te,{children:[t(l,{size:10,color:x.text.grey,children:b(d)}),!o&&e(r,{children:[t(l,{size:10,children:"·"}),t(l,{size:10,color:x.colors.orange_soft,children:"new"})]})]})]})]},`notification-${i}`)},ie=e=>`${w.Source}-${e}-${x.MapItem}`,ne=(e,t,r)=>{const i=e.isVirtual,n=r?[I]:i?[N(e)]:t?S(t):[R],{priorotizedStatus:o}=i?{priorotizedStatus:void 0}:k(t?.conditions||[]);return{id:e.graphKey,title:e.serviceName,icons:n,isVirtual:i,status:o,aggService:e}},oe=e=>!(!e||"user"!==e.serviceName||e.id.namespace||e.id.name||e.id.kind),ae=({theme:e,nodes:t,aggregatedServiceMap:r})=>{const i=[],n=new Map(t.map(e=>[e.id,e]));for(const t of r){const r=ie(t.graphKey),o=n.get(r);if(!o)continue;const a=o.data?.status===m.Error;for(const o of t.connections){const s=ie(o.targetGraphKey);n.has(s)&&i.push({id:`${r}-to-${s}`,type:"smoothstep",source:r,target:s,data:{sourceGraphKey:t.graphKey,targetGraphKey:o.targetGraphKey},markerEnd:{type:j.ArrowClosed},style:{stroke:a?e?.colors.dark_red:e?.colors.border}})}}return i},se=e=>{const t=e.lastIndexOf("|");return-1===t?{graphKey:e,detail:""}:{graphKey:e.substring(0,t),detail:e.substring(t+1)}},ce=new F,de=`${w.Source}-user-${x.MapItem}`,le={"elk.algorithm":"layered","elk.direction":"RIGHT","elk.layered.spacing.nodeNodeBetweenLayers":"150","elk.spacing.nodeNode":"120","elk.layered.nodePlacement.strategy":"NETWORK_SIMPLEX","elk.layered.spacing.edgeEdgeBetweenLayers":"30","elk.layered.spacing.edgeNodeBetweenLayers":"40"},pe=i.div`
57
57
  padding: 8px 0;
58
- `,at=n.div`
58
+ `,ge=i.div`
59
59
  display: flex;
60
60
  gap: 12px;
61
61
  align-items: center;
62
62
  padding: 4px 0 4px 16px;
63
- `,ot=n.button`
63
+ `,he=i.button`
64
64
  display: flex;
65
65
  align-items: center;
66
66
  gap: 4px;
@@ -74,43 +74,13 @@ import{jsxs as e,jsx as t,Fragment as i}from"react/jsx-runtime";import n,{useThe
74
74
  &:hover {
75
75
  text-decoration: underline;
76
76
  }
77
- `,st=n.div`
77
+ `,ue=i.div`
78
78
  padding: 4px 0 8px;
79
- `,lt=({conn:i,onToggle:n,isExpanded:r})=>{const a=i.details.length>0;return t(rt,{children:e(v,{$justifyContent:"space-between",$alignItems:"center",children:[t(d,{size:14,weight:500,children:i.targetServiceName}),a&&e(ot,{onClick:n,children:[t(r?ye:fe,{size:12}),r?"hide attributes":`${i.details.length} attribute${i.details.length>1?"s":""}`]})]})})},ct=({conn:e})=>{const n=r();return t(i,{children:e.details.map(e=>t(at,{children:t(d,{size:12,color:n.text.secondary,style:{flex:1},children:e.value})},e.value))})},dt=({connections:n,isVirtual:a,attributes:o})=>{const[s,l]=we(new Set),c=r();if(a){const n=Object.entries(o||{});return e(i,{children:[t(d,{size:12,color:c.text.info,children:"This service is not instrumented. It was detected from client-side spans of services that communicate with it."}),n.length>0&&e(i,{children:[t(st,{style:{paddingTop:16},children:t(d,{size:11,color:c.text.info,children:"Attributes"})}),n.map(([i,n])=>e(at,{children:[t(d,{size:12,color:c.text.secondary,children:i}),t(d,{size:12,children:n})]},i))]})]})}return n.length?e(i,{children:[t(st,{children:t(d,{size:11,color:c.text.info,children:"Connected services"})}),n.map(i=>e("div",{children:[t(lt,{conn:i,isExpanded:s.has(i.targetGraphKey),onToggle:()=>{return e=i.targetGraphKey,void l(t=>{const i=new Set(t);return i.has(e)?i.delete(e):i.add(e),i});var e}}),s.has(i.targetGraphKey)&&t(ct,{conn:i}),t(R,{})]},i.targetGraphKey))]}):t(d,{size:12,color:c.text.info,children:"No outgoing connections"})},ut=({conn:n})=>{const a=r();return n?t(i,{children:n.details.length>0?e(i,{children:[t(st,{children:t(d,{size:11,color:a.text.info,children:"Attribute breakdown"})}),n.details.map(e=>t(at,{children:t(d,{size:12,style:{flex:1},children:e.value})},e.value))]}):t(d,{size:12,color:a.text.info,style:{padding:"8px 0"},children:"No attribute breakdown"})}):t(d,{size:12,color:a.text.info,children:"No data for this connection"})},pt=({drawerState:e,aggregatedData:i,onClose:n})=>{if(!e)return null;const r=new Map(i.map(e=>[e.graphKey,e]));let a="",o="",s=null;if("node"===e.type){const i=r.get(e.graphKey);a=i?.serviceName||e.graphKey,o=i?.isVirtual?"Virtual service (uninstrumented)":"Outgoing connections",s=t(dt,{connections:i?.connections||[],isVirtual:i?.isVirtual,attributes:i?.attributes})}else{const i=r.get(e.sourceKey),n=i?.connections.find(t=>t.targetGraphKey===e.targetKey);a=`${i?.serviceName||e.sourceKey} → ${n?.targetServiceName||e.targetKey}`,o="Connection details",s=t(ut,{conn:n})}return t(I,{isOpen:!0,width:"420px",position:"right",header:{title:a,subTitle:o,onClose:n},children:s})},ht=n.div`
79
+ `,me=({conn:r,onToggle:i,isExpanded:n})=>{const o=r.details.length>0;return t(pe,{children:e(y,{$justifyContent:"space-between",$alignItems:"center",children:[t(l,{size:14,weight:500,children:r.targetServiceName}),o&&e(he,{onClick:i,children:[t(n?G:_,{size:12}),n?"hide attributes":`${r.details.length} attribute${r.details.length>1?"s":""}`]})]})})},ye=({conn:e})=>{const i=n();return t(r,{children:e.details.map(e=>t(ge,{children:t(l,{size:12,color:i.text.secondary,style:{flex:1},children:e.value})},e.value))})},fe=({connections:i,isVirtual:o,attributes:a})=>{const[s,c]=D(new Set),d=n();if(o){const i=Object.entries(a||{});return e(r,{children:[t(l,{size:12,color:d.text.info,children:"This service is not instrumented. It was detected from client-side spans of services that communicate with it."}),i.length>0&&e(r,{children:[t(ue,{style:{paddingTop:16},children:t(l,{size:11,color:d.text.info,children:"Attributes"})}),i.map(([r,i])=>e(ge,{children:[t(l,{size:12,color:d.text.secondary,children:r}),t(l,{size:12,children:i})]},r))]})]})}return i.length?e(r,{children:[t(ue,{children:t(l,{size:11,color:d.text.info,children:"Connected services"})}),i.map(r=>e("div",{children:[t(me,{conn:r,isExpanded:s.has(r.targetGraphKey),onToggle:()=>{return e=r.targetGraphKey,void c(t=>{const r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r});var e}}),s.has(r.targetGraphKey)&&t(ye,{conn:r}),t($,{})]},r.targetGraphKey))]}):t(l,{size:12,color:d.text.info,children:"No outgoing connections"})},ve=({conn:i})=>{const o=n();return i?t(r,{children:i.details.length>0?e(r,{children:[t(ue,{children:t(l,{size:11,color:o.text.info,children:"Attribute breakdown"})}),i.details.map(e=>t(ge,{children:t(l,{size:12,style:{flex:1},children:e.value})},e.value))]}):t(l,{size:12,color:o.text.info,style:{padding:"8px 0"},children:"No attribute breakdown"})}):t(l,{size:12,color:o.text.info,children:"No data for this connection"})},xe=({drawerState:e,aggregatedData:r,onClose:i})=>{if(!e)return null;const n=new Map(r.map(e=>[e.graphKey,e]));let o="",a="",s=null;if("node"===e.type){const r=n.get(e.graphKey);o=r?.serviceName||e.graphKey,a=r?.isVirtual?"Virtual service (uninstrumented)":"Outgoing connections",s=t(fe,{connections:r?.connections||[],isVirtual:r?.isVirtual,attributes:r?.attributes})}else{const r=n.get(e.sourceKey),i=r?.connections.find(t=>t.targetGraphKey===e.targetKey);o=`${r?.serviceName||e.sourceKey} → ${i?.targetServiceName||e.targetKey}`,a="Connection details",s=t(ve,{conn:i})}return t(T,{isOpen:!0,width:"420px",position:"right",header:{title:o,subTitle:a,onClose:i},children:s})},be=i.div`
80
80
  width: 100%;
81
81
  height: ${({$heightToRemove:e})=>`calc(100vh - ${e}px)`};
82
82
  position: relative;
83
- `,mt={namespace:"",name:"",kind:"",otelServiceName:"user",selected:!0,numberOfInstances:0,dataStreamNames:[],containers:[],conditions:[]},gt=`${C.Source}-`,vt=`-${E.MapItem}`,yt=.15,ft=({heightToRemove:i,serviceMap:n,onRefresh:a})=>{const o=r(),s=L(e=>e.sources),[l,c,d]=Pe([]),[u,p,h]=Ie([]),[m,g]=we(0),[v,y]=we(null),f=ke([]);f.current=l;const S=ke(o);S.current=o;const b=ke([]),x=ke([]),w=$e(()=>g(e=>e+1),[]),{activeNodeId:k,setActiveNodeType:N,setActiveNodeId:$}=A();Ce(()=>{if(!k)return;const e=(t=k).startsWith(gt)&&t.endsWith(vt)?t.slice(gt.length,-vt.length):null;var t;e&&y({type:"node",graphKey:e})},[k]);const D=$e((e,t)=>{const{sourceGraphKey:i,targetGraphKey:n}=t.data||{};i&&n&&(N(null),$(null),y({type:"edge",sourceKey:i,targetKey:n}))},[N,$]),O=$e(()=>{y(null),N(null),$(null)},[N,$]),P=$e((e,t)=>{const i=t.id;p(e=>e.map(e=>e.source===i||e.target===i?{...e,animated:!0,style:{...e.style,strokeWidth:2.5},labelStyle:{...e.labelStyle,opacity:1},labelBgStyle:{...e.labelBgStyle,opacity:1}}:{...e,style:{...e.style,opacity:yt},labelStyle:{...e.labelStyle,opacity:yt},labelBgStyle:{...e.labelBgStyle,opacity:yt}}))},[p]),I=$e(()=>{p(x.current)},[p]);return Ce(()=>{let e=!1;const t=(e=>{const t=new Map,i=new Set,n=(e,i,n=!1)=>{let r=t.get(e);return r||(r={serviceName:i,isVirtual:n,attributes:{},connectionMap:new Map},t.set(e,r)),r},r=(e,t)=>{if(t)for(const{key:i,value:n}of t)i in e||(e[i]=n)};for(const t of e){const{graphKey:e}=et(t.nodeId),a=n(e,t.serviceName);a.isVirtual=!1;for(const e of t.services){const{graphKey:t,detail:o}=et(e?.nodeId??"");e.isVirtual&&(i.add(t),r(n(t,e.serviceName,!0).attributes,e.nodeAttributes));let s=a.connectionMap.get(t);if(s||(s={targetGraphKey:t,targetServiceName:e.serviceName,totalRequests:0,lastDateTime:e.dateTime,details:[]},a.connectionMap.set(t,s)),s.totalRequests+=e.requests,e.dateTime>s.lastDateTime&&(s.lastDateTime=e.dateTime),o){const t=s.details.find(e=>e.value===o);t?(t.requests+=e.requests,e.dateTime>t.dateTime&&(t.dateTime=e.dateTime)):s.details.push({value:o,requests:e.requests,dateTime:e.dateTime})}}}const a=[...t.entries()];for(const[,{connectionMap:e}]of a)for(const[r,a]of e)t.has(r)||n(r,a.targetServiceName,i.has(r));const o=[];for(const[e,{serviceName:i,isVirtual:n,attributes:r,connectionMap:a}]of t){const t=[...a.values()];t.sort((e,t)=>e.targetGraphKey.localeCompare(t.targetGraphKey)),o.push({graphKey:e,serviceName:i,isVirtual:n,connections:t,attributes:r})}return o.sort((e,t)=>e.graphKey.localeCompare(t.graphKey)),o})(n);b.current=t;const i=(({sources:e,aggregatedServiceMap:t})=>{const i=[],n={x:0,y:0};if(t.length&&e.length)for(const r of t){const t=Je(r.graphKey),a=e.find(e=>r.serviceName===e.otelServiceName||r.serviceName===e.name);i.push({id:t,type:E.MapItem,position:n,data:Xe(r,a,Qe(a)),measured:{width:80,height:80}})}else i.push({id:`${C.Source}-${E.NoData}`,type:E.NoData,position:n,data:{subTitle:T.ARE_SERVICES_INSTRUMENTED_AND_PRODUCING_TRAFFIC}});return i})({aggregatedServiceMap:t,sources:[mt].concat(s)});if(1===i.length&&i[0].id===`${C.Source}-${E.NoData}`)return c(i),p([]),void(x.current=[]);const r=new Set(f.current.map(e=>e.id)),a=new Set(i.map(e=>e.id)),o=i.some(e=>!r.has(e.id)),l=f.current.some(e=>!a.has(e.id));if(!(o||l)){const e=new Map(f.current.map(e=>[e.id,e.position]));c(i.map(t=>({...t,position:e.get(t.id)??t.position})));const n=Ze({theme:S.current,nodes:i,aggregatedServiceMap:t});return x.current=n,void p(n)}return(async(e,t,i={})=>{const n={id:"root",layoutOptions:{...nt,...i},children:e.map(e=>({id:e.id,width:80,height:80,...e.id===it?{layoutOptions:{"elk.layered.layering.layerConstraint":"FIRST","elk.alignment":"CENTER"}}:{}})),edges:t.map(e=>({id:e.id,sources:[e.source],targets:[e.target]}))},r=await tt.layout(n),a=new Map;return r.children?.forEach(e=>{a.set(e.id,{x:e.x??0,y:e.y??0})}),{nodes:e.map(e=>({...e,position:a.get(e.id)??e.position})),edges:t}})(i,Ze({theme:S.current,nodes:i,aggregatedServiceMap:t})).then(({nodes:t})=>{if(e)return;c(t);const i=Ze({theme:S.current,nodes:t,aggregatedServiceMap:b.current});x.current=i,p(i),w()}),()=>{e=!0}},[n,s]),Ce(()=>{if(!f.current.length)return;const e=Ze({theme:o,nodes:f.current,aggregatedServiceMap:b.current});x.current=e,p(e)},[o]),e(ht,{$heightToRemove:i,children:[t(M,{nodes:l,edges:u,onNodesChange:d,onEdgesChange:h,onEdgeClick:D,onNodeMouseEnter:P,onNodeMouseLeave:I,onRefresh:a,fitViewTrigger:m,zoomOnScroll:!0}),t(pt,{drawerState:v,aggregatedData:b.current,onClose:O})]})},St=(e,t)=>{const{name:i,kind:n,namespace:r}=e,a=[{title:T.KIND,value:n},{title:T.NAME,value:i,tooltip:"Resource name"}];return t||(a.unshift({title:T.NAMESPACE,value:r}),a.push({type:K.Divider}),a.push({type:K.CopyText,value:`kubectl get ${n} ${i} -n ${r}`.toLowerCase()})),a},bt=n.div`
84
- display: flex;
85
- flex-direction: column;
86
- gap: 24px;
87
- padding: 4px;
88
- `,xt=({formData:e,handleFormChange:i})=>t(bt,{children:t($,{name:"sourceName",title:"Source name",tooltip:"This overrides the default service name that runs in your cluster.",placeholder:"Use a name that overrides the source name",value:e.otelServiceName,onChange:({target:{value:e}})=>i("otelServiceName",e)})}),wt=({workloadOdigosHealthStatus:e})=>{if(!e)return null;const i=B(e?.status),n=z(e?.reasonEnum),r=e?.message;return t(v,{$alignItems:"center",$justifyContent:"center",children:t(_,{status:i,title:n,subtitle:r,withBackground:i!==F.Disabled,withBorder:!0,withIcon:!0,width:"calc(100% - 24px)"})})},kt=({source:i,fetchSourceDescribe:n,onClickRestartPod:r})=>{const[a,o]=we(!1),[s,l]=we(null);return Ce(()=>{i&&n({namespace:i.namespace,name:i.name,kind:i.kind}).then(({data:e})=>{e?.describeSource?l(e.describeSource):o(!0)})},[i.namespace,i.name,i.kind]),s||a?t(u,{$gap:12,children:a?t(G,{$height:"70vh",children:t(c,{subTitle:"Could not fetch describe for this source"})}):s?.pods?.length?s.pods.map(({podName:n,nodeName:a,phase:o,agentInjected:l,runningLatestWorkloadRevision:c,containers:d,manifestYAML:u})=>{const p=o.status!==g.Success||W(d)?g.Error:g.Success,h=[];return h.push(t(j,{value:`kubectl get pod ${n.value} -n ${s?.namespace?.value||i.namespace}`.toLowerCase()},"copy-text")),h.push(t(R,{length:"100%",margin:"0"},"divider-1")),h.push(t(Y,{title:a.name,tooltip:a.explain||"",value:{status:a.status||void 0,text:a.value}},"describe-row-1")),h.push(t(R,{length:"100%",margin:"0"},"divider-2")),h.push(t(Y,{title:o.name,tooltip:o.explain||"",value:{status:o.status||void 0,text:o.value}},"describe-row-2")),h.push(t(R,{length:"100%",margin:"0"},"divider-3")),h.push(t(Y,{title:l.name,tooltip:l.explain||"",value:{status:l.status||void 0,text:l.value}},"describe-row-3")),h.push(t(R,{length:"100%",margin:"0"},"divider-4")),c?.name&&(h.push(t(Y,{title:c.name,tooltip:c.explain||void 0,value:{status:c.status||void 0,text:c.value}},"describe-row-4")),h.push(t(R,{length:"100%",margin:"0"},"divider-5"))),d.forEach(e=>{h.push(t(q,{...e},`pod-container-${e.containerName.value}`))}),u&&(h.push(t(R,{length:"100%",margin:"0"},"divider-6")),h.push(t(Le,{yaml:u},"yaml-section-card"))),t(H,{title:`Pod: ${n.value}`,withExtend:!0,action:({hovered:a})=>e("div",{style:{position:"relative"},children:[t(_,{status:p,title:p,withIcon:!0,withBorder:!0},"status"),a&&t(U,{isOpen:!0,positionRight:"calc(100% + 12px)",actions:r?[{id:J(),label:"Restart",rightIcon:Se,onClick:()=>r(s?.namespace?.value||i.namespace,n.value)}]:[]},"hover-actions")]}),children:Ee.toArray(h)},`pod-${n.value}`)}):t(G,{$height:"70vh",children:t(c,{subTitle:"Check if you have any running pods and try again"})})}):t(G,{$height:"70vh",children:t(V,{})})},Nt=n(v)`
89
- width: 100%;
90
- align-items: center;
91
- justify-content: space-between;
92
- `,Ct=({source:i,fetchSourceLibraries:n})=>{const a=r(),[o,s]=we(!1),[l,p]=we(null);return Ce(()=>{i&&n({namespace:i.namespace,name:i.name,kind:i.kind}).then(({data:e})=>{e?.instrumentationInstanceComponents?p(X(e.instrumentationInstanceComponents).sort((e,t)=>e.name.localeCompare(t.name))):s(!0)})},[i.namespace,i.name,i.kind]),l||o?t(u,{$gap:12,children:o?t(G,{$height:"70vh",children:t(c,{subTitle:"Could not fetch libraries for this source"})}):l?.length?t(H,{title:"Instrumented Libraries",children:l.map(({name:i,healthy:n,message:r,nonIdentifyingAttributes:o},s)=>e(Te,{children:[e(u,{$gap:4,$width:"100%",children:[e(Nt,{$width:"100%",children:[t(d,{size:12,color:a.text.grey,children:i}),e(v,{$gap:4,children:[o.map(({key:e,value:n})=>Z(n)&&ee(n)&&"is_standard_lib"===e?t(_,{status:g.Default,title:"STANDARD",withBorder:!0},`${i}-${e}`):null),"boolean"==typeof n&&t(_,{status:n?g.Success:g.Error,title:n?"HEALTHY":"UNHEALTHY",withBorder:!0})]})]}),r&&t(d,{size:10,color:a.text.error,align:"right",children:r})]}),s!==l.length-1&&t(R,{length:"100%",margin:"0"})]},`library-${i}`))}):e(G,{$height:"70vh",$gap:12,children:[t(c,{title:"No libraries found",subTitle:""}),t(Q,{type:g.Warning,message:"This feature is in early development, and has very limited support"})]})}):t(G,{$height:"70vh",children:t(V,{})})},$t="70vh",Et=(e,t)=>e.serviceName.localeCompare(t.serviceName),Tt=n(d)`
93
- cursor: ${({$clickable:e})=>e?"pointer":"default"};
94
- text-decoration: ${({$clickable:e})=>e?"underline":"none"};
95
- &:hover {
96
- opacity: ${({$clickable:e})=>e?.7:1};
97
- }
98
- `,Dt=n(v)`
99
- justify-content: flex-end;
100
- align-items: center;
101
- gap: 6px;
102
- cursor: pointer;
103
- `,Ot=({items:n,emptyMessage:a,keyPrefix:o,findSource:s,onNavigate:l})=>{const c=r();return n.length?t(i,{children:n.map(({serviceName:i},r)=>{const a=!!s(i);return e(Te,{children:[t(Tt,{size:13,color:a?c.text.secondary:c.text.grey,$clickable:a,onClick:()=>l(i),children:i}),r!==n.length-1&&t(R,{length:"100%",margin:"0"})]},`${o}-${i}`)})}):t(d,{size:13,color:c.text.grey,children:a})},Pt=({source:i,fetchPeerSources:n})=>{const a=r(),{setDrawerType:o,setDrawerEntityId:s}=S(),l=L(e=>e.sources),[p,h]=we(!1),[m,g]=we(!1),[v,y]=we(null),f=i.otelServiceName||i.name,b=$e(()=>{f&&(g(!0),h(!1),n(f).then(({data:e})=>{e?.peerSources?y(e.peerSources):h(!0)}).finally(()=>g(!1)))},[f]);Ce(()=>{b()},[b]);const x=$e(e=>l.find(t=>t.otelServiceName===e||t.name===e),[l]),w=$e(e=>{const t=x(e);t&&(o(C.Source),s({namespace:t.namespace,name:t.name,kind:t.kind}))},[x,o,s]);if(!v&&!p&&m)return t(G,{$height:$t,children:t(V,{})});if(p)return t(G,{$height:$t,children:t(c,{subTitle:"Could not fetch peer sources"})});const k=v?.inbound?[...v.inbound].sort(Et):[],N=v?.outbound?[...v.outbound].sort(Et):[];return e(u,{$gap:12,children:[t(H,{title:"Inbound",titleBadge:k.length,description:`Services that send requests to ${f}`,children:t(Ot,{items:k,emptyMessage:"No inbound connections",keyPrefix:"inbound",findSource:x,onNavigate:w})}),t(H,{title:"Outbound",titleBadge:N.length,description:`Services that ${f} sends requests to`,children:t(Ot,{items:N,emptyMessage:"No outbound connections",keyPrefix:"outbound",findSource:x,onNavigate:w})}),e(Dt,{onClick:b,children:[t(Se,{size:14}),t(d,{size:12,color:a.text.grey,decoration:"underline",children:"Refresh"})]})]})};var It;!function(e){e.Overview="Overview",e.Pods="Pods",e.Libraries="Libraries",e.PeerSources="Peer Sources",e.Profiling="Profiling"}(It||(It={}));const Rt=[oe.Deployment,oe.StatefulSet,oe.DaemonSet,oe.DeploymentConfig,oe.Rollout,oe.StaticPod],Lt=[oe.Deployment,oe.StatefulSet,oe.DaemonSet,oe.DeploymentConfig,oe.Rollout,oe.Pod],At=[se.Python,se.Go],Mt=n.div`
104
- width: 100%;
105
- height: 100%;
106
- max-height: calc(100vh - 220px);
107
- overflow: overlay;
108
- overflow-y: auto;
109
- `,Kt=n.div`
110
- display: flex;
111
- flex-direction: column;
112
- gap: 12px;
113
- `;var zt;!function(e){e.Workload="Workload",e.Pod="Pod"}(zt||(zt={}));const _t=({persistSources:n,updateSource:r,restartWorkloads:a,fetchSourceById:o,fetchSourceDescribe:s,fetchSourceLibraries:l,fetchPeerSources:c,restartPod:u,recoverFromRollback:p,profilingEnabled:h,fetchProfilingSlots:m,enableProfiling:v,fetchSourceProfiling:y})=>{const{isVm:f}=te(),b=L(e=>e.sources),{selectedStreamName:x}=ie(),{drawerType:w,drawerEntityId:k}=S(),N=De(()=>ne(b,x),[b,x]),$=ke(null),E=w===C.Source,[D,O]=we(!1),[P,I]=we(!1),[R,A]=we(It.Overview),[M,K]=we(null),[z,_]=we(!1);Ce(()=>{E&&k&&o(k).then(e=>K(e||null))},[E,k]);const{formData:B,handleFormChange:G,resetFormData:V,loadFormWithDrawerItem:W}=re(),j=De(()=>{if(k)return M&&JSON.stringify(ae(M))===JSON.stringify(ae(k))?M:N?.find(e=>JSON.stringify(ae(e))===JSON.stringify(ae(k)))},[k,N,M]);Ce(()=>{E&&j?W(j):V()},[E,j]);const Y=De(()=>{const e=j?.conditions?.find(({type:e})=>"RuntimeDetection"===e);return{description:e?.message,isLoading:e?.status===F.Loading,containers:j?.containers||[]}},[j]),q=De(()=>!!j?.rollbackOccurred,[j?.rollbackOccurred]),U=De(()=>{const e=[{label:It.Overview,onClick:()=>A(It.Overview),selected:R===It.Overview}];return f||(Rt.includes(j?.kind)&&e.push({label:It.Pods,onClick:()=>A(It.Pods),selected:R===It.Pods}),j?.containers?.some(e=>At.includes(e.overrides?.runtimeInfo?.language??e.runtimeInfo?.language))&&e.push({label:It.Libraries,onClick:()=>A(It.Libraries),selected:R===It.Libraries}),e.push({label:It.PeerSources,onClick:()=>A(It.PeerSources),selected:R===It.PeerSources}),h&&m&&v&&y&&e.push({label:It.Profiling,onClick:()=>A(It.Profiling),selected:R===It.Profiling})),e},[R,j,f,h,m,v,y]),J=Lt.includes(j?.kind),[X,Z]=we({openFor:null,workloadId:void 0,podNamespace:void 0,podName:void 0});if(!j)return null;return e(He,{ref:$,width:z?"95vw":R===It.Profiling?"80vw":void 0,onClose:()=>{A(It.Overview),K(null),_(!1)},title:j.otelServiceName||j.name,titleTooltip:"This attribute is used to identify the name of the service (service.name) that is generating telemetry data.",hideEditTitleFromEdit:!0,icons:ue(j.containers),isEdit:D,isFormDirty:P,onEdit:R===It.Overview?e=>{O("boolean"!=typeof e||e)}:void 0,onSave:async()=>{const e=B.otelServiceName!==j.name?B.otelServiceName:"";G("otelServiceName",e),await r(k,{...B,otelServiceName:e}),K(null),I(!1),O(!1)},onDelete:R===It.Overview?async()=>{const{namespace:e,name:t,kind:i}=j;n({[e]:[{namespace:e,name:t,kind:i||void 0,selected:!1,currentStreamName:x}]}),K(null),I(!1),O(!1),$.current?.closeDrawer()}:void 0,onCancel:()=>{I(!1),O(!1),G("otelServiceName",j.otelServiceName||j.name||"")},isLastItem:1===N.length,tabs:U,headerActionButtons:f?[]:J?[{"data-id":"rollout-restart",variant:"tertiary",onClick:()=>Z({openFor:zt.Workload,workloadId:k}),children:e(i,{children:[t(be,{}),t(d,{size:14,family:"secondary",decoration:"underline",children:"Restart"})]})}]:[],children:[R===It.Overview?D?t(Mt,{children:t(xt,{formData:B,handleFormChange:(...e)=>{I(!0),G(...e),G("currentStreamName",x)}})}):e(Kt,{children:[t(wt,{workloadOdigosHealthStatus:j.workloadOdigosHealthStatus}),q&&t(Q,{type:g.Warning,message:T.ROLLBACK_OCCURRED_MESSAGE,action:{label:T.ROLLBACK_RECOVER,onClick:async()=>{await p(k);const e=await o(k);e&&K(e)}}}),t(le,{conditions:j.conditions||[]}),t(H,{title:T.SOURCE_DETAILS,data:j?St(j,f):[]}),t(H,{title:f?T.DETECTED_PROCESSES:T.DETECTED_CONTAINERS,titleBadge:Y.isLoading?F.Loading:Y.containers.length,description:Y.description||(f?T.DETECTED_PROCESSES_DESCRIPTION:T.DETECTED_CONTAINERS_DESCRIPTION),children:Y.containers.map(e=>t(ce,{...e,callbackRuntimeOverride:e=>r(k,e)},`source-container-${e.containerName}`))}),j.manifestYAML&&t(Le,{title:`${j.kind} YAML`,yaml:j.manifestYAML,defaultOpen:!j.instrumentationConfigYAML}),j.instrumentationConfigYAML&&t(Le,{title:"Instrumentation Config YAML",yaml:j.instrumentationConfigYAML,defaultOpen:!j.manifestYAML})]}):R===It.Pods?t(kt,{source:j,fetchSourceDescribe:s,onClickRestartPod:J?(e,t)=>Z({openFor:zt.Pod,podNamespace:e,podName:t}):void 0}):R===It.Libraries?t(Ct,{source:j,fetchSourceLibraries:l}):R===It.PeerSources?t(Pt,{source:j,fetchPeerSources:c}):R===It.Profiling&&h&&m&&v&&y?t(Ae,{source:j,fetchProfilingSlots:m,enableProfiling:v,fetchSourceProfiling:y,onFlameFullscreenChange:_}):null,t(de,{isOpen:!!X.openFor,title:`Rollout Restart ${X.openFor}`,description:`Are you sure you want to rollout restart this ${X.openFor?.toLowerCase()}?`,approveButton:{text:"Confirm",variant:g.Warning,onClick:()=>{X.openFor===zt.Workload&&X.workloadId?a([X.workloadId]):X.openFor===zt.Pod&&X.podNamespace&&X.podName&&u(X.podNamespace,X.podName),Z({openFor:null})}},denyButton:{text:"Go Back",onClick:()=>{Z({openFor:null})}}})]})},Ft=n.div`
83
+ `,we={id:{namespace:"",name:"",kind:""},serviceName:"user",markedForInstrumentation:{markedForInstrumentation:!0}},Ne=`${w.Source}-`,Se=`-${x.MapItem}`,ke=.15,Te=({heightToRemove:r,serviceMap:i,onRefresh:o})=>{const a=n(),s=K(e=>e.sources),[c,d,l]=q([]),[p,g,h]=B([]),[u,m]=D(0),[y,f]=D(null),v=V([]);v.current=c;const N=V(a);N.current=a;const S=V([]),k=V([]),T=A(()=>m(e=>e+1),[]),{activeNodeId:$,setActiveNodeType:M,setActiveNodeId:z}=C();O(()=>{if(!$)return;const e=(t=$).startsWith(Ne)&&t.endsWith(Se)?t.slice(Ne.length,-Se.length):null;var t;e&&f({type:"node",graphKey:e})},[$]);const E=A((e,t)=>{const{sourceGraphKey:r,targetGraphKey:i}=t.data||{};r&&i&&(M(null),z(null),f({type:"edge",sourceKey:r,targetKey:i}))},[M,z]),I=A(()=>{f(null),M(null),z(null)},[M,z]),R=A((e,t)=>{const r=t.id;g(e=>e.map(e=>e.source===r||e.target===r?{...e,animated:!0,style:{...e.style,strokeWidth:2.5},labelStyle:{...e.labelStyle,opacity:1},labelBgStyle:{...e.labelBgStyle,opacity:1}}:{...e,style:{...e.style,opacity:ke},labelStyle:{...e.labelStyle,opacity:ke},labelBgStyle:{...e.labelBgStyle,opacity:ke}}))},[g]),G=A(()=>{g(k.current)},[g]);return O(()=>{let e=!1;const t=(e=>{const t=new Map,r=new Set,i=(e,r,i=!1)=>{let n=t.get(e);return n||(n={serviceName:r,isVirtual:i,attributes:{},connectionMap:new Map},t.set(e,n)),n},n=(e,t)=>{if(t)for(const{key:r,value:i}of t)r in e||(e[r]=i)};for(const t of e){const{graphKey:e}=se(t.nodeId),o=i(e,t.serviceName);o.isVirtual=!1;for(const e of t.services){const{graphKey:t,detail:a}=se(e?.nodeId??"");e.isVirtual&&(r.add(t),n(i(t,e.serviceName,!0).attributes,e.nodeAttributes));let s=o.connectionMap.get(t);if(s||(s={targetGraphKey:t,targetServiceName:e.serviceName,totalRequests:0,lastDateTime:e.dateTime,details:[]},o.connectionMap.set(t,s)),s.totalRequests+=e.requests,e.dateTime>s.lastDateTime&&(s.lastDateTime=e.dateTime),a){const t=s.details.find(e=>e.value===a);t?(t.requests+=e.requests,e.dateTime>t.dateTime&&(t.dateTime=e.dateTime)):s.details.push({value:a,requests:e.requests,dateTime:e.dateTime})}}}const o=[...t.entries()];for(const[,{connectionMap:e}]of o)for(const[n,o]of e)t.has(n)||i(n,o.targetServiceName,r.has(n));const a=[];for(const[e,{serviceName:r,isVirtual:i,attributes:n,connectionMap:o}]of t){const t=[...o.values()];t.sort((e,t)=>e.targetGraphKey.localeCompare(t.targetGraphKey)),a.push({graphKey:e,serviceName:r,isVirtual:i,connections:t,attributes:n})}return a.sort((e,t)=>e.graphKey.localeCompare(t.graphKey)),a})(i);S.current=t;const r=(({sources:e,aggregatedServiceMap:t})=>{const r=[],i={x:0,y:0};if(t.length&&e.length)for(const n of t){const t=ie(n.graphKey),o=e.find(e=>n.serviceName===e.serviceName||n.serviceName===e.id.name);r.push({id:t,type:x.MapItem,position:i,data:ne(n,o,oe(o)),measured:{width:80,height:80}})}else r.push({id:`${w.Source}-${x.NoData}`,type:x.NoData,position:i,data:{subTitle:b.ARE_SERVICES_INSTRUMENTED_AND_PRODUCING_TRAFFIC}});return r})({aggregatedServiceMap:t,sources:[we].concat(s)});if(1===r.length&&r[0].id===`${w.Source}-${x.NoData}`)return d(r),g([]),void(k.current=[]);const n=new Set(v.current.map(e=>e.id)),o=new Set(r.map(e=>e.id)),a=r.some(e=>!n.has(e.id)),c=v.current.some(e=>!o.has(e.id));if(!(a||c)){const e=new Map(v.current.map(e=>[e.id,e.position]));d(r.map(t=>({...t,position:e.get(t.id)??t.position})));const i=ae({theme:N.current,nodes:r,aggregatedServiceMap:t});return k.current=i,void g(i)}return(async(e,t,r={})=>{const i={id:"root",layoutOptions:{...le,...r},children:e.map(e=>({id:e.id,width:80,height:80,...e.id===de?{layoutOptions:{"elk.layered.layering.layerConstraint":"FIRST","elk.alignment":"CENTER"}}:{}})),edges:t.map(e=>({id:e.id,sources:[e.source],targets:[e.target]}))},n=await ce.layout(i),o=new Map;return n.children?.forEach(e=>{o.set(e.id,{x:e.x??0,y:e.y??0})}),{nodes:e.map(e=>({...e,position:o.get(e.id)??e.position})),edges:t}})(r,ae({theme:N.current,nodes:r,aggregatedServiceMap:t})).then(({nodes:t})=>{if(e)return;d(t);const r=ae({theme:N.current,nodes:t,aggregatedServiceMap:S.current});k.current=r,g(r),T()}),()=>{e=!0}},[i,s]),O(()=>{if(!v.current.length)return;const e=ae({theme:a,nodes:v.current,aggregatedServiceMap:S.current});k.current=e,g(e)},[a]),e(be,{$heightToRemove:r,children:[t(L,{nodes:c,edges:p,onNodesChange:l,onEdgesChange:h,onEdgeClick:E,onNodeMouseEnter:R,onNodeMouseLeave:G,onRefresh:o,fitViewTrigger:u,zoomOnScroll:!0}),t(xe,{drawerState:y,aggregatedData:S.current,onClose:I})]})},$e=i.div`
114
84
  position: fixed;
115
85
  bottom: 12px;
116
86
  left: 12px;
@@ -119,4 +89,4 @@ import{jsxs as e,jsx as t,Fragment as i}from"react/jsx-runtime";import n,{useThe
119
89
  flex-direction: column-reverse;
120
90
  gap: 6px;
121
91
  max-width: 600px;
122
- `,Bt=()=>{const{notifications:e,markAsDismissed:i,markAsSeen:n}=a(),{onClickNotification:r}=h();return t(Ft,{children:e.filter(({dismissed:e})=>!e).map(({id:e,type:a,title:o,message:s,crdType:l,target:c})=>t(Q,{id:e,type:a,title:o,message:s,action:l&&c?{label:"go to details",onClick:()=>r({id:e,crdType:l,target:c},{dismissToast:!0})}:void 0,onClose:()=>(({id:e,asSeen:t})=>{i(e),n(e)})({id:e,asSeen:!0})},`toast-${e}`))})};export{Be as NotificationManager,He as OverviewDrawer,ft as ServiceMap,_t as SourceDrawer,xt as SourceForm,Bt as ToastList};
92
+ `,Ke=()=>{const{notifications:e,markAsDismissed:r,markAsSeen:i}=o(),{onClickNotification:n}=h();return t($e,{children:e.filter(({dismissed:e})=>!e).map(({id:e,type:o,title:a,message:s,crdType:c,target:d})=>t(M,{id:e,type:o,title:a,message:s,action:c&&d?{label:"go to details",onClick:()=>n({id:e,crdType:c,target:d},{dismissToast:!0})}:void 0,onClose:()=>(({id:e,asSeen:t})=>{r(e),i(e)})({id:e,asSeen:!0})},`toast-${e}`))})};export{J as NotificationManager,Te as ServiceMap,Ke as ToastList};
@@ -1,8 +1,8 @@
1
1
  import { type FC, type ReactNode } from 'react';
2
- import { type Source, type SourceFormData } from '@/types';
2
+ import { type SourceFormData, type Workload } from '@/types';
3
3
  import { type GenericFormResult } from '@/hooks/useGenericForm';
4
4
  interface SourceEditFormContextValue {
5
- loadSource: (source: Source) => void;
5
+ loadSource: (source: Workload) => void;
6
6
  genericForm?: GenericFormResult<SourceFormData>;
7
7
  validateFormData: () => {
8
8
  errorMessage?: string;
package/lib/contexts.js CHANGED
@@ -1 +1 @@
1
- export{dL as ActionFormContextProvider,e6 as DataStreamFormContextProvider,dK as DestinationFormContextProvider,gY as OdigosProvider,dM as RuleFormContextProvider,b2 as SamplingRuleFormType,c6 as SamplingRulesFormProvider,e4 as SourceEditFormContextProvider,dJ as SourceInstrumentFormContextProvider,gZ as StorybookProvider,dH as checkVersionSupport,aG as useActionFormContext,a_ as useDataStreamFormContext,aK as useDestinationFormContext,ak as useOdigos,aX as useRuleFormContext,b1 as useSamplingRulesFormContext,b0 as useSourceEditFormContext,bw as useSourceInstrumentFormContext,g_ as useStorybook}from"./chunks/ui-components-BPdnIOmj.js";import"react/jsx-runtime";import"styled-components";import"./icons.js";import"zustand";import"react";import"javascript-time-ago";import"./chunks/vendor-C150cdxb.js";import"@xyflow/react";import"react-dom";import"prism-react-renderer";import"react-error-boundary";import"virtua";
1
+ export{A as ActionFormContextProvider,D as DataStreamFormContextProvider,a as DestinationFormContextProvider,R as RuleFormContextProvider,S as SamplingRuleFormType,b as SamplingRulesFormProvider,c as SourceEditFormContextProvider,d as SourceInstrumentFormContextProvider,u as useActionFormContext,e as useDataStreamFormContext,f as useDestinationFormContext,g as useRuleFormContext,h as useSamplingRulesFormContext,i as useSourceEditFormContext,j as useSourceInstrumentFormContext}from"./chunks/source-instrument-form-context-CEgbaSRi.js";export{O as OdigosProvider,c as checkVersionSupport,u as useOdigos}from"./chunks/helpers-D-6cJlOn.js";import{jsx as r}from"react/jsx-runtime";import{useMemo as o,useContext as t,createContext as s}from"react";import"./chunks/ui-components-B0BVzW_z.js";import"styled-components";import"./icons.js";import"zustand";import"javascript-time-ago";import"./chunks/vendor-Be0cOokr.js";import"prism-react-renderer";import"react-error-boundary";import"react-dom";import"virtua";const m=s({formType:void 0}),n=({children:e,formType:t})=>{const s=o(()=>({formType:t}),[t]);return r(m.Provider,{value:s,children:e})},p=()=>t(m);export{n as StorybookProvider,p as useStorybook};
@@ -1,3 +1,3 @@
1
1
  import type { FiltersState } from '@/store';
2
- import { type Source } from '@/types';
3
- export declare const filterSources: (sources: Source[], filters: FiltersState) => Source[];
2
+ import { type Workload } from '@/types';
3
+ export declare const filterSources: (sources: Workload[], filters: FiltersState) => Workload[];
@@ -1,2 +1,2 @@
1
- import type { Source } from '@/types';
2
- export declare const filterSourcesByStream: (sources: Source[], streamName: string) => Source[];
1
+ import type { Workload } from '@/types';
2
+ export declare const filterSourcesByStream: (sources: Workload[], streamName: string) => Workload[];
@@ -1,5 +1,5 @@
1
- import { StatusType, type Condition } from '@/types';
2
- export declare const getConditionsBooleans: (conditions: Condition[]) => {
1
+ import { StatusType, type Condition, K8sWorkloadConditions } from '@/types';
2
+ interface ConditionsBooleans {
3
3
  errors: Condition[];
4
4
  hasErrors: boolean;
5
5
  warnings: Condition[];
@@ -9,4 +9,6 @@ export declare const getConditionsBooleans: (conditions: Condition[]) => {
9
9
  loadings: Condition[];
10
10
  hasLoadings: boolean;
11
11
  priorotizedStatus: StatusType | undefined;
12
- };
12
+ }
13
+ export declare const getConditionsBooleans: (conditions?: Condition[] | K8sWorkloadConditions | null) => ConditionsBooleans;
14
+ export {};
@@ -1,2 +1,2 @@
1
- import type { Source } from '@/types';
2
- export declare const getContainersInstrumentedCount: (containers: Source["containers"]) => string;
1
+ import type { Workload } from '@/types';
2
+ export declare const getContainersInstrumentedCount: (containers: Workload["containers"]) => string;
@@ -1,6 +1,6 @@
1
- import { ProgrammingLanguages, type Source, type SVG } from '@/types';
2
- export declare const getEffectiveLanguage: (container?: NonNullable<Source["containers"]>[number]) => ProgrammingLanguages;
3
- export declare const getEffectiveRuntimeVersion: (container?: NonNullable<Source["containers"]>[number]) => string | null;
4
- export declare const getContainersIcons: (containers: Source["containers"]) => SVG[];
1
+ import { ProgrammingLanguages, type Workload, type SVG } from '@/types';
2
+ export declare const getEffectiveLanguage: (container?: NonNullable<Workload["containers"]>[number]) => ProgrammingLanguages;
3
+ export declare const getEffectiveRuntimeVersion: (container?: NonNullable<Workload["containers"]>[number]) => string | null;
4
+ export declare const getContainersIcons: (containers: Workload["containers"]) => SVG[];
5
5
  export declare const getDetectedLanguageIcons: (languages: ProgrammingLanguages[] | null | undefined) => SVG[];
6
- export declare const getSourceLanguageIcons: (source: Pick<Source, "detectedLanguages" | "containers">) => SVG[];
6
+ export declare const getSourceLanguageIcons: (source: Pick<Workload, "runtimeInfo" | "containers">) => SVG[];
@@ -1,4 +1,8 @@
1
- import type { AnyObj, WorkloadId } from '@/types';
2
- export declare const getEntityId: (item: AnyObj) => string | WorkloadId | undefined;
3
- export declare const entityIdKey: (id: string | WorkloadId | undefined) => string;
4
- export declare const getEntityIdKey: (item: AnyObj) => string;
1
+ import type { Action, Destination, InstrumentationRule, Metric, Namespace, Workload, WorkloadId } from '@/types';
2
+ type Entity = Namespace | Workload | Destination | Action | InstrumentationRule | (Metric & WorkloadId) | (Metric & {
3
+ id: string;
4
+ });
5
+ export declare const getEntityId: (item: Entity) => string | WorkloadId | undefined;
6
+ export declare const entityIdKey: (id?: string | WorkloadId) => string;
7
+ export declare const getEntityIdKey: (item: Entity) => string;
8
+ export {};
@@ -1,2 +1,2 @@
1
- import { ProgrammingLanguages, type Source } from '@/types';
2
- export declare const getMainContainerLanguage: (source: Source) => ProgrammingLanguages;
1
+ import { ProgrammingLanguages, type Workload } from '@/types';
2
+ export declare const getMainContainerLanguage: (source: Workload) => ProgrammingLanguages;
@@ -1,2 +1,2 @@
1
- import type { WorkloadId } from '@/types';
2
- export declare const getWorkloadId: (id?: WorkloadId) => WorkloadId;
1
+ import type { Workload, WorkloadId } from '@/types';
2
+ export declare const getWorkloadId: (w?: WorkloadId | Workload) => WorkloadId;
@@ -1,3 +1,4 @@
1
1
  import type { K8sWorkloadPod } from '@/types/workload';
2
2
  export declare const EBPF_DOES_NOT_NEED_AGENT_INJECT = "PodManifestInjectionOptional";
3
+ export declare const AGENT_NOT_INJECTED_AS_EXPECTED = "AgentNotInjectedAsExpected";
3
4
  export declare const isPodInjectedWithAgent: (pod: Pick<K8sWorkloadPod, "agentInjected" | "agentInjectedStatus">) => boolean;
@@ -1,2 +1,2 @@
1
1
  import { DesiredStateProgress, OtherStatus, StatusType } from '@/types';
2
- export declare const mapDesiredStatusToConditionStatus: (status: DesiredStateProgress) => StatusType | OtherStatus;
2
+ export declare const mapDesiredStatusToConditionStatus: (status?: DesiredStateProgress | null) => StatusType | OtherStatus;
package/lib/functions.js CHANGED
@@ -1 +1 @@
1
- export{g8 as EBPF_DOES_NOT_NEED_AGENT_INJECT,g9 as capitalizeFirstLetter,ga as cleanObjectEmptyStringsValues,aJ as compareCondition,gb as decimalsOnly,ag as deepClone,d$ as entityIdKey,e3 as filterActions,e2 as filterDestinations,bG as filterDestinationsByStream,e1 as filterSources,am as filterSourcesByStream,gc as flattenObjectKeys,bV as formatBytes,gd as formatDuration,g as generateId,bD as getActionIcon,_ as getConditionsBooleans,at as getContainersIcons,ge as getContainersInstrumentedCount,gf as getDeepValue,bl as getDestinationIcon,gg as getDetectedLanguageIcons,bR as getEffectiveLanguage,c1 as getEffectiveRuntimeVersion,dV as getEntityIcon,bA as getEntityId,dZ as getEntityIdKey,dU as getEntityLabel,gh as getIdFromSseTarget,bK as getInstrumentationRuleIcon,gi as getMainContainerLanguage,gj as getMetricForEntity,gk as getMonitorIcon,gl as getPlatformIcon,gm as getPlatformLabel,aZ as getProgrammingLanguageIcon,gn as getRecursiveValues,Z as getSourceLanguageIcons,go as getSseTargetFromId,gp as getStatusColor,ea as getStatusFromPodStatus,H as getStatusIcon,a8 as getStatusTypeFromOdigosHealth,gq as getValueForRange,Y as getVirtualServiceIcon,ao as getWorkloadId,bH as getYamlFieldsForDestination,aa as hasUnhealthyInstances,aA as isEmpty,gr as isLegalK8sLabel,ck as isOverTime,bL as isPodInjectedWithAgent,ai as isStringABoolean,gs as isTimeElapsed,c0 as isValidVersion,gt as mapConditions,bM as mapDesiredStatusToConditionStatus,bF as mapDestinationFieldsForDisplay,aN as mapExportedSignals,aO as mapSupportedSignals,gu as numbersOnly,aj as parseBooleanFromString,gv as parseJsonStringToPrettyString,aP as prepareDestinationFormData,gw as removeEmptyValuesFromObject,bm as safeJsonParse,gx as safeJsonStringify,gy as setDeepValue,gz as sleep,a5 as splitCamelString,gA as stringifyNonStringValues,gB as trimVersion}from"./chunks/ui-components-BPdnIOmj.js";import"react/jsx-runtime";import"styled-components";import"./icons.js";import"zustand";import"react";import"javascript-time-ago";import"./chunks/vendor-C150cdxb.js";import"@xyflow/react";import"react-dom";import"prism-react-renderer";import"react-error-boundary";import"virtua";
1
+ export{f4 as AGENT_NOT_INJECTED_AS_EXPECTED,f5 as EBPF_DOES_NOT_NEED_AGENT_INJECT,f6 as capitalizeFirstLetter,f7 as cleanObjectEmptyStringsValues,af as compareCondition,f8 as decimalsOnly,w as deepClone,di as entityIdKey,dm as filterActions,dl as filterDestinations,aV as filterDestinationsByStream,dk as filterSources,d6 as filterSourcesByStream,f9 as flattenObjectKeys,bd as formatBytes,fa as formatDuration,bO as generateId,aT as getActionIcon,n as getConditionsBooleans,br as getContainersIcons,fb as getContainersInstrumentedCount,fc as getDeepValue,aG as getDestinationIcon,fd as getDetectedLanguageIcons,b4 as getEffectiveLanguage,bm as getEffectiveRuntimeVersion,dc as getEntityIcon,aO as getEntityId,dg as getEntityIdKey,db as getEntityLabel,fe as getIdFromSseTarget,aZ as getInstrumentationRuleIcon,ff as getMainContainerLanguage,fg as getMetricForEntity,fh as getMonitorIcon,fi as getPlatformIcon,fj as getPlatformLabel,ao as getProgrammingLanguageIcon,fk as getRecursiveValues,m as getSourceLanguageIcons,fl as getSseTargetFromId,fm as getStatusColor,ds as getStatusFromPodStatus,j as getStatusIcon,bf as getStatusTypeFromOdigosHealth,fn as getValueForRange,l as getVirtualServiceIcon,bb as getWorkloadId,aW as getYamlFieldsForDestination,fo as hasUnhealthyInstances,G as isEmpty,J as isLegalK8sLabel,bK as isOverTime,a_ as isPodInjectedWithAgent,fp as isStringABoolean,fq as isTimeElapsed,bl as isValidVersion,fr as mapConditions,a$ as mapDesiredStatusToConditionStatus,aU as mapDestinationFieldsForDisplay,Q as mapExportedSignals,L as mapSupportedSignals,fs as numbersOnly,ft as parseBooleanFromString,fu as parseJsonStringToPrettyString,ah as prepareDestinationFormData,fv as removeEmptyValuesFromObject,O as safeJsonParse,fw as safeJsonStringify,fx as setDeepValue,fy as sleep,aX as splitCamelString,fz as stringifyNonStringValues,t as trimVersion}from"./chunks/ui-components-B0BVzW_z.js";import"react/jsx-runtime";import"styled-components";import"./icons.js";import"zustand";import"react";import"javascript-time-ago";import"./chunks/vendor-Be0cOokr.js";import"prism-react-renderer";import"react-error-boundary";import"react-dom";import"virtua";
@@ -14,5 +14,4 @@ export * from './useScrollTo';
14
14
  export * from './usePopup';
15
15
  export * from './useSessionStorage';
16
16
  export * from './useSourceFormData';
17
- export * from './useSourceSelectionFormData';
18
17
  export * from './useTimeAgo';
@@ -1,7 +1,7 @@
1
1
  import { type Action, type ActionFormData } from '@/types';
2
2
  export declare const useActionFormData: () => {
3
3
  formData: ActionFormData;
4
- formErrors: Partial<Record<"disabled" | "type" | "name" | "notes" | "signals" | "fields", string>>;
4
+ formErrors: Partial<Record<"type" | "disabled" | "name" | "notes" | "signals" | "fields", string>>;
5
5
  handleFormChange: (key?: string | undefined, val?: any, obj?: ActionFormData | undefined) => void;
6
6
  resetFormData: (overrideForm?: ActionFormData | undefined) => void;
7
7
  validateForm: (params?: {
@@ -1,9 +1,9 @@
1
- import { type Source, type SourceFormData } from '@/types';
1
+ import { type Workload, type SourceFormData } from '@/types';
2
2
  export declare const useSourceFormData: () => {
3
3
  formData: SourceFormData;
4
4
  formErrors: Partial<Record<keyof SourceFormData, string>>;
5
5
  handleFormChange: (key?: string | undefined, val?: any, obj?: SourceFormData | undefined) => void;
6
6
  resetFormData: (overrideForm?: SourceFormData | undefined) => void;
7
7
  validateForm: () => boolean;
8
- loadFormWithDrawerItem: ({ otelServiceName, name }: Source) => void;
8
+ loadFormWithDrawerItem: ({ serviceName, id }: Workload) => void;
9
9
  };
@@ -1,4 +1,15 @@
1
1
  export type FormatTimeAgo = (wen: Date | number | string) => string;
2
+ export type DurationStyle = 'long' | 'short';
3
+ export interface FormatDurationAgoOptions {
4
+ /** Max number of units to include in the output. Defaults to 2. */
5
+ units?: number;
6
+ /** "long" => "4 hours 12 minutes", "short" => "4h12m". Defaults to "long". */
7
+ style?: DurationStyle;
8
+ /** Append " ago" suffix (long style only). Defaults to true. */
9
+ suffix?: boolean;
10
+ }
11
+ export type FormatDurationAgo = (wen: Date | number | string, opts?: FormatDurationAgoOptions) => string;
2
12
  export declare const useTimeAgo: () => {
3
13
  formatTimeAgo: FormatTimeAgo;
14
+ formatDurationAgo: FormatDurationAgo;
4
15
  };
package/lib/hooks.js CHANGED
@@ -1 +1 @@
1
- export{gR as IGNORE_OUTSIDE_CLICK_ATTR,gS as useActionFormData,gT as useBodyScroll,dT as useClickNode,y as useClickNotification,e0 as useContainerSize,u as useCopy,gU as useDataStreamFormData,gV as useDestinationFormData,bE as useGenericForm,gW as useInstrumentationRuleFormData,K as useKeyDown,bZ as useOnClickOutside,s as usePopup,eM as useScrollTo,dS as useSessionStorage,an as useSourceFormData,gX as useSourceSelectionFormData,x as useTimeAgo}from"./chunks/ui-components-BPdnIOmj.js";import"react/jsx-runtime";import"styled-components";import"./icons.js";import"zustand";import"react";import"javascript-time-ago";import"./chunks/vendor-C150cdxb.js";import"@xyflow/react";import"react-dom";import"prism-react-renderer";import"react-error-boundary";import"virtua";
1
+ export{fL as IGNORE_OUTSIDE_CLICK_ATTR,fM as useActionFormData,fN as useBodyScroll,da as useClickNode,g as useClickNotification,dj as useContainerSize,be as useCopy,fO as useDataStreamFormData,fP as useDestinationFormData,v as useGenericForm,fQ as useInstrumentationRuleFormData,bJ as useKeyDown,bi as useOnClickOutside,u as usePopup,dP as useScrollTo,d9 as useSessionStorage,fR as useSourceFormData,f as useTimeAgo}from"./chunks/ui-components-B0BVzW_z.js";import"react/jsx-runtime";import"styled-components";import"./icons.js";import"zustand";import"react";import"javascript-time-ago";import"./chunks/vendor-Be0cOokr.js";import"prism-react-renderer";import"react-error-boundary";import"react-dom";import"virtua";
@@ -13,4 +13,3 @@ export * from './snapshot';
13
13
  export * from './sources';
14
14
  export * from './tokens';
15
15
  export * from './traces';
16
- export * from './workload';
@@ -1,7 +1,4 @@
1
- import { type Source } from '@/types';
2
- export declare const MOCK_SOURCES_OTHER: Source[];
3
- export declare const MOCK_SOURCES_GOOGLE: Source[];
4
- export declare const MOCK_SOURCES_ERROR: Source[];
5
- export declare const MOCK_SOURCE_JAEGER: Source;
6
- export declare const MOCK_SOURCES_SIMPLE_DEMO: Source[];
7
- export declare const MOCK_SOURCES: Source[];
1
+ import { type Workload } from '@/types';
2
+ export declare const MOCK_SOURCES_SIMPLE_DEMO: Workload[];
3
+ export declare const MOCK_SOURCES_EDGE_CASES: Workload[];
4
+ export declare const MOCK_SOURCES: Workload[];
@@ -5,5 +5,8 @@ export interface DeleteModalProps extends Pick<WarningModalProps, 'isOpen' | 'on
5
5
  onApprove?: () => void;
6
6
  action?: string;
7
7
  target?: string;
8
+ description?: string;
9
+ overrideApproveButtonLabel?: string;
10
+ overrideDenyButtonLabel?: string;
8
11
  }
9
12
  export declare const DeleteModal: FC<DeleteModalProps>;
@@ -1,7 +1,6 @@
1
1
  import { type FC } from 'react';
2
- import { DropdownProps } from '@/components';
3
2
  import { FieldTypes, InputTypes } from '@/types';
4
- import { type FieldMessageProps, type TimeUnit, type BadgeProps } from '@/components/_v2';
3
+ import { type FieldMessageProps, type TimeUnit, type BadgeProps, DropDataOption } from '@/components/_v2';
5
4
  export interface DynamicFieldProps extends FieldMessageProps {
6
5
  componentType: FieldTypes;
7
6
  inputType?: InputTypes;
@@ -14,7 +13,7 @@ export interface DynamicFieldProps extends FieldMessageProps {
14
13
  disabled?: boolean;
15
14
  value: any;
16
15
  setValue: (value: any) => void;
17
- dropdownOptions?: DropdownProps['options'];
16
+ dropdownOptions?: DropDataOption[];
18
17
  dropdownNoSearch?: boolean;
19
18
  dropdownNoCheckbox?: boolean;
20
19
  timeUnits?: TimeUnit[];
@@ -1,5 +1 @@
1
- export * from './add-button';
2
- export * from './copy-text';
3
- export * from './pod-container';
4
1
  export * from './react-flow';
5
- export * from './source-container';
@@ -1 +1 @@
1
- export{A as ActionType,e9 as Actions,cr as ColoredSpan,fr as ColoredSpanVariant,e8 as RichTitle}from"../chunks/ui-components-BPdnIOmj.js";export{C as CancelModal,j as DURATION_OPTIONS,g as DeleteModal,e as DurationErrorsSection,D as DynamicField,N as NOISY_PERCENTAGE_OPTIONS,h as OdigosLogoTextByTier,O as OperationSection,a as PERCENTAGE_OPTIONS,f as PercentageSection,P as PresetWithCustomInput,R as RuleInfoSection,d as RuleTypeSection,b as SamplingPreviewSection,S as SignalsCheckboxList,c as SourceScopeSection,U as UpgradeModal,i as WIDE_DRAWER_WIDTH,W as WideDrawer}from"../chunks/index-Dy4pkeq6.js";export{Y as YamlSectionCard}from"../chunks/index-B5PgIL40.js";import"react/jsx-runtime";import"styled-components";import"../icons.js";import"zustand";import"react";import"javascript-time-ago";import"../chunks/vendor-C150cdxb.js";import"@xyflow/react";import"react-dom";import"prism-react-renderer";import"react-error-boundary";import"virtua";
1
+ export{b7 as ActionType,dr as Actions,dq as RichTitle}from"../chunks/ui-components-B0BVzW_z.js";export{C as CancelModal,j as DURATION_OPTIONS,g as DeleteModal,e as DurationErrorsSection,D as DynamicField,N as NOISY_PERCENTAGE_OPTIONS,h as OdigosLogoTextByTier,O as OperationSection,a as PERCENTAGE_OPTIONS,f as PercentageSection,P as PresetWithCustomInput,R as RuleInfoSection,d as RuleTypeSection,b as SamplingPreviewSection,S as SignalsCheckboxList,c as SourceScopeSection,U as UpgradeModal,i as WIDE_DRAWER_WIDTH,W as WideDrawer,Y as YamlSectionCard}from"../chunks/index-RUJS9Blu.js";export{C as ColoredSpan,x as ColoredSpanVariant}from"../chunks/helpers-D-6cJlOn.js";import"react/jsx-runtime";import"styled-components";import"../icons.js";import"zustand";import"react";import"javascript-time-ago";import"../chunks/vendor-Be0cOokr.js";import"prism-react-renderer";import"react-error-boundary";import"react-dom";import"virtua";
package/lib/snippets.js CHANGED
@@ -1 +1,49 @@
1
- export{g$ as AddButton,ab as CopyText,a3 as Flow,h0 as MapItemNode,h1 as NoDataNode,ad as PodContainer,ar as SourceContainer}from"./chunks/ui-components-BPdnIOmj.js";import"react/jsx-runtime";import"styled-components";import"./icons.js";import"zustand";import"react";import"javascript-time-ago";import"./chunks/vendor-C150cdxb.js";import"@xyflow/react";import"react-dom";import"prism-react-renderer";import"react-error-boundary";import"virtua";
1
+ import{jsx as e,jsxs as o,Fragment as r}from"react/jsx-runtime";import{memo as t,useRef as i,useEffect as n}from"react";import"./chunks/vendor-Be0cOokr.js";import d,{useTheme as s}from"styled-components";import{N as a,F as l,eF as c,e as p,S as m,j as u,da as h,r as g,k as b}from"./chunks/ui-components-B0BVzW_z.js";import{Handle as x,Position as f,ReactFlowProvider as v,ReactFlow as y,Controls as w,ControlButton as N,useReactFlow as k}from"@xyflow/react";import{RefreshIcon as $}from"./icons.js";import"javascript-time-ago";import"zustand";import"prism-react-renderer";import"react-error-boundary";import"react-dom";import"virtua";const C=d(l)`
2
+ max-width: 300px;
3
+ padding: 12px;
4
+ border-radius: 12px;
5
+ background-color: ${({theme:e})=>e.colors.dropdown_bg};
6
+ justify-content: center;
7
+ `,j=t(({id:o,data:r})=>{const{title:t,subTitle:i}=r;return e(C,{"data-id":o,children:e(a,{title:t,subTitle:i})})});j.displayName=j.name;const E=d.div`
8
+ padding: 6px;
9
+ border-radius: 12px;
10
+ background-color: ${({theme:e})=>e.colors.dropdown_bg};
11
+ cursor: pointer;
12
+ ${({$isVirtual:e,theme:o})=>e&&`\n border: 1px dashed ${o.colors.border};\n opacity: 0.8;\n `}
13
+ `,V=d.div`
14
+ position: relative;
15
+ `,_=d.div`
16
+ position: absolute;
17
+ top: 100%;
18
+ margin-top: 4px;
19
+ left: 50%;
20
+ transform: translateX(-50%);
21
+ display: flex;
22
+ flex-direction: column;
23
+ align-items: center;
24
+ gap: 2px;
25
+ width: 140px;
26
+ text-align: center;
27
+ `,z=t(({id:t,data:i})=>{const{id:n,status:d,title:a,icons:l,isVirtual:h}=i,g=s(),b=h||d!==m.Error?null:u(d,g);return o(r,{children:[e(x,{type:"source",position:f.Right,style:{visibility:"hidden"}}),e(x,{type:"target",position:f.Left,style:{visibility:"hidden"}}),o(V,{"data-id":t,children:[e(E,{$isVirtual:h,children:e(c,{id:n,icons:l,status:h?void 0:d})}),o(_,{children:[b&&e(b,{}),e(p,{size:12,style:{textAlign:"center",wordBreak:"break-word",lineHeight:"1.3"},children:a})]})]})]})});z.displayName=z.name;const M={duration:300,padding:.1,includeHiddenNodes:!0},T=d.div`
28
+ height: 100%;
29
+ .react-flow__attribution {
30
+ visibility: hidden;
31
+ }
32
+ `,A=d.div`
33
+ button {
34
+ padding: 8px;
35
+ margin: 8px;
36
+ border-radius: 8px;
37
+ border: 1px solid ${({theme:e})=>e.colors.border} !important;
38
+ background-color: ${({theme:e})=>e.colors.dropdown_bg};
39
+ path {
40
+ fill: ${({theme:e})=>e.text.secondary};
41
+ }
42
+ &:hover {
43
+ background-color: ${({theme:e})=>e.colors.dropdown_bg_2};
44
+ }
45
+ &:last-child svg {
46
+ transform: scale(1.4);
47
+ }
48
+ }
49
+ `,F={[b.MapItem]:z,[b.NoData]:j},I=({trigger:e})=>{const{fitView:o}=k(),r=i(!0);return n(()=>{r.current?r.current=!1:e>0&&requestAnimationFrame(()=>o(M))},[e,o]),null},L=({nodes:r,edges:t,onNodesChange:i,onEdgesChange:n,fitViewTrigger:d=0,zoomOnScroll:s=!1,onEdgeClick:a,onNodeMouseEnter:l,onNodeMouseLeave:c,onRefresh:p})=>{const{onClickNode:m}=h(),{setActiveNodeType:u,setActiveNodeId:b}=g();return o(y,{zoomOnScroll:s,nodes:r,nodeTypes:F,edges:t,onNodeClick:m,onEdgeClick:a,onNodeMouseEnter:l,onNodeMouseLeave:c,onNodesChange:i,onEdgesChange:n,onBlur:()=>{u(null),b(null)},children:[e(I,{trigger:d}),e(A,{children:e(w,{position:"bottom-right",orientation:"horizontal",showInteractive:!1,showZoom:!0,showFitView:!0,fitViewOptions:M,children:p&&e(N,{onClick:p,children:e($,{size:20})})})})]})},O=o=>e(T,{children:e(v,{children:e(L,{...o})})});export{O as Flow,z as MapItemNode,j as NoDataNode};
@@ -1,9 +1,9 @@
1
- import { type Action, type Destination, EntityTypes, type InstrumentationRule, type Namespace, type Source, type WorkloadId } from '@/types';
1
+ import { type Action, type Destination, EntityTypes, type InstrumentationRule, type Namespace, type WorkloadId, type Workload } from '@/types';
2
2
  interface IEntityState {
3
3
  namespacesLoading: boolean;
4
4
  namespaces: Namespace[];
5
5
  sourcesLoading: boolean;
6
- sources: Source[];
6
+ sources: Workload[];
7
7
  destinationsLoading: boolean;
8
8
  destinations: Destination[];
9
9
  actionsLoading: boolean;
@@ -1,15 +1,13 @@
1
- import type { DropdownProps } from '@/components';
1
+ import type { DropDataOption } from '@/components/_v2';
2
2
  export interface FiltersState {
3
3
  searchText: string;
4
- statuses?: DropdownProps['options'];
5
- platformTypes?: DropdownProps['options'];
6
- namespaces?: DropdownProps['options'];
7
- kinds?: DropdownProps['options'];
8
- monitors?: DropdownProps['options'];
9
- languages?: DropdownProps['options'];
10
- conditions?: DropdownProps['options'];
11
- podsAgentInjectionStatus?: DropdownProps['options'];
12
- errors?: DropdownProps['options'];
4
+ statuses?: DropDataOption[];
5
+ platformTypes?: DropDataOption[];
6
+ namespaces?: DropDataOption[];
7
+ kinds?: DropDataOption[];
8
+ monitors?: DropDataOption[];
9
+ languages?: DropDataOption[];
10
+ podsAgentInjectionStatus?: DropDataOption[];
13
11
  onlyErrors?: boolean;
14
12
  }
15
13
  interface StoreState {
@@ -27,12 +25,8 @@ interface StoreState {
27
25
  setMonitors: (metrics: FiltersState['monitors']) => void;
28
26
  languages: FiltersState['languages'];
29
27
  setLanguages: (metrics: FiltersState['languages']) => void;
30
- conditions: FiltersState['conditions'];
31
- setConditions: (conditions: FiltersState['conditions']) => void;
32
28
  podsAgentInjectionStatus: FiltersState['podsAgentInjectionStatus'];
33
29
  setPodsAgentInjectionStatus: (podsAgentInjectionStatus: FiltersState['podsAgentInjectionStatus']) => void;
34
- errors: FiltersState['errors'];
35
- setErrors: (metrics: FiltersState['errors']) => void;
36
30
  onlyErrors: FiltersState['onlyErrors'];
37
31
  setOnlyErrors: (onlyErrors: FiltersState['onlyErrors']) => void;
38
32
  setAll: (params: Partial<FiltersState>) => void;
@@ -1,7 +1,7 @@
1
- import type { Source } from '@/types';
1
+ import type { Workload } from '@/types';
2
2
  export interface SelectedState {
3
3
  selectedSources: {
4
- [namespace: string]: Source[];
4
+ [namespace: string]: Workload[];
5
5
  };
6
6
  }
7
7
  interface SelectedStateSetters {