agent-relay-server 0.120.2 → 0.120.3
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.
- package/docs/openapi.json +1 -1
- package/package.json +3 -3
- package/public/assets/{MessageBubble-DazQ9Rn-.js → MessageBubble-Cqi3XsZ7.js} +2 -2
- package/public/assets/{MessageBubble-DazQ9Rn-.js.map → MessageBubble-Cqi3XsZ7.js.map} +1 -1
- package/public/assets/{PlanGraphPanel-DpTiGCkz.js → PlanGraphPanel-D6Um05oW.js} +2 -2
- package/public/assets/{PlanGraphPanel-DpTiGCkz.js.map → PlanGraphPanel-D6Um05oW.js.map} +1 -1
- package/public/assets/{activity-DReCE2mK.js → activity-B0LsQHEz.js} +2 -2
- package/public/assets/{activity-DReCE2mK.js.map → activity-B0LsQHEz.js.map} +1 -1
- package/public/assets/{agent-profiles-D3ba8Xpe.js → agent-profiles-O--pe5Ic.js} +2 -2
- package/public/assets/{agent-profiles-D3ba8Xpe.js.map → agent-profiles-O--pe5Ic.js.map} +1 -1
- package/public/assets/{agent-type-icon-BEz393ra.js → agent-type-icon-CeEoMouY.js} +2 -2
- package/public/assets/{agent-type-icon-BEz393ra.js.map → agent-type-icon-CeEoMouY.js.map} +1 -1
- package/public/assets/{agents-BcsIxadm.js → agents-Ii6XlVwR.js} +2 -2
- package/public/assets/{agents-BcsIxadm.js.map → agents-Ii6XlVwR.js.map} +1 -1
- package/public/assets/{analytics-0lOlkaib.js → analytics-BCzdYWRT.js} +2 -2
- package/public/assets/{analytics-0lOlkaib.js.map → analytics-BCzdYWRT.js.map} +1 -1
- package/public/assets/{automation-D66mthBn.js → automation-Crr3Xzui.js} +2 -2
- package/public/assets/{automation-D66mthBn.js.map → automation-Crr3Xzui.js.map} +1 -1
- package/public/assets/{badge-BhUZ1cAb.js → badge-DCIT3Irj.js} +2 -2
- package/public/assets/{badge-BhUZ1cAb.js.map → badge-DCIT3Irj.js.map} +1 -1
- package/public/assets/{branch-state-badge-NH-l2Eh3.js → branch-state-badge-Bhw2rloy.js} +2 -2
- package/public/assets/{branch-state-badge-NH-l2Eh3.js.map → branch-state-badge-Bhw2rloy.js.map} +1 -1
- package/public/assets/{button-C-V4oij1.js → button-CzdTkRIf.js} +2 -2
- package/public/assets/{button-C-V4oij1.js.map → button-CzdTkRIf.js.map} +1 -1
- package/public/assets/{card-Br1JLjTH.js → card-C3BGuVC6.js} +2 -2
- package/public/assets/{card-Br1JLjTH.js.map → card-C3BGuVC6.js.map} +1 -1
- package/public/assets/{channels-BlHLMQVk.js → channels-CKs9rvsn.js} +2 -2
- package/public/assets/{channels-BlHLMQVk.js.map → channels-CKs9rvsn.js.map} +1 -1
- package/public/assets/{chat-rwffRsPX.js → chat-BCwEUj5R.js} +2 -2
- package/public/assets/{chat-rwffRsPX.js.map → chat-BCwEUj5R.js.map} +1 -1
- package/public/assets/{connectors-CdsiaLD3.js → connectors-D_kQR_vw.js} +2 -2
- package/public/assets/{connectors-CdsiaLD3.js.map → connectors-D_kQR_vw.js.map} +1 -1
- package/public/assets/{copy-button-BStzXgtd.js → copy-button-B3o1jpLu.js} +2 -2
- package/public/assets/{copy-button-BStzXgtd.js.map → copy-button-B3o1jpLu.js.map} +1 -1
- package/public/assets/{dist-ChDX_t12.js → dist-B-T7lg0a.js} +2 -2
- package/public/assets/{dist-ChDX_t12.js.map → dist-B-T7lg0a.js.map} +1 -1
- package/public/assets/{dist-DV83j9tm.js → dist-B3e4B9pg.js} +2 -2
- package/public/assets/{dist-DV83j9tm.js.map → dist-B3e4B9pg.js.map} +1 -1
- package/public/assets/{dist-y03IwOrd.js → dist-B6woQ9Tb.js} +2 -2
- package/public/assets/{dist-y03IwOrd.js.map → dist-B6woQ9Tb.js.map} +1 -1
- package/public/assets/{dist-CQ0Z-TDi.js → dist-B9G83DXv.js} +2 -2
- package/public/assets/{dist-CQ0Z-TDi.js.map → dist-B9G83DXv.js.map} +1 -1
- package/public/assets/{dist-Cs8X0P1d.js → dist-BIjlN-xB.js} +2 -2
- package/public/assets/{dist-Cs8X0P1d.js.map → dist-BIjlN-xB.js.map} +1 -1
- package/public/assets/{dist-DyNJNwpi.js → dist-BInckSJC.js} +2 -2
- package/public/assets/{dist-DyNJNwpi.js.map → dist-BInckSJC.js.map} +1 -1
- package/public/assets/{dist-CmFeEXMe.js → dist-BlzVGRhh.js} +2 -2
- package/public/assets/{dist-CmFeEXMe.js.map → dist-BlzVGRhh.js.map} +1 -1
- package/public/assets/{dist-CDZZxxJq.js → dist-C7aTlosb.js} +2 -2
- package/public/assets/{dist-CDZZxxJq.js.map → dist-C7aTlosb.js.map} +1 -1
- package/public/assets/{dist-D2jvo5oA.js → dist-DGfp5dLz.js} +2 -2
- package/public/assets/{dist-D2jvo5oA.js.map → dist-DGfp5dLz.js.map} +1 -1
- package/public/assets/{dist-mm7c7nBt.js → dist-DT-OV6sQ.js} +2 -2
- package/public/assets/{dist-mm7c7nBt.js.map → dist-DT-OV6sQ.js.map} +1 -1
- package/public/assets/{dist-CBMWGhWc.js → dist-OUPTEP6q.js} +2 -2
- package/public/assets/{dist-CBMWGhWc.js.map → dist-OUPTEP6q.js.map} +1 -1
- package/public/assets/{es2015-VnZ2kVIz.js → es2015-CnKXYKpf.js} +2 -2
- package/public/assets/{es2015-VnZ2kVIz.js.map → es2015-CnKXYKpf.js.map} +1 -1
- package/public/assets/{formatted-body-impl-D_ZJQVNk.js → formatted-body-impl-CSRGuMcM.js} +2 -2
- package/public/assets/{formatted-body-impl-D_ZJQVNk.js.map → formatted-body-impl-CSRGuMcM.js.map} +1 -1
- package/public/assets/formatted-body-q_qzt1L-.js +3 -0
- package/public/assets/{formatted-body-C1AprxyU.js.map → formatted-body-q_qzt1L-.js.map} +1 -1
- package/public/assets/{index-DfPouNiV.js → index-Ceiwd02X.js} +6 -6
- package/public/assets/{index-DfPouNiV.js.map → index-Ceiwd02X.js.map} +1 -1
- package/public/assets/{input-CtLT7WXi.js → input-B6Q0NWCS.js} +2 -2
- package/public/assets/{input-CtLT7WXi.js.map → input-B6Q0NWCS.js.map} +1 -1
- package/public/assets/{insights-BJf1vwrf.js → insights-DUhXqZTZ.js} +2 -2
- package/public/assets/{insights-BJf1vwrf.js.map → insights-DUhXqZTZ.js.map} +1 -1
- package/public/assets/{integrations-BZSHasnY.js → integrations-lbg5CjtE.js} +2 -2
- package/public/assets/{integrations-BZSHasnY.js.map → integrations-lbg5CjtE.js.map} +1 -1
- package/public/assets/{lib-ByLQqcD1.js → lib-BHsWPMKB.js} +2 -2
- package/public/assets/{lib-ByLQqcD1.js.map → lib-BHsWPMKB.js.map} +1 -1
- package/public/assets/lucide-react-DuhlF2Sj.js +10 -0
- package/public/assets/lucide-react-DuhlF2Sj.js.map +1 -0
- package/public/assets/{maintenance-uEI1lArh.js → maintenance-CQgneSVf.js} +2 -2
- package/public/assets/{maintenance-uEI1lArh.js.map → maintenance-CQgneSVf.js.map} +1 -1
- package/public/assets/{managed-agents-mX3hHpOP.js → managed-agents-DsnYf6fm.js} +2 -2
- package/public/assets/{managed-agents-mX3hHpOP.js.map → managed-agents-DsnYf6fm.js.map} +1 -1
- package/public/assets/{markdown-preview-impl-ClNwMC48.js → markdown-preview-impl-C1ZtGJp6.js} +2 -2
- package/public/assets/{markdown-preview-impl-ClNwMC48.js.map → markdown-preview-impl-C1ZtGJp6.js.map} +1 -1
- package/public/assets/{memory-OfusEzGh.js → memory-SSLUTOI2.js} +2 -2
- package/public/assets/{memory-OfusEzGh.js.map → memory-SSLUTOI2.js.map} +1 -1
- package/public/assets/{messages-DsQGj0gU.js → messages-BY26OP4K.js} +2 -2
- package/public/assets/{messages-DsQGj0gU.js.map → messages-BY26OP4K.js.map} +1 -1
- package/public/assets/{orchestrators-BwWyl4mB.js → orchestrators-OY7yPzVI.js} +2 -2
- package/public/assets/{orchestrators-BwWyl4mB.js.map → orchestrators-OY7yPzVI.js.map} +1 -1
- package/public/assets/{overview-CED1SeTY.js → overview-Dj0u1tPG.js} +2 -2
- package/public/assets/{overview-CED1SeTY.js.map → overview-Dj0u1tPG.js.map} +1 -1
- package/public/assets/{pairs-BNu6ZWg4.js → pairs-CrUR50ou.js} +2 -2
- package/public/assets/{pairs-BNu6ZWg4.js.map → pairs-CrUR50ou.js.map} +1 -1
- package/public/assets/{projects-BmopRiUD.js → projects-B_AtxHtH.js} +2 -2
- package/public/assets/{projects-BmopRiUD.js.map → projects-B_AtxHtH.js.map} +1 -1
- package/public/assets/{prompt-settings-Ci2n1cFt.js → prompt-settings-CPtYSban.js} +2 -2
- package/public/assets/{prompt-settings-Ci2n1cFt.js.map → prompt-settings-CPtYSban.js.map} +1 -1
- package/public/assets/{react-dom-cLkVFBsS.js → react-dom-DWBmcawP.js} +2 -2
- package/public/assets/{react-dom-cLkVFBsS.js.map → react-dom-DWBmcawP.js.map} +1 -1
- package/public/assets/{registry-DwXnDIql.js → registry-BgUALWn5.js} +2 -2
- package/public/assets/{registry-DwXnDIql.js.map → registry-BgUALWn5.js.map} +1 -1
- package/public/assets/{security-AW5EbdOm.js → security-5lHfGk7g.js} +2 -2
- package/public/assets/{security-AW5EbdOm.js.map → security-5lHfGk7g.js.map} +1 -1
- package/public/assets/{select-CEeWX4hp.js → select-Cgx4QSLj.js} +2 -2
- package/public/assets/{select-CEeWX4hp.js.map → select-Cgx4QSLj.js.map} +1 -1
- package/public/assets/{settings-DYUdGz4G.js → settings-DFGgxyun.js} +2 -2
- package/public/assets/{settings-DYUdGz4G.js.map → settings-DFGgxyun.js.map} +1 -1
- package/public/assets/{store-BaslPLIP.js → store-BM4zM89B.js} +3 -3
- package/public/assets/store-BM4zM89B.js.map +1 -0
- package/public/assets/{task-chip-kxk4eNm1.js → task-chip-DXfvXBDx.js} +2 -2
- package/public/assets/{task-chip-kxk4eNm1.js.map → task-chip-DXfvXBDx.js.map} +1 -1
- package/public/assets/{tasks-DxCsrY4g.js → tasks-BvH5rluu.js} +2 -2
- package/public/assets/{tasks-DxCsrY4g.js.map → tasks-BvH5rluu.js.map} +1 -1
- package/public/assets/{teams-CF7vi-oM.js → teams-VZOIOdoE.js} +2 -2
- package/public/assets/{teams-CF7vi-oM.js.map → teams-VZOIOdoE.js.map} +1 -1
- package/public/assets/{terminal-viewer-impl-Dy3vqOnW.js → terminal-viewer-impl-DYY3Wmoe.js} +2 -2
- package/public/assets/{terminal-viewer-impl-Dy3vqOnW.js.map → terminal-viewer-impl-DYY3Wmoe.js.map} +1 -1
- package/public/assets/{use-keyboard-viewport-B06XtRUZ.js → use-keyboard-viewport-CP109w9y.js} +2 -2
- package/public/assets/{use-keyboard-viewport-B06XtRUZ.js.map → use-keyboard-viewport-CP109w9y.js.map} +1 -1
- package/public/assets/{user-avatar-DuwCFrER.js → user-avatar-Dw6mzWhv.js} +2 -2
- package/public/assets/{user-avatar-DuwCFrER.js.map → user-avatar-Dw6mzWhv.js.map} +1 -1
- package/public/assets/{work-queue-BPaGXrCE.js → work-queue-B6Xk7QNe.js} +2 -2
- package/public/assets/{work-queue-BPaGXrCE.js.map → work-queue-B6Xk7QNe.js.map} +1 -1
- package/public/assets/{workspaces-BLEXgnlj.js → workspaces-CPIzAHAe.js} +2 -2
- package/public/assets/{workspaces-BLEXgnlj.js.map → workspaces-CPIzAHAe.js.map} +1 -1
- package/public/index.html +23 -23
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/src/branch-landed.ts +3 -7
- package/src/bus.ts +2 -2
- package/src/db/connection.ts +36 -12
- package/src/db/maintenance-worker.ts +23 -11
- package/src/db/message-reads.ts +17 -1
- package/src/maintenance/jobs.ts +18 -12
- package/src/maintenance/scheduler.ts +8 -3
- package/src/maintenance/types.ts +5 -1
- package/src/routes/sse.ts +2 -1
- package/src/services/git-process.ts +61 -0
- package/src/services/git-remote.ts +68 -17
- package/src/services/task-lifecycle.ts +2 -6
- package/src/sse.ts +110 -44
- package/public/assets/formatted-body-C1AprxyU.js +0 -3
- package/public/assets/lucide-react-Dc3ZwCBi.js +0 -9
- package/public/assets/lucide-react-Dc3ZwCBi.js.map +0 -1
- package/public/assets/store-BaslPLIP.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-
|
|
1
|
+
{"version":3,"file":"card-C3BGuVC6.js","names":[],"sources":["../../dashboard/src/components/ui/card.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-4 group-data-[size=sm]/card:px-3\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n"],"mappings":"0GAIA,SAAS,EAAK,CACZ,YACA,OAAO,UACP,GAAG,GACyD,CAC5D,OACE,EAAA,EAAA,KAAC,MAAD,CACE,YAAU,OACV,YAAW,EACX,UAAW,EACT,uVACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,EAAW,CAAE,YAAW,GAAG,GAAsC,CACxE,OACE,EAAA,EAAA,KAAC,MAAD,CACE,YAAU,cACV,UAAW,EACT,qSACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,EAAU,CAAE,YAAW,GAAG,GAAsC,CACvE,OACE,EAAA,EAAA,KAAC,MAAD,CACE,YAAU,aACV,UAAW,EACT,oFACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,EAAgB,CAAE,YAAW,GAAG,GAAsC,CAC7E,OACE,EAAA,EAAA,KAAC,MAAD,CACE,YAAU,mBACV,UAAW,EAAG,gCAAiC,EAAU,CACzD,GAAI,EACJ,CAAA,CAIN,SAAS,EAAW,CAAE,YAAW,GAAG,GAAsC,CACxE,OACE,EAAA,EAAA,KAAC,MAAD,CACE,YAAU,cACV,UAAW,EACT,iEACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,EAAY,CAAE,YAAW,GAAG,GAAsC,CACzE,OACE,EAAA,EAAA,KAAC,MAAD,CACE,YAAU,eACV,UAAW,EAAG,sCAAuC,EAAU,CAC/D,GAAI,EACJ,CAAA,CAIN,SAAS,EAAW,CAAE,YAAW,GAAG,GAAsC,CACxE,OACE,EAAA,EAAA,KAAC,MAAD,CACE,YAAU,cACV,UAAW,EACT,wFACA,EACD,CACD,GAAI,EACJ,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{$n as e,Gn as t,H as n,Jt as r,Kn as i,R as a,Xt as o,bn as s,it as c,nr as l,qn as u,tt as d,vn as f,zn as p}from"./lucide-react-
|
|
2
|
-
//# sourceMappingURL=channels-
|
|
1
|
+
import{$n as e,Gn as t,H as n,Jt as r,Kn as i,R as a,Xt as o,bn as s,it as c,nr as l,qn as u,tt as d,vn as f,zn as p}from"./lucide-react-DuhlF2Sj.js";import{p as m,t as h}from"./store-BM4zM89B.js";import{J as g,K as _,Y as v,c as y,s as b}from"./display-exQDWum3.js";import{t as x}from"./badge-DCIT3Irj.js";import{t as S}from"./button-CzdTkRIf.js";import{o as C,r as w,s as T,t as E}from"./card-C3BGuVC6.js";var D=l(),O={MessagesSquare:d,PlugZap:n,AlertCircle:s,Activity:e,Eye:r,CircleCheck:f,Radio:a,MessageCircle:c,Bell:p};function k({direction:e}){return e===`inbound`?(0,D.jsx)(i,{className:`w-3 h-3`}):e===`outbound`?(0,D.jsx)(t,{className:`w-3 h-3`}):(0,D.jsx)(u,{className:`w-3 h-3`})}function A({channel:e,integration:t}){let n=m(),r=h(e=>e.openChannelDetail),i=y(e),a=e.status!==`offline`,s=e.direction===`outbound`,c=t?.displayName||e.name||e.id,l=(t?.icon?O[t.icon]:null)??d;return(0,D.jsxs)(E,{className:`${a?``:`opacity-60`} hover:border-zinc-600 transition-colors${t?.accentColor?` border-l-2`:``}`,style:t?.accentColor?{borderLeftColor:t.accentColor}:void 0,children:[(0,D.jsx)(C,{className:`pb-2 pt-4 px-4`,children:(0,D.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,D.jsx)(`div`,{className:`p-1.5 rounded-md ${a?`bg-blue-500/10`:`bg-zinc-800`}`,children:(0,D.jsx)(l,{className:`w-4 h-4 ${a?`text-blue-400`:`text-zinc-500`}`})}),(0,D.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,D.jsx)(T,{className:`text-sm font-medium truncate`,children:c}),(0,D.jsxs)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:[e.type,` · `,e.transport]})]}),(0,D.jsx)(x,{className:`text-[10px] shrink-0 ${g(i.tone)}`,children:i.label})]})}),(0,D.jsxs)(w,{className:`px-4 pb-4 space-y-2.5`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,D.jsx)(k,{direction:e.direction}),(0,D.jsx)(`span`,{className:`capitalize`,children:e.direction}),!s&&e.target&&(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`span`,{children:`·`}),(0,D.jsx)(`span`,{className:`truncate text-foreground`,children:e.target})]})]}),!s&&e.targetHealth&&e.targetHealth.status!==`ok`&&(0,D.jsx)(`div`,{className:`text-xs px-2 py-1 rounded ${e.targetHealth.status===`error`?`bg-red-500/10 text-red-400`:`bg-yellow-500/10 text-yellow-400`}`,children:e.targetHealth.detail}),v(e.capabilities).length>0&&(0,D.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:v(e.capabilities).map(e=>(0,D.jsx)(x,{variant:`secondary`,className:`text-[9px] px-1 py-0 h-4`,children:e},e))}),e.tags.length>0&&(0,D.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.tags.map(e=>(0,D.jsx)(x,{variant:`outline`,className:`text-[9px] px-1 py-0 h-4`,children:e},e))}),(0,D.jsxs)(`div`,{className:`flex items-center justify-between pt-0.5`,children:[(0,D.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:_(n,e.lastSeen)}),(0,D.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[t?.docsUrl&&(0,D.jsxs)(`a`,{href:t.docsUrl,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors h-7 px-2 rounded border border-input hover:bg-accent`,children:[(0,D.jsx)(o,{className:`w-3 h-3`}),`Docs`]}),(0,D.jsxs)(S,{size:`sm`,variant:`outline`,className:`h-7 text-xs gap-1`,onClick:()=>r(e),children:[(0,D.jsx)(o,{className:`w-3 h-3`}),`Details`]})]})]})]})]})}function j(){let e=h(e=>e.channels),t=h(e=>e.integrations),r=h(e=>e.switchView),i=new Map(t.map(e=>[e.name,e])),a=e.filter(b).length,o=e.filter(e=>e.direction!==`outbound`&&e.targetHealth?.status===`error`).length,s=e.filter(e=>e.direction!==`outbound`&&e.targetHealth?.status===`warning`).length;return(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`h2`,{className:`text-base font-semibold`,children:`Channels`}),(0,D.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Inbound / outbound message integrations`})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2 ml-auto`,children:[a>0&&(0,D.jsxs)(x,{className:`text-xs bg-emerald-500/15 text-emerald-400 border-emerald-500/30`,children:[a,` ready`]}),s>0&&(0,D.jsxs)(x,{className:`text-xs bg-yellow-500/15 text-yellow-400 border-yellow-500/30`,children:[s,` warning`]}),o>0&&(0,D.jsxs)(x,{className:`text-xs bg-red-500/15 text-red-400 border-red-500/30`,children:[o,` error`]}),(0,D.jsxs)(S,{variant:`ghost`,size:`sm`,className:`h-7 text-xs gap-1.5 text-muted-foreground`,onClick:()=>void r(`integrations`),children:[(0,D.jsx)(n,{className:`w-3 h-3`}),`API Integrations`]})]})]}),e.length===0?(0,D.jsx)(`div`,{className:`text-center py-16 text-muted-foreground text-sm`,children:`No channels registered.`}):(0,D.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4`,children:e.map(e=>(0,D.jsx)(A,{channel:e,integration:i.get(e.type)},e.id))})]})}export{j as ChannelsView};
|
|
2
|
+
//# sourceMappingURL=channels-CKs9rvsn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channels-BlHLMQVk.js","names":[],"sources":["../../dashboard/src/components/views/channels.tsx"],"sourcesContent":["import { useRelayStore, useNow } from '@/store'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { channelIsReady, channelPresence, timeAgo, toneToColor, userFacingCapabilities } from '@/lib/display'\nimport {\n MessagesSquare, ArrowRight, ArrowLeft, ArrowLeftRight, ExternalLink,\n PlugZap, AlertCircle, Activity, Eye, CircleCheck, Radio, MessageCircle, Bell,\n} from 'lucide-react'\nimport type { ChannelSummary, ChannelDirection, IntegrationSummary } from '@/types'\n\nconst INTEGRATION_ICONS: Record<string, typeof MessagesSquare> = {\n MessagesSquare, PlugZap, AlertCircle, Activity, Eye, CircleCheck, Radio, MessageCircle, Bell,\n}\n\nfunction DirectionIcon({ direction }: { direction: ChannelDirection }) {\n if (direction === 'inbound') return <ArrowLeft className=\"w-3 h-3\" />\n if (direction === 'outbound') return <ArrowRight className=\"w-3 h-3\" />\n return <ArrowLeftRight className=\"w-3 h-3\" />\n}\n\nfunction ChannelCard({ channel, integration }: { channel: ChannelSummary; integration?: IntegrationSummary }) {\n const now = useNow()\n const openChannelDetail = useRelayStore((s) => s.openChannelDetail)\n\n const presence = channelPresence(channel)\n const online = channel.status !== 'offline'\n const isOutbound = channel.direction === 'outbound'\n\n const displayName = integration?.displayName || channel.name || channel.id\n const ChannelIcon = (integration?.icon ? INTEGRATION_ICONS[integration.icon] : null) ?? MessagesSquare\n\n return (\n <Card\n className={`${!online ? 'opacity-60' : ''} hover:border-zinc-600 transition-colors${integration?.accentColor ? ' border-l-2' : ''}`}\n style={integration?.accentColor ? { borderLeftColor: integration.accentColor } : undefined}\n >\n <CardHeader className=\"pb-2 pt-4 px-4\">\n <div className=\"flex items-start gap-2\">\n <div className={`p-1.5 rounded-md ${online ? 'bg-blue-500/10' : 'bg-zinc-800'}`}>\n <ChannelIcon className={`w-4 h-4 ${online ? 'text-blue-400' : 'text-zinc-500'}`} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"text-sm font-medium truncate\">{displayName}</CardTitle>\n <div className=\"text-xs text-muted-foreground mt-0.5\">{channel.type} · {channel.transport}</div>\n </div>\n <Badge className={`text-[10px] shrink-0 ${toneToColor(presence.tone)}`}>\n {presence.label}\n </Badge>\n </div>\n </CardHeader>\n\n <CardContent className=\"px-4 pb-4 space-y-2.5\">\n {/* Direction + routing target (outbound channels have no binding target) */}\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <DirectionIcon direction={channel.direction} />\n <span className=\"capitalize\">{channel.direction}</span>\n {!isOutbound && channel.target && (\n <>\n <span>·</span>\n <span className=\"truncate text-foreground\">{channel.target}</span>\n </>\n )}\n </div>\n\n {/* Target health: inbound/bidirectional only — outbound channels have no routing target */}\n {!isOutbound && channel.targetHealth && channel.targetHealth.status !== 'ok' && (\n <div className={`text-xs px-2 py-1 rounded ${channel.targetHealth.status === 'error' ? 'bg-red-500/10 text-red-400' : 'bg-yellow-500/10 text-yellow-400'}`}>\n {channel.targetHealth.detail}\n </div>\n )}\n\n {/* Capabilities */}\n {userFacingCapabilities(channel.capabilities).length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {userFacingCapabilities(channel.capabilities).map((c) => (\n <Badge key={c} variant=\"secondary\" className=\"text-[9px] px-1 py-0 h-4\">{c}</Badge>\n ))}\n </div>\n )}\n\n {/* Tags */}\n {channel.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {channel.tags.map((t) => (\n <Badge key={t} variant=\"outline\" className=\"text-[9px] px-1 py-0 h-4\">{t}</Badge>\n ))}\n </div>\n )}\n\n {/* Last seen + optional docs link + details */}\n <div className=\"flex items-center justify-between pt-0.5\">\n <span className=\"text-xs text-muted-foreground\">{timeAgo(now, channel.lastSeen)}</span>\n <div className=\"flex items-center gap-1.5\">\n {integration?.docsUrl && (\n <a\n href={integration.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors h-7 px-2 rounded border border-input hover:bg-accent\"\n >\n <ExternalLink className=\"w-3 h-3\" />\n Docs\n </a>\n )}\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1\"\n onClick={() => openChannelDetail(channel)}\n >\n <ExternalLink className=\"w-3 h-3\" />\n Details\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport function ChannelsView() {\n const channels = useRelayStore((s) => s.channels)\n const integrations = useRelayStore((s) => s.integrations)\n const switchView = useRelayStore((s) => s.switchView)\n\n const integrationByName = new Map(integrations.map((i) => [i.name, i]))\n\n const readyCount = channels.filter(channelIsReady).length\n // Outbound channels have no routing target, so target health errors/warnings don't apply to them.\n const errorCount = channels.filter((c) => c.direction !== 'outbound' && c.targetHealth?.status === 'error').length\n const warningCount = channels.filter((c) => c.direction !== 'outbound' && c.targetHealth?.status === 'warning').length\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <div>\n <h2 className=\"text-base font-semibold\">Channels</h2>\n <p className=\"text-xs text-muted-foreground\">Inbound / outbound message integrations</p>\n </div>\n <div className=\"flex items-center gap-2 ml-auto\">\n {readyCount > 0 && (\n <Badge className=\"text-xs bg-emerald-500/15 text-emerald-400 border-emerald-500/30\">\n {readyCount} ready\n </Badge>\n )}\n {warningCount > 0 && (\n <Badge className=\"text-xs bg-yellow-500/15 text-yellow-400 border-yellow-500/30\">\n {warningCount} warning\n </Badge>\n )}\n {errorCount > 0 && (\n <Badge className=\"text-xs bg-red-500/15 text-red-400 border-red-500/30\">\n {errorCount} error\n </Badge>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs gap-1.5 text-muted-foreground\"\n onClick={() => void switchView('integrations')}\n >\n <PlugZap className=\"w-3 h-3\" />\n API Integrations\n </Button>\n </div>\n </div>\n\n {/* Cards */}\n {channels.length === 0 ? (\n <div className=\"text-center py-16 text-muted-foreground text-sm\">\n No channels registered.\n </div>\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {channels.map((channel) => (\n <ChannelCard key={channel.id} channel={channel} integration={integrationByName.get(channel.type)} />\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"channels-CKs9rvsn.js","names":[],"sources":["../../dashboard/src/components/views/channels.tsx"],"sourcesContent":["import { useRelayStore, useNow } from '@/store'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { channelIsReady, channelPresence, timeAgo, toneToColor, userFacingCapabilities } from '@/lib/display'\nimport {\n MessagesSquare, ArrowRight, ArrowLeft, ArrowLeftRight, ExternalLink,\n PlugZap, AlertCircle, Activity, Eye, CircleCheck, Radio, MessageCircle, Bell,\n} from 'lucide-react'\nimport type { ChannelSummary, ChannelDirection, IntegrationSummary } from '@/types'\n\nconst INTEGRATION_ICONS: Record<string, typeof MessagesSquare> = {\n MessagesSquare, PlugZap, AlertCircle, Activity, Eye, CircleCheck, Radio, MessageCircle, Bell,\n}\n\nfunction DirectionIcon({ direction }: { direction: ChannelDirection }) {\n if (direction === 'inbound') return <ArrowLeft className=\"w-3 h-3\" />\n if (direction === 'outbound') return <ArrowRight className=\"w-3 h-3\" />\n return <ArrowLeftRight className=\"w-3 h-3\" />\n}\n\nfunction ChannelCard({ channel, integration }: { channel: ChannelSummary; integration?: IntegrationSummary }) {\n const now = useNow()\n const openChannelDetail = useRelayStore((s) => s.openChannelDetail)\n\n const presence = channelPresence(channel)\n const online = channel.status !== 'offline'\n const isOutbound = channel.direction === 'outbound'\n\n const displayName = integration?.displayName || channel.name || channel.id\n const ChannelIcon = (integration?.icon ? INTEGRATION_ICONS[integration.icon] : null) ?? MessagesSquare\n\n return (\n <Card\n className={`${!online ? 'opacity-60' : ''} hover:border-zinc-600 transition-colors${integration?.accentColor ? ' border-l-2' : ''}`}\n style={integration?.accentColor ? { borderLeftColor: integration.accentColor } : undefined}\n >\n <CardHeader className=\"pb-2 pt-4 px-4\">\n <div className=\"flex items-start gap-2\">\n <div className={`p-1.5 rounded-md ${online ? 'bg-blue-500/10' : 'bg-zinc-800'}`}>\n <ChannelIcon className={`w-4 h-4 ${online ? 'text-blue-400' : 'text-zinc-500'}`} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"text-sm font-medium truncate\">{displayName}</CardTitle>\n <div className=\"text-xs text-muted-foreground mt-0.5\">{channel.type} · {channel.transport}</div>\n </div>\n <Badge className={`text-[10px] shrink-0 ${toneToColor(presence.tone)}`}>\n {presence.label}\n </Badge>\n </div>\n </CardHeader>\n\n <CardContent className=\"px-4 pb-4 space-y-2.5\">\n {/* Direction + routing target (outbound channels have no binding target) */}\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <DirectionIcon direction={channel.direction} />\n <span className=\"capitalize\">{channel.direction}</span>\n {!isOutbound && channel.target && (\n <>\n <span>·</span>\n <span className=\"truncate text-foreground\">{channel.target}</span>\n </>\n )}\n </div>\n\n {/* Target health: inbound/bidirectional only — outbound channels have no routing target */}\n {!isOutbound && channel.targetHealth && channel.targetHealth.status !== 'ok' && (\n <div className={`text-xs px-2 py-1 rounded ${channel.targetHealth.status === 'error' ? 'bg-red-500/10 text-red-400' : 'bg-yellow-500/10 text-yellow-400'}`}>\n {channel.targetHealth.detail}\n </div>\n )}\n\n {/* Capabilities */}\n {userFacingCapabilities(channel.capabilities).length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {userFacingCapabilities(channel.capabilities).map((c) => (\n <Badge key={c} variant=\"secondary\" className=\"text-[9px] px-1 py-0 h-4\">{c}</Badge>\n ))}\n </div>\n )}\n\n {/* Tags */}\n {channel.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {channel.tags.map((t) => (\n <Badge key={t} variant=\"outline\" className=\"text-[9px] px-1 py-0 h-4\">{t}</Badge>\n ))}\n </div>\n )}\n\n {/* Last seen + optional docs link + details */}\n <div className=\"flex items-center justify-between pt-0.5\">\n <span className=\"text-xs text-muted-foreground\">{timeAgo(now, channel.lastSeen)}</span>\n <div className=\"flex items-center gap-1.5\">\n {integration?.docsUrl && (\n <a\n href={integration.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors h-7 px-2 rounded border border-input hover:bg-accent\"\n >\n <ExternalLink className=\"w-3 h-3\" />\n Docs\n </a>\n )}\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1\"\n onClick={() => openChannelDetail(channel)}\n >\n <ExternalLink className=\"w-3 h-3\" />\n Details\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport function ChannelsView() {\n const channels = useRelayStore((s) => s.channels)\n const integrations = useRelayStore((s) => s.integrations)\n const switchView = useRelayStore((s) => s.switchView)\n\n const integrationByName = new Map(integrations.map((i) => [i.name, i]))\n\n const readyCount = channels.filter(channelIsReady).length\n // Outbound channels have no routing target, so target health errors/warnings don't apply to them.\n const errorCount = channels.filter((c) => c.direction !== 'outbound' && c.targetHealth?.status === 'error').length\n const warningCount = channels.filter((c) => c.direction !== 'outbound' && c.targetHealth?.status === 'warning').length\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <div>\n <h2 className=\"text-base font-semibold\">Channels</h2>\n <p className=\"text-xs text-muted-foreground\">Inbound / outbound message integrations</p>\n </div>\n <div className=\"flex items-center gap-2 ml-auto\">\n {readyCount > 0 && (\n <Badge className=\"text-xs bg-emerald-500/15 text-emerald-400 border-emerald-500/30\">\n {readyCount} ready\n </Badge>\n )}\n {warningCount > 0 && (\n <Badge className=\"text-xs bg-yellow-500/15 text-yellow-400 border-yellow-500/30\">\n {warningCount} warning\n </Badge>\n )}\n {errorCount > 0 && (\n <Badge className=\"text-xs bg-red-500/15 text-red-400 border-red-500/30\">\n {errorCount} error\n </Badge>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs gap-1.5 text-muted-foreground\"\n onClick={() => void switchView('integrations')}\n >\n <PlugZap className=\"w-3 h-3\" />\n API Integrations\n </Button>\n </div>\n </div>\n\n {/* Cards */}\n {channels.length === 0 ? (\n <div className=\"text-center py-16 text-muted-foreground text-sm\">\n No channels registered.\n </div>\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {channels.map((channel) => (\n <ChannelCard key={channel.id} channel={channel} integration={integrationByName.get(channel.type)} />\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"kaAWM,EAA2D,CAC/D,iBAAgB,UAAS,YAAA,EAAa,WAAU,MAAK,cAAa,QAAO,gBAAe,OACzF,CAED,SAAS,EAAc,CAAE,aAA8C,CAGrE,OAFI,IAAc,WAAkB,EAAA,EAAA,KAAC,EAAD,CAAW,UAAU,UAAY,CAAA,CACjE,IAAc,YAAmB,EAAA,EAAA,KAAC,EAAD,CAAY,UAAU,UAAY,CAAA,EAChE,EAAA,EAAA,KAAC,EAAD,CAAgB,UAAU,UAAY,CAAA,CAG/C,SAAS,EAAY,CAAE,UAAS,eAA8E,CAC5G,IAAM,EAAM,GAAQ,CACd,EAAoB,EAAe,GAAM,EAAE,kBAAkB,CAE7D,EAAW,EAAgB,EAAQ,CACnC,EAAS,EAAQ,SAAW,UAC5B,EAAa,EAAQ,YAAc,WAEnC,EAAc,GAAa,aAAe,EAAQ,MAAQ,EAAQ,GAClE,GAAe,GAAa,KAAO,EAAkB,EAAY,MAAQ,OAAS,EAExF,OACE,EAAA,EAAA,MAAC,EAAD,CACE,UAAW,GAAI,EAAwB,GAAf,aAAkB,0CAA0C,GAAa,YAAc,cAAgB,KAC/H,MAAO,GAAa,YAAc,CAAE,gBAAiB,EAAY,YAAa,CAAG,IAAA,YAFnF,EAIE,EAAA,EAAA,KAAC,EAAD,CAAY,UAAU,2BACpB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kCAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,oBAAoB,EAAS,iBAAmB,0BAC9D,EAAA,EAAA,KAAC,EAAD,CAAa,UAAW,WAAW,EAAS,gBAAkB,kBAAqB,CAAA,CAC/E,CAAA,EACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0BAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAW,UAAU,wCAAgC,EAAwB,CAAA,EAC7E,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gDAAf,CAAuD,EAAQ,KAAK,MAAI,EAAQ,UAAgB,GAC5F,IACN,EAAA,EAAA,KAAC,EAAD,CAAO,UAAW,wBAAwB,EAAY,EAAS,KAAK,YACjE,EAAS,MACJ,CAAA,CACJ,GACK,CAAA,EAEb,EAAA,EAAA,MAAC,EAAD,CAAa,UAAU,iCAAvB,EAEE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mEAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAe,UAAW,EAAQ,UAAa,CAAA,EAC/C,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sBAAc,EAAQ,UAAiB,CAAA,CACtD,CAAC,GAAc,EAAQ,SACtB,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,OAAD,CAAA,SAAM,IAAQ,CAAA,EACd,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,oCAA4B,EAAQ,OAAc,CAAA,CACjE,CAAA,CAAA,CAED,GAGL,CAAC,GAAc,EAAQ,cAAgB,EAAQ,aAAa,SAAW,OACtE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,6BAA6B,EAAQ,aAAa,SAAW,QAAU,6BAA+B,8CACnH,EAAQ,aAAa,OAClB,CAAA,CAIP,EAAuB,EAAQ,aAAa,CAAC,OAAS,IACrD,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gCACZ,EAAuB,EAAQ,aAAa,CAAC,IAAK,IACjD,EAAA,EAAA,KAAC,EAAD,CAAe,QAAQ,YAAY,UAAU,oCAA4B,EAAU,CAAvE,EAAuE,CACnF,CACE,CAAA,CAIP,EAAQ,KAAK,OAAS,IACrB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gCACZ,EAAQ,KAAK,IAAK,IACjB,EAAA,EAAA,KAAC,EAAD,CAAe,QAAQ,UAAU,UAAU,oCAA4B,EAAU,CAArE,EAAqE,CACjF,CACE,CAAA,EAIR,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oDAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,yCAAiC,EAAQ,EAAK,EAAQ,SAAS,CAAQ,CAAA,EACvF,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,CACG,GAAa,UACZ,EAAA,EAAA,MAAC,IAAD,CACE,KAAM,EAAY,QAClB,OAAO,SACP,IAAI,sBACJ,UAAU,qKAJZ,EAME,EAAA,EAAA,KAAC,EAAD,CAAc,UAAU,UAAY,CAAA,CAAA,OAElC,IAEN,EAAA,EAAA,MAAC,EAAD,CACE,KAAK,KACL,QAAQ,UACR,UAAU,oBACV,YAAe,EAAkB,EAAQ,UAJ3C,EAME,EAAA,EAAA,KAAC,EAAD,CAAc,UAAU,UAAY,CAAA,CAAA,UAE7B,GACL,GACF,GACM,GACT,GAIX,SAAgB,GAAe,CAC7B,IAAM,EAAW,EAAe,GAAM,EAAE,SAAS,CAC3C,EAAe,EAAe,GAAM,EAAE,aAAa,CACnD,EAAa,EAAe,GAAM,EAAE,WAAW,CAE/C,EAAoB,IAAI,IAAI,EAAa,IAAK,GAAM,CAAC,EAAE,KAAM,EAAE,CAAC,CAAC,CAEjE,EAAa,EAAS,OAAO,EAAe,CAAC,OAE7C,EAAa,EAAS,OAAQ,GAAM,EAAE,YAAc,YAAc,EAAE,cAAc,SAAW,QAAQ,CAAC,OACtG,EAAe,EAAS,OAAQ,GAAM,EAAE,YAAc,YAAc,EAAE,cAAc,SAAW,UAAU,CAAC,OAEhH,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EAEE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mCAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,mCAA0B,WAAa,CAAA,EACrD,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,yCAAgC,0CAA2C,CAAA,CACpF,CAAA,CAAA,EACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2CAAf,CACG,EAAa,IACZ,EAAA,EAAA,MAAC,EAAD,CAAO,UAAU,4EAAjB,CACG,EAAW,SACN,GAET,EAAe,IACd,EAAA,EAAA,MAAC,EAAD,CAAO,UAAU,yEAAjB,CACG,EAAa,WACR,GAET,EAAa,IACZ,EAAA,EAAA,MAAC,EAAD,CAAO,UAAU,gEAAjB,CACG,EAAW,SACN,IAEV,EAAA,EAAA,MAAC,EAAD,CACE,QAAQ,QACR,KAAK,KACL,UAAU,4CACV,YAAe,KAAK,EAAW,eAAe,UAJhD,EAME,EAAA,EAAA,KAAC,EAAD,CAAS,UAAU,UAAY,CAAA,CAAA,mBAExB,GACL,GACF,GAGL,EAAS,SAAW,GACnB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2DAAkD,0BAE3D,CAAA,EAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gEACZ,EAAS,IAAK,IACb,EAAA,EAAA,KAAC,EAAD,CAAuC,UAAS,YAAa,EAAkB,IAAI,EAAQ,KAAK,CAAI,CAAlF,EAAQ,GAA0E,CACpG,CACE,CAAA,CAEJ"}
|