Commit Graph

11080 Commits

Author SHA1 Message Date
Peter Steinberger af99d1ac7b test(computer-use): security closure across the v2 action surface (#124112) 2026-08-15 01:54:06 -07:00
Peter Steinberger d2be00e171 feat(ui): persistent emoji session icons in the sidebar (#124034)
* feat(gateway): persist emoji session icons

* feat(ui): add persistent session icon menu

* docs: explain persistent session icons

* docs: list Set icon in the session context menu enumeration

* test(gateway): canonicalize group defaults workspace path

* fix(ci): sync session icon protocol coverage

* fix(sessions): enforce RGI emoji sequences for session icons

ClawSweeper P2: single non-emoji graphemes like 漢 passed the segmenter-based predicate. Anchored \p{RGI_Emoji} admits exactly one interchange emoji sequence and deletes the length cap and ASCII carve-out.

* fix(sessions): compile RGI emoji validation
2026-08-15 00:15:55 -07:00
Peter Steinberger 079bb34196 feat(cua-computer): recording family with host-owned resource handles (#124035)
* feat(cua-computer): add recording resource handles

* test(agents): split computer tool coverage
2026-08-15 00:14:13 -07:00
Peter Steinberger 6d9ea63a87 docs: correct computer use inventory counts (#124074) 2026-08-15 00:13:16 -07:00
Peter Steinberger a8f1a0d345 test(computer-use): live end-to-end gate for both macOS providers (#123991)
* fix(computer-use): preserve semantic click observations

* fix(cua-computer): isolate desktop and window sessions

* fix(cua-computer): route cursor reads through desktop scope

* test(computer-use): add isolated macOS live proof rig

* style(cua-computer): format driver sessions

* fix(cua-computer): forward lazy desktop tools

* fix(computer-use): narrow live proof artifact path

* test(computer-use): split schema contract coverage

* refactor(cua-computer): unify session start state

* build(computer-use): register live proof entrypoint

* style(computer-use): satisfy full lint contract

* fix(computer-use): harden live proof authority

* fix(cua-computer): keep window authority immutable

* fix(computer-use): close partial sessions safely
2026-08-14 23:37:53 -07:00
Jesse Merhi edb5adfbf5 Start new sessions with folder group defaults (#123276)
* feat(ui): add folder group session defaults

* fix(ci): align folder group contracts

* fix(protocol): refresh Android gateway methods

* fix(ui): reuse folder picker for group defaults

* fix(ui): harden session group defaults

* test(ui): align group defaults with current main

* test(ui): keep group catalog defaults path-free

* fix(ui): close folder group CI gaps

* fix(ui): satisfy folder group CI contracts

* fix(session-groups): enforce defaults safety

* test(gateway): keep group defaults in workspace

* fix(session-groups): enforce defaults participation

* fix(session-groups): close review authorization races

* fix(session-groups): canonicalize defaults authorization

---------

Co-authored-by: Jesse Merhi <jesse-merhi@users.noreply.github.com>
Co-authored-by: Jesse Merhi <openclaw@users.noreply.github.com>
2026-08-15 15:24:13 +10:00
Peter Steinberger 19ae7f2110 perf(ci): keep hybrid Windows on one Blacksmith lane to dodge the 2-runner queue
Measured on run 31865243804: the 3-part split on
blacksmith-8vcpu-windows-2025 got exactly 2 runners; part 2 queued 211s
and only started when part 1 finished, pushing the wall to 6:45 despite
133-163s job bodies (vs 342s hosted). The runner class admits ~2
concurrent jobs, so any profile that can land on Blacksmith now uses the
single lane; the 3-part split stays for guaranteed-hosted executions
(github mode and dispatches, whose runner expression forces hosted in
every mode). A hybrid retry reruns the single lane hosted - slower but
bounded, and Windows-scoped retries are rare.
2026-08-14 22:00:25 -07:00
Peter Steinberger 124847928d fix(cli): name the agent escapes each command supports (#124018)
* fix(cli): name supported agent selection escapes

* refactor(cli): keep selection context compact

* fix(cli): preserve caught selection errors
2026-08-14 21:58:11 -07:00
Peter Steinberger 6e5bf3ec55 fix(doctor): stop false failures on multi-agent profiles (#124010)
* fix(doctor): resolve multi-agent health owners

* fix(doctor): keep bare json exit advisory
2026-08-14 21:45:55 -07:00
Peter Steinberger ed5e489633 perf(ci): widen ui-e2e to 12 shards, ride Blacksmith Windows on hybrid, overlap built-runtime verifiers
Three measured cuts toward the sub-4-minute wall:

- checks-ui-e2e hosted-planner matrix 10 -> 12 rows (11 Vitest shards +
  browser-extension). Shard 1 measured 230s with ~123s test body; Vitest
  hash sharding leaves count as the only balance lever.
- checks-windows hybrid attempt 1 now rides blacksmith-8vcpu-windows-2025
  (retries stay hosted windows-2025). The 3-part hosted split measured a
  342s pole on full-graph runs.
- build-artifacts folds the Doctor plugin-index proof (12s), singleton
  smoke, and startup-memory check (7s) into one step that overlaps them
  on Blacksmith and stays serial on hosted 4-core so the RSS measurement
  is unperturbed; any missing startup asset rebuild completes before the
  fork so no verifier reads dist mid-write.
2026-08-14 21:12:05 -07:00
Peter Steinberger a32a7ae9af feat(cua-computer): verify the managed driver artifact on Windows and Linux node hosts (#123986) 2026-08-14 21:08:13 -07:00
Peter Steinberger aa7a2fbe0d feat(cua-computer): browser action family over v2 (#123960)
* feat(cua-computer): add browser action family

* refactor(cua-computer): split browser action files

* refactor(cua-computer): move the shared act-params type to the leaf module

* fix(cua-computer): carry the contract params import with the moved type
2026-08-14 20:59:46 -07:00
Gio Della-Libera 103e1a4cc9 fix(claws): recover lifecycle state safely (#123254)
* fix(claws): preserve runtime lifecycle state

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 34377cd6-beac-4e49-8ab0-22cfaf8b54a5

* fix(claws): harden lifecycle reconciliation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 34377cd6-beac-4e49-8ab0-22cfaf8b54a5

* fix(mcp): serialize ownership mutations

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 34377cd6-beac-4e49-8ab0-22cfaf8b54a5

* test(mcp): prove lifecycle lease ordering

* fix(claws): page cron recovery inventory

* fix(claws): fail closed on missing cron ownership

* refactor(claws): keep pending cron recovery unchanged

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Gio Della-Libera <235387111+giodl73-repo@users.noreply.github.com>
Copilot-Session: 34377cd6-beac-4e49-8ab0-22cfaf8b54a5
2026-08-14 20:52:45 -07:00
Peter Steinberger 53074ae91a feat(workers): install Gateway bundles on nodes (#123985)
* feat(workers): install Gateway bundles on nodes

Add a private paired-channel install command backed by a one-use Gateway HTTP capability, bounded archive validation, script-disabled dependency materialization, and atomic gateway-namespaced publication. Existing device provisioning remains on the local-build path until the next cutover slice.

* docs(runners): record node bundle installer
2026-08-14 20:52:39 -07:00
Jesse Merhi 47442197a1 feat(ui): review install policy warnings (#120900)
* feat(ui): review install policy warnings

* fix(ui): keep install feedback on runtime plugin
2026-08-15 13:07:02 +10:00
Peter Steinberger d8cd661517 fix(gateway): keep supervised restarts from migrating live state (#123920)
* fix(gateway): fence supervised restart schema ownership

* fix(gateway): target supervised safe restarts

* chore: leave changelog to release automation

* fix(gateway): satisfy restart control checks
2026-08-14 19:31:15 -07:00
Peter Steinberger 00164c7bdc perf(ci): cut the QA smoke double build and three audited wall lanes
Sub-agent caching audit tranche, all measured on runs 31856622489 and
31857193681:

- QA Smoke parts rebuilt the runtime twice and packed a docker tgz that no
  scenario in the smoke coverage set consumes (verified against the resolved
  plan: zero docker-lane, zero Control UI scenarios). One private overlay
  build replaces the public-build/ui:build/pack/private-rebuild chain
  (~35-50s per part); the run step fails closed if a docker-lane scenario
  ever returns, and the guard now pins never-pack-after-private-build.
- report-plugin-sdk-api-diff is pure reporting (nothing passes
  --require-acknowledgement); it now runs on manual/release dispatches only.
- check-npm-lock resolved ~94 npm graphs against the registry on every push;
  push/PR runs now use the reviewed --changed scoping (2.4s on dep-free
  diffs) with a fail-open full sweep on base-fetch failure, and dispatches
  keep --all for registry-drift coverage.
- Six restore-test-caches gates said 'github' only while the writer already
  runs in hybrid; hybrid attempt-1 lanes now restore the transform seed.
- QA smoke lane reads the protected build compile cache; test-type stripes
  widen to five.
2026-08-14 19:19:13 -07:00
Jason (Json) 318d82e91a fix: visible sessions explain working-directory denials (#123829)
* fix(sessions): explain visible cwd denials

* fix: classify visible cwd denials structurally
2026-08-14 20:12:41 -06:00
Peter Steinberger d7d059c7e6 perf(test): move direct import smoke to test fixtures (#123923) 2026-08-14 19:07:48 -07:00
Peter Steinberger 399f5a32e5 fix(workers): bound Gateway bundle cache growth (#123901)
* fix(workers): bound gateway bundle cache

* docs(plan): record Gateway bundle cache cleanup

* fix(workers): exclude terminal bundle diagnostics
2026-08-14 18:27:08 -07:00
Peter Steinberger 76e4ef68ce perf(ci): squeeze the last hybrid stragglers under the five-minute wall
Green tip run 31855637027 measured the remaining poles: ui-e2e shards up to
282s (imbalanced eight-way split), report-plugin-sdk-api-diff 246s on 4 vCPU,
and 220s test-type stripes (tsgo saturates a machine per graph, so stripe
count is the lever, not cores). Widen hosted-profile ui-e2e to ten rows,
test-type stripes to four, and lift the SDK diff to the 8 vCPU class.
2026-08-14 18:20:28 -07:00
Peter Steinberger 27bf9c2a74 docs: fix stale cua-computer section link on the Codex Computer Use page (#123892)
The Windows/Linux cross-reference still pointed at the pre-rename anchor
("experimental, via CUA Driver SDK"); the heading became "experimental,
direct SDK" in 19ace6830b, so the link landed at the top of the node
computer-use page instead of the fulfiller section.
2026-08-14 17:33:23 -07:00
Peter Steinberger 156af00a78 fix(memory): report truthful index outcomes (#123863) 2026-08-14 17:17:16 -07:00
Dallin Romney a01d40bfb9 fix(sessions): honor total entry cap with protected history (#123081)
* fix(sessions): count protected rows toward entry cap

* perf(sessions): defer maintenance snapshot loading

* test(sessions): assert total maintenance cap

* fix(sessions): align warning preservation

* fix(sessions): guard malformed maintenance rows
2026-08-15 08:03:57 +08:00
Peter Steinberger d913796112 fix(runners): preserve node workspaces across restarts (#123889)
* fix(runners): retain node workspaces from gateway state

* docs(plan): record authoritative node retention
2026-08-14 16:59:19 -07:00
Peter Steinberger 9adfe07d9b perf(ci): ride hybrid Blacksmith attempt-1 for the measured hosted poles
First hybrid main cycles (runs 31850815388-31851455918) landed at 5:47-6:32
walls with every remaining pole a hosted lane: the three test-type stripes
(232-269s), check-additional-runtime-topology (274s), check-dependencies
(260s), and report-plugin-sdk-api-diff (209s). Route them to their Blacksmith
labels on hybrid attempt 1 (retries stay hosted) and lift runtime topology to
the 8 vCPU class.
2026-08-14 16:56:52 -07:00
Peter Steinberger 0a6b95a3df feat: cloud workers for the codex runtime (remote-exec placements) (#123743)
* feat(gateway): add remote-exec cloud placements

* feat(codex): run cloud turns through remote exec

* fix(sandbox): quote ssh_config path directives containing whitespace

Crabbox lease keys default to ~/Library/Application Support/... on macOS;
unquoted IdentityFile/UserKnownHostsFile/CertificateFile arguments tokenize
on the space and fail as 'extra arguments'. Found via live remote-exec
cloud-worker proof.

* test: consolidate gateway maintenance schedule coverage

* fix(ci): invalidate plugin sdk declarations on state changes
2026-08-14 16:46:56 -07:00
Peter Steinberger 72e67904be fix(cli): infer provider lists respect selected agent (#123884)
* fix(cli): require inference provider owners

* test(cli): type provider owner fixtures

* chore: leave infer release note to release
2026-08-14 16:45:37 -07:00
Colin Johnson 722e1ff48e fix(sessions): honor explicit legacy owner (#123887) 2026-08-14 19:44:34 -04:00
Peter Steinberger bd1814bede fix(policy): require --agent for explicit workspaces (#123880)
* fix(policy): require explicit CLI agent owner

* chore(policy): leave release notes to release flow
2026-08-14 16:15:17 -07:00
Patrick Erichsen f726393812 fix(ui): offer permanent lobster dismissal (#123789)
* fix(ui): add persistent lobster dismissal

* fix(ui): keep the lobster dismiss menu from scrolling its own items

The dismiss menu anchors a synthetic trigger at the raw pointer position,
and the pet always sits on the sidebar footer ledge at the bottom of the
viewport. Web Awesome caps its popup to `--auto-size-available-height`,
and its `size` middleware runs after `flip`, so the menu was shrunk in
place to 60px against 64px of content instead of moving up. The two
dismissal items then scrolled inside a 6px overflow, which shows as a
scrollbar for anyone running the system setting that always renders them.

Clamp the anchor to the viewport the way every other pointer-anchored
menu already does (session-menu.ts:264, catalog-session-menu.ts:55,
native-link-menu.ts, sidebar-menus-controller.ts:270), so the popup keeps
the room it needs and renders both items in full.

* docs(web): describe the lobster dismiss menu options

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: vyctorbrzezowski <krzyszchweski@gmail.com>
2026-08-14 20:00:50 -03:00
Sarah Fortune f2e5d2054d feat(slack): include observed away duration in presence events (#123805)
* feat(slack): include observed away duration in presence events

* style(slack): format presence observation type

* test(slack): type presence enqueue mock

* fix(slack): preserve presence event prompting

---------

Co-authored-by: Sarah Fortune <sarah.fortune@gmail.com>
2026-08-14 22:46:00 +00:00
Peter Steinberger 1c055ba5e5 fix(cli): preserve explicit read-only agent targets (#123868)
* fix(cli): preserve explicit read-only agent targets

* chore: leave release changelog to release flow
2026-08-14 15:39:24 -07:00
Pavan Kumar Gondhi d5e89de906 fix(synology-chat): deliver attachments without forwarding source URLs [AI] (#119941)
* fix(synology-chat): host outbound attachments

* fix(synology-chat): isolate hosted media routes

* fix(synology-chat): harden hosted media limits

* fix(synology-chat): inspect hosted media content

* fix(synology-chat): reject ambiguous media routes

* fix(synology-chat): retain indeterminate media capabilities

* fix(synology-chat): mask public callback URLs

* fix(synology-chat): align callback sensitivity metadata

* fix(synology-chat): reserve media capability query keys

* fix(synology-chat): release rejected staged media

* fix(synology-chat): preserve ambiguous media handoffs

* fix(synology-chat): scan complete active media preamble

* fix(synology-chat): report validated attachment readiness

* fix(synology-chat): bound public media capability probes

* fix(synology-chat): bound hosted media responses

* test(synology-chat): model response headers read-only

* fix(synology-chat): bound hosted media reads

* fix(synology-chat): bound hosted media delivery

* fix(synology-chat): retain media through active serves

* fix(plugin-sdk): lease hosted media readers atomically

* fix(synology-chat): close hosted media review gaps

* test(synology-chat): clean up hosted media state

* fix(system-agent): canonicalize sensitive config paths

* fix(system-agent): honor runtime config sensitivity hints

* fix(config): inherit sensitive metadata

* fix(synology-chat): close latest review findings

* test(system-agent): keep config recovery checks lint-clean

* fix(system-agent): redact structured config secrets

* fix(synology-chat): harden active-content sniffing

* fix(security): close hosted media review gaps

* fix(security): close remaining hosted media review findings

* fix(system-agent): narrow dynamic owner ids safely

* fix(system-agent): narrow dynamic channel ids safely

* test(channels): isolate hosted media proofs

* fix(security): close config and hosted media review gaps

* test(plugin-sdk): split outbound media retention coverage

* test(plugin-sdk): isolate capacity store fixtures

* test(system-agent): assert config secrecy invariant
2026-08-14 17:05:20 -05:00
Peter Steinberger 1b98bc35a0 fix(onboard): stop failing intentionally unstarted gateway (#123857) 2026-08-14 14:59:54 -07:00
Peter Steinberger d5c194f4ea fix(status): keep explicit fleets ownerless in diagnostics (#123831)
* fix(status): preserve explicit agent ownership

* chore: leave status notes to release

* style(status): format reconciled imports
2026-08-14 14:54:52 -07:00
Peter Steinberger 628056b0ba docs(plan): W2-PKB landed (#123801) (#123838) 2026-08-14 14:26:18 -07:00
Peter Steinberger b3f1cd36db fix(status): keep multi-agent diagnostics owner-safe (#123826)
* fix(status): preserve explicit multi-agent inventory ownership

* chore: leave changelog to release automation
2026-08-14 14:10:23 -07:00
Peter Steinberger 3c5e2ff296 fix(gateway): retire worker placements without sessions (#123785)
* fix(gateway): retire placements without sessions

* fix(gateway): preserve unreadable placement evidence

* fix(gateway): drain placement retirement on shutdown

* test(sessions): auto-clean identity probe temp dirs

* fix(gateway): join placement sidecar shutdown
2026-08-14 14:07:24 -07:00
Peter Steinberger 7c977e0f84 perf(ci): cut hosted CI critical path toward five-minute walls (#123780)
* perf(ci): cut hosted CI critical path toward five-minute walls

Stripe the serial core test-type graphs across two hosted jobs and drop the
duplicated tsgo:test:root pass; gate the six-part QA Smoke matrix off pull
requests unless a QA-owned surface changed; split the fat multi-config Node
shards (cli/cli-process, unit-fast isolated/fake-timers, infra
logging-process/runtime-config) and lower the hosted split ceiling to 150
predicted seconds so no compact lane owns a ~280s wall; expand tooling to
seven stripes.

* perf(ci): widen hosted test-type striping to three jobs

Run 31825922122 measured ~40s per core test-type graph on loaded hosted
runners (282s worst stripe body of the two-way split); three stripes keep
each lane near 150s body under load.
2026-08-14 13:03:52 -07:00
Peter Steinberger c6b3394602 docs(plan): computer-use campaign plan (CUA + Peekaboo behind computer.act v2) (#123464)
* docs(plan): computer-use campaign plan — two-provider background computer use (CUA + Peekaboo) behind computer.act v2

* docs(plan): resolve W0-PIN — pinned 0.19.3 already contains inherited IPC and consent adapter

* docs(plan): W0 complete — parity fixtures landed (#123469)

* docs(plan): W1-SEAM landed (#123509)

* docs(plan): W1 complete — v2 contract landed (#123544)

* docs(plan): W2-CUA landed (#123604)

* docs(plan): W2-MAC landed (#123635)

* docs(plan): note picker screenshot evidence belongs to W2-UX

* docs(plan): avoid inline-html placeholder in tracker note
2026-08-14 11:37:11 -07:00
Vyctor H. Brzezowski 3f006ba0fc fix(ui): complete mobile pairing after code redemption (#120933)
* fix(ui): complete pairing setup lifecycle

Redeemed and expired mobile setup codes stayed on screen as usable QR
codes, so a successful pairing had no visible outcome and expired bearer
material still looked live.

The Gateway now mints an opaque, non-authorizing setupId beside each
setup credential, returns its authoritative expiresAtMs, records the
terminal outcome of the exact redemption, and broadcasts
device.pair.setup.completed. Because that broadcast is dropped for
buffered operator sockets, the completion is persisted first and can be
reconciled through the new device.pair.setupStatus method: the Control UI
asks for the recorded outcome before it may present a credential as
expired, so a pairing that succeeds is never shown as a failure.

The Control UI models one closed lifecycle (selection, loading, waiting,
success, expired, error) correlated only by the active setupId, and
Pairing help now carries the external-link affordance.

* fix(ui): preserve unknown pairing outcomes

* test(ui): target pairing terminal headings

* test(ui): align pairing completion fixture

* fix(gateway-protocol): decode setup-code results from older gateways

Older protocol-v4 gateways omit the new setupId and expiresAtMs
lifecycle fields, so requiring them in the generated native model broke
decoding an existing device.pair.setupCode response. Keep both optional
at the wire boundary, require lifecycle metadata before the Control UI
enters its waiting state so a missing outcome stays visible, and cover
the legacy payload with Swift and schema regressions.

* fix(ui): surface rejected pairing dialog loads

The lazy pairing chunk could reject while its overlay was already open,
leaving the shell rendering nothing at all. Record the rejection on the
shell and render a recoverable modal with a reason and a retry so the
open action always ends in a visible outcome.

* fix(state): preserve pairing setup schema compatibility

* test(gateway): cover pairing setup release train

* fix(gateway): commit pairing setup completion atomically

* refactor(state): distinguish setup transaction helpers

* refactor(state): remove obsolete bootstrap restore path

* fix(gateway): preserve setup handoff type safety

* fix(gateway): keep pairing completion terminal after consume

* fix(gateway): validate Watch binding during setup commit

* fix(gateway): revalidate setup credential expiry at commit

* chore: refresh Plugin SDK API contracts after rebase

* fix(pairing): prune expired setup completions

* chore: retrigger CI

* fix(protocol): deduplicate setup expiry field

* fix(protocol): refresh pairing setup clients

* fix(gateway): make pairing setup completion durable

* fix(ui): retire expired pairing credentials immediately

* fix(ui): keep pairing dialog visible while loading

* fix(macos): align setup result initializer order

* fix(gateway): restore generic bootstrap retries

* chore(ui): record pairing startup budget

* chore(ui): refresh pairing startup budget

* style(gateway): format maintenance imports

* test(gateway): cover session-sharing mock

* fix(state): defer setup correlation schema

---------

Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-14 11:10:30 -07:00
Jesse Merhi bf40269cb7 feat(security): require acknowledgement for policy warnings (#116489) 2026-08-15 03:58:45 +10:00
ClawSweeper e03d1a42f8 improve(ui): collapse limited access notice (#123735)
* improve(ui): collapse limited access notice

* test(ui): follow limited access banner host

* test(ui): await limited access guidance host

* test(compaction): split context budget coverage

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-14 10:25:28 -07:00
Peter Steinberger 19ace6830b feat(macos): add embedded CUA computer provider (#123635)
* feat(macos): embed CUA computer provider

* fix(macos): clarify embedded CUA trust posture

* fix(macos): contain embedded CUA daemon lifecycle

* fix(macos): reap orphaned CUA daemons

* fix(macos): record the spawned CUA daemon pid so reaping can terminate orphans

* chore(macos): refresh native i18n baseline for the computer control provider picker

* style(macos): satisfy swiftlint on the embedded CUA host and connect params

* refactor(gateway): move optional connect params to GatewayConnectOptions
2026-08-14 10:24:08 -07:00
Peter Steinberger e44dde218f fix(gateway): revoke device workers when pairing is removed (#123696)
* fix(gateway): revoke device workers on unpair

* refactor(backup): split sqlite verification

* refactor(backup): narrow sqlite verifier exports

* test(gateway): track worker startup temp state

* refactor(backup): preserve sqlite architecture boundary

* test(gateway): follow worker startup logger binding

* fix(gateway): revoke workers during pairing pruning
2026-08-14 10:10:12 -07:00
Shakker 3bc61f2966 fix: keep always within OS compatibility (#123731)
Skill and hook status now preserve OS incompatibility when `always` bypasses runtime requirements, matching existing loader behavior and clarified documentation.

Refs #122271 and #122331.
2026-08-14 17:54:42 +01:00
Peter Steinberger 8885be4756 fix(codex): refresh session meters after /codex compact (#123640)
* fix(codex): route compact through session pipeline

Route /codex compact through host-owned manual compaction so native completion and token snapshots update session meters, and report the terminal outcome to the user.

* test(codex): cover unavailable compact outcome

* fix(plugins): fence command compaction capability

Bind compactCurrent to one command invocation and captured session generation so retained or stale callbacks fail closed without running compaction.

* fix(plugins): lazy-load command session revalidation

Keep compaction session freshness checks at the auto-reply owner without pulling the session accessor into generic plugin command module initialization.

* fix(plugins): keep session revalidation lazy

Avoid loading the session accessor through generic plugin command initialization while preserving pre-compaction session-generation checks.

* fix(compaction): fence session lifecycle admission

Revalidate the exact session id and lifecycle revision immediately before native compaction and again before accounting so resets and rebinds fail closed across awaited work.

* fix(commands): fence plugin compaction authority

* fix(compaction): require accounting commit

* test(compaction): keep regression under lint cap

* fix(codex): preserve compact admission

* fix(codex): preserve compaction target identity

* fix(compaction): bind admitted target

* fix(compaction): fence accounting commit
2026-08-14 09:47:43 -07:00
Peter Steinberger 3ac267fdd1 fix(installer): reject unusable prefix installs (#123716)
* fix(installer): reject unusable prefix installs

* test(installer): clean invalid package fixtures

* fix(installer): require successful version probe
2026-08-14 09:44:54 -07:00
Vito Cappello f5c46de8ac fix(compaction): allow Claude CLI sessions to compact without API keys (#120496)
* fix(compaction): route manual CLI compaction natively

* fix(compaction): harden native CLI control operations

* fix(compaction): honor Claude native completion signals

* chore(plugin-sdk): refresh API baseline

* test(compaction): assert native session binding

* fix(compaction): preserve control session reuse

* fix(plugin-sdk): preserve boolean compaction ownership

* fix(agents): preserve native compaction ownership

* fix(compaction): bypass model auth for native control

* test(compaction): isolate authless control fixture

* test(compaction): isolate auth bypass regression

* fix(compaction): bypass generic auth for native CLI control

* fix(compaction): preserve native rejection failover

* test(compaction): isolate native queue regressions

* test(compaction): prevent native auth mock leakage

* fix(cli): isolate control operations from skill env

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-14 09:30:15 -07:00