Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3820414166 | ||
|
|
09fa765c2e | ||
|
|
71288f64d8 | ||
|
|
15e7877ea0 |
@@ -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
|
||||
|
||||
Vendored
+6
-6
@@ -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
@@ -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": []
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user