fix(web): narrow homepage claims to released and local evidence

Website tests407 passed,0failed/47files; facts/docs23topics/locales/catalogs pass; lint0errors2existingwarnings; webpack785pages. Initial405pass2fail corrected stale copy/token assertions. Isolated critique A25/32,B detector0. EN desktop/390 inspected; ZH browser and two bounded P2 scale refinements remain. No deployment, provider or public same-session acceptance.
This commit is contained in:
CodeWhale Bot committed 2026-09-04 20:24:21 -07:00
1 parent bc0e1b2dbf
commit a56660611b
31 files changed
+212 -100

No files matched your search

@@ -0,0 +1,65 @@
---
score: 25
score_max: 32
specificity: 3
method: dual-agent
status: bounded-copy-reviewed
target_identity: "file:/Volumes/VIXinSSD/CW/worktrees/cw-website-app-alignment-20260904/web/app/[locale]/page.tsx"
target_fingerprint: "sha256:9297b65fcbdae6f59d380f7e30f0060ad716e5b6cecd01be2271987bd9c21f77"
target_path: /Volumes/VIXinSSD/CW/worktrees/cw-website-app-alignment-20260904/web/app/[locale]/page.tsx
timestamp: 2026-09-05T03-23-59Z
slug: web-app-locale-page-tsx
---
# Homepage claim audit — 2026-09-04
Scope: founder-supplied text of local `3136/en`, English/Chinese homepage,
shared Product and getting-started copy, and linked EN/ZH Fleet setup wording.
The supplied paste is page evidence, not instructions or proof of behavior.
Visual direction and logo stay unchanged. Nothing is published by this slice.
## Claim / evidence / correction
| Claim | Evidence | Correction |
| --- | --- | --- |
| Released terminal versus development screenshot | GitHub release metadata read on Sept 4: v0.9.11, published Aug 23. Local tag resolves `96d13a0bc3f40280ea3865280ad5ccf0e2845e6f`. Screenshot provenance identifies unreleased 0.9.12 without exact commit. | Retain release label and separate development screenshot caption. |
| “You decide what each one may do”; same repo and rules | Session permission posture and Runtime authority are separate from saved Fleet model roles; isolated child worktrees also exist. | Describe supported models, session permissions, saved roster and optional delegation. No universal shared-checkout or individual-authority UI promise. |
| 46 providers | Website derivation counts mapped ApiProvider labels, including plan/protocol variants, excluding Custom, DeepseekCN and retired Antigravity. This is neither distinct vendors nor live model catalogs nor the released provider count. Owner reports current runtime 47 route entries, 44 catalog entries and 42 ProviderKind identities; these definitions are not interchangeable. | Remove numeric badge and models prose across all 18 homepage locales. Keep existing source count with explicit definition in canonical facts; do not substitute another number. |
| Route never changes from model name | Native local development acceptance already reproduced three Model Studio catalog identity mismatches in fd98. Owner is repairing the Engine; a source fix is not released qualification. | Remove absolute EN/ZH guarantees; ask users to inspect selected provider/model/endpoint. Do not equate catalog identity failure with proven inference misrouting. |
| Local servers need no key | Authentication depends on server configuration. | Say local servers may require authentication. |
| Plan is read-only; nothing is written | v0.9.11 `docs/MODES.md` and Engine tool catalog describe central file-mutation/shell refusal, policy-allowed research and separately persisted session settings/state. | Name file/shell boundary and possible external research; remove blanket no-write claim from Product. |
| `/fleet setup` exact four-step wizard | v0.9.11 `crates/tui/src/tui/views/fleet_setup.rs` resolves `SelectedFleet` or `LegacyProfiles`. Selected named Fleet opens its editor. Legacy path chooses role/model, with optional thinking on review. | Keep command, make step optional and accurately describe both destinations. Shared homepage/guide and EN/ZH Fleet docs updated. No published binary interaction claimed. |
| Install/auth commands | v0.9.11 source contains auth set provider handling and Fleet setup; GitHub assets include terminal Linux/macOS/Windows archives. | Keep commands and released terminal target statement. No fresh install, key write or provider call performed. |
| Public web sign-in and same-session remote control available | Source routes and local fixtures exist. This audit has no deployed authenticated same-session task acceptance. | EN/ZH homepage/Product say development preview and explicitly unverified public remote control. |
| Desktop alpha builds exist on three platforms | Local macOS Dogfood startup has a receipt; Linux/Windows downloadable Tauri artifacts are not established. Windows terminal installer is not Tauri desktop proof. | Describe tested local macOS development build and no released desktop app download. |
| Nothing on this site can charge you | An absolute statement exceeds evidence and obscures provider billing. | State terminal needs no Codewhale account; provider usage belongs to the user's provider account; account creation does not purchase model access. |
| Ask/Auto-Review/Full Access absolutes | Approval rules, saved posture and hard policy boundaries affect actual execution. | Product describes rule-based prompts/review and persistent hard boundaries; removes universal every-write and never-default claims. |
## Evidence boundaries
Read-only release metadata and asset inventory:
`/tmp/cwa-app-parity-20260904/site-release-claims-v0911.json`.
No release artifact was downloaded or executed during this slice. Git tag source
is source evidence, not a fresh installed task acceptance. No authenticated
public web flow, provider request, deployment, billing action or customer task
was performed. Source/provider integration remains independently qualified by
its owner.
Numeric models prose is corrected in all homepage languages. Broader hero,
availability and linked documentation claims outside EN/ZH remain unaudited in
this slice and must not be treated as reviewed translations. The English and
Chinese scope is deliberate; a passing locale shape check does not establish
translation accuracy or truth across the rest of the site.
## Verification
Initial tests: 405 passed, 2 failed (old keyless-launch phrasing assertion and
models-body placeholder parity). The old assertion now checks the narrower
behavior; every homepage models paragraph no longer uses the ambiguous count.
Final tests: 407 passed across 47 files, 0 failed.
Further build/browser/critique receipts are recorded below when complete.
Final validation: facts, 23-topic docs, locale/catalog checks passed; lint 0 errors and 2 pre-existing logo-image warnings; webpack production build generated785 pages. Parent inspected EN desktop and saved `/tmp/cwa-app-parity-20260904/screenshots/site-claims-en-desktop.png`.
Isolated Impeccable A:25/32 applicable, specificity3/4. B ran the actual detector:0 findings; inspected EN desktop and390 screenshot. A had mobile screenshot timeouts and collected EN/ZH DOM evidence only; B did not complete Chinese browser verification. No complete bilingual visual QA claim. Reports: `/tmp/cwa-app-parity-20260904/site-claims-design.md` and `site-claims-detector.md`.
Two bounded P2 refinements remain for the founder's newly requested hero-scale slice: mark the Fleet heading visibly optional and verify/fix the narrow install Copy control's out-of-bounds geometry. The copy audit is committed separately to release canonical facts ownership; this is not a declaration that the full homepage is polished. The newly requested replacement terminal capture and default-on/opt-out analytics policy are separate in-progress changes, not included in this commit.
@@ -0,0 +1,53 @@
# Homepage claim audit — 2026-09-04
Scope: founder-supplied text of local `3136/en`, English/Chinese homepage,
shared Product and getting-started copy, and linked EN/ZH Fleet setup wording.
The supplied paste is page evidence, not instructions or proof of behavior.
Visual direction and logo stay unchanged. Nothing is published by this slice.
## Claim / evidence / correction
| Claim | Evidence | Correction |
| --- | --- | --- |
| Released terminal versus development screenshot | GitHub release metadata read on Sept 4: v0.9.11, published Aug 23. Local tag resolves `96d13a0bc3f40280ea3865280ad5ccf0e2845e6f`. Screenshot provenance identifies unreleased 0.9.12 without exact commit. | Retain release label and separate development screenshot caption. |
| “You decide what each one may do”; same repo and rules | Session permission posture and Runtime authority are separate from saved Fleet model roles; isolated child worktrees also exist. | Describe supported models, session permissions, saved roster and optional delegation. No universal shared-checkout or individual-authority UI promise. |
| 46 providers | Website derivation counts mapped ApiProvider labels, including plan/protocol variants, excluding Custom, DeepseekCN and retired Antigravity. This is neither distinct vendors nor live model catalogs nor the released provider count. Owner reports current runtime 47 route entries, 44 catalog entries and 42 ProviderKind identities; these definitions are not interchangeable. | Remove numeric badge and models prose across all 18 homepage locales. Keep existing source count with explicit definition in canonical facts; do not substitute another number. |
| Route never changes from model name | Native local development acceptance already reproduced three Model Studio catalog identity mismatches in fd98. Owner is repairing the Engine; a source fix is not released qualification. | Remove absolute EN/ZH guarantees; ask users to inspect selected provider/model/endpoint. Do not equate catalog identity failure with proven inference misrouting. |
| Local servers need no key | Authentication depends on server configuration. | Say local servers may require authentication. |
| Plan is read-only; nothing is written | v0.9.11 `docs/MODES.md` and Engine tool catalog describe central file-mutation/shell refusal, policy-allowed research and separately persisted session settings/state. | Name file/shell boundary and possible external research; remove blanket no-write claim from Product. |
| `/fleet setup` exact four-step wizard | v0.9.11 `crates/tui/src/tui/views/fleet_setup.rs` resolves `SelectedFleet` or `LegacyProfiles`. Selected named Fleet opens its editor. Legacy path chooses role/model, with optional thinking on review. | Keep command, make step optional and accurately describe both destinations. Shared homepage/guide and EN/ZH Fleet docs updated. No published binary interaction claimed. |
| Install/auth commands | v0.9.11 source contains auth set provider handling and Fleet setup; GitHub assets include terminal Linux/macOS/Windows archives. | Keep commands and released terminal target statement. No fresh install, key write or provider call performed. |
| Public web sign-in and same-session remote control available | Source routes and local fixtures exist. This audit has no deployed authenticated same-session task acceptance. | EN/ZH homepage/Product say development preview and explicitly unverified public remote control. |
| Desktop alpha builds exist on three platforms | Local macOS Dogfood startup has a receipt; Linux/Windows downloadable Tauri artifacts are not established. Windows terminal installer is not Tauri desktop proof. | Describe tested local macOS development build and no released desktop app download. |
| Nothing on this site can charge you | An absolute statement exceeds evidence and obscures provider billing. | State terminal needs no Codewhale account; provider usage belongs to the user's provider account; account creation does not purchase model access. |
| Ask/Auto-Review/Full Access absolutes | Approval rules, saved posture and hard policy boundaries affect actual execution. | Product describes rule-based prompts/review and persistent hard boundaries; removes universal every-write and never-default claims. |
## Evidence boundaries
Read-only release metadata and asset inventory:
`/tmp/cwa-app-parity-20260904/site-release-claims-v0911.json`.
No release artifact was downloaded or executed during this slice. Git tag source
is source evidence, not a fresh installed task acceptance. No authenticated
public web flow, provider request, deployment, billing action or customer task
was performed. Source/provider integration remains independently qualified by
its owner.
Numeric models prose is corrected in all homepage languages. Broader hero,
availability and linked documentation claims outside EN/ZH remain unaudited in
this slice and must not be treated as reviewed translations. The English and
Chinese scope is deliberate; a passing locale shape check does not establish
translation accuracy or truth across the rest of the site.
## Verification
Initial tests: 405 passed, 2 failed (old keyless-launch phrasing assertion and
models-body placeholder parity). The old assertion now checks the narrower
behavior; every homepage models paragraph no longer uses the ambiguous count.
Final tests: 407 passed across 47 files, 0 failed.
Further build/browser/critique receipts are recorded below when complete.
Final validation: facts, 23-topic docs, locale/catalog checks passed; lint 0 errors and 2 pre-existing logo-image warnings; webpack production build generated785 pages. Parent inspected EN desktop and saved `/tmp/cwa-app-parity-20260904/screenshots/site-claims-en-desktop.png`.
Isolated Impeccable A:25/32 applicable, specificity3/4. B ran the actual detector:0 findings; inspected EN desktop and390 screenshot. A had mobile screenshot timeouts and collected EN/ZH DOM evidence only; B did not complete Chinese browser verification. No complete bilingual visual QA claim. Reports: `/tmp/cwa-app-parity-20260904/site-claims-design.md` and `site-claims-detector.md`.
Two bounded P2 refinements remain for the founder's newly requested hero-scale slice: mark the Fleet heading visibly optional and verify/fix the narrow install Copy control's out-of-bounds geometry. The copy audit is committed separately to release canonical facts ownership; this is not a declaration that the full homepage is polished. The newly requested replacement terminal capture and default-on/opt-out analytics policy are separate in-progress changes, not included in this commit.
+3 -2
View File
@@ -32,7 +32,8 @@
"crates/tui/src/config.rs",
"crates/tui/src/sandbox/mod.rs",
"web/scripts/derive-facts.mjs"
]
],
"providerCountDefinition": "Website-derived ApiProvider labels in this source snapshot, excluding Custom, DeepseekCN and retired Antigravity; includes protocol/plan variants. Not a count of distinct vendors, ProviderKind identities, live catalogs, or released v0.9.11 providers."
},
"latestPublishedRelease": {
"tag": "v0.9.11",
@@ -178,7 +179,7 @@
"localInference": "a loopback local-model route can keep inference local",
"telemetry": "the 0.9.12 source keeps anonymous usage counting off by default and requires explicit consent to notice version 4, which names Codewhale and PostHog; a clear first-run disclosure never grants consent, and every durable opt-out remains effective; Codewhale does not collect conversations, code, prompts, files, file/repo/branch names, model content, credentials, or per-turn/per-tool timelines; consenting sessions post aggregate counts and closed enums to the first-party endpoint https://telemetry.codewhale.net/v1/telemetry, whose storage has no IP, country, or geo column and a fixed three-month retention; optional PostHog forwarding requires separate operator configuration and verified IP-safe egress, and its retention is a separate project setting; telemetry_endpoint = \"\" writes only to a local dry-run file; no mandatory hosted relay",
"account": "no account required for the local runtime",
"plan": "Plan is read-only",
"plan": "Plan centrally refuses file mutation and shell execution; policy-allowed research may contact external services and local session state can still be persisted.",
"sandbox": "Seatbelt is used on macOS when available; Linux bubblewrap is opt-in and must be installed; Windows currently reports no OS sandbox",
"audit": "sensitive events append best-effort to $CODEWHALE_HOME/audit.log (default ~/.codewhale/audit.log); write failures are logged",
"usage": "provider token and cache usage is shown locally when available",
+1 -4
View File
@@ -39,8 +39,6 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
const sourceVersion = facts.version ?? "unknown";
const publishedRelease = facts.latestPublishedRelease;
const sourceIsPublished = publishedRelease?.version === sourceVersion;
const providerCount = facts.providers.length;
const providerRoutes = fill(d.providerRoutes, { count: providerCount });
// The install URL resolves published artifacts, so its structured version
// must come from the published-release receipt rather than source-candidate
@@ -127,7 +125,6 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
<span>
{`${sourceIsPublished ? d.currentSource : d.sourceCandidate} v${sourceVersion}`}
</span>
<span>{providerRoutes}</span>
<span>{facts.license ?? "MIT"}</span>
</p>
</figcaption>
@@ -162,7 +159,7 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
<div>
<span className="folio-running-head">02 / {d.chapterModels}</span>
<h2>{d.modelsHeading}</h2>
<p className="folio-section-lede">{fill(d.modelsBody, { count: providerCount })}</p>
<p className="folio-section-lede">{d.modelsBody}</p>
<Link href={`/${locale}/models`} className="folio-link">
{d.modelsLink}
</Link>
+12 -12
View File
@@ -79,7 +79,7 @@
"kicker": "Agentic computing, on your terms",
"heroTitleA": "Your models.",
"heroTitleB": "More capable together.",
"heroIntro": "{brand} brings the models you already use into one terminal and lets them work as a crew — reading your code, editing, running the checks — while you decide what each one may do. Open source, on your machine.",
"heroIntro": "{brand} puts coding agents in your terminal to read code, edit files, and run checks. Choose supported models and the session’s permission posture. Open source, on your machine.",
"getCodewhale": "Get Codewhale",
"exploreProduct": "Explore the product",
"shotPreview": "Terminal preview",
@@ -95,11 +95,11 @@
"chapterTerminal": "Your terminal",
"chapterTerminalTitle": "A familiar place to begin.",
"gainHeading": "Give your models a job to finish.",
"gainLede": "One session can hold several models at once, each in a role you gave it, all working in the same repository under the same rules.",
"gainLede": "Start with one model. Use Fleet to save a roster, and delegate parts of a task when the work benefits from more than one agent.",
"gain": [
[
"Your models",
"Hosted keys, a gateway, or a local runtime with no key at all. Pin a different model to each role and keep the provider you chose — a model name never switches it for you."
"Use a supported hosted provider, gateway, or local model server. Fleet stores model choices for reusable agent roles."
],
[
"Capable agents",
@@ -111,8 +111,8 @@
]
],
"chapterModels": "Your models",
"modelsHeading": "Bring what you have. Change nothing you did not choose.",
"modelsBody": "Codewhale ships with {count} providers and treats them as peers. Save a key once, name a model, and the route stays exactly as you set it. Local models over vLLM, SGLang, or Ollama need no key.",
"modelsHeading": "A place for the models you choose.",
"modelsBody": "Connect a supported hosted provider, a gateway, or a local model server. Check the selected provider and model before starting work. Local servers may run without an API key, depending on their configuration.",
"modelsFacts": [
[
"Hosted",
@@ -127,7 +127,7 @@
"vLLM, SGLang, Ollama on localhost — usually no key"
]
],
"modelsLink": "See every provider",
"modelsLink": "Explore provider options",
"startHeading": "Four steps to a first session.",
"startLede": "Install, open a session with no key, connect a provider, then set up a fleet when one model is not enough.",
"startGuideLink": "Read the getting-started guide",
@@ -143,13 +143,13 @@
],
[
"Web app",
"Sign-in and remote control available",
"Sign in or create an account, then type /rc in a running local session to continue that exact session from the browser. The rest of the browser workbench is a development preview."
"Development preview",
"Account pages and browser pairing are implemented in development. Public end-to-end remote control has not been verified; use the terminal for released task execution."
],
[
"Desktop",
"Development build",
"Alpha builds exist for macOS, Linux, and Windows. There is no released desktop app yet."
"A local macOS development build has been tested. There is no released desktop app to download."
],
[
"Cloud computers",
@@ -157,7 +157,7 @@
"Running work on a hosted computer is in development. This page will say so when it works."
]
],
"availabilityNote": "No account is needed for the terminal. An account is never a paid plan by itself, and nothing on this site can charge you.",
"availabilityNote": "The terminal needs no Codewhale account. Hosted model providers bill under your own provider account; creating a Codewhale account does not purchase model access.",
"accountLink": "Create an account",
"surfacesHeading": "Use it where the work happens.",
"surfaces": [
@@ -171,7 +171,7 @@
],
[
"Local web client",
"Localhost interface; hosted remote control uses the Web app"
"Localhost interface; hosted browser workbench in development"
],
[
"Runtime API + MCP",
@@ -358,7 +358,7 @@
"runLead": "The Runtime's fleet-run projection lives in the workspace's .codewhale/fleet.jsonl ledger, with worker logs under .codewhale/fleet/. codewhale fleet resume <run-id> asks Runtime to replay the ledger and reconcile stale leases; it is idempotent after a manager exit, laptop sleep, or runtime restart.",
"statusLead": "The TUI command {fleetStatusTui} and the shell command {fleetStatusShell} read the same durable fleet ledger. Use {fleetWorkers} (or {subagents}) for the sub-agents attached only to the current interactive session.",
"profilesTitle": "Saved fleets, roles, and /fleet setup",
"profilesLead": "{fleetSaved} opens the picker for named saved fleets; bare /fleet opens the selected fleet's member roster. /fleet setup opens a progressive wizard for authoring a reusable roster member: one focused choice at a time — semantic role, model (inherit or a concrete configured route), thinking tier, then an exact identity/route review before save. Profiles live in project scope (.codewhale/agents/<role>.toml) or personal scope ($CODEWHALE_HOME/agents/<role>.toml); a same-id project profile wins. Runtime separately owns trust, filesystem/network reach, secrets, approvals, sandboxing, and tools, so profile storage scope never widens execution authority.",
"profilesLead": "{fleetSaved} opens the picker for named saved fleets; bare /fleet opens the selected fleet's member roster. In v0.9.11, /fleet setup edits the selected named fleet. With no named fleet selected, it opens profile setup: choose a role and model, adjust optional thinking settings, then review before saving. Profiles live in project scope (.codewhale/agents/<role>.toml) or personal scope ($CODEWHALE_HOME/agents/<role>.toml); a same-id project profile wins. Runtime separately owns trust, filesystem/network reach, secrets, approvals, sandboxing, and tools, so profile storage scope never widens execution authority.",
"workflowTitle": "Workflow orchestration",
"workflowLead": "Ordinary multi-agent work does not need Workflow: send normal messages in Operate and let Codewhale prefer background workers when parallelism, isolation, or duration makes delegation useful. Use Workflow when ordered phases, gates, shared budgets, replay, or deterministic fan-in matter. A Workflow script coordinates only: it selects fleet members but has no filesystem or shell; Runtime launches the real workers under live authority policy. Scripts use a declarative compile-only JS subset that lowers to a typed WorkflowSpec validated and executed by Rust; import, fetch, process, eval, and async/await are rejected.",
"workflowLimits": "Default validation bounds: up to 1,000 worker agents per Workflow run, Workflow IR structural nesting no deeper than 5, loops must declare max_iterations, and dynamic expand nodes must declare max_children plus a template. Runtime child delegation is a separate execution budget: it defaults to 3 levels and has an opt-in hard ceiling of 8. These are population and shape limits, not launch concurrency: Runtime admits at most 16 live workers for one run and queues the rest. Omitted or zero max_steps stays unbounded; only a positive value adds a model-turn ceiling.",
+12 -12
View File
@@ -79,7 +79,7 @@
"kicker": "智能体计算,由你定规矩",
"heroTitleA": "你的模型,",
"heroTitleB": "协作更强。",
"heroIntro": "{brand} 把你已经在用的模型带进同一个终端,让它们像一支船员一样协作——读代码、改文件、跑检查——而每个模型能做什么,由你来定。开源,跑在你自己的机器上。",
"heroIntro": "{brand} 把编程智能体带进终端,用来读代码、改文件、跑检查。选择支持的模型,并设置会话的权限策略。开源,运行在你自己的机器上。",
"getCodewhale": "获取 Codewhale",
"exploreProduct": "了解产品",
"shotPreview": "终端预览",
@@ -95,11 +95,11 @@
"chapterTerminal": "你的终端",
"chapterTerminalTitle": "从熟悉的地方开始。",
"gainHeading": "让你的模型把任务做完。",
"gainLede": "一个会话可以同时容纳多个模型,各司其职,在同一个仓库里按同一套规则工作。",
"gainLede": "先从一个模型开始。用 Fleet 保存成员配置;当任务适合分工时,再把部分工作委派给其他智能体。",
"gain": [
[
"你的模型",
"托管密钥、网关,或者完全不需要密钥的本地运行时。给每个角色固定一个模型,提供商始终是你选的那个——模型名不会替你切换。"
"使用支持的托管提供商、网关或本地模型服务。Fleet 保存可复用智能体角色的模型选择。"
],
[
"能干的智能体",
@@ -111,8 +111,8 @@
]
],
"chapterModels": "你的模型",
"modelsHeading": "带上你已有的,不改你未选的。",
"modelsBody": "Codewhale 内置 {count} 个提供商,一视同仁。保存一次密钥,指定一个模型,路由就保持你设定的样子。vLLM、SGLang 或 Ollama 上的本地模型不需要密钥。",
"modelsHeading": "为你选择的模型留一个位置。",
"modelsBody": "连接支持的托管提供商、网关或本地模型服务。开始工作前,检查所选提供商与模型。本地服务是否需要 API 密钥,取决于它的配置。",
"modelsFacts": [
[
"托管",
@@ -127,7 +127,7 @@
"localhost 上的 vLLM、SGLang、Ollama——通常无需密钥"
]
],
"modelsLink": "查看所有提供商",
"modelsLink": "了解提供商选项",
"startHeading": "四步开始第一个会话。",
"startLede": "安装,无需密钥打开会话,接入提供商;一个模型不够时,再配置 fleet。",
"startGuideLink": "阅读新手指引",
@@ -143,13 +143,13 @@
],
[
"网页应用",
"登录与远程控制可用",
"登录或创建账户,然后在正在运行的本地会话里输入 /rc,即可在浏览器中继续这同一个会话。浏览器工作台的其余部分仍是开发预览。"
"开发预览",
"账户页面与浏览器配对已在开发版本中实现。公开服务上的端到端远程控制尚未验证;已发布的任务执行入口是终端。"
],
[
"桌面端",
"开发版本",
"macOS、Linux、Windows 有 alpha 构建。桌面应用尚未正式发布。"
"本地 macOS 开发构建已做过测试。尚无已发布的桌面应用可供下载。"
],
[
"云端计算机",
@@ -157,7 +157,7 @@
"在托管计算机上运行工作仍在开发中。等它真正可用时,本页会如实说明。"
]
],
"availabilityNote": "终端不需要账户。账户本身从不等于付费方案,本站也无法向你收费。",
"availabilityNote": "终端不需要 Codewhale 账户。托管模型按你自己的提供商账户计费;创建 Codewhale 账户不会购买模型访问权限。",
"accountLink": "创建账户",
"surfacesHeading": "活在哪里干,就在哪里用。",
"surfaces": [
@@ -171,7 +171,7 @@
],
[
"本地 Web 客户端",
"本机界面;托管远程控制使用网页应用"
"本机界面;托管浏览器工作台仍在开发中"
],
[
"运行时 API + MCP",
@@ -358,7 +358,7 @@
"runLead": "Runtime 的 fleet 运行投影存放在工作区的 .codewhale/fleet.jsonl 台账中,worker 日志在 .codewhale/fleet/ 下。codewhale fleet resume <run-id> 会让 Runtime 重放台账并调和过期租约;该操作幂等,可在管理进程退出、笔记本睡眠或运行时重启后安全执行。",
"statusLead": "TUI 命令 {fleetStatusTui} 与 shell 命令 {fleetStatusShell} 读取同一份持久 fleet 台账。若要查看仅附着于当前交互会话的子 Agent,请使用 {fleetWorkers}(或 {subagents})。",
"profilesTitle": "已保存 fleet、角色与 /fleet setup",
"profilesLead": "{fleetSaved} 打开已命名保存 fleet 的选择器;裸 /fleet 打开当前所选 fleet 的成员花名册。/fleet setup 打开渐进式向导来编写可复用的花名册成员:依次选择语义角色、模型(继承或具体已配置路由)和思考档位,再核对准确的身份与路由后保存。档案可写在项目级(.codewhale/agents/<role>.toml)或个人级($CODEWHALE_HOME/agents/<role>.toml);同 ID 的项目档案优先。Runtime 另行负责信任、文件系统/网络范围、密钥、审批、沙箱和工具,因此档案存储范围不会扩大执行权限。",
"profilesLead": "{fleetSaved} 打开已命名保存 fleet 的选择器;裸 /fleet 打开当前所选 fleet 的成员花名册。在 v0.9.11 中,/fleet setup 编辑当前选中的命名 fleet。未选中命名 fleet 时,它打开角色档案设置:选择角色与模型、按需调整思考设置,然后核对并保存。档案可写在项目级(.codewhale/agents/<role>.toml)或个人级($CODEWHALE_HOME/agents/<role>.toml);同 ID 的项目档案优先。Runtime 另行负责信任、文件系统/网络范围、密钥、审批、沙箱和工具,因此档案存储范围不会扩大执行权限。",
"workflowTitle": "Workflow 编排",
"workflowLead": "普通多 Agent 工作不需要 Workflow:在 Operate 里直接发消息,需要并行、隔离或长时间工作时让 Codewhale 优先委派后台 worker 即可。只有当工作需要有序阶段、门禁、共享预算、回放或确定性汇总时才用 Workflow。Workflow 脚本只负责协调:它选择 fleet 成员,但没有自己的文件系统或 shell;Runtime 在实时权限策略下启动真正的 worker。脚本使用编译专用的声明式 JS 子集,降低到类型化 WorkflowSpec 后由 Rust 校验与执行;import、fetch、process、eval、async/await 会被拒绝。",
"workflowLimits": "默认校验边界:每次 Workflow 运行最多 1,000 个 worker Agent、Workflow IR 结构嵌套深度不超过 5、循环必须声明 max_iterations、动态 expand 节点必须声明 max_children 和模板。Runtime 的子委派是独立执行预算:默认 3 层,可选择启用的硬上限为 8 层。这些是数量与结构上限,而非并发要求:Runtime 每个运行最多接纳 16 个存活 worker,其余排队。省略 max_steps 或设为 0 都保持无界;只有正值才增加模型轮次上限。",
+6 -6
View File
@@ -47,8 +47,8 @@ export const GETTING_STARTED_STEPS: GuideStep[] = [
id: "first-session",
title: { en: "Open a first session — no key needed", zh: "打开第一个会话——无需密钥" },
body: {
en: "Starts without any API key. A short setup, then the full interface. Look around in Plan mode, which is read-only. Model replies need a provider — that's the next step.",
zh: "无需任何 API 密钥即可启动。简短设置后进入完整界面。先在只读的 Plan 模式里看看。模型回复需要提供商——那是下一步。",
en: "The terminal can open without an API key; model replies need a configured provider. Plan blocks file mutation and shell execution. Permitted research can still contact external services.",
zh: "终端可在没有 API 密钥时打开;模型回复需要配置提供商。Plan 禁止文件修改与 shell 执行,但获准的研究请求仍可能访问外部服务。",
},
commands: ["codewhale"],
link: {
@@ -60,8 +60,8 @@ export const GETTING_STARTED_STEPS: GuideStep[] = [
id: "connect-provider",
title: { en: "Connect a provider", zh: "连接提供商" },
body: {
en: "Use a hosted API key, a gateway, or a local runtime with no key (Ollama, vLLM, SGLang). You pick the provider and the model. A model name never switches the provider for you.",
zh: "用托管 API 密钥、网关,或不需要密钥的本地运行时(Ollama、vLLM、SGLang)。提供商和模型都由你来选。模型名不会替你切换提供商。",
en: "Configure a supported provider with your own credentials, or connect a local model server. Check the selected provider, endpoint and model before sending a task. Local servers may require authentication.",
zh: "用你自己的凭据配置支持的提供商,或连接本地模型服务。发送任务前检查所选提供商、端点与模型。本地服务也可能要求身份验证。",
},
commands: ["codewhale auth set --provider deepseek"],
link: {
@@ -73,8 +73,8 @@ export const GETTING_STARTED_STEPS: GuideStep[] = [
id: "fleet-workflow",
title: { en: "Set up your ideal fleet", zh: "配置你的理想 fleet" },
body: {
en: "Add each provider you use with one auth set (local runtimes need none). Then run /fleet setup. It goes one member at a time — a semantic role, a model from any configured provider, a thinking tier, then an exact identity/route review — and saves the roster profile for this repo or for every repo on this machine. Runtime permissions stay separate. A single task needs none of this.",
zh: "每个要用的提供商执行一次 auth set(本地运行时不需要)。然后运行 /fleet setup。它一次配置一个成员——语义角色、任意已配置提供商的模型、思考档位,再核对准确的身份与路由——并保存为花名册档案,可只用于本仓库或本机所有仓库。Runtime 权限始终独立。单个任务不需要这些。",
en: "Optional in v0.9.11: /fleet setup edits the selected named fleet, or opens profile setup when none is selected. Review the model and save scope before saving. Fleet configuration does not grant execution permissions. You can start with a single agent.",
zh: "v0.9.11 的可选步骤:/fleet setup 编辑当前选中的命名 fleet;未选中时则打开角色档案设置。保存前检查模型与保存范围。Fleet 配置不会授予执行权限。你可以先从一个智能体开始。",
},
commands: ["/fleet setup", "codewhale fleet status"],
link: {
+14 -14
View File
@@ -46,10 +46,10 @@ export const PRODUCT_COPY = {
gainHeading: { en: "What you gain", zh: "你能得到什么" },
gain: [
{
title: { en: "Every model you already pay for, in one place", zh: "你已付费的每个模型,都在一处" },
title: { en: "Supported models, in one place", zh: "支持的模型,都在一处" },
body: {
en: "{count} providers are built in and treated as peers. Save a key once, name a model, and the route stays exactly as you set it. Local models over vLLM, SGLang, or Ollama need no key at all.",
zh: "内置 {count} 个提供商,一视同仁。保存一次密钥,指定一个模型,路由就保持你设定的样子。vLLM、SGLang 或 Ollama 上的本地模型完全不需要密钥。",
en: "Connect a supported hosted provider, a gateway, or a local model server. Check the selected provider and model before starting work. Local servers may run without an API key, depending on their configuration.",
zh: "连接支持的托管提供商、网关或本地模型服务。开始工作前,检查所选提供商与模型。本地服务是否需要 API 密钥,取决于它的配置。",
},
},
{
@@ -62,8 +62,8 @@ export const PRODUCT_COPY = {
{
title: { en: "Control that stays on your machine", zh: "掌控权留在你的机器上" },
body: {
en: "Plan is read-only. Work executes. Operate runs a fleet. Independently, Ask, Auto-Review, and Full Access set how much happens before it asks you. The OS sandbox is used where the platform provides one, and an audit log records sensitive events.",
zh: "Plan 只读。Work 执行。Operate 调度 fleet。另一维度上,Ask、Auto-Review 和 Full Access 决定它在问你之前能做多少。平台提供沙箱时就启用沙箱,审计日志记录敏感事件。",
en: "Plan blocks file mutation and shell execution; permitted research can still contact external services. Work executes tasks. Operate emphasizes delegation. Independently, Ask, Auto-Review, and Full Access set how much happens before it asks you. The OS sandbox is used where the platform provides one, and an audit log records sensitive events.",
zh: "Plan 禁止文件修改与 shell 执行;获准的研究仍可访问外部服务。Work 执行任务,Operate 侧重分工。另一维度上,Ask、Auto-Review 和 Full Access 决定它在问你之前能做多少。平台提供沙箱时就启用沙箱,审计日志记录敏感事件。",
},
},
] satisfies ProductRow[],
@@ -86,10 +86,10 @@ export const PRODUCT_COPY = {
},
{
surface: { en: "Web app", zh: "网页应用" },
status: { en: "Sign-in and remote control available", zh: "登录与远程控制可用" },
status: { en: "Development preview", zh: "开发预览" },
detail: {
en: "Sign in or create an account, then type /rc in a running local session to continue that exact session from the browser — the browser takes new prompts and approvals while the terminal stays a readable safety surface, and /rc stop hands it back. The rest of the browser workbench is a development preview; no account is required for the terminal, and an account is never a paid plan by itself.",
zh: "登录或创建账户,然后在正在运行的本地会话里输入 /rc,就能在浏览器中继续这同一个会话——浏览器接管新的提示与审批,终端保持为可读的安全界面,/rc stop 可交还控制权。浏览器工作台的其余部分仍是开发预览;终端不需要账户,账户本身也从不等于付费方案。",
en: "Account pages and browser pairing are implemented in development. Public end-to-end remote control has not been verified; use the terminal for released task execution.",
zh: "账户页面与浏览器配对已在开发版本中实现。公开服务上的端到端远程控制尚未验证;已发布的任务执行入口是终端。",
},
href: "/signin",
linkLabel: { en: "Sign in", zh: "登录" },
@@ -98,8 +98,8 @@ export const PRODUCT_COPY = {
surface: { en: "Desktop", zh: "桌面端" },
status: { en: "Development build", zh: "开发版本" },
detail: {
en: "Alpha builds exist for macOS, Linux, and Windows. There is no released desktop app yet.",
zh: "macOS、Linux、Windows 有 alpha 构建。桌面应用尚未正式发布。",
en: "A local macOS development build has been tested. There is no released desktop app to download.",
zh: "本地 macOS 开发构建已做过测试。尚无已发布的桌面应用可供下载。",
},
href: null,
linkLabel: null,
@@ -122,14 +122,14 @@ export const PRODUCT_COPY = {
zh: "两个独立的旋钮。模式决定会话可以做哪类工作;权限决定其中多少无需询问。",
},
modes: [
{ title: { en: "Plan", zh: "Plan" }, body: { en: "Read-only. It inspects and proposes; nothing is written.", zh: "只读。它检查并提出方案,不写入任何东西。" } },
{ title: { en: "Plan", zh: "Plan" }, body: { en: "Blocks file mutation and shell execution. Permitted research may contact external services; session state can still be saved.", zh: "禁止文件修改与 shell 执行。获准的研究可访问外部服务;会话状态仍可保存。" } },
{ title: { en: "Work", zh: "Work" }, body: { en: "Edits files and runs commands within the permission you set.", zh: "在你设定的权限内修改文件、运行命令。" } },
{ title: { en: "Operate", zh: "Operate" }, body: { en: "Runs a fleet: several agents on one job, each in its role.", zh: "调度 fleet:多个智能体各司其职,处理同一件事。" } },
] satisfies ProductRow[],
permissions: [
{ title: { en: "Ask", zh: "Ask" }, body: { en: "Every write and every command waits for you.", zh: "每次写入、每条命令都等你确认。" } },
{ title: { en: "Auto-Review", zh: "Auto-Review" }, body: { en: "Routine steps proceed; risky ones still ask.", zh: "常规步骤自动进行,高风险步骤仍会询问。" } },
{ title: { en: "Full Access", zh: "Full Access" }, body: { en: "Runs without asking. You choose this; it is never the default.", zh: "不询问直接运行。由你主动选择,绝不是默认。" } },
{ title: { en: "Ask", zh: "Ask" }, body: { en: "Prompts according to the active approval rules; saved permissions and hard policy boundaries still apply.", zh: "按当前审批规则询问;已保存的权限与强制策略边界仍然生效。" } },
{ title: { en: "Auto-Review", zh: "Auto-Review" }, body: { en: "Uses automated review for eligible actions; unresolved approval decisions return to you.", zh: "对符合条件的操作进行自动审核;未解决的审批仍交给你。" } },
{ title: { en: "Full Access", zh: "Full Access" }, body: { en: "Reduces approval prompts. It does not bypass hard policy boundaries or grant access outside the allowed scope.", zh: "减少审批提示,但不会绕过强制策略边界,也不会授予允许范围之外的访问权限。" } },
] satisfies ProductRow[],
surfacesHeading: { en: "Surfaces in the released terminal", zh: "已发布终端中的界面" },
+3 -3
View File
@@ -126,9 +126,9 @@ describe("shared getting-started path", () => {
it("describes the first session truthfully: keyless launch, provider for replies", () => {
const first = GETTING_STARTED_STEPS.find((s) => s.id === "first-session")!;
expect(first.body.en).toContain("without any API key");
expect(first.body.en).toContain("Plan mode");
expect(first.body.en).toMatch(/Model replies need a provider/);
expect(first.body.en).toMatch(/without an API key/);
expect(first.body.en).toContain("Plan blocks file mutation and shell execution");
expect(first.body.en).toMatch(/model replies need a configured provider/);
// The keyless-launch claim must stay backed by documented runtime
// behavior. Assert the meaning docs/GUIDE.md owes this step -- a first
// launch that asks only for the decisions still needed, and a provider
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "نماذجك",
modelsHeading: "أحضر ما لديك. لا تغيّر ما لم تختره.",
modelsBody:
"يأتي Codewhale مع {count} مزوّدًا ويعاملهم على قدم المساواة. احفظ المفتاح مرة واحدة، وسمِّ نموذجًا، ويبقى المسار كما ضبطته تمامًا. النماذج المحلية عبر vLLM أو SGLang أو Ollama لا تحتاج إلى مفتاح.",
"اربط مزوّدًا مستضافًا مدعومًا أو بوابة أو خادم نماذج محليًا. تحقّق من المزوّد والنموذج قبل البدء. قد يتطلب الخادم المحلي أيضًا المصادقة.",
modelsFacts: [
["مستضاف", "مفتاح API الخاص بك، محفوظ عبر codewhale auth set"],
["بوابة", "نقطة نهاية واحدة لنماذج كثيرة، والمزوّد ما زال من اختيارك"],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "Els teus models",
modelsHeading: "Porta el que tens. No canviïs res que no hagis triat.",
modelsBody:
"Codewhale inclou {count} proveïdors i els tracta com a iguals. Desa una clau un cop, anomena un model i la ruta es queda exactament com l’has fixat. Els models locals sobre vLLM, SGLang o Ollama no necessiten clau.",
"Connecta un proveïdor allotjat compatible, una passarel·la o un servidor de models local. Revisa el proveïdor i el model abans de començar. Un servidor local pot requerir autenticació.",
modelsFacts: [
["Allotjat", "La teva pròpia clau d’API, desada amb codewhale auth set"],
["Gateway", "Un endpoint per a molts models; el proveïdor el segueixes triant tu"],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "Deine Modelle",
modelsHeading: "Bring mit, was du hast. Ändere nichts, was du nicht gewählt hast.",
modelsBody:
"Codewhale bringt {count} Provider mit und behandelt sie als Gleiche. Speichere einen Schlüssel einmal, nenne ein Modell, und die Route bleibt genau so, wie du sie gesetzt hast. Lokale Modelle über vLLM, SGLang oder Ollama brauchen keinen Schlüssel.",
"Verbinde einen unterstützten gehosteten Anbieter, ein Gateway oder einen lokalen Modellserver. Prüfe Anbieter und Modell vor dem Start. Auch lokale Server können eine Anmeldung erfordern.",
modelsFacts: [
["Gehostet", "Dein eigener API-Schlüssel, gespeichert mit codewhale auth set"],
["Gateway", "Ein Endpoint für viele Modelle, den Provider wählst weiterhin du"],
+1 -1
View File
@@ -15,7 +15,7 @@ export const docsFleet: DocsFleetDict = {
"The TUI command {fleetStatusTui} and the shell command {fleetStatusShell} read the same durable fleet ledger. Use {fleetWorkers} (or {subagents}) for the sub-agents attached only to the current interactive session.",
profilesTitle: "Saved fleets, roles, and /fleet setup",
profilesLead:
"{fleetSaved} opens the picker for named saved fleets; bare /fleet opens the selected fleet's member roster. /fleet setup opens a progressive wizard for authoring a reusable roster member: one focused choice at a time — semantic role, model (inherit or a concrete configured route), thinking tier, then an exact identity/route review before save. Profiles live in project scope (.codewhale/agents/<role>.toml) or personal scope ($CODEWHALE_HOME/agents/<role>.toml); a same-id project profile wins. Runtime separately owns trust, filesystem/network reach, secrets, approvals, sandboxing, and tools, so profile storage scope never widens execution authority.",
"{fleetSaved} opens the picker for named saved fleets; bare /fleet opens the selected fleet's member roster. In v0.9.11, /fleet setup edits the selected named fleet. With no named fleet selected, it opens profile setup: choose a role and model, adjust optional thinking settings, then review before saving. Profiles live in project scope (.codewhale/agents/<role>.toml) or personal scope ($CODEWHALE_HOME/agents/<role>.toml); a same-id project profile wins. Runtime separately owns trust, filesystem/network reach, secrets, approvals, sandboxing, and tools, so profile storage scope never widens execution authority.",
workflowTitle: "Workflow orchestration",
workflowLead:
"Ordinary multi-agent work does not need Workflow: send normal messages in Operate and let Codewhale prefer background workers when parallelism, isolation, or duration makes delegation useful. Use Workflow when ordered phases, gates, shared budgets, replay, or deterministic fan-in matter. A Workflow script coordinates only: it selects fleet members but has no filesystem or shell; Runtime launches the real workers under live authority policy. Scripts use a declarative compile-only JS subset that lowers to a typed WorkflowSpec validated and executed by Rust; import, fetch, process, eval, and async/await are rejected.",
+11 -11
View File
@@ -19,7 +19,7 @@ export const home: HomeDict = {
heroTitleA: "Your models.",
heroTitleB: "More capable together.",
heroIntro:
"{brand} brings the models you already use into one terminal and lets them work as a crew — reading your code, editing, running the checks — while you decide what each one may do. Open source, on your machine.",
"{brand} puts coding agents in your terminal to read code, edit files, and run checks. Choose supported models and the session’s permission posture. Open source, on your machine.",
getCodewhale: "Get Codewhale",
exploreProduct: "Explore the product",
@@ -41,11 +41,11 @@ export const home: HomeDict = {
gainHeading: "Give your models a job to finish.",
gainLede:
"One session can hold several models at once, each in a role you gave it, all working in the same repository under the same rules.",
"Start with one model. Use Fleet to save a roster, and delegate parts of a task when the work benefits from more than one agent.",
gain: [
[
"Your models",
"Hosted keys, a gateway, or a local runtime with no key at all. Pin a different model to each role and keep the provider you chose — a model name never switches it for you.",
"Use a supported hosted provider, gateway, or local model server. Fleet stores model choices for reusable agent roles.",
],
[
"Capable agents",
@@ -58,15 +58,15 @@ export const home: HomeDict = {
],
chapterModels: "Your models",
modelsHeading: "Bring what you have. Change nothing you did not choose.",
modelsHeading: "A place for the models you choose.",
modelsBody:
"Codewhale ships with {count} providers and treats them as peers. Save a key once, name a model, and the route stays exactly as you set it. Local models over vLLM, SGLang, or Ollama need no key.",
"Connect a supported hosted provider, a gateway, or a local model server. Check the selected provider and model before starting work. Local servers may run without an API key, depending on their configuration.",
modelsFacts: [
["Hosted", "Your own API key, saved with codewhale auth set"],
["Gateway", "One endpoint for many models, provider still chosen by you"],
["Local", "vLLM, SGLang, Ollama on localhost — usually no key"],
],
modelsLink: "See every provider",
modelsLink: "Explore provider options",
startHeading: "Four steps to a first session.",
startLede:
@@ -86,13 +86,13 @@ export const home: HomeDict = {
],
[
"Web app",
"Sign-in and remote control available",
"Sign in or create an account, then type /rc in a running local session to continue that exact session from the browser. The rest of the browser workbench is a development preview.",
"Development preview",
"Account pages and browser pairing are implemented in development. Public end-to-end remote control has not been verified; use the terminal for released task execution.",
],
[
"Desktop",
"Development build",
"Alpha builds exist for macOS, Linux, and Windows. There is no released desktop app yet.",
"A local macOS development build has been tested. There is no released desktop app to download.",
],
[
"Cloud computers",
@@ -101,14 +101,14 @@ export const home: HomeDict = {
],
],
availabilityNote:
"No account is needed for the terminal. An account is never a paid plan by itself, and nothing on this site can charge you.",
"The terminal needs no Codewhale account. Hosted model providers bill under your own provider account; creating a Codewhale account does not purchase model access.",
accountLink: "Create an account",
surfacesHeading: "Use it where the work happens.",
surfaces: [
["TUI", "Interactive terminal work"],
["codewhale exec", "Scripts and CI"],
["Local web client", "Localhost interface; hosted remote control uses the Web app"],
["Local web client", "Localhost interface; hosted browser workbench in development"],
["Runtime API + MCP", "Local integrations"],
["Fleet", "Several agents on one job"],
],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "Tus modelos",
modelsHeading: "Trae lo que tienes. No cambies nada que no hayas elegido.",
modelsBody:
"Codewhale incluye {count} proveedores y los trata como iguales. Guarda una clave una vez, nombra un modelo y la ruta se queda exactamente como la fijaste. Los modelos locales sobre vLLM, SGLang u Ollama no necesitan clave.",
"Conecta un proveedor alojado compatible, una pasarela o un servidor de modelos local. Revisa el proveedor y el modelo antes de empezar. Un servidor local puede requerir autenticación.",
modelsFacts: [
["Alojado", "Tu propia clave de API, guardada con codewhale auth set"],
["Gateway", "Un endpoint para muchos modelos; el proveedor lo sigues eligiendo tú"],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "Vos modèles",
modelsHeading: "Apportez ce que vous avez. Ne changez rien que vous n’ayez choisi.",
modelsBody:
"Codewhale est livré avec {count} fournisseurs et les traite en égaux. Enregistrez une clé une fois, nommez un modèle, et la route reste exactement telle que vous l’avez fixée. Les modèles locaux via vLLM, SGLang ou Ollama n’ont pas besoin de clé.",
"Connectez un fournisseur hébergé compatible, une passerelle ou un serveur de modèles local. Vérifiez le fournisseur et le modèle avant de commencer. Un serveur local peut nécessiter une authentification.",
modelsFacts: [
["Hébergé", "Votre propre clé d’API, enregistrée avec codewhale auth set"],
["Passerelle", "Un seul endpoint pour de nombreux modèles, le fournisseur reste votre choix"],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "आपके मॉडल",
modelsHeading: "जो आपके पास है, वही लाइए। जो आपने नहीं चुना, वह नहीं बदलता।",
modelsBody:
"Codewhale में {count} प्रोवाइडर शामिल हैं और सबको बराबर माना जाता है। कुंजी एक बार सेव कीजिए, मॉडल का नाम दीजिए, और रूट ठीक वैसा ही रहता है जैसा आपने सेट किया। vLLM, SGLang या Ollama पर लोकल मॉडलों को कुंजी नहीं चाहिए।",
"समर्थित होस्टेड प्रदाता, गेटवे या स्थानीय मॉडल सर्वर जोड़ें। काम शुरू करने से पहले प्रदाता और मॉडल जाँचें। स्थानीय सर्वर को भी प्रमाणीकरण की आवश्यकता हो सकती है।",
modelsFacts: [
["होस्टेड", "आपकी अपनी API कुंजी, codewhale auth set से सेव"],
["गेटवे", "कई मॉडलों के लिए एक एंडपॉइंट, प्रोवाइडर फिर भी आप चुनते हैं"],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "Model Anda",
modelsHeading: "Bawa yang Anda punya. Jangan ubah yang tidak Anda pilih.",
modelsBody:
"Codewhale hadir dengan {count} penyedia dan memperlakukan semuanya setara. Simpan kunci sekali, sebutkan model, dan rute tetap persis seperti yang Anda atur. Model lokal lewat vLLM, SGLang, atau Ollama tidak butuh kunci.",
"Hubungkan penyedia yang didukung, gateway, atau server model lokal. Periksa penyedia dan model sebelum mulai bekerja. Server lokal juga dapat memerlukan autentikasi.",
modelsFacts: [
["Hosted", "Kunci API Anda sendiri, disimpan dengan codewhale auth set"],
["Gateway", "Satu endpoint untuk banyak model, penyedia tetap Anda yang pilih"],
+1 -1
View File
@@ -43,7 +43,7 @@ export const home: HomeDict = {
chapterModels: "I tuoi modelli",
modelsHeading: "Porta quello che hai. Non cambiare nulla che tu non abbia scelto.",
modelsBody:
"Codewhale include {count} provider e li tratta da pari. Salva una chiave una volta, indica un modello e la rotta resta esattamente come l’hai impostata. I modelli locali su vLLM, SGLang o Ollama non hanno bisogno di chiave.",
"Collega un provider ospitato supportato, un gateway o un server di modelli locale. Controlla provider e modello prima di iniziare. Anche un server locale può richiedere autenticazione.",
modelsFacts: [
["Hosted", "La tua chiave API, salvata con codewhale auth set"],
["Gateway", "Un endpoint per molti modelli, il provider lo scegli sempre tu"],
+1 -1
View File
@@ -42,7 +42,7 @@ export const home: HomeDict = {
chapterModels: "あなたのモデル",
modelsHeading: "持っているものを持ち込む。選んでいないものは変えない。",
modelsBody:
"Codewhale には {count} のプロバイダーが同梱され、どれも対等に扱われます。キーを一度保存し、モデル名を指定すれば、ルートは設定したとおりに保たれます。vLLM、SGLang、Ollama 上のローカルモデルにキーは不要です。",
"対応するホスト型プロバイダー、ゲートウェイ、またはローカルのモデルサーバーに接続できます。開始前にプロバイダーとモデルを確認してください。ローカルサーバーでも設定によって認証が必要です。",
modelsFacts: [
["ホスト型", "自分の API キーを codewhale auth set で保存"],
["ゲートウェイ", "ひとつのエンドポイントで多くのモデル、プロバイダーは自分で選ぶ"],
+1 -1
View File
@@ -42,7 +42,7 @@ export const home: HomeDict = {
chapterModels: "당신의 모델",
modelsHeading: "가진 것을 가져오세요. 고르지 않은 것은 바뀌지 않습니다.",
modelsBody:
"Codewhale에는 {count}개의 제공자가 내장되어 있고 모두 동등하게 다뤄집니다. 키를 한 번 저장하고 모델을 지정하면 경로는 설정한 그대로 유지됩니다. vLLM, SGLang, Ollama의 로컬 모델은 키가 필요 없습니다.",
"지원되는 호스팅 제공업체, 게이트웨이 또는 로컬 모델 서버를 연결하세요. 시작하기 전에 제공업체와 모델을 확인하세요. 로컬 서버도 설정에 따라 인증이 필요할 수 있습니다.",
modelsFacts: [
["호스팅", "codewhale auth set으로 저장한 내 API 키"],
["게이트웨이", "하나의 엔드포인트로 여러 모델, 제공자는 여전히 내가 선택"],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "Twoje modele",
modelsHeading: "Przynieś to, co masz. Nie zmieniaj niczego, czego nie wybrałeś.",
modelsBody:
"Codewhale ma wbudowanych {count} dostawców i traktuje ich równo. Zapisz klucz raz, podaj model, a trasa pozostanie dokładnie taka, jaką ustawiłeś. Lokalne modele przez vLLM, SGLang lub Ollamę nie potrzebują klucza.",
"Podłącz obsługiwanego dostawcę zdalnego, bramę lub lokalny serwer modeli. Przed rozpoczęciem sprawdź dostawcę i model. Lokalny serwer również może wymagać uwierzytelnienia.",
modelsFacts: [
["Hostowane", "Twój własny klucz API zapisany przez codewhale auth set"],
["Bramka", "Jeden endpoint do wielu modeli, dostawcę nadal wybierasz Ty"],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "Seus modelos",
modelsHeading: "Traga o que você tem. Não mude nada que você não escolheu.",
modelsBody:
"O Codewhale vem com {count} provedores e os trata como iguais. Salve uma chave uma vez, nomeie um modelo e a rota fica exatamente como você definiu. Modelos locais via vLLM, SGLang ou Ollama não precisam de chave.",
"Conecte um provedor hospedado compatível, um gateway ou um servidor de modelos local. Confira o provedor e o modelo antes de começar. Um servidor local pode exigir autenticação.",
modelsFacts: [
["Hospedado", "Sua própria chave de API, salva com codewhale auth set"],
["Gateway", "Um endpoint para muitos modelos, o provedor continua sendo escolha sua"],
+1 -1
View File
@@ -43,7 +43,7 @@ export const home: HomeDict = {
chapterModels: "Ваши модели",
modelsHeading: "Возьмите то, что есть. Не меняйте того, что не выбирали.",
modelsBody:
"В Codewhale встроено {count} провайдеров, и все они равноправны. Сохраните ключ один раз, укажите модель — и маршрут останется ровно таким, как вы его задали. Локальным моделям через vLLM, SGLang или Ollama ключ не нужен.",
"Подключите поддерживаемого облачного провайдера, шлюз или локальный сервер моделей. Перед началом проверьте провайдера и модель. Локальному серверу тоже может требоваться аутентификация.",
modelsFacts: [
["Облачные", "Ваш собственный ключ API, сохранённый через codewhale auth set"],
["Шлюз", "Одна точка входа для многих моделей, провайдера по-прежнему выбираете вы"],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "Senin modellerin",
modelsHeading: "Elindekini getir. Seçmediğin hiçbir şeyi değiştirme.",
modelsBody:
"Codewhale {count} sağlayıcıyla gelir ve hepsine eşit davranır. Anahtarı bir kez kaydet, bir model adı ver; rota tam senin ayarladığın gibi kalır. vLLM, SGLang ya da Ollama üzerindeki yerel modeller anahtar gerektirmez.",
"Desteklenen bir barındırılan sağlayıcıya, ağ geçidine veya yerel model sunucusuna bağlanın. Başlamadan önce sağlayıcıyı ve modeli kontrol edin. Yerel sunucular da kimlik doğrulaması gerektirebilir.",
modelsFacts: [
["Barındırılan", "codewhale auth set ile kaydedilen kendi API anahtarın"],
["Gateway", "Birçok model için tek uç nokta, sağlayıcıyı yine sen seçersin"],
+1 -1
View File
@@ -245,7 +245,7 @@ export interface HomeDict {
gainLede: string;
gain: [string, string][];
/** Models chapter. `modelsBody` carries a `{count}` token. */
/** Models chapter. */
chapterModels: string;
modelsHeading: string;
modelsBody: string;
+1 -1
View File
@@ -43,7 +43,7 @@ export const home: HomeDict = {
chapterModels: "Ваші моделі",
modelsHeading: "Візьміть те, що маєте. Не змінюйте того, чого не обирали.",
modelsBody:
"У Codewhale вбудовано {count} провайдерів, і всі вони рівноправні. Збережіть ключ один раз, вкажіть модель — і маршрут залишиться саме таким, як ви його задали. Локальним моделям через vLLM, SGLang або Ollama ключ не потрібен.",
"Підключіть підтримуваного хмарного провайдера, шлюз або локальний сервер моделей. Перед початком перевірте провайдера й модель. Локальний сервер також може вимагати автентифікацію.",
modelsFacts: [
["Хмарні", "Ваш власний ключ API, збережений через codewhale auth set"],
["Шлюз", "Одна точка входу для багатьох моделей, провайдера так само обираєте ви"],
+1 -1
View File
@@ -44,7 +44,7 @@ export const home: HomeDict = {
chapterModels: "Mô hình của bạn",
modelsHeading: "Mang theo những gì bạn có. Không đổi gì bạn chưa chọn.",
modelsBody:
"Codewhale đi kèm {count} nhà cung cấp và đối xử bình đẳng với tất cả. Lưu khóa một lần, đặt tên mô hình, và tuyến đường giữ nguyên như bạn đặt. Mô hình cục bộ qua vLLM, SGLang hoặc Ollama không cần khóa.",
"Kết nối nhà cung cấp được hỗ trợ, cổng trung gian hoặc máy chủ mô hình cục bộ. Kiểm tra nhà cung cấp và mô hình trước khi bắt đầu. Máy chủ cục bộ cũng có thể yêu cầu xác thực.",
modelsFacts: [
["Hosted", "Khóa API của bạn, lưu bằng codewhale auth set"],
["Gateway", "Một endpoint cho nhiều mô hình, nhà cung cấp vẫn do bạn chọn"],
+1 -1
View File
@@ -14,7 +14,7 @@ export const docsFleet: DocsFleetDict = {
"TUI 命令 {fleetStatusTui} 与 shell 命令 {fleetStatusShell} 读取同一份持久 fleet 台账。若要查看仅附着于当前交互会话的子 Agent,请使用 {fleetWorkers}(或 {subagents})。",
profilesTitle: "已保存 fleet、角色与 /fleet setup",
profilesLead:
"{fleetSaved} 打开已命名保存 fleet 的选择器;裸 /fleet 打开当前所选 fleet 的成员花名册。/fleet setup 打开渐进式向导来编写可复用的花名册成员:依次选择语义角色、模型(继承或具体已配置路由)和思考档位,再核对准确的身份与路由后保存。档案可写在项目级(.codewhale/agents/<role>.toml)或个人级($CODEWHALE_HOME/agents/<role>.toml);同 ID 的项目档案优先。Runtime 另行负责信任、文件系统/网络范围、密钥、审批、沙箱和工具,因此档案存储范围不会扩大执行权限。",
"{fleetSaved} 打开已命名保存 fleet 的选择器;裸 /fleet 打开当前所选 fleet 的成员花名册。在 v0.9.11 中,/fleet setup 编辑当前选中的命名 fleet。未选中命名 fleet 时,它打开角色档案设置:选择角色与模型、按需调整思考设置,然后核对并保存。档案可写在项目级(.codewhale/agents/<role>.toml)或个人级($CODEWHALE_HOME/agents/<role>.toml);同 ID 的项目档案优先。Runtime 另行负责信任、文件系统/网络范围、密钥、审批、沙箱和工具,因此档案存储范围不会扩大执行权限。",
workflowTitle: "Workflow 编排",
workflowLead:
"普通多 Agent 工作不需要 Workflow:在 Operate 里直接发消息,需要并行、隔离或长时间工作时让 Codewhale 优先委派后台 worker 即可。只有当工作需要有序阶段、门禁、共享预算、回放或确定性汇总时才用 Workflow。Workflow 脚本只负责协调:它选择 fleet 成员,但没有自己的文件系统或 shell;Runtime 在实时权限策略下启动真正的 worker。脚本使用编译专用的声明式 JS 子集,降低到类型化 WorkflowSpec 后由 Rust 校验与执行;import、fetch、process、eval、async/await 会被拒绝。",
+10 -10
View File
@@ -16,7 +16,7 @@ export const home: HomeDict = {
heroTitleA: "你的模型,",
heroTitleB: "协作更强。",
heroIntro:
"{brand} 把你已经在用的模型带进同一个终端,让它们像一支船员一样协作——读代码、改文件、跑检查——而每个模型能做什么,由你来定。开源,跑在你自己的机器上。",
"{brand} 把编程智能体带进终端,用来读代码、改文件、跑检查。选择支持的模型,并设置会话的权限策略。开源,运行在你自己的机器上。",
getCodewhale: "获取 Codewhale",
exploreProduct: "了解产品",
shotPreview: "终端预览",
@@ -33,22 +33,22 @@ export const home: HomeDict = {
chapterTerminal: "你的终端",
chapterTerminalTitle: "从熟悉的地方开始。",
gainHeading: "让你的模型把任务做完。",
gainLede: "一个会话可以同时容纳多个模型,各司其职,在同一个仓库里按同一套规则工作。",
gainLede: "先从一个模型开始。用 Fleet 保存成员配置;当任务适合分工时,再把部分工作委派给其他智能体。",
gain: [
["你的模型", "托管密钥、网关,或者完全不需要密钥的本地运行时。给每个角色固定一个模型,提供商始终是你选的那个——模型名不会替你切换。"],
["你的模型", "使用支持的托管提供商、网关或本地模型服务。Fleet 保存可复用智能体角色的模型选择。"],
["能干的智能体", "Plan、Work、Operate 三种模式;一支 fleet 为同一件事分工;文件、shell、网页和 MCP 工具;可保存、恢复、回滚的会话。"],
["本机掌控", "Ask、Auto-Review 或 Full Access——它在问你之前能做多少,由你设定。本地运行,系统允许时启用沙箱,审计日志你随时能读。"],
],
chapterModels: "你的模型",
modelsHeading: "带上你已有的,不改你未选的。",
modelsHeading: "为你选择的模型留一个位置。",
modelsBody:
"Codewhale 内置 {count} 个提供商,一视同仁。保存一次密钥,指定一个模型,路由就保持你设定的样子。vLLM、SGLang 或 Ollama 上的本地模型不需要密钥。",
"连接支持的托管提供商、网关或本地模型服务。开始工作前,检查所选提供商与模型。本地服务是否需要 API 密钥,取决于它的配置。",
modelsFacts: [
["托管", "你自己的 API 密钥,用 codewhale auth set 保存"],
["网关", "一个端点接多个模型,提供商仍由你选"],
["本地", "localhost 上的 vLLM、SGLang、Ollama——通常无需密钥"],
],
modelsLink: "查看所有提供商",
modelsLink: "了解提供商选项",
startHeading: "四步开始第一个会话。",
startLede: "安装,无需密钥打开会话,接入提供商;一个模型不够时,再配置 fleet。",
startGuideLink: "阅读新手指引",
@@ -58,17 +58,17 @@ export const home: HomeDict = {
availabilityLede: "终端是已发布的产品。其余的按实际状态列出。",
availability: [
["终端", "已发布", "优先使用 GitHub Releases 中适用于 Linux、macOS、Windows 的二进制;npm 和 Cargo 为其他安装方式。Android 上的 Termux 为预览。"],
["网页应用", "登录与远程控制可用", "登录或创建账户,然后在正在运行的本地会话里输入 /rc,即可在浏览器中继续这同一个会话。浏览器工作台的其余部分仍是开发预览。"],
["桌面端", "开发版本", "macOS、Linux、Windows 有 alpha 构建。桌面应用尚未正式发布。"],
["网页应用", "开发预览", "账户页面与浏览器配对已在开发版本中实现。公开服务上的端到端远程控制尚未验证;已发布的任务执行入口是终端。"],
["桌面端", "开发版本", "本地 macOS 开发构建已做过测试。尚无已发布的桌面应用可供下载。"],
["云端计算机", "暂不可用", "在托管计算机上运行工作仍在开发中。等它真正可用时,本页会如实说明。"],
],
availabilityNote: "终端不需要账户。账户本身从不等于付费方案,本站也无法向你收费。",
availabilityNote: "终端不需要 Codewhale 账户。托管模型按你自己的提供商账户计费;创建 Codewhale 账户不会购买模型访问权限。",
accountLink: "创建账户",
surfacesHeading: "活在哪里干,就在哪里用。",
surfaces: [
["TUI", "交互式终端工作"],
["codewhale exec", "脚本与 CI"],
["本地 Web 客户端", "本机界面;托管远程控制使用网页应用"],
["本地 Web 客户端", "本机界面;托管浏览器工作台仍在开发中"],
["运行时 API + MCP", "本地集成"],
["fleet", "多个智能体协作一件事"],
],
+3 -7
View File
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from "node:fs";
import { describe, expect, it } from "vitest";
import { FACTS } from "./facts.generated";
import { RELEASE_CONTRIBUTORS, RELEASE_HELPERS } from "./release-credits";
import { EN_CHROME, EN_DOCS_SHELL, EN_HOME, getChrome, getHome } from "./i18n/dictionaries";
import { EN_CHROME, EN_DOCS_SHELL, EN_HOME, getChrome } from "./i18n/dictionaries";
function pageSource(path: string): string {
return readFileSync(new URL(`../app/[locale]/${path}`, import.meta.url), "utf8");
@@ -94,12 +94,8 @@ describe("public website copy contracts", () => {
// the internal "source candidate" / "provider routes" vocabulary.
expect(EN_HOME.sourceCandidate).toBe("Unreleased");
expect(EN_HOME.currentSource).toBe("Source");
expect(homepage).toContain("fill(d.providerRoutes, { count: providerCount })");
expect(EN_HOME.providerRoutes).toBe("{count} providers");
for (const locale of ["zh", "ja", "ru", "pt-BR"]) {
expect(getHome(locale).providerRoutes, `${locale} providerRoutes`).toContain("{count}");
expect(getHome(locale).sourceCandidate.trim().length).toBeGreaterThan(0);
}
// A development-source route count is not a released-provider total.
expect(homepage).not.toContain("<span>{providerRoutes}</span>");
expect(homepage).not.toContain("releases/tag/v${version}");
expect(homepage).not.toMatch(/Codewhale v0\.9\.1|\"v0\.9\.1 \u00b7/);
expect(install).toContain("publishedRelease.tag");