- Add package.json exports for v2/{express,hono,node} subpaths
- Add elysia devDependency and tsdown entry points
- Exclude bun integration tests from vitest config
- Update CI workflows to include runtime-servers test job
- Add runtime-server-adapter docs page
- Add changeset for the fetch-based runtime feature
Replace eslint and prettier with oxlint and oxfmt for faster linting
and formatting across the monorepo. Remove all eslint and prettier
configs, dependencies, and related packages. Add .oxlintrc.json and
.oxfmtrc.json for the new tooling. Update CI workflows and lefthook
hooks accordingly. Reformat codebase with oxfmt.
https://claude.ai/code/session_01GMkSf29p78HuMR1mbXn8He
- Add fail-fast: false to unit test matrix strategies so one Node
version failing doesn't cancel all other matrix jobs
- Add retry: 2 to runtime-client-gql vitest config (Nx confirmed
this package's tests as flaky during parallel execution)
- Replace fragile setTimeout waits in middleware express tests with
vi.waitFor() polling, which is resilient to CI timing variance
https://claude.ai/code/session_01W2Kb2HXsjZett3HdqM9zay
Add CopilotKit/demo as CODEOWNER for examples/showcases/ alongside
the existing dev team for reviewer auto-assignment.
Add a workflow that checks Demo team membership, verifies all changed
files are under examples/showcases/, then auto-approves and enables
auto-merge. PRs touching anything outside showcases or from non-Demo
members sit for normal review.
Flatten all packages from packages/v1/* and packages/v2/* into packages/* —
every package now lives directly under the @copilotkit/ scope with no v1/v2
subdirectories.
- Move all v1 packages (react-core, react-ui, runtime, shared, etc.) from
packages/v1/* to packages/*
- Absorb v2 react code into packages/react-core/src/v2/ (exported via /v2 subpath)
- Absorb v2 agent code into packages/runtime/src/agent/ (exported via /v2 subpath)
- Move v2 packages (core, angular, demo-agents, etc.) to packages/*
- Replace all @copilotkitnext/* imports with @copilotkit/* equivalents
- Keep @copilotkitnext/angular as the sole exception (angular remains on next)
- Update CI workflows, renovate config, release scripts for flat structure
- No public API surface changes — all exports fields are preserved
Co-authored-by: Alem Tuzlak <t.zlak@hotmail.com>
Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
These 8 workflows install uv but never invoke it. Only e2e_dojo.yml
actually needs uv (the dojo scripts use uv sync/run for Python agents).
Removing the unnecessary step saves CI time and reduces confusion.
## Summary
- **`.gitignore`** — add patterns for common binary extensions (`.exe`,
`.dll`, `.so`, `.dylib`, `.o`, `.obj`, `.a`, `.lib`, `.wasm`, `.dSYM/`)
- **CI workflow** (`static_check-binaries.yml`) — runs on all PRs to
`main`, checks for binary file extensions, `build/` directories,
`.dSYM/` directories, and individual files over 1 MB
- **Lefthook pre-commit** (`check-binaries`) — mirrors the CI check
locally, catching binary artifacts, build outputs, and oversized files
at commit time before they reach CI
Prompted by ag-ui PR #29 where ~15 MB of compiled macOS binaries were
accidentally committed. This adds the same protection to CopilotKit.
## Test plan
- [ ] Verify `.gitignore` additions don't affect existing tracked files
- [ ] Confirm the `static / check binaries` workflow runs and passes on
this clean PR
- [ ] Verify lefthook `check-binaries` fires on `git commit` and blocks
binary/oversized files
Fixes#2066
## Problem
`copilotkit_customize_config(config, emit_messages=False)` does not work
— TEXT_MESSAGE_* events are still emitted despite the configuration.
## Root Causes
1. **Metadata Reading Bug**: `getattr(raw_event, 'metadata', {})` always
returns `{}` because `raw_event` is a dict, not an object. Must use
`.get()` instead.
2. **Encoder Crash Bug**: Filtered events return `""` (empty string),
which gets yielded to the event encoder that expects objects with
`model_dump_json()`, causing `AttributeError`.
## Solution
1. Read metadata with `.get()` for dicts, `getattr()` for objects
2. Return `None` instead of `""` for filtered events
3. Override `run()` to strip `None` values before they reach the encoder
## Tests & CI
- Added 8 unit tests covering both bugs, pass-through cases, and `run()`
filtering
- Added `test_unit-python-sdk.yml` CI workflow — first-ever Python SDK
unit test coverage
- Added `pytest` as a dev dependency
Add sdk-python/** to the e2e_dojo workflow path filter so Python SDK
changes actually get tested. A detect-changes job uses dorny/paths-filter
to distinguish TS vs Python changes — when only sdk-python/** changed,
only the needs_python suites run (11 of 15). TS/workflow/changeset
changes still trigger all suites as before.
Most dojo e2e suites (langgraph, agno, crew-ai, pydantic-ai, etc.)
run Python agents that use the sdk-python package, but the workflow
path filter didn't include sdk-python/**, so changes to the Python
SDK never triggered e2e tests.
Parallel CI workflows were each getting a different Nx Cloud execution
ID, resulting in separate CIPEs instead of one unified view. Set a
stable NX_CI_EXECUTION_ID env var using head_ref + sha + run_attempt
so all workflows for the same push are grouped together. Also add
NX_CI_EXECUTION_ENV per workflow to create labeled tab sections in the
Nx Cloud CIPE page.
Add .gitignore patterns for common binary extensions (.exe, .dll, .so,
.dylib, .o, .obj, .a, .lib, .wasm, .dSYM) and a CI workflow that
checks all PRs for binary files, build directories, and files >500KB.
Prompted by ag-ui PR #29 where ~15MB of compiled binaries were
accidentally committed.
prep-dojo-everything.js runs `pnpm install --no-frozen-lockfile` for the
dojo target, which resolves @copilotkit/* from the npm registry. When
link-cpk runs before prep-dojo, the symlinks it creates get overwritten.
Swapping the order ensures prep-dojo installs first, then link-cpk
overwrites the registry packages with local CopilotKit build outputs.
Update e2e_dojo.yml to pass CopilotKit/packages instead of
CopilotKit/packages/v1, so the updated ag-ui link-cpk.js script
links both V1 and V2 packages in dojo e2e tests.
The @copilotkitnext/runtime:build step OOMs on GitHub Actions runners
with the default ~2GB heap. Set NODE_OPTIONS=--max-old-space-size=4096
on all three failing workflows.
Replace anthropics/claude-code-base-action@beta with the Claude Code
CLI (`claude -p` with `--output-format json`). This gives direct
control over the output format — a single JSON object with a `result`
field instead of ambiguous JSONL. The extraction script parses the
JSON, strips preamble, and writes clean markdown to pr-social-copy.md
which is uploaded as the artifact and posted to the PR comment.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The claude-execution-output.json is JSONL (one JSON object per line),
not a single JSON object. JSON.parse() on the whole file silently
failed, producing empty output. Now parses line by line, finding the
"type": "result" entry or falling back to the last assistant message.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract result text and save as pr-social-copy.md (not raw JSON)
- Strip preamble/analysis before first ### header
- Upload the markdown file as the artifact (90-day retention)
- Comment reads from the same markdown file
- Remove character limit from blog post and LinkedIn (only Twitter
keeps 280 char limit)
- Instruct Claude to skip preamble and start directly with content
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add disallowed_tools to prevent Claude from wasting turns on
TodoWrite, Edit, Write, and other non-essential tools that cause
error_during_execution crashes
- Make extract/upload/update steps run with always() so they still
execute even if Claude's step exits with error_during_execution
- Add JSONL log fallback: if result field is empty, scan assistant
messages for the generated content (contains ###)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a direct "Download full output" link in the comment footer that
points to the uploaded artifact, alongside the existing workflow run
link.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Claude Code sandboxes file access to the working directory. Files in
/tmp are inaccessible regardless of allowed_tools config. Move diff
files and extracted result to .claude-tmp/ inside the repo.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add `Read` to allowed_tools so Claude can read the diff files
- Read Claude output from JSON file instead of step output (fixes
empty result caused by multiline content breaking GH Actions outputs)
- Upload claude-execution-output.json as a downloadable artifact
- Add link to workflow run in the success comment footer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Skip posting the initial comment on PRs from forks (job-level guard
+ runtime check for workflow_dispatch)
- Verify the checkbox clicker has write/admin permission before
running generation (prevents external collaborators from triggering
Claude API calls)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The claude-code-base-action expects anthropic_api_key as a `with:`
input parameter, not an `env:` variable.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add workflow_dispatch trigger with pr_number input so the social copy
generator can be used on any existing PR (open or merged). Also adds
duplicate comment detection and a GitHub API diff fallback for merged
PRs where the branch may have been deleted.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a GitHub Actions workflow that posts a comment on every new PR with a
checkbox to generate social media copies (Twitter/X, LinkedIn, Blog Post)
using Claude Code. Checking the checkbox triggers Claude to analyze the PR
diff and generate content. After generation, the checkbox resets to
"Regenerate" so users can re-trigger after pushing new changes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>