diff --git a/src/frontend/src/components/ChannelConfigDialog.vue b/src/frontend/src/components/ChannelConfigDialog.vue
new file mode 100644
index 000000000..dfd5cf8aa
--- /dev/null
+++ b/src/frontend/src/components/ChannelConfigDialog.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ icon }}
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/frontend/src/components/ChannelConfigRow.vue b/src/frontend/src/components/ChannelConfigRow.vue
new file mode 100644
index 000000000..34e3b83bc
--- /dev/null
+++ b/src/frontend/src/components/ChannelConfigRow.vue
@@ -0,0 +1,90 @@
+
+
+
+
{{ icon }}
+
+
+
+
{{ title }}
+
+
+
+ Checking…
+
+
+
+ {{ status.label || 'Connected' }}
+ · setup needed
+
+
+
+ Not connected
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/frontend/src/components/SharingPanel.vue b/src/frontend/src/components/SharingPanel.vue
index 4ea8becd1..379101241 100644
--- a/src/frontend/src/components/SharingPanel.vue
+++ b/src/frontend/src/components/SharingPanel.vue
@@ -96,33 +96,53 @@
-
+
Channels
- Connect this agent to messaging channels. Expand a row to configure it.
+ Connect this agent to messaging channels. Use Configure to set one up.
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
@@ -152,6 +172,7 @@ import { useAuthStore } from '../stores/auth'
import { useNotification } from '../composables'
import { useSessionsStore } from '../stores/sessions'
import ChannelDisclosure from './ChannelDisclosure.vue'
+import ChannelConfigRow from './ChannelConfigRow.vue'
import PublicLinksPanel from './PublicLinksPanel.vue'
import SlackChannelPanel from './SlackChannelPanel.vue'
import TelegramChannelPanel from './TelegramChannelPanel.vue'
@@ -182,6 +203,30 @@ const loadAgent = () => {
emit('agent-updated')
}
+// ---------------------------------------------------------------------------
+// Channel summary-row status derivations (#19). Each maps a channel's GET
+// response to { connected, label, warn } for the compact row; the full config
+// panel renders in the row's Configure dialog.
+// ---------------------------------------------------------------------------
+const slackStatus = (d) => ({
+ connected: !!d?.bound,
+ label: d?.bound ? `#${d.channel_name}` : '',
+})
+const telegramStatus = (d) => ({
+ connected: !!d?.configured,
+ label: d?.configured && d.bot_username ? `@${d.bot_username}` : '',
+ warn: !!d?.configured && !d?.webhook_url,
+})
+const whatsappStatus = (d) => ({
+ connected: !!d?.configured,
+ label: d?.configured ? (d.from_number || '') : '',
+})
+const voipStatus = (d) => ({
+ connected: !!d?.configured,
+ label: d?.configured ? `${d.from_number || ''}${d.enabled ? '' : ' (disabled)'}` : '',
+ warn: !!d?.configured && !d?.enabled,
+})
+
// ---------------------------------------------------------------------------
// External access policy + pending requests (Issue #311, reframed by #18)
// ---------------------------------------------------------------------------