- Extract safeCall helper that catches synchronous throws and attaches
.catch() for async (MaybePromise<void>) rejections, preventing
unhandled promise rejections from crashing Node.js (SSR) or producing
cryptic browser errors
- Wrap onMessagesChanged/onStateChanged in the unthrottled path with the
same error protection, so a throwing subscriber cannot corrupt the
agent's notification loop regardless of whether throttling is active
- Simplify flushPending by delegating to safeCall
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Address review findings from PR #3734:
- Wrap flushPending callback invocations in try-catch so a thrown
exception in onMessagesChanged/onStateChanged does not permanently
deadlock the throttle state machine or skip the sibling flush
- Add 21 dedicated unit tests for CopilotKitCore.subscribeToAgent
covering leading/trailing edge, shared window (bidirectional),
burst coalescing, run lifecycle passthrough, unsubscribe cleanup,
resolution cascade, invalid values, and exception safety
- Use named CopilotKitCoreSubscription return type
- Fix Angular test stub to accept the options parameter and document
that it bypasses throttle logic
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Moves the leading+trailing throttle algorithm from the React-specific
useAgent hook into a framework-agnostic subscribeToAgent method on
CopilotKitCore. This consolidates throttle cascade resolution
(throttleMs ?? defaultThrottleMs ?? 0), validation, and the throttle
algorithm into a single location.
Key changes:
- Add subscribeToAgent() to CopilotKitCore with shared throttle gate
for onMessagesChanged and onStateChanged (run lifecycle events are
never throttled)
- Fix setDefaultThrottleMs to log errors and preserve previous value
on invalid input instead of silently erasing
- Simplify useAgent by removing ~60 lines of inline throttle logic
- Angular AgentStore now uses subscribeToAgent, getting throttle
support via provider-level defaultThrottleMs for free
- Remove duplicate validation from CopilotKitProvider useEffect
- Add direct unit tests for CopilotKitCore.setDefaultThrottleMs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Release monorepo v1.56.0
**Scope:** `monorepo` | **Bump:** `minor`
---
### How this release process works
1. **This PR was created automatically** by the "release / create-pr"
workflow.
It bumped the `monorepo` packages to `1.56.0`
and generated AI-enhanced release notes.
2. **CI runs on this PR** — the full test suite (unit tests, lint, type
checks, build)
must pass before merging. This is the review gate.
3. **Review the release notes** in `release-notes.md` in this PR.
If a Notion draft was created, you can edit the release notes there
before merging.
4. **When this PR is merged**, the `release / publish` workflow
automatically:
- Builds all packages
- Publishes the `monorepo` packages to npm at version `1.56.0`
- Creates git tag `monorepo/v1.56.0`
- Creates a GitHub Release with the final release notes
### Before merging
- [ ] CI is green (tests, lint, types, build)
- [ ] Version bumps look correct
- [ ] Release notes are accurate (edit in Notion if a draft was created)
---
> **Do not merge until CI is fully green.** The full test suite runs
automatically on this PR.
## Summary
7 out of 17 Railway-deployed starters are returning 502 (CRASHED). Three
distinct root causes:
1. **EACCES `/home/app`** (langgraph-typescript, claude-sdk-typescript,
mastra) — `npx` at runtime needs a home dir for its cache, but the
non-root `app` user was created with `--no-create-home`. Fix: `mkdir -p
/home/app && chown app:app /home/app` in all 4 Dockerfile templates.
2. **IndexError `Path.parents[4]`** (agno, claude-sdk-python,
ms-agent-python) — `search_flights.py` schema fallback accesses
`parents[4]` but Docker path `/app/agent/tools/search_flights.py` only
has 4 parents (0-3). Fix: wrap in try/except IndexError in shared source
+ regenerate.
3. **Wrong import path** (langroid, crewai-crews) — `from agents.X
import` but starters use `agent/` (singular). `rewritePythonImports()`
in generate-starters.ts now converts these to relative imports.
All fixes applied to upstream sources (templates, shared python,
generation script) so drift check passes.
## Test plan
- [x] 251 generate-starters tests pass
- [x] Drift check passes (`--check`)
- [x] Pre-commit hooks pass (lint, format, unit tests)
- [ ] Deploy to Railway and verify all 17 starters return 200
1. EACCES on /home/app: Dockerfile templates now create home dir for
non-root user before USER app (langgraph-ts, claude-sdk-ts, mastra)
2. IndexError Path.parents[4]: search_flights.py schema fallback now
guards against shallow Docker paths (agno, claude-sdk-py, ms-agent-py)
3. Wrong import path: rewritePythonImports() now converts
from agents.X to relative imports in starter agent dirs (langroid, crewai)
## Summary
- Add `debug` option to `CopilotRuntime` constructor and `<CopilotKit>`
provider for detailed event pipeline logging
- Server-side uses Pino structured logger; client-side uses
`console.debug` at each AG-UI pipeline stage
- Accepts `true` for full output or a granular config: `{ events,
lifecycle, verbose }`
- The two toggles are independent — enabling debug on the client does
not affect the server
## Changes
**`@copilotkit/shared`**
- New `DebugConfig` type, `ResolvedDebugConfig` interface,
`resolveDebugConfig()` normalizer
**`@copilotkit/runtime`**
- `debug` option on `CopilotRuntime({ debug: true })`
- Lifecycle logging: agent run started, SSE stream
opened/completed/errored
- Event logging: every emitted event (verbose = full payload, otherwise
key fields summary)
**`@copilotkit/react-core` + `@copilotkit/core`**
- `debug` prop on `<CopilotKit debug={true}>`
- Threads config through `CopilotKitCore` → `AgentRegistry` →
`ProxiedCopilotRuntimeAgent`
**Companion PR:** ag-ui-protocol/ag-ui#1398 (AG-UI client-side debug
logging)
## Test plan
- [x] All 647 runtime tests pass
- [x] All 352 AG-UI client tests pass
- [x] Lint clean (0 errors)
- [x] All affected packages build successfully
- [ ] Manual: set `debug: true` on runtime and provider, verify
structured logs on server and console output on client
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The docs table and prose claimed `debug: true` sets `verbose: true`,
but the implementation intentionally defaults verbose to false (PII
safety). Fixed the table and explanatory text to match.
Also removed packages/vscode-extension/README.md which was committed
on this branch by mistake — it describes an unrelated VS Code extension
and has nothing to do with debug mode.
## Summary
- Replace custom `{ name, props }` schema format with A2UI v0.9
spec-aligned inline catalog format (`allOf` + `properties`) — eliminates
LLM "props" nesting confusion
- Restructure generation prompts: inline literal values are the default,
path binding is a narrow schema-driven exception
- Bump `@ag-ui/a2ui-middleware` to `0.0.5` in runtime
## Context
LLMs generating dynamic A2UI sometimes produced invalid output:
1. Nesting properties under a `"props"` key (because our schema used
`props` as a key)
2. Using `{ "path": "..." }` bindings on properties that only accept
literal values (e.g. chart `data`, metric `value`)
Both issues caused silent render failures or runtime crashes.
## Test plan
- [x] Tested with ag-ui dojo — A2UI dynamic schema demo works
- [x] Tested with CopilotKit langgraph-starter — sales dashboard renders
correctly
- [x] `@ag-ui/a2ui-middleware@0.0.5` published to npm
🤖 Generated with [Claude Code](https://claude.com/claude-code)