`@a2ui/lit` registers the "a2ui-root" custom element via Lit's
@customElement decorator as a side effect when its UI module loads.
React Strict Mode double-mounts components, and since
customElements.define() is irreversible, the second mount throws:
"the name a2ui-root has already been used with this registry"
Several a2ui-renderer files used value imports from "@a2ui/lit" when
only types were needed, pulling in the full module tree including
the custom element registration. Changed to `import type` where
possible and switched to the narrower `@a2ui/lit/0.8` subpath
(core.js only, no UI/custom element registration) where value
access is needed.
https://claude.ai/code/session_01CUPfWAF8EmLieEasaepAgp
After downloading the agentcore template, remove files that don't apply
to the selected framework: the other agent directory, the other deploy
script, and the terraform infra. Rename the remaining deploy script to
deploy.sh for a single obvious entry point.
https://claude.ai/code/session_01LeSq6n4oGs8FocDSnSV6c7
Add two new framework options to `cpk create` that scaffold AgentCore-based
projects with either LangGraph or Strands. Both download the agentcore
example template and auto-configure config.yaml with the correct agent
pattern and stack name suffix.
https://claude.ai/code/session_01LeSq6n4oGs8FocDSnSV6c7
- Fix fetchRuntimeInfoAutoDetect in agent.ts to use 2xx-only check
(was checking only 404/405, now aligns with agent-registry.ts)
- Remove duplicate JSDoc block on fetchRuntimeInfoAutoDetect
- Add 7 edge case tests: 500/403/405/network-error/both-fail scenarios
- Add 4 tests for useSingleEndpoint->runtimeTransport ternary mapping
- Update Angular test stubs to use "auto" default (was "rest")
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Instead of requiring users to explicitly set transport: "single", the
client now auto-detects the transport mode by trying REST (GET /info)
first and falling back to single-endpoint (POST with { method: "info" })
if the REST probe returns 404/405 or fails. The explicit flag is kept
for backward compatibility.
https://claude.ai/code/session_016xtYN15TY2BaBviryTcVyY
Replace full JSON.stringify(agent.messages) memo dep with a lightweight
fingerprint (length + last-id + last-content + last tool-call args) so only
the in-flight message is serialized on each render instead of the whole array.
Wrap deduplicatedMessages in useMemo([messages]) so the Map is not
reconstructed on every render cycle.
Add generateMessages(n) factory to test-helpers for perf-focused tests, a
vitest bench for the dedup map at 100/1000 messages, and three regression
tests that assert completed messages do not re-render when new messages or
state snapshots arrive.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
createLicenseChecker was called unconditionally in BaseCopilotRuntime,
printing the "No license token configured" banner even for open-source
SSE-mode users who don't use any licensed features. Moved it to
CopilotIntelligenceRuntime only.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All @copilotkit/* packages were missing type declarations in their exports
map. This meant TypeScript couldn't resolve types for subpath imports like
@copilotkit/react-core/v2 without manual tsconfig paths workarounds
pointing to dist .d.ts files (which no longer exist after the tsup to
tsdown migration).
Uses nested conditional exports to map .d.mts for ESM and .d.cts for CJS
consumers, satisfying both attw and TypeScript module resolution under
nodenext and bundler modes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@copilotkit/shared was doing `export * from "@copilotkit/license-verifier"`,
which pulled the entire license-verifier bundle (including Node's `crypto`)
into any client-side consumer. This caused "Module not found: Can't resolve
'crypto'" errors for users bundling @copilotkit/react-core for the browser.
Now shared only re-exports types (erased at compile time) and a client-safe
`createLicenseContextValue` inlined without crypto. Runtime imports
`createLicenseChecker` and `getLicenseWarningHeader` directly from
`@copilotkit/license-verifier`.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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
- Introduced message factory functions to eliminate `as any` type assertions for message literals.
- Updated test cases to utilize the new message factories for improved clarity and type safety.
- Added helper functions for subscriber notifications to streamline test setup.
This refactor improves code readability and maintainability in the test suite for the useAgent hook.
- Replace Date.now()-based throttle with flag-based leading+trailing
pattern that is immune to wall-clock jumps
- Wrap throttleMs validation in useMemo to warn once per value change
instead of on every render
- Remove phantom AbstractAgent.notificationThrottleMs JSDoc reference
- Reorder cleanup to clear timer before unsubscribing for safety
- Add tests for trailing-edge data freshness, timer precision, and
dynamic throttleMs prop changes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix JSDoc to accurately describe behavior for negative/non-finite values
- Remove NODE_ENV guard so console.warn fires in all environments
- Use derived effectiveThrottleMs instead of mutating destructured param
- Simplify handler wrappers: direct references instead of arrow wrappers
- Remove stale comment about content stripping
- Add parameterized tests for invalid throttleMs (NaN, Infinity, -1, -Infinity)
- Fix misleading test comment
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Addresses code review findings:
- Merge two separate useEffect hooks into one to eliminate dual-subscription
race window and simplify cleanup
- Add active boolean guard to prevent forceUpdate after unmount/re-run
- Validate throttleMs input (reject NaN, Infinity, negatives with dev warning)
- Expand JSDoc with scope, constraints, and notificationThrottleMs interaction
- Replace JSON.stringify(updateFlags) with direct ref in effect deps
- Strengthen unmount test with render counter instead of not.toThrow()
- Add 5 new test cases: explicit zero, rapid burst, new cycle after trailing,
updates excluding OnMessagesChanged, subscription cleanup verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds optional `throttleMs` parameter to `useAgent()` that coalesces
rapid onMessagesChanged notifications (per-token TEXT_MESSAGE_CHUNK
events) into fewer React re-renders using a leading+trailing throttle.
- throttleMs=0 (default): exact current behavior, zero overhead
- throttleMs>0: only onMessagesChanged is throttled; onStateChanged
and onRunStatusChanged always fire immediately
- Leading+trailing: first call immediate, last call guaranteed
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The previous publish workflow released 1.55.0-next.8 to npm but the
post-release commit failed to push to main (blocked by branch
protection). This applies the version bumps and pre.json updates that
the workflow would have committed, unblocking future releases.
https://claude.ai/code/session_01N8sLK9h9p6FdRjyHqzKzVV
CopilotMessages received an array of children (memoizedChildren +
RegisteredActionsRenderer) without keys, causing a React "unique key prop"
warning in dev mode. Wrap memoizedChildren in a keyed Fragment and add a
key to RegisteredActionsRenderer.
https://claude.ai/code/session_01N8sLK9h9p6FdRjyHqzKzVV
The WebInspectorElement schedules 300ms setTimeout callbacks to clean up
document.body.style.transition after dock/undock animations. When the
element is removed from the DOM (e.g. during test teardown), these timers
fire after jsdom has been destroyed, causing "ReferenceError: document is
not defined" — which vitest reports as unhandled errors and fails the run.
Track all body-transition timer IDs and clear them in disconnectedCallback.
Skip transition animation entirely during disconnect since the element is
being removed and the animation serves no purpose.
https://claude.ai/code/session_01W2Kb2HXsjZett3HdqM9zay
- 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
- Call closeReasoningIfOpen() once before the switch instead of in every case branch
- Remove as-casts from closeReasoningIfOpen by using typed const variables
- Remove as-casts from new test code; use typed imports and unknown-safe casts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add cardinality assertions (toHaveLength(1)) to all 5 auto-close tests
so duplicate REASONING_MESSAGE_END / REASONING_END events are caught
- Add missing RUN_FINISHED final-event assertion to abort auto-close test
- Add test for consecutive reasoning blocks with no reasoning-end between
them (exercises closeReasoningIfOpen inside reasoning-start)
- Add test for exception thrown mid-stream (exercises catch block path)
- Add test for stream exhaustion without terminal event while reasoning is
open (exercises !terminalEventEmitted fallback)
- Expand changeset description to cover all three behavioral fixes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- reasoning-end case now delegates to closeReasoningIfOpen() so a late
SDK-emitted reasoning-end is a no-op when auto-close already fired,
preventing duplicate REASONING_MESSAGE_END + REASONING_END events
- Hoist isInReasoning / reasoningMessageId / closeReasoningIfOpen before
the try block so the catch block can call closeReasoningIfOpen() --
exceptions thrown mid-reasoning now emit proper lifecycle events before
RUN_ERROR instead of leaking an unclosed reasoning state
- Remove dead (part as any).delta fallback in reasoning-delta case; the
SDK always provides part.text in this branch
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When closeReasoningIfOpen() auto-closes a prior block and a second
reasoning-start arrives with id="0" or no id, the handler was silently
reusing the previous reasoningMessageId. Mirror the text-start pattern:
always call randomUUID() when the provider id is falsy or "0".
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Call closeReasoningIfOpen() in the reasoning-start handler before opening
a new block, guarding against consecutive reasoning blocks without an
intervening reasoning-end (e.g. Anthropic extended thinking with tools)
- Call closeReasoningIfOpen() in the !terminalEventEmitted fallback block
so streams that end without a finish/abort/error event still close properly
- Add abort() test-helper and tests for abort + error cases with open reasoning
- Strengthen auto-close ordering assertions to explicitly verify
REASONING_MESSAGE_END precedes REASONING_END in all three auto-close tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two fixes for Anthropic model stalls (fixes#3323):
1. Skip reasoning-delta events with empty text — EventSchemas.parse()
rejects delta: "" and kills the RxJS Observable before any other
events can fire.
2. Auto-close open reasoning lifecycle at every phase transition —
@ai-sdk/anthropic never emits reasoning-end, leaving the state
machine stuck.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>