Commit Graph

70828 Commits

Author SHA1 Message Date
Peter Steinberger 104128dd32 chore(pr): dev-wrapper opt-in — advisory subcommands may dogfood modified wrappers (#111656)
* chore(pr): dev-wrapper opt-in — advisory subcommands may dogfood modified wrappers

* fix(pr): hermetic dev-wrapper test fixture and type narrowing
2026-07-19 22:58:15 -07:00
Peter Steinberger 6e19c36d41 feat(channels): batch 2 producers drop media placeholder bodies (#111665)
* feat(channels): batch 2 producers drop media placeholder bodies

Media-placeholder program batch 2: Discord, Feishu, and MSTeams stop
minting <media:kind> placeholder bodies. Primary bodies carry captions
only; native resources produce ordered structured facts with type-only
facts for failures/rejections (batch-1 alignment contract). Discord
stickers travel as native kind "sticker" (not MIME-derivable); text
carriers (forwarded snapshots, room history, thread starters, pending
text) render via formatMediaPlaceholderText. Feishu audio preflight and
MSTeams unavailable selection move from body-string equality to
structured facts; dead placeholder payload builders deleted.

* test(discord): make allowlist policy explicit
2026-07-19 22:48:32 -07:00
Peter Steinberger 71513436f9 fix(ui): hide system agent from agent roster (#111677) 2026-07-19 22:46:02 -07:00
Peter Steinberger a22ede72e4 fix(ui): redesign the who's-online roster menu (#111668) 2026-07-19 22:24:53 -07:00
YangManBOBO e45ebac97a fix(media): m4a/AAC audio files from non-Apple sources are misidentified as video/mp4 and excluded from audio workflows (#111177)
* fix(media): preserve audio hints for isom-brand m4a/AAC files misidentified as video/mp4

* fix(media): correct ambiguous M4A aliases

Co-authored-by: 潘晓波0668000512 <pan.xiaobo@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 22:18:23 -07:00
Peter Steinberger bdf71d7d98 refactor(apple): unify offline client databases (#111598)
* refactor(apple): unify offline client databases

* refactor(apple): remove dead cache APIs

* fix(apple): satisfy native storage gates

* fix(apple): sync generated localization catalog

* Revert "fix(apple): sync generated localization catalog"

This reverts commit d0f5e7b74932e98ccc5f1984840e8f9d545edc2d.

* fix(i18n): keep source validation pre-merge

* test(macos): isolate flaky suite state

* test(macos): isolate log locator on main actor
2026-07-19 22:14:12 -07:00
Peter Steinberger 69ee7127c0 fix(ui): prevent chat jump when the working claw appears (#111642)
* fix(ui): smooth working claw transition

* test(ui): satisfy chat transition checks
2026-07-19 22:13:42 -07:00
Peter Steinberger 8f9e42f2a9 fix(cli): report honest SQLite store labels and consistent build SHA in help (#111659) 2026-07-19 22:07:44 -07:00
YangManBOBO 1508a58674 fix(media): case-sensitive Content-Type checks bypass header extension and image-header safety rules (#111184)
* fix(media): normalize Content-Type casing in header extension and image-header checks

* test(media): consolidate MIME case coverage

Co-authored-by: 潘晓波0668000512 <pan.xiaobo@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 21:53:13 -07:00
Jesse Merhi ce9e393196 fix: make Back work within channel setup (#108007)
* fix: support Back within channel setup

* docs: note channel setup Back navigation

* fix: keep navigation outcome type private

* style: format navigation outcome type

* chore: leave changelog to release prep
2026-07-20 14:34:05 +10:00
NIO 94a2494570 fix(mattermost): probe hangs past deadline when DNS preflight stalls (#111314)
* fix(mattermost): bound probe preflight with guard timeoutMs

* test(mattermost): tighten preflight timeout proof

Co-authored-by: hugenshen <hu.genshen@xydigit.com>

* test(mattermost): isolate preflight timeout path

Co-authored-by: hugenshen <hu.genshen@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 21:31:05 -07:00
Peter Steinberger 1ee42427ea fix(cli): surface gateway→embedded fallback session divergence in --json output (#111645) 2026-07-19 21:26:58 -07:00
Peter Steinberger d18a7cff8e refactor(ui): extract the steered-message lifecycle into a typed state machine (#111610)
* refactor(ui): extract the steered-message lifecycle into a typed state machine

The steer flow was an implicit state machine spread across five chat modules,
with chip states encoded in loosely coupled optional fields and duplicated
guard predicates. This extracts it behind structural types:

- steered-chip.ts: leaf chip model — SteeredChip union (in-flight requires
  sendState "steering"; acknowledged requires pendingRunId and forbids
  sendState), constructors, and narrowing guards; impossible states are
  unrepresentable and every call site uses the guards
- steer-lifecycle.ts: owns the steer send flow, single terminal retirement
  pipeline (remember -> materialize acked chips -> clear), and history-proven
  retirement; absorbs queued-user-turn.ts
- terminal handling in chat-gateway/chat-state and the stored-outbox history
  verification in chat-send consolidate onto the shared helpers; chat-send.ts
  shrinks by ~300 lines; net prod LOC is flat
- behavior fixes riding the pipeline: acknowledged chips retire once
  authoritative history contains their user turn (no more brief chip/history
  double display) and lingering chips keyed to a filtered run id now retire on
  the next history load
- isTerminalFailureChatSendAck moves to chat-send-contract.ts so ack
  narrowing stays type-safe at every formatter call site

* fix(ui): satisfy type, lint, and dead-export gates for the steer-lifecycle split

- restore the snapshotChatAttachments helper (oxc no-map-spread fires on the
  inlined form)
- select the stored-outbox drain head with an explicit loop; the find-predicate
  form made TS narrow away the failed state and flagged the guard (TS2367)
- drop the unused chip re-exports from steer-lifecycle and the consumer-less
  isSteeredChip guard; chip types stay module-local, guard consumers import
  the steered-chip leaf directly

* style(ui): oxfmt line joins in chat-send and chat-state
2026-07-19 21:14:56 -07:00
Peter Steinberger bc76bb8933 feat(agents): agent-controlled session status, attention, and TTL in the sessions tool (#111583)
* feat(agents): agent-controlled session status, attention, and TTL in the sessions tool

* feat(protocol): sessions.patch agent status fields and curated attention icon ids

* chore(protocol): regenerate bindings for agent-status patch fields, unexport internal cap

* chore(sessions): unexport internal agent-status TTL default
2026-07-19 21:01:09 -07:00
FMLS 25d6f13a1f test(browser): add cross-operation tab reference parity contract (#111375) 2026-07-20 11:56:57 +08:00
zengLingbiao 563cc9d480 fix(docs): decode docs search responses with fatal UTF-8 validation (#111288) 2026-07-19 20:56:36 -07:00
NIO 503b21dc6b fix(thread-ownership): cancel unread ownership response bodies (#111231) 2026-07-19 20:48:44 -07:00
Alix-007 990916c6ac fix(firecrawl): reject malformed 2xx response envelopes (#111210)
* fix(firecrawl): reject malformed JSON envelopes

* test(firecrawl): use canonical plugin config fixture

Co-authored-by: Alix-007 <li.long15@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 20:41:48 -07:00
Peter Steinberger 792f5b7b74 fix(cloud-workers): reconcile workspace results across turns (#111481)
* fix(cloud-workers): preserve accepted workspace manifests

* fix(cloud-workers): keep manifest helpers private

* fix(cloud-workers): harden accepted workspace publication

* fix(cloud-workers): preserve ancestor modes during publication

* fix(cloud-workers): pass manifest path filter to verifier

* refactor(cloud-workers): extract manifest stability check
2026-07-19 20:36:50 -07:00
Peter Steinberger 200653bd60 fix(gateway): generate dashboard titles despite sender metadata (#111613)
* fix(gateway): keep sender identity out of session titles

* docs(changelog): note dashboard session title fix

* test(gateway): type dashboard sender fixture

* docs: keep session title release note in PR
2026-07-19 20:26:28 -07:00
NIO 0af934cbf9 fix(doctor): stream heartbeat transcript scans without full-file reads (#110721)
* fix(doctor): stream heartbeat transcript scans with record caps

* fix(doctor): bound heartbeat recovery scans

Signed-off-by: sallyom <somalley@redhat.com>

---------

Signed-off-by: sallyom <somalley@redhat.com>
Co-authored-by: sallyom <somalley@redhat.com>
2026-07-19 23:25:53 -04:00
LZY3538 e1a82f4991 fix(cron): ignore blank Windows shell override (#111260) 2026-07-19 20:18:36 -07:00
Peter Steinberger 6d39d3cf0b fix(onboard): preserve gateway settings on rerun (#111569)
* fix(onboard): preserve gateway config on rerun

* fix(onboard): scope remote secrets to endpoint

* fix(onboard): honor rerun override boundaries

* fix(onboard): secure inherited tailscale auth

* fix(onboard): honor explicit token auth

* fix(onboard): enforce funnel auth on rerun

* fix(onboard): preserve env password on rerun
2026-07-19 20:18:34 -07:00
Wynne668 cacd98304e fix(sandbox): cancel CDP probe response bodies (#109767)
* fix(sandbox): cancel unsuccessful CDP probe responses

Release unread response bodies when sandbox CDP startup probes receive
non-success statuses so retry loops do not retain transport resources.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sandbox): cancel all CDP probe responses

* test(sandbox): simplify CDP probe cleanup coverage

Signed-off-by: sallyom <somalley@redhat.com>

---------

Signed-off-by: sallyom <somalley@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: sallyom <somalley@redhat.com>
2026-07-19 23:12:27 -04:00
Peter Steinberger 7d4dccf959 improve(swarm): close out wait, phase, and worker follow-ups (#111605)
* fix(codex): support full swarm wait budgets

* feat(ui): bucket swarm dots by phase

* docs(swarm): document flat worker patterns

* fix(codex): configured per-tool timeout still wins over swarm wait default

* fix(codex): outer swarm-wait watchdog outlives the 600s budget (cap + grace)

* fix(ui): order swarm phase buckets by observation rank

* fix(ui): repair rank-order widget test — proper lit render container, untangle sibling assertions

* fix(ui): implicit swarm phase assignment only on child creation events

* test(ui): split swarm activity integration coverage
2026-07-19 20:11:54 -07:00
zengLingbiao 19314aa31a fix(agents): reject non-UTF-8 MCP App sandbox CSP metadata (#111282) 2026-07-19 20:11:34 -07:00
Peter Steinberger 3564c1c795 fix(test): bound Matrix test process memory (#111607)
* test: bound Matrix test process memory

* test: align Matrix runner mock contract
2026-07-19 20:04:14 -07:00
zengLingbiao a8dd80afc0 fix(plugins): cancel discarded TTS contract response bodies (#111340)
* fix(plugins): cancel discarded TTS contract response bodies

* test(plugins): mark TTS API key fixture synthetic

Co-authored-by: zenglingbiao <zeng.lingbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 20:02:44 -07:00
Peter Steinberger eb3a600571 fix(ui): preserve native context menu for chat links (#111618) 2026-07-19 19:58:37 -07:00
mushuiyu886 367fe9a42b fix(chutes): report cache-read pricing from live catalog (#111253) 2026-07-19 19:56:42 -07:00
Peter Steinberger da10827439 feat(ui): accept drag-and-drop attachments in the new-session composer (#111530)
* feat(ui): accept drag-and-drop attachments in new-session composer

The new-thread composer only accepted attachments via paste and the +
menu; dragging a file onto it was silently ignored. Wire the shared
chat attachment drop handling onto the composer shell with the same
balanced drag affordance as the chat pane, and gate both composers'
drop/dragover cancellation on file drags so text/URL drops keep the
textarea's native behavior.

* fix(ui): cancel non-file drops outside editable composer targets

A URL dropped on the transcript, header, or composer chrome would hit
the browser default and navigate the app away, discarding drafts. Keep
native text/URL drops only when the drop target is an editable control;
cancel them everywhere else in both composers.

* fix(ui): treat disabled and readonly inputs as non-editable drop targets

A URL dropped precisely on a disabled composer textarea would still hit
the browser default and could navigate away. Check actual editability
(disabled/readOnly/isContentEditable) instead of selector shape.

* fix(ui): limit native drops to text-entry inputs

Enabled non-text inputs (checkbox, range) counted as editable drop
targets, so a URL dropped on one skipped cancellation and could
navigate the browser away. Restrict the native-drop exception to
text-capable input types, textareas, and contenteditable content.
2026-07-19 19:55:29 -07:00
Peter Steinberger 64c82812a5 feat(dashboard): pinned MCP apps — board rendering, lease re-mint, durable tool grants (#111524)
* feat(boards): mint pinned MCP app views

* feat(ui): render pinned MCP apps on dashboards

* fix(dashboard): reconcile MCP app rebase

* fix(dashboard): align generated CI contracts

* test(gateway): record board.widget.appView release train

* fix(dashboard): revalidate pinned MCP app views
2026-07-19 19:51:26 -07:00
Peter Steinberger ddf57c083f fix(onboard): keep invalid wizard retries unpersisted (#111558)
* fix(onboard): validate wizard retries before persist

* fix(onboard): stage retry auth profiles until verified

* test(onboard): clarify staged credential fixtures

* refactor(onboard): preserve immediate provider auth path

* fix(onboard): retain staged auth across retries

* fix(onboard): isolate rejected auth repairs

* fix(onboard): retain verified credential refreshes

* test(onboard): mark credential fixtures synthetic

* test(onboard): use canonical secret placeholders

* refactor(onboard): destructure staged profile stores

* fix(onboard): retain rotated staged credentials

* test(onboard): use valid timeout status

* refactor(onboard): keep staged auth helper private
2026-07-20 02:47:21 +00:00
Peter Steinberger b07985ef45 feat(ui): show waiting-for-approval run status in chat (#111445)
* feat(ui): show waiting approval run status

* fix(ui): hydrate waiting approval status

* fix(ui): correlate approval status by run

* fix(ui): harden approval status reconciliation
2026-07-19 19:44:25 -07:00
Yiğit ERDOĞAN 301657f2f3 fix(agents): keep exec ANSI sanitizer state across stream chunks (#111364)
The local exec runtime sanitized each stdout/stderr chunk with the
stateless `sanitizeBinaryOutput`, so an escape sequence straddling a read
boundary was escaped into visible text instead of being consumed. The
remote bash path already uses a per-stream parser via
`createStreamingBinaryOutputSanitizer` (#103706); this applies the same
treatment to the local path, with separate parsers for stdout and stderr
so neither stream can consume the other's pending sequence.
2026-07-19 19:34:07 -07:00
mushuiyu886 a20e08a56e fix(skills): keep ClawHub search results on one line (#111441) 2026-07-19 19:18:54 -07:00
mushuiyu886 c5bc6c3d2d fix(duckduckgo): preserve words around highlighted matches (#111460) 2026-07-19 19:09:09 -07:00
Wynne668 27f05c8993 fix(inworld): reject malformed base64 TTS audio (#111197) 2026-07-19 20:48:46 -04:00
Wynne668 0074270056 fix(xai): reject malformed streamed TTS base64 (#111201) 2026-07-19 20:40:53 -04:00
Wynne668 8a858c9c65 fix(openai): reject malformed Codex image base64 (#111235)
* fix(openai): reject malformed Codex image base64

* fix(openai): align Codex image base64 trimming

* fix(openai): match Codex base64 decoding
2026-07-19 20:40:18 -04:00
Peter Steinberger 3c0f55b58f fix(gateway): prevent cross-client system-agent session takeover (#111565)
* fix(gateway): bind system-agent sessions to callers

* test(gateway): type system-agent response helper
2026-07-19 16:05:18 -07:00
Peter Steinberger c5f9addb52 fix(ui): keep custodian transcript aligned after inference errors (#111562)
* fix(ui): reconcile invalidated custodian sessions

* test(ui): preserve custodian page harness type
2026-07-19 16:00:08 -07:00
thomas.szbay a0c3067b54 fix(qa-lab): bound evidence checkout ref git probe with timeout (#111448)
Co-authored-by: thomas.szbay <thomas.szbay@example.com>
2026-07-19 15:48:53 -07:00
Peter Steinberger e0b1a39d2a improve(i18n): generate native locales after merge (#111557)
* ci(i18n): move native locale generation post-merge

* fix(i18n): allow generated Android companions
2026-07-19 15:42:41 -07:00
Peter Steinberger 3247a56d15 fix(ui): prevent cross-file mock leakage in Control UI tests (#111554)
* test(ui): stop shared mock registry leakage

* ci: add three-worker UI leakage canary
2026-07-19 15:38:50 -07:00
Peter Steinberger 7116ad6e28 fix(agents): preserve fresh workspace hatch (#111553) 2026-07-19 15:35:54 -07:00
Peter Steinberger 473962b7de fix(onboarding): scope recommendations by workspace (#111560) 2026-07-19 15:34:56 -07:00
Peter Steinberger 5fcf7e75de test: clear plugin runtimes between shared files (#111556) 2026-07-19 15:28:46 -07:00
Peter Steinberger a1e5b6ef0e fix(doctor): honor active migration targets (#111555) 2026-07-19 15:27:03 -07:00
Peter Steinberger 6c25f5ae33 fix(ui): keep steered composer messages visible until the transcript owns them (#111540)
* fix(ui): keep steered composer messages visible until the transcript owns them

Typing while the agent was busy showed a brief steering state and then the
message vanished until the next full history reload. The steer path removed
the queued row at ack time and only restored the steered chip when the tab
had adopted the active run id, which never happens for runs started by
automations, other clients, or tabs opened mid-run.

- steer sends reuse the durable row's sendRunId as the wire idempotencyKey so
  delivered-turn and history-proof reconciliation can correlate steered rows
- the steered chip is restored after every accepted ack, keyed to the active
  run when the tab still tracks it, else to the steer's own gateway lifecycle
- terminal events materialize acknowledged steered chips into the transcript
  before clearing them, and stale history reloads keep idempotency-marked
  local turns until authoritative history catches up
- in-flight (unacknowledged) steers are never materialized, so a rejected
  send cannot leave a phantom user turn behind

Fix authored with Codex; reviewed and hardened via structured review.

* fix(ui): use bracket access for __openclaw test marker (no-underscore-dangle)

* fix(ui): resolve steered attachment payloads through the store before materializing

Queue rows carry attachment metadata only; composer upload bytes live in the
payload store. Resolving through getChatAttachmentDataUrl keeps attachment-only
steers visible when their chip retires (Codex connector review finding).

* fix(ui): only user-role entries satisfy queued-turn presence checks

An assistant entry can carry the same run's idempotency key; matching it let
the chip re-add and terminal materialization skip the user's copy
(ClawSweeper rank-up move).
2026-07-19 15:17:08 -07:00