[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-copilotkit-setup-slack-channel":3,"mdc-rbp4qj-key":53,"related-repo-copilotkit-setup-slack-channel":2371,"related-org-copilotkit-setup-slack-channel":2475},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":48,"sourceUrl":51,"mdContent":52},"setup-slack-channel","set up Slack channels for CopilotKit agents","Use for the PROVIDER half of getting a locally running CopilotKit Channels agent to answer in Slack, when no Slack app exists yet — setting up a Channels bot in Slack for the first time, creating the Slack app and its tokens, attaching it to a managed Intelligence Channel, or when a Channel reports setup_required, sits at \"Waiting for runtime\", the Channel is Online but a Slack mention gets no reply, or a Slack app was built with Socket Mode instead of an Intelligence Request URL. Scoped to an OpenTag checkout, or the OpenTag example inside a channels-sdk clone — the phases assume those conventions (app\u002Fchannel.tsx, app\u002Fenv.ts, INTELLIGENCE_CHANNEL_NAME, a local agent on port 8123) and do not describe a project scaffolded by copilotkit init, which already ships its own channel host. If the Slack app and Channel already exist and the question is about declaring or customising the Channel in code, use the copilotkit-channels skill instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"copilotkit","CopilotKit","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fcopilotkit.png",[12,14,17,20],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Agents","agents",{"name":18,"slug":19,"type":13},"Slack","slack",{"name":21,"slug":22,"type":13},"API Development","api-development",35928,"https:\u002F\u002Fgithub.com\u002FCopilotKit\u002FCopilotKit","2026-08-04T05:59:07.688356",null,4434,[29,30,31,16,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"agent","agent-native","agentic-ai","ai","ai-agent","ai-assistant","assistant","assistant-chat-bots","copilot","copilot-chat","generative-ui","js","llm","nextjs","open-source","react","reactjs","ts","typescript",{"repoUrl":24,"stars":23,"forks":27,"topics":49,"description":50},[29,30,31,16,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"The Frontend Stack for Agents & Generative UI. React, Angular, Mobile, Slack, and more.  Makers of the AG-UI Protocol","https:\u002F\u002Fgithub.com\u002FCopilotKit\u002FCopilotKit\u002Ftree\u002FHEAD\u002Fskills\u002Fsetup-slack-channel","---\nname: setup-slack-channel\ndescription: Use for the PROVIDER half of getting a locally running CopilotKit Channels agent to answer in Slack, when no Slack app exists yet — setting up a Channels bot in Slack for the first time, creating the Slack app and its tokens, attaching it to a managed Intelligence Channel, or when a Channel reports setup_required, sits at \"Waiting for runtime\", the Channel is Online but a Slack mention gets no reply, or a Slack app was built with Socket Mode instead of an Intelligence Request URL. Scoped to an OpenTag checkout, or the OpenTag example inside a channels-sdk clone — the phases assume those conventions (app\u002Fchannel.tsx, app\u002Fenv.ts, INTELLIGENCE_CHANNEL_NAME, a local agent on port 8123) and do not describe a project scaffolded by copilotkit init, which already ships its own channel host. If the Slack app and Channel already exist and the question is about declaring or customising the Channel in code, use the copilotkit-channels skill instead.\nversion: 1.0.0\n---\n\n# Set up a Slack Channel for a local Channels agent\n\nTake a developer from a code checkout to a working local Slack agent. **Five\nseparate systems** have to line up, and they are owned by four different parties:\n\n| System                                                | Who owns it                   | Where you work on it                     |\n| ----------------------------------------------------- | ----------------------------- | ---------------------------------------- |\n| Slack workspace                                       | Workspace owner \u002F app manager | Slack, in a browser                      |\n| Slack app + its tokens                                | The developer                 | api.slack.com, in a browser              |\n| Intelligence project, API key, Channel, Slack adapter | The developer                 | The Intelligence dashboard, in a browser |\n| Local Channels runtime                                | The developer                 | This repo, in the shell                  |\n| AG-UI agent backend                                   | The developer                 | This repo, in the shell                  |\n\n## How delivery actually works — two legs, two mechanisms\n\nGetting this wrong is the most expensive mistake available here, because a\nmisconfigured Slack app installs cleanly and answers nothing.\n\n| Leg                             | Mechanism                                                                                                                                        | What authenticates it                              |\n| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------- |\n| **Slack → Intelligence**        | Slack posts events over **HTTPS** to an Intelligence-hosted Request URL: `https:\u002F\u002Fintelligence.copilotkit.ai\u002Fapi\u002Fchannels\u002Fadapters\u002Fslack\u002Fevents` | The app's **signing secret**, held by Intelligence |\n| **Intelligence → your runtime** | Your runtime dials **out** to the realtime gateway over a websocket                                                                              | `INTELLIGENCE_API_KEY`                             |\n\nTwo consequences:\n\n- **No tunnel and no public URL of your own is needed** — but not because of Socket\n  Mode. It is because _Intelligence_ owns the public URL, and because the second\n  leg is outbound from your machine.\n- **Socket Mode is off, and there is no `xapp-` app-level token in this workflow at\n  all.** A managed Slack app needs `socket_mode_enabled: false` and a\n  `request_url`. If you create the app with Socket Mode on and no Request URL, no\n  event ever reaches Intelligence.\n\nThe Slack adapter form in Intelligence therefore asks for exactly two values: the\n**bot token** (`xoxb-`) and the **signing secret**. Nothing else.\n\nMost of this workflow happens in a **browser**, not a shell. **The supported path\nfor v1 is the Intelligence browser experience.** `copilotkit channels` does list\ncommands for Channel creation, adapter attach, and key issuance — **do not use\nthem here**; they are not hardened for this workflow yet. Never invent a command\nname to fill a gap, and if you are unsure whether a command covers something,\ncheck its `--help` rather than guessing.\n\n## Done means three things, all verified\n\nDo not report success until **all three** hold. Any one alone is a false positive.\n\n1. **The Slack app is installed** in a workspace, and the bot is a member of the\n   channel you will test in.\n2. **The managed Channel reports `online`** — from `controls.status()` in the\n   process, or Online in the dashboard. Not \"the runtime started.\"\n3. **A real human mention got a real reply** in Slack.\n\nGate 2 is where agents fail. `await controls.ready()` resolves on\n`setup_required` too — that state is documented as \"a valid degraded state, not\na failure.\" A runtime with **no Slack connection at all** starts cleanly, prints\nits listening line, returns HTTP 200 on `\u002Fapi\u002Fcopilotkit\u002Finfo`, and answers\nnothing. `\u002Fapi\u002Fcopilotkit\u002Finfo` reports license and runtime info, **not** channel\nstate, so a 200 there is not evidence of anything Slack-related.\n\nThe SDK behaviors asserted here were verified against the currently published\n`@copilotkit\u002Fchannels@0.6.0` and `@copilotkit\u002Fruntime@1.65.0`. A starter may pin\nsomething older or newer, and this API is moving fast. If a claim here\ncontradicts what you observe, **trust the installed package** and re-read it —\ndo not argue with the runtime.\n\n## Scope — read before planning\n\n**In scope:** production CopilotKit Intelligence; a managed Channel; a dedicated\nSlack app created from a manifest; a local runtime and agent.\n\n**Out of scope in v1. These are hard limits, not defaults to weigh:**\n\n- **Do not switch to a direct Slack adapter** (`adapters: [slack({ botToken,\nappToken })]`). Not as a fallback, not to save time, not because the dashboard\n  is confusing. See the prohibitions below — this is the single most common way\n  this workflow goes wrong.\n- **Do not reuse, reinstall, or modify a Slack app that is already installed and\n  in use.** Create a dedicated one.\n- Do not deploy anything (Railway or otherwise).\n- Do not target internal or dev Intelligence environments.\n- Do not enumerate the Slack workspace, search channels, or request scopes beyond\n  the manifest.\n\n## Phase 0 — Establish the route and the contract\n\n**First, check whether Phases 1–2 are already done for you.** Some organizations\nrun a dedicated **dev bot** alongside their production one and hand developers a\nready-made environment file — the Slack app, the Channel, and the adapter already\nexist, and the dev bot comes online only while someone runs it locally.\n\nAsk: _is there an existing dev bot and a provided config for this, or am I\nsetting one up from scratch?_\n\nIf a config is provided, **skip Phases 1 and 2 entirely**: put the provided\nvalues in `.env` (the developer retrieves them from their team's secret-sharing\nchannel — never ask them to paste the contents here), install, and run. Do not\ncreate a new Slack app, and do not create a Channel. Phases 3–5 still apply, and\nthe three success gates are unchanged.\n\nOtherwise, pick the starter, in this order:\n\n1. **An OpenTag checkout** — the developer's cwd is one, or they name one. This is\n   the most likely path. Detect it: a `slack-app-manifest.yaml` plus\n   `app\u002Fchannel.tsx` at the root.\n2. **`examples\u002FOpenTag` in this repo**, if present. It is a submodule, so a plain\n   clone leaves it empty:\n\n   ```bash\n   git submodule update --init examples\u002FOpenTag\n   ```\n\n3. **Neither** → have the developer clone it, and work from there:\n\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002FCopilotKit\u002FOpenTag.git\n   ```\n\nWhichever you land on, treat that checkout as the source of truth. Do not carry\nfacts between checkouts — versions, env var names, and registered handlers differ\nbetween OpenTag revisions, which is why the next step reads them rather than\nassuming them.\n\nThen read the app's **own** environment contract instead of assuming variable\nnames. They differ between apps, and so does the vocabulary for the _same_\nconcept: OpenTag uses `INTELLIGENCE_CHANNEL_NAME`, the Channels SDK README's\nquickstart calls it `CHANNEL_CODE`, and it is also referred to as the Channel's\n**slug**. All of them mean the `name` passed to `createChannel()`, which must\nmatch the Channel in the dashboard character for character. Read the app's\nparser; do not guess which word this codebase uses.\n\n```bash\ncat .env.example\ngrep -rn \"process.env\" app\u002Fenv.ts server.ts 2>\u002Fdev\u002Fnull\ngrep -n \"onMention\\|onMessage\\|onCommand\\|createChannel(\" app\u002Fchannel.tsx\n```\n\nRecord, and state back to the developer: the exact env var names, the Channel\nname the code will declare, and which handlers are registered.\n\n**Know what the managed adapter does not deliver.** The generated manifest\ndeclares **no `slash_commands`**, so slash commands never arrive. It does enable\n`interactivity`, and the managed ingress handles `block_actions` — so **HITL\nbuttons and selects do fire**. What it does not handle is `view_submission`, so\n**modals do not**. As shipped, a managed Slack Channel receives mentions,\nmessages, reactions, and interactive component clicks — not slash commands and\nnot modal submissions. An app registering `onCommand` or `onModalSubmit` will\ncompile, start, report `online`, and never fire those handlers on the managed\npath. OpenTag registers `onModalSubmit` and ships four commands; none of those\nwork here, though its buttons do. Say this up front rather than letting the\ndeveloper debug it, and do **not** invent a Request URL for commands to fill the\ngap.\n\nThat last one decides what \"working\" even looks like. Turn routing is not\nsymmetric: a **mentioned** turn goes to `onMention` if registered and otherwise\nfalls back to `onMessage`, while a **non-mentioned** turn goes only to\n`onMessage`. So an app registering just `onMention` — which is what OpenTag does\n— answers channel mentions, and may silently do nothing for any turn Intelligence\ndoes not flag as a mention. **Verify with a channel mention first**; it is the\npath every starter registers. Details in `references\u002Ftroubleshooting.md`.\n\nConfirm before continuing: production Intelligence, a dedicated Slack app, and a\nworkspace where they can install it.\n\n## Phase 1 — Workspace, and start the Channel wizard to get the manifest\n\n**The Channel comes first, because the Channel generates the Slack app's\nmanifest.** Do not hand-write one, and do not use the starter's\n`slack-app-manifest.yaml` — see the prohibition below.\n\n1. No usable workspace → create a free one, or a Slack Developer Program sandbox.\n   Never test in a workspace where an unapproved bot would be disruptive.\n2. In the Intelligence dashboard, start **Create a channel**. Enter a **Display\n   name**; the wizard derives the **Code** from it — lowercase kebab-case, and the\n   Code is what `createChannel({ name })` must declare. Select **Slack**.\n3. Advance to **Setup**. That step contains a generated manifest (\"Copy manifest\" \u002F\n   \"View manifest YAML\") already pointed at the right Request URL, plus the two\n   credential fields you will fill in Phase 3. **Nothing is saved until you\n   finish**, so leave this tab open.\n\nRead the wizard's own warning before you install anything: _Slack bot names and\nslash commands are workspace-wide. If either generated name is already in use,\nchoose a more specific Channel display name before installing._ A collision here\nblocks the install, so resolve it by renaming the Channel, not the manifest.\n\nFull detail in `references\u002Fintelligence-channel.md`.\n\n## Phase 2 — Create and install the Slack app from that manifest\n\nFull detail in `references\u002Fslack-workspace-and-app.md`. The shape:\n\n1. Create a **new** app **from the manifest the wizard generated**. Change the\n   display name so it is obviously a dev app.\n2. Install it. **Installing is the gated step** — by default only Workspace Owners\n   review app requests, and they may appoint app managers to do so too. Creating\n   the app is normally not gated, so create it while any install request is\n   pending rather than waiting.\n3. Collect two values: the `xoxb-` **bot token** (OAuth & Permissions) and the\n   **signing secret** (Basic Information → App Credentials). They go to\n   Intelligence — never into this repo. There is **no `xapp-` token** in this\n   workflow.\n4. Invite the bot to a test channel: `\u002Finvite @YourBot`.\n\n## Phase 3 — Finish the Channel: adapter credentials and API key\n\nBack in the open wizard tab. Browser work, in the developer's own session. Four\nthings must line up: Channel Code matches what the code declares, the Slack\nadapter reports connected, Channel and API key in the **same project**, endpoints\nleft at their production defaults.\n\nThe developer types the bot token and signing secret into the **Setup** step\nthemselves, then Review → create. Then issue a project-scoped API key and have\nthem paste it into `.env`.\n\nBecause these are consequential mutations in a live dashboard: **read the page\nbefore you act, describe what you are about to change, and get explicit\nconfirmation.** Never guess at a control and click it.\n\n## Phase 4 — Configure and start the runtime\n\nFull detail in `references\u002Flocal-runtime.md`.\n\nThe developer puts `INTELLIGENCE_API_KEY` into `.env` themselves. Verify by\npresence, never by printing. Then start the agent backend, then the runtime — and\nstart it with logs turned up, because the runtime's logger defaults to `error`\nwhile every Channel lifecycle breadcrumb is emitted at `warn`:\n\n```bash\nLOG_LEVEL=debug pnpm runtime\n```\n\n`channel \"\u003Cname>\" requires setup` in that output means Phase 2 is incomplete. It\nis the single highest-value line in this entire workflow, and at the default log\nlevel it is written and discarded.\n\n## Phase 5 — Verify, in order\n\n1. `controls.status()` → `overall: \"online\"`. If the app does not already assert\n   this, add the assertion — `examples\u002FOpenTag`'s `server.ts` calls `ready()` and\n   never checks status, which is exactly how a broken setup looks healthy.\n2. The dashboard shows the Channel Online while the process runs. Its **Runtime**\n   panel should read _Connected_. Ignore the **Agent run** column — it reads `—`\n   even after a turn completes successfully, so it is not a health signal.\n3. **The developer** sends a real mention from their own Slack account and reports\n   the reply.\n\nStep 3 is theirs. Do not post to Slack on their behalf, and do not substitute\nreading the workspace with a Slack tool for a genuine round trip. If a mention\nproduces nothing, go to `references\u002Ftroubleshooting.md` — diagnose by layer, do\nnot start changing configuration.\n\n## Phase 6 — Optional live E2E\n\nOnly after a real mention works. `references\u002Foptional-e2e.md`. This is the one\nplace Slack tokens legitimately enter `.env`, because the harness drives the\nSlack API directly as a test client.\n\n## Never do these\n\n**Never switch to a direct Slack adapter to get unblocked.** It moves platform\ncredentials into the app, abandons managed delivery's retries\u002Fdedup\u002Fordering,\nstill requires an Intelligence key, and means you validated a different\narchitecture than the one the developer asked about. If the managed path is\nblocked, say it is blocked and say why.\n\n**Never create the Slack app from the starter's own `slack-app-manifest.yaml`.**\nOpenTag's manifest sets `socket_mode_enabled: true` and declares **no\n`request_url`**, which is the shape for a _direct_ adapter, not a managed Channel.\nAn app created from it installs cleanly, shows green in Slack, and delivers\nnothing to Intelligence forever. Use the manifest the Channel wizard generates.\nThe same applies to `assets\u002Fslack-app-manifest.yaml` in this skill — it is kept\nonly as a reference for the direct-adapter shape.\n\n**Never reuse a production or shared Slack app.** One Slack app has exactly one\nevent-subscription Request URL. Pointing an existing app at your Channel's URL\n**redirects that app's entire event stream away from whatever was serving it** —\nyou do not observe production traffic, you hijack it, and real users get answered\nby an in-progress agent on a laptop. Slack offers no way to scope delivery to one\nchannel or one user. Pasting a manifest over an installed app also forces\nreinstallation and rotates its tokens, breaking every existing consumer.\n\n**Never ask for a secret in chat, and never print one.** Full ownership table and\nhandling rules in `references\u002Fsecrets-and-credentials.md`.\n\n**Never use the runtime API key to probe Intelligence HTTP endpoints.** It is a\nproject-scoped activation key, not a dashboard session; dashboard endpoints\nreject it, and a response body could carry platform tokens.\n\n**Never mutate the environment to make progress feel faster.** No `pnpm install`,\nno killing processes you did not start, no editing `.env` for the developer,\nwithout naming the change and getting a yes.\n\n## Rationalizations\n\n| Thought                                                                     | Reality                                                                                                                                                        |\n| --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| \"They're on a deadline, the direct adapter is faster\"                       | You would be validating a different architecture and handing them credentials in the wrong place. Deadline pressure is when scope discipline matters most.     |\n| \"The dashboard is confusing, code is more reliable\"                         | The confusion is the developer's actual problem. Solving it in code hides it.                                                                                  |\n| \"The prod Slack app is already installed, so reusing it saves the approval\" | Repointing its Request URL hijacks that app's whole event stream. The approval exists because installs affect other people.                                    |\n| \"It's just for testing \u002F just for a minute\"                                 | An app has one events URL. While yours is set, production is not receiving its events at all.                                                                  |\n| \"The starter ships a manifest, so I'll create the app from that\"            | It sets `socket_mode_enabled: true` with no `request_url` — the direct-adapter shape. The app will install green and never deliver. Use the wizard's manifest. |\n| \"I need to generate an `xapp-` app-level token\"                             | There is no `xapp-` token in this workflow and nowhere to put one. The adapter takes a bot token and a signing secret.                                         |\n| \"The runtime started and `\u002Finfo` returns 200, so we're connected\"           | `ready()` resolves on `setup_required` and `\u002Finfo` reports license state. Neither says anything about Slack.                                                   |\n| \"`ready()` resolved without throwing, so the Channel is online\"             | It resolves on `setup_required` by design. Read `status()`.                                                                                                    |\n| \"I'll check the Channel state with the API key\"                             | Dashboard endpoints reject a project key. Use `status()` or the dashboard.                                                                                     |\n| \"Let me just read `.env` to see what's configured\"                          | Read `.env.example` for names; check `.env` only for presence, and never quote a value.                                                                        |\n| \"I'll send the test mention myself to save a round trip\"                    | The success criterion is a real human mention. Posting for them proves less and acts on their behalf in their workspace.                                       |\n| \"No reply — let me try changing the config\"                                 | Diagnose by layer first. `LOG_LEVEL=debug` names the failure in one line.                                                                                      |\n\n## Red flags — stop\n\n- You are about to type `adapters: [slack(` or add `SLACK_BOT_TOKEN` to `.env`\n  for anything other than the Phase 6 harness.\n- You are about to create the Slack app from the starter's manifest, or from any\n  manifest with `socket_mode_enabled: true` and no `request_url`.\n- You are about to look for an app-level token, `connections:write`, or a Socket\n  Mode toggle. None of them belong to a managed Channel.\n- You are about to open or screenshot the app's **Install App** page. It renders\n  the bot token in plain text; reading it captures a live credential.\n- You are about to say \"connected\", \"working\", or \"done\" without all three gates.\n- You are about to ask the developer to paste a token, or you are about to echo one.\n- You are about to click a dashboard control you have not read.\n- You are about to `pnpm install`, kill a process, or edit `.env` unasked.\n- You have spent many tool calls deriving how managed Channels work. Stop — it is\n  in this skill and its references.\n\n## References\n\nRead the reference for the phase you are actually in — not all of them up front.\nEach is self-contained, and reading six files before saying anything to the\ndeveloper is how this workflow gets slow.\n\n| File                                    | Read it when                                                              |\n| --------------------------------------- | ------------------------------------------------------------------------- |\n| `references\u002Fintelligence-channel.md`    | Phases 1 and 3 — wizard, Code, adapter, project, key                      |\n| `references\u002Fslack-workspace-and-app.md` | Phase 2 — workspace, install, bot token, signing secret                   |\n| `references\u002Fsecrets-and-credentials.md` | Any time a credential is in play                                          |\n| `references\u002Flocal-runtime.md`           | Phase 4 — env, agent, runtime, startup, ports                             |\n| `references\u002Foptional-e2e.md`            | Phase 6 — the live Slack harness                                          |\n| `references\u002Ftroubleshooting.md`         | Anything fails, or a mention gets no reply                                |\n| `assets\u002Fslack-app-manifest.yaml`        | Reference only — the **direct-adapter** shape. Not for a managed Channel. |\n",{"data":54,"body":56},{"name":4,"description":6,"version":55},"1.0.0",{"type":57,"children":58},"root",[59,68,82,201,208,213,314,319,376,402,444,450,462,510,560,588,594,604,612,657,663,680,690,710,715,838,843,901,1002,1007,1104,1168,1173,1179,1196,1262,1274,1286,1292,1304,1386,1392,1404,1421,1433,1439,1450,1485,1521,1532,1538,1625,1637,1643,1663,1669,1679,1730,1747,1764,1774,1799,1805,2094,2100,2213,2219,2224,2365],{"type":60,"tag":61,"props":62,"children":64},"element","h1",{"id":63},"set-up-a-slack-channel-for-a-local-channels-agent",[65],{"type":66,"value":67},"text","Set up a Slack Channel for a local Channels agent",{"type":60,"tag":69,"props":70,"children":71},"p",{},[72,74,80],{"type":66,"value":73},"Take a developer from a code checkout to a working local Slack agent. ",{"type":60,"tag":75,"props":76,"children":77},"strong",{},[78],{"type":66,"value":79},"Five\nseparate systems",{"type":66,"value":81}," have to line up, and they are owned by four different parties:",{"type":60,"tag":83,"props":84,"children":85},"table",{},[86,110],{"type":60,"tag":87,"props":88,"children":89},"thead",{},[90],{"type":60,"tag":91,"props":92,"children":93},"tr",{},[94,100,105],{"type":60,"tag":95,"props":96,"children":97},"th",{},[98],{"type":66,"value":99},"System",{"type":60,"tag":95,"props":101,"children":102},{},[103],{"type":66,"value":104},"Who owns it",{"type":60,"tag":95,"props":106,"children":107},{},[108],{"type":66,"value":109},"Where you work on it",{"type":60,"tag":111,"props":112,"children":113},"tbody",{},[114,133,151,168,185],{"type":60,"tag":91,"props":115,"children":116},{},[117,123,128],{"type":60,"tag":118,"props":119,"children":120},"td",{},[121],{"type":66,"value":122},"Slack workspace",{"type":60,"tag":118,"props":124,"children":125},{},[126],{"type":66,"value":127},"Workspace owner \u002F app manager",{"type":60,"tag":118,"props":129,"children":130},{},[131],{"type":66,"value":132},"Slack, in a browser",{"type":60,"tag":91,"props":134,"children":135},{},[136,141,146],{"type":60,"tag":118,"props":137,"children":138},{},[139],{"type":66,"value":140},"Slack app + its tokens",{"type":60,"tag":118,"props":142,"children":143},{},[144],{"type":66,"value":145},"The developer",{"type":60,"tag":118,"props":147,"children":148},{},[149],{"type":66,"value":150},"api.slack.com, in a browser",{"type":60,"tag":91,"props":152,"children":153},{},[154,159,163],{"type":60,"tag":118,"props":155,"children":156},{},[157],{"type":66,"value":158},"Intelligence project, API key, Channel, Slack adapter",{"type":60,"tag":118,"props":160,"children":161},{},[162],{"type":66,"value":145},{"type":60,"tag":118,"props":164,"children":165},{},[166],{"type":66,"value":167},"The Intelligence dashboard, in a browser",{"type":60,"tag":91,"props":169,"children":170},{},[171,176,180],{"type":60,"tag":118,"props":172,"children":173},{},[174],{"type":66,"value":175},"Local Channels runtime",{"type":60,"tag":118,"props":177,"children":178},{},[179],{"type":66,"value":145},{"type":60,"tag":118,"props":181,"children":182},{},[183],{"type":66,"value":184},"This repo, in the shell",{"type":60,"tag":91,"props":186,"children":187},{},[188,193,197],{"type":60,"tag":118,"props":189,"children":190},{},[191],{"type":66,"value":192},"AG-UI agent backend",{"type":60,"tag":118,"props":194,"children":195},{},[196],{"type":66,"value":145},{"type":60,"tag":118,"props":198,"children":199},{},[200],{"type":66,"value":184},{"type":60,"tag":202,"props":203,"children":205},"h2",{"id":204},"how-delivery-actually-works-two-legs-two-mechanisms",[206],{"type":66,"value":207},"How delivery actually works — two legs, two mechanisms",{"type":60,"tag":69,"props":209,"children":210},{},[211],{"type":66,"value":212},"Getting this wrong is the most expensive mistake available here, because a\nmisconfigured Slack app installs cleanly and answers nothing.",{"type":60,"tag":83,"props":214,"children":215},{},[216,237],{"type":60,"tag":87,"props":217,"children":218},{},[219],{"type":60,"tag":91,"props":220,"children":221},{},[222,227,232],{"type":60,"tag":95,"props":223,"children":224},{},[225],{"type":66,"value":226},"Leg",{"type":60,"tag":95,"props":228,"children":229},{},[230],{"type":66,"value":231},"Mechanism",{"type":60,"tag":95,"props":233,"children":234},{},[235],{"type":66,"value":236},"What authenticates it",{"type":60,"tag":111,"props":238,"children":239},{},[240,282],{"type":60,"tag":91,"props":241,"children":242},{},[243,251,270],{"type":60,"tag":118,"props":244,"children":245},{},[246],{"type":60,"tag":75,"props":247,"children":248},{},[249],{"type":66,"value":250},"Slack → Intelligence",{"type":60,"tag":118,"props":252,"children":253},{},[254,256,261,263],{"type":66,"value":255},"Slack posts events over ",{"type":60,"tag":75,"props":257,"children":258},{},[259],{"type":66,"value":260},"HTTPS",{"type":66,"value":262}," to an Intelligence-hosted Request URL: ",{"type":60,"tag":264,"props":265,"children":267},"code",{"className":266},[],[268],{"type":66,"value":269},"https:\u002F\u002Fintelligence.copilotkit.ai\u002Fapi\u002Fchannels\u002Fadapters\u002Fslack\u002Fevents",{"type":60,"tag":118,"props":271,"children":272},{},[273,275,280],{"type":66,"value":274},"The app's ",{"type":60,"tag":75,"props":276,"children":277},{},[278],{"type":66,"value":279},"signing secret",{"type":66,"value":281},", held by Intelligence",{"type":60,"tag":91,"props":283,"children":284},{},[285,293,305],{"type":60,"tag":118,"props":286,"children":287},{},[288],{"type":60,"tag":75,"props":289,"children":290},{},[291],{"type":66,"value":292},"Intelligence → your runtime",{"type":60,"tag":118,"props":294,"children":295},{},[296,298,303],{"type":66,"value":297},"Your runtime dials ",{"type":60,"tag":75,"props":299,"children":300},{},[301],{"type":66,"value":302},"out",{"type":66,"value":304}," to the realtime gateway over a websocket",{"type":60,"tag":118,"props":306,"children":307},{},[308],{"type":60,"tag":264,"props":309,"children":311},{"className":310},[],[312],{"type":66,"value":313},"INTELLIGENCE_API_KEY",{"type":60,"tag":69,"props":315,"children":316},{},[317],{"type":66,"value":318},"Two consequences:",{"type":60,"tag":320,"props":321,"children":322},"ul",{},[323,342],{"type":60,"tag":324,"props":325,"children":326},"li",{},[327,332,334,340],{"type":60,"tag":75,"props":328,"children":329},{},[330],{"type":66,"value":331},"No tunnel and no public URL of your own is needed",{"type":66,"value":333}," — but not because of Socket\nMode. It is because ",{"type":60,"tag":335,"props":336,"children":337},"em",{},[338],{"type":66,"value":339},"Intelligence",{"type":66,"value":341}," owns the public URL, and because the second\nleg is outbound from your machine.",{"type":60,"tag":324,"props":343,"children":344},{},[345,358,360,366,368,374],{"type":60,"tag":75,"props":346,"children":347},{},[348,350,356],{"type":66,"value":349},"Socket Mode is off, and there is no ",{"type":60,"tag":264,"props":351,"children":353},{"className":352},[],[354],{"type":66,"value":355},"xapp-",{"type":66,"value":357}," app-level token in this workflow at\nall.",{"type":66,"value":359}," A managed Slack app needs ",{"type":60,"tag":264,"props":361,"children":363},{"className":362},[],[364],{"type":66,"value":365},"socket_mode_enabled: false",{"type":66,"value":367}," and a\n",{"type":60,"tag":264,"props":369,"children":371},{"className":370},[],[372],{"type":66,"value":373},"request_url",{"type":66,"value":375},". If you create the app with Socket Mode on and no Request URL, no\nevent ever reaches Intelligence.",{"type":60,"tag":69,"props":377,"children":378},{},[379,381,386,388,394,396,400],{"type":66,"value":380},"The Slack adapter form in Intelligence therefore asks for exactly two values: the\n",{"type":60,"tag":75,"props":382,"children":383},{},[384],{"type":66,"value":385},"bot token",{"type":66,"value":387}," (",{"type":60,"tag":264,"props":389,"children":391},{"className":390},[],[392],{"type":66,"value":393},"xoxb-",{"type":66,"value":395},") and the ",{"type":60,"tag":75,"props":397,"children":398},{},[399],{"type":66,"value":279},{"type":66,"value":401},". Nothing else.",{"type":60,"tag":69,"props":403,"children":404},{},[405,407,412,414,419,421,427,429,434,436,442],{"type":66,"value":406},"Most of this workflow happens in a ",{"type":60,"tag":75,"props":408,"children":409},{},[410],{"type":66,"value":411},"browser",{"type":66,"value":413},", not a shell. ",{"type":60,"tag":75,"props":415,"children":416},{},[417],{"type":66,"value":418},"The supported path\nfor v1 is the Intelligence browser experience.",{"type":66,"value":420}," ",{"type":60,"tag":264,"props":422,"children":424},{"className":423},[],[425],{"type":66,"value":426},"copilotkit channels",{"type":66,"value":428}," does list\ncommands for Channel creation, adapter attach, and key issuance — ",{"type":60,"tag":75,"props":430,"children":431},{},[432],{"type":66,"value":433},"do not use\nthem here",{"type":66,"value":435},"; they are not hardened for this workflow yet. Never invent a command\nname to fill a gap, and if you are unsure whether a command covers something,\ncheck its ",{"type":60,"tag":264,"props":437,"children":439},{"className":438},[],[440],{"type":66,"value":441},"--help",{"type":66,"value":443}," rather than guessing.",{"type":60,"tag":202,"props":445,"children":447},{"id":446},"done-means-three-things-all-verified",[448],{"type":66,"value":449},"Done means three things, all verified",{"type":60,"tag":69,"props":451,"children":452},{},[453,455,460],{"type":66,"value":454},"Do not report success until ",{"type":60,"tag":75,"props":456,"children":457},{},[458],{"type":66,"value":459},"all three",{"type":66,"value":461}," hold. Any one alone is a false positive.",{"type":60,"tag":463,"props":464,"children":465},"ol",{},[466,476,500],{"type":60,"tag":324,"props":467,"children":468},{},[469,474],{"type":60,"tag":75,"props":470,"children":471},{},[472],{"type":66,"value":473},"The Slack app is installed",{"type":66,"value":475}," in a workspace, and the bot is a member of the\nchannel you will test in.",{"type":60,"tag":324,"props":477,"children":478},{},[479,490,492,498],{"type":60,"tag":75,"props":480,"children":481},{},[482,484],{"type":66,"value":483},"The managed Channel reports ",{"type":60,"tag":264,"props":485,"children":487},{"className":486},[],[488],{"type":66,"value":489},"online",{"type":66,"value":491}," — from ",{"type":60,"tag":264,"props":493,"children":495},{"className":494},[],[496],{"type":66,"value":497},"controls.status()",{"type":66,"value":499}," in the\nprocess, or Online in the dashboard. Not \"the runtime started.\"",{"type":60,"tag":324,"props":501,"children":502},{},[503,508],{"type":60,"tag":75,"props":504,"children":505},{},[506],{"type":66,"value":507},"A real human mention got a real reply",{"type":66,"value":509}," in Slack.",{"type":60,"tag":69,"props":511,"children":512},{},[513,515,521,523,529,531,536,538,544,546,551,553,558],{"type":66,"value":514},"Gate 2 is where agents fail. ",{"type":60,"tag":264,"props":516,"children":518},{"className":517},[],[519],{"type":66,"value":520},"await controls.ready()",{"type":66,"value":522}," resolves on\n",{"type":60,"tag":264,"props":524,"children":526},{"className":525},[],[527],{"type":66,"value":528},"setup_required",{"type":66,"value":530}," too — that state is documented as \"a valid degraded state, not\na failure.\" A runtime with ",{"type":60,"tag":75,"props":532,"children":533},{},[534],{"type":66,"value":535},"no Slack connection at all",{"type":66,"value":537}," starts cleanly, prints\nits listening line, returns HTTP 200 on ",{"type":60,"tag":264,"props":539,"children":541},{"className":540},[],[542],{"type":66,"value":543},"\u002Fapi\u002Fcopilotkit\u002Finfo",{"type":66,"value":545},", and answers\nnothing. ",{"type":60,"tag":264,"props":547,"children":549},{"className":548},[],[550],{"type":66,"value":543},{"type":66,"value":552}," reports license and runtime info, ",{"type":60,"tag":75,"props":554,"children":555},{},[556],{"type":66,"value":557},"not",{"type":66,"value":559}," channel\nstate, so a 200 there is not evidence of anything Slack-related.",{"type":60,"tag":69,"props":561,"children":562},{},[563,565,571,573,579,581,586],{"type":66,"value":564},"The SDK behaviors asserted here were verified against the currently published\n",{"type":60,"tag":264,"props":566,"children":568},{"className":567},[],[569],{"type":66,"value":570},"@copilotkit\u002Fchannels@0.6.0",{"type":66,"value":572}," and ",{"type":60,"tag":264,"props":574,"children":576},{"className":575},[],[577],{"type":66,"value":578},"@copilotkit\u002Fruntime@1.65.0",{"type":66,"value":580},". A starter may pin\nsomething older or newer, and this API is moving fast. If a claim here\ncontradicts what you observe, ",{"type":60,"tag":75,"props":582,"children":583},{},[584],{"type":66,"value":585},"trust the installed package",{"type":66,"value":587}," and re-read it —\ndo not argue with the runtime.",{"type":60,"tag":202,"props":589,"children":591},{"id":590},"scope-read-before-planning",[592],{"type":66,"value":593},"Scope — read before planning",{"type":60,"tag":69,"props":595,"children":596},{},[597,602],{"type":60,"tag":75,"props":598,"children":599},{},[600],{"type":66,"value":601},"In scope:",{"type":66,"value":603}," production CopilotKit Intelligence; a managed Channel; a dedicated\nSlack app created from a manifest; a local runtime and agent.",{"type":60,"tag":69,"props":605,"children":606},{},[607],{"type":60,"tag":75,"props":608,"children":609},{},[610],{"type":66,"value":611},"Out of scope in v1. These are hard limits, not defaults to weigh:",{"type":60,"tag":320,"props":613,"children":614},{},[615,632,642,647,652],{"type":60,"tag":324,"props":616,"children":617},{},[618,623,624,630],{"type":60,"tag":75,"props":619,"children":620},{},[621],{"type":66,"value":622},"Do not switch to a direct Slack adapter",{"type":66,"value":387},{"type":60,"tag":264,"props":625,"children":627},{"className":626},[],[628],{"type":66,"value":629},"adapters: [slack({ botToken, appToken })]",{"type":66,"value":631},"). Not as a fallback, not to save time, not because the dashboard\nis confusing. See the prohibitions below — this is the single most common way\nthis workflow goes wrong.",{"type":60,"tag":324,"props":633,"children":634},{},[635,640],{"type":60,"tag":75,"props":636,"children":637},{},[638],{"type":66,"value":639},"Do not reuse, reinstall, or modify a Slack app that is already installed and\nin use.",{"type":66,"value":641}," Create a dedicated one.",{"type":60,"tag":324,"props":643,"children":644},{},[645],{"type":66,"value":646},"Do not deploy anything (Railway or otherwise).",{"type":60,"tag":324,"props":648,"children":649},{},[650],{"type":66,"value":651},"Do not target internal or dev Intelligence environments.",{"type":60,"tag":324,"props":653,"children":654},{},[655],{"type":66,"value":656},"Do not enumerate the Slack workspace, search channels, or request scopes beyond\nthe manifest.",{"type":60,"tag":202,"props":658,"children":660},{"id":659},"phase-0-establish-the-route-and-the-contract",[661],{"type":66,"value":662},"Phase 0 — Establish the route and the contract",{"type":60,"tag":69,"props":664,"children":665},{},[666,671,673,678],{"type":60,"tag":75,"props":667,"children":668},{},[669],{"type":66,"value":670},"First, check whether Phases 1–2 are already done for you.",{"type":66,"value":672}," Some organizations\nrun a dedicated ",{"type":60,"tag":75,"props":674,"children":675},{},[676],{"type":66,"value":677},"dev bot",{"type":66,"value":679}," alongside their production one and hand developers a\nready-made environment file — the Slack app, the Channel, and the adapter already\nexist, and the dev bot comes online only while someone runs it locally.",{"type":60,"tag":69,"props":681,"children":682},{},[683,685],{"type":66,"value":684},"Ask: ",{"type":60,"tag":335,"props":686,"children":687},{},[688],{"type":66,"value":689},"is there an existing dev bot and a provided config for this, or am I\nsetting one up from scratch?",{"type":60,"tag":69,"props":691,"children":692},{},[693,695,700,702,708],{"type":66,"value":694},"If a config is provided, ",{"type":60,"tag":75,"props":696,"children":697},{},[698],{"type":66,"value":699},"skip Phases 1 and 2 entirely",{"type":66,"value":701},": put the provided\nvalues in ",{"type":60,"tag":264,"props":703,"children":705},{"className":704},[],[706],{"type":66,"value":707},".env",{"type":66,"value":709}," (the developer retrieves them from their team's secret-sharing\nchannel — never ask them to paste the contents here), install, and run. Do not\ncreate a new Slack app, and do not create a Channel. Phases 3–5 still apply, and\nthe three success gates are unchanged.",{"type":60,"tag":69,"props":711,"children":712},{},[713],{"type":66,"value":714},"Otherwise, pick the starter, in this order:",{"type":60,"tag":463,"props":716,"children":717},{},[718,744,804],{"type":60,"tag":324,"props":719,"children":720},{},[721,726,728,734,736,742],{"type":60,"tag":75,"props":722,"children":723},{},[724],{"type":66,"value":725},"An OpenTag checkout",{"type":66,"value":727}," — the developer's cwd is one, or they name one. This is\nthe most likely path. Detect it: a ",{"type":60,"tag":264,"props":729,"children":731},{"className":730},[],[732],{"type":66,"value":733},"slack-app-manifest.yaml",{"type":66,"value":735}," plus\n",{"type":60,"tag":264,"props":737,"children":739},{"className":738},[],[740],{"type":66,"value":741},"app\u002Fchannel.tsx",{"type":66,"value":743}," at the root.",{"type":60,"tag":324,"props":745,"children":746},{},[747,758,760],{"type":60,"tag":75,"props":748,"children":749},{},[750,756],{"type":60,"tag":264,"props":751,"children":753},{"className":752},[],[754],{"type":66,"value":755},"examples\u002FOpenTag",{"type":66,"value":757}," in this repo",{"type":66,"value":759},", if present. It is a submodule, so a plain\nclone leaves it empty:",{"type":60,"tag":761,"props":762,"children":767},"pre",{"className":763,"code":764,"language":765,"meta":766,"style":766},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git submodule update --init examples\u002FOpenTag\n","bash","",[768],{"type":60,"tag":264,"props":769,"children":770},{"__ignoreMap":766},[771],{"type":60,"tag":772,"props":773,"children":776},"span",{"class":774,"line":775},"line",1,[777,783,789,794,799],{"type":60,"tag":772,"props":778,"children":780},{"style":779},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[781],{"type":66,"value":782},"git",{"type":60,"tag":772,"props":784,"children":786},{"style":785},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[787],{"type":66,"value":788}," submodule",{"type":60,"tag":772,"props":790,"children":791},{"style":785},[792],{"type":66,"value":793}," update",{"type":60,"tag":772,"props":795,"children":796},{"style":785},[797],{"type":66,"value":798}," --init",{"type":60,"tag":772,"props":800,"children":801},{"style":785},[802],{"type":66,"value":803}," examples\u002FOpenTag\n",{"type":60,"tag":324,"props":805,"children":806},{},[807,812,814],{"type":60,"tag":75,"props":808,"children":809},{},[810],{"type":66,"value":811},"Neither",{"type":66,"value":813}," → have the developer clone it, and work from there:",{"type":60,"tag":761,"props":815,"children":817},{"className":763,"code":816,"language":765,"meta":766,"style":766},"git clone https:\u002F\u002Fgithub.com\u002FCopilotKit\u002FOpenTag.git\n",[818],{"type":60,"tag":264,"props":819,"children":820},{"__ignoreMap":766},[821],{"type":60,"tag":772,"props":822,"children":823},{"class":774,"line":775},[824,828,833],{"type":60,"tag":772,"props":825,"children":826},{"style":779},[827],{"type":66,"value":782},{"type":60,"tag":772,"props":829,"children":830},{"style":785},[831],{"type":66,"value":832}," clone",{"type":60,"tag":772,"props":834,"children":835},{"style":785},[836],{"type":66,"value":837}," https:\u002F\u002Fgithub.com\u002FCopilotKit\u002FOpenTag.git\n",{"type":60,"tag":69,"props":839,"children":840},{},[841],{"type":66,"value":842},"Whichever you land on, treat that checkout as the source of truth. Do not carry\nfacts between checkouts — versions, env var names, and registered handlers differ\nbetween OpenTag revisions, which is why the next step reads them rather than\nassuming them.",{"type":60,"tag":69,"props":844,"children":845},{},[846,848,853,855,860,862,868,870,876,878,883,885,891,893,899],{"type":66,"value":847},"Then read the app's ",{"type":60,"tag":75,"props":849,"children":850},{},[851],{"type":66,"value":852},"own",{"type":66,"value":854}," environment contract instead of assuming variable\nnames. They differ between apps, and so does the vocabulary for the ",{"type":60,"tag":335,"props":856,"children":857},{},[858],{"type":66,"value":859},"same",{"type":66,"value":861},"\nconcept: OpenTag uses ",{"type":60,"tag":264,"props":863,"children":865},{"className":864},[],[866],{"type":66,"value":867},"INTELLIGENCE_CHANNEL_NAME",{"type":66,"value":869},", the Channels SDK README's\nquickstart calls it ",{"type":60,"tag":264,"props":871,"children":873},{"className":872},[],[874],{"type":66,"value":875},"CHANNEL_CODE",{"type":66,"value":877},", and it is also referred to as the Channel's\n",{"type":60,"tag":75,"props":879,"children":880},{},[881],{"type":66,"value":882},"slug",{"type":66,"value":884},". All of them mean the ",{"type":60,"tag":264,"props":886,"children":888},{"className":887},[],[889],{"type":66,"value":890},"name",{"type":66,"value":892}," passed to ",{"type":60,"tag":264,"props":894,"children":896},{"className":895},[],[897],{"type":66,"value":898},"createChannel()",{"type":66,"value":900},", which must\nmatch the Channel in the dashboard character for character. Read the app's\nparser; do not guess which word this codebase uses.",{"type":60,"tag":761,"props":902,"children":904},{"className":763,"code":903,"language":765,"meta":766,"style":766},"cat .env.example\ngrep -rn \"process.env\" app\u002Fenv.ts server.ts 2>\u002Fdev\u002Fnull\ngrep -n \"onMention\\|onMessage\\|onCommand\\|createChannel(\" app\u002Fchannel.tsx\n",[905],{"type":60,"tag":264,"props":906,"children":907},{"__ignoreMap":766},[908,921,971],{"type":60,"tag":772,"props":909,"children":910},{"class":774,"line":775},[911,916],{"type":60,"tag":772,"props":912,"children":913},{"style":779},[914],{"type":66,"value":915},"cat",{"type":60,"tag":772,"props":917,"children":918},{"style":785},[919],{"type":66,"value":920}," .env.example\n",{"type":60,"tag":772,"props":922,"children":924},{"class":774,"line":923},2,[925,930,935,941,946,951,956,961,966],{"type":60,"tag":772,"props":926,"children":927},{"style":779},[928],{"type":66,"value":929},"grep",{"type":60,"tag":772,"props":931,"children":932},{"style":785},[933],{"type":66,"value":934}," -rn",{"type":60,"tag":772,"props":936,"children":938},{"style":937},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[939],{"type":66,"value":940}," \"",{"type":60,"tag":772,"props":942,"children":943},{"style":785},[944],{"type":66,"value":945},"process.env",{"type":60,"tag":772,"props":947,"children":948},{"style":937},[949],{"type":66,"value":950},"\"",{"type":60,"tag":772,"props":952,"children":953},{"style":785},[954],{"type":66,"value":955}," app\u002Fenv.ts",{"type":60,"tag":772,"props":957,"children":958},{"style":785},[959],{"type":66,"value":960}," server.ts",{"type":60,"tag":772,"props":962,"children":963},{"style":937},[964],{"type":66,"value":965}," 2>",{"type":60,"tag":772,"props":967,"children":968},{"style":785},[969],{"type":66,"value":970},"\u002Fdev\u002Fnull\n",{"type":60,"tag":772,"props":972,"children":974},{"class":774,"line":973},3,[975,979,984,988,993,997],{"type":60,"tag":772,"props":976,"children":977},{"style":779},[978],{"type":66,"value":929},{"type":60,"tag":772,"props":980,"children":981},{"style":785},[982],{"type":66,"value":983}," -n",{"type":60,"tag":772,"props":985,"children":986},{"style":937},[987],{"type":66,"value":940},{"type":60,"tag":772,"props":989,"children":990},{"style":785},[991],{"type":66,"value":992},"onMention\\|onMessage\\|onCommand\\|createChannel(",{"type":60,"tag":772,"props":994,"children":995},{"style":937},[996],{"type":66,"value":950},{"type":60,"tag":772,"props":998,"children":999},{"style":785},[1000],{"type":66,"value":1001}," app\u002Fchannel.tsx\n",{"type":60,"tag":69,"props":1003,"children":1004},{},[1005],{"type":66,"value":1006},"Record, and state back to the developer: the exact env var names, the Channel\nname the code will declare, and which handlers are registered.",{"type":60,"tag":69,"props":1008,"children":1009},{},[1010,1015,1017,1028,1030,1036,1038,1044,1046,1051,1053,1059,1061,1066,1068,1074,1076,1082,1084,1089,1091,1096,1098,1102],{"type":60,"tag":75,"props":1011,"children":1012},{},[1013],{"type":66,"value":1014},"Know what the managed adapter does not deliver.",{"type":66,"value":1016}," The generated manifest\ndeclares ",{"type":60,"tag":75,"props":1018,"children":1019},{},[1020,1022],{"type":66,"value":1021},"no ",{"type":60,"tag":264,"props":1023,"children":1025},{"className":1024},[],[1026],{"type":66,"value":1027},"slash_commands",{"type":66,"value":1029},", so slash commands never arrive. It does enable\n",{"type":60,"tag":264,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":66,"value":1035},"interactivity",{"type":66,"value":1037},", and the managed ingress handles ",{"type":60,"tag":264,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":66,"value":1043},"block_actions",{"type":66,"value":1045}," — so ",{"type":60,"tag":75,"props":1047,"children":1048},{},[1049],{"type":66,"value":1050},"HITL\nbuttons and selects do fire",{"type":66,"value":1052},". What it does not handle is ",{"type":60,"tag":264,"props":1054,"children":1056},{"className":1055},[],[1057],{"type":66,"value":1058},"view_submission",{"type":66,"value":1060},", so\n",{"type":60,"tag":75,"props":1062,"children":1063},{},[1064],{"type":66,"value":1065},"modals do not",{"type":66,"value":1067},". As shipped, a managed Slack Channel receives mentions,\nmessages, reactions, and interactive component clicks — not slash commands and\nnot modal submissions. An app registering ",{"type":60,"tag":264,"props":1069,"children":1071},{"className":1070},[],[1072],{"type":66,"value":1073},"onCommand",{"type":66,"value":1075}," or ",{"type":60,"tag":264,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":66,"value":1081},"onModalSubmit",{"type":66,"value":1083}," will\ncompile, start, report ",{"type":60,"tag":264,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":66,"value":489},{"type":66,"value":1090},", and never fire those handlers on the managed\npath. OpenTag registers ",{"type":60,"tag":264,"props":1092,"children":1094},{"className":1093},[],[1095],{"type":66,"value":1081},{"type":66,"value":1097}," and ships four commands; none of those\nwork here, though its buttons do. Say this up front rather than letting the\ndeveloper debug it, and do ",{"type":60,"tag":75,"props":1099,"children":1100},{},[1101],{"type":66,"value":557},{"type":66,"value":1103}," invent a Request URL for commands to fill the\ngap.",{"type":60,"tag":69,"props":1105,"children":1106},{},[1107,1109,1114,1116,1122,1124,1130,1132,1137,1139,1144,1146,1151,1153,1158,1160,1166],{"type":66,"value":1108},"That last one decides what \"working\" even looks like. Turn routing is not\nsymmetric: a ",{"type":60,"tag":75,"props":1110,"children":1111},{},[1112],{"type":66,"value":1113},"mentioned",{"type":66,"value":1115}," turn goes to ",{"type":60,"tag":264,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":66,"value":1121},"onMention",{"type":66,"value":1123}," if registered and otherwise\nfalls back to ",{"type":60,"tag":264,"props":1125,"children":1127},{"className":1126},[],[1128],{"type":66,"value":1129},"onMessage",{"type":66,"value":1131},", while a ",{"type":60,"tag":75,"props":1133,"children":1134},{},[1135],{"type":66,"value":1136},"non-mentioned",{"type":66,"value":1138}," turn goes only to\n",{"type":60,"tag":264,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":66,"value":1129},{"type":66,"value":1145},". So an app registering just ",{"type":60,"tag":264,"props":1147,"children":1149},{"className":1148},[],[1150],{"type":66,"value":1121},{"type":66,"value":1152}," — which is what OpenTag does\n— answers channel mentions, and may silently do nothing for any turn Intelligence\ndoes not flag as a mention. ",{"type":60,"tag":75,"props":1154,"children":1155},{},[1156],{"type":66,"value":1157},"Verify with a channel mention first",{"type":66,"value":1159},"; it is the\npath every starter registers. Details in ",{"type":60,"tag":264,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":66,"value":1165},"references\u002Ftroubleshooting.md",{"type":66,"value":1167},".",{"type":60,"tag":69,"props":1169,"children":1170},{},[1171],{"type":66,"value":1172},"Confirm before continuing: production Intelligence, a dedicated Slack app, and a\nworkspace where they can install it.",{"type":60,"tag":202,"props":1174,"children":1176},{"id":1175},"phase-1-workspace-and-start-the-channel-wizard-to-get-the-manifest",[1177],{"type":66,"value":1178},"Phase 1 — Workspace, and start the Channel wizard to get the manifest",{"type":60,"tag":69,"props":1180,"children":1181},{},[1182,1187,1189,1194],{"type":60,"tag":75,"props":1183,"children":1184},{},[1185],{"type":66,"value":1186},"The Channel comes first, because the Channel generates the Slack app's\nmanifest.",{"type":66,"value":1188}," Do not hand-write one, and do not use the starter's\n",{"type":60,"tag":264,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":66,"value":733},{"type":66,"value":1195}," — see the prohibition below.",{"type":60,"tag":463,"props":1197,"children":1198},{},[1199,1204,1243],{"type":60,"tag":324,"props":1200,"children":1201},{},[1202],{"type":66,"value":1203},"No usable workspace → create a free one, or a Slack Developer Program sandbox.\nNever test in a workspace where an unapproved bot would be disruptive.",{"type":60,"tag":324,"props":1205,"children":1206},{},[1207,1209,1214,1216,1221,1223,1228,1230,1236,1238,1242],{"type":66,"value":1208},"In the Intelligence dashboard, start ",{"type":60,"tag":75,"props":1210,"children":1211},{},[1212],{"type":66,"value":1213},"Create a channel",{"type":66,"value":1215},". Enter a ",{"type":60,"tag":75,"props":1217,"children":1218},{},[1219],{"type":66,"value":1220},"Display\nname",{"type":66,"value":1222},"; the wizard derives the ",{"type":60,"tag":75,"props":1224,"children":1225},{},[1226],{"type":66,"value":1227},"Code",{"type":66,"value":1229}," from it — lowercase kebab-case, and the\nCode is what ",{"type":60,"tag":264,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":66,"value":1235},"createChannel({ name })",{"type":66,"value":1237}," must declare. Select ",{"type":60,"tag":75,"props":1239,"children":1240},{},[1241],{"type":66,"value":18},{"type":66,"value":1167},{"type":60,"tag":324,"props":1244,"children":1245},{},[1246,1248,1253,1255,1260],{"type":66,"value":1247},"Advance to ",{"type":60,"tag":75,"props":1249,"children":1250},{},[1251],{"type":66,"value":1252},"Setup",{"type":66,"value":1254},". That step contains a generated manifest (\"Copy manifest\" \u002F\n\"View manifest YAML\") already pointed at the right Request URL, plus the two\ncredential fields you will fill in Phase 3. ",{"type":60,"tag":75,"props":1256,"children":1257},{},[1258],{"type":66,"value":1259},"Nothing is saved until you\nfinish",{"type":66,"value":1261},", so leave this tab open.",{"type":60,"tag":69,"props":1263,"children":1264},{},[1265,1267,1272],{"type":66,"value":1266},"Read the wizard's own warning before you install anything: ",{"type":60,"tag":335,"props":1268,"children":1269},{},[1270],{"type":66,"value":1271},"Slack bot names and\nslash commands are workspace-wide. If either generated name is already in use,\nchoose a more specific Channel display name before installing.",{"type":66,"value":1273}," A collision here\nblocks the install, so resolve it by renaming the Channel, not the manifest.",{"type":60,"tag":69,"props":1275,"children":1276},{},[1277,1279,1285],{"type":66,"value":1278},"Full detail in ",{"type":60,"tag":264,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":66,"value":1284},"references\u002Fintelligence-channel.md",{"type":66,"value":1167},{"type":60,"tag":202,"props":1287,"children":1289},{"id":1288},"phase-2-create-and-install-the-slack-app-from-that-manifest",[1290],{"type":66,"value":1291},"Phase 2 — Create and install the Slack app from that manifest",{"type":60,"tag":69,"props":1293,"children":1294},{},[1295,1296,1302],{"type":66,"value":1278},{"type":60,"tag":264,"props":1297,"children":1299},{"className":1298},[],[1300],{"type":66,"value":1301},"references\u002Fslack-workspace-and-app.md",{"type":66,"value":1303},". The shape:",{"type":60,"tag":463,"props":1305,"children":1306},{},[1307,1326,1338,1374],{"type":60,"tag":324,"props":1308,"children":1309},{},[1310,1312,1317,1319,1324],{"type":66,"value":1311},"Create a ",{"type":60,"tag":75,"props":1313,"children":1314},{},[1315],{"type":66,"value":1316},"new",{"type":66,"value":1318}," app ",{"type":60,"tag":75,"props":1320,"children":1321},{},[1322],{"type":66,"value":1323},"from the manifest the wizard generated",{"type":66,"value":1325},". Change the\ndisplay name so it is obviously a dev app.",{"type":60,"tag":324,"props":1327,"children":1328},{},[1329,1331,1336],{"type":66,"value":1330},"Install it. ",{"type":60,"tag":75,"props":1332,"children":1333},{},[1334],{"type":66,"value":1335},"Installing is the gated step",{"type":66,"value":1337}," — by default only Workspace Owners\nreview app requests, and they may appoint app managers to do so too. Creating\nthe app is normally not gated, so create it while any install request is\npending rather than waiting.",{"type":60,"tag":324,"props":1339,"children":1340},{},[1341,1343,1348,1349,1353,1355,1359,1361,1372],{"type":66,"value":1342},"Collect two values: the ",{"type":60,"tag":264,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":66,"value":393},{"type":66,"value":420},{"type":60,"tag":75,"props":1350,"children":1351},{},[1352],{"type":66,"value":385},{"type":66,"value":1354}," (OAuth & Permissions) and the\n",{"type":60,"tag":75,"props":1356,"children":1357},{},[1358],{"type":66,"value":279},{"type":66,"value":1360}," (Basic Information → App Credentials). They go to\nIntelligence — never into this repo. There is ",{"type":60,"tag":75,"props":1362,"children":1363},{},[1364,1365,1370],{"type":66,"value":1021},{"type":60,"tag":264,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":66,"value":355},{"type":66,"value":1371}," token",{"type":66,"value":1373}," in this\nworkflow.",{"type":60,"tag":324,"props":1375,"children":1376},{},[1377,1379,1385],{"type":66,"value":1378},"Invite the bot to a test channel: ",{"type":60,"tag":264,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":66,"value":1384},"\u002Finvite @YourBot",{"type":66,"value":1167},{"type":60,"tag":202,"props":1387,"children":1389},{"id":1388},"phase-3-finish-the-channel-adapter-credentials-and-api-key",[1390],{"type":66,"value":1391},"Phase 3 — Finish the Channel: adapter credentials and API key",{"type":60,"tag":69,"props":1393,"children":1394},{},[1395,1397,1402],{"type":66,"value":1396},"Back in the open wizard tab. Browser work, in the developer's own session. Four\nthings must line up: Channel Code matches what the code declares, the Slack\nadapter reports connected, Channel and API key in the ",{"type":60,"tag":75,"props":1398,"children":1399},{},[1400],{"type":66,"value":1401},"same project",{"type":66,"value":1403},", endpoints\nleft at their production defaults.",{"type":60,"tag":69,"props":1405,"children":1406},{},[1407,1409,1413,1415,1420],{"type":66,"value":1408},"The developer types the bot token and signing secret into the ",{"type":60,"tag":75,"props":1410,"children":1411},{},[1412],{"type":66,"value":1252},{"type":66,"value":1414}," step\nthemselves, then Review → create. Then issue a project-scoped API key and have\nthem paste it into ",{"type":60,"tag":264,"props":1416,"children":1418},{"className":1417},[],[1419],{"type":66,"value":707},{"type":66,"value":1167},{"type":60,"tag":69,"props":1422,"children":1423},{},[1424,1426,1431],{"type":66,"value":1425},"Because these are consequential mutations in a live dashboard: ",{"type":60,"tag":75,"props":1427,"children":1428},{},[1429],{"type":66,"value":1430},"read the page\nbefore you act, describe what you are about to change, and get explicit\nconfirmation.",{"type":66,"value":1432}," Never guess at a control and click it.",{"type":60,"tag":202,"props":1434,"children":1436},{"id":1435},"phase-4-configure-and-start-the-runtime",[1437],{"type":66,"value":1438},"Phase 4 — Configure and start the runtime",{"type":60,"tag":69,"props":1440,"children":1441},{},[1442,1443,1449],{"type":66,"value":1278},{"type":60,"tag":264,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":66,"value":1448},"references\u002Flocal-runtime.md",{"type":66,"value":1167},{"type":60,"tag":69,"props":1451,"children":1452},{},[1453,1455,1460,1462,1467,1469,1475,1477,1483],{"type":66,"value":1454},"The developer puts ",{"type":60,"tag":264,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":66,"value":313},{"type":66,"value":1461}," into ",{"type":60,"tag":264,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":66,"value":707},{"type":66,"value":1468}," themselves. Verify by\npresence, never by printing. Then start the agent backend, then the runtime — and\nstart it with logs turned up, because the runtime's logger defaults to ",{"type":60,"tag":264,"props":1470,"children":1472},{"className":1471},[],[1473],{"type":66,"value":1474},"error",{"type":66,"value":1476},"\nwhile every Channel lifecycle breadcrumb is emitted at ",{"type":60,"tag":264,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":66,"value":1482},"warn",{"type":66,"value":1484},":",{"type":60,"tag":761,"props":1486,"children":1488},{"className":763,"code":1487,"language":765,"meta":766,"style":766},"LOG_LEVEL=debug pnpm runtime\n",[1489],{"type":60,"tag":264,"props":1490,"children":1491},{"__ignoreMap":766},[1492],{"type":60,"tag":772,"props":1493,"children":1494},{"class":774,"line":775},[1495,1501,1506,1511,1516],{"type":60,"tag":772,"props":1496,"children":1498},{"style":1497},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1499],{"type":66,"value":1500},"LOG_LEVEL",{"type":60,"tag":772,"props":1502,"children":1503},{"style":937},[1504],{"type":66,"value":1505},"=",{"type":60,"tag":772,"props":1507,"children":1508},{"style":785},[1509],{"type":66,"value":1510},"debug",{"type":60,"tag":772,"props":1512,"children":1513},{"style":779},[1514],{"type":66,"value":1515}," pnpm",{"type":60,"tag":772,"props":1517,"children":1518},{"style":785},[1519],{"type":66,"value":1520}," runtime\n",{"type":60,"tag":69,"props":1522,"children":1523},{},[1524,1530],{"type":60,"tag":264,"props":1525,"children":1527},{"className":1526},[],[1528],{"type":66,"value":1529},"channel \"\u003Cname>\" requires setup",{"type":66,"value":1531}," in that output means Phase 2 is incomplete. It\nis the single highest-value line in this entire workflow, and at the default log\nlevel it is written and discarded.",{"type":60,"tag":202,"props":1533,"children":1535},{"id":1534},"phase-5-verify-in-order",[1536],{"type":66,"value":1537},"Phase 5 — Verify, in order",{"type":60,"tag":463,"props":1539,"children":1540},{},[1541,1582,1616],{"type":60,"tag":324,"props":1542,"children":1543},{},[1544,1549,1551,1557,1559,1564,1566,1572,1574,1580],{"type":60,"tag":264,"props":1545,"children":1547},{"className":1546},[],[1548],{"type":66,"value":497},{"type":66,"value":1550}," → ",{"type":60,"tag":264,"props":1552,"children":1554},{"className":1553},[],[1555],{"type":66,"value":1556},"overall: \"online\"",{"type":66,"value":1558},". If the app does not already assert\nthis, add the assertion — ",{"type":60,"tag":264,"props":1560,"children":1562},{"className":1561},[],[1563],{"type":66,"value":755},{"type":66,"value":1565},"'s ",{"type":60,"tag":264,"props":1567,"children":1569},{"className":1568},[],[1570],{"type":66,"value":1571},"server.ts",{"type":66,"value":1573}," calls ",{"type":60,"tag":264,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":66,"value":1579},"ready()",{"type":66,"value":1581}," and\nnever checks status, which is exactly how a broken setup looks healthy.",{"type":60,"tag":324,"props":1583,"children":1584},{},[1585,1587,1592,1594,1599,1601,1606,1608,1614],{"type":66,"value":1586},"The dashboard shows the Channel Online while the process runs. Its ",{"type":60,"tag":75,"props":1588,"children":1589},{},[1590],{"type":66,"value":1591},"Runtime",{"type":66,"value":1593},"\npanel should read ",{"type":60,"tag":335,"props":1595,"children":1596},{},[1597],{"type":66,"value":1598},"Connected",{"type":66,"value":1600},". Ignore the ",{"type":60,"tag":75,"props":1602,"children":1603},{},[1604],{"type":66,"value":1605},"Agent run",{"type":66,"value":1607}," column — it reads ",{"type":60,"tag":264,"props":1609,"children":1611},{"className":1610},[],[1612],{"type":66,"value":1613},"—",{"type":66,"value":1615},"\neven after a turn completes successfully, so it is not a health signal.",{"type":60,"tag":324,"props":1617,"children":1618},{},[1619,1623],{"type":60,"tag":75,"props":1620,"children":1621},{},[1622],{"type":66,"value":145},{"type":66,"value":1624}," sends a real mention from their own Slack account and reports\nthe reply.",{"type":60,"tag":69,"props":1626,"children":1627},{},[1628,1630,1635],{"type":66,"value":1629},"Step 3 is theirs. Do not post to Slack on their behalf, and do not substitute\nreading the workspace with a Slack tool for a genuine round trip. If a mention\nproduces nothing, go to ",{"type":60,"tag":264,"props":1631,"children":1633},{"className":1632},[],[1634],{"type":66,"value":1165},{"type":66,"value":1636}," — diagnose by layer, do\nnot start changing configuration.",{"type":60,"tag":202,"props":1638,"children":1640},{"id":1639},"phase-6-optional-live-e2e",[1641],{"type":66,"value":1642},"Phase 6 — Optional live E2E",{"type":60,"tag":69,"props":1644,"children":1645},{},[1646,1648,1654,1656,1661],{"type":66,"value":1647},"Only after a real mention works. ",{"type":60,"tag":264,"props":1649,"children":1651},{"className":1650},[],[1652],{"type":66,"value":1653},"references\u002Foptional-e2e.md",{"type":66,"value":1655},". This is the one\nplace Slack tokens legitimately enter ",{"type":60,"tag":264,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":66,"value":707},{"type":66,"value":1662},", because the harness drives the\nSlack API directly as a test client.",{"type":60,"tag":202,"props":1664,"children":1666},{"id":1665},"never-do-these",[1667],{"type":66,"value":1668},"Never do these",{"type":60,"tag":69,"props":1670,"children":1671},{},[1672,1677],{"type":60,"tag":75,"props":1673,"children":1674},{},[1675],{"type":66,"value":1676},"Never switch to a direct Slack adapter to get unblocked.",{"type":66,"value":1678}," It moves platform\ncredentials into the app, abandons managed delivery's retries\u002Fdedup\u002Fordering,\nstill requires an Intelligence key, and means you validated a different\narchitecture than the one the developer asked about. If the managed path is\nblocked, say it is blocked and say why.",{"type":60,"tag":69,"props":1680,"children":1681},{},[1682,1693,1695,1701,1703,1713,1715,1720,1722,1728],{"type":60,"tag":75,"props":1683,"children":1684},{},[1685,1687,1692],{"type":66,"value":1686},"Never create the Slack app from the starter's own ",{"type":60,"tag":264,"props":1688,"children":1690},{"className":1689},[],[1691],{"type":66,"value":733},{"type":66,"value":1167},{"type":66,"value":1694},"\nOpenTag's manifest sets ",{"type":60,"tag":264,"props":1696,"children":1698},{"className":1697},[],[1699],{"type":66,"value":1700},"socket_mode_enabled: true",{"type":66,"value":1702}," and declares ",{"type":60,"tag":75,"props":1704,"children":1705},{},[1706,1708],{"type":66,"value":1707},"no\n",{"type":60,"tag":264,"props":1709,"children":1711},{"className":1710},[],[1712],{"type":66,"value":373},{"type":66,"value":1714},", which is the shape for a ",{"type":60,"tag":335,"props":1716,"children":1717},{},[1718],{"type":66,"value":1719},"direct",{"type":66,"value":1721}," adapter, not a managed Channel.\nAn app created from it installs cleanly, shows green in Slack, and delivers\nnothing to Intelligence forever. Use the manifest the Channel wizard generates.\nThe same applies to ",{"type":60,"tag":264,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":66,"value":1727},"assets\u002Fslack-app-manifest.yaml",{"type":66,"value":1729}," in this skill — it is kept\nonly as a reference for the direct-adapter shape.",{"type":60,"tag":69,"props":1731,"children":1732},{},[1733,1738,1740,1745],{"type":60,"tag":75,"props":1734,"children":1735},{},[1736],{"type":66,"value":1737},"Never reuse a production or shared Slack app.",{"type":66,"value":1739}," One Slack app has exactly one\nevent-subscription Request URL. Pointing an existing app at your Channel's URL\n",{"type":60,"tag":75,"props":1741,"children":1742},{},[1743],{"type":66,"value":1744},"redirects that app's entire event stream away from whatever was serving it",{"type":66,"value":1746}," —\nyou do not observe production traffic, you hijack it, and real users get answered\nby an in-progress agent on a laptop. Slack offers no way to scope delivery to one\nchannel or one user. Pasting a manifest over an installed app also forces\nreinstallation and rotates its tokens, breaking every existing consumer.",{"type":60,"tag":69,"props":1748,"children":1749},{},[1750,1755,1757,1763],{"type":60,"tag":75,"props":1751,"children":1752},{},[1753],{"type":66,"value":1754},"Never ask for a secret in chat, and never print one.",{"type":66,"value":1756}," Full ownership table and\nhandling rules in ",{"type":60,"tag":264,"props":1758,"children":1760},{"className":1759},[],[1761],{"type":66,"value":1762},"references\u002Fsecrets-and-credentials.md",{"type":66,"value":1167},{"type":60,"tag":69,"props":1765,"children":1766},{},[1767,1772],{"type":60,"tag":75,"props":1768,"children":1769},{},[1770],{"type":66,"value":1771},"Never use the runtime API key to probe Intelligence HTTP endpoints.",{"type":66,"value":1773}," It is a\nproject-scoped activation key, not a dashboard session; dashboard endpoints\nreject it, and a response body could carry platform tokens.",{"type":60,"tag":69,"props":1775,"children":1776},{},[1777,1782,1784,1790,1792,1797],{"type":60,"tag":75,"props":1778,"children":1779},{},[1780],{"type":66,"value":1781},"Never mutate the environment to make progress feel faster.",{"type":66,"value":1783}," No ",{"type":60,"tag":264,"props":1785,"children":1787},{"className":1786},[],[1788],{"type":66,"value":1789},"pnpm install",{"type":66,"value":1791},",\nno killing processes you did not start, no editing ",{"type":60,"tag":264,"props":1793,"children":1795},{"className":1794},[],[1796],{"type":66,"value":707},{"type":66,"value":1798}," for the developer,\nwithout naming the change and getting a yes.",{"type":60,"tag":202,"props":1800,"children":1802},{"id":1801},"rationalizations",[1803],{"type":66,"value":1804},"Rationalizations",{"type":60,"tag":83,"props":1806,"children":1807},{},[1808,1824],{"type":60,"tag":87,"props":1809,"children":1810},{},[1811],{"type":60,"tag":91,"props":1812,"children":1813},{},[1814,1819],{"type":60,"tag":95,"props":1815,"children":1816},{},[1817],{"type":66,"value":1818},"Thought",{"type":60,"tag":95,"props":1820,"children":1821},{},[1822],{"type":66,"value":1823},"Reality",{"type":60,"tag":111,"props":1825,"children":1826},{},[1827,1840,1853,1866,1879,1906,1933,1972,2005,2025,2060,2073],{"type":60,"tag":91,"props":1828,"children":1829},{},[1830,1835],{"type":60,"tag":118,"props":1831,"children":1832},{},[1833],{"type":66,"value":1834},"\"They're on a deadline, the direct adapter is faster\"",{"type":60,"tag":118,"props":1836,"children":1837},{},[1838],{"type":66,"value":1839},"You would be validating a different architecture and handing them credentials in the wrong place. Deadline pressure is when scope discipline matters most.",{"type":60,"tag":91,"props":1841,"children":1842},{},[1843,1848],{"type":60,"tag":118,"props":1844,"children":1845},{},[1846],{"type":66,"value":1847},"\"The dashboard is confusing, code is more reliable\"",{"type":60,"tag":118,"props":1849,"children":1850},{},[1851],{"type":66,"value":1852},"The confusion is the developer's actual problem. Solving it in code hides it.",{"type":60,"tag":91,"props":1854,"children":1855},{},[1856,1861],{"type":60,"tag":118,"props":1857,"children":1858},{},[1859],{"type":66,"value":1860},"\"The prod Slack app is already installed, so reusing it saves the approval\"",{"type":60,"tag":118,"props":1862,"children":1863},{},[1864],{"type":66,"value":1865},"Repointing its Request URL hijacks that app's whole event stream. The approval exists because installs affect other people.",{"type":60,"tag":91,"props":1867,"children":1868},{},[1869,1874],{"type":60,"tag":118,"props":1870,"children":1871},{},[1872],{"type":66,"value":1873},"\"It's just for testing \u002F just for a minute\"",{"type":60,"tag":118,"props":1875,"children":1876},{},[1877],{"type":66,"value":1878},"An app has one events URL. While yours is set, production is not receiving its events at all.",{"type":60,"tag":91,"props":1880,"children":1881},{},[1882,1887],{"type":60,"tag":118,"props":1883,"children":1884},{},[1885],{"type":66,"value":1886},"\"The starter ships a manifest, so I'll create the app from that\"",{"type":60,"tag":118,"props":1888,"children":1889},{},[1890,1892,1897,1899,1904],{"type":66,"value":1891},"It sets ",{"type":60,"tag":264,"props":1893,"children":1895},{"className":1894},[],[1896],{"type":66,"value":1700},{"type":66,"value":1898}," with no ",{"type":60,"tag":264,"props":1900,"children":1902},{"className":1901},[],[1903],{"type":66,"value":373},{"type":66,"value":1905}," — the direct-adapter shape. The app will install green and never deliver. Use the wizard's manifest.",{"type":60,"tag":91,"props":1907,"children":1908},{},[1909,1921],{"type":60,"tag":118,"props":1910,"children":1911},{},[1912,1914,1919],{"type":66,"value":1913},"\"I need to generate an ",{"type":60,"tag":264,"props":1915,"children":1917},{"className":1916},[],[1918],{"type":66,"value":355},{"type":66,"value":1920}," app-level token\"",{"type":60,"tag":118,"props":1922,"children":1923},{},[1924,1926,1931],{"type":66,"value":1925},"There is no ",{"type":60,"tag":264,"props":1927,"children":1929},{"className":1928},[],[1930],{"type":66,"value":355},{"type":66,"value":1932}," token in this workflow and nowhere to put one. The adapter takes a bot token and a signing secret.",{"type":60,"tag":91,"props":1934,"children":1935},{},[1936,1949],{"type":60,"tag":118,"props":1937,"children":1938},{},[1939,1941,1947],{"type":66,"value":1940},"\"The runtime started and ",{"type":60,"tag":264,"props":1942,"children":1944},{"className":1943},[],[1945],{"type":66,"value":1946},"\u002Finfo",{"type":66,"value":1948}," returns 200, so we're connected\"",{"type":60,"tag":118,"props":1950,"children":1951},{},[1952,1957,1959,1964,1965,1970],{"type":60,"tag":264,"props":1953,"children":1955},{"className":1954},[],[1956],{"type":66,"value":1579},{"type":66,"value":1958}," resolves on ",{"type":60,"tag":264,"props":1960,"children":1962},{"className":1961},[],[1963],{"type":66,"value":528},{"type":66,"value":572},{"type":60,"tag":264,"props":1966,"children":1968},{"className":1967},[],[1969],{"type":66,"value":1946},{"type":66,"value":1971}," reports license state. Neither says anything about Slack.",{"type":60,"tag":91,"props":1973,"children":1974},{},[1975,1986],{"type":60,"tag":118,"props":1976,"children":1977},{},[1978,1979,1984],{"type":66,"value":950},{"type":60,"tag":264,"props":1980,"children":1982},{"className":1981},[],[1983],{"type":66,"value":1579},{"type":66,"value":1985}," resolved without throwing, so the Channel is online\"",{"type":60,"tag":118,"props":1987,"children":1988},{},[1989,1991,1996,1998,2004],{"type":66,"value":1990},"It resolves on ",{"type":60,"tag":264,"props":1992,"children":1994},{"className":1993},[],[1995],{"type":66,"value":528},{"type":66,"value":1997}," by design. Read ",{"type":60,"tag":264,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":66,"value":2003},"status()",{"type":66,"value":1167},{"type":60,"tag":91,"props":2006,"children":2007},{},[2008,2013],{"type":60,"tag":118,"props":2009,"children":2010},{},[2011],{"type":66,"value":2012},"\"I'll check the Channel state with the API key\"",{"type":60,"tag":118,"props":2014,"children":2015},{},[2016,2018,2023],{"type":66,"value":2017},"Dashboard endpoints reject a project key. Use ",{"type":60,"tag":264,"props":2019,"children":2021},{"className":2020},[],[2022],{"type":66,"value":2003},{"type":66,"value":2024}," or the dashboard.",{"type":60,"tag":91,"props":2026,"children":2027},{},[2028,2040],{"type":60,"tag":118,"props":2029,"children":2030},{},[2031,2033,2038],{"type":66,"value":2032},"\"Let me just read ",{"type":60,"tag":264,"props":2034,"children":2036},{"className":2035},[],[2037],{"type":66,"value":707},{"type":66,"value":2039}," to see what's configured\"",{"type":60,"tag":118,"props":2041,"children":2042},{},[2043,2045,2051,2053,2058],{"type":66,"value":2044},"Read ",{"type":60,"tag":264,"props":2046,"children":2048},{"className":2047},[],[2049],{"type":66,"value":2050},".env.example",{"type":66,"value":2052}," for names; check ",{"type":60,"tag":264,"props":2054,"children":2056},{"className":2055},[],[2057],{"type":66,"value":707},{"type":66,"value":2059}," only for presence, and never quote a value.",{"type":60,"tag":91,"props":2061,"children":2062},{},[2063,2068],{"type":60,"tag":118,"props":2064,"children":2065},{},[2066],{"type":66,"value":2067},"\"I'll send the test mention myself to save a round trip\"",{"type":60,"tag":118,"props":2069,"children":2070},{},[2071],{"type":66,"value":2072},"The success criterion is a real human mention. Posting for them proves less and acts on their behalf in their workspace.",{"type":60,"tag":91,"props":2074,"children":2075},{},[2076,2081],{"type":60,"tag":118,"props":2077,"children":2078},{},[2079],{"type":66,"value":2080},"\"No reply — let me try changing the config\"",{"type":60,"tag":118,"props":2082,"children":2083},{},[2084,2086,2092],{"type":66,"value":2085},"Diagnose by layer first. ",{"type":60,"tag":264,"props":2087,"children":2089},{"className":2088},[],[2090],{"type":66,"value":2091},"LOG_LEVEL=debug",{"type":66,"value":2093}," names the failure in one line.",{"type":60,"tag":202,"props":2095,"children":2097},{"id":2096},"red-flags-stop",[2098],{"type":66,"value":2099},"Red flags — stop",{"type":60,"tag":320,"props":2101,"children":2102},{},[2103,2131,2149,2162,2174,2179,2184,2189,2208],{"type":60,"tag":324,"props":2104,"children":2105},{},[2106,2108,2114,2116,2122,2124,2129],{"type":66,"value":2107},"You are about to type ",{"type":60,"tag":264,"props":2109,"children":2111},{"className":2110},[],[2112],{"type":66,"value":2113},"adapters: [slack(",{"type":66,"value":2115}," or add ",{"type":60,"tag":264,"props":2117,"children":2119},{"className":2118},[],[2120],{"type":66,"value":2121},"SLACK_BOT_TOKEN",{"type":66,"value":2123}," to ",{"type":60,"tag":264,"props":2125,"children":2127},{"className":2126},[],[2128],{"type":66,"value":707},{"type":66,"value":2130},"\nfor anything other than the Phase 6 harness.",{"type":60,"tag":324,"props":2132,"children":2133},{},[2134,2136,2141,2143,2148],{"type":66,"value":2135},"You are about to create the Slack app from the starter's manifest, or from any\nmanifest with ",{"type":60,"tag":264,"props":2137,"children":2139},{"className":2138},[],[2140],{"type":66,"value":1700},{"type":66,"value":2142}," and no ",{"type":60,"tag":264,"props":2144,"children":2146},{"className":2145},[],[2147],{"type":66,"value":373},{"type":66,"value":1167},{"type":60,"tag":324,"props":2150,"children":2151},{},[2152,2154,2160],{"type":66,"value":2153},"You are about to look for an app-level token, ",{"type":60,"tag":264,"props":2155,"children":2157},{"className":2156},[],[2158],{"type":66,"value":2159},"connections:write",{"type":66,"value":2161},", or a Socket\nMode toggle. None of them belong to a managed Channel.",{"type":60,"tag":324,"props":2163,"children":2164},{},[2165,2167,2172],{"type":66,"value":2166},"You are about to open or screenshot the app's ",{"type":60,"tag":75,"props":2168,"children":2169},{},[2170],{"type":66,"value":2171},"Install App",{"type":66,"value":2173}," page. It renders\nthe bot token in plain text; reading it captures a live credential.",{"type":60,"tag":324,"props":2175,"children":2176},{},[2177],{"type":66,"value":2178},"You are about to say \"connected\", \"working\", or \"done\" without all three gates.",{"type":60,"tag":324,"props":2180,"children":2181},{},[2182],{"type":66,"value":2183},"You are about to ask the developer to paste a token, or you are about to echo one.",{"type":60,"tag":324,"props":2185,"children":2186},{},[2187],{"type":66,"value":2188},"You are about to click a dashboard control you have not read.",{"type":60,"tag":324,"props":2190,"children":2191},{},[2192,2194,2199,2201,2206],{"type":66,"value":2193},"You are about to ",{"type":60,"tag":264,"props":2195,"children":2197},{"className":2196},[],[2198],{"type":66,"value":1789},{"type":66,"value":2200},", kill a process, or edit ",{"type":60,"tag":264,"props":2202,"children":2204},{"className":2203},[],[2205],{"type":66,"value":707},{"type":66,"value":2207}," unasked.",{"type":60,"tag":324,"props":2209,"children":2210},{},[2211],{"type":66,"value":2212},"You have spent many tool calls deriving how managed Channels work. Stop — it is\nin this skill and its references.",{"type":60,"tag":202,"props":2214,"children":2216},{"id":2215},"references",[2217],{"type":66,"value":2218},"References",{"type":60,"tag":69,"props":2220,"children":2221},{},[2222],{"type":66,"value":2223},"Read the reference for the phase you are actually in — not all of them up front.\nEach is self-contained, and reading six files before saying anything to the\ndeveloper is how this workflow gets slow.",{"type":60,"tag":83,"props":2225,"children":2226},{},[2227,2243],{"type":60,"tag":87,"props":2228,"children":2229},{},[2230],{"type":60,"tag":91,"props":2231,"children":2232},{},[2233,2238],{"type":60,"tag":95,"props":2234,"children":2235},{},[2236],{"type":66,"value":2237},"File",{"type":60,"tag":95,"props":2239,"children":2240},{},[2241],{"type":66,"value":2242},"Read it when",{"type":60,"tag":111,"props":2244,"children":2245},{},[2246,2262,2278,2294,2310,2326,2342],{"type":60,"tag":91,"props":2247,"children":2248},{},[2249,2257],{"type":60,"tag":118,"props":2250,"children":2251},{},[2252],{"type":60,"tag":264,"props":2253,"children":2255},{"className":2254},[],[2256],{"type":66,"value":1284},{"type":60,"tag":118,"props":2258,"children":2259},{},[2260],{"type":66,"value":2261},"Phases 1 and 3 — wizard, Code, adapter, project, key",{"type":60,"tag":91,"props":2263,"children":2264},{},[2265,2273],{"type":60,"tag":118,"props":2266,"children":2267},{},[2268],{"type":60,"tag":264,"props":2269,"children":2271},{"className":2270},[],[2272],{"type":66,"value":1301},{"type":60,"tag":118,"props":2274,"children":2275},{},[2276],{"type":66,"value":2277},"Phase 2 — workspace, install, bot token, signing secret",{"type":60,"tag":91,"props":2279,"children":2280},{},[2281,2289],{"type":60,"tag":118,"props":2282,"children":2283},{},[2284],{"type":60,"tag":264,"props":2285,"children":2287},{"className":2286},[],[2288],{"type":66,"value":1762},{"type":60,"tag":118,"props":2290,"children":2291},{},[2292],{"type":66,"value":2293},"Any time a credential is in play",{"type":60,"tag":91,"props":2295,"children":2296},{},[2297,2305],{"type":60,"tag":118,"props":2298,"children":2299},{},[2300],{"type":60,"tag":264,"props":2301,"children":2303},{"className":2302},[],[2304],{"type":66,"value":1448},{"type":60,"tag":118,"props":2306,"children":2307},{},[2308],{"type":66,"value":2309},"Phase 4 — env, agent, runtime, startup, ports",{"type":60,"tag":91,"props":2311,"children":2312},{},[2313,2321],{"type":60,"tag":118,"props":2314,"children":2315},{},[2316],{"type":60,"tag":264,"props":2317,"children":2319},{"className":2318},[],[2320],{"type":66,"value":1653},{"type":60,"tag":118,"props":2322,"children":2323},{},[2324],{"type":66,"value":2325},"Phase 6 — the live Slack harness",{"type":60,"tag":91,"props":2327,"children":2328},{},[2329,2337],{"type":60,"tag":118,"props":2330,"children":2331},{},[2332],{"type":60,"tag":264,"props":2333,"children":2335},{"className":2334},[],[2336],{"type":66,"value":1165},{"type":60,"tag":118,"props":2338,"children":2339},{},[2340],{"type":66,"value":2341},"Anything fails, or a mention gets no reply",{"type":60,"tag":91,"props":2343,"children":2344},{},[2345,2353],{"type":60,"tag":118,"props":2346,"children":2347},{},[2348],{"type":60,"tag":264,"props":2349,"children":2351},{"className":2350},[],[2352],{"type":66,"value":1727},{"type":60,"tag":118,"props":2354,"children":2355},{},[2356,2358,2363],{"type":66,"value":2357},"Reference only — the ",{"type":60,"tag":75,"props":2359,"children":2360},{},[2361],{"type":66,"value":2362},"direct-adapter",{"type":66,"value":2364}," shape. Not for a managed Channel.",{"type":60,"tag":2366,"props":2367,"children":2368},"style",{},[2369],{"type":66,"value":2370},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2372,"total":2474},[2373,2390,2406,2419,2436,2448,2461],{"slug":2374,"name":2374,"fn":2375,"description":2376,"org":2377,"tags":2378,"stars":23,"repoUrl":24,"updatedAt":2389},"a2ui-renderer","render declarative agent UI surfaces","Render A2UI (Agent-to-UI declarative surfaces) in CopilotKit v2. Enable the runtime via CopilotRuntime({ a2ui: {...} }), then enable the provider via \u003CCopilotKit a2ui={{ theme }}>. Auto-activates via \u002Finfo — do NOT manually pass renderActivityMessages. createA2UIMessageRenderer ships from @copilotkit\u002Freact-core\u002Fv2; low-level primitives (A2UIProvider, A2UIRenderer, createCatalog) ship from @copilotkit\u002Fa2ui-renderer. Covers theme customization, createSurface dedup, action-bridge try\u002Ffinally cleanup. Load when an agent emits A2UI operations (createSurface \u002F updateComponents \u002F updateDataModel), when wiring a2ui on CopilotRuntime, or when styling A2UI surfaces.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2379,2380,2383,2386],{"name":9,"slug":8,"type":13},{"name":2381,"slug":2382,"type":13},"Design","design",{"name":2384,"slug":2385,"type":13},"Frontend","frontend",{"name":2387,"slug":2388,"type":13},"UI Components","ui-components","2026-07-12T08:06:36.722091",{"slug":2391,"name":2391,"fn":2392,"description":2393,"org":2394,"tags":2395,"stars":23,"repoUrl":24,"updatedAt":2405},"copilotkit-agui","build and debug CopilotKit agent backends","Use when building custom agent backends, implementing the AG-UI protocol, debugging streaming issues, or understanding how agents communicate with frontends. Covers event types, SSE transport, AbstractAgent\u002FHttpAgent patterns, state synchronization, tool calls, and human-in-the-loop flows.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2396,2397,2398,2401,2402],{"name":15,"slug":16,"type":13},{"name":21,"slug":22,"type":13},{"name":2399,"slug":2400,"type":13},"Backend","backend",{"name":9,"slug":8,"type":13},{"name":2403,"slug":2404,"type":13},"Debugging","debugging","2026-07-12T08:06:22.179755",{"slug":2407,"name":2407,"fn":2408,"description":2409,"org":2410,"tags":2411,"stars":23,"repoUrl":24,"updatedAt":2418},"copilotkit-channels","configure CopilotKit intelligence channels","Use for the CODE half of a managed Intelligence Channel with Slack or Microsoft Teams: customising the Channel a CLI-scaffolded project already ships, or — for a project the CLI did not generate — writing the Channel declaration, the long-running host, and the awaited activation call. Teams provider setup is in scope, because the CLI or dashboard wizard performs it. Creating a Slack app for the first time is not: if no Slack app exists yet, use setup-slack-channel for the provider half and return here for the code.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2412,2413,2414,2417],{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":2415,"slug":2416,"type":13},"Microsoft Teams","microsoft-teams",{"name":18,"slug":19,"type":13},"2026-08-04T05:59:05.179484",{"slug":2420,"name":2420,"fn":2421,"description":2422,"org":2423,"tags":2424,"stars":23,"repoUrl":24,"updatedAt":2435},"copilotkit-contribute","contribute to CopilotKit open-source project","Use when contributing to the CopilotKit open-source project — forking, cloning, setting up the monorepo, creating branches, running tests, and submitting pull requests against CopilotKit\u002FCopilotKit.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2425,2426,2429,2432],{"name":9,"slug":8,"type":13},{"name":2427,"slug":2428,"type":13},"Engineering","engineering",{"name":2430,"slug":2431,"type":13},"GitHub","github",{"name":2433,"slug":2434,"type":13},"Pull Requests","pull-requests","2026-07-12T08:06:30.102192",{"slug":2437,"name":2437,"fn":2438,"description":2439,"org":2440,"tags":2441,"stars":23,"repoUrl":24,"updatedAt":2447},"copilotkit-debug","diagnose and debug CopilotKit issues","Use when diagnosing CopilotKit issues -- runtime connectivity failures, agent not responding, streaming errors, tool execution problems, transcription failures, version mismatches, and AG-UI event tracing.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2442,2443,2444],{"name":9,"slug":8,"type":13},{"name":2403,"slug":2404,"type":13},{"name":2445,"slug":2446,"type":13},"Observability","observability","2026-07-12T08:06:23.407872",{"slug":2449,"name":2449,"fn":2450,"description":2451,"org":2452,"tags":2453,"stars":23,"repoUrl":24,"updatedAt":2460},"copilotkit-develop","build AI features with CopilotKit","Use when building AI-powered features with CopilotKit v2 -- adding chat interfaces, registering frontend tools, sharing application context with agents, handling agent interrupts, and working with the CopilotKit runtime.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2454,2455,2458,2459],{"name":15,"slug":16,"type":13},{"name":2456,"slug":2457,"type":13},"AI Context","ai-context",{"name":9,"slug":8,"type":13},{"name":2384,"slug":2385,"type":13},"2026-07-12T08:06:28.856644",{"slug":2462,"name":2462,"fn":2463,"description":2464,"org":2465,"tags":2466,"stars":23,"repoUrl":24,"updatedAt":2473},"copilotkit-integrations","integrate agent frameworks into CopilotKit applications","Use when wiring an external agent framework (LangGraph, CrewAI, PydanticAI, Mastra, ADK, LlamaIndex, Agno, Strands, Microsoft Agent Framework, or others) into a CopilotKit application via the AG-UI protocol.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2467,2468,2469,2470],{"name":15,"slug":16,"type":13},{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"name":2471,"slug":2472,"type":13},"Integrations","integrations","2026-07-12T08:06:32.560054",13,{"items":2476,"total":2594},[2477,2484,2492,2499,2506,2512,2519,2526,2540,2552,2564,2579],{"slug":2374,"name":2374,"fn":2375,"description":2376,"org":2478,"tags":2479,"stars":23,"repoUrl":24,"updatedAt":2389},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2480,2481,2482,2483],{"name":9,"slug":8,"type":13},{"name":2381,"slug":2382,"type":13},{"name":2384,"slug":2385,"type":13},{"name":2387,"slug":2388,"type":13},{"slug":2391,"name":2391,"fn":2392,"description":2393,"org":2485,"tags":2486,"stars":23,"repoUrl":24,"updatedAt":2405},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2487,2488,2489,2490,2491],{"name":15,"slug":16,"type":13},{"name":21,"slug":22,"type":13},{"name":2399,"slug":2400,"type":13},{"name":9,"slug":8,"type":13},{"name":2403,"slug":2404,"type":13},{"slug":2407,"name":2407,"fn":2408,"description":2409,"org":2493,"tags":2494,"stars":23,"repoUrl":24,"updatedAt":2418},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2495,2496,2497,2498],{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":2415,"slug":2416,"type":13},{"name":18,"slug":19,"type":13},{"slug":2420,"name":2420,"fn":2421,"description":2422,"org":2500,"tags":2501,"stars":23,"repoUrl":24,"updatedAt":2435},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2502,2503,2504,2505],{"name":9,"slug":8,"type":13},{"name":2427,"slug":2428,"type":13},{"name":2430,"slug":2431,"type":13},{"name":2433,"slug":2434,"type":13},{"slug":2437,"name":2437,"fn":2438,"description":2439,"org":2507,"tags":2508,"stars":23,"repoUrl":24,"updatedAt":2447},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2509,2510,2511],{"name":9,"slug":8,"type":13},{"name":2403,"slug":2404,"type":13},{"name":2445,"slug":2446,"type":13},{"slug":2449,"name":2449,"fn":2450,"description":2451,"org":2513,"tags":2514,"stars":23,"repoUrl":24,"updatedAt":2460},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2515,2516,2517,2518],{"name":15,"slug":16,"type":13},{"name":2456,"slug":2457,"type":13},{"name":9,"slug":8,"type":13},{"name":2384,"slug":2385,"type":13},{"slug":2462,"name":2462,"fn":2463,"description":2464,"org":2520,"tags":2521,"stars":23,"repoUrl":24,"updatedAt":2473},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2522,2523,2524,2525],{"name":15,"slug":16,"type":13},{"name":21,"slug":22,"type":13},{"name":9,"slug":8,"type":13},{"name":2471,"slug":2472,"type":13},{"slug":2527,"name":2527,"fn":2528,"description":2529,"org":2530,"tags":2531,"stars":23,"repoUrl":24,"updatedAt":2539},"copilotkit-self-update","update CopilotKit agent skills","Use when the user wants to update, refresh, or reinstall the CopilotKit agent SKILLS (the SKILL.md files that teach this agent about CopilotKit). NOT for updating the CopilotKit codebase or project — this is specifically about refreshing the skills\u002Fknowledge this agent has loaded. Triggers on \"update copilotkit skills\", \"update skills\", \"refresh skills\", \"skills are stale\", \"skills are outdated\", \"get latest skills\", \"my copilotkit knowledge is wrong\", \"copilotkit APIs changed\", \"skills seem old\", \"wrong API names\", \"reinstall skills\", \"skills not working right\", \"update your copilotkit knowledge\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2532,2533,2536],{"name":9,"slug":8,"type":13},{"name":2534,"slug":2535,"type":13},"Documentation","documentation",{"name":2537,"slug":2538,"type":13},"Productivity","productivity","2026-07-12T08:06:31.345052",{"slug":2541,"name":2541,"fn":2542,"description":2543,"org":2544,"tags":2545,"stars":23,"repoUrl":24,"updatedAt":2551},"copilotkit-setup","set up CopilotKit in projects","Use when adding CopilotKit to an existing project or bootstrapping a new CopilotKit project from scratch. Covers framework detection, package installation, runtime wiring (managed Intelligence or self-hosted SSE), provider setup, and first working chat integration.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2546,2547,2548],{"name":9,"slug":8,"type":13},{"name":2384,"slug":2385,"type":13},{"name":2549,"slug":2550,"type":13},"Onboarding","onboarding","2026-08-04T05:33:37.053218",{"slug":2553,"name":2553,"fn":2554,"description":2555,"org":2556,"tags":2557,"stars":23,"repoUrl":24,"updatedAt":2563},"copilotkit-upgrade","migrate CopilotKit applications to v2","Use when migrating a CopilotKit v1 application to v2 -- updating package imports, replacing deprecated hooks and components, switching from GraphQL runtime to AG-UI protocol runtime, and resolving breaking API changes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2558,2559,2560],{"name":9,"slug":8,"type":13},{"name":2427,"slug":2428,"type":13},{"name":2561,"slug":2562,"type":13},"Migration","migration","2026-07-12T08:06:26.949801",{"slug":2565,"name":2565,"fn":2566,"description":2567,"org":2568,"tags":2569,"stars":23,"repoUrl":24,"updatedAt":2578},"react-core","integrate CopilotKit into React applications","@copilotkit\u002Freact-core — mount the CopilotKit provider (from @copilotkit\u002Freact-core\u002Fv2) in a Next.js App Router \u002F React Router v7 \u002F TanStack Start \u002F SPA app, drop in CopilotChat\u002FCopilotPopup\u002FCopilotSidebar (v2 chat components ship from react-core\u002Fv2 — NOT react-ui, which is CSS-only in v2), access and subscribe to agents with useAgent \u002F useAgentContext \u002F useCapabilities, switch between multiple agents, manage durable Intelligence threads with useThreads, register browser-side tools via useFrontendTool, render tool calls with useRenderTool \u002F useComponent \u002F useDefaultRenderTool, gate execution with useHumanInTheLoop, wire file attachments with useAttachments, configure suggestion pills, and register activity- and custom-message renderers. publicLicenseKey is canonical (publicApiKey is deprecated alias). Load the reference under references\u002F that matches your task.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2570,2571,2572,2575,2577],{"name":9,"slug":8,"type":13},{"name":2384,"slug":2385,"type":13},{"name":2573,"slug":2574,"type":13},"Next.js","next-js",{"name":2576,"slug":44,"type":13},"React",{"name":2387,"slug":2388,"type":13},"2026-07-12T08:06:15.72619",{"slug":2580,"name":2580,"fn":2581,"description":2582,"org":2583,"tags":2584,"stars":23,"repoUrl":24,"updatedAt":2593},"runtime","mount and configure CopilotRuntime servers","@copilotkit\u002Fruntime — mount a fetch-native CopilotRuntime on any JS server, wire middleware, pick an AgentRunner, instantiate BuiltInAgent (Factory Mode with TanStack AI is the preferred default) or plug in any of 12 external agent frameworks (Mastra, LangGraph, CrewAI Crews\u002FFlows, PydanticAI, ADK, LlamaIndex, Agno, AWS Strands, MS Agent Framework, AG2, A2A), enable Intelligence mode for durable threads + websocket, register server-side tools via defineTool, and wire voice transcription. Uses the fetch-based createCopilotRuntimeHandler primitive — the Express\u002FHono adapters are discouraged. Load the reference under references\u002F that matches your task.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2585,2586,2587,2590],{"name":2399,"slug":2400,"type":13},{"name":9,"slug":8,"type":13},{"name":2588,"slug":2589,"type":13},"JavaScript","javascript",{"name":2591,"slug":2592,"type":13},"Middleware","middleware","2026-07-12T08:06:10.034875",16]