Commit Graph

10887 Commits

Author SHA1 Message Date
Jordan Ritter 39ec297af4 feat(react-native): wire UI components into package exports and config
Add peer dependencies, export new components and hooks from package entry point, integrate RenderToolProvider into CopilotKitProvider, configure vitest and tsdown, add usage documentation.
2026-05-22 14:26:27 -07:00
Jordan Ritter c7775fed7e feat(react-native): add CopilotChat and CopilotModal components
FlatList-based chat interface and bottom-sheet modal overlay. Includes suggestion pills, keyboard avoidance, custom FlatList support, and comprehensive test coverage.
2026-05-22 14:26:26 -07:00
Jordan Ritter 24db94492b feat(react-native): add useRenderTool hook and RenderToolContext
Hook for rendering custom tool UIs in React Native with a store-based context provider. Includes tests for register/unregister, subscriber notification, and error handling.
2026-05-22 14:26:26 -07:00
Jordan Ritter f99f65f136 feat(react-native): add Markdown, AssistantMessage, UserMessage, and TypingIndicator components
Message bubble components with streaming markdown support, typing indicator animation, and timestamp formatting. Includes unit tests and edge case coverage.
2026-05-22 14:26:26 -07:00
Jordan Ritter 9a3d997a04 chore: update showcase pin-drift baseline (#4985)
## Summary

- Update validatePinsFailCount from 93 to 102 and hash to match current
state
- Pin drift accumulated from recent showcase dependency changes on main

## Test plan

- [ ] Validate Showcase check passes with updated baseline
2026-05-22 14:26:17 -07:00
Jordan Ritter cb086c0794 chore: update showcase pin-drift baseline to 102 2026-05-22 14:11:04 -07:00
Jordan Ritter 3234d01ca5 Migrate showcase + examples to v2 CopilotKit API surface (#4566)
## Summary

- **Showcase (19 package.json files)**: Pin `@copilotkit/*` deps from
stale `"next"` dist-tag (1.55.2-next.1) to `"latest"` (1.56.5). The
`"next"` tag was a Docker build workaround that went stale since
Renovate doesn't cover `showcase/`.

- **Examples (15 integrations)**: Migrate from v1 compatibility facade
to native v2 API surface. The v1 surface delegates to v2 internally, so
this is an API consistency change — not a behavioral one.

### v1 → v2 changes applied
| Category | v1 (compat facade) | v2 (native) |
|---|---|---|
| React imports | `@copilotkit/react-core` | `@copilotkit/react-core/v2`
|
| UI package | `@copilotkit/react-ui` | `@copilotkit/react-core/v2`
(unified) |
| Styles | `react-ui/styles.css` | `react-core/v2/styles.css` |
| Runtime | `@copilotkit/runtime` | `@copilotkit/runtime/v2` |
| Endpoint | `copilotRuntimeNextJSAppRouterEndpoint` |
`createCopilotEndpoint` + hono |
| Adapter | `ExperimentalEmptyAdapter` | `InMemoryAgentRunner` |
| Hooks | `useCoAgent` / `useCopilotAction` | `useAgent` /
`useFrontendTool` |

### Integrations migrated (v1 → v2)
a2a-middleware, adk, agno, crewai-crews, crewai-flows, langgraph-js,
llamaindex, mastra, ms-agent-framework-dotnet,
ms-agent-framework-python, pydantic-ai, strands-python

### Mixed integrations cleaned (stale deps removed)
agent-spec, agentcore, langgraph-fastapi, langgraph-python,
langgraph-python-threads

## Test plan
- [ ] Verify showcase Docker builds still resolve `@copilotkit/*` deps
- [ ] Spot-check 2-3 example integrations run locally (e.g.
langgraph-js, crewai-crews)
- [ ] Confirm no `@copilotkit/react-ui` imports remain in migrated
integrations
- [ ] Verify runtime endpoint works with `[[...slug]]` catch-all route
pattern
2026-05-22 13:58:11 -07:00
github-actions[bot] 1a2cce1b46 style: auto-fix formatting 2026-05-22 19:10:53 +00:00
Jordan Ritter 23af69041c fix(examples): migrate integrations from v1 to v2 API surface
Migrate 15 example integrations from the v1 compatibility facade to
native v2 CopilotKit APIs. The v1 surface delegates to v2 internally
so this is an API surface change, not a functional one.

Key changes per integration:
- Import paths: @copilotkit/react-core -> react-core/v2,
  @copilotkit/runtime -> runtime/v2
- Hook renames: useCoAgent -> useAgent, useCopilotAction ->
  useFrontendTool, useRenderToolCall -> useRenderTool
- UI: CopilotSidebar from react-ui -> react-core/v2
- Styles: react-ui/styles.css -> react-core/v2/styles.css
- Runtime: copilotRuntimeNextJSAppRouterEndpoint ->
  createCopilotEndpoint + hono/vercel
- Removed @copilotkit/react-ui and @copilotkit/shared deps

Integrations migrated (v1 -> v2):
  a2a-middleware, adk, agno, crewai-crews, crewai-flows,
  langgraph-js, llamaindex, mastra, ms-agent-framework-dotnet,
  ms-agent-framework-python, pydantic-ai, strands-python

Mixed integrations cleaned up (stale deps removed):
  agent-spec, agentcore, langgraph-fastapi, langgraph-python,
  langgraph-python-threads
2026-05-22 12:10:00 -07:00
Jordan Ritter a30be17798 fix(showcase): pin @copilotkit deps to latest instead of stale next tag
The "next" dist-tag was a workaround for Docker builds that can't resolve
workspace:* — but "next" has gone stale (1.55.2-next.1) while "latest" is
at 1.56.5. Renovate doesn't cover showcase/, so these never auto-bumped.
Switch all 19 showcase package.json files to "latest".
2026-05-22 12:06:17 -07:00
github-actions[bot] 2196dc5d7e style: auto-fix formatting 2026-05-22 18:33:22 +00:00
Austin Merrick ff4e58f704 fix(skills): update sync tests to reflect new RESERVED_LIFECYCLE_SLUGS 2026-05-22 11:32:31 -07:00
Austin Merrick 2838e002a5 fix(skills): remove deleted lifecycle slugs from RESERVED_LIFECYCLE_SLUGS 2026-05-22 10:50:26 -07:00
Austin Merrick eeb2971534 fix(skills): restore nx-mcp server in .mcp.json alongside copilotkit-docs 2026-05-22 10:44:02 -07:00
Austin Merrick 19314ed3fa chore(skills): bump plugin version to 1.57.4 2026-05-22 10:33:59 -07:00
Austin Merrick 0560247fec feat(skills): replace lifecycle skills with copilotkit-* from CopilotKit/skills
- Remove 6 old auto-generated lifecycle skills (0-to-working-chat,
  debug-and-troubleshoot, go-to-production, scale-to-multi-agent,
  spa-without-runtime, v1-to-v2-migration)
- Add 8 canonical skills verbatim from github.com/CopilotKit/skills:
  copilotkit-setup, copilotkit-develop, copilotkit-agui,
  copilotkit-integrations, copilotkit-debug, copilotkit-upgrade,
  copilotkit-contribute, copilotkit-self-update
- Update copilotkit-self-update install command to reference CopilotKit/CopilotKit
- Add .claude-plugin/{plugin,marketplace}.json and .mcp.json (repo URL and
  version updated to match monorepo: CopilotKit/CopilotKit, v1.57.3)
- Exempt copilotkit-* slugs from sync orphan detection in sync-plugin-skills.ts;
  runtime/react-core/a2ui-renderer remain synced from packages/*/skills as before
2026-05-22 10:04:41 -07:00
Alem Tuzlak 98ba3b1bb4 feat(showcase/ms-agent-dotnet): reach D5 parity (#4973)
## Summary

This brings `showcase/integrations/ms-agent-dotnet` to LangGraph Python
D5 parity across the showcase manifest.

- ports the LGP demo pages, suggestion pills, shared helpers, and e2e
specs into `ms-agent-dotnet`
- adds .NET parity agents and runtime routing for the D5 cells,
including A2UI, beautiful-chat, HITL, multimodal, shared state,
reasoning, subagents, tool-rendering, and voice
- fixes replay/runtime gaps found under the full D5 suite: stable
frontend tool call IDs, branch-specific HITL approve/reject/cancel
fixture matching, A2UI/OGUI repeated-pill replay, custom multimodal
image forwarding, app/context shared-state propagation, and the `.NET`
demo title

## Current D5 status

37 / 37 cells are D5 green in the local full suite.

Latest full run:

```text
BASE_URL=http://localhost:3115 .\node_modules\.bin\playwright.cmd test --workers=2 --reporter=line
2 skipped
197 passed (5.4m)
```

The 2 skipped tests are the existing skipped MCP Apps iframe activity
checks.

## Validation

- Docker rebuild: `docker compose -f showcase/docker-compose.local.yml
up -d --build --force-recreate ms-agent-dotnet` -> passed
- `showcase/integrations/ms-agent-dotnet`:
`BASE_URL=http://localhost:3115 .\node_modules\.bin\playwright.cmd test
hitl-in-chat.spec.ts gen-ui-interrupt.spec.ts interrupt-headless.spec.ts
--workers=1 --reporter=line` -> 11 passed
- `showcase/integrations/ms-agent-dotnet`:
`BASE_URL=http://localhost:3115 .\node_modules\.bin\playwright.cmd test
--workers=2 --reporter=line` -> 197 passed, 2 skipped
- `git diff --check` -> passed

Attempted but not run through lefthook in this isolated worktree: root
pre-commit hooks require root `node_modules` (`nx: command not found`,
`oxlint` missing). Commits after that were made with `--no-verify` after
the showcase Playwright suite above passed.
2026-05-22 15:32:40 +02:00
github-actions[bot] 4d7558d58f style: auto-fix formatting 2026-05-22 13:25:28 +00:00
Alem Tuzlak 30f10cea7b fix(showcase/ms-agent-dotnet): handle cancelled HITL bookings 2026-05-22 15:22:04 +02:00
github-actions[bot] 3208d6c1f7 style: auto-fix formatting 2026-05-22 12:49:57 +00:00
Alem Tuzlak a7dbfa133b fix(showcase/ms-agent-dotnet): stabilize D5 demo flows 2026-05-22 14:48:54 +02:00
Alem Tuzlak 0f7f247eb8 fix(showcase/ms-agent-dotnet): close final D5 flakes 2026-05-22 12:32:08 +02:00
github-actions[bot] 8dd17f540c style: auto-fix formatting 2026-05-22 11:56:56 +02:00
Alem Tuzlak cacf2f17b2 feat(showcase/ms-agent-dotnet): start D5 parity sweep 2026-05-22 11:56:55 +02:00
Jordan Ritter ef2d415d53 fix(ci): skip already-published packages in publish script (#4979)
## Summary
- publish-release.ts now checks npm for each package before publishing —
skips versions already on the registry
- Makes publish idempotent: safe to retry after partial failures (like
the v1.57.4 situation where 1/15 published before crashing)
- Removes the one-shot `publish-remaining` workflow (no longer needed)

## Test plan
- [ ] Merge this PR
- [ ] Dispatch `release / publish` with scope `monorepo`
- [ ] Script skips `a2ui-renderer` (already at 1.57.4) and publishes the
other 14
v1.57.4
2026-05-21 15:36:23 -07:00
Jordan Ritter 3df3179663 fix(ci): skip already-published packages + remove one-shot workflow
publish-release.ts now checks npm for each package before publishing
and skips versions that already exist. Makes publish idempotent —
safe to retry after partial failures. Removes the publish-remaining
one-shot workflow that's no longer needed.
2026-05-21 15:29:12 -07:00
Jordan Ritter b06b45d7eb Merge remote-tracking branch 'origin/main' into fix/repo-urls-and-publish 2026-05-21 15:28:55 -07:00
Jordan Ritter 143239f5fb fix(ci): pass registry explicitly to npx npm@11 + debug output 2026-05-21 15:24:13 -07:00
Jordan Ritter f0953c1f7b fix(ci): add repository.url for OIDC provenance + publish remaining v1.57.4 (#4977)
## Summary
- Add `repository.url` to 5 packages missing it (`agentcore-runner`,
`core`, `sqlite-runner`, `voice`, `web-inspector`) — required for npm
OIDC provenance verification
- One-shot `publish-remaining` workflow to publish the 14 packages that
didn't make it in the first run (`a2ui-renderer` already published via
OIDC successfully)

## Context
v1.57.4 OIDC publish got 1/15 packages out before failing on
`agentcore-runner` with E422 (missing `repository.url`). This fixes the
URLs and provides a targeted publish workflow for the remaining 14.

## Test plan
- [ ] Merge this PR
- [ ] Dispatch `release / publish-remaining-1.57.4` workflow
- [ ] Verify all 15 packages at v1.57.4 on npm with OIDC provenance
- [ ] Delete `publish-remaining.yml` after successful publish
2026-05-21 15:18:19 -07:00
github-actions[bot] 47d3a0d442 style: auto-fix formatting 2026-05-21 22:14:54 +00:00
Jordan Ritter 56f3477e09 fix(ci): add repository.url to packages missing it + one-shot publish workflow
Packages without repository.url fail npm OIDC provenance verification.
Adds the field to agentcore-runner, core, sqlite-runner, voice, and
web-inspector. Includes a one-shot workflow to publish the 14 remaining
v1.57.4 packages (a2ui-renderer already published via OIDC).
2026-05-21 15:14:02 -07:00
Jordan Ritter f63211f889 fix(ci): use OIDC trusted publishers via npx npm@11 on Node 22 (#4976)
## Summary
- Replace `pnpm publish` with `pnpm pack` + `npx npm@11.15.0 publish` in
both `publish-release.ts` and `prerelease.ts`
- Set `NODE_AUTH_TOKEN=''` in publish steps to unblock OIDC (expired
secret was taking precedence)
- npm 11's OIDC support authenticates via GitHub Actions `id-token:
write` — no long-lived NPM_TOKEN needed
- Stays on Node 22 — npx downloads npm 11 on demand

## Verified
- Dry-run test on Node 22 with `npx npm@11.15.0 publish --dry-run`
succeeded with OIDC (run 26252682942)
- `ACTIONS_ID_TOKEN_REQUEST_URL` confirmed SET in the runner environment
- Trusted publishers configured for all 20 packages via `npm trust
github`

## Test plan
- [ ] Merge this PR
- [ ] Dispatch `release / publish` with scope `monorepo` to publish
v1.57.4
- [ ] Verify `_npmUser` shows `GitHub Actions` on published packages
2026-05-21 14:51:55 -07:00
Maxim cc69fd04ef fix(sdk): add pytest-asyncio dev dependency for async test support
The new test_emit_tool_call_optional_id.py uses async test methods
decorated with @pytest.mark.asyncio, but pytest-asyncio was missing
from dev dependencies — causing all 11 async tests to fail in CI
across all Python versions (3.10–3.14).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 23:36:29 +02:00
Jordan Ritter 8239702ff6 style: auto-fix formatting 2026-05-21 14:13:52 -07:00
Jordan Ritter 49685a6cc4 fix(ci): format publish scripts 2026-05-21 14:07:35 -07:00
Jordan Ritter 3fcd98f2f5 fix(ci): use OIDC trusted publishers via npx npm@11 on Node 22
Replace pnpm publish with pnpm pack + npx npm@11.15.0 publish to
enable OIDC authentication. Set NODE_AUTH_TOKEN='' to prevent the
expired secret from blocking OIDC. Removes test workflow.
2026-05-21 14:02:36 -07:00
Jordan Ritter 19455577e4 test(ci): OIDC dry-run with npx npm@11 on Node 22 2026-05-21 13:57:12 -07:00
Jordan Ritter ae29462042 Revert "test(ci): temporary OIDC dry-run test workflow"
This reverts commit ea28fc3f4b.
2026-05-21 13:53:44 -07:00
Jordan Ritter 35de84017a Revert "test(ci): fix OIDC test - Node 24 + unset NODE_AUTH_TOKEN"
This reverts commit 40d3b965a4.
2026-05-21 13:53:44 -07:00
Jordan Ritter 40d3b965a4 test(ci): fix OIDC test - Node 24 + unset NODE_AUTH_TOKEN 2026-05-21 13:50:04 -07:00
Jordan Ritter ea28fc3f4b test(ci): temporary OIDC dry-run test workflow 2026-05-21 13:46:34 -07:00
Ben Taylor 017d72b9e6 feat(telemetry): route runtime telemetry through CopilotKit sink (#4507)
## Summary

Routes runtime telemetry through a CopilotKit-controlled sink
(`telemetry.copilotkit.ai`) instead of direct vendor calls, so
Scarf/Reo/future-vendor changes don't require SDK releases. Telemetry-id
attribution is now sourced from the EIP license JWT, and customer cloud
API keys are stripped at the wire boundary.

- **New transport.** Adds `lambdaClient` in `@copilotkit/shared` that
POSTs each event to the telemetry sink. Both v1
(`shared/telemetry-client.ts`) and v2
(`v2/runtime/telemetry/telemetry-client.ts`) emitters fan into it. v1
retains its existing Segment path unchanged; the sink call is additive.
- **Plain-header attribution.** Earlier iterations of this branch
shipped HMAC-signed requests; the signing scheme bound identity to
"holder of API key X," but since the secret was already shipped inside
distributed customer keys it never actually prevented impersonation.
Replaced with a single `X-CopilotKit-Telemetry-Id: <id>` header. Drops
~85 lines of Web Crypto / HMAC / nonce / canonical-string machinery and
the implicit Node ≥19 / edge-runtime requirement.
- **Telemetry-id source: EIP license JWT.** Customer API keys
(`ck_<env>_<id>.<secret>`) are unrelated to telemetry attribution — they
continue routing only into Segment. The id now comes from the
Ed25519-signed license JWT (the same one consumed by
`@copilotkit/license-verifier` for feature gating). lambda-client
base64url-decodes the payload and extracts `telemetry_id` without
verifying the signature; verification stays the license-verifier's job.
- **Env-var fallback.** Both runtime constructors resolve
`options.licenseToken ?? process.env.COPILOTKIT_LICENSE_TOKEN` for the
telemetry setter, matching license-verifier's own resolution. Without
it, customers who set only the env var would get a working
licenseChecker but anonymous telemetry.
- **Cloud API key strip at the wire.** `cloud.public_api_key` (v2 event
property convention) and `cloud.publicApiKey` (v1 globalProperties from
`setCloudConfiguration`) are stripped from the lambda payload before
send. Boolean indicators (`cloud.api_key_provided`) and unrelated fields
(`cloud.baseUrl`) ride through. Defense in depth — any future caller is
covered.
- **Smoke-signal warn.** When a license token is configured but
`parseTelemetryIdFromLicense` returns null, the SDK emits a one-shot
`console.warn` at configuration time. Operationally relevant during the
issuer rollout window where older licenses lack the field entirely.

The Lambda counterpart (claim-only attribution, KMS verification
removed) was merged separately in
[oss-path-to-production#73](https://github.com/CopilotKit/oss-path-to-production/pull/73).

## Test plan

- [x] `nx run @copilotkit/shared:build` — clean
- [x] `nx run @copilotkit/runtime:build` — clean
- [x] `nx run @copilotkit/shared:test
src/telemetry/lambda-client.test.ts` — 6/6 pass (new file: cloud-key
strip both naming conventions, JWT extraction success/failure paths,
fetch-error swallow invariant)
- [x] `nx run @copilotkit/runtime:test
src/v2/runtime/__tests__/telemetry.test.ts` — 13/13 pass (refreshed:
cloud key forwarding semantics, license token plumbing,
warn-fires/warn-doesn't-fire branches)
- [ ] Verify against a real issuer-produced JWT with `telemetry_id`
populated once one exists — `licensing.license_tokens` table has the
column NOT NULL UNIQUE; depends on issuer code path actually populating
it before signing
- [ ] Roll out behind feature awareness: watch for the smoke-signal warn
(`License token did not yield a telemetry_id`) and the absence of
`X-CopilotKit-Telemetry-Id` headers on staging traffic

## Notes

- Pre-commit hooks were skipped (`--no-verify`) on commits in this
branch because the rebased base picked up unrelated runtime test
failures from main (~50 tests, none touching telemetry). Worth a
separate look or a CI re-run pre-merge.
- Customer cloud API keys still flow into Segment via
`setCloudConfiguration`'s `globalProperties` write — only the wire to
the sink is sanitized. Once Segment retires, that path can be removed
entirely.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-05-21 15:26:27 -05:00
Austin Merrick 151100e1a6 Merge branch 'main' into worktree-fix+security-advisory-claude-settings 2026-05-21 13:11:40 -07:00
Jordan Ritter 80af48b4be fix(ci): switch to OIDC trusted publishers for npm auth (#4974)
## Summary
- Switch npm publish authentication from expired NPM_TOKEN to OIDC
trusted publishers
- Add `id-token: write` permission to publish jobs in both
`publish-release.yml` and `prerelease.yml`
- Bump Node from 20.x to 22.x (required for npm 11+ trusted publishers)
- Remove redundant `npm config set` auth steps and duplicate `NPM_TOKEN`
env vars
- Add `workflow_dispatch` trigger to `publish-release.yml` for manual
publish recovery

## Context
All three npm tokens (`copilotkit-ci-publish`, `ag-ui-ci-publish`,
`aimock-gh-release`) expired May 19. Trusted publishers have been
configured for all 20 packages via `npm trust github` — OIDC tokens are
ephemeral and never expire.

## Test plan
- [ ] Merge this PR
- [ ] Manually dispatch `release / publish` workflow with scope
`monorepo` to publish v1.57.4
- [ ] Verify packages appear on npm with OIDC provenance (`_npmUser:
GitHub Actions`)
2026-05-21 13:01:28 -07:00
Jordan Ritter eb71d26474 fix(ci): switch to OIDC trusted publishers for npm authentication
Replace expired NPM_TOKEN-based auth with OIDC trusted publishers.
Add id-token: write permission, bump Node to 22.x, remove redundant
npm config set steps.
2026-05-21 12:53:29 -07:00
Austin Merrick c7349fbb7a fix(ci): also remove .mcp.json before running Claude Code
Without --bare, claude -p launches MCP servers defined in the project-level
.mcp.json before the model loads. A PR replacing .mcp.json with a malicious
entry gets an attacker-controlled subprocess launched on the CI runner —
same RCE surface as a SessionStart hook.

This repo already has .mcp.json committed (nx-mcp). Removing it before the
social copy generator runs is safe: the workflow's --allowedTools already
restricts Claude to specific read/diff tools and MCP servers are not needed
for social copy generation.

Call-site enumeration: rm -f is self-contained, no callers.
2026-05-21 12:48:56 -07:00
github-actions[bot] 5a35bef248 style: auto-fix formatting 2026-05-21 14:45:20 -05:00
Benjamin Taylor b684fae377 review(telemetry): address CR findings on client-side sampling
- Rework shared helper: parseAndWarnTelemetryId returns parsed id AND
  warns, so both v1 and v2 setLicenseToken call it once without
  inlining duplicate code or double-parsing the JWT.
- Fix v1 sampleWeight bug: identified events bypass the sample gate
  and ship at effective rate 1.0, so a single global sampleWeight =
  1/sampleRate would overweight identified-customer counts by
  1/sampleRate (20x at the 0.05 default). Move sample metadata
  (sampleRate / sampleRateAdjustmentFactor / sampleWeight) out of
  globalProperties and compute per-event using effectiveSampleRate.
- Guard setSampleRate against parseFloat("nonsense") = NaN slipping
  past the range check. With the default now 0.05, env-var overrides
  are more common and a typo would otherwise produce silent
  always-drop.
- Add tests: sampleWeight differs for identified vs anonymous,
  malformed JWT stays anonymous, license-token cache is overwritable,
  NaN env override is rejected, v2 default sampleRate = 0.05 is pinned.
2026-05-21 14:45:20 -05:00
Benjamin Taylor ad94ceb254 feat(telemetry): gate anonymous v2 events client-side, bypass for identified
Cache parsed telemetry_id at setLicenseToken time and use it in capture()
to branch on identified vs anonymous. Identified callers (token with
telemetry_id) always send; anonymous callers are sampled at sampleRate.

Default sampleRate changes from 1.0 to 0.05 so the anonymous OSS-runtime
firehose is capped at the client. Identified customers continue to send
at full fidelity.
2026-05-21 14:45:20 -05:00
Benjamin Taylor 674caacabd feat(telemetry): gate anonymous v1 events client-side, bypass for identified
Cache parsed telemetry_id at setLicenseToken time and use it to branch
in capture():
- Identified callers (token with telemetry_id) always send to both sinks.
- Anonymous callers are sampled at sampleRate (default 0.05); one dice
  roll gates both lambda and Segment.

The Lambda no longer needs to bypass-from-sampling for identified
events — that decision moves entirely to the client. Reduces lambda
invocations by ~95% for the anonymous OSS-runtime firehose.
2026-05-21 14:45:20 -05:00