All checks were successful
CI/CD / detect-changes (pull_request) Successful in 4s
CI/CD / test-frontend (pull_request) Successful in 5s
CI/CD / test-go-pg (pull_request) Successful in 2m12s
CI/CD / test-sqlite (pull_request) Successful in 2m45s
CI/CD / build-and-deploy (pull_request) Successful in 1m18s
Provider-era cruft: token_budget_daily, token_budget_monthly, and allowed_models columns removed from groups table (both dialects). ResolveTokenBudget() and ResolveModelAllowlist() deleted. GroupPatch trimmed to name/description/permissions. Admin groups UI simplified to permissions-only. -283 lines. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.3 KiB
5.3 KiB
Changelog
All notable changes to Switchboard Core are documented here.
[Unreleased] — v0.2.0
Added
- Admin → RBAC group migration:
surface.admin.accesspermission replaces hardcodedrole == "admin"checks. Seeded "Admins" system group carries all platform permissions. Admin middleware now resolves grants through the standard permission system — no special-casing. Any group can grantsurface.admin.access. AdminsGroupIDconstant (00000000-0000-0000-0000-000000000002)SyncAdminsGroupMembership()— shared helper used by bootstrap, seed, OIDC, and admin handlers to keep group membership in sync with role changesSeedAdminsGroupMember()test helper- System groups re-seeded after
TruncateAllin test helper
Changed
RequireAdmin()/RequireAdminPage()now acceptstore.Storesand checksurface.admin.accessgrant instead ofrole == "admin"RequirePermission()no longer bypasses checks for admin role — admins get permissions through group membership like everyone else- Bootstrap/seed/OIDC login all add admin users to Admins group
- Admin create/update/delete handlers sync Admins group membership on role change
- Demotion/deletion safeguards count Admins group members instead of
CountByRole - Kernel permissions: 6 → 7 (added
surface.admin.access)
Removed
- Token budgets from groups:
token_budget_daily,token_budget_monthlycolumns,ResolveTokenBudget(), and all store/handler/UI code. Provider-era cruft — token budgets belong in a future provider extension, not the kernel. - Allowed models from groups:
allowed_modelscolumn,ResolveModelAllowlist(),toggleModelUI. Same rationale. GroupPatchfields:ClearBudgetDaily,ClearBudgetMonthly,ClearAllowedModels— no longer needed- Admin groups UI: Token Budgets section, Allowed Models section, models API call
Migration notes
- 002_teams.sql (both dialects): added Admins group seed, removed
token_budget_daily,token_budget_monthly,allowed_modelscolumns - No new migration files — edited in place per pre-MVP policy
[v0.1.0] — 2026-03-26
Forked from chat-switchboard v0.38.5. Gutted to a pure extension platform.
Removed
- AI/Chat system: providers, model catalog, routing policies, personas, channels, messages, completion streaming, tool loop, compaction, memory, knowledge bases, notes, workspaces, projects, folders, files, export/import
- Task scheduler: entire scheduler package, task store, task handlers. Tasks will be rebuilt as a Starlark extension with three trigger primitives (time, webhook, event)
- Session system: channel-based anonymous sessions. Workflow instances will get new storage in v0.2.0
- Health accumulator: provider health windows, tool health tracking. Replaced with kernel-only Prune (ws_tickets, rate_limit_counters, presence)
- 15 Go packages: tools, compaction, extraction, roles, mentions, notelinks, export, memory, knowledge, providers, routing, capabilities, filters, retention, workspace
- 29 handler files, 6 test files, ~44K lines total
Fixed
- CI deploy: k8s resource quantity vars (
BE_MEMORY_REQUEST→MEMORY_REQUEST) aligned with CI workflow outputs —envsubstwas producing empty strings - CI deploy: image var (
BE_IMAGE→IMAGE) — causedInvalidImageNamein pods - CI rollout: deployment name (
switchboard→switchboard-be) — rollout verification was looking for wrong deployment name - Nginx BASE_PATH: regex cache-header locations intercepted static asset requests before alias could strip the sub-path prefix — moved inside alias block
- Post-login blank page: dead Go template references (
surface-chat,surface-notes,surface-projects) caused html/template to silently produce Content-Length: 0 responses - Login branding: "Chat Switchboard" → "Switchboard Core", updated tagline and feature pills to reflect platform pivot
Changed
- Module renamed:
chat-switchboard→switchboard-core - VERSION:
0.1.0 - Default DB name:
switchboard_core - Fresh migrations: 9 files × 2 dialects (postgres + sqlite), 27 tables
- Store interfaces: 40 → 20 (13 in interfaces.go + 7 in separate iface files)
- Stage modes:
chat_onlyremoved,customadded - Task output modes:
channel|note|webhook→notification|webhook|log - Kernel permissions: 16 → 6 (
extension.use,extension.install,workflow.create,workflow.submit,admin.view,token.unlimited) - Everyone group seed:
["extension.use","workflow.submit"] - Global settings seed: site name "Switchboard Core"
- Config: removed 7 dropped fields (SessionExpiryDays, WorkflowStaleHours, ProviderAutoDisableThreshold, ExtractionConcurrency, etc.)
- Health stores rewritten: kernel-only Prune for stale tickets, counters, presence
- Maintenance goroutine replaces scheduler for background cleanup
Retained
- Identity & auth (builtin, mTLS, OIDC)
- Teams, groups, permissions
- Package system (surfaces, extensions, libraries, workflows)
- Starlark sandbox with capability-gated modules
- Extension connections & dependencies
- Workflow definitions, stages, versions
- Notifications & preferences
- Audit log
- Object storage (PVC, S3)
- WebSocket hub & presence
- Multi-replica HA (ws_tickets, rate_limit_counters)
- Frontend shell (preact+htm, SDK, vendor libs)