agent-relay-server 0.35.3 → 0.36.0
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 +68 -1
- package/package.json +2 -2
- package/public/assets/{activity-WjOShx3N.js → activity-DVdEofAq.js} +2 -2
- package/public/assets/{activity-WjOShx3N.js.map → activity-DVdEofAq.js.map} +1 -1
- package/public/assets/{agent-profiles-Bs8MAW6j.js → agent-profiles-BiQ-5F3l.js} +2 -2
- package/public/assets/{agent-profiles-Bs8MAW6j.js.map → agent-profiles-BiQ-5F3l.js.map} +1 -1
- package/public/assets/agents-Dt4FBBnk.js +2 -0
- package/public/assets/agents-Dt4FBBnk.js.map +1 -0
- package/public/assets/{analytics-B5_HS2Lt.js → analytics-BeUxZhkP.js} +3 -3
- package/public/assets/{analytics-B5_HS2Lt.js.map → analytics-BeUxZhkP.js.map} +1 -1
- package/public/assets/{automation-CoOe2nEA.js → automation--G9ZMkL6.js} +2 -2
- package/public/assets/{automation-CoOe2nEA.js.map → automation--G9ZMkL6.js.map} +1 -1
- package/public/assets/{badge-t8zAwHW9.js → badge-JVybSpzR.js} +2 -2
- package/public/assets/{badge-t8zAwHW9.js.map → badge-JVybSpzR.js.map} +1 -1
- package/public/assets/{branch-state-badge-EliCEAQI.js → branch-state-badge-BTqHF74k.js} +2 -2
- package/public/assets/{branch-state-badge-EliCEAQI.js.map → branch-state-badge-BTqHF74k.js.map} +1 -1
- package/public/assets/{button-DDA5P2YQ.js → button-BsMqBNJb.js} +2 -2
- package/public/assets/{button-DDA5P2YQ.js.map → button-BsMqBNJb.js.map} +1 -1
- package/public/assets/card-I8w4U656.js +2 -0
- package/public/assets/{card-CggxP1h9.js.map → card-I8w4U656.js.map} +1 -1
- package/public/assets/{channels-BzSpsE5h.js → channels-nqTHGf6J.js} +2 -2
- package/public/assets/{channels-BzSpsE5h.js.map → channels-nqTHGf6J.js.map} +1 -1
- package/public/assets/chat-DALcMlDH.js +2 -0
- package/public/assets/chat-DALcMlDH.js.map +1 -0
- package/public/assets/{connectors-DoUgct8f.js → connectors-ChkEg-0q.js} +2 -2
- package/public/assets/{connectors-DoUgct8f.js.map → connectors-ChkEg-0q.js.map} +1 -1
- package/public/assets/copy-button-B-XlL8nF.js +2 -0
- package/public/assets/{copy-button-CE8e2c-F.js.map → copy-button-B-XlL8nF.js.map} +1 -1
- package/public/assets/display-ConJ9cJB.js +3 -0
- package/public/assets/{display-Bebqs1qu.js.map → display-ConJ9cJB.js.map} +1 -1
- package/public/assets/{dist-CiWi_f7V.js → dist-BQ52MnS1.js} +2 -2
- package/public/assets/{dist-CiWi_f7V.js.map → dist-BQ52MnS1.js.map} +1 -1
- package/public/assets/{dist-CHi40_tZ.js → dist-BgfF2Rlm.js} +2 -2
- package/public/assets/{dist-CHi40_tZ.js.map → dist-BgfF2Rlm.js.map} +1 -1
- package/public/assets/dist-CnJzBTp1.js +2 -0
- package/public/assets/{dist-DTLaCErY.js.map → dist-CnJzBTp1.js.map} +1 -1
- package/public/assets/{dist-xorgjFcF.js → dist-CrBurS6i.js} +2 -2
- package/public/assets/{dist-xorgjFcF.js.map → dist-CrBurS6i.js.map} +1 -1
- package/public/assets/dist-D6iXJzms.js +2 -0
- package/public/assets/{dist-BmYJ5xuf.js.map → dist-D6iXJzms.js.map} +1 -1
- package/public/assets/{dist-CkiXMjV0.js → dist-DRlgXPi_.js} +2 -2
- package/public/assets/{dist-CkiXMjV0.js.map → dist-DRlgXPi_.js.map} +1 -1
- package/public/assets/{dist-B3igiXqp.js → dist-DSNhRDNh.js} +2 -2
- package/public/assets/{dist-B3igiXqp.js.map → dist-DSNhRDNh.js.map} +1 -1
- package/public/assets/{dist-C3Yx04R4.js → dist-SqFV12iO.js} +2 -2
- package/public/assets/{dist-C3Yx04R4.js.map → dist-SqFV12iO.js.map} +1 -1
- package/public/assets/{es2015-BDK_SBFZ.js → es2015-iucXYTIE.js} +2 -2
- package/public/assets/{es2015-BDK_SBFZ.js.map → es2015-iucXYTIE.js.map} +1 -1
- package/public/assets/{formatted-body-impl-DhCblnWM.js → formatted-body-impl-D1K3GML5.js} +2 -2
- package/public/assets/{formatted-body-impl-DhCblnWM.js.map → formatted-body-impl-D1K3GML5.js.map} +1 -1
- package/public/assets/index-DUxpx-Zp.css +2 -0
- package/public/assets/index-DdB6SVZY.js +21 -0
- package/public/assets/index-DdB6SVZY.js.map +1 -0
- package/public/assets/{input-BW9UD3FM.js → input-dPzf0luy.js} +2 -2
- package/public/assets/{input-BW9UD3FM.js.map → input-dPzf0luy.js.map} +1 -1
- package/public/assets/{insights-yJFgCa3o.js → insights-5CDeJfoX.js} +2 -2
- package/public/assets/{insights-yJFgCa3o.js.map → insights-5CDeJfoX.js.map} +1 -1
- package/public/assets/{integrations-CUv4i_4i.js → integrations-C8839Qa0.js} +2 -2
- package/public/assets/{integrations-CUv4i_4i.js.map → integrations-C8839Qa0.js.map} +1 -1
- package/public/assets/{lib-ZEIADKGq.js → lib-BAE--T4O.js} +3 -3
- package/public/assets/{lib-ZEIADKGq.js.map → lib-BAE--T4O.js.map} +1 -1
- package/public/assets/lucide-react-DLQFnqNm.js +9 -0
- package/public/assets/{lucide-react-CD8Xl2U3.js.map → lucide-react-DLQFnqNm.js.map} +1 -1
- package/public/assets/{maintenance-CUxxVXsc.js → maintenance-Ddl4zgKZ.js} +2 -2
- package/public/assets/{maintenance-CUxxVXsc.js.map → maintenance-Ddl4zgKZ.js.map} +1 -1
- package/public/assets/{managed-agents-VZEeMMSP.js → managed-agents-D-K6vUKj.js} +2 -2
- package/public/assets/{managed-agents-VZEeMMSP.js.map → managed-agents-D-K6vUKj.js.map} +1 -1
- package/public/assets/{markdown-preview-impl-Bbwmbxvn.js → markdown-preview-impl-BjS4cnc3.js} +2 -2
- package/public/assets/{markdown-preview-impl-Bbwmbxvn.js.map → markdown-preview-impl-BjS4cnc3.js.map} +1 -1
- package/public/assets/memory-BTV0z4uL.js +2 -0
- package/public/assets/{memory-BQAC3YmR.js.map → memory-BTV0z4uL.js.map} +1 -1
- package/public/assets/{messages-_sdHV42k.js → messages-CzHsL-om.js} +2 -2
- package/public/assets/{messages-_sdHV42k.js.map → messages-CzHsL-om.js.map} +1 -1
- package/public/assets/{orchestrators-BkHHgd83.js → orchestrators-PMUp2sUP.js} +2 -2
- package/public/assets/{orchestrators-BkHHgd83.js.map → orchestrators-PMUp2sUP.js.map} +1 -1
- package/public/assets/{overview-CYAHOUyA.js → overview-B_od6jh0.js} +2 -2
- package/public/assets/{overview-CYAHOUyA.js.map → overview-B_od6jh0.js.map} +1 -1
- package/public/assets/pairs-CaxiFyfY.js +2 -0
- package/public/assets/{pairs-BvMH1CS7.js.map → pairs-CaxiFyfY.js.map} +1 -1
- package/public/assets/{react-dom-CX8inunm.js → react-dom-CzfKBOnw.js} +2 -2
- package/public/assets/{react-dom-CX8inunm.js.map → react-dom-CzfKBOnw.js.map} +1 -1
- package/public/assets/{security-Dsdr3lSX.js → security-BZYHZ4CE.js} +2 -2
- package/public/assets/{security-Dsdr3lSX.js.map → security-BZYHZ4CE.js.map} +1 -1
- package/public/assets/{settings-DlovIWdE.js → settings-RLyewdfK.js} +7 -7
- package/public/assets/{settings-DlovIWdE.js.map → settings-RLyewdfK.js.map} +1 -1
- package/public/assets/store-CMUFZKxf.js +9 -0
- package/public/assets/store-CMUFZKxf.js.map +1 -0
- package/public/assets/{switch-22dlDUXs.js → switch-W2_mhdrR.js} +2 -2
- package/public/assets/{switch-22dlDUXs.js.map → switch-W2_mhdrR.js.map} +1 -1
- package/public/assets/tasks-BYTcfYDQ.js +2 -0
- package/public/assets/{tasks-Cgan8Oqb.js.map → tasks-BYTcfYDQ.js.map} +1 -1
- package/public/assets/{terminal-viewer-impl-DVW-LRbz.js → terminal-viewer-impl-B5rPCNkZ.js} +3 -3
- package/public/assets/{terminal-viewer-impl-DVW-LRbz.js.map → terminal-viewer-impl-B5rPCNkZ.js.map} +1 -1
- package/public/assets/{use-keyboard-viewport-DxY_xJV5.js → use-keyboard-viewport-bZ1J-ZnH.js} +2 -2
- package/public/assets/{use-keyboard-viewport-DxY_xJV5.js.map → use-keyboard-viewport-bZ1J-ZnH.js.map} +1 -1
- package/public/assets/work-queue-DYgqkTQD.js +2 -0
- package/public/assets/{work-queue-B4CifZKH.js.map → work-queue-DYgqkTQD.js.map} +1 -1
- package/public/assets/{workspaces-D7lsWShY.js → workspaces-Dkq9DxCL.js} +3 -3
- package/public/assets/{workspaces-D7lsWShY.js.map → workspaces-Dkq9DxCL.js.map} +1 -1
- package/public/index.html +20 -20
- package/src/db/message-reads.ts +54 -1
- package/src/db/migrations.ts +1 -0
- package/src/routes/_shared.ts +2 -1
- package/src/routes/agents.ts +21 -2
- package/src/routes/index.ts +2 -1
- package/src/sse.ts +7 -2
- package/public/assets/agents-Cihuuoxa.js +0 -2
- package/public/assets/agents-Cihuuoxa.js.map +0 -1
- package/public/assets/card-CggxP1h9.js +0 -2
- package/public/assets/chat-0ZbxHlDu.js +0 -2
- package/public/assets/chat-0ZbxHlDu.js.map +0 -1
- package/public/assets/copy-button-CE8e2c-F.js +0 -2
- package/public/assets/display-Bebqs1qu.js +0 -3
- package/public/assets/dist-BmYJ5xuf.js +0 -2
- package/public/assets/dist-DTLaCErY.js +0 -2
- package/public/assets/index-CvSlyTSI.js +0 -21
- package/public/assets/index-CvSlyTSI.js.map +0 -1
- package/public/assets/index-DeSwlD3c.css +0 -2
- package/public/assets/lucide-react-CD8Xl2U3.js +0 -9
- package/public/assets/memory-BQAC3YmR.js +0 -2
- package/public/assets/pairs-BvMH1CS7.js +0 -2
- package/public/assets/store-CICRhg1m.js +0 -9
- package/public/assets/store-CICRhg1m.js.map +0 -1
- package/public/assets/tasks-Cgan8Oqb.js +0 -2
- package/public/assets/work-queue-B4CifZKH.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=connectors-
|
|
1
|
+
import{An as e,F as t,P as n,R as r,k as i,v as a,y as o}from"./lucide-react-DLQFnqNm.js";import{t as s}from"./store-CMUFZKxf.js";import{G as c,W as l,l as u}from"./display-ConJ9cJB.js";import{t as d}from"./badge-JVybSpzR.js";import{t as f}from"./button-BsMqBNJb.js";import{i as p,n as m,r as h,t as g}from"./card-I8w4U656.js";var _=e();function v({connector:e}){let v=s(e=>e.runConnectorAction),y=s(e=>e.openConfirm),b=s(e=>e.showNotification),x=u(e),S=e.runtime,C=e.manifest?.commands||{},w=S.installed,T=!!C.start&&w&&!S.running,E=!!C.stop&&S.running,D=!!C.restart&&w,O=!!C.doctor&&w,k=e.displayName||e.id,A=async t=>{try{await v(e.id,t),b(`${t.charAt(0).toUpperCase()+t.slice(1)} completed for ${k}`)}catch{}};return(0,_.jsxs)(g,{className:`hover:border-zinc-600 transition-colors`,children:[(0,_.jsx)(h,{className:`pb-2 pt-4 px-4`,children:(0,_.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,_.jsx)(`div`,{className:`p-1.5 rounded-md ${S.running?`bg-emerald-500/10`:`bg-zinc-800`}`,children:(0,_.jsx)(t,{className:`w-4 h-4 ${S.running?`text-emerald-400`:`text-zinc-500`}`})}),(0,_.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,_.jsx)(p,{className:`text-sm font-medium truncate`,children:e.displayName||e.id}),(0,_.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:e.kind})]}),(0,_.jsx)(d,{className:`text-[10px] shrink-0 ${l(x.tone)}`,children:x.label})]})}),(0,_.jsxs)(m,{className:`px-4 pb-4 space-y-2.5`,children:[e.description&&(0,_.jsx)(`p`,{className:`text-xs text-muted-foreground leading-relaxed line-clamp-2`,children:e.description}),S.detail&&(0,_.jsx)(`div`,{className:`text-xs px-2 py-1 rounded ${S.status===`error`?`bg-red-500/10 text-red-400`:S.status===`warn`?`bg-yellow-500/10 text-yellow-400`:`bg-zinc-800 text-muted-foreground`}`,children:S.detail}),c(e.capabilities).length>0&&(0,_.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:c(e.capabilities).map(e=>(0,_.jsx)(d,{variant:`secondary`,className:`text-[9px] px-1 py-0 h-4`,children:e},e))}),e.version&&(0,_.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`v`,e.version]}),(0,_.jsxs)(`div`,{className:`flex flex-wrap gap-1.5 pt-0.5`,children:[T&&(0,_.jsxs)(f,{size:`sm`,variant:`outline`,className:`h-7 text-xs gap-1 text-emerald-400 border-emerald-500/30 hover:text-emerald-300`,onClick:()=>A(`start`),children:[(0,_.jsx)(r,{className:`w-3 h-3`}),`Start`]}),E&&(0,_.jsxs)(f,{size:`sm`,variant:`outline`,className:`h-7 text-xs gap-1 text-red-400 border-red-500/30 hover:text-red-300`,onClick:()=>y(`Stop Connector`,`Stop ${e.displayName||e.id}?`,()=>A(`stop`)),children:[(0,_.jsx)(o,{className:`w-3 h-3`}),`Stop`]}),D&&(0,_.jsxs)(f,{size:`sm`,variant:`outline`,className:`h-7 text-xs gap-1`,onClick:()=>y(`Restart Connector`,`Restart ${e.displayName||e.id}?`,()=>A(`restart`)),children:[(0,_.jsx)(i,{className:`w-3 h-3`}),`Restart`]}),O&&(0,_.jsxs)(f,{size:`sm`,variant:`ghost`,className:`h-7 text-xs gap-1 text-muted-foreground`,onClick:()=>A(`doctor`),children:[(0,_.jsx)(a,{className:`w-3 h-3`}),`Doctor`]}),!w&&C.install&&(0,_.jsxs)(f,{size:`sm`,variant:`outline`,className:`h-7 text-xs gap-1`,onClick:()=>A(`install`),children:[(0,_.jsx)(n,{className:`w-3 h-3`}),`Install`]}),w&&C.uninstall&&(0,_.jsx)(f,{size:`sm`,variant:`ghost`,className:`h-7 text-xs text-muted-foreground hover:text-red-400`,onClick:()=>y(`Uninstall Connector`,`Uninstall ${e.displayName||e.id}? This will remove the systemd service.`,()=>A(`uninstall`)),children:`Uninstall`})]})]})]})}function y(){let e=s(e=>e.connectors),t=e.filter(e=>e.runtime.running).length;return(0,_.jsxs)(`div`,{className:`space-y-4`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`h2`,{className:`text-base font-semibold`,children:`Connectors`}),(0,_.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Installed service connectors and integrations`})]}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2 ml-auto`,children:[(0,_.jsxs)(d,{variant:`outline`,className:`text-xs`,children:[e.length,` total`]}),t>0&&(0,_.jsxs)(d,{className:`text-xs bg-emerald-500/15 text-emerald-400 border-emerald-500/30`,children:[t,` running`]})]})]}),e.length===0?(0,_.jsx)(`div`,{className:`text-center py-16 text-muted-foreground text-sm`,children:`No connectors registered.`}):(0,_.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4`,children:e.map(e=>(0,_.jsx)(v,{connector:e},e.id))})]})}export{y as ConnectorsView};
|
|
2
|
+
//# sourceMappingURL=connectors-ChkEg-0q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectors-DoUgct8f.js","names":[],"sources":["../../dashboard/src/components/views/connectors.tsx"],"sourcesContent":["import { useRelayStore } from '@/store'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { connectorPresence, toneToColor, userFacingCapabilities } from '@/lib/display'\nimport { Plug, Play, Square, RotateCw, Stethoscope, Power } from 'lucide-react'\nimport type { ConnectorSummary } from '@/types'\n\nfunction ConnectorCard({ connector }: { connector: ConnectorSummary }) {\n const runConnectorAction = useRelayStore((s) => s.runConnectorAction)\n const openConfirm = useRelayStore((s) => s.openConfirm)\n const showNotification = useRelayStore((s) => s.showNotification)\n\n const presence = connectorPresence(connector)\n const runtime = connector.runtime\n const commands = connector.manifest?.commands || {}\n const installed = runtime.installed\n\n const canStart = Boolean(commands.start) && installed && !runtime.running\n const canStop = Boolean(commands.stop) && runtime.running\n const canRestart = Boolean(commands.restart) && installed\n const canDoctor = Boolean(commands.doctor) && installed\n\n const name = connector.displayName || connector.id\n const run = async (action: string) => {\n try {\n await runConnectorAction(connector.id, action)\n showNotification(`${action.charAt(0).toUpperCase() + action.slice(1)} completed for ${name}`)\n } catch { /* error modal already shown by store */ }\n }\n\n return (\n <Card className=\"hover:border-zinc-600 transition-colors\">\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 ${runtime.running ? 'bg-emerald-500/10' : 'bg-zinc-800'}`}>\n <Plug className={`w-4 h-4 ${runtime.running ? 'text-emerald-400' : 'text-zinc-500'}`} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"text-sm font-medium truncate\">{connector.displayName || connector.id}</CardTitle>\n <div className=\"text-xs text-muted-foreground mt-0.5\">{connector.kind}</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 {/* Description */}\n {connector.description && (\n <p className=\"text-xs text-muted-foreground leading-relaxed line-clamp-2\">{connector.description}</p>\n )}\n\n {/* Runtime status detail */}\n {runtime.detail && (\n <div className={`text-xs px-2 py-1 rounded ${runtime.status === 'error' ? 'bg-red-500/10 text-red-400' : runtime.status === 'warn' ? 'bg-yellow-500/10 text-yellow-400' : 'bg-zinc-800 text-muted-foreground'}`}>\n {runtime.detail}\n </div>\n )}\n\n {/* Capabilities */}\n {userFacingCapabilities(connector.capabilities).length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {userFacingCapabilities(connector.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 {/* Version */}\n {connector.version && (\n <div className=\"text-xs text-muted-foreground\">v{connector.version}</div>\n )}\n\n {/* Action buttons */}\n <div className=\"flex flex-wrap gap-1.5 pt-0.5\">\n {canStart && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1 text-emerald-400 border-emerald-500/30 hover:text-emerald-300\"\n onClick={() => run('start')}\n >\n <Play className=\"w-3 h-3\" />\n Start\n </Button>\n )}\n {canStop && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1 text-red-400 border-red-500/30 hover:text-red-300\"\n onClick={() => openConfirm('Stop Connector', `Stop ${connector.displayName || connector.id}?`, () => run('stop'))}\n >\n <Square className=\"w-3 h-3\" />\n Stop\n </Button>\n )}\n {canRestart && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1\"\n onClick={() => openConfirm('Restart Connector', `Restart ${connector.displayName || connector.id}?`, () => run('restart'))}\n >\n <RotateCw className=\"w-3 h-3\" />\n Restart\n </Button>\n )}\n {canDoctor && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs gap-1 text-muted-foreground\"\n onClick={() => run('doctor')}\n >\n <Stethoscope className=\"w-3 h-3\" />\n Doctor\n </Button>\n )}\n {!installed && commands.install && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1\"\n onClick={() => run('install')}\n >\n <Power className=\"w-3 h-3\" />\n Install\n </Button>\n )}\n {installed && commands.uninstall && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs text-muted-foreground hover:text-red-400\"\n onClick={() => openConfirm('Uninstall Connector', `Uninstall ${connector.displayName || connector.id}? This will remove the systemd service.`, () => run('uninstall'))}\n >\n Uninstall\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport function ConnectorsView() {\n const connectors = useRelayStore((s) => s.connectors)\n\n const runningCount = connectors.filter((c) => c.runtime.running).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\">Connectors</h2>\n <p className=\"text-xs text-muted-foreground\">Installed service connectors and integrations</p>\n </div>\n <div className=\"flex items-center gap-2 ml-auto\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {connectors.length} total\n </Badge>\n {runningCount > 0 && (\n <Badge className=\"text-xs bg-emerald-500/15 text-emerald-400 border-emerald-500/30\">\n {runningCount} running\n </Badge>\n )}\n </div>\n </div>\n\n {/* Cards */}\n {connectors.length === 0 ? (\n <div className=\"text-center py-16 text-muted-foreground text-sm\">\n No connectors registered.\n </div>\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {connectors.map((connector) => (\n <ConnectorCard key={connector.id} connector={connector} />\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"connectors-ChkEg-0q.js","names":[],"sources":["../../dashboard/src/components/views/connectors.tsx"],"sourcesContent":["import { useRelayStore } from '@/store'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { connectorPresence, toneToColor, userFacingCapabilities } from '@/lib/display'\nimport { Plug, Play, Square, RotateCw, Stethoscope, Power } from 'lucide-react'\nimport type { ConnectorSummary } from '@/types'\n\nfunction ConnectorCard({ connector }: { connector: ConnectorSummary }) {\n const runConnectorAction = useRelayStore((s) => s.runConnectorAction)\n const openConfirm = useRelayStore((s) => s.openConfirm)\n const showNotification = useRelayStore((s) => s.showNotification)\n\n const presence = connectorPresence(connector)\n const runtime = connector.runtime\n const commands = connector.manifest?.commands || {}\n const installed = runtime.installed\n\n const canStart = Boolean(commands.start) && installed && !runtime.running\n const canStop = Boolean(commands.stop) && runtime.running\n const canRestart = Boolean(commands.restart) && installed\n const canDoctor = Boolean(commands.doctor) && installed\n\n const name = connector.displayName || connector.id\n const run = async (action: string) => {\n try {\n await runConnectorAction(connector.id, action)\n showNotification(`${action.charAt(0).toUpperCase() + action.slice(1)} completed for ${name}`)\n } catch { /* error modal already shown by store */ }\n }\n\n return (\n <Card className=\"hover:border-zinc-600 transition-colors\">\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 ${runtime.running ? 'bg-emerald-500/10' : 'bg-zinc-800'}`}>\n <Plug className={`w-4 h-4 ${runtime.running ? 'text-emerald-400' : 'text-zinc-500'}`} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"text-sm font-medium truncate\">{connector.displayName || connector.id}</CardTitle>\n <div className=\"text-xs text-muted-foreground mt-0.5\">{connector.kind}</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 {/* Description */}\n {connector.description && (\n <p className=\"text-xs text-muted-foreground leading-relaxed line-clamp-2\">{connector.description}</p>\n )}\n\n {/* Runtime status detail */}\n {runtime.detail && (\n <div className={`text-xs px-2 py-1 rounded ${runtime.status === 'error' ? 'bg-red-500/10 text-red-400' : runtime.status === 'warn' ? 'bg-yellow-500/10 text-yellow-400' : 'bg-zinc-800 text-muted-foreground'}`}>\n {runtime.detail}\n </div>\n )}\n\n {/* Capabilities */}\n {userFacingCapabilities(connector.capabilities).length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {userFacingCapabilities(connector.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 {/* Version */}\n {connector.version && (\n <div className=\"text-xs text-muted-foreground\">v{connector.version}</div>\n )}\n\n {/* Action buttons */}\n <div className=\"flex flex-wrap gap-1.5 pt-0.5\">\n {canStart && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1 text-emerald-400 border-emerald-500/30 hover:text-emerald-300\"\n onClick={() => run('start')}\n >\n <Play className=\"w-3 h-3\" />\n Start\n </Button>\n )}\n {canStop && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1 text-red-400 border-red-500/30 hover:text-red-300\"\n onClick={() => openConfirm('Stop Connector', `Stop ${connector.displayName || connector.id}?`, () => run('stop'))}\n >\n <Square className=\"w-3 h-3\" />\n Stop\n </Button>\n )}\n {canRestart && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1\"\n onClick={() => openConfirm('Restart Connector', `Restart ${connector.displayName || connector.id}?`, () => run('restart'))}\n >\n <RotateCw className=\"w-3 h-3\" />\n Restart\n </Button>\n )}\n {canDoctor && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs gap-1 text-muted-foreground\"\n onClick={() => run('doctor')}\n >\n <Stethoscope className=\"w-3 h-3\" />\n Doctor\n </Button>\n )}\n {!installed && commands.install && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1\"\n onClick={() => run('install')}\n >\n <Power className=\"w-3 h-3\" />\n Install\n </Button>\n )}\n {installed && commands.uninstall && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs text-muted-foreground hover:text-red-400\"\n onClick={() => openConfirm('Uninstall Connector', `Uninstall ${connector.displayName || connector.id}? This will remove the systemd service.`, () => run('uninstall'))}\n >\n Uninstall\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport function ConnectorsView() {\n const connectors = useRelayStore((s) => s.connectors)\n\n const runningCount = connectors.filter((c) => c.runtime.running).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\">Connectors</h2>\n <p className=\"text-xs text-muted-foreground\">Installed service connectors and integrations</p>\n </div>\n <div className=\"flex items-center gap-2 ml-auto\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {connectors.length} total\n </Badge>\n {runningCount > 0 && (\n <Badge className=\"text-xs bg-emerald-500/15 text-emerald-400 border-emerald-500/30\">\n {runningCount} running\n </Badge>\n )}\n </div>\n </div>\n\n {/* Cards */}\n {connectors.length === 0 ? (\n <div className=\"text-center py-16 text-muted-foreground text-sm\">\n No connectors registered.\n </div>\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {connectors.map((connector) => (\n <ConnectorCard key={connector.id} connector={connector} />\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./chunk-CilyBKbf.js";import{An as t,Hn as n,On as r,Vt as i,in as a}from"./lucide-react-DLQFnqNm.js";import{t as o}from"./button-BsMqBNJb.js";var s=e(n(),1),c=t();function l({value:e,label:t=`Copy`,copiedLabel:n=`Copied`,showText:l=!1,size:u,variant:d=`ghost`,className:f,iconClassName:p,disabled:m,onCopied:h}){let[g,_]=(0,s.useState)(!1),v=(0,s.useRef)(null);(0,s.useEffect)(()=>()=>{v.current&&clearTimeout(v.current)},[]);async function y(t){t.preventDefault(),t.stopPropagation();try{await navigator.clipboard?.writeText(typeof e==`function`?e():e),_(!0),h?.(),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>_(!1),1400)}catch{_(!1)}}let b=u??(l?`sm`:`icon-sm`),x=r(`h-3.5 w-3.5`,p);return(0,c.jsxs)(o,{type:`button`,size:b,variant:d,className:f,disabled:m,title:g?n:t,"aria-label":g?n:t,onClick:e=>void y(e),children:[g?(0,c.jsx)(a,{className:x}):(0,c.jsx)(i,{className:x}),l&&(g?n:t)]})}export{l as t};
|
|
2
|
+
//# sourceMappingURL=copy-button-B-XlL8nF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-button-
|
|
1
|
+
{"version":3,"file":"copy-button-B-XlL8nF.js","names":[],"sources":["../../dashboard/src/components/shared/copy-button.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { Check, Copy } from 'lucide-react'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@/lib/utils'\n\ntype ButtonSize = 'default' | 'xs' | 'sm' | 'lg' | 'icon' | 'icon-xs' | 'icon-sm' | 'icon-lg'\ntype ButtonVariant = 'default' | 'outline' | 'secondary' | 'ghost' | 'destructive' | 'link'\n\ninterface CopyButtonProps {\n /** The text written to the clipboard — a string, or a thunk for lazily-built content. */\n value: string | (() => string)\n /** Title/aria-label before copying. Defaults to \"Copy\". */\n label?: string\n /** Title/aria-label after copying. Defaults to \"Copied\". */\n copiedLabel?: string\n /** Render the label text next to the icon (otherwise icon-only). */\n showText?: boolean\n size?: ButtonSize\n variant?: ButtonVariant\n className?: string\n iconClassName?: string\n disabled?: boolean\n /** Called after a successful copy (e.g. to surface a toast). */\n onCopied?: () => void\n}\n\n/**\n * Shared copy-to-clipboard button with a transient \"copied\" check state.\n * Consolidates the duplicated clipboard + timeout pattern used across views.\n */\nexport function CopyButton({\n value,\n label = 'Copy',\n copiedLabel = 'Copied',\n showText = false,\n size,\n variant = 'ghost',\n className,\n iconClassName,\n disabled,\n onCopied,\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false)\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => () => { if (timer.current) clearTimeout(timer.current) }, [])\n\n async function copy(e: React.MouseEvent) {\n // Copy buttons frequently sit inside clickable cards/rows — never trigger the parent.\n e.preventDefault()\n e.stopPropagation()\n try {\n await navigator.clipboard?.writeText(typeof value === 'function' ? value() : value)\n setCopied(true)\n onCopied?.()\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => setCopied(false), 1400)\n } catch {\n setCopied(false)\n }\n }\n\n const resolvedSize = size ?? (showText ? 'sm' : 'icon-sm')\n const iconCls = cn('h-3.5 w-3.5', iconClassName)\n\n return (\n <Button\n type=\"button\"\n size={resolvedSize}\n variant={variant}\n className={className}\n disabled={disabled}\n title={copied ? copiedLabel : label}\n aria-label={copied ? copiedLabel : label}\n onClick={(e) => void copy(e)}\n >\n {copied ? <Check className={iconCls} /> : <Copy className={iconCls} />}\n {showText && (copied ? copiedLabel : label)}\n </Button>\n )\n}\n"],"mappings":"sLA8BA,SAAgB,EAAW,CACzB,QACA,QAAQ,OACR,cAAc,SACd,WAAW,GACX,OACA,UAAU,QACV,YACA,gBACA,WACA,YACkB,CAClB,GAAM,CAAC,EAAQ,IAAA,EAAA,EAAA,UAAsB,GAAM,CACrC,GAAA,EAAA,EAAA,QAAqD,KAAK,EAEhE,EAAA,EAAA,mBAAsB,CAAM,EAAM,SAAS,aAAa,EAAM,QAAQ,EAAI,EAAE,CAAC,CAE7E,eAAe,EAAK,EAAqB,CAEvC,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,CACnB,GAAI,CACF,MAAM,UAAU,WAAW,UAAU,OAAO,GAAU,WAAa,GAAO,CAAG,EAAM,CACnF,EAAU,GAAK,CACf,KAAY,CACR,EAAM,SAAS,aAAa,EAAM,QAAQ,CAC9C,EAAM,QAAU,eAAiB,EAAU,GAAM,CAAE,KAAK,MAClD,CACN,EAAU,GAAM,EAIpB,IAAM,EAAe,IAAS,EAAW,KAAO,WAC1C,EAAU,EAAG,cAAe,EAAc,CAEhD,OACE,EAAA,EAAA,MAAC,EAAD,CACE,KAAK,SACL,KAAM,EACG,UACE,YACD,WACV,MAAO,EAAS,EAAc,EAC9B,aAAY,EAAS,EAAc,EACnC,QAAU,GAAM,KAAK,EAAK,EAAE,UAR9B,CAUG,GAAS,EAAA,EAAA,KAAC,EAAD,CAAO,UAAW,EAAW,CAAA,EAAG,EAAA,EAAA,KAAC,EAAD,CAAM,UAAW,EAAW,CAAA,CACrE,IAAa,EAAS,EAAc,GAC9B"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var e=`user`,t=e,n=5e3,r=new Set([`done`,`failed`,`canceled`]),i=new Set([`open`,`blocked`]),a={online:0,idle:0,busy:2,offline:3},o={idle:0,online:0,busy:2,offline:4},s={from:``,to:``,body:``,channel:``,subject:``,claimable:!1},c={toMode:`agent`,to:``,body:``,channel:``,subject:``,claimable:!1},l={pairId:``,from:``,body:``,subject:``},u={requesterId:``,targetId:``,objective:``},ee=[{key:`overview`,label:`Overview`,icon:`LayoutDashboard`},{key:`chat`,label:`Chat`,icon:`MessageCircle`},{key:`agents`,label:`Agents`,icon:`Bot`},{key:`managed`,label:`Managed Agents`,icon:`Workflow`},{key:`profiles`,label:`Agent Profiles`,icon:`UserCog`},{key:`orchestrators`,label:`Orchestrators`,icon:`Server`},{key:`workspaces`,label:`Workspaces`,icon:`GitBranch`},{key:`files`,label:`Files`,icon:`FolderTree`},{key:`channels`,label:`Channels`,icon:`MessagesSquare`},{key:`connectors`,label:`Connectors`,icon:`Plug`},{key:`integrations`,label:`Integrations`,icon:`PlugZap`},{key:`security`,label:`Security`,icon:`Shield`},{key:`memory`,label:`Memory`,icon:`BrainCircuit`},{key:`activity`,label:`Activity`,icon:`Activity`},{key:`pairs`,label:`Pairs`,icon:`Link`},{key:`messages`,label:`Messages`,icon:`Mail`},{key:`work`,label:`Work Queue`,icon:`ListChecks`},{key:`tasks`,label:`Tasks`,icon:`ClipboardList`},{key:`automation`,label:`Automation`,icon:`CalendarClock`},{key:`analytics`,label:`Analytics`,icon:`AreaChart`},{key:`insights`,label:`Insights`,icon:`Lightbulb`},{key:`maintenance`,label:`Maintenance`,icon:`Wrench`},{key:`settings`,label:`Settings`,icon:`Settings`}],d={critical:`text-red-400 bg-red-500/10`,warning:`text-yellow-400 bg-yellow-500/10`,info:`text-blue-400 bg-blue-500/10`},te={active:`bg-emerald-500/20 text-emerald-400`,pending:`bg-yellow-500/20 text-yellow-400`,ended:`bg-zinc-500/20 text-zinc-400`,rejected:`bg-red-500/20 text-red-400`,expired:`bg-red-500/20 text-red-400`},ne=[`cleaned`,`merged`,`abandoned`];function f(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function p(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function m(e){return e instanceof Error?e.message:String(e)}function h(e){let t=typeof e==`number`?e:new Date(e||0).getTime();return Number.isFinite(t)?t:0}var g=[`lifecycle.`,`commands.`,`capabilities.`],_={"+1":`👍`,":+1:":`👍`,thumbsup:`👍`,":thumbsup:":`👍`,"thumbs-up":`👍`,":thumbs-up:":`👍`,thumbs_up:`👍`,":thumbs_up:":`👍`,thumb_up:`👍`,":thumb_up:":`👍`,like:`👍`,":like:":`👍`,heart:`❤️`,":heart:":`❤️`,redheart:`❤️`,red_heart:`❤️`,":red_heart:":`❤️`,check:`✅`,":check:":`✅`,checkmark:`✅`,":checkmark:":`✅`,white_check_mark:`✅`,":white_check_mark:":`✅`,eyes:`👀`,":eyes:":`👀`};function v(e){let t=e.trim();return _[t.toLowerCase()]??t}function y(e){return e.filter(e=>!g.some(t=>e.startsWith(t)))}function b(e,t=2){if(!e)return``;let n=e.replace(/\/+$/,``).split(`/`);return n.length<=t?e:n.slice(-t).join(`/`)}function x(e){return e.trim().replace(/\\/g,`/`).replace(/\/+$/,``)||`/`}function re(e,t){if(!e?.trim()||!t?.trim())return!1;let n=x(e),r=x(t);return r===`/`?n.startsWith(`/`):n===`/`?!1:n===r||n.startsWith(r+`/`)}function S(e){return e?.meta?.builtin===!0||e?.id===`user`||e?.id===`system`}function C(e){let t=e?.tags||[],n=e?.capabilities||[],r=typeof e?.meta?.policyName==`string`?e.meta.policyName:``;return e?.kind===`channel`||e?.meta?.kind===`channel`||t.includes(`channel`)||t.some(e=>e.startsWith(`channel:`))||n.includes(`channel`)||n.some(e=>e.startsWith(`channel:`))||t.includes(`telegram`)||n.includes(`telegram`)||r===`telegram-main`}function ie(e){return!!(typeof e?.meta?.automationId==`string`||typeof e?.meta?.automationRunId==`string`||e?.tags?.includes(`automation`))}function w(e){return S(e)||C(e)||ie(e)}function T(e){if(e?.id===`user`)return`user`;if(e?.id===`system`)return`system`;if(C(e))return`channel`;let t=[...e?.tags||[],e?.meta?.provider,e?.meta?.client,e?.meta?.runtime,e?.meta?.agentType,e?.id,e?.name].filter(e=>typeof e==`string`).map(e=>e.toLowerCase());return t.some(e=>e.includes(`codex`))?`codex`:t.some(e=>e.includes(`claude`))?`claude`:`agent`}function E(e,t){if(!t?.lastSeen||t.status===`offline`||t.id===`user`||t.id===`system`)return!1;let n=t.meta?.transport;if(f(n)&&n.connected===!0)return!1;let r=new Date(t.lastSeen).getTime();return Number.isFinite(r)?e-r>6e4:!1}function D(e,t){if(!e||S(e)||C(e)||t===`resume`)return!1;if(t===`interrupt`)return e.providerCapabilities?.liveSession?.interrupt===!0&&e.status===`busy`;if(T(e)===`claude`&&(t===`restart`||t===`shutdown`||t===`compact`||t===`clearContext`)&&!O(e))return!1;let n=e.providerCapabilities?.lifecycle;if(n){if(t===`restart`)return n.restartHard===!0;if(t===`shutdown`)return n.shutdownHard===!0;if(t===`reconnect`)return n.reconnect===!0}return t===`compact`?e.providerCapabilities?.context?.compact===!0:t===`clearContext`?e.providerCapabilities?.context?.clear===!0:e.meta?.runnerManaged===!0&&(t===`restart`||t===`shutdown`)}function O(e){return typeof e.meta?.tmuxSession==`string`&&e.meta.tmuxSession.trim().length>0}function k(e){return D(e,`restart`)||D(e,`shutdown`)||D(e,`reconnect`)||D(e,`compact`)||D(e,`clearContext`)}function A(e){return!!(e&&!S(e)&&!C(e)&&!k(e)&&(e.status===`offline`||e.status===`stale`))}function j(e,t){if(e.status!==`offline`)return!1;let n=typeof e.meta?.policyName==`string`?e.meta.policyName:``;if(!n)return!1;let r=t.find(e=>e.policy.name===n);return!!(r?.state.agentId&&r.state.agentId!==e.id)}function M(e,t,n=[]){let r=e.filter(e=>!j(e,n));return t?r:r.filter(e=>!w(e))}function N(e){return e?e.label||e.name||e.id.slice(-12):`?`}function P(e,t){if(!e)return`?`;if(e===`broadcast`)return`broadcast`;if(e.startsWith(`tag:`))return`#`+e.slice(4);if(e.startsWith(`cap:`))return e.slice(4);if(e.startsWith(`label:`))return e.slice(6);let n=t[e];return n?N(n):e.slice(-8)}function F(e){if(!e)return``;let t=e.payload||{},n=t.message;if(n&&typeof n==`object`&&typeof n.text==`string`&&n.text.trim())return n.text;let r=t.interaction;if(r&&typeof r==`object`){let e=typeof r.title==`string`?r.title.trim():``,t=typeof r.description==`string`?r.description.trim():``;if(e&&t)return e+`
|
|
2
|
+
`+t;if(e)return e;if(t)return t}let i=t.reaction;if(i&&typeof i==`object`){let e=typeof i.name==`string`?i.name:``,t=typeof i.emoji==`string`?i.emoji:``,n=typeof i.value==`string`?i.value:``;return[`Reaction`,v(t||e||n)].filter(Boolean).join(`: `)}let a=t.activity;return a&&typeof a==`object`?[typeof a.kind==`string`?a.kind:`activity`,typeof a.state==`string`?a.state:``].filter(Boolean).join(` `):typeof t.text==`string`&&t.text.trim()?t.text:typeof t.message==`string`&&t.message.trim()?t.message:R(e.body||``)??(e.body||``)}function I(e){if(!e?.payload)return!1;let t=e.payload.event;return e.payload.reactionNotification===!0||t?.type===`message.reaction`}function L(e){if(!e)return null;let t=e.trim();if(!t.startsWith(`{`))return null;try{let e=JSON.parse(t);if(typeof e!=`object`||!e||Array.isArray(e))return null;let n=typeof e.text==`string`?e.text:typeof e.message==`string`?e.message:null;if(!n?.trim())return null;let r=new Set([`text`,`message`]);return{text:n,meta:Object.entries(e).filter(([e,t])=>!r.has(e)&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)).map(([e,t])=>[e,String(t)]),raw:e}}catch{return null}}function R(e){return L(e)?.text??null}function z(e){let t=e?.subject||F(e)||``;return t.length>90?t.slice(0,90)+`...`:t}function B(e){return e.from===`user`&&e.to?e.to:e.to===`user`&&e.from?e.from:``}function V(e){return e.to===`user`&&e.from!==`user`}function H(e){if(e.kind!==`session`)return!1;let t=e.payload?.session?.type;return t===`reasoning`||t===`tool`}function U(e){return e.kind===`session`&&e.payload?.session?.type===`response`}function W(e,t){let n=e.trim(),r=t.trim();return r?n===r?!0:n.startsWith(`${r}\n\n`)||n.endsWith(`\n\n${r}`)||n.includes(`\n\n${r}\n\n`):!1}function G(e,t,n){if(!V(n)||!U(n)||(n.readBy||[]).includes(`user`))return!1;let r=Number(e[t]||0);return n.id>(Number.isFinite(r)?r:0)}function K(e){return i.has(e.status)&&!e.claimedBy}function q(e){return!!(e.claimable&&!e.claimedBy&&!(e.kind===`task`&&Number.isSafeInteger(e.payload?.taskId)))}function ae(e,t){return!e||!t?!1:e===`broadcast`||e===t.id?!0:e.startsWith(`tag:`)?(t.tags||[]).includes(e.slice(4)):e.startsWith(`cap:`)?(t.capabilities||[]).includes(e.slice(4)):e.startsWith(`label:`)?t.label===e.slice(6):!1}function J(e,t){if(!e||!t)return!1;let n=[t.id,t.type,...t.topicChannels||[]].filter(Boolean);if(e.channel&&n.includes(e.channel))return!0;let r=e.payload?.channel;if(r&&typeof r==`object`){let e=[r.agentId,r.provider,r.accountId].filter(Boolean);if(e.includes(t.id)||e.includes(t.type)||t.accountId&&e.includes(t.accountId))return!0}return!!(t.agentId&&(e.from===t.agentId||e.to===t.agentId))}function Y(e){let t=e?.meta?.providerState;return!f(t)||typeof t.state!=`string`?null:{state:t.state,reason:typeof t.reason==`string`?t.reason:void 0,label:typeof t.label==`string`&&t.label?t.label:t.state,recommendedAction:typeof t.recommendedAction==`string`?t.recommendedAction:void 0,source:typeof t.source==`string`?t.source:void 0,raw:t.raw,updatedAt:typeof t.updatedAt==`number`?t.updatedAt:void 0,pendingApproval:oe(t.pendingApproval)}}function oe(e){if(!f(e)||typeof e.id!=`string`)return;let t=Array.isArray(e.choices)?e.choices.filter(f).map(e=>({id:e.id,label:typeof e.label==`string`?e.label:String(e.id||``)})).filter(e=>(e.id===`approve`||e.id===`approve-session`||e.id===`deny`||e.id===`abort`)&&!!e.label):[],n=Array.isArray(e.questions)?e.questions.filter(f).map(e=>({question:typeof e.question==`string`?e.question:``,header:typeof e.header==`string`?e.header:void 0,multiSelect:e.multiSelect===!0,options:Array.isArray(e.options)?e.options.filter(f).map(e=>({label:typeof e.label==`string`?e.label:String(e.label??``),description:typeof e.description==`string`?e.description:void 0})).filter(e=>!!e.label):[]})).filter(e=>!!e.question&&e.options.length>0):void 0;return{id:e.id,provider:typeof e.provider==`string`?e.provider:void 0,kind:typeof e.kind==`string`?e.kind:void 0,title:typeof e.title==`string`&&e.title?e.title:`Permission request`,body:typeof e.body==`string`?e.body:``,choices:t,...n&&n.length?{questions:n}:{}}}function X(e){let t=Y(e);return t?.state===`blocked`?t:null}function se(e){return!!e?.id}function ce(e){return se(X(e)?.pendingApproval)}function Z(e){let t=e?.meta?.activeSubagents;if(!Array.isArray(t)){let t=typeof e?.meta?.activeSubagentCount==`number`?e.meta.activeSubagentCount:0;return t>0?Array.from({length:t},(e,t)=>({id:`subagent-${t+1}`,label:`Subagent ${t+1}`})):[]}return t.filter(f).map((e,t)=>{let n=typeof e.id==`string`&&e.id?e.id:`subagent-${t+1}`,r=typeof e.role==`string`&&e.role?e.role:void 0;return{id:n,label:typeof e.label==`string`&&e.label?e.label:r||n,role:r,startedAt:typeof e.startedAt==`number`?e.startedAt:void 0}})}function le(e,t,n,r){let i=typeof t?.meta?.lifecycleAction==`string`?t.meta.lifecycleAction:``,a=E(e,t),o=t?.status!==`offline`&&!t?.ready&&a,s=t?.status!==`offline`&&!t?.ready&&!a,c=n.unread>0&&t?.status!==`busy`,l=X(t),u=ue(t,n,r);return t?.status===`offline`?{label:`offline`,tone:`secondary`,icon:`PlugZap`,stale:!1,reconnecting:!1,badges:u}:i.startsWith(`finalizing-`)?{label:`wrapping up (${i.slice(11)})`,tone:`warning`,icon:`Hourglass`,stale:a,reconnecting:o,badges:u}:i===`shutting-down`?{label:`shutting down`,tone:`warning`,icon:`Power`,stale:a,reconnecting:o,badges:u}:i===`killing`?{label:`killing`,tone:`danger`,icon:`Power`,stale:a,reconnecting:o,badges:u}:i===`restarting`?{label:`restarting`,tone:`warning`,icon:`RefreshCw`,stale:a,reconnecting:o,badges:u}:t?.status===`stale`?{label:`stale`,tone:`danger`,icon:`RefreshCw`,stale:!0,reconnecting:!0,badges:u}:o?{label:`reconnecting`,tone:`danger`,icon:`RefreshCw`,stale:a,reconnecting:o,badges:u}:s?{label:`online, not ready`,tone:`warning`,icon:`Loader`,stale:a,reconnecting:o,badges:u}:l?{label:`blocked: ${l.label}`,tone:`danger`,icon:`AlertCircle`,stale:a,reconnecting:o,badges:u}:t?.status===`busy`?{label:`busy in turn`,tone:`warning`,icon:`Play`,stale:a,reconnecting:o,badges:u}:r?.status===`active`?{label:`paired`,tone:`success`,icon:`Link`,stale:a,reconnecting:o,badges:u}:c?{label:`idle, unread`,tone:`danger`,icon:`Bell`,stale:a,reconnecting:o,badges:u}:{label:t?.status===`idle`?`idle`:`ready`,tone:`success`,icon:`CircleCheck`,stale:a,reconnecting:o,badges:u}}function ue(e,t,n){let r=[],i=X(e),a=Z(e).length;return i&&r.push({label:i.reason?`blocked: ${i.reason}`:`blocked`,className:`bg-red-500/20 text-red-400`}),a&&r.push({label:a===1?`1 subagent`:a+` subagents`,className:`bg-cyan-500/20 text-cyan-300`}),n?.status===`active`&&r.push({label:`paired`,className:`bg-emerald-500/20 text-emerald-400`}),n?.status===`pending`&&r.push({label:`pair invite`,className:`bg-yellow-500/20 text-yellow-400`}),t.needsHumanResponse&&r.push({label:`needs response`,className:`bg-amber-500/20 text-amber-300`}),t.unread&&r.push({label:t.unread+` unread`,className:`bg-red-500/20 text-red-400`}),t.claimableTasks&&r.push({label:t.claimableTasks+` claimable`,className:`bg-orange-500/20 text-orange-400`}),r}function de(){return{unread:0,needsHumanResponse:!1,pendingPairInvite:!1,claimableTasks:0,total:0,score:0}}function Q(e){return!e||e.status===`offline`?!1:e.targetHealth?.status===`ok`?!0:e.targetHealth?.status===`error`||e.targetHealth?.status===`warning`?!1:e.ready}function fe(e){return e?e.targetHealth?.status===`error`?{label:`target broken`,tone:`danger`,icon:`AlertTriangle`,badges:[]}:e.targetHealth?.status===`warning`?{label:`target warning`,tone:`warning`,icon:`AlertCircle`,badges:[]}:e.status===`offline`?{label:`offline`,tone:`secondary`,icon:`PlugZap`,badges:[]}:e.status===`busy`?{label:`busy`,tone:`warning`,icon:`Activity`,badges:[]}:Q(e)?{label:`ready`,tone:`success`,icon:`CircleCheck`,badges:[]}:{label:`not ready`,tone:`warning`,icon:`Loader`,badges:[]}:{label:`unknown`,tone:`secondary`,icon:`PlugZap`,badges:[]}}function pe(e){let t=e?.runtime||{};return t.status===`error`?{label:`error`,tone:`danger`,icon:`AlertTriangle`,badges:[]}:t.status===`warn`?{label:`warning`,tone:`warning`,icon:`AlertCircle`,badges:[]}:t.running?{label:`running`,tone:`success`,icon:`CircleCheck`,badges:[]}:t.enabled===!1?{label:`disabled`,tone:`secondary`,icon:`Pause`,badges:[]}:t.status===`ok`?{label:`ok`,tone:`success`,icon:`CircleCheck`,badges:[]}:{label:`unknown`,tone:`secondary`,icon:`HelpCircle`,badges:[]}}function $(e){let t=e?.taskStats||{};return(t.waitingTasks||0)>0?{label:`waiting`,tone:`warning`,icon:`AlertCircle`,badges:[]}:(t.openTasks||0)>0?{label:`active`,tone:`info`,icon:`Activity`,badges:[]}:e?.configured?e.observed?{label:`quiet`,tone:`success`,icon:`CircleCheck`,badges:[]}:{label:`configured`,tone:`primary`,icon:`PlugZap`,badges:[]}:{label:`observed only`,tone:`secondary`,icon:`Eye`,badges:[]}}function me(e){let t=e?.health;return!t||t.status===`ok`?e?.version||e?.package?.version?`compatible`:`unknown version`:t.status===`upgrade-required`?`upgrade required`:t.status===`restart-required`?`restart required`:t.status===`unknown`?`unknown contract`:(t.issues||[]).some(e=>e.code===`protocol-mismatch`)?`protocol mismatch`:(t.issues||[]).some(e=>e.code===`package-drift`)?`package drift`:t.restartRequired?`restart required`:t.status}function he(e){let t=e?.health?.status;return t===`upgrade-required`?`text-red-400 bg-red-500/10`:t===`warn`||t===`restart-required`?`text-yellow-400 bg-yellow-500/10`:t===`unknown`?`text-zinc-400 bg-zinc-500/10`:`text-emerald-400 bg-emerald-500/10`}function ge(e,t){if(!t)return``;let n=new Date(t).getTime();if(!Number.isFinite(n))return``;let r=Math.max(0,(e-n)/1e3);return r<60?Math.floor(r)+`s ago`:r<3600?Math.floor(r/60)+`m ago`:r<86400?Math.floor(r/3600)+`h ago`:Math.floor(r/86400)+`d ago`}function _e(e){return e?new Date(e).toLocaleString():``}function ve(e){return String(e||`export`).replace(/[^a-z0-9._-]+/gi,`-`).replace(/^-+|-+$/g,``).slice(0,80)||`export`}function ye(e){return e.filter(e=>e.status!==`ok`).map(e=>{let t={name:e.name,status:e.status,detail:e.detail||e.name,impact:be(e),subjects:e.subjects||[],actions:[{label:`Inspect logs`,icon:`FileSearch`,copy:`agent-relay daemon logs`},{label:`Restart daemon`,icon:`RefreshCw`,copy:`agent-relay daemon restart`},{label:`Copy env`,icon:`Copy`,copy:`agent-relay doctor`}]};return e.name===`stale-live-agents`?t.actions.unshift({label:`Run reaper`,icon:`Eraser`,api:`POST`,path:`/system/reap`},{label:`Show stale`,icon:`Filter`,view:`agents`,preset:`offline_stale`}):e.name===`channel-delivery-targets`?t.actions.unshift({label:`Open channels`,icon:`MessagesSquare`,view:`channels`},{label:`Run reaper`,icon:`Eraser`,api:`POST`,path:`/system/reap`}):[`expired-message-claims`,`expired-task-claims`,`offline-claimed-tasks`].includes(e.name)&&t.actions.unshift({label:`Run reaper`,icon:`Eraser`,api:`POST`,path:`/system/reap`},{label:`Open work`,icon:`ListChecks`,view:`work`}),t})}function be(e){return{database:`Relay persistence is unavailable; messages, state, and audit writes may fail.`,"stale-live-agents":`Agents may look online even though their heartbeat has stopped.`,"expired-message-claims":`Claimable messages may be stuck until the reaper releases expired claims.`,"expired-task-claims":`Tasks can appear owned by agents that no longer hold a live lease.`,"offline-claimed-tasks":`Offline agents are still shown as owners for active work.`,"channel-delivery-targets":`Inbound channel messages may be accepted but routed to no live delivery agent.`}[e.name]||`Relay health is degraded for this check.`}function xe(e){return{success:`text-emerald-400`,warning:`text-yellow-400`,danger:`text-red-400`,info:`text-blue-400`,primary:`text-blue-400`,secondary:`text-zinc-400`}[e]||`text-zinc-400`}function Se(e,t){return!e||e.status===`offline`?`bg-zinc-500 opacity-50`:typeof e.meta?.lifecycleAction==`string`&&e.meta.lifecycleAction.startsWith(`finalizing-`)?`bg-amber-500 animate-pulse`:e.meta?.lifecycleAction===`shutting-down`||e.meta?.lifecycleAction===`restarting`?`bg-yellow-500 animate-pulse`:e.meta?.lifecycleAction===`killing`||X(e)?`bg-red-500 animate-pulse`:e.status===`busy`?`bg-yellow-500`:t&&E(t,e)?`bg-red-500 animate-pulse`:e.ready?`bg-emerald-500 shadow-[0_0_6px_theme(colors.emerald.500)]`:`bg-emerald-500 animate-pulse`}function Ce(e,t,n){if(typeof document>`u`||typeof URL>`u`||typeof Blob>`u`)return;let r=URL.createObjectURL(new Blob([t],{type:n})),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}export{s as $,x as A,b as B,V as C,F as D,G as E,re as F,y as G,ge as H,X as I,m as J,M as K,Y as L,he as M,me as N,J as O,L as P,r as Q,W as R,K as S,H as T,h as U,Se as V,xe as W,p as X,f as Y,o as Z,B as _,D as a,n as at,U as b,fe as c,d as ct,N as d,c as et,P as f,ye as g,_e as h,le as i,t as it,v as j,z as k,pe as l,a as lt,de as m,A as n,l as nt,T as o,ee as ot,Ce as p,ne as q,ce as r,e as rt,Q as s,te as st,Z as t,u as tt,ae as u,$ as v,I as w,q as x,E as y,ve as z};
|
|
3
|
+
//# sourceMappingURL=display-ConJ9cJB.js.map
|