Commit graph

118182 commits

Author SHA1 Message Date
Vincent Koc
d4eccd8345
feat(browser): support lightweight Docker browser installs (#154608)
* refactor(browser): share engine adapters for Chromium and Lightpanda

Refresh signed stack identities without changing any source tree.

Previous signed head: bed85c558d

PR06 CI tested stale synthetic merge22409995, whose main base80c3c742 predates Peter Steinberger's canonical static-validation fix82411a34. Fresh synchronization must check the repaired merge context; neither old failed CI nor old passing runtime proof is relabeled. Preserve every source/test/dependency blob and previously qualified registry/catalog fixture correction.

* improve(browser): default managed Chromium to efficient headless launches

Refresh signed stack identities without changing any source tree.

Previous signed head: b6cda11dd8

PR06 CI tested stale synthetic merge22409995, whose main base80c3c742 predates Peter Steinberger's canonical static-validation fix82411a34. Fresh synchronization must check the repaired merge context; neither old failed CI nor old passing runtime proof is relabeled. Preserve every source/test/dependency blob and previously qualified registry/catalog fixture correction.

* improve(browser): trim Docker browser images and harden Lightpanda sidecar

Refresh signed stack identities without changing any source tree.

Previous signed head: e6d320e30a

PR06 CI tested stale synthetic merge22409995, whose main base80c3c742 predates Peter Steinberger's canonical static-validation fix82411a34. Fresh synchronization must check the repaired merge context; neither old failed CI nor old passing runtime proof is relabeled. Preserve every source/test/dependency blob and previously qualified registry/catalog fixture correction.

* test(agents): retain canonical restored-run settlement fixture

* test(agents): preserve upstream requester-disposal completion ordering

* fix(browser): preserve shared Chromium discovery and Lightpanda lifecycle

* fix(browser): align lightweight image integration

Preserve the current shared browser discovery helper and renderer fixtures after baseline integration. Leave Lightpanda resource ceilings with operators and keep selected-image proof wording version neutral.
2026-10-24 15:20:21 +08:00
RoboClaw
1adbd71472
fix(plugins): prevent config-only restarts from hanging reloads (#182331)
* fix(plugins): prevent config-only restarts from hanging reloads

Use the existing replacement startup budget and cleanup custody for config-only service restarts. Keep late native startup and its final stop owned after the observer times out.

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>

* fix(plugins): prevent config-only restarts from hanging reloads

Worked on by:
- @steipete

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
OpenClaw-Publication: 51daf96c-174a-4c15-a0d6-2f00b120f94f

* fix(plugins): prevent config-only restarts from hanging reloads

Worked on by:
- @steipete

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
OpenClaw-Publication: 286a745e-de7f-408c-b051-2b32438716c1

---------

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
2026-10-24 15:19:37 +08:00
Peter Steinberger
b56729ef5e
fix: macOS gateway updates fail after a hostname change (#182271) 2026-10-24 00:17:49 -07:00
Peter Steinberger
28caa6fe8f
feat(perf): summarize retained heap without exporting snapshot contents (#182333)
Extend the existing streaming heap graph analyzer with single-snapshot retained-size, collection, duplicate-string and session-key-reference summaries. Redact labels unless built in or explicitly allowed from reviewed source; exclude V8-truncated strings from duplicate savings. Add a capture and bounded-analysis runbook. No Gateway runtime behavior changes.
2026-10-24 00:17:18 -07:00
Vincent Koc
eea1c93a1d
fix(sessions): preserve idle reader deadlines during database cleanup (#182316) 2026-10-24 15:12:40 +08:00
Peter Steinberger
bfdc5f96a7
test(ui,qa,scripts): remove low-value tests (batch d453) (#182318)
* test(ui): deslop q0002 tests

Remove duplicate E2E layers and success-only capture scaffolding. Keep browser geometry, real transport, lifecycle and security assertions. Make the retained waiting-timer alignment check independent of optional artifact capture.

Retained proof: new-session-page.durable-write-teardown.e2e.test.ts owns the identical near-cap and pending-write scenarios; config-page.custom-theme.test.ts and view-appearance.browser.test.tsx own Clear/import and rejected-preference behavior; question-prompt.shared-state.test.ts and chat-question-card.test.tsx own sibling resolution and typed-answer remounts. Keep secret validation and corrected-host submission together.

Usage rendering/status remain in usage-page.test.ts, view.test.ts, view-overview.test.ts, provider-usage.test.tsx and tooltip.browser.test.ts. Sidebar ordering remains in app-sidebar-session-navigation-logic.test.ts, app-sidebar-session-filter.browser.test.ts and sidebar-selection-overflow/session-stability/pin-placement E2Es. Desktop mapping/retry remain in desktop-panel.test.ts and desktop-panel-session.test.ts; real keyboard/control proof remains in desktop-keyboard.e2e.test.ts and desktop-panel.e2e.test.ts.

CI-only campaign: no tests, builds or coverage run. Plain oxlint, oxfmt and diff checks pass. LOC 6099 -> 5163 (15.3%); declarations 57 -> 45; literal-expanded cases 73 -> 53. Stop below 40% to preserve distinct browser and real MCP transport proof. No production, support or routing changes.

* test(ui): consolidate remaining q0002 e2e layers

Keep browser geometry and real transport contracts while removing owner-boundary replays. Cumulative shard LOC: 6099 -> 3635 (-40.4%); this commit removes another 1528 lines net. Static declarations 57 -> 30, expanded cases 73 -> 38. No test/build/coverage runs under CI-only mode; plain oxlint, oxfmt and diff checks pass.

Subagent lifecycle, elapsed time and token accumulation remain in chat-progress.test.ts (reports the whole request; retains a resumed request), chat-sessions-yield.test.ts (counts each run once), chat-transcript-message-index.test.ts (preserves handoff), chat-pane-sidebar-layout.test.tsx (focus and retained panels) and chat-header-subagents.e2e.test.ts. Keep inline width, working-status ordering and waiting-clock browser geometry here.

MCP confirmation/context and live authority remain in mcp-app-view.test.ts, server-methods/mcp-app.test.ts and mcp-app-standalone.test.ts; cache policy remains in mcp-app-sandbox-http.test.ts. Keep real App/HTTP/stdio cancellation, teardown, history and cross-origin theme proof.

Appearance defaults/accent/server-selection remain in control-ui-presentation.test.ts, view-appearance.browser.test.tsx, server-prefs.test.ts, config-page.custom-theme.test.ts, settings.navigation-profile.test.ts and theme-selection-defaults.e2e.test.ts. Keep actual imported-palette reload and read-only reasoning proof. Question state/recovery remain in chat-composer-question.test.ts, question-prompt.test.ts and favicon status/browser owners; retain shared-card secret validation/retry in the mounted ask document.

Attachment restoration and retirement remain in draft-handoff, incognito-navigation and attachment-url-lifecycle E2Es. Read completion, partial-batch custody and submission gates remain in chat-attachments.test.tsx, composer-attachments.test.ts, submit-gates.test.ts and chat-attachment-read-lifecycle.e2e.test.ts. Initial text adoption remains in history-merge.test.ts. Trim unasserted usage fixture fields only.

Navigation startup/loading and typing remain in chat-history-warm-startup.test.ts, sessions/index.test.ts, connection-bootstrap.test.ts and chat-composer-focus.e2e.test.ts. Desktop popup routing remains in desktop-panel.e2e.test.ts and the session URL contract tests. No production, helper, routing or baseline changes. Leave the pre-existing obsolete cost-window-card selectors for coordinator diagnosis.

* test(scripts): deslop q0005 tests

Remove native-assignment cases duplicated by upgrade-survivor-native-assignments.test.ts, redundant tooling argument variants and log inventories. Share hosted-gate fixtures and assertions while retaining trust, freshness, membership and ordering checks. Keep the release-reuse resolver suite unchanged: its remaining cases protect distinct release authority and policy branches.

* test(scripts): deslop q0012 tests

Remove the copied frozen-membership suite from the plugin registry tests; upgrade-survivor-membership-compat.test.ts retains its three identical cases. Remove the copied loaded-stop-policy suite and virtual-clock harness from systemd tests; upgrade-survivor-stop-policy.test.ts retains all seven identical declarations, including process custody and cleanup failures.

Trim source-spelling inventories already covered by executable Docker mount and credential tests and release workflow step lookups. Drop the untouched, unreferenced candidate-manifest self-comparison; preserve Node private-export loading proof.

CI-only campaign: no tests, coverage, or builds run. Plain oxlint, oxfmt and git diff --check passed. 6383 to 5689 test lines; the remaining independent ownership, authority and lifecycle paths prevent an honest 40 percent cut.

* test(scripts): consolidate q0001 fixtures and owner proof

Squash the three q0001 cleanup commits onto the campaign lane. Preserve the newer lane waiver-admission cases, updated qualification-success assertions, and repaired owner-exemption fixture while retaining the shard consolidations and deletions elsewhere.

CI-only validation: plain oxlint and oxfmt --check pass for all nine touched files; git diff --check passes. No tests, coverage, Testbox, or check-changed run; affected-test execution is deferred to landing PR CI.

* test(scripts): deslop q0014 tests

Share repeated recovery request slices, method/path selectors, and pagination fixtures in the security-review entry-point suite. Preserve every case and assertion; no production or shared test-support changes.\n\nKeep mac-runtime and frv.release unchanged: their executable security, publication, transport, and lifecycle boundaries have no redundant source-grep layer to remove safely. CI-only validation: plain oxlint, oxfmt, and diff check.

* test(scripts): remove redundant q0014 boundary layers

Remove duplicate parser variants, fixture self-checks, and internal inventory lookup proof already exercised by retained materialization snapshots and path-binding cases. Retain direct classifier cursor restoration, close-on-advance, abort cleanup, descriptor substitution, and publication guards.

Consolidate release transport and artifact variants at their shared decision branches. Keep child workflow authentication at both callsites and denied second-page reads. Remove repeated security-review recovery and lifecycle scenarios covered by retained recovery cases, dependency-guard-script same-head approval, security-review-rollout ancestry, and security-sensitive-guard-script lifecycle tests.

CI-only: oxfmt, plain oxlint, and diff check passed; no tests or coverage run. Original shard LOC 5624 to 5060; the 40 percent target remains unmet because remaining security, publication, and lifecycle contracts have no equivalent retained proof.

* test(scripts): consolidate q0014 evidence fixtures

Share security-review assertion, lifecycle, timing, and CI fixtures; retain all cases while consolidating common completion scenarios. Share FRV subprocess fixture ownership and legacy qualification setup without changing their distinct outcomes.

Narrow Mac staging proof to package selection, launcher removal, owner metadata, isolation, and publication. The materialization resource snapshot and derived-runtime consumer cases retain byte-preservation and foreign-image removal proof. Share materializer FD/race evidence recording while retaining schedule, identity, bytes, and cleanup assertions.

CI-only: plain oxlint, oxfmt, and diff check pass; no tests or coverage run. Original shard 5624 lines to 4886. The 40 percent target remains unmet; no sole security, release, or lifecycle proof was deleted to force the metric.

* test(qa-lab): deslop q0015 tests

Drop the synthetic v3 server and its cleanup-only test. Protocol range and mismatch behavior remain in src/gateway/client.test.ts (advertises the protocol compatibility range; pauses default operator clients after a permanent protocol mismatch).

Consolidate real node inventory, presence and location invocation into the retained v3/v4 reconnect scenario. Keep plugin-surface negotiation, pairing reuse, exact invocation results and presence persistence checks.

Remove the duplicate Discord quiet-success row: quiet failed-tool coverage remains in the shard, and message-handler.draft-preview.rest.test.ts covers completed tool activity with progress disabled. Run the identical portable rendering subscenario once rather than once per Discord progress variant.

CI-only shard: oxfmt, diff-check and plain oxlint pass; no tests or coverage executed. Lines 5041 -> 4715; static cases 25 -> 21. Below the 40 percent target because the remaining scenarios cover distinct authority, lifecycle, catalog replacement and transport behavior.

* test(qa-lab): remove redundant q0015 e2e layers

Reduce the original shard from 5041 to 2606 test lines (48.3 percent), plus delete its now-unused 65-line native CLI fixture. Keep the previous shard commit intact. CI-only validation: oxfmt, diff-check and plain oxlint pass; no tests, coverage, builds or typechecks run.

Retire the orphaned gateway-node-control-plane suite: its five control-plane helper imports have no implementations or exports, including at the shard baseline. Keep client.test.ts protocol-range proof, server.node-pairing-authz.test.ts legacy reconnect and surface approval proof, plugin-node-capability.test.ts legacy ceiling and capability proof, node-command-policy.test.ts policy proof, and server-node-events.test.ts plus device-pairing.test.ts and node-catalog.test.ts presence persistence/projection proof. Remove only its exact CI inventory and timing entries.

Remove announcement E2E replays and their proxy/observer fixtures. Owner proof remains in subagent-announce-delivery.test.ts (reports suppression/adapter ambiguity; does not credit unidentified automatic receipts), delivery-completion.integration.test.ts (keeps an uncertainty notice owed without a delivery identity), and session-observer.terminal.test.ts (preserves the cause of a model failure). Slack dispatch.preview-fallback.test.ts owns compact/card/native task, failure and explicit reply-target branches; Discord message-handler.draft-preview.rest.test.ts and message-handler.process.draft-final.test.ts own quiet/tool progress and settlement. Keep the real stale pre-tool preview regression, origin-loss/native-stop rejection and portable Discord wire proof.

Keep Telegram catalog replacement with claimed callback, no premature edit, two acknowledged callbacks, advanced polling offset and fully drained ingress. Generic browsing/CLI availability remains in bot.model-picker.test-support.ts via bot.test.ts, bot.create-telegram-bot.test.ts callback retry, model-callback.loopback.integration.test.ts, models-list-result.cli-runtime-availability.test.ts and prepared-model-runtime.native-demand.test.ts.

Remove the mixed worker lifecycle replay: node-worker-bundle-installer.test.ts repairs missing receipts; node-worker-supervisor.test.ts admits two durable launches and releases physical slots; worker-turn-launcher-failure-recovery.test.ts preserves active placement after offline/capacity rejection; placement-dispatch-reclaim.test.ts moves back without a reclaimed intermediate; nodes.test.ts and provider-node-teardown.test.ts own role-removal ordering and exact stop/credential settlement. Keep real revoked/unconfirmed turn fencing. Codex retains denial/approval, credential isolation, persistent authorization, physical disconnect extinction and fresh recovery; remove duplicated diagnostic scaffolding and reuse joined cleanup.

* test(ui): deslop q0016 tests

Remove capture-only video, screenshot, and timing-report scaffolding while retaining pagination probe evidence and all real-Gateway ordering, byte-budget, pagination, and avatar-cache assertions.

Coverage owners: chat-error-details.e2e.test.ts and chat-view.test.ts retain error disclosure/copy contracts; chat-responsive.browser.test.ts, new-session-page.responsive-welcome.e2e.test.ts, and new-session-page.model-picker-spacing.e2e.test.ts retain shared responsive composer/picker layout. The streaming flow retains terminal partial text, keyboard/touch disclosure, error geometry, and retry clearing.

Delete repeated account-refresh proof owned by model-control.metadata-lifecycle.test.ts (selects a usable retained account after refresh failure without changing saved preferences). Delete folder fallback replay owned by place-browser-state.test.ts (opens HOME for a missing starting folder but reports explicit navigation failures) and place-browser.test.tsx (failed-refresh alert and recovery).

CI-only campaign: no tests, coverage, build, or check-changed runs. Plain oxlint, oxfmt, and diff-check pass. Below the 40% target: retain distinct media transport, history/reconnect, approval, telemetry-row identity, and durable-store interleaving coverage.

* test(qa): deslop q0017 tests

Remove duplicate Docker destination-policy proof retained by required-destination-container-wire.e2e.test.ts. Retain real cancellation and container cleanup proof.

Keep exact-pin private-history coverage in src/gateway/server-methods/skills-library.test.ts (exposes exact private pins only while session access remains current), with private RPC denial in skill-library-identity-wire.e2e.test.ts. Keep non-read automation action coverage in src/agents/agent-tools.turn-authority.test.ts (serves caller-scoped automation reads and keeps every write owner-gated).

Deduplicate native provider setup with the existing fixture, remove diagnostic-only bookkeeping, and reduce ownership input combinations without losing attachment, ordering, or seeded/unseeded dispatch branches. Preserve all distinct revocation, disclosure, native settlement, and installed-package boundaries.

CI-only validation: formatter, plain oxlint, and git diff --check pass. No tests or coverage run. Shard lines 5421 to 5065; declarations 14 to 13; expanded cases 18 to 15. The 40 percent line target is not safely attainable without dropping distinct end-to-end proof.

* test(qa): remove redundant q0017 e2e layers

Delete provider-review composition: sessions-provider-review.test.ts owns literal admission and awaited-read authority; provider-review-continuation.test.ts owns exact SSE/WebSocket steer and final-effect revalidation; sessions-sharing.test.ts owns viewer denial; devices.lifecycle.test.ts owns immediate invalidation. Session lifecycle tests retain review persistence.

Delete Docker composition: required-destination-container-wire.e2e.test.ts retains physical execution and result reconciliation; node-worker-supervisor.container.test.ts retains mounts, labels, isolation and cancellation acknowledgement; worker-runtime-permissions.suite.ts retains full-mode approval suppression. UI chat-flow.models-reasoning, worker-inference and chat-run-lifecycle E2Es retain send/settings/start/abort ordering.

Delete automation-boundary composition: system-turn-automation-reads.e2e.test.ts retains real notice admission; cron.validation.test.ts retains creator isolation and history hydration deletion/closure; agent-tools.turn-authority.test.ts retains owner gating and forged provenance; authenticated-request-dispatch.server.test.ts retains runtime revocation before response. Cron service one-shot and batch-finalization tests retain durable failure and auto-disable notification.

Remove global ownership replay covered by chat-send-global-identity, chat-send-attachments.owner, chat-history-ownership, server.agent.gateway-server-agent-a, placement-turn-claims.worker and sessions-describe-worker tests. Remove worker permission/legacy/audit and Workshop-authoring replays covered by worker-runtime-permissions.suite, node-launch-adapter, execution-decision-facts/work and skill-library-authoring tests.

Preserve loaded finalization, reconnect, physical skill materialization/pinning, native same-session settlement, canonical OpenShell authority and installed OTel coverage. Original shard 5421 to 2881 lines (-46.9%); additional pass 5065 to 2881 (-43.1%). Static formatter, plain oxlint and diff check pass. No tests or coverage run under CI-only instructions.

* test(ui): consolidate q0003 e2e owner proof

Port q0003 commits 351963564e993 and df86bbb922071 onto the campaign lane. Preserve the newer capability-menu and session-group cases unchanged, plus all four Enter-key cases and their stronger committed-state wait. Apply the remaining cleanup and retain receipt-list failure visibility and desktop scrollability assertions.

CI-only validation: oxlint and oxfmt --check passed for all six shard files; git diff --check passed. No tests, coverage, Testbox, or check-changed were run. Independent review is clean after fixing two Activity assertion gaps.

* test(scripts): trim q0012 owner replays and fixtures

Port q0012 commits ef8017a51048, 446dc27dff34, and 565ac587d1c7 onto the campaign lane. Preserve the newer Windows release-selection matrix, exact-head security-enforcement cases, and package-test sparse declaration-roots regression while applying the shard cleanup.

CI-only proof: plain oxlint and oxfmt --check passed for all eight touched files; git diff --check passed. Independent review found no actionable findings. Tests, coverage, Testbox, and check-changed were not run; affected-test execution is deferred to landing PR CI.

* test(ui): deslop q0020 tests

Remove the restored A2UI suite: its renderer, corpus fixture and bundler were retired in 6f88c26dcf (#182109). Retired-widget migration remains covered by src/commands/doctor-a2ui-widgets.test.ts.

Keep direct shortcuts in session-shortcuts.e2e.test.ts and keyboard-shortcuts-focus.e2e.test.ts instead of replaying them in the real-Gateway search scenario. Keep both composer routes with hover coverage rather than additionally replaying without hover.

Share pending account-pagination checks. Remove optional capture/reporting layers and unasserted render diagnostics while retaining budget assertions, native security/recovery, search scope, and responsive controls. CI-only campaign: oxfmt, plain oxlint and diff-check passed; tests and coverage deferred to hosted CI.

* test(ui): consolidate q0016 e2e owner coverage

Retire redundant picker revalidation and retry scenarios covered by model-control.metadata-lifecycle.test.ts, model-control.test.ts, and chat-model-picker.browser.test.tsx. Keep browser geometry and metadata publication recovery.

Image alias acquisition and eviction remain in chat-message-image-admission.test.tsx and chat-message.images.test.tsx. File-copy fallback remains in chat-file-copy-retirement.e2e.test.ts (current/path) and clipboard.test.ts (absent API). Avatar cache semantics remain in assistant-avatar-http.test.ts.

Cursor commentary recovery remains in chat-history-cursor.test.ts; pane eviction remains in the retained paginated-history scenario. Offline attachment replay remains in chat-outbox-payloads.e2e.test.ts. Consolidate retained reasoning/tool navigation and pre-submit creation assertions into the stronger cross-tab and browsed-folder scenarios.

Keep touch-completion interleaving; generic disclosure and normalization remain in chat-responsive.e2e.test.ts, chat-transcript-render.test.ts, and markdown-streaming.test.ts. Tool detail contracts remain in chat-tool-cards.test.tsx. Incognito queue persistence remains in composer-persistence.test.ts; checkout/filter behavior remains in checkout-chip.test.ts, where-chip.test.ts, and new-session-page.incognito-navigation.e2e.test.ts.

CI-only: plain oxlint, oxfmt, and git diff --check pass. No tests, builds, or coverage run. Original shard 5466 lines to 3558 (34.9%); further cuts would retire distinct lifecycle, security, storage, or layout proof.

* test(scripts): deslop q0019 tests

Factor dialect expectation rows and release-child rejection types without removing cases. Keep all 22 primitive-owner matrix inputs and every release authority and lifecycle boundary.

Remove the repeated identical-input inventory scan assertion; the retained SQL inventory case still verifies its rows. Remove copied benchmark lane IDs; the retained inventory test still validates the manifest and hashes the selected workload.

* test(scripts): remove redundant q0019 fixture layers

Replace the fixture-defined cancellation/rescue driver with the fixture owner promise-join and unwind contract. Keep real process cleanup at test/helpers/run-node-script.test.ts and test/scripts/managed-child-process.output.test.ts (starts owned-tree cleanup at leader exit while a descendant holds both output pipes).

Use the shared copied-source compiler for lint fixtures, trim repeated branch variants, and remove copied catalog, recipe, workflow-default and diagnostic inventories. Workflow default identity remains in full-release-validation-continuation-workflow.test.ts; the stronger mid-verification rerun and failed-upload cases retain reuse validation coverage.

Preserve distinct release approval, provenance ordering, credential isolation and worker shutdown interleavings. Validation is static only under the campaign CI-only instruction.

* test(scripts): consolidate q0019 owner-boundary proof

Keep related lint outcomes and Android approval rejections in shared tables with all distinct inputs retained. Compact dialect expectations while preserving construct order, multiplicity, owner classification and independent span checks.

Drop duplicate Barnacle maintainer exemption proof covered by ancillary-workflow-concurrency.test.ts (rejects the owners known exemption before allocation). Keep inline-model conversion at src/agents/embedded-agent-runner/model.inline-provider.test.ts and wrapper trailer formatting at run-vitest-bounded.test.ts; retain shutdown races in their owner suite.

Reuse the watchdog and benchmark schedule fixture owners; remove prepared-layout source inventories and repeated stage-independent logging validation. No production changes or runtime tests; CI-only campaign static gates passed.

* test(scripts): deslop q0018 tests

Remove copied workflow and catalog inventories while retaining executable provenance, planner, redaction, and renderer contracts. The prerelease scheduler case retains the external-install canary; renderer collision checks retain generic anchor uniqueness. Exact child identity and dispatch behavior remain covered by package-acceptance-workflow.test.ts.

CI-only: oxfmt, plain oxlint, and diff checks passed. No tests or coverage run. Shard LOC 5665 to 5368 (5.2%); below the 40% target because the remaining credential, npm provenance, and process lifecycle cases protect distinct boundaries.

* test(scripts): deslop q0018 redundant proof layers

Drop repeated allowlist-entry graphs; retain exact worker/Doctor admission, unowned references, sink budgets, repeated publication edges, SDK escapes, command and lazy-import boundaries. Replace copied planner partitions with complete, unique file coverage and Telegram config ownership.

Delegate profiler contents to run-vitest-profile.test.ts (profiles selected runner) and post-ack shutdown to vitest-fork-shutdown.test.ts (joins hung-exit shutdown). Preserve namespace and SQLite lifetime proof here. Remove duplicate npm producer-verifier rows and report inventories; shared producer failures remain covered by requires a successful parent for publication and reuses successful preparation and source jobs after parent failure. Synthetic maturity judgments still assert the independent 75 percent result.

CI-only: oxfmt, plain oxlint and git diff --check passed; no tests, coverage or check-changed ran. Additional cut: 5368 to 4771 lines. Cumulative: 5665 to 4771 (15.8 percent), still below the requested 40 percent. No production or support files changed.

* test(scripts): reduce q0018 runner replay fixtures

Replace the multi-wrapper state-cleanup replay with focused real two-file SQLite retirement, strict first/second-file failure verdicts, and native shell-profile isolation. Keep native-home admission and resource receipt failure branches. Home staging remains covered by test/test-env.test.ts, temp-home lifecycle by src/test-utils/temp-home.test.ts, worker retirement by test/non-isolated-runner.test.ts, cache lifetime by vitest-process-cache.test.ts, and wrapper execution by run-vitest, run-vitest-profile, and vitest-report-owner tests.

Remove copied prerelease command and concurrency inventories while keeping scheduler completeness, non-cancellation, release-context rejection and blocking-result invariants. CI-only: oxfmt, plain oxlint and diff checks passed; no tests or builds run. Shard LOC 4771 to 4434 this pass, 5665 to 4434 cumulatively (21.7 percent); the requested 40 percent remains unmet.

* test(release): share q0013 transport and native helper proof

Port q0013 commits f2633d4609e0, 818c7c5651bd, and d376c73ca2b4 onto the campaign lane as one commit. Preserve newer release-state coverage, including HTTP/2 recovery, artifact errors, ghost attempts, Windows policy, cancellation, and candidate manifests.

CI-only validation: plain oxlint, oxfmt --check, and git diff --check passed. No tests or coverage run. Independent review finding checked against the helper producer and consumer paths and rejected: both use the fixture work/helper-products file.

* test(scripts): deslop q0023 tests

Consolidate fixtures and remove duplicated gauntlet process lifecycle replays. Keep managed-child-process.output.test.ts, managed-child-process.test.ts, and managed-child-process.drain.test.ts as lifecycle owners; retain gauntlet error mapping and late-signal rethrow proof.

Retain HTTP routing coverage while relying on agent-plugin-bundle-response.test.ts for bundle receipt rejection and bench-gateway-concurrency.test.ts for runtime-carrier boundary variants. Remove repeated same-guard control inputs and copied default inventories.

CI-only campaign: oxfmt, plain oxlint and diff-check pass. No tests or coverage run. 5245 to 4925 lines (6.1% reduction); the 40% target remains unmet because remaining cases protect distinct security, provenance, lifecycle and publication paths.

* test(scripts): remove redundant q0023 tooling layers

Retire repeated lifecycle matrices and complete command inventories. Checkout ownership/reset/retry/cancellation stays in ci-platform-checkout.test.ts; generic fencing, typed recovery and output settlement stays in ci-git-owner.test.ts. QA topology/protocol-base validation stays in ci-workflow-evidence.test.ts.

Keep gauntlet-specific late-signal rethrow and timeout row mapping with minimal native fixtures; shared managed-child-process tests own descendant cleanup. Keep one real QA diagnostic integration and exercise invalid summaries directly through readQaSuiteSummary. Combine dependency/slash lifecycle setup and replace parser inventories with shared-branch representatives.

Bundle protocol stays in agent-plugin-bundle-response.test.ts; retain HTTP routing checks. Replace the self-counting npm fixture with a direct reported-tarball identity assertion; npm-runner.test.ts retains runner selection proof. Remove same-guard input variants while retaining security boundaries.

CI-only: oxfmt, plain oxlint and diff-check pass; no tests/build/coverage run. This commit cuts 4925 to 4176 lines. Cumulative 5245 to 4176 is 20.4%, below the 40% target; remaining independent downloader, mock-server and publication behaviors have no replacement proof.

* test(scripts): consolidate remaining q0023 duplicate proof

Remove the test-local readiness simulation and nested state factory mock. Preserve the SQLite flip live endpoint, configuration failure and verified child cleanup contracts at actual instance acquisition. Keep utility model precedence and shared streaming lifecycle assertions once; malformed MCP output remains covered by the Code Mode fixture completion scenario.

Move QA hot CPU assertions into the existing diagnostic integration; startup CPU remains covered by check-gateway-cpu-scenarios.test.ts. Merge empty-run cleanup into the existing slash-only scenario. Remove redundant process signal call-shape instrumentation while retaining observable death of initially-live resistant descendants.

Shrink copied input and manifest inventories and shared executable fixtures. Preserve independent custom package runner timeout, graceful drain, clamp and external termination cases: these do not use the managed-child runner. Keep downloader security and provenance guards.

CI-only static gates pass: oxfmt, plain oxlint and diff-check. No tests/build/coverage run. Additional 4176 to 3987 lines; cumulative 5245 to 3987 (24.0%). Target remains unmet by 840 lines; no files or production code deleted.

* test(ui): deslop q0021 tests

Remove optional capture scaffolding and duplicate E2E owner replays. Keep browser geometry, keyboard focus, remote approval routing, recovery authority, and real-Gateway interleavings.

Remaining proof: approval-page.test.ts covers malformed projections and reconnect gating; canonical winner E2E covers refreshed Gateway content. markdown-code-blocks.test.ts and markdown-streaming.test.ts cover literal indented rendering/copying, and markdown-element-refs-solid.test.ts covers retained observation teardown. processes-panel-data.test.ts and chat-processes-panel.test.ts cover transient reads, empty results and stop capability changes. Catalog cold-link flow retains sidebar return, split ownership and adoption; one viewer and one over-budget art size cover the duplicate input rows.

CI-only campaign: plain oxlint, oxfmt and diff check pass. No tests or coverage run. LOC 5100 -> 4654 (-8.75%); target 40% not reached without dropping distinct behaviors.

* test(ui): deslop q0021 e2e owner layers

Remove quota switching replay: chat-state.test.ts rebinds selected-global auth and rejects superseded Main; chat-pane-identity.test.ts rebinds retained fixed-route presentation; chat-view.test.ts scopes subscription usage and navigation.

Keep share routes in route-loader-catalog-share.test.ts; catalog views in codex-sessions.e2e.test.ts; process lifecycle in processes-panel-data.test.ts, chat-processes-panel.test.ts and processes-panel.e2e.test.ts; subagent navigation in chat-details-subagents.test.tsx and chat-subagents-panel.test.ts.

Keep streaming fence control identity in chat-message-streaming.browser.test.tsx; rail navigation and viewport membership in chat-position-rail.e2e.test.ts; responsive composer sizing in chat-composer-sizing.test.ts; tooltip pin/dismiss behavior in tooltip.test.ts and tooltip.browser.test.ts.

Keep pending device creation in new-session-page.device-folder.e2e.test.ts, create-params.test.ts and session-placement-startup.test.ts; destination restoration in draft-place-default-repository.test.ts, draft-place-state.test.ts and draft-session-placement.test.ts. Queue mutation conflicts remain in chat-queue-edit-conflict-recovery.e2e.test.ts and chat-queue-reorder.test.ts.

Consolidate fixtures and browser probes while retaining real geometry, codecs, recovery guards and collaborator interleavings. Correct pre-existing nonexistent composer harness imports to the existing exact locator boundary. Approval severity and canonical resolution remain in approval-page.test.ts. Attachment status rendering remains in chat-message-attachments.test.tsx.

CI-only: no tests, coverage or builds run. Plain oxlint, oxfmt and git diff --check pass. Original shard 5100 -> 3104 LOC (39.1%); 44 lines short of 40%, retained rather than deleting distinct browser/lifecycle proof.

* test: retain d453 contracts flagged by CI and review
2026-10-24 07:10:06 +00:00
Peter Steinberger
dc3ce57887
perf(reef): attribute background plugin-state polling (#182247)
* docs(perf): preregister plugin-state polling workload

* perf(reef): skip unchanged pending-review retries

Carry the existing watched review receipt in parked inbox state. A decision mutation, policy or envelope change, or expiry resumes the normal trust and replay path. Avoid repeated replay claims and releases while an owner review is pending.

Release note: reduce background SQL and worker requests for Reef messages waiting on owner review. No schema or public Plugin SDK change.

* fix(perf): satisfy polling workload lint rules

* test(reef): isolate pending-review regression coverage

* test(reef): route receipt regressions through the database broker

* test(reef): avoid shadowing the observed review receipt

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-10-24 00:09:01 -07:00
Peter Steinberger
d2425ddc44
perf(artifacts): avoid copying prepared list summaries (#182205)
* perf(artifacts): avoid copying prepared list summaries

* test(perf): measure artifact reads on team-shaped session state
2026-10-23 23:59:36 -07:00
Peter Steinberger
5e0b786b18
perf(gateway): reuse mention presentations and trim sidebar packing (#182019)
* perf(gateway): reuse mention presentations and trim sidebar packing

Keep current viewer authorization while sharing private mention display snapshots. Preserve mutable list/dismiss responses, private revisions, and page-specific sidebar facts. Avoid singleton fact packing and temporary recipient/map arrays.

* test(gateway): account for singleton sidebar encoding reuse

* docs(perf): clarify mention benchmark allocation scope
2026-10-23 23:54:24 -07:00
RoboClaw
620259db2d
fix: avoid partial history when opening hovered chats (#182317)
* fix: warm the full opening history window on hover

Use one 80-message, 256 KiB request budget for hover snapshots and foreground history so opening a warmed conversation does not begin with a smaller preview. Preserve existing prefetch admission and cache ownership.

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>

* fix: avoid partial history when opening hovered chats

Worked on by:
- @steipete

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
OpenClaw-Publication: 25431562-b46a-4b0d-82c0-16f827e096f6

---------

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
2026-10-24 06:52:50 +00:00
Peter Steinberger
867161c05d
fix(nostr): preserve profile rows across settings refreshes (#182289)
Keep fixed channel facts and profile fields mounted while owner snapshots change. Preserve the existing synchronous request authority and lazy plugin boundary, and compose native status classes with Solid class objects.
2026-10-23 23:52:19 -07:00
Peter Steinberger
738d77b5bb
test(ui): keep board server cleanup helper private (#182313) 2026-10-23 23:51:20 -07:00
Peter Steinberger
3484041380
perf(ui): reduce model picker navigation work (#182249)
* perf(ui): keep model picker derivations local

Preserve per-row search and window metadata, suppress unchanged ranked results, and defer provider cost scans until the usage popover is read. Keep keyboard, shortcut, and grouped ARIA behavior intact.

* perf(ui): measure renderer thread CPU in benchmarks
2026-10-24 06:50:54 +00:00
Peter Steinberger
926ab4ada8
test(gateway): cover reconnect read starts through dispatch (#182312)
Lock in the reconnect-read behavior from #182214 at the dispatch boundary. With fake timers, 16 operator connections each queue a preparation behind four held preparation slots, then issue the Control UI's dashboard reads.

The test asserts:
- board.get, sessions.resolve, sessions.describe, users.list and agents.list start with 0 ms queue wait.
- models.list stays capacity-bound (it is itself a preparation).
- Peak concurrent preparations stay at 4.
- Every connection keeps its mutation starts in order.

It fails on 2924588f^ (all six reads time out at 30,000 ms; 176 start timeouts) and passes on main (0 ms; 80 timeouts, all from the held models.list preparations). Test and fixture only (+210), production LOC 0. 468 ws-connection tests pass; exact-head CI green.
2026-10-23 23:48:06 -07:00
Masato Hoshino
adf4699227
fix(ollama): honor tools.web.search maxResults and timeoutSeconds (#182052)
Ollama web search ignored the configured result count and deadline: an omitted count always sent max_results 5 and every request waited up to 15 seconds. It now falls back to tools.web.search.maxResults and uses tools.web.search.timeoutSeconds, like the other web search providers; an explicit count still wins and unset values keep the 5-result and 15-second defaults.
2026-10-24 14:47:34 +08:00
xpeng5278-web
ec4f098e99
fix: detect vLLM max_model_len context overflow errors (#181521)
Co-authored-by: xpeng5278-web <330743750+xpeng5278-web@users.noreply.github.com>
2026-10-24 14:46:35 +08:00
Peter Steinberger
32ff0aca15
fix(plugins): release retired inspection caches (#182307)
* fix(plugins): release retired inspection caches

* test(plugins): preserve error type in frozen disposal fixture

* fix(plugins): preserve borrowed inspection wrapping until disposal
2026-10-23 23:45:45 -07:00
Sasan
f64e38f352
fix(openai): restore routes from stale catalogs (#181356) 2026-10-24 14:45:12 +08:00
Peter Steinberger
f6ded32298
fix(memory): retain overview controls across status updates (#182290) 2026-10-23 23:44:36 -07:00
Vincent Koc
5ce969c3f1
test(skills): share upload worker observers (#182308) 2026-10-24 14:42:52 +08:00
Vincent Koc
6ba8529d86
fix(agents): retain auxiliary usage after rejected completions (#182298)
* fix(agents): retain auxiliary completion usage per dispatch

Observe isolated completion usage before result acceptance fences, correlate each dispatch with its completion and session, and preserve unavailable usage rather than fabricating zero token counts. Keep primary and plugin-owned accounting separate and omit unavailable OTel token and cost attributes.

Focused regression proof: baseline 21 cases collected with 16 accounting assertion failures; repaired 30 cases passed. Native formatting, privacy and line-cap guards passed. Remaining type, SDK surface and build validation follows the normal remote and PR gates.

* fix(agents): bind isolated observer dispatch result types

Bind both existing harness dispatches to their declared completion result so the generic observer retains the harness contract. Type-only correction; the canonical core typecheck now passes and the prior behavioral proof remains unchanged.

* style(agents): avoid shadowing isolated completion result
2026-10-24 14:39:03 +08:00
Peter Steinberger
723d9c2087
fix(ui): skip precompressed sidecars for small non-startup Control UI assets (#182279)
* fix: trim small Control UI compression sidecars

* test(ui): finish precompression threshold contract cutover

Assert only useful per-encoding sidecars for startup, deferred, CSS, and plugin assets. Count single-encoding compression progress and keep build fixtures independent of local plugin artifacts.
2026-10-23 23:36:36 -07:00
Dallin Romney
17a8d22268
fix(plugin-sdk): emit revision declarations with their own compiler (#181908)
* fix(plugin-sdk): render shipped surfaces with revision tooling

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>

* fix(plugin-sdk): drop stale renderer argument

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>

* fix(release): keep SDK renderer trusted

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>

* fix(release): render SDK revisions with Node under Bun

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>

* fix(plugin-sdk): emit revision declarations with their own compiler

* fix(build): declare the emitter's compiler API edge as a declaration input

---------

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>
2026-10-23 23:36:11 -07:00
RoboClaw
b223934dc3
fix: avoid redundant work in large sidebars
Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
2026-10-24 06:34:13 +00:00
RoboClaw
2eac529f9d
fix: detect Solid API misuse in helpers and plugin views
Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
2026-10-24 06:33:57 +00:00
Josh Lehman
0a9d5cc49d
fix(state): clarify agent schema-gap refusal and preflight skip diagnostics (#182288)
Refs #178346, #178177
2026-10-24 06:26:27 +00:00
Jason (Json)
54ffd25893
fix(agents): keep child completion results verbatim for requesters (#182223)
* fix(agents): keep child completion results verbatim for requesters

* fix(agents): keep OpenClaw delimiters inert in verbatim child results

* fix(agents): match only OpenClaw delimiter syntax in verbatim results
2026-10-23 23:22:05 -07:00
Peter Steinberger
2924588f01
perf(gateway): unblock dashboard reads during reconnect (#182214)
* perf(gateway): unblock dashboard reads during reconnect

Avoid reserving snapshot preparation slots for event-only session subscriptions. Let Board and session resolution use the existing independent-read path while preserving subscription order and live authority. Add a fixed-work restart probe separating request-start waits from chat startup handler phases.

* fix(gateway): keep parked catalog reads from blocking reconnect work

Keep catalog reads within the existing preparation limit without making them a connection ordering barrier. Snapshot and approval subscriptions retain their barriers. Exercise catalog-first bootstrap ordering in the restart workload.

* test(perf): exercise distinct sessions during startup reconnects

* perf(gateway): admit independent dashboard bootstrap reads
2026-10-23 23:18:31 -07:00
Peter Steinberger
a3a5add713
perf(gateway): drop copies of private arrays (#182261)
* perf(gateway): drop copies of private arrays

Keep task ordering, topology snapshots, and live scope checks unchanged while removing redundant temporary collections. Add owner/site allocation proof and behavior coverage.

* test(gateway): record owned-array sort lint exception

* fix(perf): attribute owner allocations through short module URLs

* docs(gateway): keep the task-publication lineage evidence note
2026-10-23 23:15:30 -07:00
Peter Steinberger
c8e07d915c
fix(perf): count Git revision work in checkout benchmarks (#182222)
* perf(sessions): stop scanning whole checkouts to validate diffs

* fix(perf): handle loader whitespace in Git measurements

* fix(perf): retain idle diff reuse after spawn regression

Drop the runtime census deletion: idle Git launches rise from zero to one, while swapped RPC latency is inconclusive. Keep only the benchmark revision-counter correction for publication.
2026-10-23 23:11:41 -07:00
RoboClaw
2875e81303
fix: keep v4 apps connected after widget retirement (#182277)
* fix: keep v4 apps connected after widget retirement

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>

* fix: keep v4 apps connected after widget retirement

Worked on by:
- @steipete

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
OpenClaw-Publication: c546c295-63b0-41e3-9c81-a0f723d6660f

* Publish openclaw/calm-lobster-3

Worked on by:
- @steipete

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
OpenClaw-Publication: fcbbb6bc-7192-4f86-95aa-b9182b69eadf

---------

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
2026-10-23 23:10:41 -07:00
Peter Steinberger
bab7e0a136 fix(ci): keep the GitHub context repo getter in Barnacle auto-response
Preserve the Actions Context prototype when deriving the admitted context.
Object spread dropped its repo getter, crashing PR auto-response during
maintainer membership checks after #177120.

Exercise the existing candidate-label flow with a class-based context so
inherited repo getters stay covered by the regression suite.

Failing runs:
https://github.com/openclaw/openclaw/actions/runs/40059408459
https://github.com/openclaw/openclaw/actions/runs/40061593223
2026-10-23 23:09:14 -07:00
Peter Steinberger
5d47168b91
fix(agents): release requester wake reservations and preparation capacity after restarts (#182285)
* fix(agents): release settled requester wake reservations

Release restored requester-settle reservations after their durable wave
settlement is acknowledged so later yielded cohorts can dispatch in FIFO order.
Capture exact input identities before settlement clears frozen batch membership,
preserve them across publication retries, and leave claimed turns with their owner.

Add a two-restart registry/controller regression and document the ownership
contract. The regression fails on the base and passes twice with the fix;
focused requester-settle, restart recovery, mailbox, and spawn checks pass.

* fix(agents): release recovery capacity on delivery admission

Restored child deliveries could exhaust the shared preparation budget while
waiting behind earlier FIFO sources that needed the same budget to prepare.
This left yielded parents with queued or never-enqueued completion wakes.

Release preparation capacity when the Gateway accepts a delivery, including
execution-start replays, while retaining its result under the existing lifecycle
owner until settlement. Keep the concurrency bound, FIFO, and idempotency intact.

Cover restored cohort and individual completions whose creation order differs
from completion order. Both cases time out on the parent commit and pass twice
with this change. Model acceptance in the test adapter before its mailbox wait.
2026-10-23 23:08:35 -07:00
Vincent Koc
516721c31d
test(plugins): reuse projection registration fixture (#182283) 2026-10-24 14:05:00 +08:00
RoboClaw
e96f6921f3
fix(dev): preserve active replies when stopping the Gateway (#182281)
* fix(dev): honor Gateway drain budgets in source launchers

Use the shared Gateway service stop budget for foreground source runs and allow the outer watcher to finish the same drain during shutdown or replacement. Preserve the short generic-command and build deadlines and existing Mantis lifecycle authorization.

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>

* fix(dev): preserve active replies when stopping the Gateway

Worked on by:
- @steipete

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
OpenClaw-Publication: 971c0fff-ebe1-4ae9-b9a0-519321c380e1

---------

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
2026-10-24 13:59:09 +08:00
RoboClaw
466ccf31bf
fix(qa): preserve JSON5 provider configuration and live credentials (#182280)
* fix(qa): preserve custom provider settings and credentials

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>

* fix(qa): preserve JSON5 provider configuration and live credentials

Worked on by:
- @steipete

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
OpenClaw-Publication: 115c1d9d-e0a5-41ed-a427-674ef575c8b7

---------

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
2026-10-24 13:57:50 +08:00
SunnyShu
d3ec22ae44
fix(channels): sanitize capability probe and diagnostics terminal output (#178234)
Ref: BUG-221-channels-capabilities-probe-terminal-injection (local finding)
2026-10-23 22:57:37 -07:00
Peter Steinberger
b07e14d2d1
fix(test): preserve Control UI test scheduling after Vitest update (#182263)
* fix(test): preserve UI scheduling with current Vitest

* test: align UI ownership guard with explicit worker cap
2026-10-23 22:57:25 -07:00
xpeng5278-web
23db299b15
fix(ollama): normalize tool_name on converted tool results (#181549)
convertToOllamaMessages already canonicalizes assistant tool-call
names; apply the same normalizeOllamaToolCallName pass to tool_name so
provider-prefixed results stay aligned with the call.
2026-10-24 13:54:11 +08:00
RoboClaw
f6f3874cdc
fix: prevent stale ownership errors when resuming subagents (#182275)
* fix: prevent stale ownership errors when resuming subagents

Use recovery/chat admission and live requester authority instead of retaining predecessor registry checks through the continuation. Exercise retained checkpoints, resumed history reads, and single parent completion.

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>

* fix: prevent stale ownership errors when resuming subagents

Worked on by:
- @steipete

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
OpenClaw-Publication: 9ed78742-b9a4-49ad-8c80-8835b92984a3

---------

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
2026-10-24 13:50:10 +08:00
RoboClaw
f36f0cc6fc
fix(claude-cli): finish parent replies after nested background agents (#182267)
* fix(claude-cli): finish parent replies after nested background agents

Keep tasks launched by a native subagent out of parent-input completion accounting. Their notifications are consumed by the launching agent, not the main query.

Cover nested Agents and workflows through the stdio runtime, preserving top-level holds and same-process warm reuse.

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>

* fix(claude-cli): finish parent replies after nested background agents

Worked on by:
- @steipete

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
OpenClaw-Publication: 03795749-42de-4fcd-ada4-4794e31a50d2

---------

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
2026-10-24 13:49:43 +08:00
Jason Cat
17e09c778e
fix: streamed answers with a list after a code block no longer re-project the whole list (#181511)
* fix: streamed answers with a Markdown list no longer re-project the whole list

A streamed reply that reaches a plain-text tool-call activation token (any
brace, so every JSON or code block) and then a Markdown list re-projected the
entire list for every delta: the checkpoint scan marks list lines ambiguous and
falls back to the canonical owner's block start, and a whole list is one block.

A list item with content now closes the ambiguous paragraph before it, so the
checkpoint can settle at the latest item boundary while the list continues.
Paragraphs, fences, reference definitions, images, setext headings, and
ambiguous container content keep the canonical path.

* fix: keep numbered markers that cannot interrupt a paragraph on the canonical path

An independent review found that the first revision treated any numbered
marker after a seen list item as a block boundary. A marker above 1 cannot
interrupt a paragraph even inside a list item, so the checkpoint could settle
inside a paragraph whose open inline code still owned later candidate lines,
and the streamed text dropped a tool-call block that the batch sanitizer keeps
as visible code.

Numbered markers now count only after a completed block, which is the case the
checkpoint can prove without a full parse. Multi-line numbered lists keep the
conservative path; bullets, single-line numbered lists, and nested bullets keep
the settled checkpoint.

* test: cover the list-heading checkpoint boundary reported in review

The reviewed head treated a numbered marker after a heading as a list boundary
even though the marker cannot interrupt the paragraph whose open inline code
owns the next line, so the delivery trace filter dropped a line the canonical
sanitizer keeps. The two-chunk case now pins that behaviour.

* fix: keep numbered markers inside an open item paragraph on the canonical path

A numbered marker cannot interrupt the paragraph of the item that contains it, so
treating the previous marker line as a completed block settled the checkpoint inside
that paragraph. When the paragraph's inline code closed later, the delivery trace
filter removed a literal line the canonical sanitizer keeps.

Markers now count only when they start at 1, follow a completed block, or sit outside
the open item's content column; headings, blockquotes, fences, and thematic breaks
close the tracked item.

* perf: scan list-ending blocks without adding regex work to the stream path

The checkpoint harness counts characters passed to regular expressions, so the
two per-line block tests are char scans like the rest of the checkpoint loop.

* test(agents): bound list checkpoint work through the subscriber handler

* fix(text): avoid rescanning completed streamed list items

Use canonical Markdown item boundaries for streaming settlement instead of
maintaining a second list parser. Refresh checkpoint metadata on complete
lines and retain the owning item for mutable reference definitions.

Keep subscriber work-budget coverage and literal-text correction cases.
Fixes #181493.

Co-authored-by: JasonBuildAI <jasonbuildai@gmail.com>

* fix(tooling): include list retention in PR wrapper inventory

Keep the extracted wrapper import closure complete after the Markdown list
checkpoint rewrite. CI exposed the missing helper in both inventory checks.

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: JasonBuildAI <jasonbuildai@gmail.com>
2026-10-23 22:49:13 -07:00
Peter Steinberger
83c72975d9
fix(ui): keep visited lightbox images loaded when navigating back (#182105)
The lightbox gallery cached a visited neighbor's URL but let the temporary
Image it decoded with become unreachable. After a browser GC the image
resource was dropped, so moving back refetched it (inbound renditions are
served private, no-cache without validators). Tie each decoded Image to its
cached item so it lives until eviction or close.

The e2e test counts rendition requests exactly again instead of hiding
duplicates behind a Set, and forces a GC before navigating back so the
former CI flake is a deterministic regression check.
2026-10-23 22:46:45 -07:00
Peter Steinberger
4e62be1ab7
perf(plugins): skip owned transcript payload isolation scans (#182239) 2026-10-23 22:44:36 -07:00
Peter Steinberger
49a2e7acb4
chore(ui): upgrade Solid to rc.18 (#182251) 2026-10-24 05:44:14 +00:00
openclaw-mantis[bot]
fe729c7c40
chore(ui): refresh control ui locales (#182278)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-24 05:44:09 +00:00
Peter Steinberger
5f51f5574c
perf(infra): share immutable private diagnostic snapshots (#182233)
Clone plain private diagnostic data once per dispatch while preserving opaque-value isolation, private-data interest filtering, and OTel host attribution. Reuse the existing snapshot owner; production LOC stays flat.
2026-10-23 22:42:49 -07:00
potoior
14c3cf659e
fix(voice-call): inherit the configured agent model for consults and responses (#181451)
An unset responseModel resolved from the compiled-in runtime defaults
(openai/gpt-6-astra) instead of the call agent's effective model, so
consults and generated responses failed with an OpenAI auth error on
gateways configured for another provider. Route the unset fallback
through resolveDefaultModelForAgent with the call's agentId; explicit
responseModel overrides keep their existing semantics.
2026-10-23 22:42:10 -07:00
Mitchell Etzel
5482dd8074
fix(codex): continuing a local Codex session fails when supervision is off (#178537)
* fix(codex): continuing a local Codex session fails when supervision is off

- Local Codex catalog rows set canContinue only when plugin config has supervision.enabled true, read with readCodexPluginConfig like the supervised runtime
- continueSession rejects a local continue with supervision off before adoption creates state
- The list reads the flag only when local homes were discovered, so node-only lists gain no config parse
- Chat shows a view-only reason naming plugins.entries.codex.config.supervision.enabled for local archivable Codex rows that cannot continue
- Tests: supervision gate extension test, codex-sessions e2e reasons, node-continue fixture enables supervision for its local actionable case

* fix(ui): link the Codex supervision view-only reason to plugin settings

- The supervision view-only reason in Chat gains an Open settings link to the existing Codex plugin settings route (/settings/plugins/codex?view=settings) via pathForPluginSettings and pluginDetailLocation
- New optional disabledReasonAction composer prop renders the link in the status band; plain clicks navigate in-app, modified clicks keep native link behaviour
- Catalog reason selection moves from chat-pane-render.ts (700-line cap) to catalogComposerReason in chat-pane-session-creation.ts
- Reason copy shortened to fit beside the link; new en string chat.catalog.openCodexSettings
- Supervision gate test pins that only supervision off yields local rows that can archive but not continue, across statuses, sources and a suffixed local home; it and the UI inference reference each other
- codex-sessions e2e clicks Open settings and asserts the route

* test(codex): enable supervision in local catalog adoption fixtures

- Local Codex catalog continuation now requires supervision.enabled, so the naming and catalog performance fixtures that adopt a local session enable it.
- Assertions unchanged.

* docs(codex): note that local Continue needs supervision enabled

* fix(ui): retain Codex supervision copy in the English catalog

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-10-23 22:41:12 -07:00
Sukhdeep
7c374d4539
fix(codex): finalize settled turns whose prompt was never mirrored (#181779)
Recorder-free delivery retries deliberately omit a prompt row. Anchor their settled-turn evidence at the first mirrored row so Codex source-reply finalization retains prior context and completed tool evidence. Keep existing identity, payload, ordering, uniqueness, and tool-boundary verification for all turns.

Related: #181226 (the provenance_rejected path). The report's separate field_limit incident remains tracked by #164191.

Validation: contributor base/head regression, native finalizer, and isolated Gateway/Telegram live proof are recorded in the PR. Exact-head CI run 40059895146 passed 36 jobs. Landed under the authorized inherited-failure exception: the suite-coverage assertion in test/vitest-projects-config.test.ts:288, missing scripts/control-ui-retention/dependency-retention.test.ts, matches scheduled main run 40058965760 exactly; its aggregate CI gate also failed. CI remains red, and security-fast passed independently.

Co-authored-by: Sukhdeep Johar <sukhdeep@gmail.com>
2026-10-23 22:40:17 -07:00