Scope Mistral's polymorphic reasoning and replay behavior to exact first-party HTTPS routes, preserve stored thinking across real prompt construction, and keep DeepSeek's sanitizer from injecting a second dialect into tool-call history.
Align the current model registry, provider-scoped model override, generated facts, docs, and focused route-isolation tests. Split the large stream decoder test module so the source-structure gate remains below budget.
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
* fix(web): map Model Studio provider variants in facts drift guards
The train's Model Studio lane added four ApiProvider variants without
registering them in the web facts maps, failing check-facts (Lint & Type
Check on #5135). All four share the single MODELSTUDIO_API_KEY env var.
* chore(web): regenerate facts.generated.ts (providers 40, tools 68)
Extracts the marketing site's hard-coded English copy into per-locale
dictionaries (19 chrome keys + 40 home keys for en, es, ja, ko, pt-BR,
ru, uk, vi) and routes nav, footer, locale switcher, sitemap, and the
home page through them.
Also:
- `lib/i18n/detect.ts` pulls Accept-Language negotiation out of
middleware into a tested module. This fixes the pt-BR bug: a browser
sending `pt-BR` was matched on the bare `pt` prefix against the wrong
candidate and could land on the English page.
- page-meta derives hreflang alternates from the locale registry instead
of a hand-maintained list, so a new locale can no longer ship without
its alternates.
- `web/scripts/check-locales.mjs` is a new CI gate: it holds every locale
dictionary at exact key parity with `en` and fails if a translation
drops a `{template}` token. Wired into ci.yml and `npm run
check:locales`.
Gates: `npm test` 168 passed (24 files), `npx tsc --noEmit` clean, `npm
run lint` clean, `node web/scripts/check-locales.mjs` PASS.
Harvested from the v0.9.2 localization lane (#3092, #4749, #4791).
Keep the public provider facts and source-candidate count aligned with the new ApiProvider variant so the hosted web gate remains truthful.
Verified: npm run check:facts; npm run check:docs; npm test (137/137); npm run lint; npm run build.
Map the contributed TelecomJS provider into both facts derivations, regenerate the committed source-candidate facts at 35 providers while preserving toolCount 66, and document its conservative fallback and isolated live catalog.
No deployment, publication, tag, or release is performed.
Signed-off-by: Hunter B <hmbown@gmail.com>
Derive website sandbox facts from explicit runtime capability markers instead of source filenames. Document actual platform wrappers, narrow model and audit claims, and make two-package/three-command installs exact.
Verify release assets under their manifest filenames before renaming them, with an executable contract test for every Unix snippet. Refresh localized README receipts and keep source-candidate toolCount at 66.
Signed-off-by: Hunter B <hmbown@gmail.com>
Add a credential-free deployed-facts comparator, machine-readable preflight receipts, and fail-closed workflow context checks. Manual main deployments now record prior drift and verify the public worker reports the exact workflow SHA after upload.
Signed-off-by: Hunter B <hmbown@gmail.com>
Reject malformed, legacy, and older KV snapshots before they can replace a newer deployed build. Derive runtime facts from one exact main revision, expose a public source receipt, and keep the latest published release distinct from the source candidate.
Signed-off-by: Hunter B <hmbown@gmail.com>
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 <hmbown@gmail.com>
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 <hmbown@gmail.com>
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 <hmbown@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
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 <101357273+Hmbown@users.noreply.github.com>
(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 <noreply@anthropic.com>
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 <894876246@qq.com>
* 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) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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 <87569709+nightt5879@users.noreply.github.com>
- 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) <noreply@anthropic.com>
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) <noreply@anthropic.com>