agent-relay-server 0.120.6 → 0.121.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/openapi.json +1 -1
- package/package.json +5 -4
- package/public/assets/{MessageBubble-So86mU9-.js → MessageBubble-CLqxCG9b.js} +2 -2
- package/public/assets/{MessageBubble-So86mU9-.js.map → MessageBubble-CLqxCG9b.js.map} +1 -1
- package/public/assets/{PlanGraphPanel-DBZYAsww.js → PlanGraphPanel-BkkToFEb.js} +2 -2
- package/public/assets/{PlanGraphPanel-DBZYAsww.js.map → PlanGraphPanel-BkkToFEb.js.map} +1 -1
- package/public/assets/{activity-CZNwmXg1.js → activity-D-ocGQGs.js} +2 -2
- package/public/assets/{activity-CZNwmXg1.js.map → activity-D-ocGQGs.js.map} +1 -1
- package/public/assets/{agent-profiles-BhadoGwi.js → agent-profiles-CRPgYTyb.js} +2 -2
- package/public/assets/{agent-profiles-BhadoGwi.js.map → agent-profiles-CRPgYTyb.js.map} +1 -1
- package/public/assets/{agents-DWn1xx9x.js → agents-Chw5E_2q.js} +2 -2
- package/public/assets/{agents-DWn1xx9x.js.map → agents-Chw5E_2q.js.map} +1 -1
- package/public/assets/{analytics-DifGnk7q.js → analytics-BmNDG0hR.js} +2 -2
- package/public/assets/{analytics-DifGnk7q.js.map → analytics-BmNDG0hR.js.map} +1 -1
- package/public/assets/{automation-BExrtKkb.js → automation-D7g90kTv.js} +2 -2
- package/public/assets/{automation-BExrtKkb.js.map → automation-D7g90kTv.js.map} +1 -1
- package/public/assets/{branch-state-badge-CyC5Qrhc.js → branch-state-badge-Bv7DhLBZ.js} +2 -2
- package/public/assets/{branch-state-badge-CyC5Qrhc.js.map → branch-state-badge-Bv7DhLBZ.js.map} +1 -1
- package/public/assets/{channels-BLkdt2XR.js → channels-CLwPeEPi.js} +2 -2
- package/public/assets/{channels-BLkdt2XR.js.map → channels-CLwPeEPi.js.map} +1 -1
- package/public/assets/{chat-C7OhKtr6.js → chat-Cgj7VKzc.js} +2 -2
- package/public/assets/{chat-C7OhKtr6.js.map → chat-Cgj7VKzc.js.map} +1 -1
- package/public/assets/{connectors-C0n12Je8.js → connectors-Br6fiTny.js} +2 -2
- package/public/assets/{connectors-C0n12Je8.js.map → connectors-Br6fiTny.js.map} +1 -1
- package/public/assets/{formatted-body-BCQT2qSb.js → formatted-body-CmkuD23M.js} +3 -3
- package/public/assets/{formatted-body-BCQT2qSb.js.map → formatted-body-CmkuD23M.js.map} +1 -1
- package/public/assets/{formatted-body-impl-Bk7wnESl.js → formatted-body-impl-DbdFmbwW.js} +2 -2
- package/public/assets/{formatted-body-impl-Bk7wnESl.js.map → formatted-body-impl-DbdFmbwW.js.map} +1 -1
- package/public/assets/{index-CRraCeo_.js → index-D9OogaB5.js} +6 -6
- package/public/assets/{index-CRraCeo_.js.map → index-D9OogaB5.js.map} +1 -1
- package/public/assets/{insights-DEgES6jz.js → insights-qvaPqWCV.js} +2 -2
- package/public/assets/{insights-DEgES6jz.js.map → insights-qvaPqWCV.js.map} +1 -1
- package/public/assets/{integrations-v14ehskT.js → integrations-DYEGSqq_.js} +2 -2
- package/public/assets/{integrations-v14ehskT.js.map → integrations-DYEGSqq_.js.map} +1 -1
- package/public/assets/{maintenance-BgVB6_gO.js → maintenance-C0HIEB-J.js} +2 -2
- package/public/assets/{maintenance-BgVB6_gO.js.map → maintenance-C0HIEB-J.js.map} +1 -1
- package/public/assets/{managed-agents-8_NKSkhI.js → managed-agents-DdS7aI38.js} +2 -2
- package/public/assets/{managed-agents-8_NKSkhI.js.map → managed-agents-DdS7aI38.js.map} +1 -1
- package/public/assets/{markdown-preview-impl-yxQkrd2M.js → markdown-preview-impl-BnXMH1z1.js} +2 -2
- package/public/assets/{markdown-preview-impl-yxQkrd2M.js.map → markdown-preview-impl-BnXMH1z1.js.map} +1 -1
- package/public/assets/{memory-CJD8eekg.js → memory-CSwx7bz8.js} +2 -2
- package/public/assets/{memory-CJD8eekg.js.map → memory-CSwx7bz8.js.map} +1 -1
- package/public/assets/{messages-DLHMZbHZ.js → messages-Be9CmvDv.js} +2 -2
- package/public/assets/{messages-DLHMZbHZ.js.map → messages-Be9CmvDv.js.map} +1 -1
- package/public/assets/{orchestrators-DEOep7FX.js → orchestrators-BgtvvHvo.js} +2 -2
- package/public/assets/{orchestrators-DEOep7FX.js.map → orchestrators-BgtvvHvo.js.map} +1 -1
- package/public/assets/{overview-BgpfO6mt.js → overview-BvhbPWtF.js} +2 -2
- package/public/assets/{overview-BgpfO6mt.js.map → overview-BvhbPWtF.js.map} +1 -1
- package/public/assets/{pairs-8NVKHh96.js → pairs-CpXSOMx0.js} +2 -2
- package/public/assets/{pairs-8NVKHh96.js.map → pairs-CpXSOMx0.js.map} +1 -1
- package/public/assets/{projects-CZJW35C7.js → projects-DdPNPFJI.js} +2 -2
- package/public/assets/{projects-CZJW35C7.js.map → projects-DdPNPFJI.js.map} +1 -1
- package/public/assets/{prompt-settings-fqyLwUa-.js → prompt-settings-BpZse7-X.js} +2 -2
- package/public/assets/{prompt-settings-fqyLwUa-.js.map → prompt-settings-BpZse7-X.js.map} +1 -1
- package/public/assets/{registry-BKbLL4mO.js → registry-pb1gTZEg.js} +2 -2
- package/public/assets/{registry-BKbLL4mO.js.map → registry-pb1gTZEg.js.map} +1 -1
- package/public/assets/{security-BlTFTbq0.js → security-BgcX1n9D.js} +2 -2
- package/public/assets/{security-BlTFTbq0.js.map → security-BgcX1n9D.js.map} +1 -1
- package/public/assets/{select-Zd_qh0uU.js → select-DZPVpKPv.js} +2 -2
- package/public/assets/{select-Zd_qh0uU.js.map → select-DZPVpKPv.js.map} +1 -1
- package/public/assets/{settings-nHuSVRkL.js → settings-hd5kzdRB.js} +4 -4
- package/public/assets/settings-hd5kzdRB.js.map +1 -0
- package/public/assets/store-DKTLubBT.js +9 -0
- package/public/assets/store-DKTLubBT.js.map +1 -0
- package/public/assets/{tasks-C3JhQ8vB.js → tasks-C5d2LU5E.js} +2 -2
- package/public/assets/{tasks-C3JhQ8vB.js.map → tasks-C5d2LU5E.js.map} +1 -1
- package/public/assets/{teams-C9E9Yt39.js → teams-B8f2pGJe.js} +2 -2
- package/public/assets/{teams-C9E9Yt39.js.map → teams-B8f2pGJe.js.map} +1 -1
- package/public/assets/{terminal-viewer-impl-FP0JlsvS.js → terminal-viewer-impl-CxAscH0U.js} +2 -2
- package/public/assets/{terminal-viewer-impl-FP0JlsvS.js.map → terminal-viewer-impl-CxAscH0U.js.map} +1 -1
- package/public/assets/types-uVOXgvMT.js.map +1 -1
- package/public/assets/{work-queue-Ema7Hy3s.js → work-queue-9imc7aNK.js} +2 -2
- package/public/assets/{work-queue-Ema7Hy3s.js.map → work-queue-9imc7aNK.js.map} +1 -1
- package/public/assets/{workspaces-DI317fMk.js → workspaces-CLYc3yF3.js} +2 -2
- package/public/assets/{workspaces-DI317fMk.js.map → workspaces-CLYc3yF3.js.map} +1 -1
- package/public/index.html +3 -3
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/plugins/claude/monitors/relay-monitor.provisioned.mjs +4 -0
- package/src/agent-card-projection.ts +39 -9
- package/src/agent-issue-repo.ts +10 -3
- package/src/agent-lifecycle-events.ts +23 -1
- package/src/agent-ref.ts +18 -3
- package/src/bus-outbox.ts +74 -1
- package/src/bus.ts +84 -5
- package/src/channel-target.ts +4 -0
- package/src/cli/steward.ts +15 -14
- package/src/commands-db.ts +63 -9
- package/src/config-store.ts +2 -0
- package/src/config.ts +54 -0
- package/src/db/claim-sql.ts +16 -0
- package/src/db/connection.ts +3 -1
- package/src/db/continuations.ts +44 -3
- package/src/db/index.ts +1 -0
- package/src/db/maintenance-worker.ts +91 -0
- package/src/db/message-reads.ts +34 -4
- package/src/db/messages.ts +147 -8
- package/src/db/migrations.ts +7 -0
- package/src/db/pairs.ts +1 -0
- package/src/db/retention.ts +130 -0
- package/src/db/schema.ts +11 -0
- package/src/db/stats.ts +22 -0
- package/src/event-loop-lag.ts +90 -0
- package/src/gate-resolver.ts +124 -0
- package/src/lifecycle-manager.ts +41 -10
- package/src/lifecycle-signal-registry.ts +87 -0
- package/src/maintenance/constants.ts +5 -1
- package/src/maintenance/jobs.ts +48 -8
- package/src/maintenance/workspaces.ts +75 -44
- package/src/managed-policy-escalation.ts +68 -3
- package/src/mcp/tools-spawn.ts +16 -6
- package/src/mcp-plan-tools.ts +2 -3
- package/src/notification-settings.ts +11 -0
- package/src/notification-types.ts +4 -0
- package/src/operator-alarm.ts +37 -0
- package/src/retention-config-store.ts +32 -0
- package/src/retention-config.ts +58 -0
- package/src/routes/agents.ts +4 -0
- package/src/routes/messages.ts +13 -1
- package/src/routes/orchestrator-proxy.ts +13 -1
- package/src/routes/orchestrator.ts +4 -0
- package/src/routing-policy-store.ts +11 -1
- package/src/security.ts +20 -0
- package/src/self-resume.ts +185 -21
- package/src/server.ts +4 -0
- package/src/services/plan-graph.ts +42 -12
- package/src/services/register-agent.ts +5 -1
- package/src/services/send-message.ts +99 -21
- package/src/services/spawn-agent.ts +21 -2
- package/src/services/spawn-registration-watchdog.ts +74 -9
- package/src/services/task-semantic-events.ts +17 -1
- package/src/settings/registry.ts +11 -0
- package/src/spawn-command.ts +3 -0
- package/src/spawn-targets.ts +26 -1
- package/src/sse.ts +67 -14
- package/src/workspace-auto-merge.ts +90 -34
- package/src/workspace-escalation.ts +52 -3
- package/src/workspace-human-escalation.ts +68 -0
- package/src/workspace-orphans.ts +11 -6
- package/src/workspace-phase.ts +22 -1
- package/public/assets/settings-nHuSVRkL.js.map +0 -1
- package/public/assets/store-nXGxgz2Q.js +0 -9
- package/public/assets/store-nXGxgz2Q.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channels-BLkdt2XR.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"}
|
|
1
|
+
{"version":3,"file":"channels-CLwPeEPi.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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"}
|