## What does this PR do? Adds the CopilotKit consumer side of ENT-1173 across Shared, Runtime, Core, Web Inspector, and the existing Shell Docs pages. - Defines and parses optional trusted Inspector metadata for identity, plan, license, action, usage, and expiry. Runtime proxies it through a private, failure-isolated route, and Core refreshes it without changing connection state. - Groups Inspector navigation into Threads, Agents, and Learning. Threads renders finite, unlimited, unknown, overage, and expiring usage states plus matching trusted plan or license actions. - Keeps explicit `threadEndpoints` as the only authority for Thread requests. Locked or absent capability states make no list, subscription, detail, message, event, or state calls. - Keeps the zero-thread video, three example Threads, detail tabs, and guided tour in empty and locked states. General Intelligence remains the default onboarding path; only trusted `team_self_hosted` metadata uses self-hosted onboarding. - Gives an active license with missing Runtime routes a short **Finish setting up Rich Threads** state. Users can copy a safe coding-agent prompt or open the public Runtime setup guide. The same copy control appears in that guide, and raw Markdown/LLM views include the full prompt. - Keeps finite usage green below 90%, orange from 90% to the limit, and red at or above the limit. At 90%, a trusted plan action changes from **Manage Your Plan** to a purple **Upgrade Your Plan** without changing its trusted URL, action kind, or telemetry contract. - Adds a deterministic 33-state loopback lab for CopilotKit developers. It has no production route or export, is absent from public docs and package metadata, and is excluded from the npm tarball. `Expiring Soon` is display-only; this PR does not enable the thread culler. Managed Enterprise receives no manage-plan action, and Team Self-Hosted receives no hosted plan action. Optional metadata and the additive expiry field remain compatible across mixed producer, Runtime, Core, and Inspector versions. A small Channels test-only change updates fetch mocks for current TypeScript types. It changes no Slack or Teams docs or runtime behavior. ## Related PRs and issues - Refs [ENT-1173](https://linear.app/copilotkit/issue/ENT-1173/ship-plg-ready-inspector-navigation-metadata-and-locked-threads) - Producer: [CopilotKit/Intelligence#696](https://github.com/CopilotKit/Intelligence/pull/696) ## Validation - `@copilotkit/web-inspector`: 20 files and 372 tests passed; typecheck and production build passed. - Shell Docs: 57 files and 383 tests passed; lint, typecheck, and production build passed. The build generated all 222 static pages. - Browser checks cover the copy-prompt flow, unchanged white **Manage Your Plan**, purple **Upgrade Your Plan**, orange 4,500/5,000 usage, and red 5,000/5,000 usage. - Independent review found no Critical or Important issues. - The broader Runtime, React Native, Channels, package-quality, compatibility, and Node-version checks from the prior pushed head remain green. ## Checklist - [x] I have read the [Contribution Guide](https://github.com/copilotkit/copilotkit/blob/master/CONTRIBUTING.md) - [x] I updated the relevant documentation - [ ] "Allow edits by maintainers" is checked
@copilotkit/core
@copilotkit/core is the framework-neutral client for CopilotKit runtimes. It
manages runtime agents, frontend tools, shared context, suggestions, thread
stores, and subscriptions.
Trusted Inspector metadata
When the connected runtime reports inspectorMetadata: true in its runtime-info
response, Core loads the optional InspectorMetadataV1 value in the background.
The runtime connection and agent notifications finish first, so a slow or
unavailable metadata route cannot delay the app.
Core exposes the object returned by Shared normalization unchanged through the
getter and subscriber event. Older runtimes may omit
usage.expiringSoonCount; that absence remains valid V1 usage. A value of 0
means known zero and stays different from absence. Shared omits a malformed
expiry leaf without removing valid used, limit, or sibling modules. Core
does not calculate or rebuild expiry and does not require a V2 schema.
Read the latest value with inspectorMetadata, refresh it without reconnecting,
or subscribe to changes:
import { CopilotKitCore } from "@copilotkit/core";
const copilotkit = new CopilotKitCore({
runtimeUrl: "/api/copilotkit",
headers: { Authorization: "Bearer app-session" },
credentials: "include",
});
const subscription = copilotkit.subscribe({
onInspectorMetadataChanged: ({ inspectorMetadata }) => {
console.log(inspectorMetadata);
},
});
await copilotkit.refreshInspectorMetadata();
console.log(copilotkit.inspectorMetadata);
subscription.unsubscribe();
Core sends the current headers and fetch credentials to the Copilot Runtime. A
call to setHeaders() or setCredentials() clears the prior value before it
starts a new metadata refresh, so trusted context cannot cross an auth-context
change. Changing the runtime URL or transport, losing the capability, or
disconnecting also clears the value.
Each refresh cancels the prior request and has a five-second deadline. Core also checks the runtime URL, requested and resolved transport, headers, credentials, connection, and capability before publishing a response. A stale success or failure cannot replace metadata from a newer connection. Route, timeout, parse, and subscriber failures stay isolated from the runtime connection.
See the
CopilotKitCore reference
and
CopilotKitCoreSubscriber reference
for the full API.