Commit Graph

10843 Commits

Author SHA1 Message Date
jesse-merhi 6608df1558 fix(gateway): fence approved plugin publication 2026-08-13 13:43:23 +10:00
jesse-merhi 627da2cc15 docs(gateway): define policy token consumption 2026-08-13 13:43:22 +10:00
jesse-merhi bb6e8033a4 chore(plugin-sdk): refresh gateway agent harness baseline 2026-08-13 13:43:22 +10:00
jesse-merhi 87012e56b9 chore(plugin-sdk): refresh gateway policy API baselines 2026-08-13 13:43:22 +10:00
jesse-merhi c66522ad60 fix(gateway): preserve policy warning details 2026-08-13 13:43:22 +10:00
jesse-merhi ef263aea43 docs(security): clarify policy reevaluation outcomes 2026-08-13 13:43:22 +10:00
jesse-merhi 1c040134b0 fix(security): fail closed on missing npm integrity 2026-08-13 13:43:22 +10:00
jesse-merhi 85fe665b3c fix(security): bind approvals to resolved artifacts 2026-08-13 13:43:21 +10:00
Jesse Merhi 7cf4e84584 fix(security): bind install warning approvals 2026-08-13 13:42:48 +10:00
Jesse Merhi 7562e5542e docs(security): clarify one-shot warning approval 2026-08-13 13:42:24 +10:00
Jesse Merhi 4096c19642 fix(security): consume policy warning approvals once 2026-08-13 13:42:00 +10:00
jesse-merhi c621276dac fix(security): clarify automatic policy recovery 2026-08-13 13:34:55 +10:00
jesse-merhi b79d0360ff fix(security): enforce install policy output bounds 2026-08-12 20:53:38 +10:00
jesse-merhi 009be3dd20 fix(security): bound install policy notices 2026-08-12 17:38:37 +10:00
jesse-merhi c59f240926 chore(plugin-sdk): refresh install policy API baseline 2026-08-12 06:13:05 +10:00
jesse-merhi b05da5f26c fix(security): bound policy finding line numbers 2026-08-12 05:38:32 +10:00
jesse-merhi 9ce3ec0082 fix(security): reconcile current install boundaries 2026-08-12 05:38:31 +10:00
jesse-merhi 78d0040c90 fix(security): close install policy review gaps 2026-08-12 05:38:31 +10:00
jesse-merhi c3bfde68d7 docs(security): describe warning policy decisions 2026-08-12 05:38:31 +10:00
jesse-merhi 2ebb077ae5 fix(security): consume CLI policy approval once 2026-08-12 05:38:30 +10:00
jesse-merhi 01ac19d531 docs(security): describe install policy warnings 2026-08-12 05:38:30 +10:00
jesse-merhi 318d8592b2 fix(install): preserve explicit policy acknowledgement 2026-08-12 05:38:30 +10:00
Jesse Merhi e057d9570e fix(security): re-evaluate forced policy warnings 2026-08-12 05:38:30 +10:00
Jesse Merhi 7be358d70f feat(security): support install policy warnings 2026-08-12 05:38:29 +10:00
Peter Steinberger 8c567306ba fix(openai): remove duplicate GPT-5.6 picker entry (#122178)
* fix(openai): remove duplicate GPT-5.6 picker entry

* test(gateway): split OpenAI model picker coverage

* test(openai): align canonical model fixtures

* chore(plugin-sdk): refresh agent harness API baseline
2026-08-11 12:29:36 -07:00
Ayaan Zaidi 746a188c90 refactor(media): collapse attachment byte classification into media-core (#122168)
Attachment MIME gating and extraction dispatch used nine separate byte policies across five files; the allowlist could approve one MIME while dispatch observed another after a second sniff. @openclaw/media-core/attachment-classify now owns byte sniffing, text heuristics, extension mapping, and the seven attachment classes; the cache stores one classification that gates and dispatch share. Channel-declared MIME leads with the transport Content-Type as a byte-arbitrated hint, normalizeMimeType folds YAML/XML synonyms so existing configured allowlists keep matching, and input_file API callers keep declared-MIME precedence over cosmetic filenames. Net -135 production LOC.

Proof: 2,153 focused tests across media-core/media-understanding/media plus boundary-contract and deadcode-mirror suites; ClawSweeper local review clean (round 5, zero findings); live Telegram default-turn probe green.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-11 19:10:49 +00:00
Josh Lehman 2f4dff7428 fix(context-engine): long sessions continue past 20k events (#122149)
* oc-5b3: canonicalize durable commitTurn

* oc-deb: remove stale commitTurn test fields
2026-08-11 11:53:11 -07:00
Peter Steinberger 2d6a5d7356 refactor(gateway): split worker environment service by ownership (#122138)
* refactor(gateway): split worker environment service by ownership

* refactor(gateway): derive environment intent at the contract owner

* chore(lint): ratchet max-lines baseline after worker-service split

* style(gateway): prune unused symbols after worker-service split

* refactor(gateway): narrow worker-service seam exports

* chore(plugin-sdk): refresh API baseline
2026-08-11 11:48:28 -07:00
Peter Steinberger 508265cb4f docs: add operator backups guide covering archives, snapshots, scheduling, and continuous replication (#122196) 2026-08-11 11:29:02 -07:00
tharuntejmeta a57e8c70f5 feat(meta): add Muse Spark 1.2 models (#120373)
* feat(meta): add Muse Spark 1.2 models

* fix(meta): verify Muse Spark 1.2 catalog metadata

* fix(meta): verify Muse Spark 1.2 contracts

* docs(meta): quote discounted services terms

* fix(meta): preserve replay fields for simple completions

* test(meta): align stream host adapter types

* fix(meta): apply catalog cap for zero max tokens

* fix(meta): preserve omitted output cap

* fix(meta): scope responses stream wrapper

* fix(ai): preserve source API for stream wrappers

* fix(ai): distinguish hook and dispatch APIs

* test(ai): adapt plugin streams synchronously

* chore(plugin-sdk): refresh API baseline

* chore(plugin-sdk): refresh sharded API baseline

---------

Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-11 11:26:58 -07:00
Peter Steinberger 3d76246792 refactor: eliminate final export name collisions (#122083)
* refactor: resolve final export name collisions

* refactor: update remaining collision rename consumers

* style: format rebased auth helpers

* test: update remaining session entry mocks

* test: update remaining runtime mock exports

* test: update delivery info path mock

* refactor: reconcile combined collision sweeps

* chore: regenerate collision and sdk baselines
2026-08-11 11:18:24 -07:00
WhatsSkiLL d9766c3d57 fix(wizard): honor remote password auth in probes (#118134)
* fix(wizard): honor remote password auth in probes

* fix(wizard): preserve remote probe auth policy

* test(wizard): keep remote probe coverage focused

* fix(gateway): preserve remote probe secret refs

* fix(gateway): isolate remote probe credentials

* fix(wizard): authenticate remote health checks

* fix(gateway): unify remote probe auth precedence

* test(gateway): align remote probe auth coverage

* fix(gateway): preserve disabled exec-ref guard

* fix(gateway): block failed remote ref fallback

* test(gateway): follow consolidated probe coverage

* fix(wizard): stop health after unresolved remote auth

* fix(gateway): preserve configured sibling probe auth

* fix(wizard): bind remote health target

* docs(gateway): clarify remote probe auth precedence

---------

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
Co-authored-by: Dallin Romney <dallinromney@gmail.com>
2026-08-12 00:46:25 +07:00
Peter Steinberger ebb2770000 refactor: eliminate export name collisions (#122084)
* refactor: eliminate export name collisions

* chore(scripts): burn resolved collision baselines

* refactor: narrow legacy session load options

* chore: refresh SDK and session debt baselines

* refactor: adopt upstream secrets collision fix

* test(plugin-sdk): mock renamed session store core

* fix(scripts): track renamed session accessor core
2026-08-11 10:41:50 -07:00
Peter Steinberger cad77fb39c refactor: consolidate remaining coercion helpers (#122020) 2026-08-11 10:22:01 -07:00
Peter Steinberger 3a55867ea1 fix(gateway): bound stalled session subscriptions (#121164) 2026-08-11 10:10:20 -07:00
Ayaan Zaidi 82ba647673 fix(media): record per-attachment media dispositions and render bounded skip markers (#122098)
Inbound image, audio, and video attachments could vanish with no recorded outcome and no model-visible explanation: attachments dropped by first-only selection, disabled or unconfigured capabilities, stage failures, URL-only images, and ACP-undelivered images all left the model unaware the media existed. Fixes #122044; completes the outcome custody started for documents in #122025.

Media capabilities now record one closed disposition per pre-truncation candidate at the decision site that owns the reason, with a memoized lazy native-vision probe (fires only when a marker could render; failure yields unknown and never alters outcomes; explicit image models never pay a catalog lookup). One late reader renders bounded, actionable markers from recorded facts only: native-vision and ACP-delivered images suppress per verified index, recorded failures always render, and document plus media markers share one five-marker budget with a reason-neutral overflow summary. The shipped SDK decision type stays additive (optional dispositions map).

Proof: 906 + 103 focused tests including nine adversarial-review regressions, ClawSweeper local review clean (round 9, zero findings, security cleared), live Telegram image drive showing ref preservation with no false marker.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-11 16:52:32 +00:00
Peter Steinberger 1dcac5b15f fix: open terminals no longer delay gateway updates (#121601)
* fix(gateway): allow updates with open terminals

* fix(updater): support terminal policy upgrades

* chore(plugin-sdk): refresh API baseline
2026-08-11 09:37:58 -07:00
Shakker 4def22ebfc docs: document coherent browser tab ownership 2026-08-11 18:20:36 +02:00
Patrick Erichsen ad704f35c4 fix(control-ui): hide unusable models from picker (#121852)
* fix(ui): hide unusable models from picker

* refactor(ui): remove stale model availability helper

* refactor(ui): simplify catalog state guards

* style: format provider catalog imports

* chore: refresh plugin SDK API baseline

* refactor(core): break provider catalog type cycle

* chore(protocol): refresh models list Swift output

* chore: refresh plugin SDK API baseline after rebase

* fix(gateway): preserve full catalog preload semantics

* fix(ui): keep model status within startup budget

* fix(ui): preserve provider status within startup budget

* fix(models): scope live catalog outcomes

* test(ui): expect agent-scoped model refresh

* test(ui): align model refresh e2e fixtures
2026-08-11 09:13:44 -07:00
Peter Steinberger d1452fb5d1 refactor(plugin-sdk): split API baseline by entrypoint (#122082) 2026-08-11 08:54:42 -07:00
Peter Steinberger db73b59c04 refactor: burn wrapper shadowing baseline entries (#122040)
* refactor: burn wrapper shadowing entries

* chore: refresh wrapper shadowing baselines

* test: update secrets runtime state mocks

* fix(ci): absorb Control UI build identity variance
2026-08-11 08:24:03 -07:00
Peter Steinberger 48253cde46 docs: correct database-first current-state claims (#122085)
Schema versions are global v6 and agent v17 (src/state/openclaw-state-db-contract.ts:6; src/state/openclaw-agent-db-contract.ts:22). State v5/v6 provenance comes from 7a7d6bb and 509a5f0, matching the current contract comments at src/state/openclaw-state-db-contract.ts:4.

QMD is retired and Doctor migrates its paths to builtin memory (src/commands/doctor/shared/legacy-config-migrations.runtime.retired-memory-qmd.ts:94). Device auth is SQLite-backed in TypeScript and Swift while Android remains SecurePrefs-backed (src/infra/device-auth-store.ts:115; apps/shared/OpenClawKit/Sources/OpenClawKit/DeviceAuthStore.swift:26; apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceAuthStore.kt:55).

Opt-in cache, payload, raw-stream, timeline, and macOS diagnostics remain JSONL artifacts (src/agents/cache-trace.ts:93; src/agents/anthropic-payload-log.ts:46; src/agents/embedded-agent-subscribe.raw-stream.ts:16; src/infra/diagnostics-timeline.ts:96; apps/macos/Sources/OpenClaw/DiagnosticsFileLog.swift:3).

The canonical agent schema currently has cache_entries but no VFS/tool/run artifact tables, and subagent attachments materialize in child workspaces (src/state/openclaw-agent-schema.sql:398; src/agents/subagents/spawn/subagent-attachments.ts:308). Current Doctor/session owners replace deleted prototype paths (src/infra/state-migrations.doctor.ts:66; src/config/sessions/session-accessor.sqlite-entry.ts:165; src/config/sessions/paths.ts:320).
2026-08-11 08:03:10 -07:00
Peter Steinberger 89ff93dbc2 fix(agents): retire attachment-only steering messages after delivery (#121158)
* fix(agents): retire queued messages by identity

* chore(plugin-sdk): refresh API baseline

* test(agents): narrow queued message events
2026-08-11 07:33:21 -07:00
Peter Steinberger 29fd6aaf6b refactor(sessions): tidy the session-accessor import surface (#122055)
Close the barrel gap (SessionEntryListScope), migrate the 14 production
type-bypass imports and the sessions-rewind raw-op imports through the
accessor barrel, and document session-accessor.sqlite-scope as the
sanctioned low-level entry point for doctor/migrations/infra. Net +8
production LOC: the barrel gains its missing surface. Part 3 (final) of
the session-accessor dual-layer collapse (#121316, #121536).
2026-08-11 06:53:42 -07:00
Peter Steinberger e390781534 refactor: burn cross-directory export name collisions (#121893)
* refactor: name subsystem logger exports

* refactor(test): distinguish exported test doubles

* refactor: consolidate canonical owner helpers

* refactor: give cross-domain helpers distinct names

* chore(lint): ratchet collision debt baselines

* fix(test): complete collision rename consumers

* fix(test): update remaining collision mock consumers

* fix(test): update transcript reader mock export

* refactor: keep embedded logger name at its owner

* fix(test): align embedded logger mock with owner

* refactor: name shared assistant phase extraction

* fix(ui): update assistant phase extractor import

* chore(generated): refresh collision and SDK baselines

* style(test): format merged plugin mocks

* chore(sdk): refresh API content hashes
2026-08-11 06:50:22 -07:00
Ayaan Zaidi 1b6467c779 fix(media): record model-visible outcomes for every inbound file attachment (#122025)
Inbound document attachments could vanish silently (DOCX and other Office files, read failures, disabled URL sources). File intake now classifies every attachment into a closed outcome union rendered through one exhaustiveness-checked path: unsupported formats, policy-rejected types, unreadable files, and disabled URL sources all produce bounded model-visible markers (max five per message plus one overflow summary), with strict MIME-token and URL-basename sanitization so attachment metadata cannot inject prompt text or leak signed-URL credentials. Media-stage outcome custody is tracked separately in #122044.

Proof: focused media suites (1855 tests), pre-fix regression, exact-head ci-gate green, ClawSweeper local review clean, and a live Telegram E2E showing the DOCX marker in the model payload.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-11 19:01:15 +05:30
Peter Steinberger dd55770715 fix(channels): preserve plugin reply suppression across delivery paths (#121159)
* fix(channels): preserve reply transform suppression

* test: split ACP channel transform coverage

* chore: refresh plugin SDK API baseline
2026-08-11 06:28:20 -07:00
Ayaan Zaidi 2c8ed54ddb feat(heartbeat): default delivery to the configured owner, never groups (#121988)
Unset heartbeat.target now resolves "owner": elected heartbeat notifications deliver to the operator's DM resolved from commands.ownerAllowFrom or the channel allowFrom (first concrete entry; wildcards and channel-scoped wildcards excluded; configured owners exhausted across channels before any channel-local fallback). Delivery requires the channel's own classifier to positively prove a direct destination — every bundled messaging plugin now ships an inferTargetChatType contract — and unproven or group-shaped destinations fail closed to the visible no-route state. The first implicitly-routed delivery carries a one-line self-explanation naming the target: "none" opt-out. Explicit target "last" remains as the follow-the-conversation opt-in. Refines the unreleased #121892 default before it ships; refs #121880.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 13:18:22 +00:00
Peter Steinberger 59dc87290f test(plugins): remove cache resize test knob (#121904)
* test(plugins): remove cache resize test knob

* chore(plugin-sdk): refresh cache closure hashes
2026-08-11 06:05:32 -07:00
Vyctor H. Brzezowski 16d0132c1b feat(ui): lead the chat header with the project and its own icon (#121734)
* feat(ui): show a workspace's own project icon in the chat workspace chip

Resolve the conventional project icon inside a session's workspace root once
per Gateway process and serve it over a strictly scoped authenticated route so
the Control UI can render real project identity instead of a folder glyph.

Refs #121723

* test(gateway): keep the workspace icon server teardown out of a promise executor return

* fix(ui): keep flat project icons legible on the workspace chip in every theme

* feat(ui): lead the chat header with the project, then the session title

Reorder the header into an identity trail — project chip, muted slash, session
title — rendered from one segment list so a later parent-session segment
extends it. Drop the project icon halo and record the flat-dark-icon contrast
tradeoff at the style site.

Refs #121723

* fix(ui): type the header identity trail segments without a lit result predicate

* fix(gateway): scope the workspace icon route to visible local sessions

Owner-gate the route so it cannot answer for sessions the caller's own
sessions.list would hide, withhold the workspace root of exec-node sessions so
a remote project never resolves to this host's icon, bound SVG icons before
they reach a renderer, and retry ordered Control UI credentials so a stale
saved token no longer silently drops the icon.

Refs #121723

* fix(ui): render the header project as a flat breadcrumb segment, not a badge

Drop the pill border, fill, and radius from the project name so it reads as a
quiet trail segment inline with the session title: one type size across the
trail, hierarchy carried by colour, hover and focus reusing the sibling title
button's tint so removing the border keeps a visible focus indicator.

Refs #121723

* fix(ui): balance the header trail separator spacing after the title pull-back

* test(ui): migrate the shared avatar loader tests to ordered credential arrays

* fix(ui): center the chat header identity trail

* refactor(ui): reuse workspace icon credentials

* test(ui): scope deleted-session recovery to the visible pane

* fix(ui): cache missing workspace icons across renders

* chore: refresh plugin SDK API baseline
2026-08-11 09:33:57 -03:00