Commit Graph

70345 Commits

Author SHA1 Message Date
Peter Steinberger
8a66aa76dd feat(ui): session board grid engine and board view (#110644)
* feat(ui): add session board grid view

* fix(ui): use shared board controls

* fix(ui): keep board cell registration type-safe

* chore(ui): drop unused board cell class export
2026-07-18 09:40:41 -07:00
Peter Steinberger
81df196b8d refactor(ui): unify transcript inline UI on one widget card (#110740)
* refactor(ui): unify transcript widget cards

* chore(ui): keep widget-card internals unexported
2026-07-18 09:40:08 -07:00
Peter Steinberger
fd7e444c24 improve(ui): syntax-highlight JSON dumps on the debug page and config issues callout (#110806) 2026-07-18 17:32:28 +01:00
Peter Steinberger
7a35e243c4 refactor(channels): adopt durable Nextcloud Talk and Nostr ingress (#110653)
Accepted Nextcloud Talk webhook and Nostr relay messages now use the shared durable channel-ingress queue. Claims stay owned until reply-lane terminal completion; bounded append and delivery retries fail closed into dead-letter handling; restart recovery owns redelivery; and Nostr cursors advance only after relay EOSE and durable progress.

Related: #109657
2026-07-18 17:30:37 +01:00
Peter Steinberger
33f9c47e3c fix(ui): label the local-only chat message delete honestly as hide (#110801) 2026-07-18 17:27:51 +01:00
Peter Steinberger
ffb7c98312 fix(ui): drop resting relative ages from agent chip subtitle and footer build chip (#110800) 2026-07-18 17:27:18 +01:00
Peter Steinberger
4fbdb6d011 test(qa): align coverage inventory contracts (#110799) 2026-07-18 17:22:50 +01:00
Peter Steinberger
ef04f351ea fix(ui): keep Web Awesome available-height bound in workboard listbox caps (#110788) 2026-07-18 17:19:39 +01:00
Peter Steinberger
6a8575651f chore(ui): raise Control UI CSS gzip budgets to 45 KiB (maintainer-approved) 2026-07-18 09:18:57 -07:00
Peter Steinberger
88e5af7097 feat(ui): interleaved sidebar zone with custom session icons and drag ordering (#110682)
* feat(ui): custom session icons with agent-drawable SVG and nav-parity pinned rows

* wip: slice-2 interleaved sidebar zone (pre-review)

* fix(ui): trim icon exports, bypass protocol barrel in startup bundle, regen Swift protocol client

* fix(ui): preserve unknown-agent zone entries on writes, prune entries on any unpin

* fix(ui): reset keeps unloaded session slots; enforce SVG byte cap on canonical form

* fix(ui): archiving a pinned session retires its sidebar zone slot

* fix(ui): persist drag-pinned zone slot only after the pin patch lands

* fix(ui): recompute drop insertion against freshest zone order on pin ack

* fix(ui): consume self-drop events before the zone bailout

* docs(ui): note the non-sidebar unpin pruning contract on pruneSidebarSessionEntry

* refactor(ui): extract pure session-tree projection; drop unused zone type export
2026-07-18 17:13:09 +01:00
Peter Steinberger
3e8f1c6448 fix(plugin-sdk): refresh memory runtime baseline (#110611) 2026-07-18 17:09:19 +01:00
Peter Steinberger
3fd3ad8301 fix(ci): restore plugin prerelease validation (#110787)
* test: align plugin prerelease assertions

* test: remove stale vitest import
2026-07-18 17:00:15 +01:00
WhatsSkiLL
7bded09b61 feat(android): add inline dictation to chat composer (#109329)
* feat(android): add safe inline chat dictation

* chore(android): sync generated localization resources

* feat(android): unify chat composer controls

* feat(android): keep realtime talk inside chat

* chore(android): sync combined localization inventory

* fix(android): keep realtime talk in chat

* fix(android): toggle live talk from composer

* fix(android): sync composer i18n inventory

---------

Co-authored-by: Colin <colin@solvely.net>
Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
2026-07-18 11:54:39 -04:00
xingzhou
faf3dbdda8 fix(ci): classify proxied APNs TLS tunnel (#110480)
* fix(ci): classify proxied APNs TLS tunnel

* fix(ci): prove network CodeQL contract changes

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 16:18:29 +01:00
Peter Steinberger
63a32e360b fix(qa): stop retries after overall health deadline (#110753) 2026-07-18 16:07:35 +01:00
Peter Steinberger
9177601e7e fix(plugin-sdk): refresh merged API baseline (#110751) 2026-07-18 16:05:55 +01:00
cxbAsDev
80f6acc8de fix(agents): bound IDENTITY.md reads to prevent OOM (#101447)
* fix(agents): bound IDENTITY.md reads to prevent OOM

* fix(agents): reuse shared workspace bootstrap file size limit for IDENTITY.md

* chore: retrigger CI after cancelled gate run

* chore: retrigger CI after runner tooling flake

* chore: retrigger CI after main typecheck fix and runner brew flake

* fix(identity): bound explicit --identity-file imports through shared loader

* fix(agents): unexport parseIdentityMarkdown to satisfy production deadcode scan

* chore: retrigger CI after stuck previous run

* chore: retrigger CI after stuck checks-node-compact-large-4 run

* chore: retrigger CI after stuck checks-node-compact-large-4 and flaky small-9

* fix(agents): report oversized identity file size to the user

When `--identity-file` points at a file exceeding the size limit, the
`no identity data found` error is misleading. Re-throw the fs-safe
`exceeds` error with a human-readable message so the CLI surfaces the
actual cause.

* fix(agents): update test assertion for oversized identity diagnostic

* fix(agents): attach caught error as cause in oversized identity diagnostic

* fix(agents): preserve symlinked identity files

* fix(agents): classify identity size errors exactly

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(agents): preserve supported identity avatars

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(agents): keep identity limit private

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-18 16:05:45 +01:00
Peter Steinberger
5143d909b9 feat(macos): Quick Chat streamed replies and continue-recent targeting (#110631)
* feat(macos): stream Quick Chat conversations

* docs(macos): explain Quick Chat recents

* fix(macos): bind the Quick Chat reply consumer before dispatching the send

* fix(macos): pre-bind reply consumer for all send paths; gate rebind on visible route

* fix(macos): revalidate recents eligibility after the async fetch

* fix(macos): invalidate in-flight recents fetches on competing interactions

* fix(macos): single-owner recents invalidation; fresh presentations clear prepared replies

* docs(macos): name the accepted scheduler-scale pre-bind tradeoff

* chore(i18n): refresh native locale artifacts for new Quick Chat strings

* fix(macos): keep Quick Chat placeholder and recents titles localizable
2026-07-18 15:58:49 +01:00
Peter Steinberger
d7b0bacf10 fix(teams-meetings): join and transcribe live meetings reliably (#110615)
* fix(teams-meetings): validate live web flows

* chore(plugin-sdk): update meeting runtime baseline

* test(teams-meetings): align live validation fixtures

* fix(teams-meetings): harden live browser validation

* fix(teams-meetings): preserve live transition lifecycles

* fix(meeting-bot): pass wait budget during recovery

* test(teams-meetings): satisfy extension lint

* fix(teams-meetings): preserve browser session ownership

* fix(teams-meetings): retire audio bridges after leave

* fix(teams-meetings): harden leave and audio ownership

* fix(teams-meetings): preserve leave transition ownership

* fix(teams-meetings): serialize leave cleanup safely

* fix(teams-meetings): guard live transition cleanup

* fix(teams-meetings): preserve adapter boundaries

* fix(teams-meetings): await caption readiness

* fix(teams-meetings): surface caption blockers

* fix(teams-meetings): retry transient media playback

* chore(teams-meetings): defer release notes

* refactor(meeting-bot): isolate navigation error helper

* test(teams-meetings): keep page control helper private

* fix(meeting-bot): bound caption lifecycle cleanup

* chore(plugin-sdk): refresh API baseline

* test(teams-meetings): split caption ownership coverage

* fix(teams-meetings): retry pending audio routing

* fix(teams-meetings): retain leave transition ownership

* fix(teams-meetings): refresh transcript target

* fix(teams-meetings): bound audio routing retries

* fix(teams-meetings): retry pending remote audio

* fix(teams-meetings): harden media source ownership
2026-07-18 15:57:22 +01:00
xingzhou
33151cbc40 fix(apns): keep diagnostics valid when response capture reaches its byte limit (#110483)
* fix(apns): preserve UTF-8 response captures

* test(apns): cover UTF-8 at the real capture limit

* fix(apns): preserve UTF-8 in bounded response captures

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 15:51:31 +01:00
Peter Steinberger
a115af2774 feat(ui): add reactive OpenClaw health nudges (#110708)
* feat(ui): add reactive custodian health nudges

* fix(ui): distinguish stopped channels from startup failures

* test(ui): update custodian route gateway fixture

* fix(ui): preserve current channel health failures

* fix(ui): ignore recovered channel errors
2026-07-18 15:44:29 +01:00
Peter Steinberger
d8846a1dcb refactor(cli): read-only database access for pure-read commands (#110732) 2026-07-18 15:42:28 +01:00
cxbAsDev
593423ecc0 fix(shared): bound ignore-file reads during workspace scans (#101429)
* fix(shared): bound ignore-file reads during workspace scans

* fix(shared): import bounded reader through infra policy wrapper

* fix(shared): preserve chained-symlink ignore files while bounding reads

* fix(shared): correct ignore-rules test calls and remove dead return

* fix(shared): restore ignore matcher return value from addIgnoreRules

* fix(shared): fail closed on oversized ignore files during scans

* style(shared): format ignore-rules signature

* test(shared): rename misleading under-cap ignore-file test

* chore: retrigger CI for unrelated flaky run-with-env shutdown test

* fix(shared): make oversized ignore-file exclusion terminal

* test(shared): remove loadSkillsFromDir dependency for main compat

* chore: retrigger dead-code scan after Periphery/Homebrew flake

* fix(scans): fail closed on ignore read races

* fix(scans): treat fail-closed ignore paths literally

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(scans): preserve native ignore path semantics

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(scans): bound ignore rule amplification

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(scans): preserve case-insensitive fail-closed matching

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(scans): preserve bounded ignore composition

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(scans): satisfy matcher method binding lint

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(scans): preserve ignore matcher case mode

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(scans): keep matcher options internal

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(scans): require matcher case contract

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-18 15:31:42 +01:00
VectorPeak
4dff4c4996 fix(signal): preserve base URL path prefixes (#110495)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 15:22:31 +01:00
Peter Steinberger
3f976a949a test(signal): isolate tool-result harness lifecycle (#110720) 2026-07-18 15:06:19 +01:00
Peter Steinberger
e8566596e0 refactor(state): split openclaw-agent-db into focused modules under the line limit (#110707) 2026-07-18 15:04:57 +01:00
Peter Steinberger
a026380614 fix(release): force isolated gateway shutdown (#110698) 2026-07-18 14:49:20 +01:00
Peter Steinberger
0acece4591 feat(chat): rewind and fork a session from a message bubble (#110660)
* feat(chat): rewind and fork a session from a message bubble

* docs(web): document chat rewind and fork bubble actions

* fix(chat): lint cleanups, protocol regen, and test splits for rewind/fork CI

* fix(ui): fit chat rewind disabled styles inside the startup CSS budget
2026-07-18 14:46:34 +01:00
Peter Steinberger
9710a1339e refactor(canvas): promote inline-widget hosting and show_widget to core (#110475)
* refactor(canvas): promote inline widgets to core

* docs(agents): note discord show_widget ownership at core registration

* ci: retrigger after GitHub scheduling outage

* fix(canvas): satisfy dead-code and test type checks
2026-07-18 14:40:45 +01:00
Shakker
e4fd904f8a test: cover hidden catalog polling across reconnects (#110705) 2026-07-18 14:29:38 +01:00
Shakker
b5d9573dca fix: pause hidden session catalog polling 2026-07-18 14:15:51 +01:00
Peter Steinberger
42133d0c3c feat(mac): show native notification permission in dashboard Notifications settings (#110646)
* feat(mac): show native notification permission in dashboard Notifications settings

The Mac app's embedded Control UI showed the web-push section as
Unsupported/Not subscribed even though the app delivers notifications
natively. The dashboard now installs an openclawNotifications WebKit
bridge (status / request-permission / send-test) and the Notifications
settings page renders native permission state with Enable, Open System
Settings, and Send test actions when hosted in the Mac app. Browsers
keep the existing web-push UI. The notifications section renderer moved
out of the oversized config view module.

* fix(ui): break config view import cycle and satisfy lint/deadcode/i18n gates

Move the notifications section props to a leaf contract (no view.ts
type import), unexport the status-event constant, use bracket access
for the injected dunder global, default-case the status switch, and
refresh the native i18n inventory line offset.
2026-07-18 14:13:06 +01:00
Alix-007
ad3b8e0b6f fix(memory): bound qmd taskkill cleanup (#109265)
* fix(memory): bound qmd taskkill cleanup

* test(memory): satisfy qmd process lint
2026-07-18 06:11:14 -07:00
Peter Steinberger
1cddec35f4 feat(clients): session groups, batch actions, inspector, and worktree-aware creation for native chat (#110347)
* feat(clients): gateway session groups, batch operations, session inspector, and new-session options

* chore(i18n): translate session management strings and regenerate catalogs

* chore(i18n): complete translation artifacts for session management strings

* fix(clients): fail closed when a transport cannot honor agent or base-ref session options

* fix(clients): authoritative agent identity for new-session parents and revision-keyed sidebar group refresh

* fix(clients): refetch session groups on remote catalog events and correct Swedish repository-root translation

* fix(clients): resilient new-session popover, revision-keyed group manager, and popover string translations

* fix(clients): scope reset fallback to plain new-session requests and revision-key the inspector groups

* fix(clients): reject empty agent catalogs and refresh sessions on remote group events

* refactor(clients): drop unused agents fetch wrapper and runtime memberwise init flagged by periphery

* chore(i18n): realign locale artifacts after rebase onto model-controls main

* chore(clients): split session creation into the session-actions extension and realign i18n after ask-user main rebase

* chore(i18n): resync derived artifacts after question-card main rebase
2026-07-18 14:09:42 +01:00
cxbAsDev
881b0a619f fix(doctor): bound AGENTS.md and root-memory file reads (#101448)
* fix(doctor): bound AGENTS.md and root-memory file reads

* chore(doctor): retrigger CI after QA smoke flake

* fix(doctor): validate root-memory inputs before archiving

* fix(doctor): distinguish oversized root-memory reads from other read failures

* fix(doctor): preserve legacy memory on bounded-read races

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(doctor): preserve archives on restoration failure

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(doctor): keep independent archive on migration races

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(doctor): preserve symlinked workspace guidance

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(doctor): report atomic archive failures

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-18 14:05:51 +01:00
Peter Steinberger
40793e6f8b fix: bound pasted input and provider response bodies (#110627)
* refactor(runtime): centralize bounded I/O handling

* fix(runtime): finalize bounded I/O contracts

* chore(security): drop stale audit import

* docs(changelog): credit bounded I/O fixes

Co-authored-by: Pick-cat <huang.ting3@xydigit.com>

* fix(agents): keep provider HTTP options private

* fix(ai): traverse OpenAI schema maps by value

* fix(runtime): preserve absolute download deadlines

* ci(ui): stabilize compressed CSS budget

* fix(ai): traverse legacy schema applicators

---------

Co-authored-by: Pick-cat <huang.ting3@xydigit.com>
2026-07-18 13:54:56 +01:00
Peter Steinberger
e01a880084 refactor(state): split openclaw-state-db into focused modules under the line limit (#110666) 2026-07-18 13:47:57 +01:00
cxbAsDev
af2662f25a fix(reef): add timeout and bounded JSON reads to relay transport (#108333)
* fix(reef): bound relay request duration

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* test(reef): satisfy timeout fixture lint

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-18 13:28:32 +01:00
Peter Steinberger
7994c44b06 fix(ios): shrink the chat "Jump to latest" pill to a compact icon button (#110651)
* fix(ios): shrink chat jump-to-latest pill to a compact icon button

* fix(ios): drop removed jump-to-latest string from native locale artifacts
2026-07-18 13:26:26 +01:00
Peter Steinberger
d3173f6f91 perf(ui): keep lazy-page CSS out of the Control UI entry stylesheet (#110687)
The entry stylesheet aggregated approval, config, config-quick, and
lobster-pet styles even though every consumer is a lazy route chunk or
lazily defined element, and two small UI landings tipped startup CSS to
exactly the 42.0 KiB budget, failing all QA Smoke profiles on main (run
29643357786). Move each stylesheet to its owning lazy module — pages
already own their CSS this way (chat, agents, cron) — and keep only the
shell's pre-hydration approval booting subset in the entry via the new
approval-boot.css. Startup CSS drops 42.0 -> 36.0 KiB gzip; tighten the
budget 42 -> 38 KiB to lock in the recovery, matching the startup-JS
precedent from #110528.
2026-07-18 13:26:21 +01:00
Peter Steinberger
28069db63a feat(macos): render system chat option cards (#110584)
* feat(macos): render system chat option cards

* fix(macos): localize question card controls

* test(macos): stabilize main actor attachment tests
2026-07-18 13:23:59 +01:00
Peter Steinberger
bc8d0da092 feat(linux): Quick Chat streamed replies and precise pairing states (#110632)
* feat(linux): stream Quick Chat gateway events

* feat(linux): render streamed Quick Chat replies

* fix(linux): correlate Quick Chat streams by run

* style(linux): rustfmt

* test(linux): move Quick Chat stream helper tests into the tooling vitest project

* test: type the Linux quickchat stream harness for strict checks

* test: explicit harness shape for the root test typecheck
2026-07-18 13:22:48 +01:00
Peter Steinberger
74880cb56f feat(ui): manage MCP servers directly from Settings → MCP (#110654)
* feat(ui): manage MCP servers directly on the Settings MCP page

* refactor(ui): mcp config section owned by the MCP settings page only

* chore(ui): drop test-only McpServersCard export for knip
2026-07-18 12:54:05 +01:00
Peter Steinberger
f6de912efe refactor(update): split update-runner into focused modules under the line limit (#110664) 2026-07-18 12:52:54 +01:00
Peter Steinberger
39ddf710f0 feat(ui): session unarchive flows with undo toast (#110605)
* feat(ui): session unarchive flows with undo toast

Archiving from the web UI was silent and one-way. Adds a shared single-slot
toast with Undo (restores archive state, pin, and active selection), a sidebar
'View archived' entry into Settings -> Sessions, an Active|Archived segment
replacing the buried archived-only chip, an inline Restore button on archived
chats' disabled composer, and a guarded 'Delete all archived' bulk action that
fully re-enumerates archived sessions (paginated, aborts on any abnormal page)
and passes the protocol archivedOnly guard. No gateway/protocol changes.

* test(ui): adapt archive undo sidebar harness

* fix(ui): unexport ToastOptions and widen test mock casts for CI gates
2026-07-18 12:50:51 +01:00
Peter Steinberger
f98bcb7fa7 perf(ui): drop zod from the Control UI and lazy-load json5 with the config surfaces (#110623)
* perf(ui): drop zod and lazy-load json5 out of Control UI startup

zod's only UI consumer was the custom-theme shape layer, whose deep CSS
validators already re-check every token; replace the two shallow schemas
with a plain record reader and delete the zod jitless CSP shim + test.
Startup keeps one schema library total (typebox, protocol-owned, already
lazy via the approval page).

json5 now loads through a lazy runtime boundary: strict JSON.parse is the
fast path, the parser warms with the config editor and whenever a config
snapshot or raw draft actually needs JSON5 (comments, trailing commas).
The redaction sanitize path parses the authoritative raw once at snapshot
ingestion (async-safe) and submits against the carried parsed fact, so
secret-placeholder handling never races the lazy parser.

Startup JS: 321.8 -> 295.8 KiB gzip, 13 -> 12 requests; budgets ratchet
to 310 KiB / 18 requests.

* fix(ui): gate config submits on pending JSON5 original parse

A JSON5 config racing the first parser load could reach the sanitize step
with a null parsed original and pass redaction placeholders through.
setConfigRawOriginal now parses synchronously whenever the parser is warm
and tracks a pending promise otherwise; submit, auto-save, and teardown
flush paths defer to that promise (teardown keeps its synchronous prefix
when no parse is pending).

* fix(ui): keep teardown config flush synchronous and JSON5 diff cache non-sticky

Teardown flush must dispatch before unload destroys the context; the
gateway's restore-or-reject sentinel contract backs the rare unsanitized
window. Raw-diff parse failures no longer cache while the lazy JSON5
parser is still loading, so a transient cold-parser miss retries on the
next render instead of pinning an empty diff.

* fix(ui): harden lazy JSON5 boundary against double-submit and failed loads

Claim the config busy flag before awaiting a pending JSON5 original parse
so a second click cannot slip past the busy state (autosave overlap is
already serialized by the in-flight registry and drain discipline). A
rejected json5 chunk import now resets the loader for retry, the per-state
pending promise is never-rejecting and self-clearing, and fire-and-forget
warms swallow rejections.

* docs(ui): note autosave entry serialization at the JSON5 parse await

* fix(ui): fill raw pending-changes diff once the lazy JSON5 parser lands

First diff open could race the parser chunk and render an empty list with
nothing scheduling a retry; renderConfig now re-renders when the warm
completes, and the browser test warms the parser in setup to assert the
steady state the view module guarantees in prod.
2026-07-18 12:36:46 +01:00
Peter Steinberger
684ae080d4 fix(signal): preserve durable ingress retry ownership (#110629)
* test(signal): await durable ingress adoption

* fix(signal): keep session conflict retries claim-aware

* test(signal): normalize captured monitor errors

* test(signal): exercise core ingress lifecycle seam
2026-07-18 12:35:27 +01:00
cxbAsDev
e976e357ea fix(security): bound mcporter registry read in audit (#101772)
* fix(security): bound mcporter registry read in audit

* refactor(security): extract bounded mcporter registry read to own module

Keeps src/security/audit.ts under the TS max-LOC ceiling after the
bounded-read security fix.

* fix(security): preserve bounded symlinked mcporter registry reads in audit

* fix(security): warn when an existing mcporter registry cannot be inspected

* fix(security): consume shared mcporter outcome type and exhaust rejection switch

* fix(security): scope mcporter registry audit

* fix(security): reject named-pipe mcporter registries

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 12:33:20 +01:00
cxbAsDev
05fb8e6e61 fix(cli): bound --message-file reads for agent command (#101442)
* fix(cli): bound --message-file reads for agent command

* fix(cli): preserve symlinked --message-file paths with bounded reads

* fix(cli): preserve FIFO message files with bounded reads, document 4 MiB cap

* fix(cli): accept FIFO --message-file targets via bounded descriptor read

* test(cli): drop duplicate FIFO message-file read test

* docs(cli): note 4 MiB --message-file cap in agent help text

* style(commands): format agent-via-gateway test

* fix(cli): preserve procfs message-file reads

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-18 12:29:33 +01:00
Peter Steinberger
60cb6d78de perf(ui): lazy-load the lobster pet out of the Control UI startup graph (#110628)
* perf(ui): lazy-load the lobster pet out of the Control UI startup graph

Keep the lightweight lobster contract on the sidebar's static path while idle-loading the heavy pet implementation. Move the logo stand-in custom element into the pet module so both decorative elements upgrade together after the lazy import.

* style(ui): format lobster-pet lazy boundary

* fix(ui): clear the lobster-pet chunk cache on load failure

A rejected import stayed cached forever and surfaced as an unhandled
rejection; clearing it lets a later scheduling call retry.

* fix(ui): retry the lobster-pet chunk once connectivity returns
2026-07-18 12:26:25 +01:00