Major feature additions across backend and frontend: Backend: - Unix domain socket admin server with JSON-RPC protocol - CLI subcommands: user/agent management, audit, backup, messages, channels - Managed API keys (sb_ prefix) with permissions, channel limits, expiry - Thread/reply support in messaging core (reply_to column) - Context-based trace owner_id propagation for proper audit filtering - Two-step auth middleware supporting both agent keys and managed API keys Frontend: - Complete Slack-like dark theme redesign with custom CSS properties - Sidebar with Channels, Direct Messages, and Admin sections - Thread panel (slide-in) for viewing message replies - API key management page with create form, key display, and ready-to-use MCP/Claude Code config snippets with copy-to-clipboard - All pages restyled: login, dashboard, agents, conversations, settings E2E Tests: - Fixed test runner binary path resolution - Added pyproject.toml for test dependencies Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
23 lines
1.1 KiB
SQL
23 lines
1.1 KiB
SQL
-- API key management with permissions
|
|
-- Supports user-level and agent-level API keys with fine-grained permissions
|
|
|
|
CREATE TABLE IF NOT EXISTS api_keys (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
agent_id INTEGER REFERENCES agents(id), -- NULL = user-level key
|
|
name TEXT NOT NULL, -- human-readable label
|
|
key_prefix TEXT NOT NULL, -- first 8 chars for identification
|
|
key_hash TEXT NOT NULL, -- bcrypt hash of full key
|
|
permissions TEXT NOT NULL DEFAULT '{}', -- JSON: {"read": true, "write": true, "admin": false}
|
|
allowed_channels TEXT NOT NULL DEFAULT '[]', -- JSON array of channel names, empty = all
|
|
read_only INTEGER NOT NULL DEFAULT 0,
|
|
expires_at TIMESTAMP, -- NULL = never expires
|
|
last_used_at TIMESTAMP,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
revoked_at TIMESTAMP -- soft-delete
|
|
);
|
|
|
|
CREATE INDEX idx_api_keys_user ON api_keys(user_id);
|
|
CREATE INDEX idx_api_keys_agent ON api_keys(agent_id);
|
|
CREATE INDEX idx_api_keys_prefix ON api_keys(key_prefix);
|