* feat(linux): add node device capabilities
* fix(linux-node): actionable pending-approval error + node-host advertise integration test
* fix(linux-node): map geoclue access-denied to LOCATION_DISABLED; floor camera maxWidth to avoid zero-height scale
* fix(linux-node): clamp small camera maxWidth to 2 instead of default
* docs(linux-node): clarify where-am-i -t is a process timeout, not update throttle
* refactor(gateway): extract legacy-node filter + rejection hint to fit LOC ratchet; docs-map + deadcode baseline
* fix(gateway): drop now-unused DEFAULT_DANGEROUS_NODE_COMMANDS import after hint extraction
* test(node-host): drop imports orphaned by removed error-code test
* fix(terminal): harden node PTY relay and terminal session lifecycle
Pin node relay invokes to the authorized node connection (ROUTE_CHANGED
guard), stop node-side input writes to settled/dead PTYs, finalize
sessions on resize failure like write failure, keep surrogate pairs
intact across scrollback and relay prelude truncation, bound the relay
pre-registration output buffer, and buffer Control UI keystrokes typed
while terminal.open/attach is in flight so slow node-relay opens no
longer drop input. Correct the terminal.data seq doc to its real
contract and pin seq monotonicity, seq-gap bounds, input coercion, and
runner event routing with new tests.
* refactor(terminal): extract startup input buffer and fix CI findings
Move Control UI startup input buffering into terminal-startup-input.ts
(LOC budget), drop a stale session-manager comment, remove a map
spread, and fix test typings for event frames and typed mock access.
* refactor(channels): deprecate the never-consumed group intro hint adapter
* chore(channels): compress the intro-hint deprecation note to satisfy the size ratchet
* fix(skills): link globally-installed ClawHub skills via managed lockfile
buildWorkspaceSkillStatus read the ClawHub lockfile only from the workspace
dir, so globally-installed skills (source "openclaw-managed", tracked in the
managed lockfile at <dirname(managedSkillsDir)>/.clawhub/lock.json) were
falsely reported as "not tracked by the workspace ClawHub lockfile". Resolve
openclaw-managed skills against the managed lockfile and managed parent dir
so the link status and expected-install-dir check match. Workspace-local
skills are unchanged.
Closes#105530
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(skills): make ClawHub lockfile diagnostics scope-aware
resolveClawHubSkillStatusLinkSync hardcoded "workspace ClawHub lockfile" in
its invalid-path diagnostics, so a globally-managed skill (checked against
the managed lockfile) still got a misleading "workspace" troubleshooting
message. Add an optional lockfileScope ("workspace" | "managed") and use it
in the diagnostics; buildSkillStatus passes "managed" for openclaw-managed
skills. Extends the managed missing-entry regression test to assert the
managed diagnostic.
Addresses ClawSweeper [P2] review finding on #106479.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(skills): relabel managed-lockfile diagnostics from status.ts
Compute the managed-lockfile diagnostic relabel in status.ts instead of
threading a scope parameter through clawhub.ts. clawhub.ts is an oversized
legacy module under the check:loc ratchet ('oversized legacy files may not
grow'), so the prior +8 net lines tripped checks-fast-loc-ratchet. Behavior
is unchanged: globally-managed skills still surface 'managed ClawHub
lockfile' diagnostics.
* fix(skills): strengthen managed ClawHub status linkage
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>