Commit Graph

11661 Commits

Author SHA1 Message Date
Austin Merrick e3b7f2e216 add Angular frontend-picker screenshot (post-#5586) 2026-06-19 13:30:01 -07:00
Austin Merrick 45d3701737 add Angular quickstart verified-working screenshot 2026-06-19 11:50:44 -07:00
Austin Merrick 0323dc30a5 add Angular quickstart guide screenshot 2026-06-19 11:50:43 -07:00
Alem Tuzlak f0dbab1f34 chore: release bot-discord v0.0.2 (#5578)
## Release bot-discord v0.0.2

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

---

### How this release process works

1. **This PR was created automatically** by the "release / create-pr"
workflow.
   It bumped the `bot-discord` 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-discord` packages to npm at version `0.0.2`
   - Creates git tag `bot-discord/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-19 18:54:31 +02:00
Alem Tuzlak 7c3cd8d5d3 chore: release bot-slack v0.0.3 (#5579)
## Release bot-slack v0.0.3

**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.3`
   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.3`
   - Creates git tag `bot-slack/v0.0.3`
   - 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.
bot-slack/v0.0.3
2026-06-19 18:53:59 +02:00
Alem Tuzlak 417f1d43cf chore: release bot-telegram v0.0.3 (#5580)
## Release bot-telegram v0.0.3

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

---

### How this release process works

1. **This PR was created automatically** by the "release / create-pr"
workflow.
   It bumped the `bot-telegram` packages to `0.0.3`
   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-telegram` packages to npm at version `0.0.3`
   - Creates git tag `bot-telegram/v0.0.3`
   - 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-19 18:53:27 +02:00
Jordan Ritter 3468198ba8 fix(showcase): un-fence ms-agent-harness-dotnet probing (#5577)
## Summary
Un-fences the `ms-agent-harness-dotnet` showcase column from per-cell
probe enumeration. The exclude was a placeholder added 2026-06-07
(commit f0edcd5d) before the column existed; the column shipped (PR
#5569) and its d6/d4 aimock fixtures landed today (e10df0b4), so the
fence is stale. Removed the slug from all 8 SSOT exclude sites
(catalog-enumerator.ts nameExcludes, 5 probe YAMLs, aimock-wiring.ts,
baseline-types.ts) + updated 3 stale comments/tests.

## Red-green proof (local, real control-plane surface)
- **RED** (origin/main): `enumerated services: [langgraph-python,
ms-agent-dotnet]` — slug present-in-nameExcludes:true → **0 d6 cells**.
- **GREEN (enumeration)**: after the edits, `enumerated services: [...,
ms-agent-harness-dotnet]` → slug enumerates (via the real
`railwayServicesSource.enumerate` + real `D6_DISCOVERY_FILTER`).
- **GREEN (value-test)**: live local control-plane D6 stack (aimock
fixtures) → **35 passed, 1 failed, 3 skipped, 3 incapable**.
- The single fail (`gen-ui-declarative` / sales-dashboard pie+bar charts
not rendering) is **at parity with the gold-standard sibling**:
PocketBase `d6:ms-agent-dotnet/gen-ui-declarative` is RED with the
byte-identical error (fail_count 92, since 2026-06-15) and is the
sibling's sole tolerated `1✗`. Shared sales-dashboard chart gap in the
ms-agent-dotnet family — not a regression from the AsHarnessAgent port.
Harness lands 35✓/1✗, matching the sibling.

## Test plan
- [ ] CI green
- [ ] After deploy, staging dashboard shows ms-agent-harness-dotnet
cells populating (BE✓, D6 filling) on the next probe tick
2026-06-19 08:37:44 -07:00
AlemTuzlak aabd099bc6 chore: release bot-telegram v0.0.3 2026-06-19 15:27:22 +00:00
AlemTuzlak 81d7a236db chore: release bot-slack v0.0.3 2026-06-19 15:26:41 +00:00
AlemTuzlak d5ae3c9768 chore: release bot-discord v0.0.2 2026-06-19 15:26:38 +00:00
Alem Tuzlak 6b1f61afa1 chore: release bot v0.0.3 (#5574)
## Release bot v0.0.3

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

---

### How this release process works

1. **This PR was created automatically** by the "release / create-pr"
workflow.
   It bumped the `bot` packages to `0.0.3`
   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` packages to npm at version `0.0.3`
   - Creates git tag `bot/v0.0.3`
   - 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.
bot/v0.0.3
2026-06-19 17:24:50 +02:00
Jordan Ritter c786bf8846 fix(showcase): un-fence ms-agent-harness-dotnet probing
The ms-agent-harness-dotnet slug was excluded from per-cell D6/BE/smoke
probe enumeration by a placeholder fence added 2026-06-07, before the
real column existed. The column shipped in PR #5569 and its d6/d4 aimock
fixtures landed on main today (e10df0b4), so the fence is now stale.
Remove the slug from all 8 exclude SSOT sites so the column populates.
2026-06-19 08:04:54 -07:00
Jordan Ritter 7335d58359 fix(showcase): promote pins staging's running digest + verify serving + drift alarm (#5566)
## Summary

Fixes two correctness bugs in the showcase staging→prod promote path
(`showcase/bin/railway`), discovered + live-validated while promoting
the full 19-service cluster.

**Bug #1 — promote pinned the wrong digest.** `resolved_prod_image`
re-resolved the mutable `:latest` tag against *current* GHCR instead of
pinning the digest staging is actually *running*
(`latestDeployment.meta.imageDigest`). When `:latest` drifted after
staging deployed, promote pushed an unvalidated (and once, regressed)
image to prod. Now pins staging's running digest. Adds a loud `⚠️
STAGING DRIFT` warning (promote stdout + `STAGING_DRIFT_MARKER:` →
`promote-fleet.sh` aggregation → both Slack payloads) when staging's
running digest ≠ current `:latest`, so the gap is visible without
blocking the promote.

**Bug #2 — the pin never activated.** `pin_and_verify` used
`serviceInstanceRedeploy`, which replays the *existing* deployment's old
image rather than the just-pinned `source.image`. Config showed the new
digest while prod kept serving the old one (this is why earlier promotes
"succeeded" while prod stayed broken). Switched to
`serviceInstanceDeployV2` + a new `verify_serving_digest!` gate that
polls the new deployment to SUCCESS and **fails loud** if the running
digest ≠ pinned.

Plus CR-round hardening: P2 in-flight race check now reads
`meta.imageDigest` (was dead on tag-form staging) and skips on
`--digest` override; `detect_staging_drift` fails loud (WARN) on
GHCR-resolve failure instead of swallowing; `--digest` override
suppresses spurious drift; `drift_line` LF-stripped at the
`GITHUB_OUTPUT` boundary; multi-service drift join fixed; fallback-log
drift preserved.

## Commits
1. `fix(showcase): pin prod to staging's running digest + loud
staging-drift warning`
2. `fix(showcase): activate prod pin via serviceInstanceDeployV2 +
verify running==pinned`
3. `fix(showcase): harden promote P2 race check + refresh ivar-lint
allowlist`

## Validation
- Live red-green on real Railway: claude-sdk-python prod flipped from
stale → pinned digest via the fixed CLI; all 19 cluster services
promoted green; 5 previously-degraded backends (ag2, llamaindex,
pydantic-ai, ms-agent-python, strands) recovered.
- 15/15 Ruby specs + 15/15 bats green; ruby -c, shellcheck (CI
invocation), actionlint clean.
- 3-round cr-loop (7 agents/round) converged to zero bucket-(a).

## Follow-ups (not in this PR)
- Defensive `.to_s.empty?` on `meta.imageDigest` extraction
(can't-happen on real Railway).
- Test-quality nits (capture_io scoping, weak bats glob, shared mock
fixture).
- Pre-existing verify-prod `succeeded_csv`/`GITHUB_OUTPUT` coupling
(graceful-degraded, audited STAY_IN_C).
- `deploy-to-railway.ts` births prod on `:latest` (the root provisioning
gap); CLI↔workflow notify equivalence (PR2).

## Test plan
- [ ] CI green on PR HEAD
- [ ] (post-merge) a real `gh workflow run showcase_promote.yml` shows
the drift line in the #team-showcase notification when staging is behind
:latest
2026-06-19 07:55:46 -07:00
Alem Tuzlak 59773505eb feat(bot-slack): modernize native streaming (task chunks, feedback, single-message) (#5532)
## What

Brings `@copilotkit/bot-slack` up to the **current** Slack native
streaming API surface (`chat.startStream` / `appendStream` /
`stopStream`, GA Oct 2025; structured chunks + AI feedback elements) and
removes the type-erasure workarounds. Result of an audit
cross-referencing the live `@slack/web-api@7.16.0` /
`@slack/types@2.21.1` types and Vercel's `vercel/chat` Slack adapter.

## Changes

- **No more `as unknown as Parameters<…>` casts** — every
streaming/post/update call uses the SDK's typed args.
- **One streamed message per turn** — dropped the per-message
continuation splitting (Slack documents only a 12k-per-append limit, no
cumulative cap; matches `vercel/chat`), keeping ≤12k per-append
chunking.
- **Native `task_update` tool-progress chunks** (`task_display_mode:
"timeline"`) interleaved into the streamed reply, replacing the separate
`🔧` status messages — with automatic degradation back to
`🔧` rows where structured chunks aren't supported.
- **Opt-in AI feedback buttons** via `slack({ feedback })` — a typed
`context_actions` + `feedback_buttons` row attached at `stopStream`;
clicks are routed adapter-locally (bypassing the engine's interaction
dispatch). No handler ⇒ no buttons.
- **Recipient scoping** — `recipient_user_id` / `recipient_team_id` only
for channel targets.
- **Cadence** — native flush floor lowered to ~600ms (appendStream
Tier-4); legacy `chat.update` stays 800ms.

### Engine (`@copilotkit/bot`)
One small, backward-compatible addition: optional
`RunRenderer.finish?()`, called after `runAgentLoop` resolves, so a
turn-scoped renderer can finalize its single stream. No-op for existing
adapters.

## Verification

- `bot-slack`: type-check (both tsconfigs) clean, **208 tests pass**,
oxfmt + oxlint clean.
- `bot`: type-check clean, **33 tests pass** (incl. a new `finish()`
test).
- Reviewed for correctness (stream lifecycle, finish/interrupt
interaction, delta tracking, degradation) — no high-confidence bugs;
feedback-on-interrupt and missing-ref-logging were tightened.

### Not verifiable without a live workspace (flagged in-code)
- That a >12k reply truly streams into one message (the
no-cumulative-cap assumption).
- `startStream` with no initial content.
2026-06-19 16:50:03 +02:00
Jordan Ritter 61440691f2 fix(showcase): provision prod digest-pinned + image-drift prod-neutral (#5571)
## Summary

Two follow-up fixes that complete the pinned-prod / floating-staging
contract for the showcase fleet (the contract enforced by the promote
CLI in #5566). Prod services must be digest-pinned (`@sha256`), staging
floats `:latest`.

**Fix 1 — `showcase/scripts/deploy-to-railway.ts`: provision prod
digest-pinned, not `:latest`.**
Prod services were being *born* on the mutable `:latest` tag, then later
pinned only at promote time. Now they are born pinned to a resolved
`@sha256` digest at create time, via a new TS GHCR resolver that mirrors
the Ruby promote CLI (`/token` exchange → manifest HEAD →
`Docker-Content-Digest`). Resolution failure is **fail-loud**
(`process.exit(1)`, never a `:latest` fallback). `goLive` asserts the
prod `source.image` is digest-pinned (`assertProdDigestPinned`,
refactored to be dependency-injectable and to throw a typed
`ProdPinError` instead of exiting inline).

**Fix 2 — `showcase/harness/.../image-drift.ts`: stop flagging pinned
prod red.**
Under the pinned-prod contract, prod is intentionally digest-pinned
behind `:latest`, so the image-drift probe was firing false-red on every
prod service. It now renders such prod services **green**
(`pinnedExpected`) while a genuinely missing digest stays **red**.
Staging behaviour is unchanged.

## Verification

- **Red-green proven locally** for both new test surfaces:
- `assertProdDigestPinned` guard: RED = 5 tests `assertProdDigestPinned
is not a function` (untestable inline-exit) → GREEN = 13 passed after DI
refactor; env-mismatch branch: RED = `promise resolved undefined instead
of rejecting` → GREEN after wiring the test's env control.
- Suites: `deploy-to-railway.digest-pin.test.ts` **14 passed**;
`image-drift.test.ts` **26 passed**. Typecheck (scripts + harness) 0
errors; oxfmt + oxlint clean; harness build green.
- **Empirical 6b against live prod** (settled two reviewer
masking-concerns as can't-happen under current config):
- prod harness `SHOWCASE_ENV` is *unset* (not `""`) and
`RAILWAY_ENVIRONMENT_NAME="production"`, so `isProductionEnv()`'s `??`
correctly resolves true → the prod-neutral fix **fires** in prod.
- prod image-drift is discovery-only; all 19 prod `showcase-*` services
are digest-pinned and tag-less, so `expectedTag` resolves to `latest`
for every prod service → a fixed tag cannot reach prod image-drift (no
false-green).

## Review

3-round cr-loop (7 agents/round) converged to zero actionable findings.
One fix-introduced test-scaffolding defect (dead `envId` helper option)
was caught in the confirmation round and fixed. Remaining reviewer notes
are pre-existing issues in untouched goLive/probe code or
theoretical-but-can't-happen-under-live-config items, tracked as
follow-ups (not in scope for this PR).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-19 07:44:29 -07:00
Sam Julien 3ae761a966 chore(docs): remove retired docs app (#5548)
## Summary
- remove the retired top-level `docs/` Next app and the disabled
docs-sync workflow/script
- add `docs -> showcase/shell-docs` as a top-level symlink for `cd docs`
muscle memory without restoring the old docs tree
- move the docs model allowlist into `showcase/shell-docs/` and retarget
docs validation/doctest extraction to shell-docs content
- update docs/agent guidance and CI path filters so `docs/` is treated
as an alias, not an active separate docs surface
- tighten the pre-commit package check so non-package docs/tooling
changes do not fan out into the full package matrix

## Validation
- `pnpm exec tsx scripts/validate-doc-model-names.ts`
- `pnpm exec tsx scripts/doc-tests/extract.ts`
- `pnpm exec vitest run
scripts/__tests__/validate-doc-model-names.test.ts
scripts/doc-tests/__tests__/extract.test.ts
showcase/harness/src/cli/eval/scope.test.ts`
- `pnpm exec oxlint showcase/harness/src/cli/eval/scope.test.ts
scripts/doc-tests/extract.ts`
- `git diff --cached --check` before follow-up commit
- `test "$(readlink docs)" = "showcase/shell-docs"`
- `test -f docs/package.json`
- `pnpm exec oxfmt --check .claude/docs/documentation.md
.claude/docs/hooks.md AGENTS.md CLAUDE.md CONTRIBUTING.md
showcase/shell-docs/README.md`
- commit hooks passed

## Notes
- historical docs remain recoverable from
`archive/docs-save-do-not-prune` and `archive/docs-retired-2026-06-17`
- I intentionally left Vercel/project teardown out of this PR; this is
repo cleanup only
2026-06-19 07:33:51 -07:00
Nathan 🔶 Tarbert fc2acea6db docs(shell-docs): update useRenderToolCall reference + schema-free tool-render opt-out (#5504)
## What

Updates the v2 `useRenderToolCall` reference page and makes opting a
tool out of the default rendering a single, schema-free call.

## Why

The reference page had drifted out of sync with the hook implementation
(`packages/react-core/src/v2/hooks/use-render-tool-call.tsx`) — most
notably `toolCallId` in the render props, added after the doc was last
touched. While documenting how to opt out of rendering, the natural
example (`useRenderTool({ name: "...", render: () => <></> })`) only
type-checked for the wildcard `"*"`; a named tool required a
`parameters` schema, forcing a throwaway `z.any()`. This PR re-aligns
the doc and removes that rough edge.

## Changes

### Docs (`showcase/shell-docs`)
- `useRenderToolCall.mdx`:
- Document `toolCallId` in the render-prop shape (previously
undocumented).
- Describe agentId-scoped lookup priority: agent-specific → unscoped →
wildcard `"*"` → built-in `DefaultToolCallRenderer`.
- Note args are parsed with `partialJSONParse` (streaming), not strict
`JSON.parse`.
- Correct `toolCall` prop to `toolCall.function.name` /
`toolCall.function.arguments`.
- Rewrite the Status Resolution table to match real logic (`toolMessage`
presence + provider executing set).
- New **"Disable default tool rendering"** section, ordered least→most
specific: wildcard first (all tools), then a **"For specific tools"**
subsection. Both use a schema-free `useRenderTool` call; dropped the old
`useFrontendTool` handler/schema boilerplate.
- `useRenderTool.mdx`: document the render-only (no-schema) named
overload.

### react-core
- Make `parameters` optional on the named `useRenderTool` overload,
mirroring the existing wildcard path; `defineToolCallRenderer` defaults
the args schema to `z.any()` when none is given.
- This lets `useRenderTool({ name: "myTool", render: () => <></> }, [])`
type-check with no Zod schema. Typed `parameters` behavior is unchanged.
- Added a test for the named render-only registration.

## Verification

- `@copilotkit/react-core` tests pass (1280) including the new case;
`build` (tsc) passes.
- Opt-out snippets type-checked in-package (`tsc`): wildcard,
specific-name (no schema), and named-with-schema all compile.
- `oxlint` (shell-docs) passes — 0 errors.
- Previewed locally at `/reference/hooks/useRenderToolCall`.
2026-06-19 10:32:20 -04:00
Mike Ryan 6b1421be71 fix(release): scope release-workflow concurrency keys by release target (ENT-950) (#5576)
## Problem

Releasing `monorepo` was preempted — it sat **queued behind an unrelated
`angular` release**. All three scope-aware release workflows use a
**target-agnostic** concurrency group, so any two scopes contend for the
same lock even though they touch disjoint packages and git tags:

| Workflow | Old `group:` |
|---|---|
| `stable-release.yml` (create PR) | `release-pr` |
| `publish-release.yml` (publish) | `publish-release` |
| `canary.yml` (one-click canary) | `canary-publish-${{ github.ref }}` |

With `cancel-in-progress: false`, the second run doesn't cancel — it
queues. `canary.yml` already documented this side-effect ("queue behind
each other — even for different scopes").

## Fix

Fold the release target (`inputs.scope`) into each concurrency key:

| Workflow | New `group:` |
|---|---|
| `stable-release.yml` | `release-pr-${{ inputs.scope }}` |
| `publish-release.yml` | `publish-release-${{ inputs.scope \|\|
github.head_ref \|\| github.ref }}` |
| `canary.yml` | `canary-publish-${{ inputs.scope }}-${{ github.ref }}`
|

- **stable-release** / **canary** are `workflow_dispatch`-only, so
`inputs.scope` is always present.
- **publish-release** also fires on merged release PRs (inputs empty
there), but the PR branch is `release/publish/<scope>/v<version>`, so
`github.head_ref` already encodes the scope — the key stays
scope-distinct on both paths.
- **canary** keeps `github.ref` (its original cross-branch-race guard)
and *adds* scope.

Net: monorepo / angular / bot* releases run in independent lanes, while
**same-scope runs stay serialized** (`cancel-in-progress: false`) —
preserving race protection on the version bump, tag push, and npm
publish. Tags are already scope-distinct (`v…` vs `angular/v…` vs
`bot/v…`).

## Verification

- `scripts/release/verify-release-scope-dropdowns.sh` passes (it checks
the `options:` list only — unaffected).
- All three files parse cleanly; `yq` confirms the intended
`concurrency.group` values.

Closes ENT-950.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-19 07:32:18 -07:00
Benjamin Taylor 4d1e1ef323 fix(release): scope release-workflow concurrency keys by release target
The stable-release (create-pr), publish-release, and canary workflows all
used a target-agnostic concurrency group, so releasing one scope (e.g.
`monorepo`) would queue behind an unrelated scope's run (e.g. `angular`)
despite touching disjoint packages and tags. Fold the release target into
each concurrency key so different scopes run in independent lanes while
same-scope runs stay serialized (cancel-in-progress: false), preserving the
version-bump / tag-push / npm-publish race protection.

publish-release also fires on merged release PRs where `inputs.scope` is
empty; the PR branch `release/publish/<scope>/v<version>` carries the scope
via `github.head_ref`, so the key stays scope-distinct on that path too.

ENT-950

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 09:25:29 -05:00
Mike Ryan dba73fa407 chore(examples): remove live-consumed _intelligence overlay (ENT-834) (#5525)
## What

Removes the live-consumed local Intelligence overlay and the dead
references the deletion would leave behind.

- Deletes `examples/integrations/_intelligence/` (`docker-compose.yml`,
`.env.intelligence`, `README.md`) — the overlay the currently-shipped
CLI clones at runtime.
- Strips the now-dangling `# see
examples/integrations/_intelligence/.env.intelligence for the seed
value` pointer from 8 integration `.env.example` files (adk, agno,
langgraph-fastapi, langgraph-js, langgraph-python,
ms-agent-framework-{dotnet,python}, strands-python).

Closes ENT-834.

## ⚠️ DO NOT MERGE until launch

The **currently-shipped** CLI clones
`CopilotKit/CopilotKit@main:examples/integrations/_intelligence` at
runtime via `fetchIntelligenceOverlay` (hardcoded to `main`). Deleting
this dir from `main` **immediately breaks** the shipped CLI's
threads-framework `init` — the overlay fetch 404s.

**Merge gate (verify at merge time):**
- [ ] The managed-only CLI build has **dropped
`fetchIntelligenceOverlay`** (Intelligence-repo removal ticket)
- [ ] That managed-only CLI has been **released**
- [ ] Merge in lockstep with launch

## Scope

- ✅ **Included:** the `_intelligence/` overlay dir + the 8 dead
`.env.example` pointers it leaves behind.
- ✅ **Already done elsewhere:**
`examples/integrations/langgraph-python-threads/` (the ticket's "maybe"
scope) was already removed via ENT-800 — it is no longer on
`origin/main`.
- ⏭️ **Deferred to a launch-coordinated follow-up:** the local-stack
`INTELLIGENCE_API_URL`/`GATEWAY_WS_URL` defaults (`localhost:4201` /
`ws://localhost:4401`) baked into ~18 `copilotkit:intelligence` route
blocks + `agentcore/docker/docker-compose.yml`, and the matching
local-dev block in each `.env.example`. These depend on the managed
CLI's hosted env contract (Intelligence repo) and shouldn't be guessed
at now. The `copilotkit license` locked-state copy is owned by ENT-804.

## Not affected

The `docker-compose.test.yml` + `docker/Dockerfile.{agent,app}` files
across the integrations are the **e2e/CI test harness** for the example
apps, unrelated to the Intelligence pivot. The Threads feature, the
activation-gated `copilotkit:intelligence` block, and the themed
threads-drawer UI are the product and work against hosted Intelligence —
only the local-stack scaffolding is being removed.

## Notes

Branched off fresh `origin/main` (`c540734143`). No in-repo code
references the overlay dir (the `_intelligence` matches under
`packages/` are an unrelated private field on the agent registry).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-19 07:23:57 -07:00
Alem Tuzlak 699bc9a5c0 fix(examples/slack): build all imported bot packages for deploy
The build script only built bot-slack, bot-discord, and runtime, so
@copilotkit/bot-telegram (plus bot and bot-ui) were never compiled — the
Railway deploy then crashed on `import { telegram } from @copilotkit/bot-telegram`.
Build every workspace package the app imports.
2026-06-19 16:15:25 +02:00
Alem Tuzlak c55dad5cc5 Merge branch 'main' into feat/bot-slack-native-streaming
Resolve event-renderer.ts onRunFinishedEvent: keep the native turn stream open
(finalized in finish()) AND retain the legacy per-message stream drain from main
(#5573) as a no-op-in-native safety net. app/index.ts (telegram adapter from
#5520 + showToolStatus:false) and create-bot.test.ts auto-merged.
2026-06-19 15:57:20 +02:00
Alem Tuzlak 22e5c8c2d1 feat(examples/slack): web search via a TanStack AI factory agent (#5549)
## What

Gives the example's runtime agent **web search** (OpenAI's hosted
`web_search` tool).

`BuiltInAgent`'s classic `tools` only accepts CopilotKit's handler-based
`ToolDefinition[]` (each needs an `execute`), so it can't carry a
provider/hosted tool like web search. The fix is to run the agent in
**factory mode** (`type: "tanstack"`) and drive the LLM call with
TanStack AI's `chat()` — which exposes provider tools and managed MCP
directly.

## How (`examples/slack/runtime.ts`)

- **Adapter:** `openaiText(model)` from `@tanstack/ai-openai` (OpenAI
Responses API; `gpt-5.5` default).
- **Web search:** `webSearchTool({ type: "web_search" })` from
`@tanstack/ai-openai/tools`, passed in `chat({ tools: [...] })`.
- **MCP:** Linear + Notion via `@tanstack/ai-mcp` `createMCPClient`
(HTTP transport + `Authorization: Bearer`), created per-run inside the
factory; `chat()` discovers their tools and closes the connections when
the run ends.
- **Bridge:** `convertInputToTanStackAI(ctx.input)` (already in
`@copilotkit/runtime`) maps AG-UI input → `chat()` messages +
systemPrompts; `BuiltInAgent` converts `chat()`'s stream back to AG-UI
events via its built-in `convertTanStackStream`.
- The big triage `SYSTEM_PROMPT` is prepended to `systemPrompts`.

Adds `@tanstack/ai`, `@tanstack/ai-openai`, `@tanstack/ai-mcp` to the
example.

> **OpenAI-only now.** Web search is an OpenAI provider tool, so this
drops the previous multi-provider path (anthropic/google). `AGENT_MODEL`
accepts a bare OpenAI id or `openai/<id>` (prefix stripped).

## Verification

- `tsc --noEmit -p examples/slack/tsconfig.json` clean (validates the
full `chat()` wiring — adapter, tools, MCP, `convertInputToTanStackAI`,
factory return type).
- Runtime **boots** on the factory: `agent "triage" ready · MCP: Linear,
Notion`, server listening — confirms the `@tanstack/*` ESM imports
resolve and the agent constructs. (A live web-search query is exercised
through the Slack bot.)
- oxfmt + oxlint clean.

> Pre-commit `test-and-check-packages` bypassed: the lockfile change
makes nx mark everything affected, and the only failure is the
pre-existing, environmental `@copilotkit/sqlite-runner:test` (native
sqlite on Node 24), unrelated to this change.
2026-06-19 15:19:17 +02:00
AlemTuzlak 734a187257 chore: release bot v0.0.3 2026-06-19 13:04:11 +00:00
Alem Tuzlak ed95058e92 chore(examples/slack): adopt released TanStack openai-base strict-schema fix
Bump @tanstack/ai-openai 0.14.4 → 0.15.2 (pins @tanstack/openai-base 0.8.7,
TanStack/ai#790) and @tanstack/ai → 0.32.0. 0.8.7 emits strict:false for tool
schemas outside OpenAI's strict subset in the provider-path function-tool
converter, so MCP tools (e.g. Notion's API-post-search) no longer 400 — no
local patch needed. Verified end-to-end against the live Slack bot.
2026-06-19 15:01:17 +02:00
Alem Tuzlak 319d0ec78a feat(examples/slack): wire frontend tools into the TanStack agent + tidy render output
- runtime.ts: pass the bridge's forwarded client tools (convertInputToTanStackAI's
  tools) into chat() alongside web_search + MCP, so generative-UI cards and the
  confirm_write HITL gate work; drop the prompt line that made the model narrate
  charts with a trailing "Charting …" sentence (it landed after the image).
- render-chart / render-diagram: post the caption as a header BEFORE the image
  (a file upload's message lands a beat after postFile resolves, so caption-first
  keeps a stable caption → image order) and drop the false "rendered above" wording.

Depends on the @copilotkit/runtime factory tool-lifecycle fix (#5572) and the
bot-slack HITL/render-order fix (#5573).
2026-06-19 14:05:01 +02:00
Alem Tuzlak d4d6e204f1 feat(examples/slack): add web search via a TanStack AI factory agent
The example's runtime agent needed OpenAI's hosted `web_search` tool, but
BuiltInAgent's classic `tools` only accepts handler-based `ToolDefinition[]`
(needs `execute`) — it can't carry a provider/hosted tool. So switch the
agent to BuiltInAgent **factory mode** (`type: "tanstack"`) and drive it with
TanStack AI's `chat()`:

- `openaiText(model)` adapter (OpenAI Responses API; gpt-5.5 default)
- `webSearchTool({ type: "web_search" })` provider tool (`@tanstack/ai-openai/tools`)
- Linear/Notion MCP via `@tanstack/ai-mcp` `createMCPClient` (HTTP + bearer),
  created per-run; `chat()` discovers their tools and closes the connections
- `convertInputToTanStackAI(ctx.input)` bridges AG-UI input → `chat()`;
  BuiltInAgent converts `chat()`'s stream back to AG-UI events

OpenAI-only now (web search is OpenAI-specific); AGENT_MODEL accepts a bare
OpenAI id or an "openai/<id>" form. Adds @tanstack/ai, @tanstack/ai-openai,
@tanstack/ai-mcp to the example.
2026-06-19 14:02:43 +02:00
Alem Tuzlak 967623de9f fix(bot-slack): resolve HITL waiter in assistant-pane DMs + render-tool message order (#5573)
Two fixes surfaced by exercising the bot's generative-UI / HITL tools
end-to-end in Slack.

## 1. HITL never resumed in an assistant-pane DM

An assistant-pane DM is **threaded**, so the ingress path
(`assistant.ts`) keys the turn's conversation by **`thread_ts`**. But
`decodeInteraction` forced **`DM_SCOPE`** for any `D…` channel. So the
HITL `awaitChoice` waiter was registered under `D…::<thread_ts>` while a
button click looked it up under `D…::dm` — the waiter was never
resolved. Clicking **Create/Cancel** swapped the card UI (the button's
`onClick` ran) but the agent run never resumed: no write, no reply.

**Fix:** honor an explicit `thread_ts` as the conversation scope even in
DMs (matching ingress); fall back to `DM_SCOPE` only for a genuinely
unthreaded DM. + a `decodeInteraction` regression test.

## 2. Render-tool output landed out of order

Defensively finalize any text stream still open at the end of a run
(`onRunFinishedEvent`), so a run's streamed text is fully posted before
the run-loop executes tool handlers that post out-of-band content
(images, cards).

All 200 `@copilotkit/bot-slack` tests pass. Verified live:
`confirm_write` now gates a write and resumes on approval; chart/diagram
output renders in order.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-19 13:58:28 +02:00
Alem Tuzlak 08184c471a feat: Telegram bot adapter (@copilotkit/bot-telegram) + dual-platform example (#5520)
## What

Adds a **Telegram platform adapter** (`@copilotkit/bot-telegram`) for
`@copilotkit/bot`, at feature parity with `@copilotkit/bot-slack`, plus
a runnable example that drives **both** a Slack bot and a Telegram bot
from one app.

## `@copilotkit/bot-telegram` (new package)

A grammY-based adapter implementing the `PlatformAdapter` interface:

- **Ingress:** long-polling by default; webhook / `auto` (serverless-env
detection) opt-in.
- **Threading:** topic-aware hybrid — `tg:<chatId>:<scope>` where scope
is `dm`, `topic:<id>` (forum supergroups, gated on `chat.is_forum`), or
`user:<userId>` (non-forum groups).
- **Rendering:** the platform-agnostic `@copilotkit/bot-ui` JSX IR →
Telegram HTML, with a plain-text format fallback when HTML entity
parsing fails; length-bounded.
- **Streaming:** chunked `editMessageText` (placeholder → repeated
edits) with HTML-expansion headroom.
- **Interactions:** `callback_query` HITL (ack-first; 64-byte
`callback_data` via hashed action ids resolved through the ActionStore).
- **Inbound files:** photo/document ingestion wired into the agent turn
(size-capped, token-redacted).
- Ships `defaultTelegramTools` (user lookup) + `defaultTelegramContext`
(tagging / HTML / thread-model guidance).
- **Capabilities:** `supportsModals: false`, `supportsTyping: true`,
`supportsStreaming: true`, `supportsThreadTitle: true`,
`supportsReactions: false`, `supportsSuggestedPrompts: false`.

## `examples/slack` → Slack **and** Telegram from one app

Rather than maintain a diverging copy, the example now starts a Slack
bot and/or a Telegram bot (env-conditional on which credentials are
present) from one **platform-neutral** app layer — shared components,
tools, context, commands, render helpers. Each platform gets its own
`createBot` with its platform-specific default tools/context; the shared
components emit the cross-platform JSX IR that each adapter renders
natively.

To make the shared layer truly neutral: unicode glyphs instead of Slack
mrkdwn `:shortcode:` strings (Telegram doesn't expand them; Slack
renders unicode fine), no Slack-Block-Kit `raw` fallbacks, and neutral
context/tool wording (per-platform tagging guidance comes from each
adapter's default context). The separate `examples/telegram` app was
removed; its e2e smoke harness + BotFather setup docs were migrated into
`examples/slack`.

## Testing

- `@copilotkit/bot-telegram`: 138 unit tests; `nx build` (typecheck)
clean.
- `slack-example`: 42 tests (incl. `renderTelegram` parity assertions);
typecheck clean.
- `nx run-many -t build` green; root `pnpm install --frozen-lockfile` in
sync.
- Reviewed via a multi-round adversarial CR loop to convergence (zero
load-bearing findings) + a bucket-(c) promotion audit.

## Note: `bot-telegram` is unpublished

The example references it as `workspace:*` and **runs from the
monorepo** (`pnpm --filter slack-example start`). Standalone deploys
(the example's own lockfile) work for Slack today; once `bot-telegram`
publishes alongside its siblings, switch the dep to `~0.0.2` and
regenerate the standalone lockfile to enable standalone Telegram
deploys. Documented in the example README.

## Known limitations / follow-ups (out of scope, pre-existing or
inherent)

- **render_table** hardening (pre-existing in the Slack example):
`clamp()` overflow `notes` are computed but not surfaced (silent
truncation); "Max 100 rows" doc vs `MAX_DATA_ROWS = 99` off-by-one;
monospace fallback ignores column alignment.
- **Telegram e2e harness** is a documented best-effort **manual-trigger
smoke**: `getUpdates` contends with the bot's own long-poller
(single-consumer Bot API limit); multi-chunk reply assembly and
follow-up message selection are approximate. Automated upgrade path
(second sender bot) documented in `e2e/TELEGRAM-README.md`.
- **`_status` glyph mapping** uses substring matching, so non-default
Linear workflow state names (e.g. "Unstarted") can map to the wrong
glyph — identically on both platforms.
- **Bold-inside-link** (`[**text**](url)`) renders literal asterisks on
both Slack and Telegram (link labels aren't formatted on either) —
pre-existing, cosmetic.
- Telegram long-poll failures (revoked token, 409 conflict) are logged
inside the adapter and not surfaced to `start()`, so startup reports
success even if polling later fails.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-19 13:46:10 +02:00
Alem Tuzlak 0c85156458 fix(runtime): support full tool lifecycle in BuiltInAgent TanStack factory mode (#5572)
## Problem

`BuiltInAgent`'s TanStack factory mode (`type: "tanstack"`) was unusable
with server-executed tools. The stream converter
(`convertTanStackStream`) stopped converting at the **first per-turn
`RUN_FINISHED`**, assuming tools are always executed client-side and
re-prompted. But `chat()` executes MCP-server and provider tools
**itself** across multiple turns — so the `TOOL_CALL_RESULT` and the
model's final answer were dropped, and MCP-backed turns returned
**nothing**. It also couldn't surface frontend (generative-UI / HITL)
tools at all in factory mode.

## Fix

- **`convertTanStackStream`**: drop TanStack's per-turn
`RUN_STARTED`/`RUN_FINISHED` (the `Agent` wrapper owns the single outer
pair) and convert **every** turn's events; dedupe tool `START`/`END` by
id (chat() re-announces a call when it re-prompts); surface `RUN_ERROR`
by throwing instead of silently dropping it.
- **`convertInputToTanStackAI`**: return `input.tools` as TanStack
**client-side** tools so the frontend's generative-UI / HITL tools work
in factory mode, and **sanitize** their JSON Schema (recursively close
open objects → `additionalProperties: false`) so OpenAI accepts them —
mirroring what the classic (Vercel AI SDK) path did implicitly via its
Zod round-trip.

## Tests

Adds coverage to the converter + input-converter suites: multi-turn (no
truncation at per-turn `RUN_FINISHED`), tool-call dedup, `RUN_ERROR`
surfacing, client-tool conversion, and schema sanitizing. Full
`@copilotkit/runtime` suite green.

Verified end-to-end against a live Slack bot (`examples/slack`): web
search + Linear/Notion MCP + generative-UI cards + HITL all work through
factory mode.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-19 13:45:32 +02:00
Alem Tuzlak 83c0a66c7b fix(bot-slack): resolve HITL waiter in assistant-pane DMs + fix render-tool message order
Two fixes surfaced by exercising generative-UI / HITL tools through the bot:

- interaction.ts: an assistant-pane DM is threaded, so the ingress path keys the
  turn by thread ts — but decodeInteraction forced DM_SCOPE for any "D…" channel.
  The awaitChoice waiter was registered under D…::<thread_ts> while the button
  click looked it up under D…::dm, so it was never resolved: clicking Create/
  Cancel swapped the card UI but the run never resumed (no write, no reply).
  Honor an explicit thread_ts as the scope even in DMs; fall back to DM_SCOPE
  only for a genuinely unthreaded DM.
- event-renderer.ts: defensively finalize any text stream still open at run end,
  so a run's streamed text is fully posted before the run-loop executes tool
  handlers that post out-of-band content.

Adds a decodeInteraction regression test for the threaded-DM scope.
2026-06-19 13:23:22 +02:00
Alem Tuzlak 5bf13abb8e fix(runtime): support full tool lifecycle in BuiltInAgent TanStack factory mode
The TanStack stream converter stopped at the first per-turn RUN_FINISHED,
assuming tools are executed client-side. That truncated runs whose tools are
executed by chat() itself (MCP servers, provider tools): the TOOL_CALL_RESULT
and the model's final answer were dropped, so MCP-backed turns returned nothing.

- convertTanStackStream: drop TanStack's per-turn RUN_STARTED/RUN_FINISHED (the
  Agent wrapper owns the outer pair) and convert every turn's events; dedupe
  tool START/END by id; surface RUN_ERROR instead of silently dropping it.
- convertInputToTanStackAI: return input.tools as TanStack client-side tools so
  the frontend's generative-UI / HITL tools work in factory mode, and sanitize
  their JSON Schema (close open objects) so OpenAI accepts them.

Adds converter + input tests (multi-turn, dedup, error surfacing, client-tool
conversion, schema sanitizing).
2026-06-19 13:20:21 +02:00
Jordan Ritter 3458927f87 fix(showcase): stop image-drift flagging pinned prod red
Under the pinned-prod contract, prod is intentionally digest-pinned behind
:latest. image-drift now renders such prod services green (pinnedExpected)
instead of red; a genuinely missing digest stays red. Staging unchanged.
2026-06-19 03:50:40 -07:00
Jordan Ritter 3b02ee90a5 fix(showcase): provision prod services digest-pinned with go-live pin guard
Prod services are now born pinned to a resolved @sha256 digest (mirroring
the Ruby promote CLI's GHCR resolver) instead of the mutable :latest tag,
fail-loud on resolve failure, and goLive asserts the prod source.image is
digest-pinned. Adds DI-testable assertProdDigestPinned + coverage.
2026-06-19 03:50:40 -07:00
Jordan Ritter 224754742d test(showcase): bump calculator-fixture integration pin to 19 for ms-agent-harness-dotnet (#5570)
## Summary

Fix-forward for the RED `Showcase: Validate` on `main` introduced by
#5569 (MS Agent Harness (.NET) full column).

`showcase/scripts/__tests__/calculator-fixture-routing.test.ts`
hard-pins the count of discovered `_from-feature-parity.json`
integration fixtures. #5569 legitimately added the 19th integration
(`ms-agent-harness-dotnet`) and its calculator fixtures are already
mirrored in
`showcase/aimock/d6/ms-agent-harness-dotnet/_from-feature-parity.json`.
The test's own failure message prescribes the fix: bump the pin.

## Changes

- Bump the discovered-integration pin from 18 → 19 (test name +
`toHaveLength`).
- Update the explanatory comment counts (16/18 → 17/19) to match the new
integration set. The two pill-less integrations (built-in-agent,
claude-sdk-python) are unchanged; `ms-agent-harness-dotnet` carries the
full calculator pill, so it joins the 17 with a real pill.

No source/behavior change — pin reflects reality (the harness fixture
file exists and passes all per-integration routing/ordering assertions).

## Red → Green proof

RED (original pin=18, glob discovers 19):
```
 FAIL  __tests__/calculator-fixture-routing.test.ts > beautiful-chat calculator fixture routing > discovers all 18 integration _from-feature-parity.json files
AssertionError: integration count changed — new integration added? mirror its calculator fixtures from langgraph-python and update this pin: expected [ 'ag2', 'agno', …(17) ] to have a length of 18 but got 19
- 18
+ 19
 Test Files  1 failed (1)
      Tests  1 failed | 57 skipped (58)
```

GREEN (after pin=19, full file):
```
 Test Files  1 passed (1)
      Tests  58 passed (58)
```

(58 = 19 integrations × 3 per-integration tests + the discovery/pin
test.)
2026-06-19 03:06:27 -07:00
Jordan Ritter a3655a44f4 test(showcase): bump calculator-fixture integration pin to 19 for ms-agent-harness-dotnet 2026-06-19 03:05:20 -07:00
Jordan Ritter c681d64af6 feat(showcase): add MS Agent Harness (.NET) full column (#5569)
## Summary
Adds the full **MS Agent Harness (.NET)** showcase column
(`ms-agent-harness-dotnet`) — a 1:1 port of the green framework sibling
`ms-agent-dotnet`, rebuilt on the `AsHarnessAgent` construction surface
(Microsoft.Agents.AI 1.6.1).

- **326 files** (+30k): 243 frontend demo files + shared components/API
routes, 24 backend agent `.cs` on the `AsHarnessAgent` pattern, 38 D6 +
1 D4 aimock fixtures (cribbed from the framework, `match.context`
re-keyed), manifest/csproj registration.
- The column was already registered (slug-map, compose, dashboard,
smoke) on main; this lands the implementation.

## .NET adaptations (the novel surface)
- **Microsoft.Agents.AI 1.6.1 API migration** —
`AgentThread`→`AgentSession`,
`AgentRunResponse(Update)`→`AgentResponse(Update)`,
`RunAsync`→`RunCoreAsync` across the ported agents.
- **aimock-header** aligned to the `IHttpContextAccessor` design so
`x-aimock-context` propagates across the AG-UI SSE-pump boundary
(matches the framework).
- **JsonElement-capable `TypeInfoResolver`** threaded to the
shared-state agents (fixes a startup crash).
- **`crypto.randomUUID` secure-context fallback** in the headless demos
(the container serves over plain HTTP at a non-localhost host; symmetric
with the existing `multimodal` helper).

## LOCAL==STAGING parity fix
- `control-plane-run.ts` now threads each scope's
`not_supported_features` into the synthesized local roster, so the D6
driver reclassifies architecturally/upstream-blocked features as
`skipped-incapable` locally exactly as staging does. **Benefits every
column** (the local control-plane previously dropped NSF). +3 unit tests
(RED→GREEN).

## LGP / framework parity
- Frontend demos, fixtures (`response.content` untouched — only
`match.context` re-keyed), and backend behavior are 1:1 with the
framework sibling. The `hitl` demo was reverted to byte-identical
framework parity.

## D6 status
- Per-demo D6 GREEN verified locally (control-plane): `headless-simple`,
`headless-complete`, `gen-ui-agent`, `shared-state-read`, `multimodal`.
- 3 features inherited as `not_supported`/skipped-incapable
(architecturally/upstream-blocked, same as the framework):
`shared-state-streaming`, `gen-ui-interrupt`, `interrupt-headless`.
- `declarative-gen-ui` verified structurally parity-clean
(byte-identical to the green framework). **CI runs the authoritative
full-column D6.**

## Review
- 7-agent cr-loop converged (0 mandatory findings; Procedure 3 promotion
audit 0-promote). All review findings were either framework-inherited
(fixing breaks 1:1 parity) or pre-existing `control-plane-run.ts`
poll-hardening (tracked as a follow-up — not introduced here).

## Test plan
- [ ] CI: Showcase: Validate green
- [ ] CI: full-column D6 (`ms-agent-harness-dotnet`) green
(authoritative)
- [ ] CI: .NET image build green
2026-06-19 02:54:53 -07:00
github-actions[bot] 45424333f0 style: auto-fix formatting 2026-06-19 09:32:19 +00:00
Jordan Ritter bc57302742 feat(showcase): thread not_supported_features into local control-plane roster for LOCAL==STAGING NSF skip parity 2026-06-19 02:28:34 -07:00
Jordan Ritter e10df0b489 feat(showcase): add ms-agent-harness-dotnet d6/d4 aimock fixtures 2026-06-19 02:28:33 -07:00
Jordan Ritter 49d2ac16ff feat(showcase): port ms-agent-harness-dotnet frontend (demos, shared components, API routes) 2026-06-19 02:28:27 -07:00
Jordan Ritter 6ddc85f7ee feat(showcase): port ms-agent-harness-dotnet backend agents on the AsHarnessAgent construction surface 2026-06-19 02:28:22 -07:00
Jordan Ritter 4c1ed975c7 chore(showcase): register ms-agent-harness-dotnet column (manifest, csproj, slug-map, compose, dashboard, smoke) 2026-06-19 02:28:18 -07:00
Alem Tuzlak 7fe12d6d3c Merge remote-tracking branch 'origin/main' into feat/bot-telegram-adapter
# Conflicts:
#	examples/slack/README.md
#	examples/slack/package.json
#	pnpm-lock.yaml
2026-06-19 11:04:18 +02:00
Mike Ryan d5b804698d fix(examples): suppress browser-extension hydration warning on <body> across integration demos (#5568)
## What

1. Add `suppressHydrationWarning` to `<body>` across **all 14
integration demo templates**
(`examples/integrations/*/src/app/layout.tsx`).
2. Fix a pre-existing **double-escaped Windows path** bug in the parity
manifest's `packageJsonOverrides`.

## Why (hydration)

**Mike Ryan hit a hydration error on first load of a fresh
`langgraph-python` init — caused by his Grammarly browser extension.**

Grammarly (and similar extensions) inject attributes onto `<body>`
*before* React hydrates:

```
data-new-gr-c-s-check-loaded="9.98.0"
data-gr-ext-installed=""
```

Those attributes are in the client DOM but absent from the server HTML,
so Next.js reports:

> A tree hydrated but some attributes of the server rendered HTML didn't
match the client properties.

It's a **false positive** — the app works, and end users (without dev
extensions) never see it — but it's a red console error on the first
load of our flagship eval/showcase templates, which is a poor first
impression.

## Fix (hydration)

`suppressHydrationWarning` on `<body>` is the React/Next.js-recommended
escape hatch for this. It is **scoped and one level deep**: it only
relaxes the check for `<body>`'s *own* attributes/text — **everything
rendered inside `<body>` (the whole app) is still fully
hydration-checked** — and `<body>`'s only attribute here is a static
`className`, so none of our own markup is masked. An inline comment
documents this so a future maintainer who adds dynamic `<body>`
attributes knows the check is relaxed.

`agent-spec` already had `suppressHydrationWarning` on `<html>`; the
Grammarly attributes land on `<body>`, so it needed the body-level
relaxation too (the `<html>` one is a level up and doesn't cover
`<body>`'s attributes).

## Commits

1. `b1fa482a7` — north-star (`langgraph-python`) + parity instances
(`langgraph-js`, `langgraph-fastapi`, `strands-python`) via `pnpm
parity:sync`.
2. `9f9c415d9` — the non-parity templates (not tracked by
`_parity/manifest.json`): `adk`, `agno`, `crewai-crews`, `crewai-flows`,
`llamaindex`, `mastra`, `ms-agent-framework-dotnet`,
`ms-agent-framework-python`, `pydantic-ai`, `agent-spec`. *(The repo's
`oxfmt` pre-commit hook also collapsed some multiline `<CopilotKit …>`
JSX in these files — standard auto-format on touched files; the only
semantic change is the suppression.)*
3. `7d60e49de` — parity manifest path-escaping fix (see below).

## The manifest bug (commit 3)

While syncing I found the `langgraph-js` and `strands-python`
`packageJsonOverrides` double-escaped the Windows `.bat` fallback,
producing `scripts\\run-agent.bat` (two backslashes) instead of
`scripts\run-agent.bat`:

- `langgraph-js/package.json` had already been synced with the broken
value.
- `strands-python/package.json` was still correct — and `parity:sync`
would have **corrupted** it on the next run (which is what surfaced
this).

Fixed the three overrides and re-ran `parity:sync`, which corrects
`langgraph-js/package.json` and leaves `strands-python`'s correct value
intact.

## Test plan

- [x] `pnpm parity:verify` → 0 errors
- [x] lefthook pre-commit green on all 3 commits (lint + `packages/**`
tests + commitlint)
- [x] All 14 templates confirmed to have body-level
`suppressHydrationWarning`
- [ ] Reviewer with Grammarly installed: run/`init` a template and
confirm no hydration error on first load
2026-06-18 20:02:31 -07:00
Ben Taylor 14dda3d6f9 fix: ignore CopilotKit local state in starters (#5565)
## Summary
- add .copilotkit to newly scaffolded integration .gitignore files
- ensure extracted standalone starters also include .copilotkit in
.gitignore
- add regression coverage for scaffolded and extracted starter outputs

## Tests
- pnpm nx run @copilotkit/showcase-scripts:test --skip-nx-cache --
__tests__/extract-starter.test.ts __tests__/create-integration.test.ts
- pnpm exec oxfmt --check showcase/scripts/extract-starter.ts
showcase/scripts/create-integration/index.ts
showcase/scripts/__tests__/create-integration.test.ts
showcase/scripts/__tests__/extract-starter.test.ts
2026-06-18 21:57:21 -05:00
Maximiliano Korp 7d60e49de0 fix(examples): correct double-escaped Windows agent path in parity overrides
The langgraph-js and strands-python packageJsonOverrides in
_parity/manifest.json double-escaped the Windows .bat fallback, so the
synced value became `scripts\\run-agent.bat` (two backslashes) instead of
the intended `scripts\run-agent.bat`. langgraph-js's package.json had
already been synced with the broken value; strands-python's was still
correct (and parity:sync would have corrupted it on the next run).

Fix the three overrides and re-run parity:sync, which corrects
langgraph-js/package.json and leaves strands-python's correct value intact.
2026-06-18 17:16:01 -07:00
Maximiliano Korp 9f9c415d98 fix(examples): suppress browser-extension hydration warning on <body> (non-parity templates)
Extend the same `<body suppressHydrationWarning>` fix to the integration
templates that are not tracked by examples/integrations/_parity/manifest.json,
so they don't surface a Grammarly-style hydration mismatch on first load:
adk, agno, crewai-crews, crewai-flows, llamaindex, mastra,
ms-agent-framework-dotnet, ms-agent-framework-python, pydantic-ai, agent-spec.

agent-spec already had suppressHydrationWarning on <html>; the Grammarly
attributes land on <body>, so it needs the body-level relaxation too (the
<html> one is one level up and does not cover <body>'s attributes).
2026-06-18 17:12:28 -07:00
Jordan Ritter 18b83a7b46 fix(generative-ui-playground): valid model id + serverExternalPackages (#5567)
## Summary

Two focused, pre-existing fixes in the `generative-ui-playground`
example. These were surfaced as out-of-subject bucket-(d) findings
during the `@copilotkitnext` → `/v2` migration CR (#5562) and split out
into this follow-up.

### 1. Invalid model id in the opengenui route
`src/app/api/copilotkit-opengenui/[[...slug]]/route.ts:16` set `const
MODEL = "openai/gpt-5.2"` — a nonexistent model id, so every chat turn
errored. Changed to `"openai/gpt-4o"`, the verified-real id used by the
sibling `showcase/shell/src/app/api/copilotkit/[[...slug]]/route.ts`.

### 2. Missing `serverExternalPackages` in next.config.ts
`next.config.ts` lacked `serverExternalPackages`, but the example's API
routes import `@copilotkit/runtime/v2` (a server-only package). Added
`serverExternalPackages: ["@copilotkit/runtime"]` (base package name
covers the `/v2` subpath), mirroring `showcase/shell/next.config.ts`.

## Red → Green evidence

**Model id**
- RED: `route.ts:16` was `const MODEL = "openai/gpt-5.2";`; sibling
`showcase/shell` route uses `model: "openai/gpt-4o"`.
- GREEN: `route.ts:16` is now `const MODEL = "openai/gpt-4o";`.

**serverExternalPackages**
- RED: `grep -n serverExternalPackages next.config.ts` -> no match (exit
1).
- GREEN: `grep -n serverExternalPackages next.config.ts` -> `9:
serverExternalPackages: ["@copilotkit/runtime"],`.

## Build outcome

`next build` is **blocked by SEPARATE pre-existing module-resolution
failures unrelated to these fixes** and NOT addressed here:
- `copilotkit` and `copilotkit-a2ui` routes import
`createCopilotEndpoint` from the bare v1 `@copilotkit/runtime`, which
does not export it.
- The `copilotkit-opengenui` route (and its client-component chain)
imports from `@copilotkitnext/runtime`, which is not a declared
dependency of this package and fails with `Module not found: Can't
resolve '@copilotkitnext/runtime'`.

Because the build fails at module resolution for these pre-existing
imports before compiling the changed lines, a clean end-to-end build
cannot be obtained. Both edits are statically correct: the model id
matches the verified-real sibling, and `serverExternalPackages` mirrors
the working `showcase/shell` config. Fixing the pre-existing
`createCopilotEndpoint` / `@copilotkitnext/runtime` import errors is
explicitly out of scope for this follow-up.
2026-06-18 16:52:46 -07:00
Jordan Ritter 9aac779c51 fix(generative-ui-playground): use valid model id and externalize @copilotkit/runtime
The opengenui route used the nonexistent model id "openai/gpt-5.2", causing
every chat turn to error. Switch to "openai/gpt-4o", the verified-real id used
by the sibling showcase/shell copilotkit route.

The example's API routes import @copilotkit/runtime/v2 (a server-only package),
but next.config.ts lacked serverExternalPackages, so Next.js attempted to bundle
it. Add serverExternalPackages: ["@copilotkit/runtime"] (base package name covers
the /v2 subpath), mirroring showcase/shell/next.config.ts.
2026-06-18 16:48:32 -07:00