Commit Graph

1976 Commits

Author SHA1 Message Date
Alem Tuzlak 810899c82e feat(bot-whatsapp): add GET / health route to the webhook server 2026-06-17 14:41:08 +02:00
Tyler Slaton 449237af0c fix: rename premium docs to intelligence platform 2026-06-16 22:09:48 -07:00
Tyler Slaton c6a14e7969 feat(shell-docs): serve Built-in Agent docs at the docs root (#5404)
## Summary

Built-in Agent docs now render at bare root URLs, such as `/quickstart`,
instead of under `/built-in-agent`. Legacy `/built-in-agent/*` and
`/integrations/built-in-agent/*` paths continue to redirect to canonical
root or backend URLs.

## Why

The Built-in Agent is the default docs surface, so public docs URLs
should not expose it as a sub-slug. Existing links still need to keep
working, and root-page navigation must stay stable regardless of a
visitor's stored framework selection.

## How

- Root docs resolve Built-in Agent authored pages first while preserving
reserved routes like `/ag-ui` and framework-prefixed docs.
- Redirect rules in `next.config.ts` and `seo-redirects.ts` point
retired Built-in Agent and unselected paths directly at canonical
destinations, with regression coverage that prevents redirect
destinations from targeting `/built-in-agent`.
- The sidebar/framework provider treats bare URLs as the default
Built-in Agent surface instead of letting a stored framework value
rewrite root-page chrome.
- MDX link and search-result href rewriting strip retired Built-in Agent
prefixes on root-rendered pages while preserving explicit
cross-framework links.
- Stale docs links, sitemap, `llms.txt`, markdown exports, and OG
resolution now align with the root-served Built-in Agent surface.
- Showcase generated-data tests now serialize shared fixture restoration
to avoid concurrent drift in CI.

## Verification

- GitHub checks are green on `f655013dd2576a46dc17b5901eb4dc501cb21028`.
- `npm --prefix showcase/shell-docs run test --
src/lib/__tests__/search-hrefs.test.ts
src/lib/__tests__/docs-link-rewrite.test.ts
src/lib/__tests__/seo-redirects.test.ts
src/lib/__tests__/next-config-redirects.test.ts
src/components/__tests__/docs-landing-next.test.tsx
'src/app/[framework]/[[...slug]]/__tests__/framework-root-shell-layout.test.ts'`
- `npm --prefix showcase/shell-docs run test -- --exclude
src/app/__tests__/public-assets.test.ts`
- `npm --prefix showcase/shell-docs run typecheck`
- `npm --prefix showcase/shell-docs run lint`
- `npm --prefix showcase/shell-docs run build`
- `npm --prefix showcase/scripts run test`
- `pnpm exec nx run @copilotkit/bot-slack:build --skip-nx-cache
--verbose`
2026-06-16 13:48:32 -07:00
Benjamin Taylor 9a0154da32 fix(inspector): render announcement popout as button sibling, not child
Address review: the popout dismiss control was a focusable interactive
element (role="button" + tabindex) rendered INSIDE the floating inspector
<button>. That violates the HTML button content model — a <button> may not
contain interactive descendants or descendants with tabindex, even when the
descendant isn't itself a <button>.

Render the announcement preview as a SIBLING of the floating button inside a
position: relative wrapper, so the dismiss affordance becomes a real
<button type="button">. The wrapper preserves the absolute positioning, so
the bubble still anchors to the button's edge (verified live: identical
placement). Native button keyboard handling replaces the manual Enter/Space
keydown shim. stopPropagation still keeps the X from bubbling to the preview
body (which opens the inspector).

Behavior unchanged and re-verified in a real browser: X persists the
timestamp + hides the bubble without opening the inspector; body-click opens
without persisting. web-inspector suite 32/32 green.

(--no-verify: the full-package pre-commit suite has pre-existing, unrelated
failures in core/runtime/sdk-js transport tests; this change only touches
packages/web-inspector.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 13:24:34 -05:00
Benjamin Taylor 87e16edfa5 fix(inspector): persist announcement popout dismissal via X control
The announcement preview bubble that pops out of the floating inspector
button had no dismiss control of its own. Its only hide paths
(handleAnnouncementPreviewClick / openInspector) cleared an in-memory flag
without persisting, so on the next mount fetchAnnouncement() recomputed
showAnnouncementPreview from the stored timestamp — which only the in-window
banner X ever wrote. Result: the popout reappeared on every reload unless the
user opened the inspector and dismissed the inner banner.

Add an X control to the popout that calls markAnnouncementSeen() (persists the
timestamp) and stopPropagation() (so the X does not bubble up and open the
inspector). The control is a role="button" span — the popout renders inside the
floating <button>, so a nested <button> would be invalid HTML. Includes
Enter/Space keyboard support and focus-visible styling.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 13:24:34 -05:00
Alem Tuzlak 42636d0094 style: oxfmt bot-whatsapp + example 2026-06-16 19:26:52 +02:00
Alem Tuzlak 0214e5ac63 fix(bot-whatsapp): correct IR rendering, HITL buttons, typing, quote-reply
- render: walk the real renderToIR tree — read text nodes' `value` and recurse
  into nested containers, so card text and buttons inside <Actions> render
  (previously produced zero payloads → silent no-send)
- render: value-only buttons (awaitChoice HITL confirm/cancel) now render,
  encoding the value in the reply id so the engine's waiter resolves
- adapter: native WhatsApp typing indicator on every inbound (read receipt +
  typing_indicator); supportsTyping = true
- ingress: resolve quote-replies — the webhook sends only the quoted message's
  id, so look it up in history and prepend its text to the turn
- adapter: record every outbound message (text + cards) in history keyed by its
  wamid, so quote-replies to the bot's own messages resolve too
- tests: +9 covering the renderToIR shape, value-only buttons, typing, quote
  resolution, and outbound recording (71 total)
2026-06-16 19:19:43 +02:00
Tyler Slaton 88588223af fix(react-core): add dark mode styling for default tool rendering (#5455)
## Summary
- Update the default tool-call renderer to use dark-theme-aware classes
for the card, header, status badge, and detail panels
- Add coverage for the dark theme styling path in unit tests
- Add a Storybook example that demonstrates the default tool renderer on
a dark CopilotKit surface

## Testing
- Added unit tests for the renderer’s dark-theme class output and
expanded details state
- Not run (not requested)
2026-06-16 10:04:54 -07:00
Tyler Slaton 06cee3f727 fix(vue): adjust pin-to-send spacer in both directions to keep the user message pinned (#5423)
## What does this PR do?

Ports the `usePinToSend` spacer fix from #5386 to the Vue package.
`packages/vue/src/v2/hooks/use-pin-to-send.ts` is a documented 1:1
parity port of the React hook and retained the shrink-only
`ResizeObserver`: when content below the anchored user message loses
height (suggestions swapping in, input container resizing after
streaming), the spacer could not grow back, so total scrollable height
dropped and the pinned message shifted — the same defect class reported
in #5355.

- Lets the spacer adjust in both directions so total scrollable space
below the pinned bubble stays constant.
- Mirrors the test change from #5386 1:1 in the Vue suite (red/green:
the updated assertion fails on the shrink-only implementation, passes
with the fix).
- Updates the `PARITY.md` row and hook JSDoc that documented the old
shrink-only semantics.

Vue has no scroll-to-bottom button, so the scroll-listener half of #5386
does not apply here.

## Related PRs and Issues

- Follow-up to #5386
- Relates to #5355 (Vue side of the same spacer defect)

## Tests

- `nx test @copilotkit/vue` — 1001 passed (94 files), including the
mirrored `adjusts spacer as content height changes to keep the user
message pinned` case
- `nx build @copilotkit/vue` — green (dts build)
- `oxfmt --check` clean on touched files
- Pre-existing on main, untouched by this diff: 176 package-wide lint
errors (identical count on clean main) and
`@copilotkit/core:check-types` failures

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-16 10:03:43 -07:00
Varun Nuthalapati 5d67341881 docs(react-ui): clarify all modalities in attachments prop examples 2026-06-16 09:17:55 -07:00
AlemTuzlak 035e7cf9c9 chore: release bot v0.0.2 2026-06-16 11:43:12 +00:00
Alem Tuzlak 72203fbcba chore: release bot-slack v0.0.2 (#5466)
## Release bot-slack v0.0.2

**Scope:** `bot-slack` | **Bump:** `patch`

---

### How this release process works

1. **This PR was created automatically** by the "release / create-pr"
workflow.
   It bumped the `bot-slack` packages to `0.0.2`
   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 `bot-slack` packages to npm at version `0.0.2`
   - Creates git tag `bot-slack/v0.0.2`
   - 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.
2026-06-16 13:26:27 +02:00
Jordan Ritter f8b14f1d6a fix(react-core): await runAgent in useInterrupt::resolve and propagate to demo-local hooks (#5461)
## Summary

Convert `useInterrupt::resolve` and the demo-local
`useHeadlessInterrupt::resolve` callbacks from fire-and-forget into
`async` + `return await copilotkit.runAgent(...)`, so callers receive a
Promise that settles when the resume run settles.

## Mechanism

Pre-fix: `resolve(...)` called `copilotkit.runAgent({...})` without
`await` and without `return` — the arrow returned `undefined`. The
showcase harness DOM-settle check on the assistant confirmation bubble
timed out because consumers had no handle to sequence against the resume
run's settle.

Post-fix:
- Framework `useInterrupt::resolve` is `async`, `return await`s
`runAgent`, wraps in try/catch + `setPendingEvent(null)` +
`console.error` + rethrow on rejection.
- `onRunFailed` now also `setPendingEvent(null)` — symmetric with
`onRunStartedEvent`, prevents stuck popups on run failure.
- `InterruptHandlerProps.resolve` / `InterruptRenderProps.resolve` typed
`() => Promise<RunAgentResult>` (was `() => void`).
- The same fix-pattern applied to 13 demo-local `useHeadlessInterrupt`
implementations across integrations: ag2, agno, claude-sdk-typescript,
crewai-crews, langgraph-{fastapi,python,typescript}, langroid,
llamaindex, mastra, pydantic-ai, spring-ai, strands.

## Verification

- **Unit:** new tests `resolve returns a Promise that settles when
runAgent settles (RESUME-PATH)` + `resolve rejects when runAgent
rejects, logs the failure, and clears pending (RESUME-PATH-REJECT)`.
Red-then-green on baseline. 22/22 react-core hook tests passing.
- **Backplane (end-to-end):** showcase control plane on langgraph-python
via `./bin/showcase test langgraph-python:gen-ui-interrupt --d5 --direct
--verbose` (GREEN, 70.1s, was RED-RESUME-PATH baseline) and
`:interrupt-headless --d5 --direct --verbose` (GREEN, 7.7s, was
RED-RESUME-PATH baseline). Built Docker artifact + aimock D6 fixture
replay — staging-equivalent path.

## CR

4 review rounds × 7 unbiased agents = 28 agent-runs. 2 Procedure 3
audits (3 promotions in round 1 → Fix C + D; 0 promotions in round 2).
Convergence achieved per agent-confirmed `bucket (a) empty` + Procedure
3 zero `PROMOTE_TO_A`.

## Out of scope (deferred follow-ups)

- **No manifest unquarantine.** A prior version of this branch flipped
`interrupt-headless` and `gen-ui-interrupt` from
`not_supported_features` to `features` across 12 manifests, but Phase 4
backplane validation across 8 PATCHED integrations × 2 demos surfaced
(a) `langgraph-fastapi:gen-ui-interrupt` still RED-RESUME-PATH because
the framework patch doesn't propagate from workspace to the
integration's Docker image without a published `@copilotkit/react-core`
release, and (b) a separate popup-mount RED-RUNTIME-OTHER cluster across
6 integrations that's pre-existing rot unrelated to this PR. Manifest
unquarantine + `@copilotkit/react-core` version bump are deferred to a
follow-up `copilotkit-release` PR after this fix lands.
- **No version bump.** Release follows in a separate PR.
- **Bucket (c) follow-up backlog** (audit verdicts: 11 STAY_IN_C):
  - JSON.parse guarding in showcase demos (pre-existing, all 13)
- Type-design quirks in `InterruptHandlerProps.result` (non-nullable in
type, nullable in runtime)
  - `renderInChat` dynamic toggle leak (pre-existing edge case)
- JSDoc clarity ("symmetric with onRunFailed" wording, `@typeParam
TRenderInChat`, `event.value` "any" → "unknown")
  - StrictMode test coverage gap
- 13× duplicate `useHeadlessInterrupt` → bucket (d): consolidate into a
shared module in a future PR

## Files changed

16 files, +486/-154:
- `packages/react-core/src/v2/hooks/use-interrupt.tsx`
- `packages/react-core/src/v2/hooks/__tests__/use-interrupt.test.tsx`
- `packages/react-core/src/v2/types/interrupt.ts`
- 13×
`showcase/integrations/<integ>/src/app/demos/interrupt-headless/page.tsx`

## Test plan

- [x] react-core unit tests (22/22 passing including new RESUME-PATH +
RESUME-PATH-REJECT regression tests)
- [x] Backplane D5 probe on langgraph-python (gen-ui-interrupt +
interrupt-headless GREEN end-to-end via the showcase control plane)
- [ ] CI green on this PR
2026-06-16 00:08:56 -07:00
tylerslaton 4564e6205d chore: release bot-slack v0.0.2 2026-06-16 05:12:14 +00:00
Jordan Ritter 7b80590f67 fix(react-core): await runAgent in useInterrupt::resolve
resolve() previously called copilotkit.runAgent(...) without await and
without return, so callers had no handle to sequence against the resume
run's settle. The harness DOM-settle check timed out for any consumer
awaiting the assistant confirmation bubble.

Changes:
- Make resolve async, return await copilotkit.runAgent(...) so callers
  receive a Promise that settles when the resume run settles.
- Update InterruptHandlerProps / InterruptRenderProps resolve return
  type from () => void to () => Promise<RunAgentResult>.
- Wrap runAgent in try/catch + setPendingEvent(null) + rethrow, so
  rejection clears the popup AND propagates to awaiting callers
  (mirrors onRunFailed handler symmetry; closes the case where
  runAgent rejects before any run-failed event fires, e.g. network
  error pre-RUN_STARTED).
- onRunFailed now also setPendingEvent(null) symmetric with
  onRunStartedEvent.
- Regression tests: RESUME-PATH asserts resolve() returns a Promise
  that settles 1:1 with runAgent; RESUME-PATH-REJECT asserts rejection
  propagates, popup clears, console.error logs.
2026-06-15 17:11:39 -07:00
Tyler Slaton bd2db6009a Add dark theme support to default tool renderer 2026-06-15 11:09:12 -07:00
github-actions[bot] a574bbad90 style: auto-fix formatting 2026-06-15 15:13:03 +00:00
Alem Tuzlak 210d5ded66 docs(bot-whatsapp): package README/ARCHITECTURE + example setup guide 2026-06-15 17:08:06 +02:00
Alem Tuzlak 865d5f812d fix(bot-whatsapp): address code review — command history, id round-trip, hmac, deps 2026-06-15 16:02:11 +02:00
Alem Tuzlak a925e33be9 docs(bot-slack): document assistant pane + native streaming; enable in slack example
Update package READMEs + ARCHITECTURE for the assistant pane, native streaming,
and the new onThreadStarted / setSuggestedPrompts / setTitle surface. Reverse
the slack.mdx callout that told users to delete the assistant scopes (now
required), and enable the pane in the examples/slack manifest (assistant_view +
assistant:write + assistant_thread_* events) with a dev-ex onThreadStarted
greeting and the assistant config.
2026-06-15 15:47:46 +02:00
Alem Tuzlak 779baef81e feat(bot-slack): agent-native Slack APIs — assistant pane + native streaming
Activate Slack's assistant pane and native streaming as the default experience,
with zero config and safe degradation. The portable surface lands in
@copilotkit/bot (onThreadStarted lifecycle, capability-gated
thread.setSuggestedPrompts/setTitle, two SurfaceCapabilities flags + optional
adapter methods); @copilotkit/bot-slack adds the Bolt Assistant middleware
(assistant.ts), the chat.startStream transport with automatic legacy fallback
(native-stream.ts), a per-thread no-double-delivery listener guard, and
renderer pane-status mode. Everything degrades, never throws.
2026-06-15 15:42:03 +02:00
Alem Tuzlak c60674bfb5 feat(bot-whatsapp): public exports 2026-06-15 15:24:16 +02:00
Alem Tuzlak c1ee1a818f feat(bot-whatsapp): WhatsAppAdapter implementing PlatformAdapter 2026-06-15 15:03:20 +02:00
Alem Tuzlak 9e168bd937 feat(bot-whatsapp): default context (formatting + no-streaming guidance) 2026-06-15 14:50:44 +02:00
Alem Tuzlak fa239e99fc feat(bot-whatsapp): webhook ingress — listener + signed HTTP server 2026-06-15 14:46:50 +02:00
Alem Tuzlak 2dc28f4901 feat(bot-whatsapp): buffered run renderer (no streaming) 2026-06-15 14:40:05 +02:00
Alem Tuzlak b61cdc0e94 feat(bot-whatsapp): pluggable HistoryStore + per-turn history replay 2026-06-15 14:35:46 +02:00
Alem Tuzlak d261e70ebe feat(bot-whatsapp): interaction decode, Cloud API client, inbound media parts 2026-06-15 14:30:54 +02:00
Alem Tuzlak 4cbc178f6d feat(bot-whatsapp): map IR to Cloud API text/button/list payloads 2026-06-15 14:12:16 +02:00
Alem Tuzlak 185814ba61 feat(bot-whatsapp): add types, render limits, and markdown->WhatsApp transform 2026-06-15 14:03:56 +02:00
Alem Tuzlak 61c13f86bb chore(bot-whatsapp): scaffold package 2026-06-15 13:51:01 +02:00
Tyler Slaton f655013dd2 fix(showcase): harden built-in-agent root rollout 2026-06-12 17:17:18 -07:00
Mark dedaa66cef Merge branch 'main' into main 2026-06-12 12:40:55 -07:00
Mark Fogle 450d47f90e fix(react-ui): forward data-testid to chat textarea + align selector names
Addresses review feedback on #4215 / OSS-192.

- Thread an explicit `data-testid` prop through `AutoResizingTextarea` so it
  reaches the rendered <textarea>. The component destructures a fixed prop set
  with no `{...rest}` spread, so the id passed from Input.tsx was silently
  dropped and never landed in the DOM.
- Align selector names with the V2 components in @copilotkit/react-core:
  `copilot-chat-textarea` on the textarea and `copilot-send-button` on the send
  control. The legacy `data-test-id` values are preserved for back-compat.
- Add a source-level test asserting the Input wiring and that Textarea forwards
  the prop (the dropped-prop guard); the package's vitest runs in a node env
  with no DOM harness, matching the existing testids.test.ts convention.

Stable selectors let tests locate the controls; the headless input-driving
issue in #4215 remains a separate follow-up and should stay open.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 18:06:31 +00:00
jinhyuk9714 9639b8d4d6 fix(react-core): refresh thread headers on provider updates 2026-06-12 12:47:32 -05:00
Tyler Slaton 468b28b0d1 fix(vue): adjust pin-to-send spacer in both directions to keep the user message pinned
Ports the usePinToSend half of #5386 to the Vue package, which is a
documented 1:1 parity port and retained the shrink-only ResizeObserver.
When content below the anchored user message loses height (suggestions
swap, input resize), the spacer now grows back so total scrollable space
below the bubble stays constant and the message stays pinned (#5355).
Vue has no scroll-to-bottom button, so the listener half of #5386 does
not apply.
2026-06-12 10:44:47 -07:00
Tyler Slaton 930e182d41 fix(react-core): stabilize pin-to-send scrolling (#5386)
## What does this PR do?

Fixes `pin-to-send` scrolling in the v2 chat view.

- Re-attaches the non-autoscroll scroll listener after the real scroll
element mounts by depending on `nonAutoScrollEl`, not the stable
`scrollRef` object.
- Lets the `usePinToSend` spacer adjust in both directions as content
below the pinned user message changes, so the user message stays
anchored after streaming finishes and layout height changes.
- Adds regression coverage for the scroll-to-bottom button and spacer
adjustment behavior.

## Related PRs and Issues

Fixes #5355

## Tests

- `corepack pnpm -C packages/react-core exec vitest run
src/v2/hooks/__tests__/use-pin-to-send.test.tsx
src/v2/components/chat/__tests__/CopilotChatView.pinToSend.test.tsx`
- `corepack pnpm exec oxfmt --check
packages/react-core/src/v2/components/chat/CopilotChatView.tsx
packages/react-core/src/v2/hooks/use-pin-to-send.ts
packages/react-core/src/v2/hooks/__tests__/use-pin-to-send.test.tsx
packages/react-core/src/v2/components/chat/__tests__/CopilotChatView.pinToSend.test.tsx`
- `git diff --check`

Attempted:

- `corepack pnpm -C packages/react-core run check-types`
- This failed in the local workspace on existing/type-resolution issues
outside this diff, including `react-markdown` JSX namespace errors,
missing `@copilotkit/runtime-client-gql` declarations, and existing e2e
mock `AbstractAgent` private member mismatches.

## Checklist

- [x] I have read the [Contribution
Guide](https://github.com/copilotkit/copilotkit/blob/master/CONTRIBUTING.md)
- [x] If the PR changes or adds functionality, I have updated the
relevant documentation (N/A: bug fix only, no API/docs change)
- [x] "Allow edits by maintainers" is checked (lets us help iterate on
your PR directly — faster turnaround for everyone)
2026-06-12 10:34:38 -07:00
Austin Merrick 5e828aed9d fix(angular): emit fresh messages array so OnPush views render on addMessage (#5418)
Fixes #5416

## Problem

`AgentStore` mirrored the agent's messages into a signal via
`this.#messages.set(abstractAgent.messages)`. `AbstractAgent.addMessage`
pushes **in place** and notifies with the **same array reference**.
Angular signals compare with `Object.is`, so `set(sameRef)` is a no-op:
the signal never notifies, the OnPush `<copilot-chat>` view is never
marked dirty, and a freshly added message — including the user's own
bubble on submit — does not render until the run pipeline reassigns
`messages` to a new array at run completion.

## Fix

```ts
this.#messages.set([...abstractAgent.messages]);
```

A shallow copy gives the array a new identity, so the signal notifies
and OnPush views re-render immediately. The `Message` objects stay
referentially stable, so `trackBy` still avoids re-creating existing
bubbles.

`onStateChanged` is intentionally left unchanged: `AbstractAgent`
reassigns `this.state` to a freshly cloned reference on every change
(`setState(e) { this.state = clone(e) }`) and never mutates state in
place, so that signal already notifies correctly. Scoping the fix to
messages keeps it minimal.

## Tests

Added two regression tests in `agent.spec.ts`, both exercising the
in-place mutation path that the existing tests never hit (they assign a
fresh array each emit):

1. **Reference guard** — the store must not hand back the agent's live
`messages` array.
2. **OnPush re-render** — a count rendered in an OnPush *descendant* (a
root `detectChanges()` would force-check the root and hide the bug; only
a child whose dirty flag depends on the signal exposes it). Two in-place
pushes; the second is the same-reference no-op the fix repairs.

Both tests fail without the fix (`'1' to be '2' // Object.is equality`)
and pass with it.

## Verification

- `agent.spec.ts`: 6/6 pass
- full `@copilotkitnext/angular` suite: 50/50 pass
- `tsc --noEmit`: clean
2026-06-12 10:08:03 -07:00
Ben Taylor 6bbf33aee6 fix(shared): preserve lambda client cjs export (#5419)
## Summary
- export the telemetry lambda client as a named binding instead of
default-reexporting it through the shared barrel
- update shared telemetry internals/tests to consume the named binding
- add a built-package smoke check to ensure both CommonJS and ESM expose
`lambdaClient.send`

## Root Cause
`@copilotkit/shared` re-exported `lambdaClient` from a default export.
The unbundled CommonJS build emitted `exports.lambdaClient =
require_lambda_client`, so CommonJS consumers received the module
namespace object instead of the `{ send }` client. `@copilotkit/runtime`
then called `lambdaClient.send(...)` and crashed because `send` was
nested under `lambdaClient.default`.

## Validation
- `pnpm nx run @copilotkit/shared:build --skip-nx-cache`
- `node packages/shared/scripts/verify-cjs-exports.cjs`
- `pnpm nx run @copilotkit/shared:test --skip-nx-cache`
- `pnpm nx run @copilotkit/shared:check-types --skip-nx-cache`
- `pnpm nx run @copilotkit/shared:publint --skip-nx-cache`
- `pnpm nx run @copilotkit/runtime:build --skip-nx-cache`
- runtime CJS telemetry capture smoke test
- `pnpm nx run @copilotkit/runtime:test --skip-nx-cache --
src/v2/runtime/__tests__/telemetry.test.ts`
- pre-commit hook: `pnpm run test && pnpm run check:packages`
2026-06-12 12:01:14 -05:00
Austin Merrick 9275ec2ce0 fix(react-core): cover mermaid-block + sub/superscript streamdown styles 2026-06-12 09:49:45 -07:00
Tushar-Khandelwal-2004 f90c3dcfd7 fix(react-core): scope streamdown markdown styles 2026-06-12 09:49:44 -07:00
Mike Ryan 5eea242e1f fix(shared): preserve lambda client cjs export 2026-06-12 09:29:52 -07:00
Marco Castro d11fb33169 fix(angular): drop redundant comment on messages signal copy 2026-06-12 18:21:20 +02:00
Marco Castro aa71a6190c Merge branch 'main' into fix/5416-angular-agentstore-messages-ref 2026-06-12 18:17:36 +02:00
Marco Castro 05c6b9bdcd fix(angular): emit fresh messages array so OnPush views render on addMessage
AgentStore mirrored the agent's messages into a signal via
`this.#messages.set(abstractAgent.messages)`. AbstractAgent.addMessage
pushes in place and notifies with the same array reference, so the
signal's Object.is equality check treats set(sameRef) as a no-op: it
never notifies, the OnPush <copilot-chat> view is never marked dirty,
and a freshly added message (including the user's own on submit) does
not render until the run pipeline reassigns messages to a new array at
run completion.

Copy into a fresh array so the reference changes and the signal
notifies. Message objects stay referentially stable, so trackBy still
avoids re-creating existing bubbles. State is unaffected: AbstractAgent
reassigns this.state to a cloned reference on every change, so its
signal already notifies.

Adds regression tests covering the in-place mutation path: a reference
guard and an OnPush descendant re-render check. Both fail without the
fix.

Fixes #5416
2026-06-12 18:14:36 +02:00
Ran Shemtov e0f64c8f9e Merge branch 'main' into claude/a2ui-injection-config-9r2ve3 2026-06-12 17:01:20 +02:00
ranst91 02c3a8aef0 chore: release monorepo v1.60.1 2026-06-12 13:03:45 +00:00
Ran Shem Tov da5b50a929 fix(bot-slack): adapt runHttpRequest call to ag-ui 0.0.57 signature 2026-06-12 11:58:12 +02:00
Ran Shem Tov 7805a9a57b fix: update cpk to use latest agui core packages 2026-06-12 11:16:19 +02:00
Austin Merrick de9d46d1df docs(skills): migrate CopilotKit skills to the v2 API
Bring the agent skills in line with the shipped v2 API so their examples
install, compile, and connect. Extends #5345 (which migrated the
copilotkit-setup SKILL.md body) to the rest of the skills.

- Imports: drop the nonexistent @copilotkit/react and @copilotkit/agent
  packages and the bare @copilotkit/runtime/express subpath; use
  @copilotkit/react-core/v2 and @copilotkit/runtime/v2 (+ /v2/express),
  and createCopilotHonoHandler / createCopilotExpressHandler rather than
  the deprecated createCopilotEndpoint aliases.
- Provider: CopilotKit from @copilotkit/react-core/v2 with
  useSingleEndpoint={false} on multi-route setups (the v1-compat bridge
  defaults to single transport and would 404 a multi-route backend).
- Routes: v2 catch-all Hono handler exporting GET/POST/PATCH/DELETE via
  handle() from hono/vercel, replacing the v1
  copilotRuntimeNextJSAppRouterEndpoint + ExperimentalEmptyAdapter.
- Integrations: per-framework agent classes matched to the shipped
  examples (LangGraphAgent/LangGraphHttpAgent from @copilotkit/runtime/
  langgraph, CrewAIAgent, MastraAgent, LlamaIndexAgent, HttpAgent from
  @ag-ui/client; Agno via HttpAgent, not @ag-ui/agno).
- Hooks/props: correct useAgent, useThreads, useRenderTool, identifyUser,
  and the chat-component props (defaultOpen, onSubmitMessage, the headless
  CopilotChatView render prop).

Validated across review rounds and a build test against the published
@copilotkit/*@1.60.0 packages (tsc passes, every /v2 subpath resolves).
Regenerated the skills/runtime and skills/react-core mirrors.
2026-06-11 14:43:45 -07:00