Commit Graph

977 Commits

Author SHA1 Message Date
Jordan Ritter f00c040f15 fix: keep playwright install stderr for debugging
Playwright install stderr is diagnostic signal — version/network errors,
missing system libs, or browser download failures all surface here. Only
suppress stderr on the noisy npm install step. Also pin the image-tag /
client-version relationship with a code comment on one compose file so
future bumps know to keep them aligned.
2026-04-16 12:07:43 -07:00
Jordan Ritter e05181265a fix: drop --with-deps from starter-smoke Playwright install
The Playwright Docker image (mcr.microsoft.com/playwright:v1.52.0-noble)
ships with all Chromium system libraries and browsers pre-installed, so
`--with-deps` adds no runtime value — it only forces a redundant
`apt-get update && apt-get install` inside the tests container.

That apt-get call is the sole source of the intermittent
"Installation process exited with code: 100" / "Failed to install
browsers" failures that rotate across the 12 smoke matrix entries. The
underlying cause is transient Ubuntu archive mirror hash/size mismatches
("File has unexpected size ... Mirror sync in progress?", "Hash Sum
mismatch"), which cause apt to abort with exit 100. Because each matrix
job races apt against archive.ubuntu.com independently, the failing
subset rotates per run (run 24526747926 hit 5 starters; run 24509673514
hit a different 5; run 24495760568 hit 3) — classic flake, not a per-
starter regression.

Dropping --with-deps eliminates the apt-get call entirely. The browsers
themselves are already present at /ms-playwright/chromium-* in the base
image, and `npx playwright install chromium` remains as a cheap no-op
that self-heals if the pinned Playwright version ever drifts from the
image's bundled browser build.
2026-04-16 11:39:02 -07:00
Alem Tuzlak d5cab97c84 chore: update langgraph-js starter to @copilotkit/*@1.56.0
This version removes the unused @langchain/community peer dep from
sdk-js, fixing dependency resolution conflicts with @langchain/core@1.x.
2026-04-16 18:14:50 +02:00
Alem Tuzlak 07e864b99a Merge remote-tracking branch 'origin/main' into worktree-lucky-popping-wren
# Conflicts:
#	examples/integrations/langgraph-python/apps/app/package.json
#	examples/integrations/langgraph-python/pnpm-lock.yaml
2026-04-16 16:13:44 +02:00
Alem Tuzlak f47b9e9775 fix: remove unused @langchain/community peer dep, add langchain to langgraph-js agent, add postcss config to mcp-apps threejs-server
- Remove @langchain/community from sdk-js peerDependencies (unused,
  was blocking @langchain/core@1.x resolution)
- Add langchain@^1.0.0 to langgraph-js agent deps to prevent
  transitive resolution to 0.3.x
- Add postcss.config.mjs to mcp-apps threejs-server
2026-04-16 16:02:24 +02:00
Alem Tuzlak 41e57ed74b fix: remove .bat fallback pattern, fix README typos and phantom scripts
- Remove '|| .bat' fallback from all starter package.json scripts so
  real errors on Linux/macOS are not masked by a failing .bat attempt
- Fix typos: 'isseus' -> 'issues', 'interactin' -> 'interacting'
- Fix crewai-crews README title/body saying 'Flow' instead of 'Crew'
- Fix a2a-a2ui README wrong agent name and file path
- Remove phantom lint/dev:debug scripts from README Available Scripts
  sections where those scripts don't exist in package.json
- Add missing dev:ui and dev:agent to mastra README
2026-04-16 14:00:52 +02:00
Alem Tuzlak 0d4b887d8b fix: set execute bit on .sh scripts, fix langgraph-js Docker builds
- chmod +x all new .sh scripts so they work on Linux/macOS
- Use --ignore-scripts in langgraph-js Dockerfiles to avoid postinstall
  failure (agent/ dir not yet copied during npm install stage)
- Install agent deps in production Dockerfile after COPY agent/
- Fix hardcoded pnpm commands in agent-spec README
2026-04-16 13:51:53 +02:00
Alem Tuzlak 96ed9151d7 fix: default to npm in all starter READMEs, support any package manager
Reorder package manager instructions to show npm first as the default.
Remove stale 'ignores lock files' notes since lock file entries were
removed from .gitignore. All starters now work with npm, pnpm, yarn,
or bun — user's choice.
2026-04-16 13:37:10 +02:00
Alem Tuzlak 4f49da19e0 fix: remove lock file entries from all starter .gitignore files
Starters should not constrain users to a specific package manager.
The .gitignore gets cloned into the user's project, so ignoring
certain lock files would prevent them from committing their chosen
package manager's lock file.
2026-04-16 13:28:28 +02:00
Alem Tuzlak 453097ff18 fix: convert starter templates from pnpm/Turborepo to flat npm projects
Flatten langgraph-python, langgraph-js, and mcp-apps starters so
npm install && npm run dev works out of the box. Replace Turborepo
with concurrently, move apps/* to root, update Dockerfiles, READMEs,
and entrypoints. Also remove stray pnpm-lock.yaml from a2a-a2ui and
ms-agent-framework-dotnet starters.
2026-04-16 13:23:30 +02:00
Markus Ecker 9945d892e5 chore: update langgraph starter lockfile for 1.56.0 2026-04-15 20:41:05 +02:00
Markus Ecker 097bc7ac6c fix: update langgraph starter to use released @copilotkit packages 1.56.0
Replace pkg-pr-new preview URLs with published 1.56.0 versions.
2026-04-15 20:19:30 +02:00
Ran Shemtov d74e32c824 Merge branch 'main' into chore/example-state-streamin 2026-04-15 19:24:23 +02:00
Max Korp 246448120a feat: add langgraph-python-threads example 2026-04-15 09:50:03 -07:00
Ran Shem Tov 65500c5fb8 chore: fix state streaming on langgraph prebuilt agents in demos 2026-04-15 18:35:55 +02:00
Ran Shem Tov c8d4b273aa chore: add state streaming to langgraph example 2026-04-15 17:54:05 +02:00
Markus Ecker c61ebc5d15 chore: use pkg-pr-new preview packages in langgraph starter 2026-04-15 16:13:47 +02:00
Jordan Ritter 14eef93d20 fix: scope .dark CSS selectors to CopilotKit elements (#3850)
## Summary

- **console.css + input.css:** Scope `.dark` CSS selectors to CopilotKit
container elements (`.copilotKitDevConsole
.copilotKitDebugMenuTriggerButton` and `.poweredBy` respectively). The
original selectors had bare `.dark,` as standalone entries in
comma-separated selector lists, which applied styles to *any* element
with class `.dark` instead of scoping to CopilotKit elements.
- **colors.css:** Remove broken `:root` pseudo-element from
`body[style*="color-scheme: dark"] :root` — `:root` is `<html>`, which
cannot be a descendant of `<body>`, so this selector never matched
anything.
- **E2E tests:** 4 Playwright regression tests verifying dark mode
styles don't leak into host application elements.

Prevents CopilotKit dark-mode styles from leaking into the host
application.

Closes #2920

---
*Split from #3847*
2026-04-14 14:25:57 -07:00
Markus Ecker c8ff9d7bf6 fix: update langgraph example model to gpt-5.4 2026-04-14 16:24:34 +02:00
Alem Tuzlak 6c05c8e3aa Merge branch 'main' into worktree-nested-tinkering-quail 2026-04-14 15:39:32 +02:00
Alem Tuzlak cbd220ab23 chore: use latest langgraph and fix deployment (#3889) 2026-04-14 14:41:27 +02:00
Ran Shem Tov eef4ac7fd0 chore: use latest langgraph and fix deployment 2026-04-14 14:20:16 +02:00
Alem Tuzlak 983274f7c3 Merge branch 'main' into worktree-nested-tinkering-quail 2026-04-14 14:11:42 +02:00
Alem Tuzlak 19b99dd2ae fix(runtime): widen TanStack message content type for adapter compat (#3747)
## Summary

- Widen `TanStackChatMessage.content` from `TanStackContentPart[]`
  to `any[]` so messages from `convertInputToTanStackAI` are directly
  passable to any TanStack AI adapter without `as any` casts
- Split `TanStackContentPart` into a proper discriminated union with
  separate variants per modality
- Add `env.d.ts` with `vite/client` reference for CSS import types
- Fix `onError` callback shape in the example

## Test plan

- [x] All 17 multimodal TanStack tests pass
- [x] All 294 agent tests pass
- [ ] Verify no TS errors in react-router example IDE

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-04-14 14:11:18 +02:00
Jordan Ritter 15e096dd6b fix: starter-crewai-crews ignore TS build errors in Docker
HttpAgent type doesn't fully implement AbstractAgent, causing TS type
error during next build. Use ignoreBuildErrors like other starters.
2026-04-13 21:51:09 -07:00
Jordan Ritter 2a5e62d8a5 fix: starter-langgraph-python copy showcase.json into Docker context
The import ../../../../showcase.json from apps/app/src/hooks/ resolves
to the context root, but only apps/app/ was copied. Add COPY for
showcase.json.
2026-04-13 21:50:06 -07:00
Jordan Ritter cf75ec58b1 fix: resolve remaining 3 deploy failures
- starter-langgraph-python: use next build --webpack (Turbopack default
  in Next 16 can't handle serverExternalPackages)
- starter-crewai-crews: bump ag-ui-protocol>=0.1.10 to match
  ag-ui-crewai 0.1.5 requirement
- shell-dojolike: add recharts dependency (used by shared frontend)
2026-04-13 21:41:50 -07:00
Jordan Ritter 5aed8ee088 fix: resolve 4 remaining showcase deploy failures
- Remove test-integration-tmp from workflow (package was deleted)
- starter-langgraph-python: disable Turbopack for Next.js build
  (serverExternalPackages incompatible with Turbopack)
- starter-crewai-crews: pin crewai-tools~=0.47.1 to avoid version
  conflict with crewai==0.130.0
- shell-dojolike: add missing zod dependency (required by shared
  frontend modules)
2026-04-13 21:37:03 -07:00
Martha Schumann 14ae28cfd1 feat(inspector): add thread store registry, runtime handlers, and useThreads hook
- CopilotKitCore gains a ThreadStoreRegistry (register/unregister by agentId)
  and a new onAgentRunStarted subscriber event so the inspector can subscribe
  before agent.runAgent() snapshots the subscriber list
- Runtime gains handleListThreads, handleUpdateThread, handleArchiveThread,
  handleDeleteThread, handleSubscribeToThreads, and handleGetThreadMessages
  handlers; all mutations are authenticated via identifyUser (request body
  userId is ignored)
- InMemoryAgentRunner now stores thread history for the local-dev fallback
  path; debug console.log removed; InMemoryThread uses literal types for
  constant-value fields (organizationId: "", createdById: "", archived: false)
- useThreads hook registers its store with CopilotKitCore on mount and
  unregisters on unmount so the inspector can read thread state

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 15:43:27 -07:00
Tyler Slaton 9554d5886c fix(langgraph-python): update deps and lockfile
Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
2026-04-13 15:07:49 -07:00
Jordan Ritter 50439f5e12 fix: remove unused variables and prevent silent test pass in dark mode tests
Remove captured-but-never-asserted colorBefore and markerColorLight
variables. Replace silent if-guard in poweredBy test with explicit
test.skip so missing elements surface in test reports instead of
silently passing.
2026-04-13 14:33:20 -07:00
Jordan Ritter f30f001f83 test: add Playwright regression test for dark mode CSS scoping (#2920)
Verifies that .dark CSS selectors in console.css and input.css are
properly scoped to CopilotKit elements and do not leak into the host
application. Tests detect the specific rgb(69, 69, 69) color leak that
occurred when .dark was used as a standalone selector.
2026-04-13 09:17:41 -07:00
Alem Tuzlak 327d134ecd Merge remote-tracking branch 'origin/main' into worktree-nested-tinkering-quail
# Conflicts:
#	packages/angular/package.json
#	packages/core/package.json
#	packages/demo-agents/package.json
#	packages/react-core/package.json
#	packages/runtime/package.json
#	packages/shared/package.json
#	packages/sqlite-runner/package.json
#	packages/web-inspector/package.json
#	pnpm-lock.yaml
2026-04-13 11:12:25 +02:00
Martha Schumann c27b162589 fix: pin @ag-ui/client to 0.0.52 in CLI templates
Templates were pinned at old @ag-ui/client versions (0.0.40–0.0.46).
@copilotkit/runtime@1.55.2 ships 0.0.52, which added private fields to
AbstractAgent. The version split caused a nominal type error on build.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 17:22:14 -07:00
Martha Schumann 21d2051b33 Close three PR review blockers: cross-layer event tests, API removals verified
- Add TestAGUIStyleEventIntegration to test_agui_agent.py: proves that AG-UI-style
  unprefixed events (manually_emit_message, manually_emit_tool_call, exit) flow
  correctly through CopilotKit's _handle_single_event to the AG-UI base handler
  without being suppressed or double-converted by the CopilotKit layer.
- Replace LangGraphAgent with LangGraphAGUIAgent in both example files
  (canvas/gemini and v1/_legacy/saas-dynamic-dashboards) to close the concern
  about removed APIs still being referenced externally.
- Update poetry.lock to reflect ag_ui_langgraph 0.0.32 and dependency updates.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 17:18:42 -07:00
Martha Kelly Schumann a45afea9ba Merge branch 'main' into fix/update-template-copilotkit-versions 2026-04-10 16:56:59 -07:00
Martha Schumann bdc01e3c12 chore: bump CLI template @copilotkit/* versions to 1.55.2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 16:56:19 -07:00
Martha Schumann c2b17a9ad8 test(e2e): simplify to form-filling only, fix windowBox ref in drag test 2026-04-10 16:14:26 -07:00
Martha Schumann c5b3951f38 test(e2e): guard isVisible against race on window open check 2026-04-10 16:07:24 -07:00
Martha Schumann bd19406f43 test(e2e): fix beforeEach to handle defaultOpen variants 2026-04-10 16:06:24 -07:00
Martha Schumann a8db5310f2 test(e2e): tighten chat layout assertions 2026-04-10 15:55:20 -07:00
Martha Schumann 271602e0d3 test(e2e): add chat window layout regression tests 2026-04-10 15:53:12 -07:00
Martha Schumann 92f5bba0e4 chore: bump @copilotkit/* versions to 1.55.1 in all integration templates
Templates had stale pinned versions ranging from 1.9.3 to 1.52.1.
The CLI does a verbatim sparse checkout of these files, so users
scaffolding via `copilotkit create` were getting old versions installed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 15:34:35 -07:00
Jordan Ritter ebcb227ba3 Remove redundant sed agent URL patches from test Dockerfiles
Source route.ts files now read process.env.AGENT_URL natively (PR #3737),
so the build-time sed patches and verification greps are no longer needed.

Also removes crewai-crews docker-route-override.ts and its COPY line,
since that starter's route.ts already has AGENT_URL support.
2026-04-10 11:02:54 -07:00
Alem Tuzlak ff2093102c chore(lint): add new oxlint rules and auto-fix violations
Enable stricter oxlint rules for better code health:
- typescript/consistent-type-imports: enforce `import type` for type-only imports
- typescript/no-import-type-side-effects: prefer top-level type imports
- import/consistent-type-specifier-style: consistent type specifier placement
- typescript/no-unnecessary-type-assertion: bump to error
- react/self-closing-comp: enforce self-closing JSX components
- unicorn/prefer-optional-catch-binding: drop unused catch params
- eslint/no-useless-computed-key: simplify object keys
- unicorn/prefer-string-slice: prefer .slice() over .substring()
- unicorn/prefer-array-flat-map: prefer .flatMap() over .map().flat()

All existing violations auto-fixed via oxlint --fix.
2026-04-10 19:29:32 +02:00
Alem Tuzlak c3fc0091a0 fix(runtime): widen TanStack message content type for adapter compat
TanStackChatMessage.content uses any[] for multimodal so
messages are directly passable to any adapter without casts.
Add env.d.ts with vite/client types for CSS imports.
2026-04-10 17:53:43 +02:00
Alem Tuzlak 4a69d7a8e3 feat(runtime): add multimodal support to TanStack converter
- Fix convertInputToTanStackAI silently dropping multimodal
  content (images, audio, video, documents) by converting
  AG-UI content parts to TanStack AI ContentPart format
- Switch react-router example from Hono server to a React
  Router resource route using createCopilotRuntimeHandler
- Both agents now use BuiltInAgent factory pattern
- Remove hono/react-router-hono-server deps from example
2026-04-10 17:15:57 +02:00
Tyler Slaton 7f2a9ae176 feat(runtime): add factory mode to BuiltInAgent for backend-agnostic LLM integration (#3572)
## Summary

Adds **factory mode** to `BuiltInAgent`, enabling backend-agnostic LLM
integration without introducing a new class. Users provide a factory
function that creates the LLM stream — CopilotKit handles lifecycle
events, stream-to-AG-UI conversion, error handling, and
abort/cancellation.

### What's included

- **Three backend types**: `aisdk` (Vercel AI SDK), `tanstack` (TanStack
AI), and `custom` (raw AG-UI events)
- **Stream converters**: `convertAISDKStream` and
`convertTanStackStream` extract AG-UI events from backend-native streams
- **Input helpers**: `convertInputToTanStackAI` and
`convertMessagesToVercelAISDKMessages` for message/prompt conversion
- **State management**: Automatic `STATE_SNAPSHOT`/`STATE_DELTA` event
extraction from tool results
- **Reasoning support**: Auto-close logic for providers that never emit
`reasoning-end` (e.g. `@ai-sdk/anthropic`)
- **273 tests** across 16 test files covering all backend types,
converters, state tools, multimodal, and edge cases
- **Docs**: Comprehensive factory mode guide with 16 examples covering
tools, reasoning, state, forwardedProps, structured output
- **Example app**: React Router example migrated to factory mode

### Architecture

Factory mode is a discriminated union on `BuiltInAgentConfiguration`:

```typescript
const agent = new BuiltInAgent({
  type: "aisdk",           // or "tanstack" | "custom"
  factory: ({ input, abortSignal }) =>
    streamText({ model: openai("gpt-4o"), messages: ..., abortSignal }),
});
```

No new public classes — `BuiltInAgent` handles both simple mode (model
string) and factory mode (user-owned LLM call).

## PR feedback addressed

### Critical fixes
- **C1/M3**: Fixed TOCTOU window — `abortController` now set
synchronously before Observable creation in classic `run()`, with
concurrent run guard
- **C2/M2**: Classic `tool-result` now checks both `output` and `result`
property names, with `try/catch` on `JSON.stringify`
- **C3**: Error case safely handles `undefined` `p.error` with proper
fallback chain

### Important fixes
- **I2**: `RUN_ERROR` events now include `threadId` and `runId` in
classic mode (matching factory mode)
- **I3**: State tool events guarded against `undefined` snapshot/delta
before emitting
- **I4**: `JSON.stringify` wrapped in try/catch with descriptive
fallback message
- **M1**: `assignToolsToAgents` now skips factory-mode agents (prevents
config corruption)
- **M5**: TanStack converter's dropped event types documented with clear
limitation note

### Suggestions addressed
- **S1**: `@ts-expect-error` on `clone()` middlewares documented with
rationale
- **M4**: `AgentFactoryContext.abortController` kept (needed by TanStack
AI) but JSDoc added discouraging direct `.abort()` calls

## Test plan

- [x] 273 unit tests pass across all 3 backend types
- [x] Build succeeds
- [x] React Router example compiles
- [x] Docs render correctly (Vercel preview)
2026-04-09 21:34:44 -07:00
Tyler Slaton 9b3ece99b9 chore(format): commit unformatted code
Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
2026-04-09 21:03:12 -07:00
Jordan Ritter a3ff477e16 feat: add /health endpoint to all starter integration examples (#3738)
## Summary

Adds a `/health` GET endpoint returning `{"status": "ok"}` to all 11
starter integration examples. This is a best practice for any deployed
service — health checks enable platform health monitoring, load balancer
probes, and container lifecycle management.

**11 starters updated:**
- adk, agent-spec, agno, crewai-crews, crewai-flows, langgraph-fastapi,
llamaindex, ms-agent-framework-dotnet, ms-agent-framework-python,
pydantic-ai, strands-python

**1 skipped:**
- langgraph-python — uses `langgraph dev` which provides its own `/ok`
endpoint

All `/health` endpoints are registered before any catch-all mount to
ensure they take priority (lesson learned from the pydantic-ai showcase
bug).

## Test plan

- [ ] Each starter builds successfully
- [ ] `curl localhost:8000/health` returns `{"status": "ok"}` on each
2026-04-09 20:50:06 -07:00