Commit Graph

3362 Commits

Author SHA1 Message Date
Peter Steinberger d5eebf02e2 fix(workboard): record resolved runtime metadata instead of hardcoded codex engine (#108887)
* fix(workboard): record resolved runtime metadata instead of hardcoded codex engine

Workboard executions labeled every dispatched run engine=codex, model=default,
and id suffix :codex even for Claude/other harness agents. The gateway agent
admission phase now returns the resolved {harness, provider, model} for plugin
subagent runs; the dispatcher records it verbatim and omits engine/model when
unresolved. Engine becomes an open runtime identifier in the workboard
contract (built-in launch choices stay a closed list), store/UI normalizers
preserve historical labels as written instead of inventing codex, and new
execution ids use an :agent-session suffix. Fixes #108362

* fix(workboard): accept undefined engine in ui engineModel helper
2026-07-16 04:10:27 -07:00
xingzhou 0c067fbfa4 fix(ui): reject nondecimal cron repeat amounts (#107480)
* fix(ui): reject nondecimal cron repeat amounts

* fix(ui): satisfy cron LOC ratchet

* fix(ui): validate cron intervals exactly

Co-authored-by: xingzhou <zhang.guiping@xydigit.com>

* chore(pr): stage cron UI proof

Co-authored-by: xingzhou <zhang.guiping@xydigit.com>

* chore(pr): remove staged cron UI proof

Co-authored-by: xingzhou <zhang.guiping@xydigit.com>

* fix(ui): remove unused cron type export

Co-authored-by: xingzhou <zhang.guiping@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-16 04:04:01 -07:00
zhanxingxin1998 866050fc1c fix(ui): honor UTC in usage session detail timelines (#108579)
* fix(ui): honor timezone in usage detail timeline

Apply the selected local or UTC calendar boundaries to session detail points and keep the full final day.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test(ui): make usage timezone regression deterministic

Model a non-UTC local calendar through Date getters instead of relying on runtime TZ mutation.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test(ui): type local date getter mocks

Annotate Date receivers so the deterministic timezone regression passes strict test type checking.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix(ui): complete usage timeline timezone handling

---------

Co-authored-by: OpenAI Codex <noreply@openai.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 03:48:35 -07:00
Peter Steinberger 2488d794ca feat(ui): expand child sessions in sidebar (#108838)
* feat(ui): expand child sessions in sidebar

* test(ui): type child session list options

* refactor(ui): split child session data helpers

* fix(ui): preserve session link semantics

* fix(ui): retry incomplete child session loads

* chore: keep release changelog owner-only
2026-07-16 03:26:49 -07:00
zhanxingxin1998 4bc84db398 fix(cron): allow clearing failure alert routing fields (#108578)
* fix(cron): clear failure alert routing fields

Send explicit nulls for cleared Control UI failure-alert overrides and accept those clears only in cron update patches.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test(cron): satisfy serialized alert patch types

Narrow the serialized failure-alert fixture before asserting its cleared fields.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix(cron): clear failure alert overrides

Co-authored-by: 詹幸心0668001037 <zhan.xingxin@xydigit.com>

---------

Co-authored-by: OpenAI Codex <noreply@openai.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 02:52:19 -07:00
snowzlmbot fdaae75645 fix(ui): expose derived session titles accessibly (#96267)
* fix(ui): improve accessible session history picker

* fix(ui): clean session picker ARIA semantics

* fix(ui): preserve derived titles after session patches

Reuse the most recent sessions.list options when refreshing after sessions.patch so derived-title hydration survives normal patch flows. Add unit and browser E2E coverage for patch refreshes retaining readable sidebar titles.

* test(ui): split session list option coverage

---------

Co-authored-by: snowzlmbot <snowzlmbot@users.noreply.github.com>
Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:53:37 -07:00
xingzhou f98de3fc25 fix(control-ui): preserve emoji in plugin fallback monograms (#105240)
* fix(control-ui): preserve emoji in plugin monograms

* test(ui): cover combining-mark monograms

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

---------

Co-authored-by: Colin Johnson <colin@solvely.net>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-16 00:59:37 -07:00
Peter Steinberger a864c64d8a refactor(ui): unify terminal and browser panel tab strips (#108651)
* refactor(ui): share one panel tab strip between terminal and browser

Extract the terminal tab strip (tab + attached close button as one
surface, from #108611) into a shared panel-tab-strip module and migrate
the in-app browser panel onto it. The browser tabs inherit the attached
close design; terminal tabs gain middle-click close and long-label
ellipsis; both get the empty-group workaround and a strip that shrinks
inside the flex header. Net -24 prod LOC; duplicated tp-/bp- strip CSS
deleted.

* fix(ui): keep shared panel new-tab button stable
2026-07-16 00:44:23 -07:00
xianshishan a7189d228e fix(ui): restore scrollbar in skill workshop board mode (#108197)
The flex height constraint chain was broken at three points in the
board-mode layout, preventing both the proposal queue and detail
body from scrolling:

1. .sw-hub-panel > .skill-workshop used a > child selector but
   .skill-workshop is nested inside an inner wa-tab-panel wrapper,
   so the rule never matched.  Switched to a descendant selector.

2. #skill-workshop-mode-panel (the inner tab panel) had no flex
   styles, defaulting to display:block which cannot pass through
   flex height constraints.  Added explicit flex container styles.

3. The wa-tab-panel shadow-DOM part(base) wrapper also needs flex
   overrides to fill the host height.  Added part selectors with
   display:flex, flex:1, min-height:0, and width:100% to preserve
   full-width block behavior for non-flex children like the
   history scan banner.

   Also added flex-shrink:0 to .sw-history so the banner does not
   collapse when .skill-workshop receives a definite height.

Fixes #108196
2026-07-16 00:05:37 -07:00
Peter Steinberger 0f32033d78 fix(ui): add thinking level to new cloud sessions (#108679) 2026-07-15 23:54:00 -07:00
Dallin Romney 6a9e3d1d7a chore(ui): remove retired Matrix QA art (#108575)
* chore(ui): remove retired Matrix QA asset

* chore(ui): drop retired Matrix QA art registration
2026-07-15 23:52:31 -07:00
Peter Steinberger bae9752c5a refactor(deadcode): enforce repository hard zero (#108641) 2026-07-15 22:40:00 -07:00
Peter Steinberger 5bfcd779b1 fix(ui): local sessions show no placement icon (#108615)
* fix(ui): distinguish cloud worker sessions

* chore: defer session icon release note

* fix(ui): keep placement helper private
2026-07-15 22:05:09 -07:00
Peter Steinberger 91332739f7 fix(ui): hide empty offline nodes from native session groups (#108620)
* fix(ui): hide empty offline session hosts

* chore: keep release changelog owner-only
2026-07-15 21:59:42 -07:00
Peter Steinberger fdd1acb328 fix(ui): attach terminal tab close button to its tab (#108611)
The web terminal's per-tab close control rendered as a detached floating
square next to the tab. It now joins the tab as one surface: shared hover
background, active accent underline continuing beneath it, full tab
height, with its own rounded inner highlight on hover.
2026-07-15 21:33:25 -07:00
Peter Steinberger 957cc81175 test: speed up slow unit and browser coverage (#108563) 2026-07-15 19:59:16 -07:00
Peter Steinberger 3c8269ca52 refactor(codex)!: fold the codex text provider into openai with a doctor migration
The live codex text provider was a redundant projection of the openai
catalog (exclusive provider ownership; the openai plugin's ChatGPT OAuth
discovery already serves gpt-5.6-* route-aware). Folding it:

- extensions/codex no longer registers a text provider, catalog entry, or
  synthetic text auth; provider.ts/provider-catalog.ts/provider-discovery.ts
  and the route-blind model-name heuristics are deleted; the narrow
  post-harness reasoning fallback moves to an app-server-owned module
- openai thinking policy keys on explicit selected-route provenance
  (api === openai-chatgpt-responses) instead of value-shape inference
- models.list gains an optional additive agentRuntime field (configured
  intent); session agentHarnessId remains the execution proof
- doctor --fix migrates the shipped codex/* config shape end to end:
  every model slot, provider-config merge with blocker-aware conflict
  handling, sessions, cron payloads (two-phase: runtime policy persists
  before cron refs rewrite), transcripts; migrated refs carry model-scoped
  agentRuntime.id=codex preserving the shipped wizard semantics; auto
  runtime policies normalize to codex with sibling fields preserved;
  blocked provider conflicts retain the whole legacy namespace fail-closed
  with an actionable warning
- the stale openai:default profile cleanup (#91352) was deliberately
  deferred to a follow-up after review showed it needs per-agent identity
  proofs; doctor keeps warning about unusable profiles

Fixes #105561
Fixes #84637
Fixes #90420
2026-07-16 03:06:43 +01:00
Alix-007 5c97107c7a fix(ui): bound mount recovery probes (#108163)
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-15 18:51:42 -07:00
Peter Steinberger 3768ad4d08 improve: speed up Control UI browser tests (#108504)
* test(ui): accelerate browser timing coverage

* test(ui): stabilize Mantis elapsed-time proof

* test(ui): keep Claude viewport proof isolated
2026-07-15 17:48:32 -07:00
xingzhou 3b1f26bb0e fix(control-ui): keep Workspace UI on the newest version after overlapping reloads (#108204)
* fix(control-ui): keep Workspace reloads on newest version

* test(control-ui): cover workspace loading ownership

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

* fix(control-ui): preserve workspace navigation intent

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

* fix(control-ui): settle superseded load state

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

* fix(control-ui): cancel removed workspace deep links

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

* fix(control-ui): prefer newer workspace documents

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

* refactor(control-ui): finalize workspace load ownership

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

* fix(control-ui): invalidate consumed workspace intent

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 17:30:26 -07:00
qingminlong 4a1eedba54 fix(usage): count instant sessions in hourly metrics (#108160)
* fix(usage): count instant sessions in hourly metrics

* chore: rerun usage metrics CI

* refactor(usage): simplify positive-duration slicing

Co-authored-by: qingminlong <qing.minlong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 16:57:46 -07:00
Peter Steinberger 1643f1fd9f refactor(ui): isolate sidebar session presentation (#108492) 2026-07-15 16:17:39 -07:00
Peter Steinberger dc7f167227 refactor(ui): split app sidebar responsibilities (#108422)
* refactor(ui): split app sidebar responsibilities

* fix(ui): keep sidebar menu action type private
2026-07-15 15:52:35 -07:00
Peter Steinberger 4ae2bcafc3 improve(ui): speed up browser E2E tests (#108478)
* test(ui): reuse Chromium across E2E cases

* test(ui): stabilize delayed metadata wait
2026-07-15 15:48:06 -07:00
Peter Steinberger 126b549a26 feat: run and reclaim cloud worker sessions from Control UI (#108398)
* feat(gateway): finish cloud worker session reclaim

* chore(gateway): refresh cloud worker artifacts

* fix(gateway): preserve recovery environment narrowing

* test(gateway): complete worker tunnel mock

* fix(gateway): harden cloud worker recovery

* fix(gateway): serialize forced worker teardown

* fix(gateway): handle replaced workspace directories

* fix(gateway): preserve forced destroy receiver

* test(ui): cover cloud worker reclaim flow

* fix(gateway): close final worker recovery races

* fix(ci): align cloud worker generated surfaces

* test(gateway): satisfy worker queue lint

* fix(gateway): recheck remote workspace after lease fence

* chore: move cloud worker release note to PR
2026-07-15 11:24:04 -07:00
Peter Steinberger 506bb14d22 test: tighten more async polling (#108385) 2026-07-15 10:49:43 -07:00
Peter Steinberger d472bbbc83 fix(ui): align release E2E with current chat contracts (#108380)
* test(ui): update release e2e contracts

* chore: prune stale max-lines baseline
2026-07-15 10:05:37 -07:00
Peter Steinberger e48427bfc8 test(ui): await terminal readiness states (#108371) 2026-07-15 09:38:45 -07:00
Peter Steinberger 20bf422cc7 fix(ui): keep fullscreen terminal loads exception-free (#108317)
* fix(ui): avoid empty terminal tab groups

* chore: keep release notes in PR
2026-07-15 06:36:32 -07:00
Peter Steinberger 84c7941f1e refactor: simplify recent async ownership fixes (#108164)
* fix(device-pair): preserve concurrent notify state

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* refactor(ui): simplify logbook refresh ownership

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(qa-lab): bound multipass retry window

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* chore: keep release notes in PR body

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(ui): keep logbook controller state private

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(ui): retire logbook client epochs

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(ui): retire inactive logbook ownership

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(device-pair): require atomic notify state

Co-authored-by: Alix-007 <li.long15@xydigit.com>

---------

Co-authored-by: Alix-007 <li.long15@xydigit.com>
2026-07-15 03:32:15 -07:00
Peter Steinberger b4d82f4729 refactor(ui): use libterminal color query responder (#108234) 2026-07-15 03:17:31 -07:00
Peter Steinberger ce2bc379a3 refactor(deadcode): repair system-agent export ratchet (#108201)
* refactor(agents): privatize delegation tool factory

* refactor(state): privatize approval migration helpers

* refactor(ui): privatize approval event parsers

* chore(deadcode): remove system-agent baseline growth
2026-07-15 02:11:42 -07:00
Peter Steinberger 30bbe1b385 fix(system-agent): atomic approval migration + credential-scoped fallback
Final review findings:
- Wrap the operator-approval copy/drop/rename in a single immediate
  transaction so a crash mid-migration cannot strand or lose rows.
- The inference fallback marked a provider attempted before probing, so a
  stale requester credential blocked another agent's valid same-provider
  route. Dedup by credential owner and only retire a whole provider on
  provider-wide failures (auth/billing may differ per credential owner).

Refs #107237
2026-07-15 01:56:31 -07:00
Peter Steinberger b1f4aac349 feat(agents): OpenClaw system-agent delegation
New openclaw delegation tool relays to openclaw.chat in-process; persistent
writes surface through the existing durable operator-approval registry as a
third system-agent kind (no parallel store), armed only by a human operator
in the Control UI — a delegated agent can never self-approve. Setup wizards
(channel/model/open-setup/open-tui) are refused in delegated mode so a
machine agent cannot complete setup or persist credentials unattended.
Vendor-neutral inference fallback ladder (requester route first, then other
authed providers by provider id). update.run removed from the gateway tool.
Caveman system-prompt fragment steers config/channels/plugins/agents/updates
to the openclaw tool. Doctor-owned state migration widens the approval-kind
constraint; runtime stays canonical-only.

Refs #107237
2026-07-15 01:56:31 -07:00
Peter Steinberger 6eda184f27 refactor: simplify native session executable resolution (#108169) 2026-07-15 01:49:45 -07:00
Miorbnli 9e6cce6358 fix(ui): show <1m for sub-minute quota reset windows instead of 0m (#108009)
* fix(ui): show <1m for sub-minute quota reset windows instead of 0m

formatQuotaReset computed Math.floor(diffMs / 60_000) for the minute branch.
When a provider quota window resets in under 60 seconds (common for 5h Anthropic
or 3h Codex windows near rollover), the floor is 0 and the UI rendered
"Resets in 0m" — nonsensical and indistinguishable from "already reset".

Add a sub-minute guard returning "<1m", matching the convention already used
by formatRemainingShort and formatRelativeTimestamp elsewhere in the codebase.

Co-Authored-By: Claude <noreply@anthropic.com>

* test(ui): cover quota reset display boundary

Co-Authored-By: ZCode <noreply@zcode.ai>

* test(ui): cover elapsed quota reset boundary

Co-Authored-By: ZCode <noreply@zcode.ai>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: ZCode <noreply@zcode.ai>
2026-07-15 01:15:36 -07:00
Peter Steinberger f3e6042119 fix(ui): preserve explicit steer queue mode (#108121) 2026-07-15 01:09:55 -07:00
Peter Steinberger 0754d23615 fix: group native sessions by host (#108062)
* fix(control-ui): group native sessions by host

* test: satisfy native session checks

* chore: remove release-owned changelog entry
2026-07-14 23:51:00 -07:00
clawsweeper[bot] 5afb1fb381 feat(ui): add follow-up behavior setting for active runs (steer by default) (#108032)
* feat(ui): add follow-up behavior setting (queue vs steer) for active runs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* default follow-up behavior to steer

Follow-ups sent while a run is active now steer into the running turn by
default; queue mode becomes the persisted opt-out. Offline/disconnected
sends still always queue.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(ui): steer active follow-ups by default

---------

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 23:28:27 -07:00
Peter Steinberger 1d22f1d34c fix: restore palette-aware embedded terminal surfaces (#108057)
* fix(ui): answer terminal color queries

* chore: keep terminal release note in PR
2026-07-14 23:25:19 -07:00
Alix-007 ebb1e83b64 fix(logbook): bound background refresh concurrency (#106397)
* fix(logbook): bound background refresh concurrency

* fix(logbook): unify refresh ownership

* style(logbook): format type import

* test(logbook): use typed rejection error

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 22:27:20 -07:00
Peter Steinberger 51d85769b3 fix(ui): terminal artifacts after hide and show (#107970)
* fix(ui): repaint terminal after hide and show

* chore: leave release notes to release workflow

* fix(ui): keep terminal scrollbar hidden on repaint

* test(ui): assert terminal repaint pixels
2026-07-14 22:15:59 -07:00
Alix-007 f1778ad36b fix(ui): prevent browser screenshot fetch hangs (#107703)
* fix(ui): prevent browser screenshot fetch hangs

* test(ui): cover stalled screenshot body

* test(ui): verify screenshot timer cleanup

* test(ui): cover successful timer cleanup

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 22:15:03 -07:00
Peter Steinberger 5b097eb48c feat(ui): pick a repo folder and a cloud worker together in the new-session composer (#107976) 2026-07-14 22:10:58 -07:00
Peter Steinberger 4a6dc1fe1d fix(ui): show New Session failures in a centered alert (#107997)
* fix(ui): center new session errors

* chore: remove release-owned changelog entry
2026-07-14 21:37:45 -07:00
Peter Steinberger 7748574c4b fix: stabilize flaky test shards blocking merges (#107938)
* test: stabilize flaky test shards

* style: format Feishu delivery trace types
2026-07-14 20:41:54 -07:00
Shakker 977bf5b0bf fix: split native chat work by run (#107965) 2026-07-15 04:38:01 +01:00
Shakker 2c95bd2387 fix: repair main CI regressions 2026-07-15 04:03:56 +01:00
Peter Steinberger 5fc7ba6da0 test: isolate UI globals and satisfy Mattermost lint (#107936) 2026-07-14 19:45:53 -07:00
Kyle Klouzal 2333bd59db fix: keep yielded parent turns nonterminal (#95996)
* fix: keep yielded parent turns nonterminal

* fix: type chat final stop reasons

* test: isolate yielded session reconciliation

* fix: refresh yielded lifecycle generated surfaces

* test: register Codex lifecycle test shard

---------

Co-authored-by: FullerStackDev <263060202+fuller-stack-dev@users.noreply.github.com>
2026-07-14 20:35:33 -06:00