Commit Graph

81255 Commits

Author SHA1 Message Date
Peter Steinberger 2fc85bdc1b refactor(workers): make worker turns node-only (#125384)
* refactor(workers): bind placement modes to transports

* refactor(workers): split provider reconciliation

* Revert "refactor(workers): split provider reconciliation"

This reverts commit 0a1f97399b23eca81e99af45dd9ea616e266de54.

* refactor(workers): split lifecycle options

* test(workers): align SSH fixture with remote exec

* refactor(workers): encode one placement mode

* fix(workers): fence persisted transport mismatches

* style(workers): keep persisted lease note concise

* test(workers): declare node access fixture modes

* test(agents): match exec notifications by receipt
2026-08-17 15:46:59 -07:00
Josh Avant 23ed0baf3d fix: validate every structured attachment source (#125433) 2026-08-17 15:43:09 -07:00
Peter Steinberger 27cb5d021f perf(doctor): snapshot SQLite migration validation (#125361)
* perf(doctor): snapshot SQLite migration validation

Amp-Thread-ID: https://ampcode.com/threads/T-01a00a6a-b64e-74a5-8b15-2d3b966a468d

* test(doctor): bound SQLite validation reads

Amp-Thread-ID: https://ampcode.com/threads/T-01a00a6a-b64e-74a5-8b15-2d3b966a468d

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 15:29:31 -07:00
Vishal Doshi aebe360349 fix(agents): memory-flush append-only write returns outputSchema-conforming details (#120404)
* fix(agents): make memory-flush append-only write honor the write outputSchema

The memory-flush append-only write wrapper inherits the base write tool (and its declared outputSchema) via spread, but returned {path, appendOnly} details. The code-mode bridge validates results against the declared schema and rejected the call AFTER the append side effect had landed (reported as the outputSchema variant in #120385).

Return {changed: true, created: <bool>} via a best-effort pre-append existence probe; sandbox-bridged appends omit created rather than guess. Exports WriteToolOutputSchema for the new contract test.

* fix(agents): memory-flush append-only write returns outputSchema-conforming details

Address ClawSweeper review findings on #120404:

P1 - Update the remaining append-only wrapper expectations.
    Three test sites still asserted the removed `{ path, appendOnly }` /
    `created` shapes and would have failed after the return expression changed:
      - src/agents/agent-tools.workspace-paths.test.ts (2 assertions)
      - src/agents/embedded-agent-runner/run/attempt.memory-flush-forwarding.test.ts
      - src/agents/agent-tools.memory-flush-append-write.test.ts
    All now assert `{ changed: true }` and are included in focused validation.

P2 - Avoid reporting a non-authoritative created flag.
    Removed the pre-append existence probe entirely rather than narrowing it.
    The probe ran before the append, so another writer could create or remove
    the target in between while the result still claimed `created` - a TOCTOU
    guess the append path cannot make authoritatively. The inherited write
    outputSchema permits the bare `{ changed: true }` shape, so the wrapper now
    reports only what the call actually knows. This also deletes the
    sandbox/non-sandbox divergence the probe introduced.

Net effect: -31 lines. The fix is now purely subtractive on the source side.

Validation: 7 test files, 85 passed / 2 skipped; oxlint clean on all touched files.

* test(agents): validate memory-flush schema via public tool

* fix(agents): condense memory flush result contract comment

* test(agents): use narrow write-tool barrel

---------

Co-authored-by: Grynn <grynn@users.noreply.github.com>
2026-08-17 15:16:02 -07:00
Josh Avant 0b75ea3cef fix(talk): preserve caller tool authority in consults (#125392) 2026-08-17 14:50:39 -07:00
Peter Steinberger 7b8d5f1637 fix(doctor): migrate pairing state on multi-agent updates (#125417)
* fix(doctor): preserve migration owner for pairing state

* fix(doctor): preserve ambiguous pairing ownership
2026-08-17 14:49:35 -07:00
Peter Steinberger fa9ab1d40c perf(test): reuse proxy CLI runtime module (#125387) 2026-08-17 14:39:08 -07:00
Peter Steinberger 57e862980b feat(gateway): carry machine class through session moves (#125292)
* feat(gateway): carry machine class through session moves

Profile move targets accept an optional machineClass with new-session
parity: validated in the protocol, persisted on the durable move intent
(bare nullable column, lazy same-version ALTER), replayed exactly by
restart recovery, and selectable from the Control UI move dialog.
Moving to the current profile with a different class resizes the
session's worker.

* fix(gateway): project placement facts on chat startup

chat.startup and chat.history built sessionInfo without the placement
projection sessions.list applies, so clients merging that row erased a
live worker placement and its move intent — the Runs on Cloud chip
disappeared after any turn until a full reload.

Reuse the canonical ensureColumn helper for the move table's additive
column instead of a hand-rolled PRAGMA read.
2026-08-17 14:25:13 -07:00
Josh Avant 8a7b6aa7da fix: keep session-memory slug generation tool-free (#125394) 2026-08-17 14:25:10 -07:00
Josh Avant 9e7da04686 fix(memory): enforce live revocation (#125393) 2026-08-17 14:25:07 -07:00
zengLingbiao 37ca2c6900 fix(parallel): redact x-api-key reflected in web search error bodies (#120205)
* fix(parallel): redact x-api-key reflected in web search error bodies

* fix(parallel): use canonical tool-payload redactor for reflected error bodies

* fix(parallel): layer configured redactPatterns over header-shape redaction
2026-08-17 14:19:27 -07:00
Josh Avant 2f653a73c2 fix(skills): reject incomplete tar archive listings (#125406) 2026-08-17 14:15:43 -07:00
Peter Steinberger 6938026f20 fix(agents): honor system owner for unscoped reads (#125318)
* fix(agents): honor system owner for unscoped reads

* fix(gateway): resolve empty auth status owner
2026-08-17 14:07:56 -07:00
Alix-007 bb03085015 fix(ui): stop hidden chat stream repainting (#125088)
* fix(ui): defer hidden chat stream paints

* fix(webui): defer hidden chat invalidations

* fix(ui): defer all hidden chat renders

* fix(ui): finish hidden update lifecycle

---------

Co-authored-by: vyctorbrzezowski <krzyszchweski@gmail.com>
2026-08-17 17:50:18 -03:00
ClawSweeper 248966d300 fix(ui): show menus for child sessions in the sidebar (#125033)
* fix(ui): add child session sidebar menus

* fix(ui): tailor child session menus

* test(ui): align child session menu expectations

---------

Co-authored-by: ClawSweeper <280513762+clawsweeper@users.noreply.github.com>
2026-08-17 12:59:38 -07:00
Shakker d802a8e8b4 fix: isolate preferred-provider metadata lookup (#125379)
Keep provider-scoped onboarding metadata resolution limited to the selected provider, preventing fallback OpenAI loading when Ollama is chosen without a configured model.

Refs #125373 and #125363.
2026-08-17 20:53:44 +01:00
ClawSweeper 29fc91fe99 fix(ui): balance side panel tab pill padding (#125368)
Fixes crowded side-panel tab close padding and keeps the joined pill balanced in LTR and RTL.

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-17 14:51:27 -05:00
Peter Steinberger 9f5776e071 fix(voice-call): status exits after offline lookup (#125354)
* fix(voice-call): keep status fallback read-only

* test(voice-call): assert offline status stays read-only

* chore: keep changelog release-owned

* test(voice-call): share status fallback harness
2026-08-17 12:34:19 -07:00
Shakker d402e5d3f6 fix: scope onboarding model browsing (#125373)
Scope onboarding model discovery to the selected provider so browsing no longer loads unrelated provider setup surfaces while preserving route variants and global browsing behavior.

Fixes #125363.
2026-08-17 20:32:03 +01:00
Peter Steinberger be58fcb565 chore(macos): update Peekaboo revision (#125364) 2026-08-17 12:19:35 -07:00
Peter Steinberger 7f3b65e783 fix(plugins): expose background service failures in health (#125366)
* fix(plugins): surface service runtime failures

* chore: leave changelog to release tooling
2026-08-17 12:18:50 -07:00
Peter Steinberger 087d0ecca3 fix: surface skill and bootstrap load failures (#125348)
* fix: surface skill and bootstrap load failures

* fix: preserve oversized bootstrap diagnostics
2026-08-17 12:12:36 -07:00
Peter Steinberger 3a7df7a788 fix(hooks): honor explicit ingress targets and reject conflicts (#125351)
* fix(hooks): honor explicit ingress targets

* fix(hooks): reject blank direct agent ids
2026-08-17 11:52:45 -07:00
Peter Steinberger 0cc4d42f3f fix(discord): accept shipped nested DM access config (#125359)
Amp-Thread-ID: https://ampcode.com/threads/T-01a00a6a-b64e-74a5-8b15-2d3b966a468d

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 11:49:26 -07:00
Peter Steinberger 45e6784338 feat(gateway): run disposable cloud workers through node transport (#125288)
* feat(gateway): converge cloud workers onto nodes

* fix(gateway): honor public URL for cloud enrollment

* fix(crabbox): execute cloud bootstrap package binary

* fix(gateway): bind cloud nodes in pairing transaction

* fix(crabbox): prefer exact installed cloud bootstrap

* fix(gateway): complete cloud node bootstrap

* fix(gateway): enforce cloud worker capability boundaries

* fix(gateway): complete cloud node migration

* fix(gateway): preserve paired node roles on teardown
2026-08-17 11:49:06 -07:00
Peter Steinberger 0c9d1e468c perf(nostr): replace startup drain wait with completion gate (#125355) 2026-08-17 11:44:55 -07:00
Peter Steinberger de9b367214 fix(ui): generic mock chat sends show a visible outcome (#125347)
* fix(ui): make generic mock chat sends observable

* test(ui): stabilize control UI e2e timing
2026-08-17 11:40:56 -07:00
openclaw-mantis[bot] 5fe5d26007 chore(i18n): refresh native locales (#125353)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-17 11:00:25 -07:00
ClawSweeper 1ea18c8cd8 fix(ui): keep mobile side chat interactive in tabbed panel (#124785)
Keep embedded mobile Side chat inside its tabbed panel so the main composer and shared controls stay tappable.

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-17 12:00:36 -05:00
Jacqueline Henriksen 03f43ee21c fix(ui): edit queued messages in place (#124298)
* fix(ui): restore cancelled queued message drafts

* fix(ui): edit queued messages in place

* fix(ui): isolate composer sends from row edits

* fix(ui): isolate queued edit submission guard

* fix(ui): preserve reply context for queued edits

* fix(ui): fence steer during queued edits

* fix(ui): abort stale queued edit submissions

* fix(ui): fence queued edits across panes

* fix(ui): fence peer-pane queued steers

* fix(ui): fence command-like queued edits

* fix(ui): fence removal of edited queue rows

* docs(proof): record queued edit live verification

* docs(proof): attach queued edit browser evidence

* fix(ui): fence queued row reordering during edits

* fix(ui): fence peer edits during queue reordering

* fix(ui): report cross-pane reorder conflicts

* test(ui): exercise rejected inline edit submit

* fix(ui): surface reorder conflicts in chat state

* docs(proof): record real queued-edit behavior

* docs(proof): record exact-head queue behavior

* fix(chat): fence retry during queued-row edits

* fix(chat): fence stop aliases in queued edits

* fix(chat): surface peer steer conflicts

* fix(chat): fence draft changes during history load

* fix(chat): fence annotated queue edits

* test(chat): record exact-head queue proof

* Revert "test(chat): record exact-head queue proof"

This reverts commit d7278ad9082fae40e28e6b98ca5a74e855817e6c.

* fix(chat): clear stale queued edit tokens

* fix(chat): fence stale queued edit versions

* fix(chat): invalidate rejected queued edits

* fix(ui): clarify queued edit conflict guidance

* fix(ui): report peer-edited queue reorder conflicts

---------

Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-17 10:00:00 -07:00
Peter Steinberger 00b9626d13 fix: bound model-visible skills catalogs (#125346) 2026-08-17 09:54:52 -07:00
Peter Steinberger 8dfbaa6087 fix(cli): report plugin policy refusals as expected conditions (#125304) 2026-08-17 09:49:19 -07:00
Peter Steinberger 976d99995a perf(test): await 1Password descendant cleanup (#125321) 2026-08-17 09:48:00 -07:00
Peter Steinberger b834477565 fix(cli): refuse live state reset and uninstall (#125253)
* fix(cli): guard live state cleanup

* fix(cli): preserve linked paths on cleanup failure

* fix(cli): retain gateway ownership through cleanup

* fix(cli): keep cleanup planning read-only

* fix(cli): skip mutating bootstrap for cleanup

* fix(apple): keep identity locks sandbox-writable

* docs(apple): clarify identity lock domains
2026-08-17 09:44:31 -07:00
Peter Steinberger 7170a6231a feat(agents): unify agent status into a durable progress_card (#125125)
* feat(agents): unify agent status into a durable progress_card

Replace the write-only update_plan to-do tool and the fragmented plan
rendering with one durable status artifact per session: progress_card
({plan?, markdown?}, replace-on-write, 8 KiB markdown / 50-step caps).
Cards persist in a lazy-additive session_progress_cards table in the
per-agent DB (no schema-version bump), broadcast progressCard.changed,
and render from the store with exactly one live placement per view
(session rail when visible, else the composer-adjacent bar); transcripts
collapse to one-line receipts, and the sidebar hovercard shows other
sessions' cards inline (markdown + <progress>, DOMPurify allowlist, no
iframes). The three stream-derived plan renderers and their dedup
heuristics are deleted.

Codex runs disable the native plan tool per thread
(tools.update_plan.enabled=false) and receive progress_card via the
dynamic-tool bridge; compaction restore now reinjects the card (steps +
bounded markdown). Card writes still emit the legacy plan stream event so
native apps and channels keep working until their per-platform
migrations. Policy names map update_plan -> progress_card; the shipped
tools.updatePlan=false kill switch is honored.

Net -277 production LOC; -480 test LOC.

* test(agents): regenerate Codex prompt snapshots for update_plan thread-config disable

* chore(protocol): allowlist progressCard.changed for native apps pending card migration

* fix(ci): repair progress card integration checks

* fix(codex): canonicalize native progress cards

* test(gateway): reconcile progress card method order

* test(codex): stabilize native approval fixture
2026-08-17 09:44:04 -07:00
Peter Steinberger 70ce8ea6f7 fix(pr): verify hosted commit membership locally (#125335)
One-time maintainer-authorized bootstrap landing for the exact reviewed head. This direct merge replaces the broken self-hosted verifier so subsequent pull requests can return to the native review, prepare, and merge workflow.
2026-08-17 09:41:13 -07:00
Ayaan Zaidi 863f19b722 fix(ai): derive Responses compact threshold from active context budget (#125342)
The default OpenAI Responses compact_threshold was 70% of contextWindow alone; for gpt-5.6-sol (1.05M window, 272k active budget) that resolved to 735,000, above the ~252k prompt budget the runtime admits, so provider compaction never fired before local overflow handling. Threshold now uses 0.7 x min(contextTokens, contextWindow) (190,400 for Sol) on both the payload-policy and host-preflight paths; explicit responsesCompactThreshold still wins.
2026-08-17 22:09:50 +05:30
Peter Steinberger d742482f7b fix(agents): reject unusable worktree run admission (#125341) 2026-08-17 09:38:04 -07:00
Peter Steinberger 98d7b38d48 docs: document three-layer session ownership (#125334)
* docs: document three-layer session ownership

User documentation for the session-ownership feature landed in #125057:
the immutable creator / assignable owner / participant-history model, the
Assign-to-me and Assign-to session menu actions, the sessions tool
assign_owner action, the sidebar Owners facet with Involving-me, the
pair-stack owner avatar, and agent-spawned session receipts (sessionUrl +
owner acknowledgement). Adds the sessions.assignOwner method and ownership
row projections to the protocol reference and a zh-CN glossary entry for
the new link label.

* docs: drop nonexistent header facepile overflow count

The chat header receives the already 4-capped participant projection and no
total count, so its overflow branch cannot render. Describe up to four
avatars instead (ClawSweeper P2).
2026-08-17 09:35:07 -07:00
Peter Steinberger 821f41e1cd fix(workers): propagate session permission context to worker placements (#125326)
* fix(workers): propagate session permission context

* test(workers): expect launch descriptor v4
2026-08-17 09:34:56 -07:00
Peter Steinberger 25e54ef255 fix(ui): gate New Session catalogs on agent roster (#125339) 2026-08-17 09:34:40 -07:00
Peter Steinberger 1298adfca7 fix(cron): distinguish missing automations from empty run history (#125343) 2026-08-17 09:34:38 -07:00
Peter Steinberger 1a821db049 fix(sessions): batch doctor SQLite imports (#125300)
Amp-Thread-ID: https://ampcode.com/threads/T-01a00a6a-b64e-74a5-8b15-2d3b966a468d

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 09:33:30 -07:00
Peter Steinberger efde610a9f fix(auto-reply): report failed queued replies after status delivery (#125325)
* fix(auto-reply): report partial followup delivery failure

* fix(auto-reply): classify followup batch failures

* fix(auto-reply): preserve followup delivery ownership

* test(auto-reply): consolidate followup delivery coverage
2026-08-17 09:23:24 -07:00
Peter Steinberger 49af98c12b fix(macos): avoid codesign metadata SIGPIPE (#125281) 2026-08-17 09:17:47 -07:00
Peter Steinberger 793669c8f6 fix: targetless replies retain conversation correlation (#125283)
* fix(agents): preserve contextual reply correlation

Carry prepared reply policy into embedded and CLI message tools so targetless direct replies retain transport correlation and Reef thread identity.\n\nCloses #125279

* fix(reef): preserve unthreaded reply correlation

Keep reply-only inbound messages unthreaded unless the transport supplies a thread, while still anchoring new exchanges to their initiating envelope.\n\nRefs #125279
2026-08-17 06:40:28 -07:00
Peter Steinberger eb38d5e486 fix(reply): report settled delivery outcomes once (#124773)
* refactor(reply): publish settled dispatch receipts

* refactor(reply): isolate dispatch outcome accounting

* refactor(discord): infer settled dispatch result

* test(reply): model settled dispatch receipts

* test(reply): type settled receipt fixtures

* test(telegram): declare settled final receipt

* test(telegram): adapt legacy dispatch fixtures

* fix(reply): complete settled receipt compatibility

* test(channels): keep delivery suite within lint budget

* test(channels): reuse settled count fixture

* test(channels): consolidate receipt assertions

* test(channels): extract delivery receipt fixtures

* fix(qa): recover stopped clients after config restart

* fix(reply): settle deferred delivery receipts

* test(channels): share delivery turn fixtures

* fix(channels): preserve non-visible reconciliation

* fix(reply): preserve settled receipt compatibility

* refactor(reply): make settled receipts canonical

* refactor(reply): absorb settlement at dispatcher boundary

* test(matrix): prove settled receipt precedence

* refactor(sessions): extract prompt snapshot types

* fix(reply): restore queued admission counts
2026-08-17 06:38:16 -07:00
Peter Steinberger bc277fa095 fix(qa): reject inconsistent suite summaries (#125122)
Amp-Thread-ID: https://ampcode.com/threads/T-01a00b7c-b9f0-73d5-8fb7-e619e8e458e1

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 06:19:25 -07:00
Peter Steinberger 7068006c78 fix(doctor): report cron config refusal as incomplete (#125282)
Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 06:13:09 -07:00
Peter Steinberger 11ebdfc9c3 fix(gateway): normalize TLS certificate pins (#125276)
* fix(gateway): normalize TLS certificate pins

* test(gateway): use valid TLS pin fixtures
2026-08-17 06:02:56 -07:00