7910 Commits

Author SHA1 Message Date
Shizuku c366ca33c7 fix(tui): restore /title as an independent terminal window title (#5430)
/title was merged into /rename in 24c7dee46 as a discoverable alias sharing
the session name, which made long descriptive session names dominate the
terminal tab and left no way to give parallel windows a short identity.
Restore the independent design from 8b6bcc5e0: /title sets a per-session
tab/window title (persisted on SavedSession.window_title), /title off
clears it, and the root 'title' config key (editable via /config title
... --save) supplies the default. The session *name* stays owned by
/rename. The mid-first-turn recovery added by #5444 is reused so /title
applies immediately on a live first turn too.
2026-08-19 02:23:19 +08:00
Paulo Aboim Pinto 5a4eaa5104 Merge remote-tracking branch 'origin/main' into feat/FEAT-015-command-shape-adapters 2026-08-18 17:32:43 +02:00
CodeWhale Bot 909ebd2be9 web: advance published release record to v0.9.9
Record the public GitHub Release in the generated and documented web facts so a cold deploy cannot regress the install surface to v0.9.8.\n\nChecks: web prebuild, facts/docs/locale checks, 267 Vitest tests, ESLint.\n\nNo-Issue: post-release public-surface bookkeeping
2026-08-18 07:31:37 -07:00
Paulo Aboim Pinto 4198f9e6c7 test(pty): reset raw-detail pager before evidence scan 2026-08-18 16:24:51 +02:00
Paulo Aboim Pinto ef0047bc2f test(runtime): allow cancellation lifecycle settlement budget 2026-08-18 15:37:48 +02:00
Paulo Aboim Pinto 4340c3969e fix(ci): preserve ancestry during migration baseline fetch 2026-08-18 14:55:42 +02:00
Shizuku c0d0e51528 docs(i18n): move Indonesian docs into docs/id/ with redirect stubs
- Move all 10 docs/*.id.md files into docs/id/ (dropping the .id
  suffix), leaving English redirect stubs at the old paths for one
  release cycle
- Update README.id.md links to point at docs/id/
- Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note

Part of #5482

Signed-off-by: Shizuku <2163018547@qq.com>
2026-08-18 20:49:56 +08:00
Shizuku 97eaf6627a docs(i18n): complete Tier 1 of Chinese docs localization (#5482)
- Move LSP_PHP_CUSTOM.zh-CN.md and WINDOWS_BEGINNER.zh-CN.md into
  docs/zh_hans/ (dropping the .zh-CN suffix), leaving redirect stubs at
  the old paths for one release cycle
- Add docs/zh_hans/README.md as the canonical Chinese reading index,
  ordered by experience level (beginner / getting-started / power user /
  developer)
- Add a language-switcher banner to docs/LSP_PHP_CUSTOM.md and
  back-link/last-synced stamps to both migrated Chinese docs
- Note in LOCALIZATION.md that docs translations are not a locale
  surface; their status lives in docs/zh_hans/README.md and #5482

Part of #5482

Signed-off-by: Shizuku <2163018547@qq.com>
2026-08-18 20:49:55 +08:00
Paulo Aboim Pinto 58d8a0bb1f fix(ci): scope PR credit checks to immutable base SHA 2026-08-18 14:47:10 +02:00
Paulo Aboim Pinto 928ad6c2a4 fix(ci): refresh PR base tracking ref for credit range 2026-08-18 14:39:15 +02:00
Paulo Aboim Pinto 7b41d55711 Merge remote-tracking branch 'origin/main' into feat/FEAT-015-command-shape-adapters 2026-08-18 13:40:03 +02:00
Paulo Aboim Pinto e159f577c7 fix(FEAT-015): close command extraction boundary gaps
Delegate capability mutations through authoritative App operations, bridge portable RegisterCommand metadata into the TUI registry, and enforce monotonic migration-frontier transitions against the baseline revision.
2026-08-18 13:39:59 +02:00
CodeWhale Bot 6f3850c3d7 fix(release): retry transient npm smoke cleanup
Use Node's bounded recursive-removal retries so delayed Windows handle release after concurrent wrapper downloads does not fail an otherwise successful smoke. Persistent cleanup errors still reject after the finite retry window.

No-Issue: owner-directed v0.9.9 Windows release-smoke hardening
v0.9.9
2026-08-18 03:40:39 -07:00
CodeWhale Bot 7947dbbc7d fix(tui): repin prompt after session sync
Clear conversation-local prompt pin and drift-baseline state whenever SyncSession installs a new or restored prefix. This makes the next turn send a full system prompt instead of treating it as workspace drift from the previous conversation, while host-owned overrides remain byte-stable.

Fixes #5505
2026-08-18 02:48:38 -07:00
WissssleyL 77545b3d70 test(web): spawn the deploy preflight script by a decoded path (#5503)
lib/deploy-preflight.test.ts spawns check-cloudflare-deploy-env.mjs by
URL.pathname, which stays percent-encoded. In a checkout under a path
with non-ASCII characters the spawned filename does not exist, node
exits on module-not-found, and the 7 cases in the file that spawn the
script fail on the exit code — reading as a missing-credentials failure
when nothing about the environment is wrong. The other 5 read
package.json and the workflow file directly and are unaffected.

fileURLToPath decodes it, which is what the scripts under web/scripts/
already do.
2026-08-18 02:37:23 -07:00
CodeWhale Bot 0ce754652d test(telemetry): isolate sentinel MCP fixture
Keep the MCP-name sentinel in parsed config without launching a process that intentionally exits before initialization. Drain and assert the mid-session child so future early exits identify their actual cause.

No-Issue: owner-directed v0.9.9 CI isolation repair
2026-08-18 02:31:52 -07:00
CodeWhale Bot 83c8fb7fa4 fix(release): stamp CNB tag binaries
Bind the CNB tag build to the checked-out commit before compiling and fail if CNB's advertised commit disagrees. Keep the release notes on the same verified identity and lock the ordering in the workflow contract test.

No-Issue: owner-directed v0.9.9 CNB release identity gate
2026-08-18 02:00:59 -07:00
CodeWhale Bot f88809f907 fix(deps): update h2 to 0.4.16
Resolve RUSTSEC-2026-0258 by moving the locked HTTP/2 implementation to its patched release. Preserve the existing dependency graph and change only h2's version and checksum.

Verified with cargo audit, the locked all-target workspace check, strict all-feature clippy, and the app-server HTTP test suite.

No-Issue: newly disclosed release-blocking RustSec advisory
2026-08-18 01:51:50 -07:00
CodeWhale Bot af254a6db8 fix(tui): preserve leading-space raw pastes
Hold an actionable Space through the raw-paste ambiguity window, dispatch it as a transcript action only when the detector flushes one typed character, and keep leading Space intact when another rapid byte proves paste payload.

No-Issue: owner-directed v0.9.9 Ghostty reasoning QA follow-up
2026-08-18 01:36:44 -07:00
CodeWhale Bot b30986d15f fix(dsh): mount brand through overlay slot
Render the Whale Brothers / Codewhale lockup as a pure React component in DSH’s additive shell.overlay slot. Preserve the existing responsive styling and ARIA contract without touching document.body or installing window listeners.

Verified with formatting, 38 focused DSH tests, strict all-target clippy, and live Chrome wide/narrow browser QA against DSH 0.1.0-rc.6.

No-Issue: owner-directed v0.9.9 DSH integration hardening

Signed-off-by: Hunter Bown <hunter@hunterbown.com>
2026-08-18 01:36:43 -07:00
CodeWhale Bot a36793de34 fix(tui): smooth Ghostty truecolor motion
Move native Ghostty off the legacy 30 FPS compatibility lane and onto a synchronized 60 FPS cap. Cross-fade caustic color changes without changing their authored 12-column topology, while preserving the safer 30 FPS path inside tmux and SSH.

Verified with the real release binary in Ghostty, focused cadence and truecolor tests, formatting, and strict TUI clippy.

No-Issue: owner-reported real Ghostty v0.9.9 QA regression
2026-08-18 01:36:42 -07:00
Lstarsky0 ca001891fb feat(web): move docs/hooks and docs/troubleshooting onto the dictionary spine (#5337)
Both page bodies branched on isZh for every string, so the 16 partial
locales had nowhere to put a translation and the copy sat outside the
check:locales and dictionaries.test.ts parity gates.

The copy moves verbatim into web/lib/i18n/dictionaries/<code>/, en plus
zh, and both pages read one dictionary. Every other locale resolves to
the English reference exactly as the ternaries did.

The hooks overview sentence typesets [[hooks.hooks]], /hooks and
[hooks].enabled as inline code. Those are config syntax rather than
copy, so they stay in the page and the sentence carries a {token} for
each one, which also puts it under the existing token-parity check.
splitTokens splits a template on every token it carries — splitToken
handles one, and this sentence has three.
2026-08-18 16:34:44 +08:00
CodeWhale Bot d09cbd93da fix(tui): honor reasoning space and free viewport rows
Route an actionable reasoning Space before the raw paste-burst hold while preserving spaces inside an already-active paste.

Render the newest reasoning receipt at its compact baseline, then spend only rows genuinely unused by the full transcript viewport before truncating. Historical reasoning and explicit summaries keep their compact limits.

No-Issue: owner-reported real Ghostty v0.9.9 QA regression
2026-08-18 01:06:00 -07:00
CodeWhale Bot 03bfcada49 feat(dsh): make the Codewhale skin unmistakable
Mount a reversible Whale Brothers / Codewhale identity lockup through the generated DSH bundle client and strengthen the ocean scene so the integration reads clearly at a glance.

Keep the surface pointer-inert, responsive below 760 px, additive to DSH-owned branding, and covered by deterministic fragment identity, focused tests, and release documentation.

No-Issue: owner-directed v0.9.9 DSH identity refinement

Signed-off-by: Hunter Bown <hunter@hunterbown.com>
2026-08-18 00:21:49 -07:00
CodeWhale Bot f062616b5f web(geo): advertise only translated page variants
Keep partial-locale routes available while canonicalizing English fallbacks to their source. Generate sitemap and hreflang entries from page-body translation coverage and omit synthetic last-modified timestamps.

Verified with the complete web gate: generated facts, facts/docs/locale checks, 267 tests, lint, and the production build.

Signed-off-by: Hunter Bown <hunter@hunterbown.com>
2026-08-18 00:03:45 -07:00
Hunter Bown 15a1c24fa6 Merge pull request #5500 from Hmbown/codex/v099-telemetry-test-isolation
test(ci): harden release gate concurrency
2026-08-18 00:03:33 -07:00
CodeWhale Bot 4c014cc598 test(ci): harden release gate concurrency
Serialize telemetry contract processes under nextest so their cross-process lock fixtures cannot race each other, and retry the fixture's short-lived arming lock transition.

Use the runtime-thread suite's existing deadlock watchdog for engine-stream settlement and eviction on loaded Windows runners.

Verified: cargo fmt --all -- --check; all 15 telemetry contract tests; closed_engine_event_stream_fails_turn_items_and_evicts_engine.
2026-08-17 23:21:36 -07:00
Hunter Bown f2ceb177e4 Merge pull request #5499 from Hmbown/release/v0.9.9
release: v0.9.9
2026-08-17 22:36:16 -07:00
CodeWhale Bot d1c99270f9 docs(release): sync v0.9.9 contributor credits
Keep the current-release contributor ledger, website credit arrays, and public surface facts in exact parity with the v0.9.9 changelog. Record Gabriel-Degret's first contribution and the full h3c-hexin skills fold-in.\n\nVerified with all 266 web tests, facts/docs parity, ESLint, TypeScript, and the 512-page production build.

Signed-off-by: Hunter Bown <hunter@hunterbown.com>
2026-08-17 21:51:05 -07:00
CodeWhale Bot 7f0365c826 docs(release): finalize v0.9.9 changelog
Document the late fold-ins for narrow TUI metrics, rustdoc, configured skill stability, auto-router timeout, bounded CI jobs, web localization, rusqlite, docs cleanup, and OrcaRouter billing.\n\nCredit h3c-hexin and first-time contributor Gabriel-Degret, then keep the root and TUI changelogs synchronized.\n\nVerified by the version check, crate publication dry-run, optimized release build, npm wrapper smoke, and full workspace test suite.

Signed-off-by: Hunter Bown <hunter@hunterbown.com>
2026-08-17 21:47:18 -07:00
Hunter Bown 227f9c05a7 Merge pull request #5498 from Hmbown/codex/v099-fleet-test-isolation
test(fleet): isolate delete flow from user state
2026-08-17 21:47:03 -07:00
Hunter Bown b76cc20888 Merge pull request #5495 from Hmbown/codex/v099-ci-job-timeouts
ci: cap every ci.yml job with timeout-minutes
2026-08-17 21:32:55 -07:00
Hunter Bown f2778be1b8 Merge pull request #5492 from Hmbown/codex/upstream-stable-configured-skills
fix(skills): keep configured prompt paths stable (#5473)
2026-08-17 21:27:58 -07:00
CodeWhale Bot 0653349cd5 test(fleet): isolate delete flow from user state
The delete-confirmation test assumed an empty personal Fleet directory and failed on maintainer machines with real Fleets. Give it a temporary CODEWHALE_HOME so both the list and deletion assertions are hermetic.\n\nVerified with the exact failing test and the complete fleet_list test module.

Signed-off-by: Hunter Bown <hunter@hunterbown.com>
2026-08-17 21:05:12 -07:00
CodeWhale Bot f0daf2cf2b fix(skills): replace configured roots at path boundaries (#5473)
Avoid prefix collisions in model-facing warning sanitization and match Path::display output for legal non-UTF-8 Unix roots.\n\nVerified with 218 focused skills tests and the 55-metric runtime-contract gate.\n\nNo-Issue: addresses review feedback on #5492.
2026-08-17 20:42:59 -07:00
CodeWhale Bot aeda986690 fix(skills): keep configured prompts stable on Windows (#5473)
Normalize model-facing warning separators, preserve discoverable paths for ordinary workspace roots, and keep custom configured roots private. Trim redundant prompt prose so the stricter behavior remains below the existing contract ceiling.\n\nVerified with 216 focused skills tests and the 55-metric runtime-contract gate.\n\nNo-Issue: follow-up corrections for #5492.
2026-08-17 20:36:41 -07:00
CodeWhale Bot 3f7bcaa250 ci: cap every ci.yml job with timeout-minutes so dead runners fail fast
None of the ten ci.yml jobs set timeout-minutes, so GitHub's 360-minute
default applied. A runner that gets assigned but never executes (logs 404
forever, job stuck in_progress) can sit on a required gate for up to six
hours: tonight the #5492 Lint job did exactly that for 73+ minutes with
zero log output until a human cancelled it and reran.

Caps are generous against observed cold-run maxima (Lint ~15m, Test
macOS ~60m): changes/versions/integrations/actionlint 10-15m, lint and
smokes 30m, docs 60m, the test matrix 90m. Legitimate slow builds keep
their headroom; only a runner that is dead or never produces logs now
fails the job quickly and visibly, so the gate says fail instead of
hanging.

No-Issue: hardening discovered while merging the 0.9.9 fold-in queue
(#5492 Lint hung runner).
2026-08-17 20:06:51 -07:00
Hunter Bown 41e9b687c4 Merge pull request #5494 from Gabriel-Degret/codex/auto-router-timeout
feat(config): configurable auto-router classifier timeout
2026-08-17 19:44:21 -07:00
Hunter Bown 08a9af1770 Merge pull request #5493 from Hmbown/codex/v099-orcarouter-billing-surface
fix(pricing): classify Orcarouter as an aggregator billing surface
2026-08-17 19:44:18 -07:00
CodeWhale Bot 72ac0f27e6 chore(contract): accept the configured-skills placeholder identity re-base (#5473)
The configured-skills stability change swaps a 33-char fixture skills root
for the 19-char <configured-skills> token in the representative skill-stage
warning, so every stage from skill onward re-hashes (identities are digests
of the normalized prompt text).

Identities re-measured via scripts/measure-runtime-contract.py on the
hermetic representative fixture (tempdir workspace + pinned HOME/SHELL;
path/platform normalization makes the normalized text host-independent).
Byte ceilings are unchanged: the change shrinks the prompt and one-way
ceilings pass decreases automatically. This is the maintainer re-base the
budget comment calls for when a prompt change is deliberate.

No-Issue: budget identity re-base for #5473 / #5492.
2026-08-17 18:45:09 -07:00
CodeWhale Bot 89e2710c60 fix(skills): normalize Windows separators in model-facing skill paths (#5473)
The catalog is prompt text the model reads, not a shell path: on Windows
Path::display() emits backslashes, so workspace-relative entries like
.claude/skills/workspace-skill/SKILL.md rendered with backslashes and the
new stability test failed on windows-latest. Render every privacy-safe
skill path through one normalizer that maps the platform separator to '/'.
Also collapse the nested if in prompt_skill_path so clippy -D warnings
stays green. Verified: cargo test -p codewhale-tui --lib skills::tests
96 passed locally.
2026-08-17 18:29:13 -07:00
hexin 31aaeab656 perf(skills): 稳定配置型技能提示词前缀
配置型技能根目录可能随会话变化。模型目录仅保留稳定名称和描述,警告中的根路径改用逻辑占位符;其他技能来源和内部 load_skill 解析保持不变。

Signed-off-by: hexin <372726039@qq.com>
2026-08-17 18:29:10 -07:00
CodeWhale Bot 86c0d0ad83 fix(pricing): classify Orcarouter's default endpoint as an aggregator billing surface
The aggregator arm listed Openrouter | NvidiaNim | OpencodeZen only, so the
official OrcaRouter endpoint (https://api.orcarouter.ai/v1, provider kind and
defaults landed in #5321) fell through to the first-party PAYG surface.
OrcaRouter is a zero-markup router/aggregator (Continuum AI Corp; models.dev
publishes an orcarouter provider with 81 rows, api.orcarouter.ai/v1/models
verified live), so its default URL joins the aggregator arm. Pinned by a
billing-surface table test next to OpenRouter's. Truth change for the billing
surface label; clamp and price values untouched.

Verified: cargo test -p codewhale-tui --lib pricing -> 80 passed.

No-Issue: follow-up to the OrcaRouter wiring from #5321; the mislabel was
found during the 0.9.9 provider-completeness audit.
2026-08-17 18:13:50 -07:00
Hunter Bown 0788ceae19 Merge pull request #5489 from Hmbown/codex/v0910-rustdoc-bare-url-fix
fix(tui): wrap bare URLs in rustdoc comments
2026-08-17 18:01:54 -07:00
Gabriel Degret 674cd56e98 feat(config): configurable auto-router classifier timeout
Add [auto.router] timeout_secs (default 4, 0 = default, clamped to 300). The classifier call previously used a hardcoded 4s cap, too tight for local OpenAI-compatible routers (llama.cpp) where a queue delay silently downgrades Auto to the local heuristic. Plumbing: AutoRouterConfig field + Config accessor, carried on ModelInventory, used by both timeout paths in auto_route_inventory_recommendation. Covered by inventory_router_timeout_secs_respects_config_with_clamp.
2026-08-18 00:57:12 +00:00
Hunter Bown e82a6dc7f3 Merge pull request #5391 from Hmbown/dependabot/cargo/rusqlite-0.40.2
chore(deps): bump rusqlite from 0.39.0 to 0.40.2
2026-08-17 17:22:19 -07:00
Hunter Bown f0a6e9e27f Merge pull request #5490 from Lstarsky0/feat/components-picktext
feat(web): route shared components' locale picks through pickText (#5337)
2026-08-17 17:22:11 -07:00
Hunter Bown 59b790914e Merge pull request #5488 from Lstarsky0/feat/docs-shell-dictionary
feat(web): move the docs shell onto the dictionary spine (#5337)
2026-08-17 17:22:07 -07:00
Hunter Bown 3099d6eb95 Merge pull request #5481 from SparkofSpike/codex/feat-topbar-title
docs: fix outdated A/B/C-tier references and stale anchors for v0.9.9
2026-08-17 17:21:55 -07:00
Hunter Bown c7509e993b Merge pull request #5486 from Lstarsky0/fix/compact-hides-session-metrics
fix(tui): hide the session metrics strip on compact rows
2026-08-17 17:21:45 -07:00