Commit Graph

42130 Commits

Author SHA1 Message Date
joshavant 8393b37779 fix(setup): keep compatible Claude wrappers selectable 2026-08-04 02:08:23 -05:00
joshavant d636f5f8e0 fix(agents): gate Claude live session protocol 2026-08-04 02:08:23 -05:00
joshavant b71e81e6e7 fix(agents): preserve Claude fork successor on stalls 2026-08-04 02:08:23 -05:00
joshavant df867bd923 fix(agents): preserve Claude follow-up replies after background tasks 2026-08-04 02:08:23 -05:00
Vincent Koc 7a5f108293 fix: unblock macOS release validation (#119110)
* fix(test): guard split-memory tests on case-insensitive filesystems

* fix(sandbox): canonicalize aliased mount roots

* fix(claws): canonicalize aliased manifest paths

* test: isolate release validation from host state
2026-08-04 15:05:31 +08:00
Vincent Koc 70d75c6fa3 merge: sync prepared model handoff with main
* origin/main:
  fix: preserve live updater failure diagnostics (#119096)
  fix: recover new-session models through Gateway startup (#119120)
  test(qa): cover instruction profile artifacts (#119078)
  fix(telegram): record automatic delivery message ids
  test(qa): cover memory promotion safety (#119093)
  test(qa): prove overflow compaction pruning (#119033)
  fix(tool-search): preserve deferred MCP failures (#118363)
2026-08-04 13:44:04 +08:00
Peter Steinberger 3be66d7716 fix: recover new-session models through Gateway startup (#119120)
* fix: preserve new-session models through startup errors

* fix(ui): normalize metadata retry failures to errors

* test(ui): prove new-session metadata recovery

* test(gateway): use public model fixtures

* test(ui): order auth transport E2E lifecycle

* test(ui): drain auth transport bootstrap work

---------

Co-authored-by: ZYV5ge <39863830+ZYV5ge@users.noreply.github.com>
2026-08-03 22:24:23 -07:00
Jesse Merhi ba24420f17 fix(tool-search): preserve deferred MCP failures (#118363)
* fix(tool-search): propagate deferred tool failures

* fix(tool-search): preserve failures across harnesses

* test(tool-search): align projection contract
2026-08-04 14:10:00 +10:00
Vincent Koc 7a6d6fdfb4 merge: sync prepared model handoff with main
* origin/main:
  test(qa): prove agent tool approval controls (#119029)
  docs(agents): require exact-head ClawSweeper re-review after post-review pushes (#119069)
  fix(qa): provision ffmpeg for Playwright scenarios (#119064)
  test(qa): repair scenario catalog baselines (#119062)
  test(qa): prove agent session scope continuity (#119032)
  test(qa): prove workspace mutation tools (#119021)
  fix(cli): honor local port in gateway call (#119046)
  test(xai): cover playback mark overflow
  fix(xai): bound realtime playback marks
2026-08-04 11:08:38 +08:00
Peter Steinberger 25e3b6c9b7 fix(cli): honor local port in gateway call (#119046) 2026-08-03 18:50:21 -07:00
Vincent Koc dea04651b9 fix(setup): preserve the prepared model handoff 2026-08-04 09:39:02 +08:00
Jason (Json) afa4977b2c fix(gateway): honor external status target context (#119015)
* fix(gateway): preserve external status target context

* fix(gateway): keep status service authority scoped
2026-08-03 19:37:39 -06:00
Mert Başar 196d81195b fix(auth): cooldown inline api key billing failures (#88709)
* fix(auth): cooldown inline api key billing failures

* fix: mark inline api key prompt failures

* fix(auth): propagate inline api key cooldown to provider visibility

* fix(types): fix test type errors in agents and ui

* fix(auth): correct null check for cooldown gate and fix test case

* fix(ui): remove unrelated test drift and fix expired toast expectation

* fix(auth): preserve inline cooldown usageStats in warm worker snapshots

* test(auth): update warm snapshot expectation with usageStats

* test(auth): format inline cooldown worker proof

* fix(auth): narrow inline cooldown classifier

* fix(auth): mark managed file/exec SecretRef inline keys on auth/billing failure

The inline-api-key cooldown marker only fired for literal, env-marker, and
env SecretRef sources, while the resolution gate already covered managed
file/exec SecretRef provider keys via coerceSecretRef. As a result a
file/exec SecretRef models.providers.<id>.apiKey could never record a 402
billing cooldown, so the gate that would honor it never triggered.

Align the runner failure-marker trigger with the gate predicate
(isConfigBackedInlineProviderApiKey) so managed non-env SecretRef inline keys
are marked on auth/billing failure. Adds focused regression coverage.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* refactor(auth): drop now-unused isInlineProviderApiKeyAuth export

The runner failure-marker now gates on isConfigBackedInlineProviderApiKey, so
isInlineProviderApiKeyAuth has no remaining callers. Removing the dead export
also trims one public callable export back under the plugin-SDK surface budget.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(auth): enforce inline cooldown for managed file/exec SecretRef keys

The inline-api-key cooldown was recorded for managed (file/exec) SecretRef
provider keys but never enforced: these keys resolve through the synthetic
runtime path (resolveSyntheticLocalProviderAuth) and the explicit api-key
override path, neither of which consulted the inline-key cooldown gate. So an
exhausted file/exec SecretRef provider kept resolving and reporting available
during an active inline-api-key:<provider> cooldown.

Gate both resolution exits (and the provider-availability check) on
isConfigBackedInlineProviderApiKey + assertInlineProviderApiKeyUsable, matching
the literal/env paths. Local no-auth markers are not config-backed inline keys,
so they stay untouched. Adds regression coverage for both resolution paths.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(auth): gate runtime SecretRef cooldown checks

* fix(auth): honor inline key cooldowns in model-list and tool auth checks

Direct hasRuntimeAvailableProviderAuth callers omitted the auth store, so
inline provider keys in billing cooldown were still advertised as available
in model browsing (models.list) and model-backed tool auth checks. Pass the
scoped auth store at each call site and cover the cooled-key paths with
regression tests, including profile fallback and cooldown expiry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(auth): resolve merge CI failures (format + browse cooldown mock independence)

- failover-retry-controller.ts: apply oxfmt formatting missed after the port.
- model-auth-availability.ts: the browse-side inline cooldown check imported
  resolveInlineProviderApiKeyUnusableUntil from the auth-profiles usage module,
  which several command/directive tests partially mock — the new export was
  absent from those mocks, so every mocking test threw at the browse path.
  Read the inline cooldown via usage-state primitives (resolveProfileUnusableUntil
  + isAuthCooldownBypassedForProvider) and build the usage id with the same
  normalizeProviderId the write side uses, so the hot browse path no longer
  depends on the mocked usage module while keeping key resolution identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(auth): make model-auth inline cooldown reads mock-independent

resolveApiKeyForProvider/assertInlineProviderApiKeyUsable read the inline
provider API-key cooldown, which this PR routes through the auth-profiles
usage module. Many existing suites partially mock that barrel (e.g.
run.overflow-compaction.test.ts) without the new export, so those tests
threw once merged code reached the inline path.

Read the cooldown via usage-state primitives (resolveProfileUnusableUntil +
isAuthCooldownBypassedForProvider) and build the `inline-api-key:<provider>`
usage id with the same normalizeProviderId the write side uses, so model-auth
no longer depends on the mocked usage module while key resolution stays
identical. Verified across all 30 suites that mock the auth-profiles module.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(test): use main's terminal failure shape for the inline-key billing case

Main reworked EmbeddedRunAttemptResult so attempt failures are reported via
`terminal: { kind: "failed", source, error }` instead of the old
`promptError`/`promptErrorSource` fields. The inline-key billing regression
test still used the removed fields, which merged cleanly but broke
check-test-types.

Switch it to the same shape the sibling helper in this file already uses.
Verified with `pnpm check:test-types` (exit 0).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Mert Basar <MertBasar0@users.noreply.github.com>
Co-authored-by: Ceviz Agent <ceviz@openclaw.local>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 18:19:06 -07:00
Vincent Koc ee397f0c59 test(qa): prove ClawHub catalog discovery (#118934)
* test(qa): prove ClawHub catalog discovery

* test(qa): use shared temp cleanup
2026-08-04 09:07:35 +08:00
Vincent Koc 84d9e93dbb chore(qa): cover plugin testing harness contracts (#118933)
* test(qa): cover plugin testing harness contracts

* test(qa): narrow plugin harness tool factory
2026-08-04 09:07:27 +08:00
Peter Steinberger e16bc0108c fix(gateway): keep plugin model allowlists static (#118854) 2026-08-03 17:39:45 -07:00
Patrick Erichsen 1aea2df935 fix(plugins): refresh bundled channel skills (#119020) 2026-08-03 17:31:00 -07:00
Vincent Koc 07a9856cce test(qa): cover ClawHub package compatibility (#118985) 2026-08-04 08:29:29 +08:00
Marvinthebored 778be6f5cc fix(auth): do not admit ambient environment credentials behind declared profiles (#118458)
A provider credential present only in the process environment — named in
neither the provider entry, `auth.profiles`, nor `auth.order` — was appended to
the auth attempt list behind the operator's declared profiles. A run that left
a declared profile could therefore continue on an undeclared credential, which
may bill a different account, with no configuration authorizing the transition
and nothing reporting that it happened.

Add an explicit `authorization: "declared" | "ambient"` fact on direct auth
sources and enforce it during source selection. The field is required rather
than defaulted so every construction site is audited; `evidence` is left as
provenance, since a declared credential can legitimately be environment-sourced
via a `${VAR}` marker or a SecretRef.

An ambient credential may still serve a provider with no declared profiles (the
documented zero-config `PROVIDER_API_KEY` path), but it is no longer admitted
behind declared profiles, nor substituted for declared profiles that turned out
to be unusable. `auth.order` failover is unaffected: profiles are never filtered
by this change. The read-only availability evaluator applies the same rule so
status cannot advertise a credential the runtime refuses.

This restores the invariant that held before 1b1cebfe42 (#104685), where an
environment candidate was reachable only when a provider had no declared
profiles. The regression shipped in 2026.7.2-beta.1 onwards; no GA release is
affected.

Reported in #117956.


Claude-Session: https://claude.ai/code/session_01Nwk2KaB6zL71xa1i3Xwgwi

Co-authored-by: Marvinthebored <262704729+Marvinthebored@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 17:15:35 -07:00
Vincent Koc 85af36dbf6 improve(tui): prove CLI entrypoints under real PTY (#118990)
* test(tui): cover CLI entrypoints under PTY

* test(tui): require built CLI in PTY evidence
2026-08-04 08:07:17 +08:00
Michael Christenson II 7f7a709b1d fix: Ollama missing from onboarding when its service is reachable (#118020) 2026-08-03 17:49:31 -06:00
Vincent Koc d38f68065f fix(sms): align MMS retries with network timeouts (#119002) 2026-08-04 07:29:55 +08:00
Vincent Koc abf9e26d96 test(cron): cover delivery outcomes (#118993) 2026-08-04 07:19:17 +08:00
Vincent Koc 15b23cfc2d fix(docker): use authenticated gateway health command (#118996)
* fix(docker): use authenticated gateway health command

* test(docker): prove documented compose health command
2026-08-04 07:10:36 +08:00
Peter Steinberger a78f2c40bf test(plugins): align tool fixtures with owner policy (#118959) 2026-08-03 16:09:05 -07:00
Vincent Koc 1be662aa9d test(tasks): cover TaskFlow registry lifecycle (#118983) 2026-08-04 06:38:41 +08:00
Peter Steinberger c83dcc2bc0 fix(security): harden network tool output at canonical owner boundaries (#118984)
* fix(security): bound external tool content at its canonical owner boundary

* fix(plugin-sdk): document supported security boundary and restore facade parity
2026-08-03 15:34:33 -07:00
Peter Steinberger 3d65ea2a1b fix(googlechat): align doctor policy ownership with canonical account configuration (#118972)
* fix(googlechat): align doctor policy ownership with canonical account configuration

* test(googlechat): align generated channel metadata and typed doctor fixtures
2026-08-03 15:23:16 -07:00
Vincent Koc 57a1cbbeee test(tui): prove editor input through PTY (#118982) 2026-08-04 06:18:38 +08:00
Peter Steinberger 2c79d1d7fc fix(memory): persist trusted owner provenance at canonical transcript boundary (#118987) 2026-08-03 15:18:01 -07:00
Vincent Koc d3ea24c669 fix(gateway): resolve SQLite usage details (#118918) 2026-08-04 06:09:21 +08:00
Vincent Koc bc65789e13 test(cron): cover durable scheduler state (#118981) 2026-08-04 06:08:26 +08:00
Vincent Koc 1d446ad2cc fix(plugins): remove stale load paths during uninstall (#118930)
* test(qa): prove marketplace plugin updates

* fix(plugins): clean exact install load paths on uninstall

* fix(ci): register marketplace lifecycle assertions
2026-08-03 21:57:54 +00:00
Vincent Koc 972eb56ffe test(qa): cover bundled runtime discovery (#118922) 2026-08-03 21:57:42 +00:00
Vincent Koc 554a6f3bbf feat(sms): add Twilio MMS support (#118664)
* feat(sms): add Twilio MMS support

* fix(sms): harden hosted media bearer handling

* fix(sms): discard staged media before dispatch

* fix(sms): close staged media cleanup races

* fix(sms): finalize MMS metadata and race proof

* fix(media): bind local reads to authorized descriptors

* fix(sms): close MMS review gaps

* fix(media): make inbound root matching type-safe

* fix(media): route bounded reads through fs-safe facade

* test(media): satisfy async lint contracts
2026-08-04 05:46:37 +08:00
Vincent Koc 0fd7354cdb fix(cli): keep update dry-run state immutable (#118856)
* fix(cli): keep update dry-run state immutable

* test(cli): cover dry-run config compatibility
2026-08-04 05:43:22 +08:00
Peter Steinberger 108cec388e fix(skills): provide safe workspace-specific malicious skill remediation (#118969) 2026-08-03 14:39:02 -07:00
Vincent Koc ac6cc33d5f test(cron): cover execution diagnostics (#118964) 2026-08-04 05:29:13 +08:00
Vincent Koc 622b5eaf8e test(tasks): add durable task operations QA (#118943) 2026-08-04 05:20:12 +08:00
Vincent Koc e4ab08cbfb test(gateway): prove RPC wire and agent contracts (#118794)
* test(gateway): cover RPC wire contracts

* test(gateway): cover agent RPC contracts

* test(gateway): satisfy heartbeat type safety

* test(gateway): satisfy agent RPC lint

* test(gateway): assert agent response ordering
2026-08-04 05:17:48 +08:00
Vincent Koc 42fd51d6c2 test(automation): cover plugin hook lifecycles (#118962) 2026-08-04 05:17:32 +08:00
Vincent Koc d29b9ad083 test(tasks): cover plugin-managed flows (#118919) 2026-08-04 04:51:00 +08:00
Vincent Koc efcced7207 test(agents): prove process control roundtrip (#118843) 2026-08-04 04:46:57 +08:00
Peter Steinberger 1ed8241226 fix(media): isolate generated-provider text from delivery directives (#118780) 2026-08-03 13:39:12 -07:00
kiranmagic7 682f60ce56 fix(config): reject unsupported diagnostics otel grpc (#93087) 2026-08-03 16:28:08 -04:00
Peter Steinberger 990fdcf6fd fix(providers): recognize configured media credentials across provider boundaries (#118761)
* fix(providers): honor configured media credentials across owner boundaries

* test(providers): align configured auth fixtures and derived SDK surfaces

* fix(providers): enforce shared DashScope media credential policy
2026-08-03 13:26:31 -07:00
Peter Steinberger 25aa29d7a1 refactor: delete dead post-landing plugin/hooks scaffolding (#118920)
* refactor: delete dead post-landing plugin/hooks scaffolding

* fix(security): resolve fast-uri and undici HIGH advisories
2026-08-04 04:26:22 +08:00
Peter Steinberger f73a7809a5 fix(cron): deliver child results after heartbeat-only parent responses (#118743)
* fix(cron): deliver child results after heartbeat-only parent replies

* fix(cron): preserve mixed heartbeat parents and wrapped child handoffs

* fix(cron): suppress wrapped heartbeat acknowledgments in child followups
2026-08-03 13:15:57 -07:00
Peter Steinberger bac7d6bd5d fix(tts): preserve hidden speech answers when synthesis fails (#118690)
* fix(tts): preserve hidden speech answers when synthesis fails

* fix(tts): preserve visible Slack fallback before channel activation

* test(tts): respect plugin ownership boundaries
2026-08-03 13:06:38 -07:00
Peter Steinberger f9d9d1225a refactor(channels): own the lifecycle status contract in SDK patch factories (#118795)
* refactor(sdk): add channel lifecycle patch factories

* refactor(channels): adopt lifecycle patches in a-m

* refactor(channels): adopt lifecycle patches in n-z

* refactor(runtime): lifecycle-own ambient registries

* test(slack): assert lifecycle factory fields

* fix(sdk): preserve lifecycle patch extras types

* test(zalouser): widen lifecycle status sink

* test(irc): avoid shadowed status patch

* fix(zalo): reuse account-agnostic media route

* fix(gateway): accept explicit channel ready recovery

* test(qa): assert terminal Slack block fact

* test(qa): restore Slack blocked lifecycle scenario

* test(gateway): lock explicit lifecycle recovery contract
2026-08-03 12:39:48 -07:00