Commit Graph

151 Commits

Author SHA1 Message Date
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
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
Shakker
8da6548cce fix: remove staged chat transcript rendering 2026-07-15 02:27:06 +01:00
Peter Steinberger
4f0e131cd2 feat(ui): run sessions on cloud workers (#107670)
* feat(ui): add cloud session targets

* test(ui): cover cloud session attachments

* test(ui): use recovery token fixture

* test(ui): record cloud locale fallbacks

* fix(ui): harden cloud session recovery

* fix(ui): track cloud handoff phase

* fix(ui): close cloud recovery escape paths

* fix(ui): finish cloud recovery hardening

* fix(ui): recover ambiguous cloud session creation

* fix(ui): isolate stale cloud creation recovery

* test(ui): preserve cloud recovery literals

* fix(ui): complete cloud session release artifacts

* chore: move cloud release note to PR body

* docs(ui): name cloud session menu exactly
2026-07-14 12:44:11 -07:00
Peter Steinberger
f81f9d8570 chore: enforce max-lines suppression ratchet (#107315)
* ci: enforce max-lines suppression ratchet

* chore: prune stale max-lines suppression

* fix: close max-lines ratchet enforcement gaps

* fix: harden max-lines ratchet checks

* fix(ci): satisfy max-lines ratchet checks

* style: format max-lines declarations

* fix(ci): match oxlint suppression grammar

* test: isolate max-lines git fixtures

* chore: prune resolved max-lines debt

* test: skip newline path fixture on Windows

* fix: harden max-lines suppression ratchet

* chore: refresh max-lines baseline

* fix: close max-lines ratchet bypasses

* fix: derive ratchet base from PR merge tree

* fix: support older Git in staged ratchet

* fix: align max-lines declarations and baseline

* chore: refresh max-lines baseline for current main

* fix: exclude generated wizard locales from max-lines

* chore: prune resolved max-lines debt
2026-07-14 09:27:02 -07:00
Peter Steinberger
2ecc6b6b6b fix(ui): show restart banner for unapplied config (#107577)
* fix(ui): derive config apply state from gateway

* test(ui): align applied config hash coverage

* test(ui): follow config autosave flow

* fix(ui): guard applied config refreshes

* fix(ui): reconcile patched config revisions

* fix(ui): prevent stale config apply polling

* chore: leave release notes to release flow

* refactor(config): split applied revision helpers

* style(config): format gateway methods

* fix(i18n): refresh Korean native glossary hash
2026-07-14 08:43:35 -07:00
tzy-17
66def08d83 feat(workboard): filter cards by persisted board (#102068)
* feat(workboard): filter cards by persisted board

Co-authored-by: 唐梓夷0668001293 <tang.ziyi@xydigit.com>

* refactor(workboard): split board filter helpers

* chore(ui): refresh Workboard i18n baseline

* chore(ui): sync Workboard locale fallbacks

* chore(ui): update Workboard locale metadata

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 07:25:00 -07:00
Peter Steinberger
883e357759 fix(ui): restore autosave validation gates (#107477)
* fix(ui): sync autosave locale catalogs

* fix(ui): repair autosave lint and test types

* fix(ui): clarify Korean discard action
2026-07-14 06:29:45 -07:00
Peter Steinberger
578163c4a3 refactor(ui): privatize config autosave delay (#107475) 2026-07-14 05:55:04 -07:00
Peter Steinberger
d6fc3d34e2 improve(ui): auto-save config edits, flatten config pages, single restart affordance (#107458) 2026-07-14 05:31:41 -07:00
Peter Steinberger
9d79d85f46 feat(workboard): refresh Control UI from live changes (#99051)
* feat(workboard): refresh control ui from live changes

* refactor(workboard): tighten live invalidation path

* chore(workboard): preserve locale catalog state

* refactor(gateway): keep broadcaster runtime object

* refactor(plugin-sdk): own gateway event types

* test(workboard): bind reconciliation mocks

* test(release): declare recovery helpers

* fix(workboard): cancel direct loads on teardown
2026-07-14 05:17:23 -07:00
Jason (Json)
01a7f4fb3f feat(ui): add images and model selection to new sessions (#107358)
Merged via squash.

Prepared head SHA: cf99b5bab5
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
Reviewed-by: @fuller-stack-dev
2026-07-14 04:14:01 -06:00
Dallin Romney
561cf56c53 refactor(workboard): share control ui contract (#102271)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 02:33:22 -07:00
Peter Steinberger
d8d2f83cc1 feat(terminal): open Codex/Claude catalog sessions in a terminal on their owning host
Catalog session rows (sidebar context menu + click), the built-in viewer
header, and a new "Open Codex/Claude sessions in" preference can launch the
native CLI (codex resume / claude --resume) in the operator terminal on the
machine that owns the session.

- Gateway-local sessions spawn through the existing terminal launch policy
  (sandbox/enabled gates preserved) with the resume command in the session cwd.
- Paired-node sessions run through a new seq-ordered node PTY relay: a
  duplex node-host command streams PTY output via node.invoke.progress and
  receives keystrokes/resize via a new node.invoke.input event, behind the
  unchanged terminal.* client protocol (TerminalSessionManager gains a backend
  abstraction; node relay reuses the streaming-invoke controller).
- Owner boundary: each plugin owns its resume command and builds argv from a
  validated thread id; the gateway routes node opens through the node command
  allowlist and plugin invoke policy (no advertisement-only trust), and nodes
  re-verify session eligibility before spawning.
- UI setting catalogOpenTarget + canOpenTerminal capability gate every entry
  point; capability requires the owning host to actually have the CLI.

Node PATH is normalized before command-availability probes, Windows .cmd/.bat
shims spawn via ComSpec, and catalog terminal opens reattach persisted tabs
before opening the new tab.
2026-07-13 22:20:50 -07:00
Peter Steinberger
cac097946d feat(ui): devices card action redesign + in-page removal confirm (#107123)
* feat(ui): redesign devices card actions and fix silent stale cleanup

* fix(ui): show device id in removal prompt; keep device glyphs page-local

* fix(ui): drop pending removal prompt on connection reset

* fix(ui): sync device removal prompt locales; attach devices view test containers

* chore(i18n): sync locale bundles for device removal prompt
2026-07-13 22:07:39 -07:00
Peter Steinberger
18a452055f feat(control-ui): show compaction savings and run time (#106921)
* feat(control-ui): show compaction savings and run time

* fix(control-ui): satisfy locale and export checks

* fix(control-ui): refresh locale metadata
2026-07-13 18:07:33 -07:00
Peter Steinberger
8590655190 refactor(ui): use Web Awesome controls throughout Control UI (#106865)
* refactor(ui): add Web Awesome foundation

* refactor(ui): migrate shared menus and chat controls

* refactor(ui): migrate page controls to Web Awesome

* refactor(ui): migrate workboard controls to Web Awesome

* fix(ui): harden Web Awesome interactions

* test(ui): type Web Awesome dropdown state

* fix(ui): preserve menu focus and selection

* fix(ui): restore agent picker focus

* fix(ui): track keyboard menu dismissal

* fix(ui): ignore stale session menu closes

* fix(ui): complete Web Awesome keyboard migration

* fix(ui): repair Web Awesome lockfile graph

* docs(ui): keep release note in PR body

* fix(ui): satisfy Web Awesome migration gates

* perf(ui): keep Web Awesome theme in startup stylesheet

* fix(ui): replace reopened Web Awesome session menus

* fix(ui): keep replacement session menus open
2026-07-13 17:46:28 -07:00
Peter Steinberger
333281e516 fix(ui): retain settings route across queued patches (#106901)
* fix(ui): retain settings route across queued patches

* test(ui): model queued session patch waits

* test(ui): keep patch queue option internal
2026-07-13 17:13:45 -07:00
Peter Steinberger
908230a537 fix(ui): keep tool-only turn details visible (#106791)
* fix(ui): keep tool-only turn details visible

* refactor(ui): keep tool card component size neutral

* style(ui): format tool turn e2e test

* chore: leave release notes to release automation
2026-07-13 14:42:09 -07:00
Peter Steinberger
995c75baa0 fix(ci): restore current-main quality gates (#106751)
* fix(ci): restore Control UI quality gates

* fix(ci): repair dead export cleanup fallout

* fix(ci): repair latest main quality gates

* fix(ci): satisfy current-main gate contracts

* docs: format Cloud Workers guide

* test: isolate context lookup module
2026-07-13 13:54:03 -07:00
Peter Steinberger
e3c5821d98 feat(ui): redesign Channels page with guided channel setup wizard (#106469)
* feat(ui): redesign Channels page with guided channel setup wizard

Adds wizard.start flow=channels gateway RPC (additive protocol change) that
drives the shared channel-setup wizard (openclaw channels add) over the
session step protocol. Control UI Channels page becomes a card hub with
plugin-art covers, guided per-channel setup modal (WhatsApp QR pairing via
web.login.*, BotFather/Slack/Discord helper links), and a detail overlay
hosting the full schema config form.

* test(ui): cover channel wizard controller; refresh channels view test props

* chore(mock): use non-token-shaped wizard placeholder

* test(gateway): scanner-safe auth local in channels wizard test

* fix(ui): cancel gateway wizard session on channels page disconnect

* fix(ui): adopt browse-all channel pick and guard dirty config before setup

* fix(ui): cancel gateway session created by a stale wizard.start

* fix(ui): adopt multiselect channel picks; drop redundant String()

* fix(ui): track all wizard-adopted channels so WhatsApp QR runs regardless of pick order

* feat(gateway): report configured channels on terminal channel-wizard result

Replaces the Control UI's channel-adoption heuristic with the authoritative
outcome: the channels flow reports its actual selection after config commit,
the wizard session surfaces it as an additive channels field on the terminal
wizard.next result, and the UI keys WhatsApp QR linking off that.

* refactor(ui): align channels hub with the unified settings design language

Hub becomes settings-language rows (44px art tiles, status dots, uppercase
section headings, hairline groups) instead of a card gallery; the detail
overlay hosts the migrated per-channel settings sections with Run setup in
the header. Wizard dialog and tile/cover styles move to spacing tokens.

* chore(i18n): translate channels hub/setup strings; refresh raw-copy baseline

* refactor: satisfy LOC ratchet and dead-export gates

Split mock-dev channel/plugin fixtures into their own modules, move wizard
runner types/defaults to server-methods/wizard.ts, extract the channels page
wizard host and nostr profile HTTP ops, and unexport internal-only types
(incl. the unused config-form SECTION_META barrel re-export).

* chore(i18n): retranslate channels strings on rebased locale bundles

* fix(test): drop redundant String() in channels wizard e2e

* fix: address channel-wizard review findings

- lock wizard cancellation before durable installs/config writes
- report configured channel accounts on the terminal wizard result and
  start WhatsApp QR pairing for that account (web.login accountId)
- forward request options through the browser gateway client so wizard
  RPC timeouts apply
- render skipped setup as a no-change completion
- keep detail/advanced config reachable for unconfigured channels
- surface the dirty-config warning inside the detail overlay
- adopt the picked channel for wizard title/links in browse-all flows

* fix(ui): local wizard RPC timeout; translate no-change completion strings
2026-07-13 11:49:42 -07:00
Peter Steinberger
bfe2786957 refactor(ui): remove dead exports (#105979)
* refactor(ui): remove dead exports

* chore(deadcode): refresh export baseline

* refactor(gateway): privatize chat media fields
2026-07-13 11:32:00 -07:00
Peter Steinberger
9166b23318 feat: configure model providers from the Control UI settings page (#106490)
* feat(gateway): add models.probe RPC, credential provenance, targeted auth logout

* feat(ui): configure model providers from settings — keys, probes, logout, defaults

* docs: Control UI provider configuration section

* fix(ui): confirm fallback shrinkage via replacePaths; guard model catalog refresh races; scanner-safe probe fixtures

* test(models): scanner-safe probe fixture identifier

* chore(i18n): resync model-providers strings after rebase

* fix(gateway-protocol): drop duplicate probe type imports after rebase

* chore(protocol): regenerate Swift client for probe field order

* chore(i18n): resync model-providers strings after main rebase

* test(ui): scope model-providers E2E to settings-section headings

* fix(models): isolate marker probes from stored profiles; emit no_model for config-only providers [AI]

* fix(models): honor configured auth mode for env probes; probe config-bound profiles past auth.order [AI]

* fix(gateway): resolve provider auth aliases in models.probe [AI]

* fix(gateway): scope targeted auth logout to skip provider-wide run abort [AI]

* fix(models): probe requested provider for overrides; unregister ephemeral probe DB [AI]

* fix(gateway): exclude local no-auth markers from models.authStatus API-key provenance [AI]

* chore(i18n): resync model-providers strings for landing
2026-07-13 11:23:34 -07:00
Peter Steinberger
6ec75967b0 refactor(ui): reuse shared record normalization (#106472) 2026-07-13 09:16:25 -07:00
Peter Steinberger
111e84af43 fix: show Sessions custom-group failures (#106451)
* fix(ui): surface Sessions group mutation failures

* refactor(ui): split session group mutation helpers
2026-07-13 07:52:08 -07:00
Peter Steinberger
879ed1d859 fix(ui): make tabs, dialogs, and skill cards keyboard accessible (#106320)
* fix(ui): improve keyboard accessibility

* fix(ui): remove unused toggle event

* docs(changelog): note control UI keyboard access

* chore(ui): keep release note in PR body

* chore(ui): translate accessibility labels
2026-07-13 06:20:14 -07:00
wuqxuan
94f018caad fix(ui): preserve sidebar collapsed state when group rename/delete fails (#106152)
* fix(ui): preserve sidebar collapsed state when group rename/delete fails

* test(ui): cover group rename/delete rejection error publish

* fix(ui): harden session group mutations

* fix(ui): guard group mutations across reconnects

* fix(ui): keep session group result internal

* style(ui): format sidebar tests

* fix(ui): preserve confirmed group mutations

* chore: keep release notes out of contributor PR

* style(ui): refresh session test formatting

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 06:13:58 -07:00
Peter Steinberger
9086389527 feat(control-ui): agent identity editor, Settings-homed Agents page, scalable chip switcher (#106058)
* feat(control-ui): agent identity editor, settings-homed agents page, chip switcher pinning

* test(control-ui): pinned-agent persistence coverage; persist pins only when set

* refactor(control-ui): split agent menu, identity actions, model staging out of oversized files

* chore(i18n): sync control-ui locale bundles for agent identity/switcher keys

* fix(control-ui): stabilize new sidebar switcher tests; ratchet LOC + export baselines

* chore(review): document identity clear limitation; drop unused export

* feat(control-ui): scope pages to selected agent

* fix(control-ui): keep scoped page state consistent

* docs(control-ui): explain shared agent scope

* fix(control-ui): reconcile agent scope with current ui

* fix(control-ui): preserve complete agent filtering

* fix(control-ui): bound uploaded agent avatars

* test(control-ui): keep pinned-route fixture valid

* test(control-ui): keep pinned-route fixture valid

* chore(i18n): sync locale bundles for agent scoping keys
2026-07-13 04:03:26 -07:00
Peter Steinberger
a17058d191 feat(usage): show the account email with plan windows in the chat context popover (#106200)
* feat(usage): surface plan windows and account email in the chat context popover

The context-window popover now shows which account a session runs on:
provider usage snapshots carry an accountEmail resolved from the auth
profile when stored, the ChatGPT access-token JWT claims (openai/codex),
or the Claude CLI config file (~/.claude.json oauthAccount) for
keychain-synced logins. models.authStatus embeds it, quota groups keep
distinct accounts separate, and the popover renders the email under the
plan header for local CLI sessions and OpenClaw-configured subscriptions
alike.

* test(openai): assemble the fake usage JWT from parts

* test(usage): keep fixture tokens and identity plumbing scanner-safe

* fix(usage): verify the Claude CLI login before labeling usage with its email

Review findings: the CLI-config email fallback now requires the usage token
to match the cached CLI credential (and honors CLAUDE_CONFIG_DIR), so an
ambient login for another account never labels a snapshot; token-type
credentials propagate their stored email alongside oauth ones.

* style(anthropic): scanner-safe local for the CLI login read

* fix(usage): capture the Claude CLI account email on the credential

Review findings: reading ambient CLI config at usage-fetch time could not
verify keychain-only logins and could go stale across account switches.
The credential reader now captures oauthAccount.emailAddress next to the
credential it belongs to, the synced claude-cli profile carries it, and
the anthropic fetcher uses only the credential-borne identity.

* style(usage): scanner-safe credential fixtures and helper naming

* fix(auth): backfill the CLI account email onto existing synced profiles

Profiles synced before identity capture stay usable and skip CLI reads,
so upgraded installs would never gain the email until token rotation.
While the stored token material matches the CLI login, merge the
non-secret email onto the stored profile.

* style(test): scanner-safe email assertion

* test(auth): pin the no-reread invariant to identity-complete profiles
2026-07-13 03:39:16 -07:00
Peter Steinberger
938d41014f feat(mobile): default pairing to full node access (#105928)
* feat(mobile): default pairing to full node access

* chore: leave release notes to release workflow

* refactor(mobile): bound pairing helpers

* chore(i18n): refresh mobile access inventory

* chore(ci): lower mobile pairing LOC baseline

* fix(mobile): complete pairing validation artifacts

* ci: remove stale transcript target export baseline

* fix(ios): wrap access upgrade guidance

* fix(ios): preserve localized access key

* fix(ci): dedupe read-only SQLite guardrail

* fix(mobile): secure full-access node setup
2026-07-13 02:30:45 -07:00
Peter Steinberger
dc89ee258e improve(ui): replace the chat settings popover with a composer view menu (#105904)
The composer gear popover mixed misplaced, mislabeled, and dead controls.
Replace it with a three-row View menu (Reasoning, Tool calls, Keep
commentary); drop the manual-refresh machinery and the auto-scroll modes
(near-bottom stays the only behavior); move the cron-session filter to the
sidebar sort menu as a working persisted toggle; move the send shortcut and
microphone picker to Settings -> Appearance -> Chat; delete the ephemeral
voice/model/sensitivity overrides in favor of the server talk config.
Settings keep an in-memory fallback when localStorage is blocked, and talk
sessions re-read persisted settings at launch.
2026-07-13 01:41:00 -07:00
Peter Steinberger
bae913ba0c fix(ui): retry session group catalog loads (#106169) 2026-07-13 01:29:45 -07:00
Peter Steinberger
c2521d7c47 fix(ui): catalog sessions select in place and continue from desktop-app sources (#106074)
* fix(ui): make catalog sessions selectable in place and continuable from desktop-app sources

- sidebar: no phantom chat row for catalog keys, active highlight on catalog rows,
  adopted sessions render as their live row inside the catalog group (deduped from
  the regular list), host subtitle only for paired-node rows
- chat: view-only banner only after catalog metadata proves canContinue=false
- chat->sidebar continued event binds the adopted row before the next catalog poll
- anthropic: local claude-desktop sessions share the ~/.claude/projects store, so
  list them as continuable and allow catalog continue to fork-resume them

* refactor(ui): extract catalog row rendering and lookup into shared modules

Keeps app-sidebar/chat-pane/anthropic session-catalog under the LOC ratchet by
moving cohesive blocks: sidebar catalog groups + adopted-row binding into
app-sidebar-session-catalogs.ts, the catalog metadata lookup into
catalog-key.ts, and the Claude node-host commands into
session-catalog-node-commands.ts; ratchet baselines down for all three.

* fix(ui): explain the disabled composer when catalog metadata cannot resolve a session

* style(ui): keep chat-pane within the LOC ratchet

* fix(anthropic): keep catalog node-command helpers module-local and repin SDK surface

The node-command module now owns its capability constant, projects-store
probe, and params parsing, so the catalog engine exports nothing new.
Repin the SDK surface budgets (+1 export/+1 callable landed on main
without a pin bump); unexport the UI helper types knip flagged.
2026-07-13 00:49:35 -07:00
Peter Steinberger
5d86f9dcaf fix(ui): allow session creation during refresh (#106045) 2026-07-13 00:34:12 -07:00
Peter Steinberger
e4a17ee160 refactor(ui): split Workboard controller modules (#105995)
* refactor(ui): split Workboard controller modules

* chore(ui): track moved Workboard export

* chore(ui): avoid unrelated LOC baseline validation

* ci: refresh TypeScript LOC baseline

* ci: drop stale transcript export baseline
2026-07-12 22:55:07 -07:00
Peter Steinberger
2ecd485cd5 refactor(ui): deduplicate layout, clipboard, and polling scaffolds (#106003)
* refactor(ui): share dock panel layout

* refactor(ui): centralize clipboard writes

* refactor(ui): centralize polling lifecycle

* refactor(ui): reuse shared byte formatter

* chore(ci): refresh UI LOC ratchet

* fix(ui): keep dock layout type internal
2026-07-12 22:05:09 -07:00
Peter Steinberger
7761022048 fix(ui): explain skipped cron runs (#105858) 2026-07-12 20:05:11 -07:00
Peter Steinberger
0ba1e5ca2e fix(ui): honor session delete no-op results (#105778) 2026-07-12 17:17:05 -07:00
Peter Steinberger
1ffccaab94 fix(ui): omit blank cron delivery account ids (#105762) 2026-07-12 16:56:54 -07:00
Jason (Json)
1663c8801d fix(ui): preserve MCP App previews across reloads (#105728)
* fix(mcp): harden app preview lifecycle

* fix(ui): defer MCP app initialization payload

* test(mcp): align current policy expectations

* fix(ui): preserve MCP app previews

* fix(mcp): reject disabled app restoration

* fix(mcp): preserve reconstructed app state

* fix(mcp): bind reconstructable app data

* fix(ui): deduplicate MCP app preview copies

* style(ui): format MCP app preview test

* fix(mcp): satisfy metadata access lint

* style(mcp): format metadata access
2026-07-12 17:30:34 -06:00
Peter Steinberger
f15a5e566b fix(ui): serialize Skills operations (#105671)
* refactor(ui): clarify skill edit value naming

* refactor(ui): clarify skill credential draft naming

* fix(ui): serialize Skills operations
2026-07-12 13:13:17 -07:00
Peter Steinberger
d3fdd214c2 fix(ui): prevent configuration edits from disappearing during operations (#105555)
* fix(ui): lock configuration during operations

* chore: defer release note to release workflow
2026-07-12 18:50:19 +01:00
Peter Steinberger
c5208f9dfe feat(tooling): enforce indexed access checks in UI tests (#105283) 2026-07-12 11:35:00 +01:00
Peter Steinberger
dba78584ff fix(ui): preserve rejected first message when session send fails (#105261)
* fix(ui): preserve rejected first session message

* chore: leave changelog to release closeout

* fix(protocol): regenerate session create result
2026-07-12 11:09:38 +01:00
Peter Steinberger
17a533ce26 improve(ui): redesign the Automations tab with stats, a table list, and a full-page detail view (#105174)
* feat(ui): redesign Automations tab with stats, table list, and detail tabs

* docs(web): describe redesigned Automations page layout

* fix(ui): global failing-count stat via filtered cron.list and unclipped row menus

* fix(ui): refresh failing-count stat after cron job mutations

* chore(ui): sync locale bundles for automations redesign keys
2026-07-12 09:51:12 +01:00
Peter Steinberger
cfe95266af feat(ui): redesign cron page as sidebar-first Automations master-detail (#104251)
Rebuilds the Control UI cron page as a sidebar-first Automations master-detail workspace: a task list pane (All/Active/Paused tabs, search, filter popover, curated emoji suggestion cards, scheduler footer) beside a detail pane that edits the selected task inline (prompt, row-style Details/Frequency groups, collapsible Advanced, per-task run history) and shows all-task recent activity when nothing is selected. Create & run now kicks a new task immediately after creation. The modal editor and quick-create wizard are retired; the automation-ideas catalog from #104761 is ported into the new suggestions list. Nav item renamed to Automations and pinned by default; route (/cron) and cron.* RPC contracts unchanged.

Closes #104217

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-12 07:12:26 +01:00
Vincent Koc
27da133957 fix(ui): localize chat surfaces 2026-07-12 13:45:11 +08:00
Vincent Koc
65f8e27900 fix(ui): localize plugins and skills 2026-07-12 13:45:11 +08:00
Vincent Koc
b9f6cae6bc fix(ui): localize agent controls 2026-07-12 13:45:11 +08:00
Peter Steinberger
096cb91175 feat(tooling): enforce noUncheckedIndexedAccess in core and ui lanes (NUIA phase 3c) (#104981)
* fix(ui): make indexed access explicit across the Control UI

Burns down all 322 ui-lane noUncheckedIndexedAccess errors: untrusted
markdown/diff/patch parsing gets miss-tolerant guards (renderer rules
degrade to empty output instead of throwing mid-render), accumulators
use canonical sparse initialization, DOM lookups stay null-guarded, and
length-checked constructions carry named invariants.

* feat(tooling): enforce noUncheckedIndexedAccess in the core and ui lanes

Flips the flag on for tsconfig.core.json and tsconfig.ui.json (covering
src, all packages including the two deferred ones, and ui) and retires
the strict-ratchet lane wholesale: config, script, projects reference,
check/CI wiring, changed-lane routing, and sync test. The assertion-ban
oxlint override stays as an independent surface.
2026-07-12 06:36:36 +01:00