{"slug":"add-webex","title":"add-webex","summary":"Add Webex channel integration via Chat SDK.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-24T05:37:19.093455Z","repo":{"url":"https://github.com/nanocoai/nanoclaw","stars":30841,"forks":12823,"license":"MIT","updatedAt":"2026-09-23T17:25:39Z"},"bodyHtml":"<hr>\n<h2>name: add-webex\ndescription: Add Webex channel integration via Chat SDK.</h2>\n<h1>Add Webex Channel</h1>\n<p>Adds Cisco Webex support via the Chat SDK bridge. NanoClaw doesn't ship channels\nin trunk — this skill copies the Webex adapter in from the <code>channels</code> branch.</p>\n<p>The mechanical steps under <strong>Apply</strong> carry <code>nc:</code> directive fences: an agent\nreads the prose and applies them, and a parser can apply them deterministically\nfrom the same document. Every directive is idempotent, so the whole skill is\nsafe to re-run; anything a parser can't apply falls back to the prose beside it.</p>\n<h2>Apply</h2>\n<h3>1. Copy the adapter and its registration test</h3>\n<p>Fetch the <code>channels</code> branch and copy the Webex adapter and its registration test\ninto <code>src/channels/</code> (overwrite — the branch is canonical):</p>\n<pre><code>src/channels/webex.ts\nsrc/channels/webex-registration.test.ts\n</code></pre>\n<h3>2. Register the adapter</h3>\n<p>Append the self-registration import to the channel barrel (skipped if the line\nis already present). This one line is the skill's only reach-in into core:</p>\n<pre><code>import './webex.js';\n</code></pre>\n<h3>3. Install the adapter package</h3>\n<p>Pinned to an exact version — the supply-chain policy rejects ranges and <code>latest</code>.\nThe Webex adapter ships under the third-party <code>@bitbasti/*</code> namespace, not\n<code>@chat-adapter/*</code>, so it carries its own version line (<code>0.1.0</code>) rather than\ntracking the chat core version:</p>\n<pre><code>@bitbasti/chat-adapter-webex@0.1.0\n</code></pre>\n<h3>4. Build and validate</h3>\n<p>Build first: it guards the typed <code>createChatSdkBridge(...)</code> core call and proves\nthe dependency is installed. Then run the one integration test.</p>\n<pre><code>pnpm run build\n</code></pre>\n<pre><code>pnpm exec vitest run src/channels/webex-registration.test.ts\n</code></pre>\n<p><code>webex-registration.test.ts</code> imports the real channel barrel and asserts the\nregistry contains <code>webex</code>. It goes red if the import line is deleted or drifts,\nif the barrel fails to evaluate, or if <code>@bitbasti/chat-adapter-webex</code> isn't\ninstalled (the import throws) — so it also covers the dependency from step 3.\nEnd-to-end delivery against a real Webex space is verified manually once the\nservice runs — see the webhook setup below.</p>\n<h2>Credentials</h2>\n<p>Webex bot setup is human and interactive — these steps are prose, not directives\n(no parser can click through the Webex Developer Portal). A recipe rebuild\nproduces a compiling, registered adapter that cannot receive a message until\nthey're done.</p>\n<h3>Create the Webex bot</h3>\n<ol>\n<li>Go to <a href=\"https://developer.webex.com/my-apps/new/bot\">developer.webex.com</a> and create a new bot.</li>\n<li>Copy the <strong>Bot Access Token</strong>.</li>\n<li>Set up a webhook:\n<ul>\n<li>Use the Webex API or Developer Portal to create a webhook pointing to <code>https://your-domain/webhook/webex</code>.</li>\n<li>Set a webhook secret for signature verification.</li>\n</ul>\n</li>\n</ol>\n<h3>Store the credentials</h3>\n<p>Capture the two values, then write them. <code>prompt</code> only <em>asks</em> and binds the\nanswer to a name; a separate directive consumes it — so the same prompts could\nfeed <code>ncl</code> or the OneCLI vault instead of <code>.env</code> by swapping only the consumer.\nHere they go to <code>.env</code> (set-if-absent — a value you've already filled in is\nnever overwritten):</p>\n<pre><code>Paste the Bot Access Token — from the Webex bot you created.\n</code></pre>\n<pre><code>Paste the webhook secret you set for signature verification.\n</code></pre>\n<pre><code>WEBEX_BOT_TOKEN={{bot_token}}\nWEBEX_WEBHOOK_SECRET={{webhook_secret}}\n</code></pre>\n<h3>Webhook server</h3>\n<p>The Chat SDK bridge automatically starts a shared webhook server on port 3000\n(<code>WEBHOOK_PORT</code> to change it), handling <code>/webhook/webex</code>. This port must be\npublicly reachable for Webex to deliver events. Running locally, expose it with\nngrok (<code>ngrok http 3000</code>), a Cloudflare Tunnel, or a reverse proxy on a VPS —\nthe resulting public URL is the base for the webhook URL above.</p>\n<h2>Next Steps</h2>\n<p>If you're in the middle of <code>/setup</code>, return to the setup flow now. Otherwise run\n<code>/manage-channels</code> to wire this channel to an agent group.</p>\n<h2>Channel Info</h2>\n<ul>\n<li><strong>type</strong>: <code>webex</code></li>\n<li><strong>terminology</strong>: Webex has \"spaces.\" A space can be a group conversation or a 1:1 direct message with the bot.</li>\n<li><strong>how-to-find-id</strong>: Open the space in Webex, click the space name &gt; Settings — the Space ID is listed there. Or use the Webex API (<code>GET /rooms</code>) to list spaces and their IDs.</li>\n<li><strong>supports-threads</strong>: yes</li>\n<li><strong>typical-use</strong>: Interactive chat — team spaces or direct messages</li>\n<li><strong>default-isolation</strong>: Same agent group for spaces where you're the primary user. Separate agent group for spaces with different teams or sensitive information.</li>\n</ul>\n<h2>Troubleshooting</h2>\n<p><strong>Sends fail with 401.</strong> The Bot Access Token is shown once, on the bot's page under developer.webex.com → My Apps — it is <em>not</em> the 12-hour personal access token from the API docs pages, which is the classic mix-up (that one works briefly, then everything 401s). Regenerate the token on the bot page if needed; regenerating invalidates the old value, so update <code>WEBEX_BOT_TOKEN</code> right away.</p>\n<p><strong>Messages in the space never reach the agent.</strong> Webex delivers only to the webhook you created: it must target your public host at <code>/webhook/webex</code> (shared webhook server, port 3000) with resource <code>messages</code>. List your webhooks with <code>GET https://webexapis.com/v1/webhooks</code> using the bot token — Webex flips a webhook to <code>inactive</code> after repeated delivery failures, and it stays off until you re-enable or recreate it.</p>\n<p><strong>Events arrive but are rejected.</strong> Signature mismatch: the secret set at webhook creation must equal <code>WEBEX_WEBHOOK_SECRET</code> exactly. Recreate the webhook with a known secret and update <code>.env</code> to match.</p>\n<p><strong>Adapter installed but silent.</strong> Run <code>pnpm exec vitest run src/channels/webex-registration.test.ts</code> — red means the barrel import or the <code>@bitbasti/chat-adapter-webex</code> install drifted, so re-run the Apply steps. If green, restart the service so it loads the adapter and the tokens, then watch <code>logs/nanoclaw.log</code> for the webhook hit.</p>\n","files":[{"path":"apply-fixtures.json","sizeBytes":309,"isText":true},{"path":"REMOVE.md","sizeBytes":732,"isText":true},{"path":"SKILL.md","sizeBytes":6013,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"human-reviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"human-reviewed","screen":{"ran":true,"outcome":"flagged-cleared-by-moderator","suspicious":2,"notes":1,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-08-24T05:39:06.678127Z","sha256":"4D538BC5106E965EBA73EF967729AF88149922F5A59E55D90570CDE5FC22A9BF","sizeBytes":3670},"review":null,"source":{"repositoryUrl":"https://github.com/nanocoai/nanoclaw","path":".claude/skills/add-webex","license":"MIT","commit":"143db6c907c652773a536c7c9e96269fdad0a4a4","subtreeSha":"010A8C09FC7F690722FC4BADC680DDBF7BD56377D258412C0A6ECE72ADFEA64A","lastSyncedAt":"2026-09-24T06:48:46.168681Z"},"reviewedAt":"2026-08-25T15:13:52.427238Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/add-webex"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install nanocoai-nanoclaw@llmmart"},{"target":"git","command":"git clone https://github.com/nanocoai/nanoclaw.git"}]}