Commit Graph

38446 Commits

Author SHA1 Message Date
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
Josh Lehman
c69486deae fix(slack): isolate queued reply drafts (#107820) 2026-07-14 18:39:20 -07:00
Peter Steinberger
ca9bbf6ee0 refactor: split embedded agent runner orchestration (#107900)
* chore(skills): sync autoreview security scanner

* refactor(agents): split embedded runner orchestration

* test(agents): verify timeout media recovery

* fix(agents): handle missing timeout assistant text

* fix(autoreview): restrict quoted credential keys
2026-07-14 18:38:55 -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
3c0654c002 test(live): classify xAI degraded availability (#107887) 2026-07-14 18:18:05 -07:00
Peter Steinberger
e905a682f7 feat(agents): session self-service tools
New grouped sessions tool (patch: label/pin/archive/model/thinking; group
CRUD; owner-gated; no reset/delete/compact). sessions_spawn gains visible +
worktree via sessions.create with admission reservation and abort-confirmed
rollback; a started run with no run id is aborted and deleted rather than
left orphaned. subagents tool reads the unified task_runs ledger tree-scoped
(subagent/acp/media/cron) and cancels detached runs, enforcing the
controlScope gate for leaf callers. session_status gains a cost line.
Agent-origin model patches record a fallback marker; runs failing on
auth/billing/model_not_found revert to the last working model (transient
errors never revert), and an independent thinkingLevel change realigns the
marker so revert cannot clobber it.

Refs #107237
2026-07-14 18:12:22 -07:00
Peter Steinberger
75d029dae2 refactor: privatize Linux Canvas and Node Host internals (#107884)
* refactor(linux-canvas): privatize internal command surfaces

* refactor(node-host): privatize runtime manifest type

* chore(deadcode): shrink export baseline
2026-07-14 18:00:16 -07:00
Josh Avant
210340fe93 fix(channels): prevent base URL credentials in status output (#107754)
* fix(channels): redact credentials in account URLs

* fix(channels): sanitize final status summaries
2026-07-14 17:32:16 -07:00
Harjoth Khara
b47c9b2e75 fix: recover managed npm lock metadata (#107294) 2026-07-14 17:08:18 -07:00
Peter Steinberger
2dfaa852e9 fix: cloud session delete works after worker destroy (#107848) 2026-07-14 16:58:12 -07:00
Peter Steinberger
92e1ad8dfa improve: speed up run-lease tests (#107838)
* test: reuse run-lease repository fixture

* test: track run-lease temp roots
2026-07-14 16:31:48 -07:00
Peter Steinberger
d3e314141f test(plugins): include linux canvas startup baselines (#107837) 2026-07-14 16:31:16 -07:00
Jason (Json)
0644956830 fix(sqlite): compaction works with memory path search enabled (#107809)
* fix(sqlite): accept canonical memory path FTS triggers

* test(sqlite): reject drifted path FTS trigger

---------

Co-authored-by: Josh Lehman <josh@martian.engineering>
2026-07-14 16:25:37 -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
Jason (Json)
0e0754b7c3 fix(sqlite): prevent startup failure on dormant older session databases (#107803)
* fix(sqlite): migrate dormant session databases before compact

* test(sqlite): cover historical startup migration

---------

Co-authored-by: Josh Lehman <josh@martian.engineering>
2026-07-14 16:24:24 -07:00
Yuval Dinodia
1b117408a2 fix(tui): keep the newer session when a stale switch history resolves last (#104824)
* fix(tui): keep the newer session when a stale switch history resolves last

setSession set state.currentSessionKey synchronously and then awaited
loadHistory, but nothing serialized overlapping switches. When a user
switched to session A then quickly to B, if A's loadHistory RPC resolved
after B's, A's completion saw sessionInfo.key !== the now-current key and
unconditionally reverted currentSessionKey, currentSessionId, and the
chat log back to A, and adopted A's in-flight run onto activeChatRunId.
The next typed message was then routed to A while the user believed they
were on B.

Give setSession and loadHistory a monotonic generation token, mirroring
the existing refreshSessionInfo overlap guard. setSession bumps the
generation and loadHistory captures it before the RPC, so a completion
whose generation is stale no-ops instead of clobbering the newer session.

* fix(tui): ignore rejected history from a superseded session switch

Guard the loadHistory catch path with the session-switch generation so a
stale switch whose history RPC rejects no longer writes a history-failed
notice into the session the user has since moved to.

Add a fake-backend PTY rapid-switch e2e test that drives the real runTui
loop and a reject-path regression test for the superseded-switch case.

* fix(tui): guard stale session refreshes

* test(tui): cover session alias canonicalization

* fix(tui): reject stale session refresh generations

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 16:20:20 -07:00
Josh Avant
e4e83cf813 fix(reply): preserve finals while successor waits (#107799) 2026-07-14 16:13:24 -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
85e4a42fef refactor: privatize core dead exports (#107826)
* refactor(gateway): privatize Claude prompt candidate type

* refactor(music-generation): privatize runtime dependency type

* refactor(security): privatize install policy request type

* refactor(sessions): privatize state notice prefix

* refactor(skills): privatize upload concurrency limit

* refactor(agents): privatize Chutes and catalog constants

* test(commands): use Chutes endpoint contract literals

* refactor(llm): remove proxy error facade export

* refactor(infra): privatize proxy protocol error message

* refactor(proxy-capture): privatize environment keys

* chore(deadcode): shrink unused export baseline
2026-07-14 16:00:58 -07:00
Peter Steinberger
4c03c297b2 fix: OpenAI OAuth models fail on cloud workers (#107791)
* fix(cloud-workers): project gateway auth route

* fix(cloud-workers): pin projected auth profile
2026-07-14 15:36:57 -07:00
Peter Steinberger
a197a45799 test: isolate command harness selection (#107801) 2026-07-14 15:34:29 -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
9e1a1f2296 test: isolate provider ownership fixture (#107762)
* test: isolate harness auth planning

* test: isolate provider ownership fixture
2026-07-14 14:56:39 -07:00
qingminlong
c94da0df6f fix(logs): preserve log tails across short reads (#105066)
* fix(logs): preserve log tails across short reads

* test(logging): track log-tail temp files

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 14:47:53 -07:00
Peter Steinberger
92fcd4ed99 fix(system-agent): reject untrusted plugin specs before proposing
The Crestodian->OpenClaw reconciliation restored a pre-#102197 `if (opts.approved)`
wrapper around the execute-time plugin-install trust check, so an unapproved
plugin-install op produced a formatted plan for an arbitrary npm/url/file
source instead of rejecting it. Validate unconditionally, matching #102197,
and restore its dropped regression test. Also fix a stale
crestodian-ring-zero-setup id in the CI compat list and a doubled
openclaw-openclaw-planner tmpdir prefix from the mechanical rename.
2026-07-14 14:33:34 -07:00
Zexu Jin
2200256ff5 fix: SQLite-backed sessions never trigger byte-based auto-compaction (#104940)
* fix(sessions): wire SQLite transcript byte size into preflight compaction guard

readSessionLogSnapshot returned {} for SQLite-backed transcripts, so
maxActiveTranscriptBytes never saw a byte count and silently degraded to
token-only compaction triggering for every migrated session. Read the
size via readTranscriptStatsSync using the identity already encoded in
the SQLite sessionFile marker.

Fixes #104762

* test(memory): cover SQLite byte-triggered flush

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 14:31:00 -07:00
Peter Steinberger
0b9e3e19fa refactor(sessions): separate SQLite accessor owners (#107772)
* refactor(sessions): separate SQLite accessor owners

* refactor(sessions): keep SQLite helper types private
2026-07-14 14:23:20 -07:00
Peter Steinberger
d252d635e9 refactor(tasks): use Kysely update objects 2026-07-14 14:16:55 -07:00
wahaha1223
534300beed fix(usage): stop provider usage hangs after response headers (#107454)
* fix(usage): keep response reads within request deadline

* fix(usage): preserve caller aborts across body reads

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 14:14:26 -07:00
Peter Steinberger
31cd030f16 fix: cloud draft remains stuck after worker teardown (#107759)
* fix: clear destroyed failed cloud drafts

* chore: leave cloud fix notes to release flow
2026-07-14 14:05:10 -07:00
Peter Steinberger
fd986ed3c2 refactor(system-agent): narrow internal turn types (#107767)
* refactor(system-agent): narrow internal turn types

* chore(deadcode): refresh unused-export baseline
2026-07-14 14:02:22 -07:00
Peter Steinberger
7cf790a49d refactor(pairing): model runtime type consumers (#107760)
* refactor(pairing): model runtime type consumers

* chore(deadcode): refresh unused-export baseline
2026-07-14 13:53:34 -07:00
mushuiyu886
2b6053c3f9 fix(gateway): prevent malformed Control UI encoding weights from selecting compression (#107617)
* fix(gateway): reject malformed control ui qvalues

* test(gateway): cover valid encoding qvalues

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 13:50:01 -07:00
Peter Steinberger
24fb23d96f refactor(compat): trim internal naming exports (#107758)
* refactor(compat): privatize legacy naming constants

* chore(deadcode): refresh unused-export baseline
2026-07-14 13:46:59 -07:00
Peter Steinberger
0a6de42292 test: isolate live model switch suite (#107738) 2026-07-14 13:41:52 -07:00
Peter Steinberger
e2ad943ebd refactor(media): trim internal exports (#107756)
* refactor(media): privatize internal parsing helpers

* chore(deadcode): refresh unused-export baseline
2026-07-14 13:41:04 -07:00
Peter Steinberger
f6653d1127 fix(macos): keep Connect Your AI choices in CLI order (#107642)
* fix(macos): align AI connection choices

* refactor(crestodian): extract setup auth options
2026-07-14 13:19:32 -07: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
4f40f46a08 docs(shared): clarify ignore anchoring 2026-07-14 12:19:39 -07:00
Peter Steinberger
661e6a62e9 test(shared): cover escaped trailing spaces 2026-07-14 12:19:39 -07:00
Peter Steinberger
ada729b74e test(shared): compact ignore fixtures 2026-07-14 12:19:39 -07:00
Peter Steinberger
a7f4e72216 test(shared): preserve tabbed ignore anchoring 2026-07-14 12:19:39 -07:00
Peter Steinberger
bfa72f8dab fix(shared): classify trailing-space ignore rules 2026-07-14 12:19:39 -07:00
Peter Steinberger
21515ae808 refactor(deps): reuse ignore matcher construction 2026-07-14 12:19:39 -07:00
moguangyu5-design
45395c2fd1 fix(shared): match nested gitignore semantics for unanchored patterns and escaped ! 2026-07-14 12:19:39 -07:00
Peter Steinberger
c2e0ce7b68 fix(ci): restore main validation gates (#107697)
* fix(ci): allow Unreleased notes for main validation

* test(ci): cover release smoke changelog intent

* test(ci): require release changelog policy propagation

* docs(agents): require review init after pushes

* chore(ci): prune stale max-lines baseline

* refactor(system-agent): split operation modules

* refactor(bonjour): keep ciao classification type private

* fix(bonjour): remove stale local classification alias
2026-07-14 12:11:25 -07:00
Peter Steinberger
992b4cfc5b refactor(deps): use native web-push types 2026-07-14 11:37:40 -07:00
Peter Steinberger
0571e0ecff fix(proxy): share canonical no-proxy matching 2026-07-14 11:23:32 -07:00