Commit Graph

9358 Commits

Author SHA1 Message Date
Peter Steinberger
6beb726be7 fix(docs): preserve inline code literals 2026-07-15 03:10:11 -04:00
Peter Steinberger
0754d23615 fix: group native sessions by host (#108062)
* fix(control-ui): group native sessions by host

* test: satisfy native session checks

* chore: remove release-owned changelog entry
2026-07-14 23:51:00 -07:00
Peter Steinberger
92fc907ffb fix: preserve TUI restore state without JSON races (#108058)
* refactor(tui): move last session state to sqlite

* chore: keep release notes in PR body

* test: update doctor migration fixture

* chore: satisfy dead code export gate
2026-07-14 23:46:22 -07:00
clawsweeper[bot]
5afb1fb381 feat(ui): add follow-up behavior setting for active runs (steer by default) (#108032)
* feat(ui): add follow-up behavior setting (queue vs steer) for active runs

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

* default follow-up behavior to steer

Follow-ups sent while a run is active now steer into the running turn by
default; queue mode becomes the persisted opt-out. Offline/disconnected
sends still always queue.

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

* feat(ui): steer active follow-ups by default

---------

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 23:28:27 -07:00
Peter Steinberger
23c0a7b612 fix: preserve working installs on unsupported Node (#106994)
* fix(update): preserve installs on unsupported Node

* fix(update): verify skipped install scripts

* refactor(update): share global install preflight

* fix(update): validate Bun-installed Node runtime

* fix(update): classify install preflight failures

* refactor(update): normalize install failure reasons

* style(update): format updater policy test

* fix(update): preserve pnpm script policy safety

* fix(update): classify hosted git sources

* chore: leave release notes to release flow

* fix(release): defer package inventory helper loading

* style(release): keep inventory loader LOC-neutral

* fix(update): validate staged package lifecycle

* fix(update): match packed lifecycle contract

* fix(update): harden Bun package activation

* test(update): model packed Bun lifecycle

* style(update): avoid lifecycle name shadowing

* fix(update): remove unsafe Bun staging experiment

* fix(update): satisfy updater type checks

* fix(update): preserve packed npm package name

* fix(update): preserve checkout failure status

* fix(update): disable scripts while packing candidates

* fix(update): preflight source package engines safely

* fix(update): preserve legacy npm downgrades

* fix(update): pin npm packing to selected Node

* fix(update): stage npm activation before replacing live package

* fix(update): guard non-npm source activation

* refactor(update): isolate npm staging helpers

* fix(update): harden staged package lifecycle

* test(update): satisfy merged type gates

* fix(update): privatize runtime npm helper

* fix(ci): satisfy merged lint and type gates

* docs(changelog): defer updater note to release

* fix(update): guard package activation runtime

* fix(update): preserve installs on unsupported Node

* test(update): reject prerelease Node runtimes

* test(update): use shared temp cleanup

* fix(update): fail closed when install scripts are skipped

* fix(update): pack install guard in docker artifacts

* fix(ci): keep install guard export tooling-local
2026-07-14 23:19:48 -07:00
Peter Steinberger
3d4ba02574 feat(active-memory): add recall-specific fast mode (#108043)
* feat(active-memory): add fast mode override

* fix(agents): preserve fast auto cutoff

* fix(active-memory): inherit parent fast mode

* docs: refresh generated docs map
2026-07-14 23:09:04 -07:00
Dallin Romney
fc56b55403 docs: refresh generated docs map (#108052) 2026-07-14 23:05:07 -07:00
Peter Steinberger
b9a837ec8d refactor(agents): split agent session responsibilities (#107948) 2026-07-14 22:25:08 -07:00
Peter Steinberger
e9fc23ad1f refactor(plugin-sdk): remove private testing barrel ahead of window (#108020) 2026-07-14 22:13:37 -07:00
Peter Steinberger
290836cafd refactor(config): split config I/O responsibilities (#107983)
* refactor(config): split config I/O

* fix(config): align split modules with guardrails

* fix(config): remove dead write metadata helper

* style(config): format write safety imports

* fix(config): preserve comment-loss warning on split writes
2026-07-14 22:11:22 -07:00
clawsweeper[bot]
3a208a5068 fix(discord): prevent presence wake floods after reconnects (#107969)
* feat(discord): throttle online-presence events after gateway reconnects

After a Discord gateway (re)connect the presence replay burst emitted one
system event per member, waking the agent each time. Add a per-account
emission gate: a post-reconnect suppression window (default 5 min), a
sliding-window burst limit (default 8/60s, logged once per episode), and
a configurable per-user greeting cooldown (default 8h). New guild
presenceEvents knobs: cooldownSeconds, reconnectSuppressSeconds,
burstLimit, burstWindowSeconds.

* fix(discord): preserve presence throttle retries

* fix(discord): preserve presence throttle retries

* fix(discord): scope presence throttle per guild

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>

* fix(discord): keep presence gate internals private

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>

---------

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-14 22:02:53 -07:00
Monkey-wusky
4a9a556a3a fix(config): reject zero-value resetArchiveRetention to prevent silent data loss (#104516)
* fix(config): reject zero-value resetArchiveRetention to prevent silent data loss

* fix: add braces to guard clauses for curly lint rule

* fix: normalize numeric values and cover pruneAfter fallback in migration

* fix: reject zero-value pruneAfter at schema level to close fallback gap

* fix: independently check and repair both retention fields in migration

* fix: split doctor diagnostics into field-specific rules and messages

* fix: remove unused local in migration test helper

* fix: repair 5 lint errors (curly braces, zero-fraction, narrow value)

* fix(doctor): rewrite zero resetArchiveRetention to false instead of deleting it

Deleting a zero resetArchiveRetention caused the runtime to fall back to
pruneAfter (default 30d), which contradicted the doctor output that
claimed archives would be kept indefinitely.  Only an explicit false
value produces indefinite retention per the documented schema.

- P1: Rewrite zero resetArchiveRetention to false in the doctor
  migration apply callback, matching the promised indefinite-retention
  behavior.
- P3: Update the pruneAfter rule warning to describe eligible
  stale/non-preserved session entries instead of "all sessions".

* fix(config): repair zero retention safely

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-14 21:47:40 -07:00
lee-xydt
6ce439da25 fix(config): warn before stripping JSON5 comments on config write (#107604)
* fix(config): warn before stripping JSON5 comments on config write

Add checkCommentLossWarning in json5-comments.ts to detect JSON5 comments
before config writes. Warn via deps.logger.warn for main config writes and
via options.warn for $include file writes. Both paths support skipOutputLogs
to suppress warnings during automated operations.

Fixes #105683

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

* fix(config): remove public warn callback, route through internal sink

Fixes #105683

- Remove warn field from exported ConfigWriteOptions (P1 merge-risk)
- Default checkCommentLossWarning to console.warn when no callback
- Move include warning after hash-conflict/rejection checks
- Update tests to spy on console.warn instead of custom callback

* fix(config): warn before stripping JSON5 comments

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-14 21:39:18 -07:00
Peter Steinberger
ce078367e4 fix(docs): preserve plugin surface identifiers 2026-07-14 23:41:24 -04:00
Peter Steinberger
abfdfd65b8 docs: refresh generated docs map (#107966) 2026-07-14 20:38:53 -07:00
Hannes Rudolph
c3dc366570 docs: explain z.ai overload responses (#107940) 2026-07-14 20:53:00 -06:00
Peter Steinberger
ed12937cbd refactor(plugin-sdk)!: delete the zero-consumer channel-ingress facade, AccessFacts projections, and dead dispatch aliases (#107906)
* refactor(plugin-sdk)!: delete the zero-consumer channel-ingress facade, AccessFacts projections, and dead dispatch aliases

* chore(plugin-sdk): refresh API baseline hash for the facade deletions

* fix(channels): drop dead AccessFacts field writes stranded by the facade deletion

* chore(plugin-sdk): refresh API baseline hash after rebase
2026-07-14 19:43:18 -07:00
Peter Steinberger
57d926b4fd fix: connect resumed native terminals reliably (#107688)
* fix: render resumed paired-node terminals

* fix(control-ui): connect native catalog terminals reliably

* chore: keep release notes in PR body

* fix(control-ui): require terminal reconnect cancellation

* fix(gateway): cancel timed-out terminal opens safely

* fix(control-ui): recover stalled terminal opens

* chore(ui): refresh i18n fallback baseline

* fix: preserve login shell path for resumed terminals

* refactor(plugin-sdk): avoid extra resolver export

* fix(gateway): normalize terminal open failures

* test(control-ui): split terminal readiness coverage

* docs: explain catalog terminal PATH restoration

* fix(control-ui): complete terminal readiness release gates

* fix(ci): remove unused shell resolver exports

* chore(plugin-sdk): refresh API baseline after rebase
2026-07-14 19:18:19 -07:00
Shakker
576c209110 docs: refresh generated docs map 2026-07-15 03:13:32 +01:00
Peter Steinberger
6d3eff97a0 refactor(channels): privatize Mattermost and MSTeams test seams (#107924)
* refactor(mattermost): privatize internal test seams

* refactor(msteams): privatize internal test seams

* docs(mattermost): fix public API import path

* refactor(deadcode): shrink export baseline
2026-07-14 19:11:46 -07:00
Peter Steinberger
b1b5e212c0 fix(mac): keep dashboard navigation beside link browser (#107798)
* fix(mac): keep dashboard navigation beside link browser

* chore(i18n): refresh macOS browser source location

* test(ui): mirror responsive nav fixture state

* test(mac): respect constrained runner window size

* test(mac): measure laid-out browser split width

* test(mac): use constrained window layout width

* fix(mac): refresh split frames before restoring width

* chore(i18n): refresh macOS browser source location

* test(mac): use constrained window frame width

* test(mac): snapshot constrained split geometry

* test(mac): exercise feasible divider shrink

* test(mac): verify divider persistence callback

* test(mac): use current split dimension constant
2026-07-14 19:01:45 -07:00
Shakker
bc707efd3c docs: document ClickClack command menus 2026-07-15 02:58:26 +01:00
Josh Avant
91a18c05f1 fix(imessage): keep message actions within the current conversation (#107773)
* fix(imessage): bind message actions to conversations

* fix(imessage): keep resource helpers internal

* fix(imessage): clarify message ID binding guidance

* test(imessage): isolate resource binding cache

* fix(imessage): preserve email conversation aliases
2026-07-14 18:50:20 -07:00
Peter Steinberger
503362f018 refactor(core): read channel metadata instead of hardcoded channel literals (batch 1) (#107898)
* refactor(channels): converge internal group-policy drift onto the scope tree

* chore(plugin-sdk): refresh API baseline hash for scope-key exports

* fix(config): avoid shadowing the scopeKey export in the case-insensitive lookup

* refactor(core): read channel metadata instead of hardcoded channel literals (batch 1)
2026-07-14 18:46:12 -07:00
Peter Steinberger
5579f009fb refactor(channels): converge internal group-policy drift onto the scope tree (#107865)
* refactor(channels): converge internal group-policy drift onto the scope tree

* chore(plugin-sdk): refresh API baseline hash for scope-key exports

* fix(config): avoid shadowing the scopeKey export in the case-insensitive lookup
2026-07-14 18:30:04 -07:00
Peter Steinberger
86772735ac fix: pin sessions dropped into Pinned (#107854)
* fix(ui): pin sessions dropped into pinned group

* test(ui): capture pinned session drop proof

* chore: keep release note in PR metadata
2026-07-14 17:14:39 -07:00
Peter Steinberger
6f8903bc4d fix(macos): distinguish app and Gateway updates (#107793)
* fix(macos): clarify app-owned gateway updates

* fix(macos): sync update ownership translations

* fix(i18n): refresh control UI fallbacks

* fix(i18n): translate new control UI copy

* fix(ui): keep update routing live
2026-07-14 17:06:45 -07:00
Peter Steinberger
2dfaa852e9 fix: cloud session delete works after worker destroy (#107848) 2026-07-14 16:58:12 -07:00
Peter Steinberger
0b03d17ef2 refactor(agents): split session manager internals (#107822)
* refactor(agents): split session manager internals

* refactor(agents): keep session helpers private

* fix(agents): preserve opaque SQLite session rows
2026-07-14 16:25:10 -07:00
Peter Steinberger
623ec0f369 improve(qa-matrix): split E2EE runtime and protect recovery keys (#107828)
* fix(autoreview): handle verified QA source references

* refactor(qa-matrix): split E2EE scenario runtime

* style(qa-matrix): format recovery scenario

* chore(qa-matrix): prune split runtime baseline

* chore: keep release note in PR
2026-07-14 16:13:41 -07:00
Peter Steinberger
b363d5a293 feat(linux): canvas UI via CLI-node + Tauri app IPC bridge (#107633)
* feat(linux): canvas via CLI-node + Tauri app IPC bridge

* refactor: extract gateway helper modules

* build(linux-canvas): register plugin package in lockfile

* fix(linux-canvas): move canvas advertise test out of core, regen docs/protocol/deadcode

* fix(gateway): break node-catalog/registry import cycle via leaf normalize module; add canvas glossary term

* style: oxfmt invoke.ts and runtime.ts after buildNodeEventParams extraction

* fix(linux): load Canvas WebView via dedicated data_directory context

Wry's Linux/WebKitGTK incognito mode discards Tauri's registered
WebContext (wry webkitgtk/mod.rs), so the Canvas window got a fresh
ephemeral context without the openclaw-canvas:// scheme handler — the
bundled A2UI page never committed (stayed about:blank) and every A2UI
command timed out. Use an isolated cache-backed data_directory instead,
which keeps the protocol handler while still isolating Canvas storage
from the dashboard window.

* fix(linux): keep Canvas WebView ephemeral via incognito + data_directory

Autoreview flagged that a dedicated data_directory alone persists Canvas
browser state (cookies, localStorage, IndexedDB, service workers) across
restarts, so an agent that navigates Canvas to a site could leak an
authenticated session into a later session. iOS uses a non-persistent
store; Linux should match.

Add .incognito(true) alongside .data_directory(): the distinct directory
gives Tauri a fresh WebContext key so it still attaches the
openclaw-canvas:// protocol closure, and incognito makes Wry swap in a
fresh *ephemeral* context carrying those protocols. Live-verified on a
Wayland/WebKitGTK box: the bundled page still loads
(location.href=openclaw-canvas://localhost/index.html, openclawA2UI
present, A2UI renders) and the canvas-webview dir holds no persistent
cookie/storage files.
2026-07-14 16:05:14 -07:00
Peter Steinberger
520e2580cb feat(control-ui): show terminal upload progress (#107789)
* feat(control-ui): add terminal upload recovery

* fix(control-ui): harden terminal upload recovery
2026-07-14 15:10:01 -07:00
Peter Steinberger
890f20be06 feat(macos): coordinate app and Gateway updates (#107634)
* feat(macos): coordinate app and Gateway updates

* fix(macos): harden coordinated update recovery

* fix(gateway): reject mixed wake presence events

* chore: keep release notes in PR body

* chore(i18n): sync macOS update strings

* chore(generated): sync native artifacts

* style(macos): satisfy Swift checks

* chore(i18n): refresh update source locations

* fix(macos): localize post-update status

* fix(macos): satisfy post-update Swift lint

* chore(i18n): refresh post-update source locations

* test(gateway): isolate system-event routing state

* test(gateway): document system-event authorization
2026-07-14 14:59:32 -07:00
Peter Steinberger
9d3de463a5 fix(docs-i18n): preserve Max translation boundaries 2026-07-14 16:43:15 -04:00
Peter Steinberger
4f0e131cd2 feat(ui): run sessions on cloud workers (#107670)
* feat(ui): add cloud session targets

* test(ui): cover cloud session attachments

* test(ui): use recovery token fixture

* test(ui): record cloud locale fallbacks

* fix(ui): harden cloud session recovery

* fix(ui): track cloud handoff phase

* fix(ui): close cloud recovery escape paths

* fix(ui): finish cloud recovery hardening

* fix(ui): recover ambiguous cloud session creation

* fix(ui): isolate stale cloud creation recovery

* test(ui): preserve cloud recovery literals

* fix(ui): complete cloud session release artifacts

* chore: move cloud release note to PR body

* docs(ui): name cloud session menu exactly
2026-07-14 12:44:11 -07:00
Peter Lee
f972c69151 fix(agents): validate cacheRetention values (#94494)
* fix(agents): map cacheRetention 'standard' to 'short' for Bedrock Claude models

* fix(agents): scope standard cacheRetention alias to Anthropic cache family only

* fix(agents): validate prompt cache retention

* chore: keep changelog release-owned

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 12:37:55 -07:00
Peter Steinberger
a679cda0c9 refactor(copilot): trim internal exports (#107730)
* refactor(copilot): trim internal exports

* chore(deadcode): refresh export baseline
2026-07-14 12:23:35 -07:00
Shakker
e63e49b1b0 fix: prevent Bonjour probe retry loops (#107710)
Prevents duplicate Bonjour advertisement attempts by delegating probing, conflict resolution, retries, and interface republishing to ciao.

Related: #98448

Prepared head SHA: 4bd1638acf

Co-authored-by: Shakker <165377636+shakkernerd@users.noreply.github.com>
Reviewed-by: @shakkernerd
2026-07-14 19:28:47 +01:00
Peter Steinberger
0571e0ecff fix(proxy): share canonical no-proxy matching 2026-07-14 11:23:32 -07:00
Peter Steinberger
a6a0716486 feat(setup): rename Crestodian to OpenClaw system agent
User-facing name is now OpenClaw (the system speaks); internal code name is
system-agent. Gateway methods crestodian.* -> openclaw.chat/openclaw.setup.*,
agent tool -> openclaw, reserved agent ids openclaw + retired crestodian.
openclaw setup routes: onboarding flags -> onboard, -m/--yes -> system agent,
bare configured interactive -> OpenClaw chat, unconfigured -> onboarding.
Hidden crestodian CLI and /crestodian TUI aliases kept; docs moved to
docs/cli/openclaw.md with redirect stub. macOS/Android strings in lockstep.

Refs #107237
2026-07-14 11:03:02 -07:00
Shakker
3976ec47d3 fix: default skill workshop approvals to auto (#107690)
Skill Workshop lifecycle actions now run without an additional Gateway approval by default, while explicit `approvalPolicy: "pending"` keeps the operator approval gate.

Prepared head SHA: 06e907797e
Co-authored-by: Shakker <165377636+shakkernerd@users.noreply.github.com>
Reviewed-by: @shakkernerd
2026-07-14 18:31:51 +01:00
Jesse Merhi
00364ee777 improve: warn before non-ClawHub plugin installs (#102197)
Merged via squash.

Prepared head SHA: e08d9e737d
Co-authored-by: jesse-merhi <79823012+jesse-merhi@users.noreply.github.com>
Co-authored-by: jesse-merhi <79823012+jesse-merhi@users.noreply.github.com>
Reviewed-by: @jesse-merhi
2026-07-15 03:25:36 +10:00
Peter Steinberger
2bbf5e6ca0 fix(macos): prevent clipped and stalled onboarding (#107598)
* fix(macos): harden onboarding on short screens

* chore: keep release notes in PR body

* chore(i18n): refresh macOS onboarding inventory
2026-07-14 10:07:41 -07:00
Peter Steinberger
084d1d9637 feat(control-ui): upload files into terminals (#107364)
* feat(control-ui): add terminal file uploads

* fix(control-ui): protect Windows terminal uploads

* fix(control-ui): satisfy terminal upload gates

* chore(ui): translate terminal upload labels

* fix(control-ui): reject unknown Windows upload shells

* fix(control-ui): harden Windows upload paths

* fix(control-ui): retry terminal upload cleanup

* chore(ui): reconcile locale translation memory

* fix(control-ui): validate terminal upload inputs

* fix(control-ui): retry failed upload cleanup

* chore(ui): refresh terminal upload locale metadata

* fix(terminal): integrate uploads with session recovery

* refactor(control-ui): isolate terminal upload transport

* fix(control-ui): keep upload helper types private
2026-07-14 09:33:39 -07:00
Peter Steinberger
f81f9d8570 chore: enforce max-lines suppression ratchet (#107315)
* ci: enforce max-lines suppression ratchet

* chore: prune stale max-lines suppression

* fix: close max-lines ratchet enforcement gaps

* fix: harden max-lines ratchet checks

* fix(ci): satisfy max-lines ratchet checks

* style: format max-lines declarations

* fix(ci): match oxlint suppression grammar

* test: isolate max-lines git fixtures

* chore: prune resolved max-lines debt

* test: skip newline path fixture on Windows

* fix: harden max-lines suppression ratchet

* chore: refresh max-lines baseline

* fix: close max-lines ratchet bypasses

* fix: derive ratchet base from PR merge tree

* fix: support older Git in staged ratchet

* fix: align max-lines declarations and baseline

* chore: refresh max-lines baseline for current main

* fix: exclude generated wizard locales from max-lines

* chore: prune resolved max-lines debt
2026-07-14 09:27:02 -07:00
VACInc
6f0326af36 fix: prevent session exports from writing outside workspace (#104708)
* fix: prevent session exports outside workspace

* fix: support aliased workspace export paths

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 09:20:43 -07:00
Peter Steinberger
5f13921c26 fix: preserve Fable thinking on Claude CLI routes (#107636)
* fix(anthropic): preserve Claude CLI effort on root gateways

* chore: leave release notes to release workflow
2026-07-14 09:15:21 -07:00
Peter Steinberger
6d31c162f9 fix: keep root Claude live sessions usable (#107606)
* fix(agents): support Claude live sessions as root

* chore: leave release notes to release workflow
2026-07-14 08:46:58 -07:00
Peter Steinberger
2ecc6b6b6b fix(ui): show restart banner for unapplied config (#107577)
* fix(ui): derive config apply state from gateway

* test(ui): align applied config hash coverage

* test(ui): follow config autosave flow

* fix(ui): guard applied config refreshes

* fix(ui): reconcile patched config revisions

* fix(ui): prevent stale config apply polling

* chore: leave release notes to release flow

* refactor(config): split applied revision helpers

* style(config): format gateway methods

* fix(i18n): refresh Korean native glossary hash
2026-07-14 08:43:35 -07:00
Alix-007
111f7cde35 fix(telegram): bound stalled diagnostic response reads (#106035)
* fix(telegram): bound stalled diagnostic response reads

* test(telegram): type timeout cancellation mock

* style(telegram): apply oxfmt to diagnostic response timeout files

* fix(telegram): share diagnostic body deadlines

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

* chore: leave release notes release-owned

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 08:27:59 -07:00