4 Commits
Author SHA1 Message Date
Algis DumbrisandClaude Opus 4.6 3820414166 fix: push subscribe sends flat key_p256dh/key_auth matching backend API
Release / Build darwin/amd64 (push) Canceled after 0s
Release / Build linux/amd64 (push) Canceled after 0s
Release / Build darwin/arm64 (push) Canceled after 0s
Release / Build linux/arm64 (push) Canceled after 0s
Release / Generate Homebrew Formula (push) Canceled after 0s
Release / GitHub Release (push) Canceled after 0s
Release / Docker Image (push) Canceled after 0s
Release / Publish to MCP Registry (push) Canceled after 0s
The browser PushSubscription nests keys under .keys but the backend
expects flat key_p256dh and key_auth fields.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 14:28:35 +02:00
Algis DumbrisandClaude Opus 4.6 09fa765c2e build: rebuild embedded dist with v0.7.1 fixes
Release / Build darwin/amd64 (push) Canceled after 0s
Release / Build linux/amd64 (push) Canceled after 0s
Release / Build darwin/arm64 (push) Canceled after 0s
Release / Build linux/arm64 (push) Canceled after 0s
Release / Generate Homebrew Formula (push) Canceled after 0s
Release / GitHub Release (push) Canceled after 0s
Release / Docker Image (push) Canceled after 0s
Release / Publish to MCP Registry (push) Canceled after 0s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 14:23:31 +02:00
Algis DumbrisandClaude Opus 4.6 71288f64d8 fix: push notification toggle, textarea resize, mobile viewport, card alignment
1. Fix push toggle error: VAPID key field name mismatch (public_key → vapid_public_key)
2. Fix textarea auto-resize: proper height reset, overflow handling, mobile Enter
   inserts newline instead of sending (send via button on mobile)
3. Fix mobile viewport overflow: add overflow-x hidden to html/body, overflow-x
   hidden on content container
4. Fix dashboard cards: always 4 columns with responsive text sizing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 14:23:19 +02:00
Algis DumbrisandClaude Opus 4.6 15e7877ea0 Add MCP Registry auto-publish on release
- Add server.json with registry metadata
- Add mcp-registry job to release workflow using GitHub OIDC auth
- Version in server.json is auto-updated from git tag

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:36:42 +02:00
9 changed files with 82 additions and 34 deletions
+26
View File
@@ -8,6 +8,7 @@ on:
permissions:
contents: write
packages: write
id-token: write
env:
GO_VERSION: "1.25"
@@ -217,3 +218,28 @@ jobs:
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
mcp-registry:
name: Publish to MCP Registry
needs: release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Extract version from tag
id: version
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
- name: Install mcp-publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_amd64.tar.gz" | tar xz mcp-publisher
- name: Authenticate to MCP Registry
run: ./mcp-publisher login github-oidc
- name: Update version in server.json
run: |
jq --arg v "${{ steps.version.outputs.VERSION }}" '.version = $v' server.json > server.tmp && mv server.tmp server.json
- name: Publish to MCP Registry
run: ./mcp-publisher publish
+6 -6
View File
@@ -11,30 +11,30 @@
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Instrument+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link href="/_app/immutable/entry/start.BuSotqBe.js" rel="modulepreload">
<link href="/_app/immutable/chunks/CoA7yCjK.js" rel="modulepreload">
<link href="/_app/immutable/entry/start.Brt_7G-i.js" rel="modulepreload">
<link href="/_app/immutable/chunks/B_GGgm-X.js" rel="modulepreload">
<link href="/_app/immutable/chunks/BjgrqnN-.js" rel="modulepreload">
<link href="/_app/immutable/chunks/CAWWRzNH.js" rel="modulepreload">
<link href="/_app/immutable/chunks/B-GqcZrE.js" rel="modulepreload">
<link href="/_app/immutable/chunks/DpGxxGDS.js" rel="modulepreload">
<link href="/_app/immutable/chunks/3PInzq4O.js" rel="modulepreload">
<link href="/_app/immutable/chunks/qakGnb92.js" rel="modulepreload">
<link href="/_app/immutable/entry/app.B5srta30.js" rel="modulepreload">
<link href="/_app/immutable/entry/app.n45Hd8qT.js" rel="modulepreload">
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">
<script>
{
__sveltekit_1blyclv = {
__sveltekit_nj28a9 = {
base: ""
};
const element = document.currentScript.parentElement;
Promise.all([
import("/_app/immutable/entry/start.BuSotqBe.js"),
import("/_app/immutable/entry/app.B5srta30.js")
import("/_app/immutable/entry/start.Brt_7G-i.js"),
import("/_app/immutable/entry/app.n45Hd8qT.js")
]).then(([kit, app]) => {
kit.start(app, element);
});
+11
View File
@@ -0,0 +1,11 @@
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.synapbus/synapbus",
"description": "MCP-native agent-to-agent messaging hub with channels, DMs, and semantic search",
"repository": {
"url": "https://github.com/synapbus/synapbus",
"source": "github"
},
"version": "0.7.0",
"packages": []
}
+4
View File
@@ -20,6 +20,10 @@
}
@layer base {
html, body {
overflow-x: hidden;
max-width: 100vw;
}
body {
font-family: 'DM Sans', sans-serif;
background-color: var(--bg-primary);
+2 -2
View File
@@ -219,11 +219,11 @@ export const version = {
// Push notifications
export const push = {
subscribe: (subscription: { endpoint: string; keys: { p256dh: string; auth: string } }) =>
subscribe: (subscription: { endpoint: string; key_p256dh: string; key_auth: string }) =>
request<{ id: number; message: string }>('POST', '/api/push/subscribe', subscription),
unsubscribe: (endpoint: string) =>
request<{ message: string }>('DELETE', '/api/push/subscribe', { endpoint }),
vapidKey: () => request<{ public_key: string }>('GET', '/api/push/vapid-key')
vapidKey: () => request<{ vapid_public_key: string }>('GET', '/api/push/vapid-key')
};
// User profile
+15 -6
View File
@@ -55,20 +55,29 @@
function autoResize() {
if (!textareaEl) return;
textareaEl.style.height = 'auto';
// Reset to measure true scrollHeight
textareaEl.style.height = '80px';
const maxHeight = 240; // ~12 lines
const scrollHeight = textareaEl.scrollHeight;
if (scrollHeight > maxHeight) {
textareaEl.style.height = maxHeight + 'px';
textareaEl.style.overflowY = 'auto';
textareaEl.classList.remove('overflow-hidden');
} else {
textareaEl.style.height = scrollHeight + 'px';
textareaEl.style.height = Math.max(80, scrollHeight) + 'px';
textareaEl.style.overflowY = 'hidden';
textareaEl.classList.add('overflow-hidden');
}
}
function isMobile(): boolean {
return typeof window !== 'undefined' && window.innerWidth < 768;
}
function handleKeydown(e: KeyboardEvent) {
if (e.key === 'Enter' && !e.shiftKey) {
// On mobile, Enter inserts newline (send via button only)
// On desktop, Enter sends, Shift+Enter inserts newline
if (e.key === 'Enter' && !e.shiftKey && !isMobile()) {
e.preventDefault();
handleSubmit();
}
@@ -161,9 +170,9 @@
<!-- Message body -->
<textarea
bind:this={textareaEl}
placeholder="Write a message..."
class="w-full px-4 py-3 bg-transparent text-sm text-text-primary placeholder-text-secondary resize-none outline-none"
style="min-height: 72px; max-height: 240px;"
placeholder="Write a message... {isMobile() ? '' : '(Shift+Enter for new line)'}"
class="w-full px-4 py-3 bg-transparent text-sm text-text-primary placeholder-text-secondary resize-none outline-none overflow-hidden"
style="min-height: 80px; max-height: 240px;"
bind:value={body}
rows="3"
onkeydown={handleKeydown}
+1 -1
View File
@@ -101,7 +101,7 @@
{:else if $user}
<div class="h-screen flex overflow-hidden bg-bg-primary">
<Sidebar open={sidebarOpen} onclose={() => (sidebarOpen = false)} />
<div class="md:ml-[260px] flex-1 flex flex-col min-w-0">
<div class="md:ml-[260px] flex-1 flex flex-col min-w-0 overflow-x-hidden">
<Header onMenuToggle={() => (sidebarOpen = !sidebarOpen)} />
<main class="flex-1 overflow-y-auto flex flex-col">
{@render children()}
+14 -14
View File
@@ -91,7 +91,7 @@
});
</script>
<div class="p-5 max-w-6xl">
<div class="p-3 md:p-5 max-w-6xl w-full">
<!-- Top bar -->
<div class="flex items-center justify-between mb-5">
<div>
@@ -120,22 +120,22 @@
{/if}
<!-- Summary Cards -->
<div class="grid grid-cols-2 md:grid-cols-4 gap-3 mb-5">
<div class="card p-4">
<p class="text-xs text-text-secondary mb-1">Total Messages</p>
<p class="text-2xl font-bold text-text-primary font-display">{loadingData ? '-' : summary.total_messages}</p>
<div class="grid grid-cols-4 gap-2 md:gap-3 mb-5">
<div class="card p-3 md:p-4">
<p class="text-[10px] md:text-xs text-text-secondary mb-1">Messages</p>
<p class="text-lg md:text-2xl font-bold text-text-primary font-display">{loadingData ? '-' : summary.total_messages}</p>
</div>
<div class="card p-4">
<p class="text-xs text-text-secondary mb-1">Agents</p>
<p class="text-2xl font-bold text-text-primary font-display">{loadingData ? '-' : summary.total_agents}</p>
<div class="card p-3 md:p-4">
<p class="text-[10px] md:text-xs text-text-secondary mb-1">Agents</p>
<p class="text-lg md:text-2xl font-bold text-text-primary font-display">{loadingData ? '-' : summary.total_agents}</p>
</div>
<div class="card p-4">
<p class="text-xs text-text-secondary mb-1">Channels</p>
<p class="text-2xl font-bold text-text-primary font-display">{loadingData ? '-' : summary.total_channels}</p>
<div class="card p-3 md:p-4">
<p class="text-[10px] md:text-xs text-text-secondary mb-1">Channels</p>
<p class="text-lg md:text-2xl font-bold text-text-primary font-display">{loadingData ? '-' : summary.total_channels}</p>
</div>
<div class="card p-4">
<p class="text-xs text-text-secondary mb-1">Conversations</p>
<p class="text-2xl font-bold text-text-primary font-display">{loadingData ? '-' : recentConversations.length}</p>
<div class="card p-3 md:p-4">
<p class="text-[10px] md:text-xs text-text-secondary mb-1">Convos</p>
<p class="text-lg md:text-2xl font-bold text-text-primary font-display">{loadingData ? '-' : recentConversations.length}</p>
</div>
</div>
+3 -5
View File
@@ -108,15 +108,13 @@
const reg = await navigator.serviceWorker.ready;
const sub = await reg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(keyRes.public_key)
applicationServerKey: urlBase64ToUint8Array(keyRes.vapid_public_key)
});
const subJson = sub.toJSON();
await pushApi.subscribe({
endpoint: sub.endpoint,
keys: {
p256dh: subJson.keys?.p256dh || '',
auth: subJson.keys?.auth || ''
}
key_p256dh: subJson.keys?.p256dh || '',
key_auth: subJson.keys?.auth || ''
});
pushEnabled = true;
}