Follow-up fixes for the openbox-governed-copilotkit showcase (#5685):
- Model consistency: agent/.env.example and README now use
gpt-5.4-mini-2026-03-17, and the README no longer claims a "gpt-4o
default" -- the agent has no built-in default and throws when
OPENAI_MODEL is unset (matches openai_config.ts and the cookbook recipe).
- Remove dead, drift-prone constants (WORKFLOW_TYPE, TASK_QUEUE,
CORE_TIMEOUT_MS) from openbox_action_governance.ts -- unused; the live
values are defined in openbox_governance.ts.
- Remove an unreachable OR-operand in normalizeHandoffChoice: the
usage_tier/health_score/expansion_signal field names are stripped by
normalizeFields before this check, so the clause never fired
(behavior-preserving).
- Replace the "Adapted from A's/B's ..." port-artifact comments in both
Dockerfiles with accurate descriptions.
- docker-compose.yml: add optional env_file entries (required: false) so
`docker compose up` works once agent/.env and frontend/.env.local exist.
Verified: agent `tsc --noEmit`, frontend `next build`, `docker compose
config`, and `oxfmt --check` all pass.
Deliberately left for the author (governance/SDK-internal, not safely
changeable without a live backend or the SDK types): the stale
report.*/recommended_focus.* guardrail field paths in
openbox-demo-config.ts, and the `as any` casts on admin SDK calls in
openbox-setup.ts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fr5HVeDzDyC4S6DjyhAFWZ
The StateStore interface and the in-memory MemoryStore default remain;
durable backends can be reintroduced as a follow-up. Both adapter packages
were merged in #5613 but never published to npm, so removal is a clean
delete with no consumer impact.
- Delete packages/bot-store-redis and packages/bot-store-postgres.
- Revert the bot release scope and drift guard to bot + bot-ui.
- Strip the Redis dep, demo:restart script, restart demo, docker-compose,
and REDIS_URL env from examples/slack.
- Rewrite the bot persistence/transcripts docs around "MemoryStore default
+ implement the StateStore interface yourself for durability".
Adds examples/teams: a runnable Teams bot built on @copilotkit/bot-teams.
Demonstrates rendering charts from uploaded CSV files, inbound file
handling over the Graph API, and human-in-the-loop confirmation flows,
plus the Teams app manifest and packaging scripts.
The triage runtime connected its MCP clients with Promise.all, so a single
unreachable/misconfigured server (bad key, sidecar down, hang) rejected the
whole run and surfaced as a fatal "⚠️ Agent error: Failed to connect to
MCP server" — the bot was dead for every request, even ones needing no MCP.
Connect each server independently (Promise.allSettled) with an 8s timeout,
drop the ones that fail, and let the agent run with whatever's left (web search,
rendering, thread reading, and any MCP that did connect). A per-turn system note
lists any down sources so the model only tells the user a source is unreachable
if they actually ask for it, and never invents data. Connections are retried
each turn, so a transient outage self-heals.