{"_id":"@dylanrussell/agent-router","_rev":"17-56dcd0bc693bd7c27dfdde673cc04b58","name":"@dylanrussell/agent-router","dist-tags":{"latest":"2.2.0"},"versions":{"1.0.0":{"name":"@dylanrussell/agent-router","version":"1.0.0","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.0.0","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"ac0a920e3c2e69513ffa8e9d37521b11e23b3f92","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.0.0.tgz","fileCount":13,"integrity":"sha512-YN0Vu8SkJ9zzt8rIhCVl41/BT/fomxnPOq5VaPIc+/byZeqh9lbMKZacjC0EnW5RqGGv42E5L9zr8EXjRHUImg==","signatures":[{"sig":"MEUCIFtcYZMM5uOy2CSbRLoYwug5TTID5Ccn+wKNw9XL0v/FAiEAriIFXRQRDaQWg0Ug4nmu+Hm/8b8aHjEpWtI+LJEj47Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":412950},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"f20380887b58614876f8cdc1fe00522072fd9b9d","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"dylanrussell","email":"dyl.russell@gmail.com"},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.12.1","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"cac":"^6.7.14","zod":"^4.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"peerDependenciesMeta":{"@opencode-ai/plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.0.0_1783550671082_0.773789201334826","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@dylanrussell/agent-router","version":"1.0.1","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.0.1","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"b063fdeffa7a539e904e8fefd76ca1fc9d434546","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.0.1.tgz","fileCount":13,"integrity":"sha512-64w96bdJOB077wnkkyCxA7ELl7Rzdo7Io8ipOk1a+5WRX8gVjut1FfvP2uj2rmNaiaRuAH+i6mz1PldDMBMrug==","signatures":[{"sig":"MEQCIC9LwOfJaaRvbFc0wNFlA6YKkGGxX0QPkRyzLeeL1smUAiBpLJfV53lq/7QOELfv8TG6ZPgpTb82ungjow/1Hbe/3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4911505},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"2c7c0d1e28c4b1c30af2a73644b5f2417cd8cf74","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.18.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"peerDependenciesMeta":{"@opencode-ai/plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.0.1_1783553468159_0.8588939130191688","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@dylanrussell/agent-router","version":"1.0.2","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.0.2","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"edb6570a7b8271b11d42b3f3e3656b1dab5a3824","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.0.2.tgz","fileCount":13,"integrity":"sha512-REXHnGZIlSHA5NjKALDkJatVimyvRyXD5R8L6HvbbvAfV+h40pVWT8NFDBqt47aO+ENF9kfD8Bn9omBRbLZY0g==","signatures":[{"sig":"MEUCIEjy5DBMB+aBYV6dmMqoozc5o+VDyA1pPvfXmqc9fYm4AiEAqiNV/OXcPoePz6v87enEngRPTgyKnypMVVier9Pw6ds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4911786},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"bbac5c9f95df79519399112bb9c71ce7e4baab36","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.18.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"peerDependenciesMeta":{"@opencode-ai/plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.0.2_1783556580364_0.4454170604518284","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@dylanrussell/agent-router","version":"1.0.4","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.0.4","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"13be4569dd0261c6f47537e174d7f2b00a7aa50a","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.0.4.tgz","fileCount":13,"integrity":"sha512-ZKDhFvg04+EIYGt2ZnJdXZrJEMrWjGP8Qd5kbg2MTP3kPuSbnao7bykMsWrpx8Ij8byjtK487isJcwG4qwZsaw==","signatures":[{"sig":"MEQCIGbxIqTP+7q6yLdeg6AiDGunQq9fFaxA08iNNb5zy5JnAiBwf4Njn8isGEUw5fF9xYxn+cj+Sxzcjbt1o9sKtBuyEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4917844},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"03890b07243873c68c42b7c3950614e7f1ebf77b","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.18.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"peerDependenciesMeta":{"@opencode-ai/plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.0.4_1783575641676_0.2900828441346852","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@dylanrussell/agent-router","version":"1.0.5","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.0.5","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"7944e15ba500485725a951c7a18b586c16be2054","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.0.5.tgz","fileCount":13,"integrity":"sha512-6BgRl0Gik8NIF1u3dFtLS1MWeb83BVux5J/8DkosUqcWuSjW0sTKxUMI4SL0rCLm2cUgMhGLRfuRyqwuQbnANQ==","signatures":[{"sig":"MEYCIQDcqvIU+lf5mdQ4ZbSG/O3YxqARGEMnzwD17G2TqPpHaQIhAKj/BmmzVbLdY1BjPpXR6mbfHWlWMRFr1wkVzX5BhoeC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4918001},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"d231917dbcab0c9e04310a5e9a4b38411b6c2da9","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.18.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"peerDependenciesMeta":{"@opencode-ai/plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.0.5_1783576650236_0.7762791916229512","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@dylanrussell/agent-router","version":"1.0.6","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.0.6","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"7db4aee951ae95039b2fb9c6d2a8c0069c225c6d","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.0.6.tgz","fileCount":13,"integrity":"sha512-zO0UvwVWdtmxdN0wretqGPCLL09JS2XLcSwuxcgagHx3xXJWbgZzS+6nEhs8Q9aV+x5sYKuHTApM3Ny2VwdseQ==","signatures":[{"sig":"MEQCIBYe/7bRkEURKdP+PujYfLdOR/ZXa0g1h0LYADb1SYC+AiB3b921lsGQZlinTId16JJgSSAeHsCSt2YFWzPwSQvjzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@1.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4915037},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"c9b4f5e175a2ed0b4df0d3650bd4a9b9411cb043","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.18.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"peerDependenciesMeta":{"@opencode-ai/plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.0.6_1784170038418_0.5923765676362625","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@dylanrussell/agent-router","version":"1.0.7","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.0.7","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"ce125e73ea171f59652c63cf58b8ee5d21405c26","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.0.7.tgz","fileCount":13,"integrity":"sha512-EmQ5duUP+EZtvE/sFMMBvyJX1DwZZZEcbkF7e3thmi6ofblwJp6XvtsLX514W8k1MD+/8r2RdijOzY+0s3IKBw==","signatures":[{"sig":"MEUCIB4srRsPItW9EQ9Tj98ZDTfam9eTsTU0mRtvBg9ipaCTAiEAhsNe9G5/43OdFr8/UA8jFk+dxrCK/9P2t5Z6apNerBk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@1.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5039750},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"9b6904c8dfdfcf02d6c381cd061d0c8c6c433bd2","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.18.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"peerDependenciesMeta":{"@opencode-ai/plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.0.7_1784324244013_0.3910615100379313","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@dylanrussell/agent-router","version":"1.1.0","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.1.0","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"c72739e2db4727add76c33922b1fd222e8acbcfc","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.1.0.tgz","fileCount":13,"integrity":"sha512-XGAxCve+Fuq9iwgSjjYNQZU3d09OWhZo9xqlFialp5C4BACKLh/FVgmgXU4CZwEhXbwpNHtUJh2zhGReH5ABLw==","signatures":[{"sig":"MEYCIQCpKSgND52UUnRqodip8nFOj6qC1sYfKH1Y9mC9YlXRgAIhAJZSqzPx24jdYUoS8nhftTndDCH3YlThnUCjhDTZFyux","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5083414},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"4cd7be392d8aba108d98bc967afdb189fbcecddc","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.19.1","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"peerDependenciesMeta":{"@opencode-ai/plugin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.1.0_1789284465522_0.9551375455119415","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@dylanrussell/agent-router","version":"1.1.1","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.1.1","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"0cea5e880a69db87faa190efa41f3197540e43dc","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.1.1.tgz","fileCount":13,"integrity":"sha512-qI//XukHBWog6NBZpAf1WpAnsx1++ci0uNQ7i5GeAtQIsN9IumLlKeK/GW7lfkOouom34j3eSfORZhWgoHg50g==","signatures":[{"sig":"MEQCIG2idBisGghPTSP1NMsulXf6nPj88v/qoRuFmUC9hZE9AiBY86LGYNSI2D+AZhMmB6/phIyon0b4tKvr3qOpWOIXHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5087114},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"6ff6d35c4c3ce022e0a0e0e24e42058268b5c3ae","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.19.1","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.1.1_1789554903959_0.05563329364614611","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@dylanrussell/agent-router","version":"1.1.2","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@1.1.2","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"769102f8f2636865228bf7309d554e70df4973cf","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-1.1.2.tgz","fileCount":13,"integrity":"sha512-udzSFh6VDNm+ICVw8KQlqCGCUk9V9h1PQnhkriL4MrGg1wrzut/+uwyH4KUStguBcZFoUFG2d+m+gqeTDkhRhQ==","signatures":[{"sig":"MEQCIA7L/6zkylAoV+aVSUm8ecrzWs5Q+uWdYqBYASXNKB7UAiAl2LuLoHRt8e7MweV0ZHs9fBNJ2FmdRIH8X746zYHljA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5087154},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"1450bf272c199509983cca041551cbc80d6dd21f","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.19.1","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode-ai/plugin":"^1.17.15","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode-ai/plugin":"^1.14.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-router_1.1.2_1789557367629_0.7586301202326657","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@dylanrussell/agent-router","version":"2.0.0","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@2.0.0","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"4cbe5316e370a55e24e10dfcd82a3224d8f8d1ca","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-2.0.0.tgz","fileCount":16,"integrity":"sha512-UVseXh5W83NcjhaSpyeqWFmZb3DlKv+lbO7WiSc4q7CD3vkOhYfCZ7RjBCQ1C6EmLK3rsRzSCW8soMTc46uJ9g==","signatures":[{"sig":"MEYCIQDrSFILX9QhPr7ZzRHE4mnfx1xEaOwGIi4sdaHb4ubBEAIhAI9gexmf6tJNIbqF59+TK0TrhgyfM+NBygBLaW+dKUlr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHS+rrsgRfCaOH4Qsvp2ItCRcmqjex7rYdAuUMZeCRAVAiEAhA+7zYhwvDRF4Ku7lpWmZ8QInd+ERjYAg+jepgLS2j4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5140456},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":">=6.4.2","esbuild":">=0.25.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"5b335a89ac1f8683de1abca10fc2b11e7dfaaa86","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test","test:integration":"node scripts/smoke-v2.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.19.1","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode/plugin":"2.0.8","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"@opencode/plugin":"2.0.8"},"_npmOperationalInternal":{"tmp":"tmp/agent-router_2.0.0_1789948110330_0.4953833692175331","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@dylanrussell/agent-router","version":"2.0.1","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@2.0.1","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"8bd010a86127ac67f1329f71bf907beaa560524c","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-2.0.1.tgz","fileCount":16,"integrity":"sha512-do+hGhmDzzKzUt5tzr9iwqDW+wbZGwuFc3hjKbPbz5p/t0GZVTuFIyc96nDa3WhhqxoCZYbV1bQAG/c7bOS5Sw==","signatures":[{"sig":"MEYCIQDPN0ZDv1exOhsSQ9WCa/HVQQliOR5FQRqhYJQ0oFLX7wIhAJ0tIPCvnNLssKa8zY7TwuNvLVhrAtHASb3KDPHd1lD0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCc/x9zk0kvX3p7UQZCcdKKLCCc6kFsfQKMI6Do+gwBJQIhAPnDdEI2Up90/NgGs+uypqmbGxffjE9+oWn1LKjWDY1l","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dylanrussell%2fagent-router@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5142577},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":"^8.0.16","esbuild":"^0.28.1","postcss":"^8.5.23","nanoid@3":"^3.3.18","@opentelemetry/core":"^2.8.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"162ee3b3632671616a054537bd3b05c23225c876","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test","test:integration":"node scripts/smoke-v2.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975dded0-42e8-4ac0-b616-0769e07a3032"}},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.19.1","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vite":"^8.0.16","vitest":"^4.1.11","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode/plugin":"2.0.8","@vitest/coverage-v8":"^4.1.11"},"peerDependencies":{"@opencode/plugin":"2.0.8"},"_npmOperationalInternal":{"tmp":"tmp/agent-router_2.0.1_1789949943844_0.2129144325985466","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@dylanrussell/agent-router","version":"2.0.2","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@2.0.2","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"188a8b2d6dc30cc3a6837ad668e934819a529c65","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-2.0.2.tgz","fileCount":16,"integrity":"sha512-EhTaX5rPc2FqFmy8TUawRmr89L07hO7x/H2J4b9s9IUtGC6fC/G0GL2pEZNi0SUjHyZ3Y75wTQ8CaLzvU8TFTw==","signatures":[{"sig":"MEUCIQDwLxgo5gNRSnrtK9hrL08qP3Rq9KFyGB24tsMArX2kugIgIROUt9SOnRQSvXnP6CBVKfZ5iWNXOwaU9/vnIXHMhXg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBxtYvFBFIy08p/mKQgaj/N0Z6M3Zvyt0wdoQE7T3/g0AiB8LwnedNJ8DQUzEqg6hqT2e3ddKP4Ad1evpOXlN9jCGw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5148356},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":"^8.0.16","esbuild":"^0.28.1","postcss":"^8.5.23","nanoid@3":"^3.3.18","@opentelemetry/core":"^2.8.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"bc10c87ab302ff5e6fe73df2198d0138c22d485c","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test","test:integration":"node scripts/smoke-v2.mjs"},"_npmUser":{"name":"dylanrussell","email":"dyl.russell@gmail.com"},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.16.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vite":"^8.0.16","vitest":"^4.1.11","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode/plugin":"2.0.8","@vitest/coverage-v8":"^4.1.11"},"peerDependencies":{"@opencode/plugin":"2.0.8"},"_npmOperationalInternal":{"tmp":"tmp/agent-router_2.0.2_1790001677148_0.8905747672116933","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@dylanrussell/agent-router","version":"2.1.0","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@2.1.0","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"01e469434e93a0fa6ad001ddf4ec00888bb48067","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-2.1.0.tgz","fileCount":16,"integrity":"sha512-BOcuCvA9oSbo3s+I3atFW4Y/SKNk6bBcaOX21UFtu2/r0cXnqyA/+yyfcY6Zazm7glK33x4FO7VAtzXIy+TGpg==","signatures":[{"sig":"MEUCIQDAzZL0K9MtYsW8LaRJ2zkk8oJJfKOoA2KsiwXlO4twCAIgdwrnDynS4XHA+yGvzXfMZ1vZLt4CW8Yz47wmmVSRa0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHtQwUCoc44ifNeWSp+x40GkAuX02ISGAS2VmtjIcydNAiBFRWeQOMrhzp8ghdjouDsRzMXPFEkMg3dmYvlc9GZptg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5212833},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":"^8.0.16","esbuild":"^0.28.1","postcss":"^8.5.23","nanoid@3":"^3.3.18","@opentelemetry/core":"^2.8.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"005321b01fff64e3fa685e4476a643b41ba02e41","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:quota":"node scripts/smoke-quota-v2.mjs","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test","test:integration":"node scripts/smoke-v2.mjs"},"_npmUser":{"name":"dylanrussell","email":"dyl.russell@gmail.com"},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.16.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vite":"^8.0.16","vitest":"^4.1.11","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode/plugin":"2.0.8","@vitest/coverage-v8":"^4.1.11"},"peerDependencies":{"@opencode/plugin":"2.0.8"},"_npmOperationalInternal":{"tmp":"tmp/agent-router_2.1.0_1790034364950_0.3988369416969768","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@dylanrussell/agent-router","version":"2.1.1","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@2.1.1","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"aea9f0ff52bfa765a28da3e0a3e7b2561ef8d318","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-2.1.1.tgz","fileCount":16,"integrity":"sha512-boq3ha+7hRwjpM0caSVojn4z9lI6UjcQq1+v9ZH0cNtmIbCeyYdETvDuPgq7hAoi/Qk4mWJ3n/rOGd6tCMkLPA==","signatures":[{"sig":"MEQCICoZFs01v+Ue/GbDz5I5VFyXy4aoqXTc1VLUMKvslDI+AiAVOjF36Jofj75h+VmSrSSNXFQKXvYGsvfzD+Iv94F+4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDrmavYz3PBVXQHZLnLUE18RAO50iZ+jREQ3F+YnbzGmgIhAKCHS0H7YrRPleA5x5Wm6BJ5JQVoeFz3Re0RHJBD9ybT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5226624},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":"^8.0.16","esbuild":"^0.28.1","postcss":"^8.5.23","nanoid@3":"^3.3.18","@opentelemetry/core":"^2.8.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"ef09616c65447aa5ceb95107cc95145f0a8bbe58","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:quota":"node scripts/smoke-quota-v2.mjs","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test","test:integration":"node scripts/smoke-v2.mjs"},"_npmUser":{"name":"dylanrussell","email":"dyl.russell@gmail.com"},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.16.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vite":"^8.0.16","vitest":"^4.1.11","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode/plugin":"2.0.8","@vitest/coverage-v8":"^4.1.11"},"peerDependencies":{"@opencode/plugin":"2.0.8"},"_npmOperationalInternal":{"tmp":"tmp/agent-router_2.1.1_1790041899768_0.99765040106276","host":"s3://npm-registry-packages-npm-production"}},"2.1.2":{"name":"@dylanrussell/agent-router","version":"2.1.2","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"author":{"name":"Dylan Russell"},"license":"MIT","_id":"@dylanrussell/agent-router@2.1.2","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"homepage":"https://github.com/dylanrussellmd/agent-router#readme","bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"bin":{"agent-router":"dist/cli.js"},"dist":{"shasum":"a3502c81e42c6008a1849f88e9a4c8bf731cedb3","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-2.1.2.tgz","fileCount":16,"integrity":"sha512-eA8J5XRQzx2a+1rPzWyjitHKoru5ZqJtSaJnDAJwE0FVVc4FgjAJR4W0Pkm67l97ZOq4FZRsjqJM0VoQPvP12g==","signatures":[{"sig":"MEUCIQCTuA20VpEoCDRgqmqcPfxfUPZLecHgfEMOMlhLqpL1KAIgR0YdTlKRQoSzssTYaiZBN0kxU6MUt7YClEHo4OxCPeU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDTO5iiGnkh0eN45eGJSGPeAB78PMg8hYXuNh5TuU+ujAiAg+amKnMZ469mzg6DhTsqQkxKoRN+6O/y6kYpLoan79Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5226172},"main":"./dist/plugin.js","pnpm":{"overrides":{"uuid":">=14.0.0","vite":"^8.0.16","esbuild":"^0.28.1","postcss":"^8.5.23","nanoid@3":"^3.3.18","@opentelemetry/core":"^2.8.0"}},"type":"module","types":"./dist/plugin.d.ts","module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"c667022ca1dcd7fcc7b6d4504e1badc1da6a20bf","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:quota":"node scripts/smoke-quota-v2.mjs","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test","test:integration":"node scripts/smoke-v2.mjs"},"_npmUser":{"name":"dylanrussell","email":"dyl.russell@gmail.com"},"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.16.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vite":"^8.0.16","vitest":"^4.1.11","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode/plugin":"2.0.8","@vitest/coverage-v8":"^4.1.11"},"peerDependencies":{"@opencode/plugin":"2.0.8"},"_npmOperationalInternal":{"tmp":"tmp/agent-router_2.1.2_1790042572233_0.05760110521566442","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"_id":"@dylanrussell/agent-router@2.2.0","bin":{"agent-router":"dist/cli.js"},"bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"dist":{"shasum":"7dde9412afb92b6a79d840e57658e6c487dd8845","tarball":"https://registry.npmjs.org/@dylanrussell/agent-router/-/agent-router-2.2.0.tgz","fileCount":16,"integrity":"sha512-POercpnsPQeQToUEZaEu8msQQfpZtRPqcfJYhO43ZjmtnsuMvEbBksRL4+37pAkYSrLHVfjucliSvFSys9DpDw==","signatures":[{"sig":"MEUCIGE5FqZQOSJ/kX+HY9xYL2rXf/8JWHks8VZFvk/zZdxnAiEAyEpTaqq++RC1g8HLlJen8amf4CnAG6eTZsFLL7nuPaY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDOBBRm9h0N5PiXULbEdCs4NJ3G2EpaGzmcrfNx7mWDHwIhAMgn+TkDBJ9EKJUsAtC7NTxcuRTDB3c/qH0HSbkaQR3l"}],"unpackedSize":5276470},"main":"./dist/plugin.js","name":"@dylanrussell/agent-router","pnpm":{"overrides":{"uuid":">=14.0.0","vite":"^8.0.16","esbuild":"^0.28.1","postcss":"^8.5.23","nanoid@3":"^3.3.18","@opentelemetry/core":"^2.8.0"}},"type":"module","types":"./dist/plugin.d.ts","author":{"name":"Dylan Russell"},"module":"./dist/plugin.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/plugin.d.ts","import":"./dist/plugin.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./tui":{"types":"./dist/tui.d.ts","import":"./dist/tui.js"}},"gitHead":"d579e2e11b308870368d66525b186b359d092cfd","license":"MIT","scripts":{"lint":"biome check src tests","test":"vitest run --coverage","build":"tsup","format":"biome format --write src tests","version":"node scripts/sync-version.mjs && git add src/version.ts","lint:fix":"biome check --write src tests","test:cli":"vitest run tests/cli","test:unit":"vitest run tests/unit","typecheck":"tsc --noEmit","test:quota":"node scripts/smoke-quota-v2.mjs","test:watch":"vitest","test:plugin":"vitest run tests/plugin","prepublishOnly":"npm run lint && npm run typecheck && npm run build && npm run test","test:integration":"node scripts/smoke-v2.mjs","test:quota-fallback":"ROUTER_PRODUCTION=1 node scripts/probe-quota-retry.mjs"},"version":"2.2.0","_npmUser":{"name":"dylanrussell","email":"dyl.russell@gmail.com"},"homepage":"https://github.com/dylanrussellmd/agent-router#readme","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"_npmVersion":"11.16.0","description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","directories":{},"maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cac":"^6.7.14","tsx":"^4.21.0","zod":"^4.0.0","tsup":"^8.5.1","vite":"^8.0.16","vitest":"^4.1.11","typescript":"^5.6.0","@types/node":"^20.14.0","@biomejs/biome":"^1.9.4","@opencode/plugin":"2.0.8","@vitest/coverage-v8":"^4.1.11"},"peerDependencies":{"@opencode/plugin":"2.0.8"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agent-router_2.2.0_1790045442548_0.2840998600664706"}}},"time":{"created":"2026-07-08T22:44:30.996Z","modified":"2026-09-22T02:50:42.812Z","1.0.0":"2026-07-08T22:44:31.238Z","1.0.1":"2026-07-08T23:31:08.334Z","1.0.2":"2026-07-09T00:23:00.580Z","1.0.4":"2026-07-09T05:40:41.861Z","1.0.5":"2026-07-09T05:57:30.421Z","1.0.6":"2026-07-16T02:47:18.604Z","1.0.7":"2026-07-17T21:37:24.202Z","1.1.0":"2026-09-13T07:27:45.696Z","1.1.1":"2026-09-16T10:35:04.099Z","1.1.2":"2026-09-16T11:16:07.831Z","2.0.0":"2026-09-20T23:48:30.435Z","2.0.1":"2026-09-21T00:19:03.998Z","2.0.2":"2026-09-21T14:41:17.280Z","2.1.0":"2026-09-21T23:46:05.054Z","2.1.1":"2026-09-22T01:51:39.872Z","2.1.2":"2026-09-22T02:02:52.332Z","2.2.0":"2026-09-22T02:50:42.647Z"},"bugs":{"url":"https://github.com/dylanrussellmd/agent-router/issues"},"author":{"name":"Dylan Russell"},"license":"MIT","homepage":"https://github.com/dylanrussellmd/agent-router#readme","keywords":["opencode","opencode-plugin","agents","model-router","llm-router"],"repository":{"url":"git+https://github.com/dylanrussellmd/agent-router.git","type":"git"},"description":"Switch the models assigned to your opencode agents. Named stacks applied to agent frontmatter. Plugin + CLI.","maintainers":[{"name":"dylanrussell","email":"dyl.russell@gmail.com"}],"readme":"<div align=\"center\">\n\n<img src=\"./assets/logo.svg\" width=\"128\" alt=\"agent-router logo\" />\n\n# agent-router\n\n**Switch the models assigned to your opencode agents.**\nNamed stacks applied to agent frontmatter · one command, one restart, new model crew.\n\n[![npm version](https://img.shields.io/npm/v/@dylanrussell/agent-router.svg?color=06b6d4&label=npm&logo=npm&logoColor=white&style=flat-square)](https://www.npmjs.com/package/@dylanrussell/agent-router)\n[![npm downloads](https://img.shields.io/npm/dm/@dylanrussell/agent-router.svg?color=06b6d4&label=downloads&style=flat-square)](https://www.npmjs.com/package/@dylanrussell/agent-router)\n[![license](https://img.shields.io/npm/l/@dylanrussell/agent-router.svg?color=06b6d4&style=flat-square)](./LICENSE)\n[![node](https://img.shields.io/node/v/@dylanrussell/agent-router.svg?color=06b6d4&logo=node.js&logoColor=white&style=flat-square)](https://nodejs.org)\n[![CI](https://img.shields.io/github/actions/workflow/status/dylanrussellmd/agent-router/ci.yml?branch=main&label=CI&logo=github&logoColor=white&style=flat-square)](https://github.com/dylanrussellmd/agent-router/actions/workflows/ci.yml)\n[![types: TypeScript](https://img.shields.io/badge/types-TypeScript-3178C6.svg?logo=typescript&logoColor=white&style=flat-square)](https://www.typescriptlang.org)\n[![tested with vitest](https://img.shields.io/badge/tested%20with-vitest-FCC72B.svg?logo=vitest&logoColor=black&style=flat-square)](https://vitest.dev)\n\n[Install](#install) · [Quickstart](#quickstart) · [Stacks](#stacks) · [In the TUI](#in-the-tui) · [FAQ](#faq) · [Issues](https://github.com/dylanrussellmd/agent-router/issues)\n\n</div>\n\n---\n\n## What it does\n\nopencode agents are markdown files (`~/.config/opencode/agents/*.md`) whose YAML frontmatter carries a `model:` line:\n\n```markdown\n---\ndescription: High-reasoning review, debugging, and architecture counsel\nmode: subagent\nmodel: anthropic/claude-opus-4-8        # ← agent-router rewrites this\nreasoningEffort: high                   # ← and any option keys a stack names\ntemperature: 0.1\ntools: { write: false, edit: false }\n---\n<prompt body — owned by you, never touched by agent-router>\n```\n\n`agent-router` keeps named **stacks** — JSON files mapping agent names to models (and optionally to provider options) — and applies them to those frontmatter lines on demand. Premium models for the workday, cheap ones for bulk chores, one command to swap the whole crew:\n\n```json\n{\n  \"agents\": {\n    \"Omni\":      { \"model\": \"anthropic/claude-fable-5\" },\n    \"oracle\":    { \"model\": \"openai/gpt-5.5\", \"reasoningEffort\": \"high\" },\n    \"explorer\":  { \"model\": \"openai/gpt-5.4-mini\" },\n    \"librarian\": { \"model\": \"openai/gpt-5.4-mini\" },\n    \"fixer\":     { \"model\": \"openai/gpt-5.5\", \"thinking\": { \"effort\": \"low\" } }\n  }\n}\n```\n\nThe prompt body and opencode framework keys (`description`, `mode`, `permission`, `tools`, …) are yours; agent-router rewrites only the `model:` line and the option keys a stack entry names, atomically, through symlinks (dotfile-manager setups survive intact).\n\n```\n~/.config/opencode/\n├── agents/                     ← your agent .md files (the live target)\n└── agent-router/\n    ├── state.json              ← {active, previousActive, …}   (machine state)\n    ├── stacks/\n    │   ├── premium.json        ← named stacks                   (your config)\n    │   └── cheap.json\n    └── history/                ← rolling 20 most-recent switches\n```\n\nStacks are config, history is state — point `stacksDir` somewhere dotfile-managed if you version your setup (see [Configuration](#configuration)).\n\n## Install\n\nVersion 2 targets **OpenCode 2.0.8**. Version 1 remains the legacy OpenCode release. See [release notes and operational limits](./CHANGELOG.md).\n\n```bash\nnpx -y @dylanrussell/agent-router init\n```\n\n`init` will:\n\n1. Capture your agents' current models into a first stack (`default`) and mark it active.\n2. Add `@dylanrussell/agent-router@latest` to the `plugins` array in `opencode.json` (backing it up first).\n3. Add the same entry to `cli.json` — this loads the sidebar + `/agent-*` commands.\n4. Remove the legacy `@dylanrussell/omo-router` plugin entry if present.\n\nThen **restart opencode** so it picks up the plugin.\n\nThe API peer is pinned to `@opencode/plugin@2.0.8`. OpenCode provides the terminal renderer at runtime. Both package entrypoints default-export V2 plugin definitions.\n\n## Quickstart\n\n```bash\nagent-router capture my-mix           # snapshot current frontmatter models as a stack\nagent-router list                     # show stacks; * marks active\nagent-router use cheap                # apply a stack (validates first)\nagent-router back                     # undo the most recent switch\nagent-router current                  # print the agent → model mapping in frontmatter\nagent-router status                   # print active stack name\nagent-router show cheap               # print a stack's JSON\nagent-router edit cheap               # open a stack in $EDITOR\nagent-router validate --all           # check model IDs and variants against the V2 catalog\nagent-router history                  # list recent switches\nagent-router import my-mix <file>     # import a stack from a file\nagent-router export my-mix <file>     # export a stack to a file\nagent-router rm my-mix                # remove a stack\nagent-router path                     # print all paths used (debugging)\nagent-router completion               # install shell autocompletion\n```\n\nThe everyday loop: tune your agents until you like them → `capture <name>` → repeat with other models → `use <name>` to swap between the results.\n\n## Stacks\n\nA stack file needs one thing: an `agents` record whose entries carry a `model` string. Agent names are the `.md` basenames in your agents dir (`Omni` ↔ `Omni.md`). Except for router-owned `fallbacks`, other keys on an entry are provider pass-through options (`reasoningEffort`, `thinking`, `temperature`, `topP`, `maxOutputTokens`, …) that opencode forwards to the model — agent-router transcribes these to the agent's frontmatter alongside `model:` and captures them back. Unknown keys are preserved round-trip.\n\n```json\n{\n  \"agents\": {\n    \"oracle\": {\n      \"model\": \"openai/gpt-5.5\",\n      \"reasoningEffort\": \"high\",\n      \"thinking\": { \"effort\": \"low\" }\n    }\n  }\n}\n```\n\n- **Apply** writes/updates only the option keys a stack entry names; options the stack omits are left in place. To **clear** an option, set it to `null` in the stack entry.\n- Reserved opencode framework keys (`description`, `mode`, `permission`, `tools`, `prompt`, `steps`, `color`, `name`) are never transcribed — a stack entry can't clobber them.\n- Option values serialize to a single frontmatter line: scalars bare (quoted only when needed), objects/arrays as JSON flow. Block-style values an apply replaces are collapsed to flow; `capture` parses them back into typed JSON.\n\n`use` is strict by design: if a stack references an agent file that doesn't exist, or one without a `model:` line, the switch fails **before anything is written**. It validates model IDs and variants against the V2 catalog first (skip with `--no-validate`, override with `--force-invalid`).\n\n`capture` is the inverse: it reads the current `model:` line and option keys of every agent file (files without a `model:` line are skipped) and writes a stack. There are no bundled seed stacks — your real setup is the seed.\n\n## Ordered Fallbacks\n\nOptional per-agent fallback chains select a model for the **next explicitly submitted user turn**, not an automatic retry of the failed turn. Enable by adding `fallbacks` to a stack, applying that stack, and restarting opencode with the server plugin loaded:\n\n```json\n{\n  \"agents\": {\n    \"oracle\": {\n      \"model\": \"openai/gpt-5.5\",\n      \"variant\": \"high\",\n      \"fallbacks\": [\n        { \"model\": \"anthropic/claude-sonnet-4-6\", \"variant\": \"low\" },\n        { \"model\": \"openai/gpt-5.4-mini\" }\n      ]\n    }\n  }\n}\n```\n\nModel IDs and variants above are illustrative; use models and variants supported by your providers.\n\n- `model` remains the primary. Primary `variant` is an optional nonempty string; `null` clears it on apply.\n- `fallbacks` is optional, or an array of 0 to 8 objects. Each object contains only `model` (non-whitespace `provider/model`) and optional `variant` (nonempty string). `null`, bare strings, unknown candidate fields, and longer chains are rejected.\n- Candidate order is preserved. Exact `(model, variant)` duplicates, including the primary, are skipped at runtime. An omitted fallback variant clears the previous candidate's variant.\n- Only model and variant change at runtime. Agent prompts, permissions, tools, and other provider options remain unchanged; ensure those options are compatible with every candidate.\n- Validation checks every primary and fallback ID and variant, reporting paths such as `agents.oracle.fallbacks.0.variant`. Server tools use the connected host catalog; the standalone CLI uses `opencode api model.list`. Catalog membership does not prove live provider health or quota. `validate --active` includes applied fallback metadata when its primary still matches frontmatter.\n- Failover does not rewrite frontmatter, stacks, history, or router state. `use` stores the applied chains in optional `state.json.fallbackAgents`. Old state files without that field remain valid and have no enabled chains until the stack is reapplied.\n- `capture` and displaced-history snapshots merge those applied chains with live frontmatter only when primary model and variant still match. Editing a stack alone does not alter applied metadata. Applying a stack without chains clears the applied chains, including agents omitted from that stack.\n- `back` retains its existing semantics: reapply a previous **named stack as it exists now**, not restore historical snapshot bytes. Runtime failover never adds a history entry.\n\n### Runtime Behavior And Limits\n\nThe V2 plugin watches `retry` hooks correlated with the admitted user turn, agent and selected model. A retryable HTTP **429, 500, 502, 503, or 504** stages the next candidate and vetoes the same-turn retry. Only primary model requests participate.\n\nAuthentication/permission errors, context overflow, content filtering, output-length errors, unknown errors, transport errors without an HTTP status, and ambiguous `session.error` notifications do not advance the chain. Router never classifies errors by substring matching.\n\nAfter a qualifying failure a server log names the next model and asks for an explicit retry/continue instruction. **Review partial output and completed tools before continuing.** The next `prompt` admission hook calls `session.switchModel`; it never submits a prompt. Chains advance monotonically, never wrap, and never replay prompts or tools.\n\nObserved interruption, explicit model/agent selection events, and an unexpected incoming model disable routing for that session. Router state changes disable startup routing at the next prompt admission. Restart to activate a newly applied stack.\n\nDuplicate failures advance only once per admitted user turn. Routing budgets are isolated by session and agent and bounded to 1,024 sessions. Subagents without user prompt admission are left alone.\n\n**Verified boundary:** compiled against the published **2.0.8** API types. Deterministic adapter tests cover next-turn selection, retry veto, auxiliary-request exclusion, variants, and no replay or persistent agent writes. These are not real-provider end-to-end tests. An LLM may choose to repeat a tool when explicitly asked to continue.\n\nOpenCode 2.0.8 exposes no atomic compare-and-switch in the prompt hook and no request kind in the retry hook. Concurrent manual selections/admissions or auxiliary requests remain host API limitations. The sidebar displays configured routing and highlights the current session selection, not pending fallback state. Terminal stack operations require local filesystem access; remote server filesystem management is not supported.\n\n### Opt-in quota preflight (phase 1)\n\nThe server plugin can consult the usage-tracker server's `direct-api-usage.query`\nRPC before each new explicit main-session prompt and each new native `subagent`\nstart. Configure the server plugin using the object form:\n\n```jsonc\n{\n  \"plugins\": [\n    {\n      \"package\": \"@dylanrussell/agent-router\",\n      \"options\": {\n        \"quotaPreflight\": {\n          \"enabled\": true,\n          \"allowPaidFallbacks\": false\n        }\n      }\n    }\n  ]\n}\n```\n\nBoth options default to `false`. Existing applied fallback chains supply candidate\norder; preflight never writes agent frontmatter, router state, or stacks. A staged\nreactive fallback has precedence on the next eligible admission, even when the\nprimary has available or unknown quota. Preflight checks that backup and later\ncandidates for known exhaustion. Otherwise, each eligible admission reconsiders\nthe configured primary. Retry hooks and same-turn retry behavior are unchanged.\n\n- Only fresh, account-and-scope-matched `exhausted` evidence skips a candidate.\n  An available or unknown primary remains the primary. Expired observations,\n  reached resets, unavailable methods, malformed replies, and timeouts are unknown.\n- After earlier candidates are exhausted, an unknown backup with a service-proven\n  subscription binding may be tried. Without that binding, selecting a backup\n  requires explicit `allowPaidFallbacks: true`, which permits potentially paid\n  configured backups. If no eligible candidate remains, selection is unchanged.\n- The usage service owns shared caching, bounded stale refreshes, credential\n  resolution, explicit Headroom/Go account bindings, and model-specific OpenAI\n  scope matching. Router receives opaque references and quota decisions only;\n  it neither polls providers nor infers account equivalence from provider names.\n- Quota queries have a 3-second caller deadline and at most 16 outstanding calls,\n  including timed-out calls that ignore cancellation. Excess admissions use\n  unknown evidence rather than joining a queue. Admission ownership is bounded\n  to 1,024 sessions and concurrent main admission checks to 64.\n- Explicit initial model selections and observable manual selections take priority,\n  including selections equal to the configured primary. Native child overrides\n  are checked before model resolution in `tool.execute.before`; resumed children\n  are excluded. Main sessions whose agent is unresolved are left native.\n- Automatic selection ownership is in memory. After plugin restart, a stored\n  model is conservatively treated as pinned; explicit pins also persist in\n  plugin-scoped server storage. A second session read and observed\n  selection events guard asynchronous admission, but the host offers no atomic\n  compare-and-switch.\n\n**Explicit session controls:** with preflight or quota fallback enabled, the server exposes three\nadditional tools. Pin/auto tools are for explicit user requests, under the host's\nnormal tool-permission policy. They take no model or session arguments; their\nscope is the calling session.\n\n- `router_pin` freezes the current selection, resolving the native agent/default\n  model when no selection is stored. It disables quota preflight and same-turn quota fallback, and clears staged\n  reactive fallback for this session. The pin persists in server plugin storage.\n  Pins share one durable value capped at 1,024 sessions across restarts. Serialized\n  writes prevent lost updates; session deletion removes its durable pin, including\n  when deletion races a pin write. Plugin cleanup drains dispatched pin writes.\n- `router_auto` clears the explicit pin and authorizes automatic routing on the\n  **next explicit user turn**. It neither switches the model nor sends a prompt.\n  Automatic ownership is not restored across plugin restarts: use this control\n  again to opt an existing selected session back in.\n- `router_routing_status` reports `automatic`/`pinned`, the current model, and a\n  concise reason. Admissions and controls also write concise server-log notices\n  such as `primary_unknown`, `known_exhaustion_fallback`, and\n  `staged_reactive_fallback`.\n\n**Picker boundary:** OpenCode 2.0.8 treats selecting the already-active model as a\nno-op and emits no selection event. Selecting an automatic fallback again in the\nstandard picker does **not** pin it. Explicitly request `router_pin` to freeze it;\nrequest `router_auto` when ready to resume automatic routing. Different-model\npicker selections remain observable and take priority.\n\n`npm run build && npm run test:quota` exercises the production router and a fake\nquota RPC on a private native 2.0.8 host, including true native child starts,\nfresh/exhausted/unknown/reset evidence, explicit pin/auto controls, staged 429/503\nprecedence, timeout, recovery, and tool continuation without midtask switching.\nIt explicitly reports the native same-model picker boundary.\n`scripts/probe-admission-v2.mjs` independently records\nnative admission/provenance behavior. Neither script contacts real quota APIs.\nSet `USAGE_TRACKER_SOURCE` to the usage-tracker source directory to run the same\nnative main/child checks with its actual RPC definition and quota implementation,\nusing synthetic credentials and direct-provider response fixtures. Service-side\naccount approvals belong in usage-tracker's `options.quotaBindings`, whose records\nuse `{ providerID, source, models, connection: { type, id }, approval }` for saved\ncredentials (`{ type: \"env\", name }` for environment connections). Router options\ndo not contain credentials or binding attestations.\n\n### Opt-in same-turn quota fallback (phase 2, native 2.0.8)\n\nConfigure this separately from `quotaPreflight` in the server plugin's `options`:\n\n```json\n{\n  \"quotaFallback\": {\n    \"enabled\": true,\n    \"allowPaidFallbacks\": true,\n    \"maxSwitches\": 8\n  }\n}\n```\n\nBoth booleans default to **false**. Phase 2 requires explicit paid-fallback approval\nbefore switching, including when quota-service bindings exist. `maxSwitches` is an\ninteger from 1 to 8 (default 8); only later entries in the configured chain are\neligible. Each explicit main-session admission and each newly admitted automatic\nchild gets its own budget, shared by all tool continuations in that turn. There is\nno wraparound. Confirmed, fresh, account-scoped exhausted backups are skipped;\nunknown or unavailable quota-service evidence does not block an approved backup.\n\nThe router requests a **native same-session retry** only for a structured\n`provider.quota` failure with matching HTTP 402/429 rejection evidence. It never\nsubmits another prompt, starts a replacement child, or retries a partial stream.\nAuthentication, timeouts, generic rate limits, 5xx, WebSockets, auxiliary requests,\nand unsupported endpoints are ineligible. Existing reactive next-turn handling\ncontinues to apply to its qualifying non-quota errors. Disabling phase 2 preserves\nthe previous retry policy.\n\nCorrelation is deliberately conservative: exact request-object identity,\nagent/model/variant and admission generation, configured base URL plus a recognized\n`/chat/completions`, `/responses`, or `/messages` operation, no URL credentials or\nquery, single-use evidence, and a five-second monotonic expiry. Observations are\nbounded to 1,024 sessions and periodically pruned; no response bodies are read.\nConcurrent observations and any auxiliary traffic poison the admission, including\nan auxiliary HTTP 200 that may still be streaming. Capacity exhaustion fails closed.\nExpiry removes retry permission but retains an unresolved/ambiguous-request\ntombstone until the admission ends or a new admission replaces it. Quota RPC\ncandidates contain only provider/model IDs; configured variants remain attached\nto the eventual model selection.\n\nExplicit main model selections, original child model overrides, and resumed child\ntasks are not claimed merely because their models match a chain. Automatic child\nownership requires a fresh admission ticket, a unique running parent tool call,\nmatching parent/agent/model, and a matching digest of the native child's initial\nuser message. Parent tool metadata is checked when available. Tickets expire after\nfive seconds; ambiguous concurrent child admissions are skipped. Neither prompt\ntext nor response bodies are retained in this correlation state.\nNative metadata binding the child to a different parent call vetoes fingerprint\nmatching. Ticket overflow disables new automatic child claims until plugin reload,\nincluding claims already awaiting host reads; dropping negative evidence cannot\nmake a child eligible.\n\n**Accepted host limits:** native 2.0.8 retry hooks lack request ID, request kind,\noutput-started, cancellation, and atomic switch-and-retry fields. Correlation and\nobservable manual/cancel guards are therefore best effort, not transactional\nguarantees. Same-model picker no-ops remain unobservable; use `router_pin`.\nA later retry-hook veto can leave the backup selected without dispatching it.\nThe router does not roll back that selection, which could overwrite a newer user\nchoice. Status/log reasons distinguish\n`quota_fallback_selected_retry_requested_not_confirmed` from\n`quota_fallback_attempt_dispatched`; the latter observes the HTTP request hook,\nnot provider acceptance or successful completion.\n\nAfter building, `npm run test:quota-fallback` runs the production router in a\ndisposable native 2.0.8 host with synthetic local providers. Set\n`ROUTER_PREFLIGHT=1` to exercise both opt-ins together. The fixture verifies first\nquota rejection, main/child post-tool continuation with a durable counter of one,\nchain exhaustion, partial stream, explicit selections, manual/cancel/pin gates,\ncompaction, attribution, and the accepted later-veto residual selection. Its\ntimeout control vetoes native timeout retries only after recording router policy.\nNo real inference or credentials are used.\n\n### Install This Checkout\n\nTo test a local V2 checkout, run `npm run typecheck`, `npm test`, and `npm run build` (a fresh checkout uses `pnpm install --frozen-lockfile`). Replace the registry entry in the server `opencode.json` **plugins** array with the package directory:\n\n```json\n\"file:///absolute/path/to/agent-router\"\n```\n\nUse the same package directory in `cli.json` **plugins** when explicitly registering the terminal half. Do not load both registry and local copies. The local CLI is `node /absolute/path/to/agent-router/dist/cli.js`. Applying a stack still requires restarting OpenCode; inspect server logs for next-turn fallback notices.\n\nOpenCode 2.0.8 ignores package exports for local directories. Root `index.ts` and `tui.ts` wrappers load the built files; run `npm run build` before using the source directory.\n\n`npm run test:integration` starts an isolated real OpenCode 2.0.8 server, initializes its location, verifies router activation and terminal discovery, and exercises a disposable RPC probe with absent, null, and invalid input. It uses temporary HOME/XDG/router directories and never modifies live configuration. Set `AGENT_ROUTER_TEST_PACKAGE` to an unpacked tarball directory to test release contents. Router itself exposes tools, not RPC methods.\n\n## Inside opencode\n\nThe plugin exposes six tools the agent (or you, by asking it) can call:\n\n| tool | what it does |\n|---|---|\n| `router_status` | active stack + current frontmatter mapping + available stacks |\n| `router_list` | stack list with `isActive` flags |\n| `router_use({name, validate?})` | apply a stack; pops a TUI toast |\n| `router_capture({name, force?})` | snapshot current models into a stack |\n| `router_back({n?})` | undo last N switches |\n| `router_validate({name?, active?})` | check model IDs against current opencode auth |\n\n> *\"Switch to cheap\"* — your agent calls `router_use`, the toast pops up, you restart opencode.\n\n## In the TUI\n\nThe V2 terminal half loads from the package's `./tui` export (`cli.json`, wired up by `init`):\n\n- **Sidebar panel** — lists available stacks with the active one checked. Under **Current Stack**, each agent has one indented model per line, in precedence order, without Primary/Fallback labels. Explicit variants appear in brackets; full model IDs wrap rather than truncate. A `⟳ restart required` badge appears when the active stack differs from the one at TUI startup. File changes update live (≤1.5s).\n- **Current selection** — every agent's selected model is highlighted in the warning/orange color at normal font weight with `●`. Headings show only the agent name. Selection prefers the viewed session, then running direct children at the same location, then the native agent default, then the stack default; conflicting active children retain multiple distinct selections. Out-of-chain selections are shown separately. Configured chains still come from the active stack file, not the applied `state.json.fallbackAgents` snapshot. Editing a stack changes the preview but does not apply it: use the stack and restart opencode to activate changes. Default highlights do not imply a running session or predict quota preflight.\n- **Routing visibility** — the native CLI has no connected routing-status transport yet, so mode/freshness are shown as unknown rather than inferred from model selection. Use `router_routing_status` for the current session's actual Automatic/Pinned state and reason.\n- **Commands** — type `/` or open the command palette:\n\n| command | what it does |\n|---|---|\n| `/agent-switch` (alias `/ar`) | pick a stack, validate, apply |\n| `/agent-view` | browse a stack's agent → model assignments |\n| `/agent-edit` | reassign a model, picking from your reachable model catalog |\n| `/agent-back` | confirm + revert to the previous stack |\n| `/agent-validate` | check a stack's model IDs against current auth |\n| `/agent-status` | toast the active stack + list |\n\nEverything degrades gracefully: on older opencode versions (or if the TUI API changes) the sidebar and commands simply don't appear — the CLI and agent tools keep working.\n\nDebugging the TUI half: `AGENT_ROUTER_TUI_DEBUG=/tmp/agent-router-tui.log opencode` writes a trace of the plugin's init steps.\n\n## Configuration\n\nPaths resolve in this order: explicit option → `config.json` → env var → default.\n\n`~/.config/opencode/agent-router/config.json` (read identically by the CLI and the plugin — the recommended place):\n\n```json\n{\n  \"agentsDir\": \"~/.agents/agents\",\n  \"stacksDir\": \"~/.agents/agent-router/stacks\"\n}\n```\n\n| setting | env var | default |\n|---|---|---|\n| agents dir | `AGENT_ROUTER_AGENTS_DIR` | `~/.config/opencode/agents` |\n| stacks dir | `AGENT_ROUTER_STACKS_DIR` | `${routerHome}/stacks` |\n| state home | `AGENT_ROUTER_HOME` (legacy `OMO_ROUTER_HOME`) | `~/.config/opencode/agent-router` |\n\n## ⚠ Things to know\n\n- **Restart required.** opencode reads agent files once at startup. After every `agent-router use`, restart opencode for the new models to take effect. The CLI reminds you.\n- **Hand-edits to frontmatter are not auto-saved into stacks.** If you hand-tune a model or option and want to keep it, `capture` it (or `capture <active> --force`). The next `use` that touches that agent overwrites the hand-edit for keys the stack names; keys the stack omits are preserved (set an option to `null` in a stack entry to clear it).\n- **Validation is catalog-dependent.** `agent-router validate` uses the active V2 model catalog, including variants. Catalog membership does not guarantee provider health, valid credentials, or available quota.\n\n## FAQ\n\n**Why no variants/fallback models?** Native agent frontmatter has a single `model:` line. If you want a fallback, make it a stack (`cheap`, `free`) and switch to it. For per-stack *behavior* variants (reasoning effort, thinking budget, temperature, …), add the option as a sibling key on the stack entry — it transcribes to frontmatter on `use`.\n\n**Can I have per-project stacks?** Point `AGENT_ROUTER_STACKS_DIR` at a project-local directory in that project's shell env.\n\n## Architecture in 60 seconds\n\n```\n┌──────────────────────────────────────────────┐\n│ opencode (Bun)                               │\n│  └─ agents loaded from agents/*.md ──────────┼── reads at startup ─┐\n│  └─ plugin: agent-router (this package) ─────┼─ tools, toast       │\n└──────────────────────────────────────────────┘                     ▼\n~/.config/opencode/agents/*.md             ◄── `model:` lines rewritten on `use`\n~/.config/opencode/agent-router/\n  stacks/<name>.json                       ◄── source of truth for each stack\n  state.json                               ◄── pointer to active stack\n  history/<ts>__<from>-to-<to>.json        ◄── displaced mappings, rolling 20\n```\n\n## Contributing\n\nIssues and PRs welcome. Run locally:\n\n```bash\ngit clone https://github.com/dylanrussellmd/agent-router.git\ncd agent-router\npnpm install\npnpm test\npnpm build\n```\n\n## License\n\nMIT — see [LICENSE](./LICENSE).\n","readmeFilename":"README.md"}