Releases: ChrisRomp/copilot-bridge
0.13.0
Pluggable storage, /config command, and error observability
Features
-
Pluggable StateStore interface -- The bridge's state persistence is now behind a
StateStoreinterface with 35 methods includingwithTransaction(). Custom backends (Postgres, Redis, etc.) can be loaded at startup via thedatabase.moduleconfig option. The built-inSqliteStateStoreremains the default. (#179, #176) -
/configcommand -- Shows the effective configuration for the current channel in a markdown table with Setting / Value / Source columns. Traces each value back to its origin: defaults, config.json, dynamic registration, bot config, channel prefs, or the active session. (#184)
Improvements
-
Async store layer -- All state store functions are now async. Store writes from post-RPC paths are best-effort so a slow or failed write never blocks session operations. Added error logging and database observability across all store calls. (#177)
-
Error observability -- Eliminated all silent
catch {}blocks insession-manager.tsandindex.ts. Every catch now emits at minimumlog.debug. High-severity catches (user-visible failures likereadPlan,getAuthStatus,listModels) emitlog.warn. AddedsafeDestroySession()helper to replace 8 identical silent destroy patterns. (#185, #178)
Dependencies
@mattermost/client10.3.0 -> 11.5.0@mattermost/types10.3.0 -> 11.5.0vitest4.1.1 -> 4.1.2
Tests
683 tests (up from 659 in 0.12.2)
0.12.2
Upgrade Notice
Re-run install-service after updating to apply the new launchd plist and remove the old newsyslog configuration:
copilot-bridge install-service # npm package
npm run install-service # from sourceWithout this, the old plist will continue redirecting stdout to a file that newsyslog rotates out from under the bridge, causing log loss.
Self-Managed Log Rotation
The bridge now handles its own log rotation instead of relying on macOS newsyslog/launchd. This fixes the long-standing issue where newsyslog would rotate the file out from under the bridge's stdout redirect, causing all subsequent logs to be lost.
- Logs are written synchronously via file descriptor for durability
- Configurable rotation size, max files, and compression via
config.json - Old rotated files are automatically compressed with gzip
install-serviceremoves leftover newsyslog configs automatically- Permissions set to
0600on log files
Configure in config.json:
{
"logging": {
"maxSize": "10MB",
"maxFiles": 5,
"compress": true
}
}Closes #168.
Dependency Updates
ws8.19.0 -> 8.20.0cronstrue3.13.0 -> 3.14.0vitest4.1.0 -> 4.1.1picomatch4.0.3 -> 4.0.4
Note: TypeScript 6.0.2 was skipped due to @mattermost/client peer dependency constraint (^4.3.0 || ^5.0.0).
Other
- Logger rotation tests now use deterministic awaits instead of sleeps (#172)
0.12.1
OpenTelemetry Trace Collection
Added configurable OpenTelemetry trace export. The Copilot CLI's built-in OTel instrumentation exports spans following the GenAI semantic conventions -- model calls with token counts, tool execution timing, and session lifecycle -- to any OTLP HTTP endpoint. See the SDK OTel documentation for details on the underlying instrumentation.
Features
- Telemetry config -- new
telemetrysection inconfig.jsonwithotlpEndpoint,sourceName,captureContent, andauthEnvfields. (#151) - Auth support --
authEnvresolves credentials from workspace.envfiles, scoped to the CLI subprocess only (not leaked to hooks or other child processes). - Documentation -- new
telemetrytopic in thefetch_copilot_bridge_documentationtool with config reference, auth setup, and trace details. - Config reload detection -- telemetry changes are flagged as restart-required during
/reload config.
Compatible Collectors
Tested with OpenObserve. Also compatible with Jaeger, Grafana Tempo, and any OTLP HTTP endpoint.
0.12.0
SDK v0.2.0 Upgrade
Upgraded from @github/copilot-sdk 0.1.32 to 0.2.0, unlocking system prompt customization and new RPC APIs.
System prompt customization
Bridge-specific instructions (channel communication, slash command awareness, .env safety, no_reply convention) are now injected via the SDK's systemMessage.customize API instead of being baked into AGENTS.md templates. This slims agent templates by ~86 lines and means updates no longer require re-onboarding workspaces.
no_reply tool
Replaces the text-based NO_REPLY convention. The agent calls a proper tool when it has nothing to say, eliminating the visible message flicker in chat. Works in both quiet mode (cron jobs) and normal conversations.
Hot-reload commands
New slash commands that use SDK RPCs instead of destroying and recreating the session:
/reload mcp-- reload MCP servers/reload skills-- reload skills/skills enable|disable-- now takes effect instantly (no more "Use/reloadto apply")/reasoning-- changes reasoning effort viasetModel()RPC
All fall back to full session reload if no active session exists.
Startup optimization
Removed the startup nudge system that sent an LLM message to every admin channel on restart. Sessions now resume lazily on first user message.
Other improvements
skipPermissionon bridge custom tools (read-only and workspace-bounded tools skip the interactive permission prompt)- Agent pre-selection via
SessionConfig.agenton session create/resume - Session retry resilience for stale sessions on RPC commands (#139)
- Scoped error suppression for the SDK's post-tool second-turn failure
0.11.0
BYOK Provider Support (Experimental)
Connect your own model providers alongside GitHub Copilot models. Supports OpenAI-compatible APIs, Azure OpenAI, Anthropic, Ollama, vLLM, and any OpenAI-compatible endpoint. Built on the Copilot SDK's BYOK support.
Features
- BYOK providers -- Configure external model providers under
"providers"inconfig.json. Switch between Copilot and BYOK models with/model provider:model-id. (#131, #132) /providercommands --/providerlists configured providers with auth and model details./provider test <name>checks connectivity and model availability. (#135)- Model-level
wireApioverride -- Mix models that need different wire protocols ("completions"vs"responses") on the same provider. Codex models can use"responses"while others default to"completions". (#135) - Provider-aware model resolution -- Bare model names resolve Copilot-first, then BYOK. Provider-prefixed names (e.g.,
ollama:qwen3:8b) target the provider directly. (#132) - Admin agent provider management -- Admin bots get guided help for adding/removing providers via
/provider add. (#135) /help providers-- New bridge docs topic covering BYOK config, commands, and troubleshooting. (#135)
Fixes
- Quiet mode -- Fixed nudge response timing to hold quiet mode open during the nudge cycle. (#129, #130)
- Model listing -- Current model indicator no longer doubles up when a BYOK model shares a name with a Copilot model. (#135)
- BYOK error messages -- Provider-specific error wrapping (unreachable, auth failure, model not found) only triggers when the provider actually resolved, preventing misattribution of Copilot errors. (#135)
- Reasoning effort display -- Suppressed for BYOK models that don't carry reasoning metadata, preventing inherited Copilot model capabilities from showing incorrectly. (#137)
- Same-provider model switch -- Detects per-model
wireApichanges and forces a new session when needed. (#135)
Documentation
- New
docs/byok.md-- Full BYOK setup guide with provider examples (Ollama, Azure, Anthropic), wire API compatibility, model resolution, troubleshooting. - Azure troubleshooting -- SDK URL construction patterns, common 404 causes, auth header differences by provider type.
- Updated
config.sample.jsonwith Azure model-levelwireApiexample.
Known Limitations
/provider testuses OpenAI-compatible/modelsendpoint; may 404 on Azure (#136)- Reasoning effort passthrough to BYOK providers is unverified; display is suppressed until confirmed
- BYOK models are excluded from automatic fallback chains unless explicitly added to
fallbackModels
v0.10.0
v0.10.0
Features
Plan mode UX (#124)
/plan showdisplays the agent's current plan with platform-aware chunking (splits at heading boundaries)/plan summarygenerates a concise summary via an ephemeral session with a cheap model/implementtriggers plan execution with optionalyolomode for unattended runs- Plans are auto-surfaced on creation and update (debounced), and shown on session resume when in plan mode
Bridge documentation tool (#122)
- Agents can call
fetch_copilot_bridge_documentationto look up their own capabilities, commands, and configuration - Covers overview, commands, config, MCP, permissions, workspaces, hooks, skills, inter-agent, and scheduling topics
Bug Fixes
- Quiet mode for NO_REPLY suppression (#127, closes # Startup nudges and scheduled tasks no longer leak "Working..." messages or
NO_REPLYtext. All streaming is suppressed until the response is determined to be real content.119) - Mid-turn steering preserves attachments (#126, closes # Messages with attachments sent while the agent is busy are now queued instead of having their attachments silently dropped.125)
- MCP server cwd defaults to bot workspace (# Local/stdio MCP servers inherit the bot's workspace directory as their working directory unless explicitly configured.120)
- Context window display (#
/contextand/statusnow show the total context window size, not just the used portion.118)
Dependencies
4.1.0
12.8.0
v0.9.2
Infinite sessions (#116)
- New
infiniteSessionsglobal config flag (defaults tofalse) enables SDK automatic context compaction for long-lived channel sessions - Background compaction at 80% context window usage, blocking at 95%
- Hot-reloadable: config changes take effect on next session create/resume
- Debug logging for
session.usage_infoandsession.compaction_start/completeevents with token metrics
v0.9.1
Per-channel skill toggle (#111)
- New
/skills disable name...and/skills enable name...commands to toggle skills per channel /skills disable all//skills enable allfor bulk toggle- Disabled skills persisted in SQLite and passed to SDK on session create/resume-
/skillsdisplay now groups into - Substring matching with ambiguity detection
Stream content preservation (#110)
- Fix multi-turn responses losing content when empty
assistant.messageevents overwrote the stream - Fix
turn_startnot finalizing orphaned content from the previous turn - Fix
flushUpdatetimer stalling when pending update was empty
v0.9.0
What's New
Hooks system (#106, #107)
- Full session hooks support using the official CLI format (shell commands with JSON stdin/stdout)
workspace (opt-in viaallowWorkspaceHooks) - Hooks visible in
/toolsoutput alongside MCP servers and skills denyhooks short-circuit tool execution;askhooks trigger an interactive permission prompt in chat- Hook permissions always prompt per-invocation (no "always approve" option)
- Async
spawnexecution with manual SIGKILL timeout for reliable cleanup
Multi-turn content preservation (#108)
- Fixed a bug where multi-turn streaming responses lost earlier only the last turn's text survived in chatcontent
- Each turn now finalizes as its own chat message on
turn_end, so all content persists - Thread context preserved across turns via
channelThreadRootsmap - Stale thread roots cleaned up on
/new,/stop, errors, and session idle (including mid-turn command paths) - Permission and user-input prompts now save thread context before finalizing streams
v0.8.5
What's New
Permission UX overhaul (#103)
- New
/always approveand/always denycommands for persistent permission rules - Added no_entry_sign reaction for persistent deny via emoji
- Permission prompt now shows explicit command names in monospace for clarity
/rememberkept as backward-compatible alias
Plugin skill discovery (#105)
- Skills from installed plugins (
~/.copilot/installed-plugins/) are now discovered automatically - Plugin skills have lowest priority (user/workspace skills take precedence per CLI spec)
- Plugin skills correctly labeled as
pluginsource in/skillsoutput