Commit Graph
1852 Commits
Author SHA1 Message Date
Bellman 22fe36072a Merge pull request #3363 from ultraworkers/release/v0.1.7
release: v0.1.7
v0.1.7
2026-10-19 13:07:03 +09:00
clawdbot 0a899b630b test: update user-agent version check to 0.1.7 2026-10-19 04:04:04 +00:00
clawdbot 3e514dbf18 release: v0.1.7 2026-10-19 04:01:05 +00:00
twtrubiks 66418c6127 fix(runtime): name the session model in the system prompt (#3359)
The environment section rendered "Model family: Claude Opus 4.6" for
every Anthropic model, so claude-opus-5-5, claude-sonnet-4-6, and any
other Claude model told users it was Opus 4.6.

Render a neutral "Claude" family label followed by the resolved model
ID, and rebuild the system prompt on /model so the line follows a
mid-session switch instead of keeping the startup model.
2026-10-19 04:52:41 +01:00
twtrubiks 3cc90cfc7a feat(runtime): add OpenAI, xAI, and DashScope pricing (#3358)
Models from the OpenAI-compatible providers fell back to
default_sonnet_tier ($3/$15 per MTok), so e.g. gpt-5.4-nano was
estimated at 15x its input price and qwen-plus at about 26x.

Add a table of published rates keyed by model id, matching dated
snapshots and -latest aliases:

- OpenAI standard tier for current gpt-6 / gpt-5.x / gpt-4.1 / gpt-4o
  and o-series models (Responses-only pro models are omitted).
- xAI grok-4.x and grok-build. Slugs retired on 2026-05-15 (grok-3,
  grok-4-0709, grok-4-fast-*, grok-4-1-fast-*) are billed at grok-4.3
  rates, and grok-code-fast-* is served as grok-build.
- DashScope qwen-max, qwen-plus, qwen-flash and kimi-k2.5 at China
  (Beijing) rates, which is claw's default DashScope endpoint, with
  non-thinking output and the 20% implicit-cache hit rate.

Long-context and higher input tiers use the base rate because usage is
aggregated across requests.
2026-10-19 12:15:58 +09:00
clawdbot b8f93afbb3 fix: parallel tool-result pairing, terminal-scope path limit, credential hint
Merge PR #3360 from c01dsummer/claw-code (fix/roadmap-835-838)

Four fixes addressing issues #3361 and #3360:

1. Parallel tool-result pairing (835): The Anthropic Messages API requires all
   tool results of a turn to be in a single message. When a turn issued two tool
   calls at once, the results were sent in separate messages, causing a 400 error.
   Fixed by merging adjacent tool-result-only messages into one.

2. Terminal-scope path limit (836): Correlation keys up to 512 bytes expanded to
   1024+ hex characters, exceeding APFS's 1024-byte total path limit. Fixed by
   using SHA256 digest (32 hex chars) for path components while storing the full
   key in the record for exact matching.

3. Credential hint (838): When ANTHROPIC_BASE_URL points to a non-Anthropic
   endpoint (DeepSeek, corporate gateways), the missing-credentials error now
   explains that the endpoint expects its own credentials, not Anthropic's.

4. ROADMAP entries: Documents all three fixes with verification details.

All tests pass (370+ for rusty-claude-cli, 240+ for sdk, 122+ for tools, 209+ for
api). Formatting verified with cargo fmt. CI checks approved and passed.

Fixes #3361, #3360
2026-10-19 03:11:01 +00:00
twtrubiks c55c7e4710 fix(runtime): skip non-UTF-8 environment variables instead of panicking (#3356)
std::env::vars() panics on any non-UTF-8 value. zsh exports a metafied
$_ when the command path contains non-ASCII characters (e.g. 下載), so
claw panicked on startup. Use vars_os() and skip entries that are not
valid UTF-8.
2026-10-19 12:04:36 +09:00
Wu Shuwen 917a9e28ee fix(plugins): cfg-gate non-Windows hook path import (#3302) 2026-10-19 12:03:10 +09:00
twtrubiks 4b8c79e73c fix(runtime): update model pricing for Anthropic and DeepSeek APIs
* fix(runtime): update model pricing table to current rates

Align pricing_for_model with the published Anthropic pricing table:

- default_sonnet_tier was $15/$75 (the old Opus rate); it is now the
  Sonnet 4.x rate of $3/$15, which is what the `sonnet` alias resolves to.
- Add Sonnet 5 / 5.5, Haiku 5.5, Haiku 3.5, and Fable / Mythos rates.
- Opus 4.5+ is $5/$25 and Opus 5.5 is $4/$20; Opus 4/4.1 keep the $15/$75
  tier they are still billed at on Bedrock and Google Cloud.

Versions are parsed from the model id so dated, provider-prefixed, and
Vertex-style ids resolve to the right tier. Haiku 5.5's >100K-token tier
is not modeled because usage is aggregated across requests.

* fix(runtime): add DeepSeek API pricing

DeepSeek models fell back to default_sonnet_tier ($3/$15 per MTok),
overestimating V4 Flash by about 10x on input and 12x on output.

Price the ids served by the DeepSeek API at peak rates: deepseek-v4-pro
at $1.32/$3.96, and deepseek-flash, deepseek-v4-flash and the retired
deepseek-chat / deepseek-reasoner aliases at $0.30/$1.20. Off-peak usage
is billed at half. Other DeepSeek models on third-party hosts keep the
default because their prices vary by host.
2026-10-19 12:02:18 +09:00
twtrubiks 78ffd13d19 fix(cli): stop duplicating thinking blocks in streamed responses
push_output_block recorded a thinking event at content_block_start (an
empty placeholder) and the stream loop recorded the full block again at
content_block_stop. The empty duplicate was replayed on the next request
and rejected with 400 "each thinking block must contain thinking".
Only emit the event from the non-streaming path.
2026-10-19 03:01:20 +00:00
devilking7x 6d7412d958 docs: sync zh README star-history chart to dera.page mirror (#3354)
The English README migrated the star-history chart/link from
star-history.com / api.star-history.com to star-history.dera.page,
but README.zh.md (last synced at d229a9b) still used the old domains.
Update the 4 URLs so both language versions stay consistent.
2026-10-13 09:57:11 +01:00
Bellman 479e598cd3 Merge pull request #3353 from ultraworkers/lane/release-v0.1.6
release: v0.1.6
v0.1.6
2026-10-13 16:11:58 +09:00
clawdbot 89e717ec09 release: bump version to 0.1.6 and add CHANGELOG entry 2026-10-13 07:06:33 +00:00
Bellmanandclawdbot 01e9fc3229 [Slice 1.3] SDK session lifecycle & reconciliation (#3351)
* feat(sdk): implement session lifecycle and reconciliation

* fix(sdk): serialize session lifecycle recovery

* fix(sdk): preserve lifecycle outcomes and output

---------

Co-authored-by: clawdbot <clawdbot@ultraworkers.dev>
2026-10-13 07:02:25 +01:00
Bellman 02c22b4211 Merge pull request #3350 from ultraworkers/lane/release-v0.1.5
release: v0.1.5
v0.1.5
2026-10-13 12:08:42 +09:00
clawdbot 0e54dec1c9 test: make sandbox status check environment-aware
The /sandbox status can be 'ok' (with namespace isolation) or 'warn' (in
restricted environments like CI without unshare support). Update the test
to accept either value rather than hard-coding an expectation.
2026-10-13 03:05:56 +00:00
clawdbot c4ce758d5e test: fix version expectation in client_integration and sandbox status test
- Update client_integration.rs user-agent assertion to expect version 0.1.5
- Fix output_format_contract.rs /sandbox status expectation from 'warn' to 'ok'
2026-10-13 03:02:30 +00:00
clawdbot 4a920fb281 release: bump version to 0.1.5 and add CHANGELOG entry 2026-10-13 02:58:13 +00:00
Bellmanandclawdbot 192d40a860 feat(sdk): complete WebSocket client transport (#3349)
Co-authored-by: clawdbot <clawdbot@ultraworkers.dev>
2026-10-13 03:40:03 +01:00
Bellman a35caea528 Merge pull request #3348 from ultraworkers/lane/fmt-main
style: cargo fmt (main red after #3346)
2026-10-13 11:00:57 +09:00
clawdbot cf8f1da360 style: cargo fmt after #3346 2026-10-13 01:57:43 +00:00
Bellmanandclawdbot 0274174536 fix: isolate OPENAI_BASE_URL in provider hint test to prevent environment pollution (#3347)
The test explicit_model_provider_hint_controls_runtime_provider_dispatch
was failing when OPENAI_BASE_URL was set in the environment to a non-standard
URL (e.g., api.layofflabs.com). The test expects the OpenAI provider to use
the default base URL (api.openai.com) when no explicit base_url is provided
in the ProviderConfig.

This fix adds an EnvVarGuard struct to the tests module and uses it to
ensure OPENAI_BASE_URL is unset before running the test, preventing
environment pollution from affecting the test result.

Fixes: https://github.com/ultraworkers/claw-code/issues/3345

Co-authored-by: clawdbot <clawdbot@ultraworkers.dev>
2026-10-13 10:13:23 +09:00
Bellman da6a1692cf Merge pull request #3345 from ultraworkers/lane/skills-bundled-registry-chaining
feat(skills): implement bundled skills registry and chaining (#3324)
2026-10-13 10:10:35 +09:00
Bellman 6cddf08934 Merge pull request #3344 from ultraworkers/lane/issue-3321-sdk-operation-registry
feat(sdk): add operation registry and schema validation (#3321)
2026-10-13 10:08:59 +09:00
Bellman 5214beab31 Merge pull request #3343 from ultraworkers/lane/cc-pr-3329-review
docs: GJC compatibility gap matrix (updated)
2026-10-13 10:08:05 +09:00
Bellmanandclawdbot d9d5d5da08 feat(runtime): implement per-session settings override & schema validation (#3346)
Implement issue #3325 (Slice 3.1) Config: Settings Override & Schema Validation

Additions:
- Setting schema registry with support for multiple value types
- SessionSettings struct with three-level hierarchy (global, session, request)
- SettingApplicator for merging and applying settings
- ConfigHotreloadMonitor for filesystem monitoring
- 36 comprehensive tests covering:
  - Schema validation with allowed values
  - Override hierarchy (request > session > global > default)
  - Permission mode overrides per-session
  - Temperature/token overrides work correctly
  - Dynamic setting application mid-session
  - Settings propagation to all tools
  - Config hotreload detection
  - Default values and type validation
  - Non-overridable settings

Size: ~750 LOC with tests

References:
- Issue #3325: [Slice 3.1] Config: Settings Override & Schema Validation
- Crate: runtime (enhance existing config.rs)

Co-authored-by: clawdbot <clawdbot@ultraworkers.dev>
2026-10-13 10:07:54 +09:00
clawdbot 592beb5584 style: fix cargo fmt issues 2026-10-13 01:06:46 +00:00
clawdbot cd04270a17 feat(skills): implement bundled skills registry and skill chaining support (#3324)
- Add SkillOrigin::Bundled variant to support bundled skills registry
- Implement bundled_skill_root() function for discovering bundled skills
- Update skill discovery to include bundled skills from standard install paths
- Create example bundled skills (example-skill, chain-example)
- Add comprehensive tests for bundled skills discovery and metadata
- Bundled skills follow same directory structure as plugins
- Skills can now chain/invoke other skills using standard dispatch mechanisms
- Maintains backward compatibility with existing SkillsDir and LegacyCommandsDir
2026-10-13 01:05:22 +00:00
clawdbot e28d9c1e25 feat(sdk): add operation registry and schema validation (#3321)
- Implement OperationRegistry with standard query, control, and event operations
- Add Schema struct for defining input/output schemas
- Add OperationMetadata for rich operation descriptions
- Add Frame methods to extract operation and input from broker requests
- Add comprehensive tests demonstrating the gap and the fix
- Operations can be discovered, validated, and customized

This addresses issue #3321 (Slice 1.2): SDK operation registry & schema validation.

The gap: The original SDK allowed any operation name with no validation.
The fix: A registry-based system that defines valid operations and their schemas.
2026-10-13 01:03:43 +00:00
clawdbot c6a7c6ea54 docs: update GJC compatibility gap matrix with PR #3330-3339 progress
- Mark SDK wire protocol (Slice 1.1) as implemented (PR #3330)
- Update tool catalog status with read selectors (PR #3332/#3334)
- Add slash commands progress: /tools, /info (PR #3339)
- Document as historical planning reference with current implementation status
- Add PR references and status summary
- All section status notes now reflect merged work as of 2026-10-13
2026-10-13 01:02:43 +00:00
clawdbot 19030cbbda docs: add GJC compatibility gap matrix
Comprehensive analysis of GJC SDK surface (gajae-code) vs claw-code
implementation status across:
- SDK wire protocol (WebSocket JSON-RPC)
- Session lifecycle and reconciliation
- 55-tool catalog and implementations
- Skill discovery and invocation
- Settings and configuration
- Hooks and plugins
- AGENTS.md rules system
- 120+ slash commands
- Subagent delegation and task execution

Gap matrix includes:
- GJC source paths and behavior
- claw-code current status (have/partial/missing)
- Proposed Rust crate/module ownership
- Size estimates and complexity assessment
- Implementation roadmap (3 phases, 10 slices)
- Risk mitigation and verification checklist

Phase 1 (Foundation): SDK wire protocol + session lifecycle
Phase 2 (Core): Tool completion + skill enhancement
Phase 3 (Polish): Settings, commands, integration

Total estimated effort: 15,000 LOC across new SDK crate and
crate extensions.

Relates to: #3319
2026-10-13 01:02:43 +00:00
Bellman 09f3b366ba Merge pull request #3339 from ultraworkers/lane/gjc-s32-r4-commands-impl
feat: implement /tools and /info slash commands
2026-10-13 09:24:24 +09:00
clawdbot d6b8202738 fix: update slash_command_specs count in test
Added /tools and /info commands increases the spec count from 140 to 142.
Update the test assertion to reflect the new count.
2026-10-13 00:19:41 +00:00
Bellman 12d8177608 Merge pull request #3335 from ultraworkers/lane/pr-3255
feat(cli): press Esc to interrupt a running turn
2026-10-13 09:18:54 +09:00
Bellman 5eeaf3b261 Merge pull request #3342 from ultraworkers/lane/revert-3341
revert: #3341 (merged with failing checks)
2026-10-13 09:17:32 +09:00
Bellman ceba8f603d Merge pull request #3340 from ultraworkers/fix-changelog-v0.1.4
fix(changelog): remove incorrect v0.1.4 slash command entry
2026-10-13 09:16:08 +09:00
clawdbot 350e907e35 Revert "Merge pull request #3341 from ultraworkers/fix/rebase-on-main"
This reverts commit 734558eb31, reversing
changes made to 942805175a.
2026-10-13 00:14:54 +00:00
Bellman 734558eb31 Merge pull request #3341 from ultraworkers/fix/rebase-on-main
feat(team): team enhancements, subagentModel, parallel tool exec (fixed from #3250)
2026-10-13 09:13:47 +09:00
Bellman 942805175a Merge pull request #3338 from ultraworkers/lane/pr-3248
feat: custom-openai provider namespace with separate env vars
2026-10-13 09:13:14 +09:00
clawdbot dfa1e4f71e fix: resolve merge conflicts and test compatibility
- Resolve .gitignore conflict: include both nix entries and .claude/
- Update AnthropicRuntimeClient::new() test calls to match new signature
- Fix explicit_model_provider_hint test to unset OPENAI_BASE_URL env var
2026-10-13 00:12:36 +00:00
clawdbot 8a19ecd7cc fix: use PermissionMode.covers() instead of comparison operators
The PermissionMode enum intentionally does not implement PartialOrd
to prevent silent re-ranking of the privilege ladder. Use the explicit
covers() method for privilege comparisons instead of < and >=.
2026-10-13 00:12:35 +00:00
clawdbot 8938f53790 fix(clippy): resolve new lint violations in trident, compact, and claw-rag-service
- runtime/trident.rs: derive Default, fix for_kv_map, if_same_then_else, extend_with_drain, unnecessary_cast, needless_borrows
- runtime/compact.rs: fix useless_borrows_in_formatting
- claw-rag-service/ingest.rs: remove unnecessary into_iter()
- claw-rag-service/db.rs: use as_chunks instead of chunks_exact, remove unused import

All tests pass (1014 Rust + 47 Python tests verified).
2026-10-13 00:12:35 +00:00
TheArchitectit 5433dac4a2 fix(cli): order parallel tool results by call index and cap fan-out
execute_batch already keyed results to original call slots; this makes
that airtight: panicking worker threads resolve to their own index via
a fallback tuple instead of colliding with slot 0, and results are
asserted to follow call order with a regression test that mixes a
workspace-escape read among valid reads at cap=2.

Adds the fan-out bound: parallel-safe calls run in waves of at most
maxParallelToolCalls (default 8, CLAWD_PARALLEL_TOOL_CALLS env, or the
new setting applied via with_max_parallel_tool_calls at runtime build).
Sequential behavior is preserved: allowed_tools checks still run
before dispatch, and ToolSearch stays off the parallel path.
2026-10-13 00:12:35 +00:00
TheArchitectit f3a23bf39f feat(teams): bound per-team sub-agent concurrency with AgentGate
TeamCreate resolves maxConcurrentAgents from the per-team input, then
the maxConcurrentAgents setting, then unlimited (pre-fix behavior).
The cap is persisted in the manifest and registered on a process-wide
gate; agent threads still spawn immediately but block on an RAII slot
before entering their run loop, so manifest/task-claim semantics are
unchanged. TeamDelete forgets the gate so queued agents drain and no
stale team entries accumulate. Includes a gate regression test.
2026-10-13 00:12:35 +00:00
TheArchitectit 66006cca34 feat(config): parse maxParallelToolCalls and maxConcurrentAgents settings
Adds optional positive-integer parsing for the two new fan-out caps
next to subagentModel, in both camelCase and snake_case forms. Zero
parses as unset; non-numeric values are a named config error. Covered
by three regression tests mirroring the subagentModel test style.
2026-10-13 00:12:35 +00:00
TheArchitectitandClaw 08cce855b5 fix: restore workspace unsafe_code=forbid, fix TaskClaim TOCTOU, remove TUI deps
Review fixes for PR #3250:

1. Restore workspace-level unsafe_code = "forbid" (was downgraded to
   "warn" for TUI support). The per-crate [lints.rust] unsafe_code =
   "allow" on rusty-claude-cli already overrides it where needed.

2. Fix TaskClaim TOCTOU race in claim_task(). Replace exists()-then-write
   with OpenOptions::create_new(true) which atomically fails if the lock
   file already exists, eliminating the race window between the check and
   the write.

3. Remove TUI scaffolding deps (ratatui, tui-textarea, gag, crossbeam-channel,
   libc, unicode-width) and the /tui slash command spec — these belong in
   a future TUI PR and are unused in the current source.

Also updates the provider chain precedence test to reflect the new behavior
where the caller's resolved model is the chain primary.

Co-Authored-By: Claw <noreply@openclaw.ai>
2026-10-13 00:12:35 +00:00
TheArchitectit fe71ead55f test: add subagentModel accessor chain tests
Adds 3 unit tests covering the original silent-drop bug:
- camelCase 'subagentModel' key reads end-to-end
- snake_case 'subagent_model' key reads end-to-end
- blank value returns None (falls back to default model)

Requested by @1716775457damn in PR review.
2026-10-13 00:12:35 +00:00
TheArchitectit 334768249f fix: model_token_limit catch-all returns None for unknown models
Restores the fix from @Offwhite-Del that was lost during rebase.
Unknown models now return None so preflight skips the context-window
check and lets the API enforce its own limits.
2026-10-13 00:12:35 +00:00
TheArchitectit aab02464b2 cargo fmt 2026-10-13 00:12:35 +00:00
TheArchitectitandClaude Fable 5 7aa00a2798 feat(team): team enhancements, subagentModel, parallel tool exec
Port the agent-team enhancement layer onto upstream/main so the model
can spin up coordinated sub-agent teams for parallel work.

subagentModel config wiring (fix):
- Add subagent_model field to RuntimeFeatureConfig + RuntimeConfig::subagent_model()
  accessor so the subagentModel setting (already validated by config_validate.rs)
  is now actually read and stored.
- Agent tool's resolve_agent_model falls back to subagentModel from config
  when no explicit model is passed.

Provider namespace separation:
- New 'custom-openai' provider kind with dedicated env vars
  (CLAWCUSTOMOPENAI_API_KEY / CLAWCUSTOMOPENAI_BASE_URL)
- /setup wizard saves kind: 'custom-openai' for option 5
- Bare model name normalized to 'custom/' prefix to avoid proxy 404s
- Sub-agents inherit /setup-saved provider config via inject_config_as_env_fallbacks

Parallel tool execution:
- Override execute_batch to classify read-only tools as parallel-safe
  and run them concurrently via std::thread::scope
- Results return in original model order

Team coordination layer:
- AgentMessage, TaskClaim, TeamStatus tools + shared mailbox directory
- Mode presets (tiny/1x ... mega/6x) + enriched TeamCreate/Agent descriptions
- Background team watcher
- /team slash command: on/off/status/toggle

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-10-13 00:12:35 +00:00