Commit Graph

67697 Commits

Author SHA1 Message Date
Peter Steinberger
b6e95201f8 fix(cron): retain detached manual run admission (#104595) 2026-07-11 10:36:26 -07:00
Peter Steinberger
a5aa7bc670 fix(ui): contain the native session sidebar and truncate its rows (#104587)
The Codex/Claude sidebar sections leaked long titles across the row
timestamps and past the sidebar edge because the row body was never a
flex container, so the title span stayed inline and ellipsis rules did
not apply. The sections also rendered every loaded session (Codex swept
up to 100 catalog pages per host every 30s) with no height cap, growing
past the sidebar shell and painting over the footer.

Rows now reuse the regular session-row __text anatomy so titles
ellipsize, the sidebar renders only the newest 10 sessions per host
with a derived truncation note (the full catalog stays on the sessions
page), each section shrinks and scrolls inside the sidebar body, and
the shell body clips as a final guard. The sidebar full-catalog
hydration loop and the one-off __body class are deleted.

Formatting proof: oxfmt --check clean on changed files via Testbox
tbx_01kx92cwpr1x9ccp2fgn441y8h (local hook skipped: no node_modules).

Fixes #104584
2026-07-11 10:33:32 -07:00
Peter Steinberger
de8cfd2bf2 test(slack): delivery trace goldens for buffered native streaming and block finals (#104583) 2026-07-11 10:32:54 -07:00
Peter Steinberger
444d7dfb1a test(telegram): delivery trace goldens for the edit-preview lifecycle (#104581) 2026-07-11 10:31:46 -07:00
Peter Steinberger
e686693732 feat(tooling): adopt noUncheckedIndexedAccess via a strict-ratchet lane (phase 1) (#104577)
* feat(tooling): add noUncheckedIndexedAccess strict-ratchet lane

* fix(packages): make indexed access explicit across ratchet packages

Burns down all 65 noUncheckedIndexedAccess errors in the seven ratchet
packages with behavior-identical restructuring (iteration, charAt/slice,
regex-group guards, validated hextet tuple). net-policy invariant
violations now throw instead of failing open. Adds
@openclaw/normalization-core/expect (expectDefined/first/last) with
subpath export and tests. memory-host-sdk fixes kept but the package
stays out of the lane: it re-exports core src/** so the flag would apply
transitively to all of core.

* fix(lint): keep .oxlintrc.json strict-JSON parseable for extension lint wrappers
2026-07-11 10:26:12 -07:00
Peter Steinberger
96f0983a85 fix(onboarding): skip setup for configured gateways and require inference first (#102883)
* fix(crestodian): keep onboarding RPCs restart-safe

* fix(profiles): isolate approval state migrations

* fix(crestodian): bypass configured gateway setup

* test(crestodian): type onboarding mocks

* fix(onboarding): require inference before Crestodian

* fix(onboarding): enforce verified inference handoff

* fix(macos): reset setup on gateway endpoint edits

* chore(i18n): refresh native source inventory

* fix(gateway): keep socket on request cancellation

* test(packaging): require workspace templates

* fix(onboarding): bind setup to verified inference

* fix(onboarding): align inference gate contracts

* fix(crestodian): classify concurrent policy rejection

* test(crestodian): expect registry restoration

* fix(onboarding): bind setup to configured gateways

* fix(codex): preserve startup phase deadlines

* test(crestodian): match fail-closed policy ordering

* test(onboarding): assert bound gateway handoff

* fix(codex): bind runtime resolution to spawn cwd

* test(crestodian): assert policy rejection order

* fix(cli): preserve gateway routing across restarts

* fix(macos): fail closed during gateway edits

* test(macos): cover gateway route generation races

* chore: keep release notes out of onboarding PR

* fix(ci): refresh onboarding generated checks

* style(swift): align gateway channel formatting

* fix(ci): refresh plugin SDK surface budgets

* fix(ci): resync native string inventory

* refactor(swift): split gateway channel support

* test(doctor): isolate plugin compatibility registry

* test(macos): isolate gateway onboarding fixtures

* test(macos): assert gateway lease health ordering

* fix(codex): reconcile computer-use startup changes
2026-07-11 10:25:14 -07:00
Peter Steinberger
fa0546b993 fix(ui): stop chat welcome suggestion text overflowing chips on phones (#104579)
The mobile single-column override for the welcome suggestion grid sat before
the base two-column rules with equal specificity, so it never applied; iPhone
WebKit views also inflate text via font boosting because text-size-adjust was
never locked, letting labels paint outside the chips. Move the override after
the base rules, lock text-size-adjust at the root, and harden chip wrapping
(line-height, balance, break-word).
2026-07-11 10:24:11 -07:00
Peter Steinberger
702ba19e3a test(msteams): delivery trace goldens for native append streaming (#104573) 2026-07-11 10:18:49 -07:00
Peter Steinberger
49b5b862ac feat: node-hosted plugins — dynamic tools, MCP servers, and skills (#90431)
* feat: node-hosted plugins — dynamic tools, MCP servers, and skills

Nodes become declarative plugin hosts:
- node.pluginTools.update: node hosts publish plugin-registered agent tool
  descriptors; gateway materializes them as agent tools executing via
  node.invoke under the node command allowlist, with tools.effective
  invalidation and node online/offline removal.
- Trusted paired-node descriptors: no gateway-side plugin registration
  required; gateway.nodes.pluginTools.enabled off-switch (default on);
  description/count caps; deterministic node-prefixed collision names.
- Declarative node-hosted MCP: nodeHost.mcp.servers (McpServerConfig shape)
  starts MCP clients on the node host, publishes tools as pluginId node-mcp,
  executes via built-in mcp.tools.call.v1 with per-layer timeouts, failure
  isolation, and orphan-safe shutdown. No re-pairing when servers change.
- Node-hosted skills: node.skills.update publishes ~/.openclaw/skills
  content (64 skills/64KB/512KB caps both sides); gateway merges them into
  the skills snapshot while connected and exec host=node is available, with
  node:// locators, node-prefixed collisions, disabled command dispatch,
  and gateway.nodes.skills.enabled + nodeHost.skills.enabled switches.
- Security: node-supplied pluginIds cannot satisfy pluginId-scoped tool
  allowlists unless gateway-registered; reserved node-mcp id requires the
  core MCP descriptor shape; protocol registry kept out of public
  plugin-sdk dts.
- E2E: pond harness proves publication, MCP round-trip, skills locator, and
  disconnect/reconnect for all three surfaces.

* style: format node-plugin-tools test

* fix(skills): keep status loader unfiltered when eligibility is passed

skills.status started passing eligibility for the node-skill merge, which
flipped loadWorkspaceSkillEntries into filtered mode and dropped disabled
skills from status reports (QA plugin-lifecycle-hot-reload timeout). Status
now merges node skills explicitly around an unfiltered load. Also: regen
docs_map for new node docs sections; add the intentional node-host MCP
onclose suppression to the lint-suppression allowlist.
2026-07-11 10:16:34 -07:00
qingminlong
fdf5812817 fix(file-transfer): reject oversized inline file writes before node dispatch (#104556)
* fix(file-transfer): cap inline file write payloads

* fix(file-transfer): validate inline base64 before decoding

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 10:16:22 -07:00
qingminlong
f348b291bc fix(workboard): scope default positions by board (#104410) 2026-07-11 10:16:18 -07:00
Peter Steinberger
e5578f6652 feat(ui): overlay hover meta and even out chat thread rhythm (#104201)
* feat(ui): overlay hover meta and even out chat thread rhythm

* fix(ui): keep the overlay footer single-line so it fits the rhythm gap

* fix(ui): wrap the revealed footer in narrow lanes and gate hidden-overlay hit-testing

* test(ui): travel through the group before hovering pointer-gated footers

* fix(ui): keep the streaming footer sender and time on one shrinkable row
2026-07-11 10:15:28 -07:00
Peter Steinberger
0a10b1408a fix(docs): preserve third-party UI labels in translations 2026-07-11 13:13:50 -04:00
Peter Steinberger
60c6960168 fix(macos): add breathing room between dashboard titlebar buttons (#104572) 2026-07-11 10:12:14 -07:00
qingminlong
183139f3ed fix(nodes): reject malformed media payloads when base64 is invalid (#104414)
* fix(nodes): reject malformed media base64 payloads

* fix(nodes): keep media base64 size preflight

* refactor(nodes): reuse shared base64 boundary

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

* docs(changelog): note node media validation

* chore: leave changelog to release automation

* test(nodes): cover empty invalid media payloads

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 10:11:09 -07:00
NIO
58ef98ec13 fix(agents): keep scp stderr tail UTF-16 safe end-to-end (#104148)
Co-authored-by: NIO <nocodet@mail.com>
2026-07-11 13:07:12 -04:00
NIO
a498fc511e fix(file-transfer): keep bounded stderr tail UTF-16 safe end-to-end (#104151)
Co-authored-by: NIO <nocodet@mail.com>
2026-07-11 13:06:17 -04:00
NIO
ab9a1c9a84 fix(voice-call): use sliceUtf16Safe for bounded child output tail cap (#104260)
Co-authored-by: NIO <nocodet@mail.com>
2026-07-11 13:05:16 -04:00
Yuval Dinodia
68c18caca0 fix(node-pairing): require operator.admin to approve browser.proxy nodes (#104491)
Approving a node whose pairing surface advertises browser.proxy only required
operator.write, while invoking browser.proxy already requires operator.admin
(server-methods/nodes.ts). resolveNodePairApprovalScopes bumped the approval
scope to operator.admin only for NODE_SYSTEM_RUN_COMMANDS, so a write-scoped
operator could trust a browser.proxy-capable node that later routes bundled
browser-tool traffic. Add NODE_BROWSER_PROXY_COMMAND to the admin-approval set
so approval scope matches the invoke-time gate.
2026-07-11 09:58:00 -07:00
qingminlong
834c146958 fix(browser): reject hex click coordinates in act route (#104440)
* fix(browser): reject hex click coordinates in act route

* refactor(browser): use route parser for click coordinates

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 09:56:09 -07:00
Peter Steinberger
7ef22875ad fix(slack): preserve canonical block receipts (#104563) 2026-07-11 09:51:02 -07:00
Peter Steinberger
bc239a8516 fix(ci): handle missing temp report merge base (#104557) 2026-07-11 09:44:19 -07:00
NIO
8cf88bfa12 fix(plugins): bound hosted catalog feed reads on non-streaming responses (#101000)
Co-authored-by: NIO <nocodet@mail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-11 12:41:51 -04:00
Peter Steinberger
57af2bbff0 fix: clear remaining release validation blockers (#104555)
* test: align provider tool call lifecycles

* test: isolate plugin install repair migrations

* fix: accept catalog temperature compatibility

* fix: disable GPT-5.6 tool reasoning on completions

* style: avoid shadowed stream model
2026-07-11 09:32:16 -07:00
Peter Steinberger
5ca46a6554 feat(cloud-workers): pinned SSH tunnel runtime and provider-owned key resolution (#104553)
* feat(cloud-workers): add pinned SSH tunnel runtime

* feat(crabbox): resolve cloud worker SSH identities

* docs(cloud-workers): document SSH tunnel contracts
2026-07-11 09:26:08 -07:00
Peter Steinberger
934a974c29 feat(slack): support native data visualizations (#104539) 2026-07-11 09:18:39 -07:00
Kevin Lin
b769964e82 feat(codex): support workspace-directory plugins (#104188)
* feat(codex): support workspace directory plugins

* fix(codex): contain workspace catalog failures

* chore(config): refresh documentation baseline
2026-07-11 09:04:55 -07:00
Peter Steinberger
4271b82fd1 test: align plugin prerelease expectations (#104542)
* test: align plugin prerelease expectations

* style: format browser doctor test
2026-07-11 09:00:56 -07:00
Ayaan Zaidi
4b33199a65 refactor(agents): converge run staleness policy onto diagnostic activity owner
One RUN_STALE_TAKEOVER_MS constant and one resolveRunStaleThresholdMs in
diagnostic-run-activity.ts replace the hand-paired constants and duplicated
blocked-tool-floor derivations in the reply and embedded run registries.
Thresholds are byte-identical before and after; zero behavior change.

Part of #104219 (seam 4).
2026-07-11 20:59:37 +05:30
Peter Steinberger
c3b426f280 feat: add Claude session fleet (#104528)
* feat: add Claude session fleet

* chore: leave release notes to release automation

* chore: refresh generated catalogs

* fix: satisfy session catalog lint gates
2026-07-11 08:22:59 -07:00
Peter Steinberger
03cab29505 feat(cloud-workers): worker bundle production, pinned SSH bootstrap, and admission handshake (#104532)
* feat(gateway-protocol): add worker admission handshake

* feat(cloud-workers): build and bootstrap worker bundles

* feat(cloud-workers): wire bootstrap lifecycle

* fix(cloud-workers): state host-key TOFU fallback without warning-comment suppression

* test(cloud-workers): assemble host-key fixture to satisfy review secret scanner

* test(cloud-workers): assemble redaction fixture to satisfy review secret scanner

* fix(cloud-workers): require pinned SSH host keys

* fix(state): add ssh_host_key to additive worker_environments migration
2026-07-11 08:14:30 -07:00
Ayaan Zaidi
f506070188 improve(ci): shorten compact PR test critical path (#104508)
* perf(ci): rebalance compact PR test jobs

* fix(ci): preserve compact whole-job timeout
2026-07-11 20:32:59 +05:30
Vincent Koc
b3136854f0 chore(autoreview): align org review defaults (#104343)
* docs(autoreview): sync canonical review policy

* fix(autoreview): sync isolated review runtime

* test(autoreview): sync hardening coverage

* fix(autoreview): sync final isolation hardening

* test(autoreview): sync final isolation coverage

* fix(autoreview): sync final input hardening

* test(autoreview): sync final hardening coverage

* fix(autoreview): sync reviewer trust hardening

* test(autoreview): sync fallback coverage

* test(autoreview): sync boundary coverage

* docs(autoreview): align runtime contracts

* fix(autoreview): reject unbundled gitlinks

* test(autoreview): cover final trust guards

* feat(autoreview): accept max Codex reasoning
2026-07-11 22:49:50 +08:00
clawsweeper[bot]
1b6393c51e fix (Computer Use) Stabilize Codex Computer Use readiness (#103331)
* fix (Computer Use) Stabilize Codex Computer Use readiness

Co-authored-by: Ben Badejo <188106718+bdjben@users.noreply.github.com>

* fix (Computer Use) Stabilize Codex Computer Use readiness

* fix (Computer Use) Stabilize Codex Computer Use readiness

* fix (Computer Use) Stabilize Codex Computer Use readiness

* fix(clawsweeper): address review for automerge-openclaw-openclaw-103331 (1)

* fix (Computer Use) Stabilize Codex Computer Use readiness

---------

Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Ben Badejo <188106718+bdjben@users.noreply.github.com>
2026-07-11 09:42:27 -05:00
LZY3538
72aa3f1bcf fix(cron): allow silent scheduled runs (#95725)
* fix(cron): pass allowEmptyAssistantReplyAsSilent from cron executor

Intentionally-silent cron jobs (alert watchers that say nothing unless there
is something to report) fail with FailoverError "empty_response" because the
allowEmptyAssistantReplyAsSilent flag is only computed for DM/group chat
contexts — the cron executor never sets it.

Instead of patching the shared CLI runner with a lane substring heuristic,
set allowEmptyAssistantReplyAsSilent: true at the cron executor level for
both the CLI and embedded runner paths. This:
- Owns the silent-empty policy at the correct boundary (the cron executor)
- Covers both runner paths uniformly
- Does not broaden the shared CLI empty-response guard for non-cron callers

Fixes #94224

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

* test(cron): add regression test for allowEmptyAssistantReplyAsSilent flag propagation

Verify that the cron executor passes allowEmptyAssistantReplyAsSilent: true
to both runCliAgent and runEmbeddedAgent calls. The embedded test uses
mockTexts: [""] to truly exercise empty output, and the CLI test mocks
runCliAgent with empty payload text — both scenarios require the flag to
avoid empty_response errors on intentionally-silent cron watchers.

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

* refactor(cron): centralize silent reply policy

Reuse existing executor suites and keep CLI and embedded cron runners aligned.

Co-authored-by: 刘镇业 0668001127 <liu.zhenye@xydigit.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 07:38:53 -07:00
Peter Steinberger
ae12413ee2 chore(tooling): enforce no-floating-promises and drop DOM globals from Node-side typechecking (#104422)
* chore(lint): enforce no-floating-promises repo-wide

* feat(tooling): split DOM globals out of the Node-side typecheck program

tsconfig.core.json now compiles src/ + packages/ with lib ES2023; new
tsconfig.ui.json owns ui/ with DOM. Web-global names used by Node code
alias to canonical undici/stream-web types; highlight.js loads through a
validated narrow API because its d.ts force-includes lib.dom. Boundary,
sparse-guard, changed-lane routing, and profile lanes cover the new ui
graph.

* chore(deps): declare undici-types and teach knip about the highlight.js runtime require

* ci: retrigger dropped pull_request synchronize event

* refactor(types): derive web-global aliases from @types/node fetch globals, drop undici-types dep

* ci: retrigger after dependency guard cleared

* fix(scripts): add ui lane to changed-lanes declaration union
2026-07-11 07:28:20 -07:00
mushuiyu886
13817a6108 fix(agents): preserve UTF-16 boundaries in context pruning (#104404)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-11 22:26:21 +08:00
xingzhou
f73c5541fe fix(agents): cancel pending bundle LSP requests (#104110)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-11 22:02:43 +08:00
Peter Steinberger
ba826be268 test(channels): delivery trace harness with feishu and mattermost goldens (#104478) 2026-07-11 06:49:27 -07:00
Yuval Dinodia
97d57a2662 fix(clawhub): reject mutable GitHub skill refs (#97157)
* fix(clawhub): reject mutable GitHub skill refs

Co-authored-by: yetval <yetvald@gmail.com>

* chore: keep release notes in PR metadata

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 06:42:35 -07:00
Peter Steinberger
325679a335 fix: reuse built control UI for live Mac updates (#104482)
* fix: reuse built control UI for live Mac updates

* fix: pin live updater Mac build inputs
2026-07-11 06:36:42 -07:00
Peter Steinberger
fa77fe10d5 chore: migrate active GPT-5.5 references to GPT-5.6 (#104452)
* chore(models): migrate active GPT-5.5 references

* test(workboard): expect GPT-5.6 Sol default

* chore: keep release notes in PR body

* test(models): align picker fixtures with Sol default

* test: update PDF default model expectation

* test(qa): migrate thinking smoke to Luna

* test(gateway): align mock catalog with Sol default

* ci: retrigger exact-head PR checks

* test(gateway): document default catalog invariant
2026-07-11 06:30:57 -07:00
Vincent Koc
b4c6ee21e3 test(ci): preserve compact tooling docker coverage 2026-07-11 21:29:40 +08:00
Vincent Koc
89bde4ea79 test(plugin-sdk): stabilize catalog timeout assertion 2026-07-11 21:29:40 +08:00
Vincent Koc
794a1671b1 test(ci): isolate unit fast config probe 2026-07-11 21:29:40 +08:00
Vincent Koc
82e0867752 test(ci): update plugin contract fallback assertion 2026-07-11 21:29:40 +08:00
Vincent Koc
fc1a793ea0 docs(ci): document compact tooling fanout 2026-07-11 21:29:40 +08:00
Vincent Koc
e8c83ac0b4 test(ci): prove compact tooling coverage 2026-07-11 21:29:40 +08:00
Vincent Koc
02045aa384 perf(ci): shard compact tooling tests 2026-07-11 21:29:40 +08:00
Vincent Koc
125d7a94ca test(ci): lock balanced whole shard packing 2026-07-11 21:29:40 +08:00