3119 Commits

Author SHA1 Message Date
Alem Tuzlak cb4189acdf fix: forward credentials on all agent registration paths (#3839)
Closes #3141

`applyCredentialsToAgents`/`applyCredentialsToAgent` were defined but
never called from `initialize()`, `setAgents__unsafe_dev_only()`, or
`addAgent__unsafe_dev_only()`. Only remote agents received credentials
via constructor. Local agents now receive credentials alongside headers.

Split from #3838.
2026-04-16 11:45:32 +02:00
Alem Tuzlak 9641933e13 fix: pass toolCallId to useRenderTool render components (#3843)
Closes #3741

Add `toolCallId` prop to all three status branches (InProgress,
Executing, Complete) of the ToolCallRenderer, and update the
`ReactToolCallRenderer` type to include it in the discriminated union.

Split from #3838.
2026-04-16 11:42:45 +02:00
Alem Tuzlak 12dda2dc51 fix: preserve jsonSchema structure in MCP tool parameter extraction (#3846)
Closes #1936

`extractParametersFromSchema` now preserves enum values as structured
data on string parameters, recursively extracts nested object
attributes, and converts object arrays to `object[]` type with
attributes. This ensures complex MCP tool schemas survive the
`Parameter[]` -> Zod conversion without losing nested structure.

Split from #3838.
2026-04-16 11:42:24 +02:00
Alem Tuzlak 26ac5460aa feat(vscode-extension): extract real component schema from catalog via extractCatalogComponentSchemas for authoritative prop validation 2026-04-16 10:43:29 +02:00
Alem Tuzlak 42d8eb84ac feat(vscode-extension): fixture re-render on change, deep prop validation with typo detection from dynamic schema registry 2026-04-16 10:27:06 +02:00
Alem Tuzlak 83a89bdfab fix(vscode-extension): detect catalog by shape instead of hardcoded export name 2026-04-16 10:09:22 +02:00
Maxim b8d6e14138 fix(tests): improve test hygiene — remove type casts, reduce duplication
Core test (core-subscribe-to-agent.test.ts):
- Replace `as any` on RunErrorEvent with proper EventType.RUN_ERROR type
- Consolidate 4 identical lifecycle tests into one `it.each` block
- Extract silenceConsoleError() helper used across 10 error-path tests
- Document the remaining intentional `as any` in guardAll JS-consumer test

Angular test (agent.spec.ts):
- Make MockAgent extend AbstractAgent, removing all 4 `as unknown as AbstractAgent` double casts
- Replace all `any` types with proper AG-UI types (Message, State, AgentSubscriber, etc.)
- Emit helpers now pass correct AgentSubscriberParams instead of empty objects
- Use userMsg() factory for properly typed test data
- Simplify ProxiedCopilotRuntimeAgent assertion with single narrowing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 01:02:36 +02:00
Maxim bb6f02c62a fix(core,react-core): handle onRunErrorEvent in useAgent and document in subscribeToAgentWithOptions
React's useAgent was missing onRunErrorEvent under OnRunStatusChanged,
causing isRunning to stay true after protocol-level RUN_ERROR events
(infinite spinner). Angular already handled this via PR #3749.

Also updates SubscribeToAgentSubscriber JSDoc to accurately document
onRunErrorEvent as the sixth allowed callback with rationale for its
inclusion despite having stopPropagation in its return type, and adds
a core-level test for onRunErrorEvent firing immediately during
throttle windows.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 00:08:25 +02:00
Maxim 96f230c7cc fix: resolve rebase conflicts — active flag, onRunErrorEvent, async tests
- Restore `let active` guard in useAgent subscription effect (removed
  during refactor, causing ReferenceError in batchedForceUpdate)
- Add onRunErrorEvent to SubscribeToAgentSubscriber allowed keys
  (added on main for Angular AgentStore)
- Fix throttle tests to use async act() for onStateChanged assertions
  (batchedForceUpdate uses queueMicrotask, needs await to flush)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 23:15:45 +02:00
Maxim b8f4a8faa0 refactor: replace custom throttle with @tanstack/pacer Throttler
Replace the hand-rolled leading+trailing throttle (scheduleOrFlush,
setTimeout, throttleActive state machine) with TanStack Pacer's
Throttler class. Clean up comments to describe the method generically
rather than only in terms of throttling.

No public API changes — throttleMs / defaultThrottleMs stay as-is.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:14:50 +02:00
Maxim 47b46e456e fix: make guardAll type-safe, remove any casts
Address review feedback: replace Object.entries loop in guardAll
with explicit per-key wrapping so TypeScript can verify all
callback signatures without any casts. Also replace Promise
duck-typing in safeCall with instanceof Promise, and use
Record<string, unknown> instead of any in the unsupported keys check.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:17 +02:00
Maxim 18a9ad6e58 fix: rename subscribeToAgent to subscribeToAgentWithOptions on CopilotKitCore
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:16 +02:00
Maxim 0ae5e4606c fix: warn about unsupported callback keys in both throttled and unthrottled paths
Move the unsupported-key scan from guardAll into a pre-scan that runs
before the throttled/unthrottled branch, so JS consumers passing
unsupported callbacks (e.g. onEvent via `as any`) get a console.warn
regardless of whether throttling is active. Previously, guardAll only
ran on lifecycleOnly in the throttled path, silently dropping
unsupported keys without any diagnostic.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:15 +02:00
Maxim d8b60f5a1c fix: address PR review — error monitoring, Angular Error state, type safety
- Add Error state handling in Angular CopilotkitAgentFactory (parity with React)
- Add emitError to guardAll for dropped callbacks (structured monitoring)
- Add emitError to setDefaultThrottleMs for monitoring parity
- Replace empty .catch(() => {}) with logging pattern on emitError
- Add generic typing to safeCall for call-site parameter safety
- Clarify flushPending comment re: sync-only unsubscribe guard

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:15 +02:00
Maxim 1f74c59eca fix: address review findings — type safety, JSDoc accuracy, and test coverage
- Add `satisfies readonly (keyof AgentSubscriber)[]` to SUBSCRIBE_TO_AGENT_KEYS
  so upstream AG-UI renames are caught at compile time
- Fix SubscribeToAgentSubscriber JSDoc: separate AG-UI event handlers (mutation
  semantics) from per-item callbacks (void return, excluded for surface area),
  note that included lifecycle callbacks also return AgentStateMutation
- Emit invalid throttleMs through emitError so monitoring systems see
  misconfiguration, not just console.error
- Add flushPending comment explaining the re-checked `active` flag between
  onMessagesChanged and onStateChanged dispatch
- Derive SubscribeToAgentFn from CopilotKitCore['subscribeToAgent'] instead
  of manually duplicating the signature (eliminates desync risk)
- Derive StubCore from Pick<CopilotKitCore, ...> in Angular tests
- Add test: async rejection during throttled trailing-edge flush
- Add test: clearing defaultThrottleMs(undefined) makes new subs unthrottled

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:14 +02:00
Maxim 7b94afd862 fix: address code review findings for subscribeToAgent
- Add .catch() to emitError() in reportError to prevent unhandled
  promise rejections if the error reporting infrastructure itself fails
- Add console.warn in guardAll when unsupported callback keys are
  dropped, so JS consumers discover they need agent.subscribe() directly
- Hoist ALLOWED_KEYS Set to module scope to avoid per-call allocation
- Fix SubscribeToAgentSubscriber JSDoc: explicitly list the 5 supported
  callbacks and mention onNewMessage/onNewToolCall as excluded
- DRY subscribeToAgent() method JSDoc by referencing the type instead
  of duplicating the AG-UI exclusion rationale
- Fix safeCall comment: async error path returns Promise<undefined>,
  not undefined
- Add JSDoc to setDefaultThrottleMs setter; simplify getter JSDoc
- Fix use-agent.tsx: consistent camelCase callback names, fix @default
  tag format, replace unresolvable {@link} with plain text reference
- Add test: emitError/onError integration for SUBSCRIBER_CALLBACK_FAILED
- Add test: unsubscribe + throw combination in onMessagesChanged
- Add test: unsupported callback keys dropped with console.warn

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:14 +02:00
Maxim a35dc88f96 fix: decouple AgentStore from CopilotKitCore concrete class
AgentStore now receives a SubscribeToAgentFn function instead of a
CopilotKitCore instance. The factory binds core.subscribeToAgent once
and passes the bound function, keeping AgentStore decoupled from the
core class while preserving all throttle and error-protection behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:13 +02:00
Maxim b9f5679937 fix: add emitError integration, safeCall docs, and single-source ALLOWED_KEYS
- Add SUBSCRIBER_CALLBACK_FAILED error code and call emitError() in
  safeCall so subscriber failures are visible to monitoring systems
  and onError handlers, not just console.error
- Document that safeCall intentionally discards return values on the
  error path (including lifecycle AgentStateMutation)
- Extract SUBSCRIBE_TO_AGENT_KEYS tuple as single source of truth for
  both the SubscribeToAgentSubscriber type and the runtime ALLOWED_KEYS
  set, eliminating the one-directional sync risk from the satisfies pattern

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:13 +02:00
Maxim 7fb4ddcd01 fix: improve type safety, error context, and JSDoc accuracy in subscribeToAgent
- Type `handlers` in use-agent.tsx as `SubscribeToAgentSubscriber` instead
  of full `AgentSubscriber` to prevent silent runtime stripping of unsupported
  callbacks
- Reframe AG-UI exclusion JSDoc: designed for observation, not event mutation
  (stopPropagation semantics can't be safely mediated)
- Add `satisfies` constraint to ALLOWED_KEYS so it stays synchronized with
  the SubscribeToAgentSubscriber Pick type at compile time
- Use `.then` instead of `.catch` for standard thenable detection in safeCall
- Include agent ID in all safeCall error messages for multi-agent debugging
- Only wrap lifecycle callbacks in guardAll for throttled path (messages/state
  wrappers were immediately overwritten — wasted work)
- Fix "pending flags" → "pending params" in inline comment

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:12 +02:00
Maxim 5a8585eb38 fix: remove type casts and lazy types from test files
Replace `as any` cast in notifyLifecycle with type-safe branching,
type the re-entrant test callback params via SubscribeToAgentSubscriber,
and replace `Record<string, any>` on Angular stub's core with a
typed StubCore interface.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:11 +02:00
Maxim b234f466e8 fix: address review findings for subscribeToAgent
- Add ALLOWED_KEYS filter in guardAll to prevent runtime leakage of
  extra properties from JS consumers or `as any` casts
- Check `active` flag between flushPending dispatches so unsubscribing
  inside onMessagesChanged prevents onStateChanged from firing
- Use real CopilotKitCore instance in Angular test stub instead of
  passthrough that bypasses throttle and safeCall logic
- Reword SubscribeToAgentSubscriber and subscribeToAgent JSDoc to
  accurately explain why AG-UI event handlers are excluded (mutation
  return values silently discarded) rather than implying a clean
  return-type split
- Add leading+trailing pattern summary to useAgent throttleMs JSDoc
- Fix setDefaultThrottleMs JSDoc: "logged as errors and ignored"
  instead of ambiguous "rejected by the setter"
- Add tests: re-entrant notifications during flush, multiple
  simultaneous subscriptions with independent throttle windows,
  unsubscribe isolation, unsubscribe-during-flush prevents sibling

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:11 +02:00
Maxim 4483f67233 fix: narrow subscribeToAgent subscriber type to prevent mutation-semantic misuse
Introduce SubscribeToAgentSubscriber, a Pick of AgentSubscriber limited
to the five notification/lifecycle callbacks (onMessagesChanged,
onStateChanged, onRunInitialized, onRunFinalized, onRunFailed). Event
handlers that return AgentStateMutation (e.g. onEvent,
onToolCallStartEvent) should use agent.subscribe() directly so their
mutation and stopPropagation semantics are preserved — safeCall's
error-swallowing would silently discard those return values.

This is a compile-time constraint only; no runtime behavior changes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:10 +02:00
Maxim b6388b6c61 fix: guard all subscriber callbacks with safeCall and propagate return values
Address code review findings for subscribeToAgent:

- Wrap ALL subscriber callbacks (not just onMessagesChanged/onStateChanged)
  with safeCall error protection so a throwing lifecycle or event callback
  cannot corrupt the agent's notification loop
- safeCall now returns the result on the success path, preserving
  AgentStateMutation return values from subscriber callbacks
- Extract SubscribeToAgentOptions named interface for extensibility
- Remove redundant pendingMessages/pendingState boolean flags — use
  latestMessagesParams/latestStateParams !== null instead
- Add guardAll helper used by both throttled and unthrottled paths
- Fix JSDoc: reference public defaultThrottleMs (not private field),
  document shared throttle window, use callback names instead of enum
- Add 5 new core-level tests: trailing-edge re-arm, onRunFailed
  passthrough, async rejection handling, unthrottled exception safety,
  unthrottled lifecycle exception safety
- Extract RUN_INPUT constant and notifyLifecycle helper, reducing test
  helper duplication
- Remove ephemeral review-reference from test section header

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:09:10 +02:00
Maxim 2f78aac5f0 fix: handle async callback rejections and guard unthrottled path
- 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>
2026-04-15 22:09:09 +02:00
Maxim ee84bce204 fix: harden subscribeToAgent with try-catch and add core-level tests
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>
2026-04-15 22:09:08 +02:00
Maxim f1fc008314 refactor: move throttle logic from useAgent hook to CopilotKitCore.subscribeToAgent
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>
2026-04-15 22:09:08 +02:00
Martha Schumann cdffd8409b fix(react-core): remove redundant copilotkit.headers from useEffect deps
copilotkit.headers is already captured by headersKey (a stable memoized
string). Keeping the raw headers object in the dep array causes the context
effect to re-run on every render because mock (and real) copilotkit objects
return new header object references, leading to an unhandled
"threads is not iterable" error in tests when the spurious re-run consumed
the wrong fetchMock slot.

Also adds getThreadStore (singular) to MockCore in web-inspector.spec.ts so
ensureOwnedThreadStore can call core.getThreadStore() without throwing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 10:38:10 -07:00
ranst91 cfb5921108 chore: release monorepo v1.56.0 2026-04-15 17:22:27 +00:00
Alem Tuzlak 3ca1ca0cd4 feat(vscode-extension): dynamic component registry with catalog scanning and precise diagnostic positioning 2026-04-15 18:40:03 +02:00
Alem Tuzlak 45b5295cd5 feat(vscode-extension): deep fixture validation with value checks for A2UI v0.9 protocol 2026-04-15 18:31:03 +02:00
Alem Tuzlak 556b311b9f feat(vscode-extension): add live fixture validation with diagnostics on every keystroke 2026-04-15 18:25:49 +02:00
Alem Tuzlak 38cc56e643 feat(vscode-extension): add UserProfile, ProjectBoard, and ChatInterface demo catalogs with fixtures 2026-04-15 18:22:07 +02:00
Alem Tuzlak 8b8c2b9efb feat(vscode-extension): use @tailwindcss/browser CDN for runtime Tailwind JIT, keep CSS extraction for imports 2026-04-15 18:15:37 +02:00
Ran Shem Tov 6986a1c120 fix: use latest agui langgraph packages 2026-04-15 18:11:17 +02:00
Alem Tuzlak d7d9f752a9 feat(vscode-extension): runtime Tailwind JIT and CSS extraction from component imports 2026-04-15 18:08:24 +02:00
Alem Tuzlak e436e915ac feat(vscode-extension): add Tailwind CSS to webview with mixed styling demo (inline + Tailwind) 2026-04-15 17:48:52 +02:00
Alem Tuzlak b7e009c56b fix: correct verbose default in docs and remove stray vscode-extension README
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.
2026-04-15 17:18:09 +02:00
Alem Tuzlak 9953b8a264 Merge branch 'main' into worktree-lucky-popping-wren 2026-04-15 17:12:55 +02:00
Alem Tuzlak f36f5c3cc9 fix(vscode-extension): wire fixture selection from sidebar through to webview 2026-04-15 15:17:41 +02:00
Alem Tuzlak 01b5db56f5 fix(vscode-extension): add 16px padding around preview content 2026-04-15 15:11:48 +02:00
Alem Tuzlak becb89273c fix(vscode-extension): use Column root with children tree so all components render 2026-04-15 15:10:21 +02:00
Alem Tuzlak bf70d1c23b feat(vscode-extension): add polished demo catalog with weather, metrics, sales, and alerts fixtures 2026-04-15 15:07:07 +02:00
Alem Tuzlak 771069bcb9 fix(vscode-extension): wait for catalog before rendering, fix fixture format and test 2026-04-15 14:59:33 +02:00
Markus Ecker d51140ebbc chore: bump @ag-ui/a2ui-middleware to 0.0.5 2026-04-15 14:56:51 +02:00
Alem Tuzlak be6013f8f7 fix(vscode-extension): use correct A2UI v0.9 message format in fixtures and force provider remount on catalog change 2026-04-15 14:53:39 +02:00
Alem Tuzlak 8c5c22f1e5 fix(vscode-extension): add connect-src to CSP for sourcemap loading 2026-04-15 14:45:56 +02:00
Alem Tuzlak 2f78346286 fix(vscode-extension): use assignment instead of delete for window global cleanup in strict mode 2026-04-15 14:43:06 +02:00
Alem Tuzlak 05687064a1 fix(vscode-extension): resolve a2ui-renderer to TypeScript source to avoid CJS interop TDZ error 2026-04-15 14:41:03 +02:00
Alem Tuzlak 636df24872 fix(vscode-extension): switch webview to ESM format to fix circular dependency in a2ui-renderer 2026-04-15 14:37:58 +02:00
Alem Tuzlak 1c722a99b6 fix(vscode-extension): fix webview bundling — use IIFE with globals, noExternal, and node-resolve-fallback for pnpm 2026-04-15 14:33:48 +02:00