Commit Graph

11805 Commits

Author SHA1 Message Date
Peter Steinberger c340bc09f0 feat(buzz): support flat automatic replies and typing
Expose opt-in replyToMode off while retaining threaded replies by default. Keep incoming thread/session identity and explicit tool or CLI targets intact. Resolves #120339. Thanks to @Alfridus1 for the report.
2026-08-27 14:53:18 -07:00
Peter Steinberger 7b000dba9d feat(reef): operator-configurable sharing rules for the guard (#131167)
* feat(reef): operator-configurable sharing rules for the guard

Adds channels.reef.guard.rules with capped outbound/inbound free-text
policy. Rules ride the trusted instruction side of the guard call only,
may tighten decisions or explicitly allow otherwise-review cases, and can
never override the deny floor or deterministic checks. The rules text is
hashed into the effective policy version so audit rows and pending review
approvals bind to the exact policy in force.

* fix(reef): full rules digest in policy identity; align blank-rule validation

ClawSweeper review fixes: use the untruncated sha256 rules digest in the
effective policy version so approvalDigest stays collision-resistant, and
express identical non-blank (\S) rule validation in the zod schema, the
manifest JSON Schemas, and the generated channel metadata instead of a
trim-transform mismatch.
2026-08-27 14:37:17 -07:00
Peter Steinberger 3f4cefc4d3 fix(code-mode): release canceled timers and parked execution slots (#131186) 2026-08-27 14:29:30 -07:00
Peter Steinberger 0e071abb1e docs: correct verification and hardened setup claims (#131188) 2026-08-27 14:25:03 -07:00
Peter Steinberger 77746299ea refactor(imap): consume the core identifier-authentication scale (#131178)
* refactor(imap): consume the core identifier-authentication scale

Use the SDK type and canonical strength comparator instead of the private
SenderStrength vocabulary and index ordering. Bind config values to the SDK
union with a compile-time exhaustiveness check, preserving all config keys.

Classify unproven From ownership, including no-evidence and DMARC temperror
results, as unverified. Only an explicit unverified minimum gains admission;
the default verified floor and asserted minimum keep their behavior. Keep
existing token admission and thrown-authenticator retries unchanged.

Document the remaining mutable token/early-rejection paths and expose only
the canonical comparator through the SDK, with packaged-consumer coverage.
The IMAP introduction has no stable release contract.

* docs(security): record landed sender-auth mitigations in the threat atlas

Record the graded exact-pair identifier-authentication gate and inert mutable
allowFrom audit findings. Mark R-008 implemented in core while retaining
per-channel verified adoption and downstream mappers as remaining work.
Keep the existing atlas structure and Medium residual risk.
2026-08-27 14:19:39 -07:00
Peter Steinberger e0680fdd42 fix(cli): preserve authored config during channel auth (#131117)
* fix(cli): preserve authored channel config during auth

* fix(cli): preserve source config for auth selection

* test(ui): synchronize task panel hover assertions
2026-08-27 14:11:22 -07:00
Peter Steinberger 6e82723125 fix(ui): keep reconnect-uncertain sends inline and prove delivery by run id (#131171)
After a reconnect lost the chat.send ack, the outbox reconcile only accepted
the transcript idempotency marker as delivery proof, so a send whose run was
actively streaming parked as a red 'Delivery uncertain' composer chip for the
whole run. The reconcile now also retires a queued send when the session row
reports its run id in activeRunIds or as lastRunId — the same fact live
terminal-event retirement already trusts.

Attempted unconfirmed messages now stay in the conversation as ordinary
bubbles with an amber 'Delivery unconfirmed · Retry' footer (failed keeps the
red 'Not sent'); the duplicate pane banner is suppressed for them since the
bubble owns the outcome. Command chips, never-attempted failures, and storage
errors keep their existing surfaces. Calmer copy for the remaining honest
uncertainty case.
2026-08-27 13:57:27 -07:00
Peter Steinberger 3424633360 fix(twitch): retain native sender identity in execution audits (#130730)
* fix(twitch): retain native sender identity in execution audits

Forward the registered channel runtime and actual account identity, keeping native participants distinct from role authorization. Normalize the all role at the Twitch policy producer and preserve unknown and disabled-collection paths.

Cover actual registered-plugin ingress and native reply delivery, and drain asynchronous monitor test work before cleanup. Related to #122863; no shared authorization or storage change.

* test(twitch): track the registered context builder in inventory

* test(twitch): honor host and plugin contract boundaries
2026-08-27 13:45:33 -07:00
Ayaan Zaidi f636bf2376 fix(skills): stop experience reviews from blocking chats (#131077)
Run hidden Skill Workshop reviews on a private detached session so foreground messages stay responsive and isolated. Preserve prompt-cache affinity, remove closed delivery authority, and retire queued evidence before asynchronous preparation.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-28 01:35:04 +05:30
Peter Steinberger 937a31c4a4 fix(copilot): keep Gemini working without live discovery (#131143)
Declare the Gemini Chat Completions transport and request compatibility in the owning model manifest. Remove the private metadata decoration loop so static catalog selection and forward-compatible synthesis use the same declared contract.
2026-08-27 12:58:38 -07:00
Peter Steinberger cad34e612f feat(channels): add Matrix and LINE join introductions (#131128)
Introduce on admitted bot joins using the existing sealed no-tools turn and durable room dedupe. Matrix uses room metadata and readable history; LINE uses group names and explicitly unavailable history.

Mark Matrix bridge membership provenance without changing existing event delivery, invite handling, or auto-join. Exclude startup snapshots and already-joined profile updates, including startup connection recovery.

Simplify snapshot budget accounting while preserving prompt bytes, metadata order, and oldest-first message dropping. Add channel config, docs, and regression coverage.
2026-08-27 12:52:55 -07:00
Peter Steinberger 9be3cefabd feat(configure): surface the trusted-proxy loopback opt-in with its warning (#131132)
* feat(configure): surface the trusted-proxy loopback opt-in with its warning

Ask for explicit consent before enabling same-host trusted-proxy authentication,
and explain the runtime rejection when consent is declined. Preserve existing
loopback consent and unprompted device enrollment policy on same-mode reruns.

Reuse runtime loopback classification, add English and Chinese wizard copy,
and document the consent and preservation behavior.

* test(configure): assert wizard auth through the real builder

Remove the auth-builder mock and replacement factories so gateway prompt tests verify returned configuration across proxy, token, password, and SecretRef flows. Retain all consent regressions while reducing test scaffolding and reusing tracked environment cleanup.
2026-08-27 12:45:23 -07:00
Peter Steinberger 23233bc30e fix(openshell): preserve nested host symlinks during mirror sync (#131122)
* fix(openshell): preserve nested host symlinks during mirror sync

Reconcile mirror entries recursively so trusted host symlinks and their ancestors survive remote edits and deletions. Preserve unlink-before-copy hardlink safety and drain pending filesystem work before returning an error. Cover the repair with unit regressions and the real OpenShell E2E flow.

Fixes #131111

* chore(openshell): satisfy mirror callback lint rules
2026-08-27 12:43:30 -07:00
Peter Steinberger 8e025e4767 fix(github-copilot): restore usage for domain-aware OAuth profiles (#131137) 2026-08-27 12:37:42 -07:00
Peter Steinberger a509254b16 feat(security): warn on inert mutable allowFrom entries (#131129)
* feat(security): warn on inert mutable allowFrom entries

Report configured entries that cannot authorize with name matching disabled,
and preview lockout counts before disabling mutable matching. Distinguish
mutable aliases from exact identifiers with unproven ownership in audit text.

Reuse channel ingress declarations through one SDK classifier without changing
admission policy. Keep Discord audit findings redacted and exclude symbolic
access-group references from mutable-identifier warnings.

Refs #131099.

* test(security): keep entry-authentication audit coverage in its lanes
2026-08-27 12:33:12 -07:00
Peter Steinberger c68ee620cd fix(canvas): retire the legacy document root only after migration completes (#131038)
* fix(canvas): retire the legacy document root only after migration completes

* fix(canvas): preserve older migration roots and canonical aliases

Read both historical host locations with shipped plugin precedence.
Select legacy config owners from existing manifest metadata for doctor,
without broadening session-store ownership. Recognize realpath aliases
of canonical storage and cover persisted partial repairs and retries.
2026-08-27 12:28:26 -07:00
Peter Steinberger 19be0f6dc0 fix: honor scenario drivers in generated QA commands (#131101)
* fix: honor scenario drivers in generated QA commands

Carry declared driver requirements through coverage search, grouping and quoted command output. Preserve unconstrained defaults and validate generated arguments through real CLI parsing and canonical lane selection. Closes #131088.

* test: capture generated QA commands through the shell
2026-08-27 11:58:30 -07:00
Peter Steinberger 025ae36a72 fix(device-pair): verify retained subscribers before archiving the migration source (#131008)
* fix(device-pair): verify retained subscribers before archiving the migration source

Precheck remaining namespace capacity before importing legacy subscribers. Verify source and pre-existing destination keys in the shared JSON importer before reporting completion or archiving, preserving the source and warning when retention falls short. Keep runtime caps, eviction policy, and registration semantics unchanged.

Prepared for draft PR maintainer review. Review-required: persistent-state retention semantics.

* fix(device-pair): omit absent subscriber migration fields

Keep absent account and thread fields out of normalized legacy subscribers so the strict plugin-state JSON serializer accepts ordinary subscriptions. Preserve numeric zero thread IDs and exercise all optional target combinations through the real migration contract.
2026-08-27 11:52:24 -07:00
Peter Steinberger fa09ec4c49 fix(onboard): preserve the remote gateway TLS pin for an unchanged endpoint (#131042)
* fix(onboard): preserve the remote gateway TLS pin for an unchanged endpoint

* fix(onboard): honor discovery transport when preserving remote settings

Carry the discovery URL, transport, and optional pin together so a trusted Direct choice overrides saved SSH transport and a new manual tunnel cannot retain an old route behind the same loopback URL. Keep manual same-endpoint pin preservation and existing auth scoping.

Strengthen the explicit-absent origin assertion, restore test-owned environment keys, and document the discovery override behavior.
2026-08-27 11:42:45 -07:00
Peter Steinberger 80082b2476 fix(configure): preserve unrelated gateway auth policy across reconfiguration (#131035)
* fix(configure): preserve unrelated gateway auth policy across reconfiguration

* test(configure): exercise real auth builder in gateway prompt tests

Replace fake auth factories and builder-call assertions with returned-config checks. Cover password policy preservation, generated-token parity, and SecretRef output without changing production behavior.
2026-08-27 11:38:49 -07:00
Peter Steinberger 5e924a574c fix(feishu): split oversized Markdown cards without losing content or receipts (#131106) 2026-08-27 11:34:50 -07:00
Peter Steinberger b3eded1744 fix(hooks): run plugin triggers with HTTP hooks disabled (#131059)
* fix(hooks): schedule plugin turns independently of HTTP hooks

* docs(hooks): clarify shared HTTP capacity reservation
2026-08-27 11:34:07 -07:00
Peter Steinberger 19d61d9ada fix: inspect exact hook names before matching key aliases (#131081)
Share name-first, ambiguity-aware hook selection with toggles and carry the selected hook to rendering and exit status. Preserve unique keys, missing-hook output, plugin-managed inspection and mutation policy. Closes #131075.
2026-08-27 11:25:30 -07:00
Peter Steinberger 676a96685e fix(code-mode): recover after read-only discovery (#131079) 2026-08-27 11:25:25 -07:00
xingzhou 474624a5c7 fix(network): guarded fetch callers can leave responses streaming (#111277)
* fix(network): release captured streams without waiting on their cleanup

End best-effort reader ownership before guarded request cleanup, while preserving explicit cancellation failures after cleanup. Simplify llama download reader ownership without changing transport abort policy.

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

* fix(network): preserve caller-owned response cleanup

Preserve cancellation for partially consumed media responses, type the captured response handoff, and clarify beta stream cleanup ownership.

* fix(tts): settle stream cancellation with request cleanup

Own binary-stream cleanup in the shared helper and remove duplicate provider release wrappers. Preserve explicit cancellation settlement and errors while allowing cleanup to abort retained capture branches.

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

* test(tts): preserve cancellation result tuple types

Keep both cancellation/release call orders while passing an explicit two-result tuple to Promise.allSettled. Preserve the existing outcome and error-identity assertions without casts or non-null assertions.

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-27 11:25:14 -07:00
Peter Steinberger 831564faf2 fix(daemon): preserve units after interrupted systemctl probes (#131080) 2026-08-27 11:20:04 -07:00
Peter Steinberger 3708c1c3fd docs(start): tell the personal reader Why OpenClaw is for them too (#131105)
Bridge paragraph before the enterprise properties: same product spans one
laptop to hardened team deployment, configuration is the only difference,
and the enterprise checklist protects a single operator for free. Adds a
read_when bullet for the reader asking whether enterprise depth makes
OpenClaw heavyweight for personal use.
2026-08-27 11:18:22 -07:00
Peter Steinberger 24d93f26a4 fix(ui): preserve session identity through rename and group actions (#130936)
* fix(ui): reject stale session renames after replacement

* fix(ui): preserve selected session identity through group actions
2026-08-27 11:17:44 -07:00
Peter Steinberger 8466a2e5c9 fix(imap): retry reader admission during IDLE and reconnect (#131072)
* fix(imap): recover reader admission across IDLE and reconnect

* test(imap): avoid returning timers from promise executors
2026-08-27 11:11:58 -07:00
Peter Steinberger ce0fafefce fix(tooling): avoid build and test startup stalls on shared tsx caches (#130924)
* fix(tooling): avoid shared tsx cache startup stalls

Use the shared preloader before tsx initializes so maintained build, check, and test commands retain memory transforms without scanning other checkouts' disk caches. Preserve changed-cwd forks and copied tooling closures.

* test: align command contracts with tooling bootstrap
2026-08-27 10:36:12 -07:00
Peter Steinberger 834368b7d4 fix(browser): cancel downloads after output save failures (#131048) 2026-08-27 10:28:08 -07:00
Peter Steinberger 53380e5ca7 docs: clarify IMAP recovery and reader tool policy (#131039) 2026-08-27 10:18:23 -07:00
Peter Steinberger ff3cf3de3b docs(start): correct headless credential handoff to the SQLite auth store (#131024) 2026-08-27 09:40:27 -07:00
Peter Steinberger 706a06eab6 refactor(channels): consolidate account logout cleanup (#130976)
* refactor(channels): consolidate account logout cleanup

* fix(channels): initialize local logout plugins
2026-08-27 09:18:11 -07:00
Peter Steinberger abbe09ef56 fix(hooks): report delivery failures after successful runs (#130926)
* fix(hooks): report delivery failures after successful runs

* docs(hooks): align IMAP completion and warning guidance
2026-08-27 09:01:21 -07:00
Peter Steinberger 23ae7bcc3e fix(doctor): surface unreadable legacy plugin state instead of silently skipping migration (#130956)
Preserve missing-source and intentional parser-null skips while forwarding other read and JSON parse errors to the existing Doctor warning boundaries. Keep plugin import, archive, and persistence behavior unchanged.
2026-08-27 08:13:02 -07:00
Peter Steinberger 3aaf13ca84 feat(ui): show activity cards for online people (#130664)
* feat(ui): show activity cards for online people

Record live person timing independently of heartbeat freshness and expose keyboard- and touch-accessible cards with visible session links. Preserve continuous online intervals across overlapping tabs without adding persistent activity history.

Closes #130649

* build(protocol): refresh generated presence timing fields

* fix(gateway): scope presence snapshots to read-access operators

Apply one recipient projection to hello, system-presence, and events. Keep person timing and time-zone details behind read access, and filter watched references with the canonical session-list policy without leaking hidden counts. Preserve idle-person metadata for readers and prevent non-reader activity-driven frames.

* fix(plugins): preserve Gateway capability load context

Carry the owning registry's metadata generation, workspace, install records, and built-artifact preference through capability discovery. Preserve standalone source loading and existing speech eligibility while avoiding synchronous source transforms on cold Talk catalog requests.

Fixes #130777

* test: align integrated presence and capability coverage

Keep the recipient matrix in its timing-aware owner, close the suite-owned Gateway for shutdown proof, and spy on the canonical install-record reader. Remove the retired private carrier's assertion allowance.

* fix(gateway): broadcast presence when clients connect

Publish completed connection rows through the canonical scoped broadcaster so established readers see first connections and reconnects without waiting for profile edits or activity. Preserve shared online intervals and reset them only after the final socket closes.

* fix(ci): align presence fixtures and sidebar type ownership

Reuse the canonical sidebar host type to remove the type-only lazy-runtime cycle. Assert omitted scopes through hello auth and denied presence reads, and supply presence version callbacks in the shared WebSocket context fixture. Retain startup admission and drain assertions without changing deadlines.

* fix(ui): retain latest scroll commands until their destination

Do not treat the virtualizer's idle debounce or a decreasing offset as reader takeover. Settle at the actual DOM end within one pixel, retaining the separate eight-pixel UI-follow policy and explicit input cancellation. Cover retargeted idle delivery and near-end precision with the real dependency, synchronize pointer baseline capture, and type the existing composer snapshot as its textarea contract.

Fixes #130892
2026-08-27 08:07:22 -07:00
sinner 1873d671d6 fix(cron): reject main-session delivery edits without partial updates (#119923)
Validate newly authored delivery before inherited main-session cleanup,
reusing the canonical delivery and failure-destination validators.
Keep webhook edits, explicit no-delivery and clear-only requests valid.
Cover atomic rejection through Gateway and document the supported flow.

Fixes #119922. Preserves and simplifies the repair from #119923.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: zyw02 <zyw02@users.noreply.github.com>
2026-08-27 07:47:37 -07:00
Leon-SK668 5cdef05903 fix(channels): preserve empty docs prefixes (#103794)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Leon-SK668 <17695126+Leon-SK668@users.noreply.github.com>
2026-08-27 22:42:47 +08:00
Peter Steinberger 8012723c72 fix(channels): keep configured accounts in JSON inventory (#130738)
* fix(channels): keep configured accounts in JSON inventory

Keep metadata-only inventory independent of setup-runtime eligibility, while retaining setup precedence and failure visibility. Let status audits resolve channel capabilities at the audit owner instead of treating inventory metadata as complete adapters.

Fixes https://github.com/openclaw/openclaw/issues/130700

* test(status): align JSON audit owner expectations
2026-08-27 07:38:30 -07:00
Peter Steinberger 14ff866288 fix(doctor): repair agent workspace and heartbeat values on the canonical roster shape (#130959)
Restore existing null-workspace and invalid-heartbeat repairs for canonical agent entries. Share roster traversal while preserving the reachable legacy-list path when include ownership blocks migration, and verify snapshot-to-repair persistence and convergence.
2026-08-27 07:30:01 -07:00
Peter Steinberger e8c332592d docs: qualify Why OpenClaw security and comparison claims (#130947) 2026-08-27 06:46:41 -07:00
Ayaan Zaidi 06038f9df8 fix(llama): support embedding-only managed setup (#130883)
Allow low-memory local-memory setups to install only the verified managed server and embedding model while preserving every configured chat route.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-27 18:09:53 +05:30
Peter Steinberger f04a622c1f fix(browser): resolve unnamed role refs and initialize AX markers (#130881)
* fix(browser): resolve unnamed role refs and initialize AX markers

Keep explicit raw ARIA empty names distinct from omitted serializer names and share one dependency-faithful role lookup. Bind the DOM document in the marker-owning CDP session without adding a round trip.

Related: #130879. The separate snapshot membership and ordering failures remain open.

* chore(browser): shrink ref assertion safety baseline

Record the five type assertions removed by the ref-name repair. Tighten the canonical per-file allowance from seven to two; runtime and browser-test bytes are unchanged.
2026-08-27 05:22:38 -07:00
Peter Steinberger 3ee363fc08 docs(codex): correct effort support and provenance in harness reference (#130882) 2026-08-27 04:19:05 -07:00
Omar Shahine ea552dff2c feat(plugin-sdk): publish identifier authentication contract (#123793)
* feat(plugin-sdk): publish identifier authentication contract

* fix(discord): distinguish PluralKit identity provenance

* fix(discord): preserve PluralKit group provenance

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
2026-08-27 04:03:40 -07:00
Omar Shahine d561469745 feat(channels): grade sender identifier authentication in the ingress kernel (#123782)
* feat(channels): add identifier authentication kernel

* fix(channels): preserve exact identity provenance

* fix(channels): fail strict dynamic groups closed

* fix(channels): bind plugin allowlists to exact identity fields

Move the Twitch role normalizers into the kernel branch and keep Discord
name and tag entries on their corresponding identity fields. Repair the
same mismatch for Slack name slugs and IRC nick@host entries.

Add regressions at the channel authorization boundaries.

Related: #123782
Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>

* refactor(channels): resolve identifier authentication at intake

Keep raw SDK inputs optional and carry required authentication through
normalized kernel subjects, entries, and state. Resolve static claims at
intake and floor omitted fields in a supplied per-message map to unverified.

Remove the deprecated internal policy wrapper, downstream strength
fallbacks, and unused type exports. Cover the partial-map floor, static
claims, and mutable alias behavior, and document the map contract.

Related: #123782

* fix(channels): retain affected admission contributions

Preserve an authentication effect when other admission contributions were
not evaluated. Prefer any affected result, then any evaluated result,
before checking for uniformly unevaluated contributions.

Cover the mixed case through the existing redacted receipt flow.

Related: #123782

* test(twitch): await monitor delivery before resetting mocks

Make the ingress fixture drain accepted deliveries on stop, matching the
real monitor lifecycle. Await those deliveries directly so prefix and
reply assertions cannot race or leak completions into the next case.

Related: #123782

* fix(feishu): match ambiguous allow entries under both id fields

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-27 03:42:38 -07:00
Peter Steinberger 11ef173077 fix: preserve native session ownership during cleanup and attachment (#130864)
* fix: preserve native session ownership during cleanup and attachment

Prepare permitted harness owners for offline session deletion. Reject direct
attachment of parent-controlled Codex children before displacing ownership.
Keep deadline and client authority through binding publication, and release
accepted subscriptions when publication fails without a remaining owner.

Unify conversation create/attach and preserve observational child monitoring.
Verified 950 focused/sibling tests, production and test types, independent
Codex review, and the real built offline CLI capacity reproduction.

* test: avoid shadowing the native binding row
2026-08-27 03:37:44 -07:00
Peter Steinberger 2abc76d1ae fix(media): keep failure markers visible in audio-only processing (#130869) 2026-08-27 03:34:48 -07:00
gaoanze888 47882f48cb fix(discord): preserve stringified components (#128498)
Preserve documented Discord Components V2 when MCP clients serialize component objects, and keep cross-channel schema discovery account-neutral.

Co-authored-by: gaoanze888 <214786078+gaoanze888@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-27 16:02:33 +05:30