Commit Graph

66965 Commits

Author SHA1 Message Date
Peter Steinberger
2655bf4dac fix(clawhub): bound archive download bodies (#101176)
* fix(clawhub): bound archive download bodies

Co-authored-by: NIO <nocodet@mail.com>

* docs(changelog): note ClawHub archive bounds

* chore(changelog): defer ClawHub release note

* fix(clawhub): avoid response-limit shadowing

---------

Co-authored-by: NIO <nocodet@mail.com>
2026-07-06 23:29:25 +01:00
cxbAsDev
a464620141 fix(extensions/huggingface): bound model discovery JSON response read to prevent OOM (#101079)
* fix(extensions/huggingface): bound model discovery JSON response read to prevent OOM

* test(huggingface): prove bounded discovery cleanup

* test(huggingface): avoid unbound reader assertions

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 23:26:27 +01:00
cxbAsDev
2b868cac57 fix(tlon): bound Memex upload JSON response read (#101115)
* fix(tlon): bound Memex upload JSON response read

* test(tlon): prove upload response cancellation

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 23:26:15 +01:00
Peter Steinberger
254b819d7d fix: prevent context-engine wedges after session rotation (#101192)
* fix(sessions): create rotated transcript before callbacks

* chore: keep release note in PR body

* chore: keep release note in PR body
2026-07-06 23:25:58 +01:00
crh-code
d4b38a2160 fix(device-pair): remove INADDR_ANY and IPv6 unspecified from isLoopbackHost (#98617)
* fix(device-pair): remove INADDR_ANY and IPv6 unspecified from isLoopbackHost

0.0.0.0 (INADDR_ANY — bind to all interfaces) and :: (IPv6 unspecified)
are NOT loopback addresses. The canonical implementation in
src/gateway/net.ts explicitly excludes both. Classifying them as
loopback in isLoopbackHost causes incorrect behavior in mobile
pairing cleartext host validation.

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

* test(device-pair): reject unspecified setup URLs

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 23:25:35 +01:00
ZOOWH
4204a94845 fix(edit): show candidate lines with similarity scores on oldText match failure (#97038)
* fix(edit): show candidate lines on oldText match failure

When edit tool cannot find oldText, include up to 3 near-match candidate
lines with similarity scores and line numbers. Caps input size (MAX_LINES
3000, MAX_LINE_LEN 200) to avoid unbounded CPU on large files. Reuses
existing levenshteinDistance helper.

Closes #97032

* fix(edit): use toSorted instead of sort for candidate ranking

Fixes lint violation: unicorn(no-array-sort)

* fix(edit): keep candidate truncation branch-compatible

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 15:21:56 -07:00
Jason (Json)
17d3c2eb0a feat(ui): redesign chat composer controls (#100461)
* feat(ui): redesign chat composer controls

* fix(ui): preserve scoped chat model catalogs

* fix(ui): honor configured default agent in chat commands

* fix(ui): align composer translations and tests

* test(ui): expect cached chat commands

* fix(ui): inset composer attachment previews

* fix(ui): add attachment preview top padding

* fix(ui): preserve composer layout after main merge

* fix(ui): keep abort available during voice input

* fix(ui): merge duplicate model provider groups

* feat(ui): finalize chat composer redesign

* fix(ui): refine composer layout and scroll indicators

* fix(ui): align composer with chat column

* fix(ui): restore composer max width

* fix(ui): match composer Codex width

* fix(ui): stabilize chat composer controls

* docs: refresh generated map

* fix(ui): discard rejected model drafts

* fix(ui): clear chat composer CI gates

* test(ui): await rejected model rollback

* fix(ui): address chat composer review findings

* fix(ui): preserve default provider ordering

* fix(ui): stage model picker changes until save

* fix(ui): scope model picker drafts to chat context

* fix(ui): align composer drafts and message actions

* fix(ui): preserve reasoning rendering

* feat(ui): refine chat composer interactions

* fix(ui): repair chat composer CI checks

* fix(ui): repair chat composer integration checks

* fix(ui): translate chat composer labels

* fix(ui): restore mobile camera action

* test(ui): target visible attachment control

* test(ui): locate attachment disclosure directly

* fix(ui): preserve composer control ordering

* test(ui): track current composer controls

* fix(ui): honor terminal active-run state

* fix(ui): guard command metadata ownership

* fix(ui): stage agent model defaults

* fix(ui): preserve chat settings and scroll signals

* fix(ui): reconcile merged chat controls

* fix(ui): localize Talk composer options

* test(ui): infer chat control props

* fix(ui): refresh agent model metadata on session switch

* style(ui): format merged chat controls

* test(ui): avoid shadowed composer geometry names
2026-07-06 16:18:36 -06:00
Peter Steinberger
5a7c67682f fix(browser): isolate CDP control host policy (#101171) 2026-07-06 23:14:48 +01:00
Peter Steinberger
2424fdf8e5 ci: keep native landing validation off queued Blacksmith capacity (#101196)
* ci: route native i18n release gates to hosted runners

* ci: keep Testbox PR validation on hosted runners

* fix(ci): gate Testbox lifecycle to real leases
2026-07-06 23:14:27 +01:00
lsr911
e924f30bf5 fix(browser): guard readFields JSON.parse against malformed CLI input (#98861)
* fix(browser): guard readFields JSON.parse against malformed user input

Wraps JSON.parse(payload) in readFields() with try/catch, throwing a
descriptive Error when CLI --fields or --fields-file input contains
malformed JSON instead of raw SyntaxError.

8/8 proof assertions pass using standalone script that imports and
calls the real exported readFields() with malformed field strings.

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: lsr911 <liao.shirong@xydigit.com>

* fix(browser): add vitest malformed JSON tests, remove standalone proof

ClawSweeper feedback: added 2 vitest tests (malformed JSON, empty fields)
to the existing shared.test.ts, removed standalone proof script.

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: lsr911 <liao.shirong@xydigit.com>

* fix(browser): cover malformed fields at CLI boundary

---------

Signed-off-by: lsr911 <liao.shirong@xydigit.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 23:14:00 +01:00
mushuiyu886
b75fe8102e fix(acp): preserve runtime option clears (#101044)
* fix(acp): preserve runtime option clears

* refactor(acp): simplify runtime option clears

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 23:12:50 +01:00
cxbAsDev
0e0888a887 fix(agents): handle ripgrep stdout/stderr stream errors in grep tool (#101014)
* fix(agents): handle ripgrep stdout/stderr stream errors in grep tool

* fix(agents): terminate ripgrep child on stdout/stderr stream errors

* test(agents): make mock child reflect kill state in grep stream-error test

* refactor(agents): harden grep stream cleanup

* refactor(agents): centralize grep stream failure cleanup

* test(agents): model grep child kill state safely

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 23:12:23 +01:00
cxbAsDev
3f9ee4c5a1 fix(agents): handle stdin stream errors in docker sandbox execution (#101032)
* fix(agents): handle stdin stream errors in docker sandbox execution

* fix(agents): terminate Docker child on stdin stream error

* fix(agents): add real proof for docker stdin stream errors

* refactor(agents): fold Docker stdin failure coverage into existing tests

* test(agents): model Docker stdin as an event stream

* test(agents): narrow Docker stream mocks before emit

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 23:12:04 +01:00
Peter Steinberger
e29efa6852 fix(discord): terminate ffmpeg on stream errors (#101124)
* fix(discord): terminate ffmpeg on stream errors

* docs(changelog): note Discord ffmpeg cleanup

* fix(discord): force-stop ffmpeg after output failures

* chore: defer Discord release note to changelog batch
2026-07-06 23:11:45 +01:00
Peter Steinberger
b7d73e3b23 fix(infra): contain SSH config probe stream failures (#101160)
* fix(infra): harden ssh config probe cleanup

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(infra): satisfy ssh probe lint

* chore(changelog): defer ssh probe release note

---------

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>
2026-07-06 23:11:21 +01:00
xingzhou
e80e8a2b67 fix(device-pair): mobile pairing rejects local IPv6 cleartext URLs (#101008)
* fix(device-pair): allow local IPv6 pairing URLs

* test(device-pair): cover IPv6 cleartext lower bound
2026-07-06 22:35:09 +01:00
Peter Steinberger
246b5bbcca perf(test): run docs i18n partitions concurrently 2026-07-06 17:31:23 -04:00
Josh Lehman
c7295e417d chore(scripts): add debt ratchet to the session-accessor boundary guard (#101178)
* chore(scripts): add debt ratchet baseline to session-accessor boundary gate

* fix(scripts): fail session-accessor debt gate until baseline ratchets down
2026-07-06 13:55:16 -07:00
Dallin Romney
6bffda4166 ci: temporarily disable QA smoke (#101185) 2026-07-06 13:38:33 -07:00
Dallin Romney
19491fe34c Revert "fix(qa): keep smoke profile on one channel (#101173)" (#101184)
This reverts commit b773f7981a.
2026-07-06 13:29:07 -07:00
Dallin Romney
b773f7981a fix(qa): keep smoke profile on one channel (#101173) 2026-07-06 13:26:58 -07:00
Peter Steinberger
b05001a68b fix(android): prevent native channel notification duplicates (#101170) 2026-07-06 21:12:08 +01:00
Peter Steinberger
38746af071 feat(gateway): let write-scope operators manage chat session organization (#100964)
sessions.patch becomes a params-aware dynamic-scope method: operator.write
now authorizes patches that touch only user-level chat-organization fields
(label, category, pinned, archived, unread); every other field, mixed
patches, and unknown keys keep requiring operator.admin (fail closed).
This unblocks the session controls shipped in #100814 for the Android app,
whose bounded operator session intentionally never requests operator.admin.

Also: session list ordering gains a deterministic key tiebreaker for equal
pinnedAt/updatedAt (stable offset paging and prompt-cache friendliness), a
user-assigned label now beats stored channel-derived display names in the
row projection so renames survive refreshes, and subagent spawn pins its
gateway calls to admin via the params-aware least-privilege resolver
instead of the static admin-only method check (#59428 contract preserved).

Refs #100712
2026-07-06 21:08:26 +01:00
Dallin Romney
66b4dcf184 chore(docker): execute Compose and package artifact proofs (#101045)
* test(docker): prove Compose and package artifacts

* test(docker): use bounded container cleanup

* test(docker): bound package proof launch

* test(qa): keep Docker artifact proofs release-only

* test(docker): simplify artifact proof names

* test(docker): satisfy identity writer lint
2026-07-06 13:05:34 -07:00
Dallin Romney
2f7299eaa5 test(qa): add provider runtime evidence (#101051) 2026-07-06 13:01:32 -07:00
Peter Steinberger
80537c1ba4 feat(macos): load provider catalog during AI onboarding (#101132)
* feat(macos): load onboarding providers from gateway

* test(crestodian): widen setup config mock

* fix(crestodian): satisfy onboarding lint gate

* chore(macos): refresh onboarding localization inventory

* test(plugins): cover guided Copilot secret metadata
2026-07-06 20:57:56 +01:00
Peter Steinberger
3accc99b43 fix(agents): handle find subprocess stream failures (#101158)
Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>
2026-07-06 20:56:36 +01:00
ANIRUDDHA ADAK
1d375c31da test(browser): replace broad win32 skip with dynamic directory symlink check (#90365)
* test(browser): replace broad win32 skip with dynamic directory symlink check

* fix(browser): refine directory symlink probe to ensure cleanup and remove random string usage

* test(browser): scope symlink capability checks to the case

---------

Co-authored-by: Aniruddha Adak <aniruddhaadak80@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 20:52:02 +01:00
mushuiyu886
8f7d0a36f9 fix(browser): bound client fetch success JSON reads (#100889)
* fix(browser): bound client fetch success JSON reads

* fix(browser): preserve supported response body sizes

* docs(changelog): note browser response bounds

* chore: keep release changelog owner-only

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 20:48:07 +01:00
Vincent Koc
076273a43b refactor(ui): localize internal type exports (#101135) 2026-07-06 12:44:31 -07:00
xingzhou
565097fc10 fix(media-understanding): video auto-selection runs without a model (#99791)
* fix: require video media provider models

* fix video media test typing and skip coverage

* fix(media-understanding): preserve self-defaulting video providers

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 12:42:01 -07:00
Vincent Koc
e75223286d fix(qa): require live channel driver for access-gate scenarios 2026-07-06 21:34:27 +02:00
Peter Steinberger
e9464313b7 feat(ui): polish sidebar rail and hide disabled Workboard nav (#101123) 2026-07-06 20:31:57 +01:00
pash-openai
806a116f9d Let owner-operated Codex agents use connected account apps (#100973)
* Allow connected Codex account apps

* Preserve explicit plugin app policy

* Refresh Codex documentation map

* Unify connected apps with Codex plugin policy

* Format Codex configuration reference
2026-07-06 12:31:45 -07:00
Peter Steinberger
2638113c68 feat(android): add Listen action speaking assistant messages via gateway TTS (#100772)
* docs(android): document the chat Listen action

* feat(android): add Listen action for assistant messages
2026-07-06 20:30:54 +01:00
Peter Steinberger
36b733bf5c feat(ios): pair multiple gateways and switch between them without re-pairing (#100948)
* feat(ios): multi-gateway registry, per-gateway credentials, and switching

* fix(ios): harden multi-gateway state isolation
2026-07-06 20:29:02 +01:00
Peter Steinberger
f80704e19d docs(changelog): credit small bugfix batch (#101128) 2026-07-06 20:19:55 +01:00
weiqinl
e938461aa2 fix(discord): use configured statusReactions.timing instead of DEFAULT_TIMING (#94736)
* fix(discord): use configured statusReactions.timing instead of DEFAULT_TIMING

Makes the Discord message finalizer respect user-configured
doneHoldMs/errorHoldMs instead of always using hardcoded
DEFAULT_TIMING values. Brings Discord to parity with Telegram
and Slack which already use configured timing.

Fixes #78431

* test(discord): strengthen configured-timing regression with old-default assertion

Add a no-cleanup assertion at DEFAULT_TIMING.doneHoldMs (1500ms) before
advancing to the configured 2000ms hold, so the test fails against the
old hardcoded-default behavior. Add a matching errorHoldMs regression
test using failedCounts to drive the error terminal path.

Address ClawSweeper [P2] review finding on #94736: the previous test
advanced straight to 2000ms and would pass without the runtime fix
because main already removes the done reaction at 1500ms.

* refactor(discord): unify status reaction timing proof

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 12:18:40 -07:00
Dallin Romney
e3671e0980 refactor(qa): canonicalize channel command scenarios (#101080)
* test(qa): migrate channel command scenarios

* test(qa): distinguish portable command headings

* test(qa): preserve canonical scenario ownership
2026-07-06 12:18:06 -07:00
Mark
db38127c22 [codex] Allow reply_payload_sending to add portable buttons (#98922)
* fix(telegram): retry plugin callback submit text

* fix(telegram): harden plugin callback submit text

* fix(telegram): preserve plugin callback submit semantics

* fix(telegram): release callback dedupe after submit failure

* fix(telegram): settle skipped plugin callback submissions

* style(telegram): format public API exports

* chore: leave changelog to release generation

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 20:17:41 +01:00
NianJiu
06efc2ae41 fix(browser): navigate works with CDP hostname allowlist (#100986)
* fix(browser): allow CDP host through hostname allowlist

* test(browser): prove CDP grants stay control-only

* docs(changelog): note remote browser CDP policy fix

* fix(browser): honor restrictive CDP host policy

* chore: keep release changelog owner-only

* fix(browser): align profile CDP creation policy

* fix(browser): keep remote CDP policy explicit

* test(browser): prove Playwright control allowlist isolation

---------

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 20:11:52 +01:00
cxbAsDev
4d1ed548f4 fix(infra): wrap sha256File stream errors with context instead of leaking raw rejects (#101085)
* fix(infra): wrap sha256File stream errors with context instead of leaking raw rejects

* test(infra): prove sha256 stream error context

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 12:09:56 -07:00
Peter Steinberger
912af0a56f fix(gateway): keep N-1 nodes manageable during upgrades (#101109)
* fix(gateway): allow N-1 node protocol maintenance

* docs: refresh generated map for node upgrade guide
2026-07-06 20:01:20 +01:00
Vincent Koc
2f89de8165 fix(codex): preserve yielded native subagent delivery 2026-07-06 11:58:00 -07:00
Vincent Koc
70add7d31e fix(android): restore lint validation (#101081) 2026-07-06 11:57:28 -07:00
github-actions[bot]
01465340f6 chore(i18n): refresh native locales 2026-07-06 18:53:27 +00:00
Peter Steinberger
2723628dd9 perf(test): unit-test crabbox provider aliases 2026-07-06 14:52:53 -04:00
github-actions[bot]
a7c4a0471d chore(ui): refresh control ui locales 2026-07-06 18:52:14 +00:00
Dallin Romney
627f6988a0 test(qa): migrate restart and policy scenarios to yaml (#101063) 2026-07-06 11:50:16 -07:00
Ben.Li
afcc93bfc7 fix(cli): keep UTF-8 log tails valid (#101029)
* fix(cli): keep UTF-8 log tails valid

* fix(cli): share UTF-8-safe byte tails

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 19:47:22 +01:00