Commit Graph

80744 Commits

Author SHA1 Message Date
Peter Steinberger 617bc7ebdd fix(agents): stale sub-agent failure warning shown after successful spawn retry (#126218)
* fix(agents): clear sub-agent failure warning after successful spawn retry

A failed sessions_spawn followed by a successful retry in the same run
kept appending the durable "Sub-agent failed" warning to channel
replies. The recovery seam (lastToolRecovery) already existed, but
sessions_spawn has no stable-target arg key, so its recovery
fingerprint fell back to display meta built from label/task/model.
Retries adjust those args (drop a rejected cwd, reword the task), the
fingerprints never matched, and recordSuccess could not clear the
failure.

Collapse the sessions_spawn recovery identity to tool level: any later
successful spawn in the same run is recovery proof. A lone failed spawn
still warns, and a failure after recovery still invalidates the
receipt.

Observed 2026-08-19 on team.openclaw.ai: Roboclaw's first nested spawn
returned forbidden (visible-session cwd outside workspace), the retry
without cwd succeeded, the reply said "Started Investigate…", and
Discord still showed "⚠️ 🧑‍🔧 Sub-agent failed".

* ci: register run-attempt-tools test in the attempt-light lane

#126189 added extensions/codex/src/app-server/run-attempt-tools.test.ts
without assigning it to a full-suite lane, so the Vitest ownership audit
(test/vitest-projects-config.test.ts) fails on main and every PR head.
Register it in the codex app-server attempt-light shard next to its
run-attempt siblings.
2026-08-19 00:31:47 -07:00
Peter Steinberger a4b265aa9b test(google-meet): remove testing re-export (#126223) 2026-08-19 00:26:09 -07:00
Peter Steinberger 1de37dd0af test(gateway): drop the chat image-capability mask (#126217)
* test(gateway): drop the chat image-capability mask

The vi.mock of resolveGatewayModelSupportsImages in
server.chat.gateway-server-chat.test.ts was added by #123847 as an
isolation workaround while the gateway shard's chat failures were
unexplained. The producers are fixed on main (#126183 for the
root-work drain race; #126062/#125946/#126113 for detached completion
binding), and the exact #126030 shard invocation is green with the
mask removed (5/5 on 95ac5b27fa, 2/2 on this head), so the mask now
only hides the real capability-resolution path from the suite.

* test(gateway): assert inline-image dispatch after mask removal

ClawSweeper P2 on #126217: the two image sends only asserted RPC success
and drain, so a silent false from the real capability resolver would
offload the images and the suite would stay green without proving the
discovered model's image capability. Capture the dispatch args and
assert both runs deliver exactly one inline image. Teeth check: with the
discovered model narrowed to text-only input, the assertion fails with
images undefined (offloaded).
2026-08-19 00:26:05 -07:00
Peter Steinberger 554dfbe0a2 feat(discord): auto-join occupied voice rooms (#125974)
* feat(discord): auto-join occupied voice rooms

Add opt-in voice.autoJoin[].whenOccupied residency so Discord voice bots join for the first human and leave when the room becomes empty while preserving existing always-on, manual, transcript, and follow-user behavior.\n\nCloses #125973

* test(discord): isolate process runtime mocks

Use stable hoisted runtime-env mocks so isolate=false Discord test ordering cannot turn sleepWithAbort back into an unmocked function.

* fix(discord): defer unknown voice occupancy

Treat memberless voice states as unresolved instead of human so bot-only rooms cannot trigger occupancy-managed auto-join. Add cache-to-listener and manager regressions.\n\nCloses #125973

* test: isolate shared module mocks

Replace ineffective non-isolated module spies with stable hoisted mocks and a child-process SQLite connection-reuse probe so gateway and Discord shards are order-independent.

* test(gateway): inline connection reuse probe

Keep the child-process SQLite ownership probe in its owning Vitest file so Knip sees the full test surface without weakening process isolation or the original order regression.
2026-08-19 00:08:54 -07:00
Peter Steinberger 9b43f1c82e improve(ui): fix sidebar session row hierarchy and add a message-preview toggle
Pinned sessions inherited the nav zone's muted colour on the session *title*, so a
pinned row's preview line outshone its own name and the same session read dimmer
pinned than unpinned. A title is content in every zone; only glyphs, meta and the
hover fill follow the zone. The subtitle drops to plain --muted, already proven AA
against every surface by theme-contrast.test.ts.

Rows with no preview text reserved a fixed 18px second line anyway, leaving a dead
band or a lone spinner hanging below-right of the title. They now collapse to one
line via a --single-line class plus a CSS variant, so the endcap rides beside the
title. Rows also gained a little vertical air and reclaimed the right-hand gutter
inside the row, leaving the deliberate scrollbar clearance from #124879 intact.

Adds a localStorage-backed "Show message preview" toggle to the session sort menu
(default on). Operator-actionable state is exempt: attention, the queued
concurrency-slot explanation, and critical observer headlines (stuck /
waiting-on-user) always show, because hiding them behind a display preference is
the silent-failure class.

Also registers extensions/codex/src/app-server/run-attempt-tools.test.ts, which
arrived in #126189 with no shard claim and left main red.
2026-08-19 00:08:07 -07:00
Peter Steinberger 57a65def4f fix(ui): restore sidebar session hovercards (#126222)
* fix(ui): restore sidebar session hovercards

* test(codex): include run-attempt tools in full suite
2026-08-19 00:07:05 -07:00
Dallin Romney 4bea2d8cea fix(release): scope optional survivor assertions (#126000) 2026-08-19 15:04:51 +08:00
Peter Steinberger 49d8cfd393 fix(security): prevent blocked SearXNG refs from using ambient URLs (#126214)
* fix(security): honor blocked SearXNG secret refs

* docs(searxng): clarify blocked SecretRef policy

* test(codex): route attempt tools coverage
2026-08-19 00:02:58 -07:00
Peter Steinberger b62df3a99a test(codex): route run attempt tools test (#126225) 2026-08-18 23:59:52 -07:00
Vincent Koc 7dca970ff3 test(zai): enable GLM 5.3 reasoning in live probe (#126202)
* test(zai): enable GLM 5.3 reasoning in live probe

Punchcard-Session: frost-orchard-lantern-ze

* test(ai): cover Z.AI simple reasoning payload

Punchcard-Session: frost-orchard-lantern-ze
2026-08-19 14:50:29 +08:00
Peter Steinberger 1d2e914772 fix(test): keep Control UI changed tests in UI lane (#126197) 2026-08-18 23:38:54 -07:00
Peter Steinberger 220b12880c fix(plugins): list MXC in the offline marketplace (#126211)
* fix(plugins): restore official catalog ownership

* test(plugins): verify catalog install ownership

* test(plugins): type catalog package names
2026-08-18 23:31:05 -07:00
Peter Steinberger f92e9367e8 fix(build): rebuild incomplete managed-update cache hits (#125954)
* fix(build): invalidate incomplete cache hits

* test(qa): align empty completion lifecycle
2026-08-18 23:25:04 -07:00
Peter Steinberger 7f60af7f8b fix(ui): tear down hidden Desktop presenters (#126203)
Scope embedded Desktop refresh and connection ownership to the active presented sidebar slot. Hidden retained panels now invalidate pending work and disconnect RFB, while reactivation returns to a freshly loaded picker without silently reconnecting.
2026-08-18 23:20:44 -07:00
Peter Steinberger 3205e9282d fix(codex): keep progress card directly visible (#126189) 2026-08-18 23:20:27 -07:00
Peter Steinberger 3d90c3f685 test(gateway): remove channel avatar cache reset (#126209) 2026-08-18 23:16:26 -07:00
Peter Steinberger df9b553150 fix: local model inference no longer times out during plugin preparation (#126196)
* fix(agents): scope simple completion runtime preparation

Explicit local model runs no longer build the broad plugin/live model catalog before inference.

Related to #125802 and #125834 as discovery context only; this commit does not claim to close either issue.

* refactor(agents): simplify runtime scope planning

Reuse canonical configured-slot and metadata-snapshot resolution, and consolidate test temp cleanup without changing the selected prepared-runtime contract.
2026-08-18 23:08:58 -07:00
Swagat Rathod b5f530cf29 fix(agents): reject ambiguous apply_patch matches (#124470)
Punchcard-Session: calm-timber-lantern-kh
2026-08-19 14:06:48 +08:00
Peter Steinberger 2e6457b8e6 fix(codex): restore GPT-5.6 reasoning effort options (#126182)
* fix(codex): preserve model effort capabilities

Keep public model identities separate from app-server execution routing, and retain provider-owned complete effort metadata when account discovery is partial.

Fixes #126005

* refactor(codex): avoid redundant thread rotation

* fix(codex): preserve model fallbacks without leaking wire ids
2026-08-18 22:56:20 -07:00
Ayaan Zaidi 97e3136b9e feat(qa): add a standalone Telegram Desktop recorder with a prebaked desktop image (#125186)
Records native Telegram Desktop from a digest-pinned prebaked image: a ready desktop in ~12s with no per-lease apt installs or downloads, which also removes the dpkg-lock failures that killed recent runs.

The recorder only records; callers drive the turn and supply the TDLib driver used for QR authorization. Nothing in this repository invokes it yet - routing the Mantis Telegram Desktop Proof workflow through it is a follow-up.
2026-08-19 11:23:48 +05:30
Vincent Koc c9afcbb904 fix(gateway): bound CLI history deduplication (#126201)
Punchcard-Session: clear-river-meadow-gr
2026-08-19 13:51:18 +08:00
Peter Steinberger 0d14434d0e feat(secrets): add explicit protected and agent-readable access (#126088)
* feat(secrets): add explicit agent access modes

Distinguish protected write-only secrets from agent-readable Gateway environment values, expose policy-bound Gateway exec aliases to Codex, and activate Node environment proxy support for destination-bound egress.\n\nCloses #125975

* fix(gateway): bind lifecycle dispatch to owning instance

* test(ui): preserve mock gateway recovery state

* fix(codex): avoid unavailable gateway process guidance

* fix(harness): keep run correlation host-owned

* fix(gateway): bind restart delivery to instance

* test(codex): construct tools through test host capability
2026-08-18 22:51:15 -07:00
Peter Steinberger 49231ff781 fix(ui): load workspace icons after dashboard bootstrap (#126200)
Paired Control UI device credentials now share the canonical same-origin read authorizer, while session-derived routes retain read+owner policy. Fresh dashboard handoffs and reloads can therefore render workspace, channel, and plugin icons without exposing or persisting the shared Gateway secret.

Remove the old shared-secret-first UI workaround.
2026-08-18 22:50:55 -07:00
Peter Steinberger 2bcc06cc22 fix(cron): required delivery failures no longer report success (#126164)
* fix(cron): preserve required delivery completion

Record durable completion independently from payload execution so required delivery failure cannot delete one-shots or report successful waits.\n\nCloses #126163

* fix(cron): keep completion contracts acyclic

* fix(cron): keep delivery predicate private
2026-08-18 22:44:33 -07:00
Vincent Koc d64c1a1a91 fix(scripts): detect existing dist-runtime growth (#126191)
Punchcard-Session: golden-lantern-cedar-9j

Co-authored-by: qingminlong <qing.minlong@xydigit.com>
2026-08-19 13:42:27 +08:00
Peter Steinberger 95ac5b27fa test(skills): remove scanner cache reset seam (#126199) 2026-08-18 22:35:54 -07:00
Peter Steinberger 3550b174e9 fix(crabbox): derive machine classes from catalog (#126184) 2026-08-18 22:35:13 -07:00
Peter Steinberger 554f18dfc4 fix(agent-core): keep compaction streams under idle watchdog (#126159) 2026-08-18 22:31:29 -07:00
Shubhankar Tripathy f0b40777b8 fix(agents): sign the resize log byte delta from its value (#123411)
* fix(agents): sign resize log byte deltas

Co-authored-by: Shubhankar Tripathy <reach2shubhankar@gmail.com>
Punchcard-Session: brisk-cedar-valley-dv

* test(agents): cover resize log delta signs

Co-authored-by: Shubhankar Tripathy <reach2shubhankar@gmail.com>
Punchcard-Session: brisk-cedar-valley-dv

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-19 13:29:11 +08:00
Peter Steinberger 5a0a96f327 fix(ui): keep workshop revisions retryable until admitted (#126166)
* fix(ui): preserve workshop revisions until admission

Skill Workshop revision instructions now remain retryable until the Gateway admits the request, including navigation and overlapping admission failures.

* fix(ui): materialize workshop revision binding

Manifest-only Skill Workshop proposals now resolve their revision hash inside the durable admission owner, and retries reuse the same binding and idempotency key.

* chore(ui): keep revision types internal
2026-08-18 22:25:57 -07:00
Peter Steinberger 404eddbc6a fix(plugins): preserve subagent lifecycle results (#126167) 2026-08-18 22:22:20 -07:00
Peter Steinberger a6b77ffc07 fix(msteams): preserve replies after durable ingress replay (#126169)
* fix(msteams): preserve replies across ingress replay

Recovered Teams channel and group-chat responses now preserve reply and quote context across durable ingress replay. Discovery metadata also advertises the existing group and reaction capabilities.

* chore(msteams): document replay assertion safety

* test(msteams): normalize replay delivery errors
2026-08-18 22:22:13 -07:00
Peter Steinberger e38a06439e refactor: trim locale and QA fixture debt (#126139)
* refactor: trim locale and QA fixture debt

* fix(qa): preserve shared flow portability

* chore(qa): document shared flow branch

* fix(docs): align plugin SDK subpath catalog

* fix(ci): align shared docs and flow contracts
2026-08-18 22:17:19 -07:00
Peter Steinberger 2456c77459 improve(gateway): avoid repeated logging and delivery scans (#126147)
* perf(gateway): remove repeated logging and delivery scans

Exact session-delivery retries no longer scan the full queue. Logging and diagnostics reuse lifecycle-owned settings and listener interest so uninterested projections are skipped, while outbound WebSocket summaries are built only after recipient admission.

* fix(infra): break diagnostic listener import cycle

Keep event-type validation at the diagnostic dispatcher while the process-wide listener presence counter remains a leaf module.

* test(cli): use logging override owner

Exercise late one-shot JSON diagnostics through the canonical logger override setter so lifecycle-cached console settings are invalidated as they are in production.

* test(auth): use logging override owner

Configure the locked-update warning test through the canonical logger override setter so lifecycle-cached console settings are invalidated before assertion.

* test(gateway): normalize redacted media fixture

Compare durable inbound media facts against the public redaction contract so random identifiers that resemble sensitive text do not make the Gateway suite flaky.
2026-08-18 22:13:22 -07:00
Peter Steinberger 1abd0fb0c2 test(infra): remove channel activity reset seam (#126188)
* test(infra): remove channel activity reset seam

* chore(plugin-sdk): ratchet surface budget
2026-08-18 22:12:49 -07:00
Peter Steinberger baefd067bb fix(deps): keep package runtime dependencies single-owned (#126119)
* fix(deps): consolidate shared runtime helpers

* test(concurrency): support current test lib target

* fix(time): preserve year-scale plugin durations

* fix(agents): preserve empty subagent completions
2026-08-18 22:12:45 -07:00
Peter Steinberger 0767902330 fix(channels): reject malformed ingress queue claims instead of minting sentinel identity (#126176)
* fix(channels): reject malformed ingress queue claims instead of minting sentinel identity

A status=claimed row missing claim_token, claim_owner, or claimed_at was
decoded into a fake claim (token "", owner "", claimedAt 0). Release then
guarded on claim_token = "" (never matches NULL) and the stale-claim scan's
claimed_at <= cutoff never selected NULL timestamps, so such rows were stuck
claimed forever and blocked their dedupe slot.

Claimed rows now decode through a strict claim-column decoder; malformed
claims are tombstoned as failed/corrupt_claim by stale recovery without an
ownership-policy consult (no reachable owner can exist), preserving a valid
payload so the event stays operator-resubmittable. Regression test fails
pre-fix: listClaims leaked the sentinel claim and recovery never scanned
the row.

* fix(channels): rename recovery claim decode variable to avoid method shadow

* fix(channels): scan malformed claims into recovery regardless of timestamp

A claimed row missing token/owner but carrying a corrupt future claimed_at
dodged both the cutoff and IS NULL predicates, so it never reached the strict
decoder. Recovery now selects any row with incomplete claim columns; the
malformed-claim tombstone relies on the exact-token guard alone instead of a
stale-cutoff comparison its timestamp cannot satisfy.
2026-08-18 22:09:48 -07:00
Peter Steinberger ffdd0641c8 fix(workboard): retry managed worktree cleanup after hook failures (#126162)
* fix(workboard): retry managed worktree cleanup

* fix(workboard): keep workspace mutation type local
2026-08-18 22:05:16 -07:00
Peter Steinberger dcdfd737e5 fix(workboard): recover interrupted worker launches (#126170)
* fix(workboard): recover interrupted worker launches

Persist prepared, accepted, and failed launch phases so Gateway restart reconciliation cannot leave cards permanently running between launch preparation and worker acceptance.

* fix(workboard): require durable terminal evidence

Do not synthesize terminal-session acceptance timing during restart reconciliation; stale same-key terminal rows without updatedAt now fail the prepared launch instead of being adopted.
2026-08-18 22:01:14 -07:00
Peter Steinberger 85cec65a19 fix(signal): preserve partial final delivery after later send failures (#126160)
* fix(signal): preserve partial final delivery

* test(signal): keep ingress boundary on sdk seams

* test(delivery): cover accepted partial target adoption
2026-08-18 21:55:09 -07:00
Peter Steinberger dc37ed8f63 fix(agents): record empty subagent completion delivery (#126179)
* fix(agents): preserve delivery after incomplete completion

* test(qa): distinguish failed delivered completions
2026-08-18 21:46:38 -07:00
Peter Steinberger 5564671c4f fix(gateway): bound audit and Codex backlogs (#126154)
* fix(gateway): bound audit and Codex backlogs

Live Gateway SQLite lock failures and process heap pressure exposed two
independent queue owners. Route best-effort audit persistence through the
canonical shared-state connection with bounded contention retries, and remove
the per-notification Codex yield so the keyed turn queue can drain directly.

Follow-up to #126033 and #126073.

* fix(gateway): annotate raw SQLite cold-open probe

* test(codex): register notification burst shard
2026-08-18 21:44:09 -07:00
Peter Steinberger caebee321d perf(test): consolidate TUI PTY session coverage (#126185) 2026-08-18 21:42:01 -07:00
Peter Steinberger 41ed3c3460 fix(ui): buttons use the default cursor instead of the link hand (#126153)
* fix(ui): reserve pointer cursors for links

* test: align cursor and docs contracts
2026-08-18 21:40:52 -07:00
Peter Steinberger d96f1d51be fix(gateway): hold the chat root through terminal persistence (#126183)
startChatDispatch reserved the detached dispatch's root-work continuation
after the ACK, and swallowed a failed reservation with ?? undefined. When
the reservation did not land, the request's root was released before
chat-send-dispatch-errors finalize() awaited
persistGatewaySessionLifecycleEvent, so a concurrent restart drain saw
zero active roots and completed while the session's terminal state was
still being written.

Reserve in admitChatSend instead, where the request root is provably
live, and release it from the single cleanupAdmittedRun owner. Callers
outside a Gateway request envelope hold no root, so their continuation is
a no-op.

The regression now starts a real waitForActiveGatewayRootWork() drain
while persistence is blocked and asserts it cannot settle until the write
is released, instead of asserting an absolute process-global counter.
2026-08-18 21:38:12 -07:00
Peter Steinberger 093b191318 test(agents): remove tool-policy warning reset API (#126175) 2026-08-18 21:37:26 -07:00
Jason (Json) d16c2858bf improve(update): make managed finalization timing auditable (#126107)
* improve(update): report finalizer phase timings

* test(update): return completion cache outcome

* refactor(update): isolate finalize command

* chore(update): document finalize config assertion

* test(update): isolate finalizer capability fixtures
2026-08-18 22:34:22 -06:00
Peter Steinberger a89c568068 fix(ui): center dashboard widget controls on hover (#126076)
* fix(ui): center dashboard widget hover controls

* fix(ui): gate resize handle with centered hover

* fix(ui): preserve iframe clicks with centered controls

* fix(ui): preserve corner actions when centering controls

* fix(ui): compact centered controls at intermediate widths

* test(plugins): align SDK subpath docs contract wording
2026-08-18 21:32:37 -07:00
Peter Steinberger 4ffa2a4418 fix(gateway): avoid readiness flaps during Reef reconnects (#126151)
* fix(gateway): avoid readiness flaps during Reef reconnects

* docs: preserve plugin SDK private-local contract wording
2026-08-18 21:29:43 -07:00
Peter Steinberger 00482543ff fix(agents): bound Skill Workshop model projections (#126158) 2026-08-18 21:28:54 -07:00