{"_id":"@chatvia/openclaw-channel","_rev":"7-ceba20d04f6d7d4de6cb9923e0ae35bb","name":"@chatvia/openclaw-channel","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@chatvia/openclaw-channel","version":"0.1.0","keywords":["openclaw","openclaw-plugin","chatvia","chat","agent"],"license":"MIT","_id":"@chatvia/openclaw-channel@0.1.0","maintainers":[{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"}],"homepage":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/tree/main/openclaw-plugin#readme","bugs":{"url":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/issues"},"dist":{"shasum":"95f3a3eb9ce132731bf8e48652552fdbe999f746","tarball":"https://registry.npmjs.org/@chatvia/openclaw-channel/-/openclaw-channel-0.1.0.tgz","fileCount":8,"integrity":"sha512-nne7HCYdTuUoYfG31zDPZ1WjMJeIH1l41e79LW4Cqy84vaIJSUJ6p2hzpaz7y119cjNDSzkN65ECUahzzx8Nnw==","signatures":[{"sig":"MEYCIQDMS3Ysbg9sIDKVg0BA9SW1/fzjXIKGpsQygMI6+nbcqgIhAJghtdzQjQdpy5u6XdH7GFL/NGcgYs/omRO2AFbmKAtA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31012},"type":"module","//files":"Tests are excluded: they carry a stub gateway that is useless to consumers and only inflates the install. Everything the runtime resolves must stay listed.","engines":{"node":">=22"},"exports":{".":"./index.ts"},"gitHead":"428adb96e01ec77ba3cef99fd464a8aa11d8bf71","scripts":{"test":"node --test test/*.test.ts","prepublishOnly":"npm test"},"_npmUser":{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"},"openclaw":{"channel":{"id":"chatvia","blurb":"Chat with your agent from the ChatVia apps.","label":"ChatVia"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts"},"deprecated":"Uninstallable - ships no compiled output. Use 0.1.1 or later.","repository":{"url":"git+https://github.com/ImmersiveMobileDesigns/chat-app-rust.git","type":"git","directory":"openclaw-plugin"},"_npmVersion":"11.6.2","description":"Talk to your self-hosted OpenClaw agent from ChatVia.","directories":{},"_nodeVersion":"23.8.0","dependencies":{"ws":"^8.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"openclaw":">=2026.9.0"},"//peerDependencies":"The plugin runs INSIDE an OpenClaw install and imports openclaw/plugin-sdk/channel-core from it. Declaring it a regular dependency would install a second copy of the host runtime under this package and load the SDK twice.","_npmOperationalInternal":{"tmp":"tmp/openclaw-channel_0.1.0_1789037987189_0.8326183242859955","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@chatvia/openclaw-channel","version":"0.1.1","keywords":["openclaw","openclaw-plugin","chatvia","chat","agent"],"license":"MIT","_id":"@chatvia/openclaw-channel@0.1.1","maintainers":[{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"}],"homepage":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/tree/main/openclaw-plugin#readme","bugs":{"url":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/issues"},"dist":{"shasum":"97ba09c9409b2c9a082754efeab0faacea06b5b2","tarball":"https://registry.npmjs.org/@chatvia/openclaw-channel/-/openclaw-channel-0.1.1.tgz","fileCount":18,"integrity":"sha512-TMvunqndCqi8g+DLzifBycp/UdCJXWcgJkwBnZ/mp486sVDp4kbzV1K/F7YzKI/dNiPqGNI6LBOG4l8ipnT8dw==","signatures":[{"sig":"MEQCIBd4ql5nVEudjS/ehVCOYjRtq7Nf0HG7iBd8i8QxHtizAiBzziHEDXTYdvSaY4baszu7fyP2h5n9h6yxB9X/iEEzXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFs38TzEj9ZXoJfEmjjYi4w3GjPiX3erK01gA9rFq49RAiEA67YdEuL3cdOei2GNFtHqYhPWvCgWlJB4thH2Aj26Thc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67490},"type":"module","//files":"Tests are excluded: they carry a stub gateway that is useless to consumers and only inflates the install. dist/ is REQUIRED: OpenClaw refuses TypeScript entries for a package installed from npm ('TypeScript source fallback is only supported for source checkouts'), so the .ts sources alone make the package uninstallable. Ship both -- the .ts for local source checkouts, dist/ for registry installs.","engines":{"node":">=22"},"exports":{".":"./index.ts"},"gitHead":"21e6e906c90e99f2146cc1b60e2c5a59c248246d","scripts":{"test":"node --test test/*.test.ts","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"},"openclaw":{"channel":{"id":"chatvia","blurb":"Chat with your agent from the ChatVia apps.","label":"ChatVia"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"repository":{"url":"git+https://github.com/ImmersiveMobileDesigns/chat-app-rust.git","type":"git","directory":"openclaw-plugin"},"_npmVersion":"11.6.2","description":"Talk to your self-hosted OpenClaw agent from ChatVia.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"ws":"^8.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/ws":"^8.5.0","typescript":"^5.9.2","@types/node":"^24.0.0"},"peerDependencies":{"openclaw":">=2026.9.0"},"//peerDependencies":"The plugin runs INSIDE an OpenClaw install and imports openclaw/plugin-sdk/channel-core from it. Declaring it a regular dependency would install a second copy of the host runtime under this package and load the SDK twice.","_npmOperationalInternal":{"tmp":"tmp/openclaw-channel_0.1.1_1789049242475_0.937892933902239","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@chatvia/openclaw-channel","version":"0.1.2","keywords":["openclaw","openclaw-plugin","chatvia","chat","agent"],"license":"MIT","_id":"@chatvia/openclaw-channel@0.1.2","maintainers":[{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"},{"name":"kaushalrola","email":"kaushalrola@gmail.com"}],"homepage":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/tree/main/openclaw-plugin#readme","bugs":{"url":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/issues"},"dist":{"shasum":"2547f7cbaa82bb67508a572027a92e2627523c50","tarball":"https://registry.npmjs.org/@chatvia/openclaw-channel/-/openclaw-channel-0.1.2.tgz","fileCount":18,"integrity":"sha512-JKXJnf/9ACCRNyWpdPD+kHlXu5OuYCxhKhPeQgiEQIPPPGhXKKAew1iDHjhmdGnwlAF+WoA860ebq2YQClFN7g==","signatures":[{"sig":"MEUCICDMGA9m9xBilUbM65wKxagyfeIkbxQJqZsLBHBwtf/mAiEA7FqVtBHDpPmKV+ETDL1KN8cyoxQ2kRTpqzeRovEhp0U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDIGwql54X8liru/ee42+tfo3nnUKicDXo1v51PcApoHQIhALdbMYs9MjdIuM4awhpNHSd6sUnPie+6rmydyVJT0u7q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98955},"type":"module","//files":"Tests are excluded: they carry a stub gateway that is useless to consumers and only inflates the install. dist/ is REQUIRED: OpenClaw refuses TypeScript entries for a package installed from npm ('TypeScript source fallback is only supported for source checkouts'), so the .ts sources alone make the package uninstallable. Ship both -- the .ts for local source checkouts, dist/ for registry installs.","engines":{"node":">=22"},"exports":{".":"./index.ts"},"gitHead":"286b1101ef22964825bd35fdf678775878e3ff0c","scripts":{"test":"node --test test/*.test.ts","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"},"openclaw":{"channel":{"id":"chatvia","blurb":"Chat with your agent from the ChatVia apps.","label":"ChatVia"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"repository":{"url":"git+https://github.com/ImmersiveMobileDesigns/chat-app-rust.git","type":"git","directory":"openclaw-plugin"},"_npmVersion":"11.6.2","description":"Talk to your self-hosted OpenClaw agent from ChatVia.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"ws":"^8.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/ws":"^8.5.0","typescript":"^5.9.2","@types/node":"^24.0.0"},"peerDependencies":{"openclaw":">=2026.9.0"},"//peerDependencies":"The plugin runs INSIDE an OpenClaw install and imports openclaw/plugin-sdk/channel-core from it. Declaring it a regular dependency would install a second copy of the host runtime under this package and load the SDK twice.","_npmOperationalInternal":{"tmp":"tmp/openclaw-channel_0.1.2_1789120597114_0.4549547969317427","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@chatvia/openclaw-channel","version":"0.1.3","keywords":["openclaw","openclaw-plugin","chatvia","chat","agent"],"license":"MIT","_id":"@chatvia/openclaw-channel@0.1.3","maintainers":[{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"},{"name":"kaushalrola","email":"kaushalrola@gmail.com"}],"homepage":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/tree/main/openclaw-plugin#readme","bugs":{"url":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/issues"},"dist":{"shasum":"9e6c34b737a6ab929024e4110cdbaa3675dd4625","tarball":"https://registry.npmjs.org/@chatvia/openclaw-channel/-/openclaw-channel-0.1.3.tgz","fileCount":18,"integrity":"sha512-vbfAeivNcFrTAubJs5dp7uX639iBAtSG3GCDHJLHay1+2C049OEAB8YXlOW26uWr+y1WHTfHjLDadJm0MC8W9g==","signatures":[{"sig":"MEQCIHlQw1z2lt7zO/jOe1IA3/OA8Dpvw7EONyOJEZLYhF/dAiAIh16gspwv6qKQdmCuRSSnK5MDaAOz1wuLPVcTegUmhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDeDPRBppdHKsAMO1C5S/tLvPAB9BZ4xXcTmTPyDlbK7AiEA0ofyIqbsMaAID+nSA9i4W6jKJr6NwmEhTcZ9ANtvleI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104331},"type":"module","//files":"Tests are excluded: they carry a stub gateway that is useless to consumers and only inflates the install. dist/ is REQUIRED: OpenClaw refuses TypeScript entries for a package installed from npm ('TypeScript source fallback is only supported for source checkouts'), so the .ts sources alone make the package uninstallable. Ship both -- the .ts for local source checkouts, dist/ for registry installs.","engines":{"node":">=22"},"exports":{".":"./index.ts"},"gitHead":"6af89c3141dbc56c6190f7feeafe557379b7f014","scripts":{"test":"node --test test/*.test.ts","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"},"openclaw":{"channel":{"id":"chatvia","blurb":"Chat with your agent from the ChatVia apps.","label":"ChatVia"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"repository":{"url":"git+https://github.com/ImmersiveMobileDesigns/chat-app-rust.git","type":"git","directory":"openclaw-plugin"},"_npmVersion":"11.6.2","description":"Talk to your self-hosted OpenClaw agent from ChatVia.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"ws":"^8.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/ws":"^8.5.0","typescript":"^5.9.2","@types/node":"^24.0.0"},"peerDependencies":{"openclaw":">=2026.9.0"},"//peerDependencies":"The plugin runs INSIDE an OpenClaw install and imports openclaw/plugin-sdk/channel-core from it. Declaring it a regular dependency would install a second copy of the host runtime under this package and load the SDK twice.","_npmOperationalInternal":{"tmp":"tmp/openclaw-channel_0.1.3_1789122785185_0.022061023188360673","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"_id":"@chatvia/openclaw-channel@0.1.4","bugs":{"url":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/issues"},"dist":{"shasum":"820e4f4d11a3af37f42b2ef31d26f3c5e756c176","tarball":"https://registry.npmjs.org/@chatvia/openclaw-channel/-/openclaw-channel-0.1.4.tgz","fileCount":18,"integrity":"sha512-efxO0c41wcK4ze0xsr7gxwcWfIZXDIQa6qH+fDTabiOPl+GiQbk+UhETRwrlPU4gH9Jnmm4fHSHNKWc0qyMTOw==","signatures":[{"sig":"MEYCIQCgOboe4o1vbIdQ4ADn6l1zoBoOaw5af0yjpeOoZSmEjgIhAO6bsv9lkwJvYHywtNzp49B1T3/Xmh5TqcS206kK8YtZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBO1UaYjNHpXq1sT/X928YPW7RFtM4lYXnFwZFFsfnzrAiEAuf2onayS/HqQ2+WwNuvgyV+0+jo0JCvIafnge9km/l0="}],"unpackedSize":111598},"name":"@chatvia/openclaw-channel","type":"module","//files":"Tests are excluded: they carry a stub gateway that is useless to consumers and only inflates the install. dist/ is REQUIRED: OpenClaw refuses TypeScript entries for a package installed from npm ('TypeScript source fallback is only supported for source checkouts'), so the .ts sources alone make the package uninstallable. Ship both -- the .ts for local source checkouts, dist/ for registry installs.","engines":{"node":">=22.19.0"},"exports":{".":"./index.ts"},"gitHead":"1d8aac577d6c0551ffcaf87b86a2bb8e35a8ebed","license":"MIT","scripts":{"test":"node --test test/*.test.ts","build":"tsc","prepublishOnly":"npm run build && npm test"},"version":"0.1.4","_npmUser":{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"},"homepage":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/tree/main/openclaw-plugin#readme","keywords":["openclaw","openclaw-plugin","chatvia","chat","agent"],"openclaw":{"channel":{"id":"chatvia","blurb":"Chat with your agent from the ChatVia apps.","label":"ChatVia"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"//engines":"Matches OpenClaw's own floor (>=22.19.0), not merely ours. OpenClaw uses the built-in node:sqlite, and StatementSync.prototype.columns() does not exist before that line -- on Node 23.8 the CLI dies with 'statement.columns is not a function' before any plugin loads. Declaring the looser '>=22' let npm install this plugin onto a runtime that cannot run its host, turning a clear engine warning into a cryptic crash.","repository":{"url":"git+https://github.com/ImmersiveMobileDesigns/chat-app-rust.git","type":"git","directory":"openclaw-plugin"},"_npmVersion":"11.6.2","description":"Talk to your self-hosted OpenClaw agent from ChatVia.","directories":{},"maintainers":[{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"},{"name":"kaushalrola","email":"kaushalrola@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"ws":"^8.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/ws":"^8.5.0","typescript":"^5.9.2","@types/node":"^24.0.0"},"peerDependencies":{"openclaw":">=2026.9.0"},"//peerDependencies":"The plugin runs INSIDE an OpenClaw install and imports openclaw/plugin-sdk/channel-core from it. Declaring it a regular dependency would install a second copy of the host runtime under this package and load the SDK twice.","_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openclaw-channel_0.1.4_1789628874517_0.43922659622637505"}}},"time":{"created":"2026-09-10T10:59:46.994Z","modified":"2026-09-17T07:07:54.775Z","0.1.0":"2026-09-10T10:59:47.326Z","0.1.1":"2026-09-10T14:07:22.552Z","0.1.2":"2026-09-11T09:56:37.191Z","0.1.3":"2026-09-11T10:33:05.282Z","0.1.4":"2026-09-17T07:07:54.606Z"},"bugs":{"url":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/issues"},"license":"MIT","homepage":"https://github.com/ImmersiveMobileDesigns/chat-app-rust/tree/main/openclaw-plugin#readme","keywords":["openclaw","openclaw-plugin","chatvia","chat","agent"],"repository":{"url":"git+https://github.com/ImmersiveMobileDesigns/chat-app-rust.git","type":"git","directory":"openclaw-plugin"},"description":"Talk to your self-hosted OpenClaw agent from ChatVia.","maintainers":[{"name":"betadrop","email":"krunal.mali@imobiledesigns.com"},{"name":"kaushalrola","email":"kaushalrola@gmail.com"}],"readme":"# @chatvia/openclaw-channel\n\nTalk to your self-hosted [OpenClaw](https://openclaw.ai/) agent from ChatVia.\n\nYour agent shows up in ChatVia as an ordinary contact. You message it, it\nanswers. The agent runs on **your** machine — ChatVia runs no model and pays for\nno tokens.\n\n## Setup\n\nTwo steps.\n\n**1. Set the agent up in ChatVia.** Settings → Agents → Set up my agent. It walks\nyou through it and gives you a short code like `CVA-7K2M-94QP`, good for 15\nminutes.\n\n**2. Install and paste.**\n\n```bash\nopenclaw plugins install @chatvia/openclaw-channel\nopenclaw chatvia pair CVA-XXXX-XXXX   # the code from Settings -> Agents\n```\n\nNothing prompts you for the code -- you hand it to `pair`. (`openclaw chatvia`\non its own only prints help; an earlier version of this README claimed it would\nask, which sent people looking for a prompt that does not exist.)\n\nCheck it worked with `openclaw chatvia status`.\n\nThat is it. The setup screen notices the moment the agent connects, and its chat\nappears in your ChatVia sidebar.\n\nThe code is single use: it is traded for a long-lived token on first connect,\nand that token is what gets saved. If a code expires before you use it, make\nanother — they cost nothing.\n\n## Configuration\n\n```json\n{\n  \"channels\": {\n    \"chatvia\": {\n      \"token\": \"cva_…\",\n      \"serverUrl\": \"wss://api.chatvia.in\",\n      \"allowFrom\": []\n    }\n  }\n}\n```\n\n- **`token`** — the pairing code from Settings → Agents, or a long-lived\n  `cva_…` token. Required. A code is swapped for a token on first connect.\n- **`serverUrl`** — override only for self-hosted or local development.\n- **`allowFrom`** — optional extra allowlist of ChatVia user ids. ChatVia already\n  enforces who may reach your agent (you, plus anyone you granted), so leaving\n  this empty is the normal case, not an open door.\n\n## How it connects\n\nThe plugin dials **out** over TLS and holds the connection. There is no webhook\nand no inbound port, because OpenClaw runs on a personal machine with no public\nURL. Nothing needs forwarding and nothing needs a tunnel.\n\nIt carries no crypto. ChatVia encrypts and decrypts server-side for agents, so\nthe message key never leaves the server and never lands on your machine.\n\n## What your agent may and may not do\n\nChatVia enforces all of this server-side, so a stolen token is bounded:\n\n| | |\n|---|---|\n| Reply in a chat it is already in | yes |\n| Message you first | yes — 6 per hour, and you can switch it off |\n| Message anyone else first | **no** — the frame has no recipient field |\n| Post in a group unprompted | **no** — only within 10 minutes of an @-mention |\n| Read your chat history | **no** — it only sees messages sent while connected |\n| Change your profile, or delete anything | **no** |\n\nIf you revoke the token in Settings → Agents, the agent stops immediately. Being\nsuspended or banned revokes it too.\n\n## Troubleshooting\n\n### \"gateway port 18789 is still busy before restart\"\n\nYour agent is almost certainly fine. Check ChatVia first — if the agent shows as\nconnected, the pairing worked and you can ignore this. Only the *restart* step\nfailed, and a restart is not needed after a fresh install.\n\nIf you do need to restart it, the usual cause on Windows is WSL. WSL mirrors\nlocal ports into its virtual machine, and that mirror keeps hold of port 18789\neven after OpenClaw stops, so the restart gives up waiting for the port. Run:\n\n```bash\nwsl --shutdown\n```\n\nthen retry. If you would rather leave WSL alone, put OpenClaw on another port:\n\n```bash\nopenclaw gateway --port 18790\n```\n\n<details>\n<summary>Why this happens</summary>\n\nA port has a separate IPv4 and IPv6 side. OpenClaw's gateway binds the IPv4 one\n(`127.0.0.1:18789`); WSL's relay, `wslrelay.exe`, binds the IPv6 one\n(`[::1]:18789`). OpenClaw lists busy ports with `netstat -ano -p TCP`, which\nreports IPv4 only — so it cannot see the WSL listener, cannot name it in the\nerror, and cannot stop it. It just waits for a port that never frees.\n\nConfirm it with:\n\n```bash\nnetstat -ano | findstr 18789\n```\n\nTwo `LISTENING` rows — one `127.0.0.1`, one `[::1]` owned by a different PID —\nis this exact case. `wsl --shutdown` releases the second one.\n\n</details>\n\n## Development\n\n```bash\nnpm install\nnpm test\n```\n\nThe tests run against a stub gateway and pin the wire protocol, the reconnect\ncursor, the pairing-code exchange, and the \"do not retry a revoked token\" rule. They do **not** prove\nintegration with a real OpenClaw runtime — that needs OpenClaw installed and is a\nmanual check.\n\nRuns straight from TypeScript source with no build step, so the code avoids\nsyntax Node's type-stripping cannot handle (notably constructor parameter\nproperties).\n","readmeFilename":"README.md"}