Skip to content

Releases: ChrisRomp/copilot-bridge

0.13.0

03 Apr 00:48
d9d2ecd

Choose a tag to compare

Pluggable storage, /config command, and error observability

Features

  • Pluggable StateStore interface -- The bridge's state persistence is now behind a StateStore interface with 35 methods including withTransaction(). Custom backends (Postgres, Redis, etc.) can be loaded at startup via the database.module config option. The built-in SqliteStateStore remains the default. (#179, #176)

  • /config command -- 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 in session-manager.ts and index.ts. Every catch now emits at minimum log.debug. High-severity catches (user-visible failures like readPlan, getAuthStatus, listModels) emit log.warn. Added safeDestroySession() helper to replace 8 identical silent destroy patterns. (#185, #178)

Dependencies

  • @mattermost/client 10.3.0 -> 11.5.0
  • @mattermost/types 10.3.0 -> 11.5.0
  • vitest 4.1.1 -> 4.1.2

Tests

683 tests (up from 659 in 0.12.2)

0.12.2

31 Mar 18:27
f12d91a

Choose a tag to compare

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 source

Without 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-service removes leftover newsyslog configs automatically
  • Permissions set to 0600 on log files

Configure in config.json:

{
  "logging": {
    "maxSize": "10MB",
    "maxFiles": 5,
    "compress": true
  }
}

Closes #168.

Dependency Updates

  • ws 8.19.0 -> 8.20.0
  • cronstrue 3.13.0 -> 3.14.0
  • vitest 4.1.0 -> 4.1.1
  • picomatch 4.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

26 Mar 16:23
07f4795

Choose a tag to compare

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 telemetry section in config.json with otlpEndpoint, sourceName, captureContent, and authEnv fields. (#151)
  • Auth support -- authEnv resolves credentials from workspace .env files, scoped to the CLI subprocess only (not leaked to hooks or other child processes).
  • Documentation -- new telemetry topic in the fetch_copilot_bridge_documentation tool 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

25 Mar 04:50
30bd3c8

Choose a tag to compare

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 /reload to apply")
  • /reasoning -- changes reasoning effort via setModel() 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

  • skipPermission on bridge custom tools (read-only and workspace-bounded tools skip the interactive permission prompt)
  • Agent pre-selection via SessionConfig.agent on 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

23 Mar 20:33

Choose a tag to compare

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" in config.json. Switch between Copilot and BYOK models with /model provider:model-id. (#131, #132)
  • /provider commands -- /provider lists configured providers with auth and model details. /provider test <name> checks connectivity and model availability. (#135)
  • Model-level wireApi override -- 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 wireApi changes 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.json with Azure model-level wireApi example.

Known Limitations

  • /provider test uses OpenAI-compatible /models endpoint; 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

22 Mar 00:05

Choose a tag to compare

v0.10.0

Features

Plan mode UX (#124)

  • /plan show displays the agent's current plan with platform-aware chunking (splits at heading boundaries)
  • /plan summary generates a concise summary via an ephemeral session with a cheap model
  • /implement triggers plan execution with optional yolo mode 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_documentation to 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_REPLY text. 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 (# /context and /status now show the total context window size, not just the used portion.118)

Dependencies

4.1.0
12.8.0

v0.9.2

19 Mar 15:18

Choose a tag to compare

Infinite sessions (#116)

  • New infiniteSessions global config flag (defaults to false) 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_info and session.compaction_start/complete events with token metrics

v0.9.1

17 Mar 21:02

Choose a tag to compare

Per-channel skill toggle (#111)

  • New /skills disable name... and /skills enable name... commands to toggle skills per channel
  • /skills disable all / /skills enable all for bulk toggle
  • Disabled skills persisted in SQLite and passed to SDK on session create/resume- /skills display now groups into
  • Substring matching with ambiguity detection

Stream content preservation (#110)

  • Fix multi-turn responses losing content when empty assistant.message events overwrote the stream
  • Fix turn_start not finalizing orphaned content from the previous turn
  • Fix flushUpdate timer stalling when pending update was empty

v0.9.0

16 Mar 23:18

Choose a tag to compare

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 via allowWorkspaceHooks)
  • Hooks visible in /tools output alongside MCP servers and skills
  • deny hooks short-circuit tool execution; ask hooks trigger an interactive permission prompt in chat
  • Hook permissions always prompt per-invocation (no "always approve" option)
  • Async spawn execution 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 channelThreadRoots map
  • 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

15 Mar 05:33

Choose a tag to compare

What's New

Permission UX overhaul (#103)

  • New /always approve and /always deny commands 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
  • /remember kept 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 plugin source in /skills output