{"_id":"@arcanea/router-spec","_rev":"3-b56fdc0b09e1b0088cd5a3dd0af0bc4f","name":"@arcanea/router-spec","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@arcanea/router-spec","version":"1.0.0","_id":"@arcanea/router-spec@1.0.0","maintainers":[{"name":"frankxai","email":"friemerx@gmail.com"}],"dist":{"shasum":"bbe0f5e030d7f01cbf968fa89c5f5668a664d107","tarball":"https://registry.npmjs.org/@arcanea/router-spec/-/router-spec-1.0.0.tgz","fileCount":9,"integrity":"sha512-bxyc8jOg4kftng2Rs/3jcP/tPGyJ9pH+dZwdWEEr9DXSlcrnQWhfVcl8CU09wIcp60os1JE40/1typ7+qNTvoQ==","signatures":[{"sig":"MEYCIQCH17/eztYKUOXzvSW50+813//5lF2yfjNxB3ORYQRsSAIhAI1ZPC3TjNm90qhTwLoMTHzMiMr6XlW9IaV28MrsL2E5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25242},"main":"./dist/index.js","type":"module","_from":"file:arcanea-router-spec-1.0.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./models.yaml":"./models.yaml"},"scripts":{"build":"tsc -p tsconfig.json","validate":"tsx src/validate.ts"},"_npmUser":{"name":"frankxai","email":"friemerx@gmail.com"},"_resolved":"C:\\Users\\frank\\AppData\\Local\\Temp\\61a5f770bcb18e8aec6a6b29ec4b7caa\\arcanea-router-spec-1.0.0.tgz","_integrity":"sha512-bxyc8jOg4kftng2Rs/3jcP/tPGyJ9pH+dZwdWEEr9DXSlcrnQWhfVcl8CU09wIcp60os1JE40/1typ7+qNTvoQ==","_npmVersion":"11.6.1","description":"Canonical model routing spec for the Arcanea ecosystem. Single source of truth consumed by claude-arcanea, oh-my-arcanea, arcanea-flow, and arcanea.ai/models.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"yaml":"^2.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/router-spec_1.0.0_1776438256607_0.3504076082284966","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@arcanea/router-spec","version":"1.0.1","_id":"@arcanea/router-spec@1.0.1","maintainers":[{"name":"frankxai","email":"friemerx@gmail.com"}],"dist":{"shasum":"3637d874612b692a77ecd42d289170922a02df6b","tarball":"https://registry.npmjs.org/@arcanea/router-spec/-/router-spec-1.0.1.tgz","fileCount":9,"integrity":"sha512-wJGvhaY0nDvdDHZXZUdItPgl91r5CasjHre3ip3iei3qj9Fdx5w4ggv+8IbUHXHL7Zg447x3wYYhlFssnAsSbg==","signatures":[{"sig":"MEUCIF+8+IRLS5Tcn7dXoSjPc2QhbQTbYwAClOkBYRobhe9kAiEAs1iyaMldAOZDJdQW8NOqZPB+Rmi67cA2VlxuV77OTNw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26419},"main":"./dist/index.js","type":"module","_from":"file:arcanea-router-spec-1.0.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./models.yaml":"./models.yaml"},"scripts":{"build":"tsc -p tsconfig.json","validate":"tsx src/validate.ts"},"_npmUser":{"name":"frankxai","email":"friemerx@gmail.com"},"_resolved":"C:\\Users\\frank\\AppData\\Local\\Temp\\f4b85db9e77f580b1dfaf90f4630eef6\\arcanea-router-spec-1.0.1.tgz","_integrity":"sha512-wJGvhaY0nDvdDHZXZUdItPgl91r5CasjHre3ip3iei3qj9Fdx5w4ggv+8IbUHXHL7Zg447x3wYYhlFssnAsSbg==","_npmVersion":"11.6.1","description":"Canonical model routing spec for the Arcanea ecosystem. Single source of truth consumed by claude-arcanea, oh-my-arcanea, arcanea-flow, and arcanea.ai/models.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"yaml":"^2.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/router-spec_1.0.1_1776438718197_0.4990241381061451","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@arcanea/router-spec","version":"1.0.2","repository":{"type":"git","url":"git+https://github.com/frankxai/arcanea-ai-app.git","directory":"packages/router-spec"},"homepage":"https://arcanea.ai/orchestrator","bugs":{"url":"https://github.com/frankxai/arcanea-ai-app/issues"},"author":{"name":"Arcanea","url":"frankxai"},"license":"MIT","description":"Canonical model routing spec for the Arcanea ecosystem. Single source of truth consumed by claude-arcanea, oh-my-arcanea, arcanea-flow, and arcanea.ai/models.","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./models.yaml":"./models.yaml"},"dependencies":{"yaml":"^2.6.0"},"devDependencies":{"tsx":"^4.19.0","typescript":"^5.5.0"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.json","validate":"tsx src/validate.ts","test":"tsx --test tests/validate.test.ts"},"_id":"@arcanea/router-spec@1.0.2","_integrity":"sha512-fu/dFDMZvyexLDde2nfLtjMyOWjL9sAkszQhm2vYfGpioJU9bC7SgQRB10uDyFiS0py4X50aR6SWAvU1L2yMBg==","_resolved":"C:\\Users\\frank\\AppData\\Local\\Temp\\4cb5e0d173dce8ebc2b65c25a792cd42\\arcanea-router-spec-1.0.2.tgz","_from":"file:arcanea-router-spec-1.0.2.tgz","_nodeVersion":"24.14.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-fu/dFDMZvyexLDde2nfLtjMyOWjL9sAkszQhm2vYfGpioJU9bC7SgQRB10uDyFiS0py4X50aR6SWAvU1L2yMBg==","shasum":"74e6ab23384ba523c0ad0d24913313517043fd6d","tarball":"https://registry.npmjs.org/@arcanea/router-spec/-/router-spec-1.0.2.tgz","fileCount":9,"unpackedSize":27099,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCYSVn+fe3m6X0Fi078sgy3HnPfYBGcCOaOoEWZ/VaQvQIhAO3Qu2tguD4rQBVzN+lFwPZE3j8IDKaAPvd/oJgq3Rg3"}]},"_npmUser":{"name":"frankxai","email":"friemerx@gmail.com"},"directories":{},"maintainers":[{"name":"frankxai","email":"friemerx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/router-spec_1.0.2_1776503606287_0.7265418557807939"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-17T15:04:16.500Z","modified":"2026-04-18T09:13:26.863Z","1.0.0":"2026-04-17T15:04:16.755Z","1.0.1":"2026-04-17T15:11:58.335Z","1.0.2":"2026-04-18T09:13:26.423Z"},"description":"Canonical model routing spec for the Arcanea ecosystem. Single source of truth consumed by claude-arcanea, oh-my-arcanea, arcanea-flow, and arcanea.ai/models.","maintainers":[{"name":"frankxai","email":"friemerx@gmail.com"}],"readme":"# @arcanea/router-spec\r\n\r\n[![npm version](https://img.shields.io/npm/v/@arcanea/router-spec.svg?color=7fffd4)](https://www.npmjs.com/package/@arcanea/router-spec)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n\r\nCanonical model routing for the Arcanea ecosystem. Single source of truth.\r\n\r\n## Why this exists\r\n\r\nBefore this package, routing decisions (which model handles which task) lived in three places:\r\n- `~/.config/opencode/oh-my-opencode.json` for OpenCode\r\n- `claude-arcanea` agent frontmatter for Claude Code\r\n- `apps/web/lib/models-data.ts` for the public `/models` page\r\n- Plus the blog post, plus Frank's head\r\n\r\nThey drifted. This package collapses them into one file (`models.yaml`) that every surface reads.\r\n\r\n## What it contains\r\n\r\n- **Model catalog** — every model we use, with tier (free / sub / byok), context, benchmarks, and strengths.\r\n- **Task classes** — every task we route (orchestrate, code.implement, world.canon, etc.) with primary + fallback candidates.\r\n- **Surface bindings** — how each harness (claude-arcanea, oh-my-arcanea, arcanea-flow, arcanea-mcp) consumes the spec, including per-surface overrides.\r\n- **Delegation topology** — when Opus 4.7 in Claude Code delegates to external CLIs (codex, gemini, opencode, ao) via Bash, which tasks go where.\r\n\r\n## Consuming the spec\r\n\r\n```ts\r\nimport { loadSpec, resolveTask, pickModel } from '@arcanea/router-spec';\r\n\r\nconst candidates = resolveTask('code.debug', 'claude-arcanea');\r\n// → ['claude-opus-4-7', 'claude-sonnet-4-6', 'minimax-m2.5-free']\r\n\r\nconst model = pickModel(candidates);\r\n// → 'claude-opus-4-7'\r\n```\r\n\r\n## Tier semantics\r\n\r\n| Tier | Meaning |\r\n|---|---|\r\n| `free` | OpenCode Zen free models. $0 tokens but usage data may be collected. |\r\n| `sub` | Covered by a subscription (Claude Max). Unlimited inside the harness. |\r\n| `byok` | User provides API key. Metered at provider price. |\r\n| `premium` | Paid, metered (used internally by Arcanea for paying users). |\r\n\r\n## Updating the spec\r\n\r\n1. Edit `models.yaml`.\r\n2. Bump `version` (semver) and update `lastUpdated`.\r\n3. Run `pnpm --filter @arcanea/router-spec validate`.\r\n4. Surfaces pick up changes on next build / restart.\r\n\r\n## Surfaces that read this\r\n\r\n- `claude-arcanea` — Claude Code overlay\r\n- `oh-my-arcanea` — OpenCode overlay\r\n- `arcanea-flow` — workflow engine\r\n- `arcanea-mcp` — MCP tool server\r\n- `apps/web/app/models/` — public arena page (auto-generated)\r\n- `apps/web/app/blog/ai-model-arena-free-models-guide/` — blog post (section auto-generated)\r\n\r\n## Principle\r\n\r\nMemory is historical. Config is authoritative. If this file disagrees with a surface's local config, this file wins — fix the surface.\r\n\r\n## Legal / disclaimer\r\n\r\nThis package is a **routing specification**. It does not execute models or process prompts. Downstream consumers (the dispatcher, overlays, web pages) exec or display based on these declarations.\r\n\r\n- **MIT licensed, provided \"AS IS\"**, without warranty of any kind. See `LICENSE`.\r\n- **Not affiliated with** any model provider named in `models.yaml`. All trademarks belong to their respective owners.\r\n- **Model benchmarks and metadata** (SWE-Bench, context, speed, strengths) are aggregated from public vendor announcements and independent benchmarks. Accuracy is best-effort. Verify before relying on them for production decisions.\r\n- **Tier classifications** (`free` / `sub` / `byok` / `premium`) describe general availability at time of publish. Vendor pricing and availability change — re-check with the vendor before assuming cost.\r\n- **Routing decisions** encoded here are opinionated defaults. Consumers are free to override per-call.\r\n- **No usage data is collected** by this package. It contains only declarations.\r\n- **Vendor Terms of Service** apply to any runtime invocation downstream. This spec makes no claim about compliance on your behalf.\r\n","readmeFilename":"README.md","homepage":"https://arcanea.ai/orchestrator","repository":{"type":"git","url":"git+https://github.com/frankxai/arcanea-ai-app.git","directory":"packages/router-spec"},"author":{"name":"Arcanea","url":"frankxai"},"bugs":{"url":"https://github.com/frankxai/arcanea-ai-app/issues"},"license":"MIT"}