## Summary
- Add Slack `respondTo` routing options with mention-only channel thread
replies by default.
- Keep DMs and assistant pane conversational while allowing legacy
owned-thread continuation by config.
- Update the Slack example config, manifests, docs, and Discord README
trigger wording.
## Why
Slack bots should stay quiet in channel threads unless explicitly
mentioned or configured for continuation. This makes Kite-style bots
less noisy by default while preserving the old behavior for teams that
want it.
## How
- Resolve `respondTo` once in `SlackAdapter.start()` and pass the
resolved policy into the Slack listener.
- Gate `app_mention`, `message.im`, and non-DM thread replies against
that policy.
- Add listener coverage for defaults, disabled routes, in-channel
mention replies, and legacy thread continuation.
## Test Plan
- `pnpm exec nx run @copilotkit/bot-slack:test --
src/__tests__/slack-listener.test.ts`
- `pnpm exec nx run @copilotkit/bot-slack:test`
- `pnpm exec nx run @copilotkit/bot-slack:check-types`
- `pnpm exec nx run slack-example:test`
- `pnpm exec nx run slack-example:check-types`
- targeted `pnpm exec oxfmt --check ...`
- targeted `git diff --check ...`
## Summary
- Moves the canonical `/threads` guide into the **Build Chat UIs** nav
group, immediately after prebuilt components
- Keeps `/premium/threads-explained` under **Intelligence Platform** as
the architecture/persistence explanation
- Adds contextual cross-links between the Threads guide, Threads
architecture page, and relevant prebuilt chat UI docs
- Shows `Threads` in the authored framework sidebars next to their chat
UI basics
## Why
Threads are primarily discovered by developers adding saved
conversations, history, and thread switching to a chat UI. The
implementation guide belongs with chat UI docs, while the platform page
remains the deeper explanation of persistence, realtime sync, and
Enterprise Intelligence Platform backing.
## Screenshots
**Root docs navigation: `/threads` now appears with the chat UI basics,
immediately after Prebuilt Components.**

**Authored framework navigation: framework-specific docs now show
Threads next to Prebuilt Components too.**

**Intelligence Platform navigation: the architecture page stays in the
platform section.**

## Validation
- `git diff --check origin/main...HEAD`
- `git diff --check`
- `npm run typecheck` from `showcase/shell-docs`
- Local route smoke checks for `/threads`, `/premium/threads-explained`,
`/prebuilt-components`, and `/prebuilt-components/chat` returned 200
- Authored framework route smoke checks returned 200
## Summary
- Adds a `thread_persistence_pattern` manifest flag so shared docs can
render selected-framework Threads guidance.
- Marks LangGraph Python, LangGraph TypeScript, LangGraph FastAPI, and
Google ADK with the appropriate thread persistence pattern.
- Extends `WhenFrameworkHas` support so the shared Threads guide can
show LangGraph-only and ADK-only callouts.
- Clarifies that `useThreads` manages Enterprise Intelligence Platform
thread records, not native framework stores.
- Adds framework-selected callouts to the root/shared Threads guide
without adding a third setup path.
## Notes
The new callouts intentionally avoid claiming external store listing,
lifecycle sync, migration/import tooling, or durable ADK sessions by
default. Those remain product/runtime follow-ups tracked separately.
## Validation
- `git diff --check`
- `npm run pretypecheck` in `showcase/shell-docs`
- `npm run lint` in `showcase/shell-docs` (passes with existing
warnings)
- `npm run typecheck` in `showcase/shell-docs`
- `npm run build` in `showcase/shell-docs` (passes with existing
Turbopack/NFT warning)
- Local route smoke checks:
- `/threads` hides framework callouts
- `/langgraph-python/threads` shows LangGraph callout only
- `/langgraph-typescript/threads` shows LangGraph callout only
- `/langgraph-fastapi/threads` shows LangGraph callout only
- `/google-adk/threads` shows ADK callout only
## Summary
- Adds the Inspector Threads locked state for non-Intelligence installs
with a faded full-background thread mockup, updated headline, CTA
order/styling, and production Talk to an Engineer destination.
- Adds Threads telemetry events and metadata for tab click,
locked/enabled/empty views, and CTA clicks, including
package/runtime/status fields that can be derived safely.
- Hardens adjacent inspector paths found during review: telemetry
opt-out and serialization safety, preserved realtime wsUrl on header
refresh, unknown thread endpoint status handling, stale selected-thread
rendering, announcement HTML/link safety, RUN_ERROR styling, context
value rendering, and thread-detail URL joining for trailing-slash
runtime URLs.
## Telemetry notes
Implemented derivable/safe fields: package_name, package_version,
inspector_distinct_id, posthog_distinct_id for attributed CTA URLs,
intelligence_status, thread_service_status, runtime_url_type,
runtime_mode, license_status, telemetry_disabled, cta, cta_surface, and
thread_count.
Telemetry sink allowlist checked: `CopilotKit/oss-path-to-production`
already accepts the owned `oss.inspector.*` namespace via its prefix
gate, so no sink source allowlist change is required. Added
https://github.com/CopilotKit/oss-path-to-production/pull/173 to pin the
new Inspector Threads event names in ingest tests. The package/version
metadata now reads from `packages/web-inspector/package.json` instead of
a hardcoded version string.
Not implemented because they are not currently available from safe
public inspector state:
- has_public_license_key: no explicit public boolean is exposed;
deriving from headers/config could imply token state.
- cta_variant: current UI has no variant state to distinguish.
## Validation
- NX_TUI=false pnpm nx run @copilotkit/web-inspector:check-types
--skip-nx-cache
- NX_TUI=false pnpm nx run @copilotkit/web-inspector:test
--skip-nx-cache (43 tests passed)
- NX_TUI=false pnpm nx run @copilotkit/web-inspector:build
--skip-nx-cache
- NX_TUI=false pnpm nx run @copilotkit/core:check-types --skip-nx-cache
- git diff --check
- Telemetry sink validation in
https://github.com/CopilotKit/oss-path-to-production/pull/173: `pnpm
test -- telemetry-sink-ingest.test.ts` and `pnpm build`
- 7-agent code review pass, followed by 3-agent focused confirmation
pass with no remaining findings in scope
- Pre-commit package matrix hit an unrelated @copilotkit/react-core:test
timeout in `A2UIMessageRenderer.test.tsx` during amend; targeted
web-inspector checks above passed
## Screenshot

## What
Wires the `strands-typescript` showcase integration for **staging**
deployment, mirroring how the Python `strands` integration is deployed.
Provisions the Railway service and adds all repo-side deploy wiring so
the integration appears in the staging integration switcher menu.
## Why
The `strands-typescript` integration code was complete and ran locally,
but was not deployed (`deployed: false`, no Railway service), so it was
absent from the staging integration menu.
## Changes
- **manifest**: `deployed: true` so the shell lists it in the
integration menu.
- **railway-envs.ts**: new `showcase-strands-typescript` SSOT entry.
**Staging-only for now**: the prod instance is not yet provisioned, so
the entry omits the prod env and is `gateIgnore`'d (like
`harness-workers`) until it is promoted dual-env. Regenerated
`railway-envs.generated.json`.
- **showcase_build.yml** + **showcase_build_check.yml**: build-matrix
entry, change-detection filter, and dispatch option. `railway_id` is the
new Railway service id.
- **golden fixture** + **image-ref-gate inventory tests**: updated for
the new service (count 40 → 41, gateIgnore allowlist).
## Railway provisioning (done via CLI/API)
- Service `showcase-strands-typescript` created in the **showcase**
project.
- serviceId `d6f47c8c-a0a1-4dbe-991c-50f8463fd68d`
- staging instanceId `3f917b9f-c3f0-4d8b-96ca-7f455e06b5ba`
- staging domain `showcase-strands-typescript-staging.up.railway.app`,
health `/api/health`, restart ON_FAILURE
- staging vars: `MODEL_PROVIDER=openai`, `MODEL_ID=gpt-4o`,
`OPENAI_BASE_URL=https://aimock-staging.up.railway.app/v1`,
`OPENAI_API_KEY` (placeholder; aimock-fronted), `NODE_ENV=production`,
`NEXT_PUBLIC_BASE_URL=https://showcase.staging.copilotkit.ai`
- No Bedrock/AgentCore creds needed: like the rest of the fleet, LLM
traffic routes through the env-local **aimock** (deterministic replay),
so no real provider key is required.
## Post-merge behavior
On merge to `main`, `showcase_build.yml` builds + pushes
`ghcr.io/copilotkit/showcase-strands-typescript:latest`, redeploys the
staging service, and rebuilds the shell (picking up `deployed: true`).
After that the service is healthy and strands-typescript appears in the
staging integration menu. The image does not exist in GHCR until that
first build, so the Railway service is expected to be unhealthy until
then.
## Prod (follow-up)
Prod is intentionally not provisioned here. It will be added (dual-env,
`gateValidated: true`, `gateIgnore` removed) when the service is
promoted to prod via `showcase_promote.yml`.
## Verification
- `emit-railway-envs-json --check`: up to date
- `sync-promote-service-options --check`: dropdown up to date
(staging-only correctly excluded)
- railway/promote/emit/gate/deploy/registry vitest: 137 passing
- `oxfmt --check`: clean
- `validate-constraints strands-typescript`: valid
The strands-typescript SSOT entry is ciBuilt:true but staging-only (prod
instance not yet provisioned). redeploy-env.ts's default scope was the full
CI_BUILT_SERVICES set for BOTH envs, so a staging-only ciBuilt service would
wrongly enter the prod default scope and fail a manual `redeploy-env.ts prod`
(no prod instance). Filter the default scope by env declaration (explicit
--services stays unfiltered, preserving the contract-pin that an operator can
force a named service in an env it does not declare). imageOf expansion was
already env-aware; this extends the same invariant to the base scope.
Update the inventory-lock test counts for the new service (total 40->41,
CI_BUILT 38->39, staging default scope 39->40; prod default scope stays 38 as
the staging-only service is now correctly excluded).
## Summary
Greens two of the three failing D6 (e2e-full) cells for **both** the
`strands` (Python) and `strands-typescript` integrations: **32/35 →
34/35** each.
## Fixes
- **shared-state-read** — the turn-2 fixture leg wrongly pinned
`turnIndex: 0`, so the aimock matcher skipped it on turn 2 ("candidate
fixture skipped by sequence/turn state") → 404 → turn-2 `sse-missing`.
Dropped `turnIndex` to mirror the langgraph-python gold-standard fixture
(whose turn-2 leg omits it).
- **multimodal** — `sample.png/pdf/wav` were committed as **git-LFS
pointers**, so deploy/test environments without `git lfs pull` served
the ~130-byte pointer text as the uploaded file → the agent run never
started (`runsFinished=0`). Now shipped as regular binaries via a
per-integration `.gitattributes` lfs-unset + real bytes, mirroring
langgraph-python's existing convention ("must stay as regular binaries
... so deploy environments without `git lfs pull` serve the actual
files").
Both fixes verified locally: `showcase/bin/showcase test
{strands,strands-typescript} --d6 --direct --rebuild --isolate` → 34/35
each, shared-state-read + multimodal green.
## Known remaining red (out of scope here)
**gen-ui-declarative** (A2UI dynamic) stays red on both. The A2UI
surface **paints correctly** (real dashboard data), but `generate_a2ui`
never completes, so the run hangs "Running" (`runsFinished=0`). This
reproduces on **real-LLM staging** too, so it is not a fixture/aimock
artifact — it is a Strands A2UI-dynamic run-completion issue. The
fixtures and frontend are byte-identical to langgraph-python's (which
passes), pointing at the Strands adapter's auto-inject completion path.
Tracked separately for an adapter-level fix.
Wire the strands-typescript showcase integration for staging deployment,
mirroring how the Python strands integration is deployed.
- manifest: flip deployed: true so the shell lists it in the integration menu
- railway-envs.ts: add showcase-strands-typescript SSOT entry (staging-only
for now: prod instance not yet provisioned, so it omits the prod env and is
gateIgnore'd until promoted dual-env); regenerate railway-envs.generated.json
- showcase_build.yml + showcase_build_check.yml: add the strands-typescript
build matrix entry, change-detection filter, and dispatch option (railway_id
is the new Railway service id)
- golden fixture + image-ref-gate inventory tests updated for the new service
Railway staging service showcase-strands-typescript provisioned
(showcase-strands-typescript-staging.up.railway.app, health /api/health,
OpenAI-via-aimock env). Prod is added later via the promote pipeline.