Commit Graph

1365 Commits

Author SHA1 Message Date
Peter Steinberger 17854d4c0b fix(runtime): restore main validation contracts (#121716)
* fix(runtime): repair main validation contracts

* test(runtime): enforce compact lifecycle payloads

* test(memory): preserve missing extra-path contract

* test(ci): drop repairs already on main

* style(test): align current-main fixture

* fix(memory): preserve missing-error type contract

* fix(memory): reject invalid extra-path parents
2026-08-10 19:35:29 -07:00
Peter Steinberger a381aa3e8b fix(memory): restrict multimodal indexing to extra paths (#121627)
* fix(memory): restrict multimodal indexing to extra paths

* fix(state): add lazy secret store schema ensure

* fix(state): bound lazy secret store schema

* chore(plugin-sdk): refresh API baseline
2026-08-10 19:00:45 -07:00
Peter Steinberger 8aa0376f27 refactor(agents): simplify turn latency runtime ownership (#121779)
Amp-Thread-ID: https://ampcode.com/threads/T-019fe95b-d75c-70fc-82b6-4825ca874826

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 18:58:36 -07:00
Peter Steinberger 58a538767c fix(security): centralize provider diagnostic redaction (#121599)
* fix(security): centralize provider diagnostic redaction

* fix(workers): redact finishing diagnostics

* fix(security): fail closed on malformed diagnostics

* fix(security): redact media wrapper diagnostics

* fix(security): normalize diagnostic field redaction

* fix(security): redact diagnostic media URIs

* fix(ai): preserve diagnostic compatibility in error projection

* refactor(ai): simplify diagnostic error handling

* fix(security): redact credential query diagnostics

* fix(security): redact diagnostic media arrays

* fix(security): redact diagnostic credential headers

* test: align shared expectations with current runtime contracts

* test(ui): align managed media and picker expectations

* fix(security): redact plural media diagnostics

* fix(ai): preserve bracketed provider errors

* fix(security): cover generic diagnostic credentials

* fix(security): redact prefixed diagnostic JSON

* fix(security): redact embedded diagnostic JSON

* test(agents): align cache trace media redaction

* fix(security): redact cookie diagnostics

* refactor(ai): isolate diagnostic host policy

* refactor(ai): narrow diagnostic helper exports

* fix(security): bound diagnostic descriptor reads

* fix(security): bound diagnostic graph traversal
2026-08-10 18:53:45 -07:00
Peter Steinberger ba58803997 fix(models): repair local model no-auth and overflow handling (#121790)
Preserve the internal null Authorization marker when resolving local no-auth provider headers, avoid classifying LM Studio prompt-template guidance as context overflow, and rebuild ai/llm-core package sources during pnpm dev/watch.
2026-08-10 18:52:00 -07:00
Peter Steinberger b985d5a1ed feat: stream live subagent progress in task events (#121549)
* feat(tasks): stream live subagent activity

* fix(tasks): correlate edit activity from start events

* fix(gateway): sanitize live task activity

* test(reply): align custody harnesses with lifecycle

* fix(outbound): preserve post-send recovery evidence

* fix(types): align reply harnesses with current contracts

* fix(tasks): preserve activity liveness and SDK parity

* test(sdk): avoid unsafe task summary assertion

* chore(contracts): refresh Plugin SDK API baseline
2026-08-10 18:37:58 -07:00
Peter Steinberger 32894a3ba5 feat: start sessions from registered projects (#121465)
* feat(gateway): add project registry sessions

* fix(gateway): authorize project branch discovery

* test(gateway): reuse worktree test imports

* fix(protocol): register projects schema owner

* fix(gateway): gate project paths by write scope

* feat(control-ui): register projects from folder browser

* refactor(gateway): extract session diff baseline preparation

* fix(gateway): honor admin scope in project listings
2026-08-10 17:56:12 -07:00
Peter Steinberger aa25f88fe3 test(ai): remove schema cache reset seam (#121769) 2026-08-10 17:20:10 -07:00
Peter Steinberger f09a33ce41 Optimize OpenAI turn latency and simplify reuse (#121687)
Amp-Thread-ID: https://ampcode.com/threads/T-019fe95b-d75c-70fc-82b6-4825ca874826

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 16:23:06 -07:00
Hannes Rudolph d6317094a9 fix(memory): prune stale session index rows at startup (#121665)
* fix(memory): prune stale session index rows at startup

* fix(memory): reconcile stale sessions without re-embedding

* oc-9df: fail closed on session corpus scan errors

---------

Co-authored-by: Josh Lehman <550978+jalehman@users.noreply.github.com>
2026-08-10 16:11:35 -07:00
Ayaan Zaidi 9935ca3b30 fix(approvals): bind native requests to channel accounts (#121673)
Native approval delivery and resolution now stay bound to the originating or explicitly targeted channel account. Unbound requests fail closed across multiple eligible accounts; trusted reviewer-less SDK callers remain compatible.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-11 01:42:41 +05:30
Peter Steinberger 810c3510ee fix: reject invalid memory parents and trim test facades (#121696)
* test(scripts): trim dead testing facades

* test(memory): align non-directory path contract

* test(discord): drop stale progress callback ids

* fix: repair current main validation failures

* fix(gateway): remove redundant setup admission generic

* test(gateway): await setup admission settlement
2026-08-10 12:58:30 -07:00
Peter Steinberger 2d06d46c89 fix(ci): restore missing extra-path reads 2026-08-10 09:55:54 -07:00
Peter Steinberger f4bac99a81 feat(secrets): add SQLite-backed secret store (#121559) 2026-08-10 07:08:40 -07:00
Peter Steinberger 3b3c540896 refactor: remove dead branches and test-only helpers (#121345)
* refactor: remove dead branches and test-only helpers

* fix: preserve codex cleanup error causes

* fix: preserve gateway error code compatibility

* chore: update plugin sdk api baseline

* docs: fix live cache runner path
2026-08-10 06:47:43 -07:00
Peter Steinberger 8e1c238c1c fix(cron): prevent invalid timestamps from stranding jobs (#121394)
* fix(cron): harden scheduling timestamp boundaries

Amp-Thread-ID: https://ampcode.com/threads/T-019fe949-92e4-76bd-8cfa-aea44fcfaebe

* test(prompts): refresh cron tool snapshots

Amp-Thread-ID: https://ampcode.com/threads/T-019fe949-92e4-76bd-8cfa-aea44fcfaebe

* test(cron): keep config revision fixture Date-valid

Amp-Thread-ID: https://ampcode.com/threads/T-019fe949-92e4-76bd-8cfa-aea44fcfaebe

* refactor(cron): consolidate scheduling lifecycle

Amp-Thread-ID: https://ampcode.com/threads/T-019fe949-92e4-76bd-8cfa-aea44fcfaebe

* refactor(cron): keep task history dependencies acyclic

Amp-Thread-ID: https://ampcode.com/threads/T-019fe949-92e4-76bd-8cfa-aea44fcfaebe

* fix(cron): canonicalize timestamp auto-disable

Amp-Thread-ID: https://ampcode.com/threads/T-019fe949-92e4-76bd-8cfa-aea44fcfaebe

* test(cron): verify startup overflow notifications

Amp-Thread-ID: https://ampcode.com/threads/T-019fe949-92e4-76bd-8cfa-aea44fcfaebe

* chore(ci): repair main baseline gates

Amp-Thread-ID: https://ampcode.com/threads/T-019fe949-92e4-76bd-8cfa-aea44fcfaebe

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 03:20:23 -07:00
jesse-merhi 2300de7162 Gateway: negotiate Custodian wizard cancellation 2026-08-10 20:01:24 +10:00
Jesse Merhi d31c20c416 docs: preserve protocol changelog spacing 2026-08-10 20:01:24 +10:00
Jesse Merhi e863839577 docs: remove release-owned cancel notes 2026-08-10 20:01:24 +10:00
Jesse Merhi d9d0b30ce3 System agent: keep wizard cancel local 2026-08-10 20:01:24 +10:00
Jesse Merhi 890a4b0089 Control UI: add direct Custodian wizard cancel 2026-08-10 20:01:24 +10:00
Peter Steinberger bab4546b41 refactor(gateway): remove dead rpc surfaces (#121387) 2026-08-10 02:41:57 -07:00
Peter Steinberger 3a1f645228 fix(ui): prevent duplicate initial prompts during session startup (#121498)
* fix(ui): unify initial prompt handoff projection

Route create-time prompts through the canonical session projection so live persistence and delayed history adopt one stable bubble. Preserve inline attachment content across reconnects and authoritative identity handoff while removing duplicate matching and post-reducer mutation paths.

* fix(ui): preserve initial prompt projection contracts

* fix(ci): restore exact-head validation
2026-08-10 02:38:33 -07:00
Ayaan Zaidi 4b0151682e refactor(commitments): remove inferred follow-up subsystem
Remove hidden follow-up extraction, heartbeat delivery, CLI, docs, and supporting tests/tooling. Existing commitment records remain inert pending separately approved cleanup.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-10 13:48:32 +05:30
Peter Steinberger 5b478bb64f fix(windows): shorten home paths case-insensitively (#121455) 2026-08-10 00:59:32 -07:00
Peter Steinberger f6298bf84d fix(workers): preserve disappeared-worker failures across restarts (#121122)
* fix(workers): persist placement terminal failures

* fix(workers): refresh placement protocol clients

* refactor(workers): isolate error formatting

* fix: integrate cloud terminal state with current main

* chore(plugin-sdk): refresh API baseline

* refactor(ui): inline one-use cloud terminal-reason banner helper

Keeps the Control UI startup JS bundle inside its 317 KiB gzip budget
(the helper + type-only import tipped it by 16 bytes).

* refactor(ui): trim terminal-reason lookup to type-erased optional access

Recovers the last gzip byte of the Control UI startup budget
(324609 B vs the 324608 B limit).
2026-08-10 00:36:52 -07:00
Peter Steinberger 3621c4b511 feat: browse and start sessions inside agent workspaces (#121417)
* feat(gateway): allow workspace-contained browsing

* fix(ui): preserve canonical workspace selections
2026-08-09 23:57:46 -07:00
Peter Steinberger eb9cac065f fix(security): unify secret-redaction and SSRF policy ownership (#121335)
* fix(security): unify secret-redaction and SSRF policy ownership

Memory-host errors now redact through the canonical redactor (payment/card/CVV
coverage included) via the existing core facade instead of a stale local
pattern table; ACP error redaction is wired through a single barrel so the
injected canonical redactor no longer depends on module load order, and the
acp-core fallback table shrinks to the minimal standalone set (structured
auth-header patterns proven load-bearing stay). The memory-host SsrFPolicy
structural copy is deleted in favor of the canonical src/infra/net/ssrf.ts
type re-exported through the network facade.

* fix(build): keep memory-core doctor closure execa-free

Import the canonical redactor directly from src/logging/redact.js instead of
the openclaw-runtime-io facade (which reaches execa through the full runtime
graph), and regenerate the plugin SDK API baseline for the intentional
canonical-SsrFPolicy surface change.

* fix(security): merge operator redact patterns with defaults in injected redactors

ClawSweeper found that ACP injected the general redactor, where nonempty logging.redactPatterns replace the built-in provider-token patterns. Use the tool-payload redactor for ACP and memory-host error formatting so operator patterns extend defaults and redaction remains forced for these security boundaries.
2026-08-09 22:40:58 -07:00
Peter Steinberger 44ffb65bee fix(plugin-sdk): back every workspace facade export with a real src facade (#121404)
* fix(plugin-sdk): back every workspace facade export with a real src facade

packages/plugin-sdk declared 59 export subpaths but only 24 had src facade
files; the other 35 defaults pointed at nonexistent ./src/<name>.ts targets
that typecheck (types resolve via boundary dist) but fail runtime resolution.
Create the 35 missing facades (each mirrors the sibling 3-line re-export of
the core src/plugin-sdk entrypoint; all verified live, none retired), and
extend scripts/sync-plugin-sdk-exports.mts to own the facade package too:
exports are regenerated from the src directory, every facade must name a
canonical SDK entrypoint, and --check fails on dangling keys or orphan
facades. The check-changed Plugin SDK surface lane now also triggers on
packages/plugin-sdk/** so the guard actually runs when the map changes.

* fix(plugin-sdk): validate facades before any exports write

ClawSweeper P2: write mode reported a stale facade but still exited 0,
after syncRootPackageExports had already rewritten the root manifest.
Hoist facade validation ahead of all writes and exit nonzero in both
modes; an invalid facade now fails closed with no partial manifest
update (proven: hash-identical manifests plus exit 1 in write mode).
2026-08-09 22:20:28 -07:00
Patrick Erichsen d4c3b9e783 refactor(sessions): remove custom icon feature (#121263)
* refactor(sessions): remove custom icon feature

* test(sessions): expect legacy icons to be stripped

* fix(gateway): preserve retired icon request compatibility

* chore(plugin-sdk): refresh API baseline

* fix(plugins): reserve retired session icon slot
2026-08-10 04:51:56 +00:00
Peter Steinberger 1367e9a79f refactor(packages): collapse duplicate type surfaces (#121340)
* refactor(packages): collapse duplicate type surfaces

* chore(generated): refresh package contract artifacts
2026-08-09 20:45:15 -07:00
Peter Steinberger 5d191c3984 fix(agents): exclude private shell output from context compaction (#121147)
* fix(agents): exclude private shell output from context compaction

## What Problem This Solves
Shell executions explicitly excluded from model context could still contribute their private output to session replay, token estimates, compaction boundaries, or branch summaries.

## Why This Change Was Made
The session projection owner now omits context-excluded shell messages, while compaction assigns those messages zero tokens and prevents private persisted entries from becoming retained-history cut boundaries.

## User Impact
Private shell output remains durably recorded for its intended owner without leaking into model-visible conversation context or wasting compaction budget; legitimate retained context remains intact.

## Context
Actual production code executed in an isolated VM reduced more than 20,000 characters of private output to zero model-visible characters while preserving eligible context. New owner and sibling regressions cover replay, compaction, branch summaries, and token accounting. Existing oxfmt formatting and scoped whitespace checks passed.

* test(agents): cover private Codex history projection
2026-08-09 19:50:50 -07:00
Peter Steinberger 587eaf42a1 fix(agents): pair reset tool results within retained session history (#121146)
* fix(agents): pair reset tool results within retained session history

## What Problem This Solves
Session resets selected tool-call pairs from history preceding the retained-session boundary, allowing an excluded call to incorrectly claim a retained tool result and leaving replayed conversation history inconsistent.

## Why This Change Was Made
The session-context owner now identifies the retained range before pairing reset tool calls and results. Both reset and compaction flows reuse the same canonical bounded history slice, removing duplicate scan and membership logic.

## User Impact
Reset agent sessions retain only legitimate in-window tool exchanges, repeated resets remain consistent, and cloud-worker replay receives coherent session context without resurrecting discarded calls.

## Context
Actual production-source execution reproduced the previous failure and passed after the fix across valid in-window pairs, repeated resets, and cloud-worker boundaries. Focused session-context and worker-launcher regressions cover the owner and downstream consumer. Existing oxfmt formatting and scoped whitespace checks passed; production code decreases by five lines.

* test(gateway): cover reused reset tool call ids
2026-08-09 19:14:55 -07:00
Peter Steinberger 3d5f916523 fix(protocol): align fallback reason schemas (#121334)
Worker live events rejected tls_certificate fallback payloads because duplicated closed reason lists had drifted. Establish one canonical dependency-light fallback vocabulary and share its explicit TypeBox schema across worker and cron protocol boundaries.
2026-08-09 19:02:23 -07:00
Peter Steinberger 9066ba948a fix(gateway): accept tls_certificate in worker-live fallback reason schema (#121285)
* fix(gateway): accept tls_certificate in worker-live fallback reason schema

* chore(gateway): refresh plugin SDK API baseline

* test(gateway): move worker-live failover conformance guard
2026-08-09 18:21:29 -07:00
Peter Steinberger bd6c6aaef2 refactor(ws): consolidate raw WebSocket payload decoding (#121268)
* refactor(ws): consolidate raw data conversion

* fix(scripts): keep gateway client source-loadable

* refactor(ws): share plugin frame decoding
2026-08-09 16:32:18 -07:00
Peter Steinberger 096b2764e0 refactor(tests): simplify internal test-only seams (#121243)
* refactor(tests): simplify internal test-only seams

* chore(plugin-sdk): refresh API baseline
2026-08-09 15:14:55 -07:00
Peter Steinberger 0ef798d28d fix(gateway): keep hello authorization aligned with RPC access (#120888)
* fix(gateway): separate socket and device token scopes

* chore(i18n): refresh native source baseline

* style(ios): keep gateway channel within lint limit

* refactor(gateway): simplify scope metadata decoding

* ci(ui): isolate real-gateway e2e suites

* docs(ci): align runner table formatting

* chore(plugin-sdk): refresh api baseline

* ci(ui): route real-gateway retries to hosted runners

* chore(plugin-sdk): repair generated api baseline

* test(ui): select Labs toggles by title

* fix(gateway): preserve stored scopes without wire metadata
2026-08-09 14:50:07 -07:00
Peter Steinberger 8dbd30ba74 feat(memory): per-entry glob patterns for extraPaths (#121209)
* feat(memory): support globbed extra paths

Allow root-relative glob patterns on existing memory.search.extraPaths entries across discovery, watching, reindex identity, and QMD migration.

* fix(memory): drop stale lease type import

* fix(memory): enforce extra path glob scope
2026-08-09 13:05:24 -07:00
Peter Steinberger d3c84674e8 feat(gateway): task-suggestion acceptance modes with compact split-button card (#121173)
* feat(gateway): task-suggestion acceptance modes with compact split-button card

- taskSuggestions.accept gains additive mode (worktree default | local | cloud | session) + cloudProfileId; operator.admin unchanged; worktree requests stay {taskId}-only for older gateways
- local reuses the plain-cwd create; cloud mirrors the Control UI create-empty -> sessions.dispatch -> send sequence with pre-claim profile validation and full rollback; session delivers the prompt into the source session (steer single active run, plain turn when idle, ambiguous refused) and can only cancel the chip on failure, never touch the source session
- Control UI card redesigned per owner reference: repo-basename eyebrow, clamped summary, instructions expander, split button with per-profile cloud items or a disabled "No cloud environment configured" hint
- TUI gains the same modes as selector rows with capability gating and double-Enter arming

Release-note context: operators now choose where an accepted follow-up runs — isolated worktree (default), the project checkout, a configured cloud worker, or as the next instruction in the current session — from a compact suggestion card.

* fix(gateway): negotiate task-suggestion acceptance modes and enforce steerable-run invariant

- Gate non-worktree task-suggestion actions on the negotiated Gateway capability.
- Require exactly one steerable run ID before delivering into an active source session.
2026-08-09 12:21:21 -07:00
Peter Steinberger 26e74d8d18 feat(memory): expand conversational recall queries (#121196)
Supplement thin strict FTS candidate pools with bounded keyword probes while keeping embedding calls unchanged.
2026-08-09 11:55:57 -07:00
Peter Steinberger 1f4740e95f fix(opencode): migrate retired free model refs (#121125)
* fix(opencode): migrate retired free model refs

Repair the shipped beta upgrade path through the provider-owned Doctor contract. Activate the migration from the canonical configured-model selector inventory so every supported selector is covered consistently.

Co-authored-by: samson1357924 <samson1357924@gmail.com>

* fix(opencode): migrate media model preferences

---------

Co-authored-by: samson1357924 <samson1357924@gmail.com>
2026-08-09 11:16:59 -07:00
Peter Steinberger 92e522cade fix(openai): bound streamed tool arguments (#117055) 2026-08-09 10:02:23 -07:00
Peter Steinberger 4af090365c fix(openai): preserve failed Responses terminal usage (#115175)
* fix(openai): preserve failed Responses usage

* test(ci): include failed SSE prefix sibling
2026-08-09 09:59:21 -07:00
Peter Steinberger 8fdf7570a1 feat(gateway): live Desktop observer for cloud workers (Labs) (#120727)
* feat(gateway): live desktop observer for cloud workers

Adds live observation for cloud worker desktops through the gateway and Crabbox plugin, including desktop provisioning, persisted desktop metadata, tunneled WebSocket proxying, and the worker.desktop.observe protocol method.

The gateway, Crabbox plugin, and gateway protocol surfaces remain off by default behind the cloudWorkers.desktop Labs flag.

* feat(ui): Desktop panel for cloud worker observation

* docs(gateway): document cloud worker desktop lab

* fix(ci): regenerate contract baselines after rebase

* fix(protocol): regenerate Android gateway methods

* fix(ci): align rebased SDK and lint baselines

* fix(gateway): enforce view-only RFB boundary and fence desktop teardown

* fix(gateway): tighten RFB filter surface

* fix(state): keep pre-desktop databases readable and harden view-only RFB

* fix(gateway): fence desktop observer upgrades behind work admission

* fix(gateway): bind desktop observer tokens to their owner epoch

* fix(ci): regenerate config and SDK baselines after rebase

* fix(ci): regenerate native protocol and SDK baselines

* fix(ci): regenerate contracts after main rebase

* fix(state): register desktop metadata as lazy additive

* fix(ci): regenerate SDK baseline after final direct-merge rebase
2026-08-09 09:37:01 -07:00
Peter Steinberger 9bbbeb0489 fix(openai): preserve Chat response hook lifecycle (#117056) 2026-08-09 09:18:16 -07:00
Peter Steinberger 0303af17f3 test: remove low-value implementation assertions (#121085)
* test: remove low-value implementation assertions

* test: refresh native i18n inventory
2026-08-09 08:48:48 -07:00
Peter Steinberger 9a96375e60 feat(gateway): session-catalog terminal start plans behind cliAgents gate (#121020)
* feat(gateway): add session-catalog terminal start plans

* refactor(gateway): split catalog terminal start handler

* fix(gateway): enforce catalog terminal start eligibility

* test(gateway): split session catalog snapshot coverage
2026-08-09 08:13:39 -07:00
Peter Steinberger c70aee247e refactor(scripts): migrate JavaScript tools to TypeScript (#121005)
* refactor(scripts): migrate JavaScript tools to TypeScript

* fix(ci): keep changed-scope preflight zero-install

* fix(ci): preserve zero-install script owners

* fix(ci): complete script migration follow-through

* fix(release): keep stable closeout zero-install

* fix(scripts): preserve standalone execution boundaries

* fix(scripts): repair standalone loader boundaries

* fix(scripts): normalize gateway observation ids

* fix(scripts): keep Docker packager standalone

* test(scripts): preserve rebase cleanup helpers

* test(sessions): use tracked temp directory
2026-08-09 07:21:35 -07:00
Peter Steinberger 8616c0c374 refactor: finish shared test helper migrations (#120996)
* test: finish shared helper migrations

* test: fix helper migration CI

* style: fix test import ordering

* test(acpx): restore deferred void types

* test: fix helper migrations after rebase
2026-08-09 06:00:06 -07:00