Keep the build-time and runtime provider maps aligned with the first-class OpenCode Go provider merged for v0.9.1. Regenerate the committed website facts so the drift gate and provider inventory remain truthful.
Signed-off-by: Hunter B <[email protected]>
Git clones the technical CodeWhale repository slug into a case-matching directory by default, so keep the following cd command exact for case-sensitive filesystems. Extend the docs drift gate to reject future clone-directory casing mismatches.
Signed-off-by: Hunter B <[email protected]>
Register MiniMax-M3 and MiniMax-M2.7 for the OpenAI-compatible and Messages routes. Add regional endpoint guidance, request tests, catalog limits, and tier-aware pricing.
Add Meta Model API and the existing xAI route to both provider-facts maps so the generated website inventory and runtime drift path cannot silently omit them.
Verified with node web/scripts/derive-facts.mjs and node web/scripts/check-facts.mjs.
Rename the LongCat provider label in the shared provider descriptor, TUI
header, and website facts so the picker and docs show Meituan ownership.
Signed-off-by: Hunter B <[email protected]>
Co-authored-by: Cursor <[email protected]>
Adding the LongCat ApiProvider variant tripped the web `check:facts` gate
("unmapped ApiProvider variant(s): LongCat"). Add LongCat to
PROVIDER_LABEL_MAP (web/scripts/facts-lib.mjs) and labelMap
(web/lib/facts-drift.ts), mirroring the Sakana entry, and regenerate
web/lib/facts.generated.ts. `node scripts/check-facts.mjs` now passes
(providers=30, version=0.8.67).
Signed-off-by: Hmbown <[email protected]>
(cherry picked from commit a54a8dec2e74e2293f95d8904efba3464fade119)
`deriveProviders()` warned about unmapped `ApiProvider` variants but returned
only the mapped subset, so `check:facts` could still pass while the public
provider map silently fell behind the Rust enum (e.g. `Openmodel`, `Sakana`).
- Map `Openmodel` and `Sakana` in both `web/scripts/facts-lib.mjs`
(PROVIDER_LABEL_MAP) and `web/lib/facts-drift.ts` (labelMap).
- Add `unmappedProviderVariants()` (facts-lib) and hard-fail `check-facts.mjs`
when any non-excluded variant is unmapped, naming the variants and the fix.
- The generator stays lenient (warns) so local `prebuild` is not blocked;
the hard gate lives in the CI check.
- Regenerate `facts.generated.ts` (adds the two providers).
- Add `provider-mapping.test.ts` asserting no unmapped variants remain.
Fixes#3772
`check-docs.mjs` detected stale `codewhale --version # X` install snippets and
printed `FAIL`, but the stale branch fell through to the final
`console.log("[check-docs] PASS")` without `process.exit(1)`. CI could miss
public install-copy drift the gate exists to catch.
Mirror the `exit(1)` used by the missing-sources and version checks: on stale
snippets, print the details and exit non-zero; the final PASS is reached only
when every check passes.
Fixes#3770
Fail the manual website deploy job before the OpenNext build when the Cloudflare account variable or API token secret is missing or placeholder-like. This makes the GitHub Actions failure actionable while leaving Wrangler as the deploy authority.
Verification:
- npm run check:deploy-env (expected failure without env)
- env CLOUDFLARE_ACCOUNT_ID=cf50f793171d7cb3b2ce23368b69cdcb CLOUDFLARE_API_TOKEN=abcdefghijklmnopqrstuvwxyz npm run check:deploy-env
- npm run check:facts
- npm run check:docs
- npm run lint
- git diff --check
Follow-ons surfaced by integrating #1519 + #3311:
- #1519 added the dynamic ApiProvider::Custom meta-provider. Exclude it from the
website provider facts (facts-lib.mjs + facts-drift.ts EXCLUDED, like
DeepseekCN) and from the provider-table drift check (META_PROVIDER_TABLES in
check-provider-registry.py) — it's a runtime catch-all, not a shipped provider.
- #3311 moved DEFAULT_TEXT_MODEL's definition to config/models.rs, which broke
the web facts' loose scrape (it mis-bound to an NVIDIA base URL). Read both
files and match the const definition precisely; default model is deepseek-v4-pro
again.
Audit #3 (scratchpad/bug-audit-2026-06-24.md): `npm run build` ran
derive-facts.mjs which always stamped a fresh generatedAt into the tracked
web/lib/facts.generated.ts, dirtying the working tree on every clean build.
Preserve the committed generatedAt when every *checked* fact (the same set the
drift gate compares, excluding generatedAt + runtime-only latestRelease) is
unchanged, so a clean rebuild leaves the tracked file byte-identical. A real
fact change still stamps a fresh timestamp.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Replace the single monolithic Docs page with a hub-and-spoke structure
backed by a canonical docs-map.ts registry.
- web/lib/docs-map.ts: canonical doc registry mapping 16 topic areas to
repo source files, with locale-aware labels and category groups
- web/app/[locale]/docs/layout.tsx: shared sidebar nav layout for all
docs sub-pages with categorized topic links (§ for pages, ↗ for repo)
- web/app/[locale]/docs/page.tsx: rewritten from 640-line monolith into
a hub index with categorized topic cards and source attribution
- web/app/[locale]/docs/constitution/page.tsx: standalone page
preserving existing EN+ZH inline content
- web/app/[locale]/docs/modes/page.tsx: standalone modes + approval page
- web/app/[locale]/docs/tools/page.tsx: standalone tools catalog page
- web/scripts/check-docs.mjs: drift/parity gate verifying repo source
files exist, version matches workspace, and install snippets are fresh
- web/package.json: add npm run check:docs
- .github/workflows/web.yml: run check:docs after prebuild in lint job
Extract shared derivation logic into web/scripts/facts-lib.mjs and
create a check-facts.mjs CI gate that fails when web/lib/facts.generated.ts
is stale relative to the workspace sources.
- facts-lib.mjs: single-source-of-truth derivation shared by
derive-facts.mjs (prebuild) and check-facts.mjs (gate)
- derive-facts.mjs: slimmed to ~63 lines, imports from facts-lib.mjs
- check-facts.mjs: re-derives facts and compares against committed file;
exits non-zero when version, providers, crates, sandboxBackends,
defaultModel, nodeEngines, toolCount, or license have drifted
- web/package.json: add npm run check:facts script
- .github/workflows/web.yml: run check:facts after prebuild in lint job
- web/lib/check-facts.test.ts: 9 vitest tests covering stale version
(0.8.62 vs 0.8.64), provider drift, multi-field detection, edge cases
Closes#3415
Co-authored-by: Hanmiao Li <[email protected]>
* feat(provider): add Qianfan route fixture
Add Baidu Qianfan as a first-class OpenAI-compatible provider descriptor with provider-scoped auth, base URL, model env overrides, docs, and focused TUI/config regressions.
Qianfan service model IDs pass through under provider scope, while unsupported reasoning extensions stay out of request payloads.
Refs #3357.
* Add Qianfan to web facts maps
Keep the build-time and runtime facts derivation label maps in sync with the Qianfan ApiProvider variant so the release version-drift guard can derive provider facts cleanly.
Verification:
- ./scripts/release/check-versions.sh
- python3 scripts/check-provider-registry.py
- cargo test -p codewhale-config --locked qianfan
- cargo test -p codewhale-tui --bin codewhale-tui --locked qianfan
- npm run lint -- lib/facts-drift.ts scripts/derive-facts.mjs (from web/)
- cargo fmt --all -- --check
- git diff --check
* fix(provider): qianfan env-var alias fallback skips empty values
std::env::var returns Ok("") for a set-but-empty var, so the prior or_else chain
never reached BAIDU_QIANFAN_BASE_URL / BAIDU_QIANFAN_MODEL when QIANFAN_* was set
to empty. Filter each var for non-empty before falling back to the alias.
(From the Claude review on #3425.)
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
Complete the DeepInfra CLI/config/TUI alias path, refresh the public 25-provider README/docs/site surfaces, and clean the website production build tracing metadata for v0.8.61.
Harvested release-surface follow-up from PR #3236 by @nightt5879.
Closes#3231.
Co-authored-by: Nightt <[email protected]>
- Remove dead i18n dictionary code (dictionaries/{en,zh}.ts,
get-dictionary.ts); copy is inlined per-page and these had no importers.
- Add Z.ai/StepFun/MiniMax to derive-facts + facts-drift labelMaps so the
facts build covers all providers and 'npm run build' passes.
- Homepage/FAQ: mission-idea-in-this-version framing, 0.8.61 version refs,
locale-prefixed fallback links; WhaleFlow stays off the homepage hero.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
First commit of the Next.js community site that powers
deepseek-tui.com, deployed via Cloudflare Workers / OpenNext.
This commit lands the scaffold and applies the visual + correctness
pass requested by community feedback:
- Palette: drop the cream/Anthropic-feel paper (#F4F1E8) for a
DeepSeek-aligned cool white + soft gray (#FFFFFF / #F4F6FB), with
indigo accents kept. Soften default hairlines so a pure-white
background reads clean instead of harsh.
- Mobile: add a hamburger menu (mobile-menu.tsx) so phones can reach
Install / Docs / Activity / Roadmap / Contribute — previously the
link list was hidden on phones with no replacement. Tighter hero,
flexible button row, viewport-safe code blocks, columnar grids
collapse cleanly under 768px, and the printed-almanac center rule
is desktop-only now (it sliced through narrow viewports).
- "How it works" diagram: replace the hand-rolled ASCII art (which
misaligned under CJK monospace because Han characters take 2
columns vs Latin's 1, per dhh's note in WeChat) with a real
mermaid diagram rendered client-side via dynamic import. Uses the
mermaid.live standard syntax 庄表伟 recommended.
- Issue #1104: the docs listed a `deepseek-cn` provider that the
v0.8.16 binary doesn't accept (`ProviderArg` in crates/cli only
has 9 variants; the 10th lives only in the legacy tui/config.rs).
derive-facts.mjs now omits `deepseek-cn` until that variant is
wired through the shared ProviderKind, and the install page's
China-network recipe uses `base_url` / `DEEPSEEK_BASE_URL` (which
actually works on v0.8.16) instead of the unsupported provider.
Auto-deploys via .github/workflows/deploy-web.yml on push to main.
Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>