Commit Graph

66940 Commits

Author SHA1 Message Date
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
Vincent Koc
7de8c1ab1c perf(ci): balance compact whole test jobs 2026-07-11 21:29:40 +08:00
Peter Steinberger
fe261b0f59 chore(tooling): typecheck root test/** with a dedicated tsgo lane (#104475)
* chore(types): add declaration files for scripts/lib and scripts/e2e modules

* chore(types): add declaration files for top-level script modules (a-m)

* chore(types): add declaration files for top-level script modules (n-z)

* test: use a non-secret-shaped gateway token fixture

* test: type ci workflow guard helpers for the root test lane

* chore(tooling): typecheck root test/** with a dedicated tsgo lane

- test/tsconfig/tsconfig.test.root.json: root-test program (strict unused checks,
  fixtures excluded; two Docker E2E clients that import built dist/** stay out,
  same rationale as the scripts/e2e exclusion in tsconfig.scripts.json)
- tsgo:test:root wired into tsgo:test, check:test-types, scripts/check.mjs, and
  the ci.yml test-types shard, mirroring the tsgo:scripts lane (#104348)
- changed-lane routing: test/**/*.ts (excluding fixtures) and the lane tsconfig
  now trigger 'typecheck test root' in check:changed; previously test/ paths ran
  lint only, so harness type errors surfaced first in CI (#104287 envDir case)
- burn down all 1071 latent type errors in the program: precise param/local
  types across test/scripts, test/vitest, test/e2e, and transitive scripts/e2e
  program members; 205 sibling .d.mts declaration files for imported .mjs
  modules (committed separately); zero any, zero ts-expect-error
- resolve the pre-existing testing star-export ambiguity in
  scripts/e2e/parallels/common.ts with an explicit re-export

Closes #104388

* chore(types): correct declaration fidelity per structured review

- re-derive 51 .d.mts files from implementation data flow instead of
  initializers: fix a wrong never return (runTestProjectsDelegation returns
  the child), add encoding-sensitive exec/spawn overloads (plain-gh), restore
  the full release profile union, make parsed paths string | null, add missing
  parseArgs fields via help/non-help unions, add a missing sibling declaration
  (budget-number-args), drop 15 unused lint directives
- precise install-record/tuple typing removes the type-aware oxlint
  regressions the first declarations caused in scripts/e2e implementations
- route .mts declaration edits under test/ to the testRoot lane and reference
  the test-root project from tsconfig.projects.json so tsgo:all covers it
  (closes both review findings against the lane wiring)

* chore(scripts): keep telegram runner dist typing structural for the boundary guard

* chore(types): declare runtime pack and gateway readiness exports added on main

* test: pin the importTargetPlan form of the plugin-contract plan import

The guard expectation still referenced the raw await import( form that
7ae5996bb3 (#103975) replaced with the importTargetPlan fallback helper;
the assertion fails on current main.
2026-07-11 06:15:41 -07:00
Peter Steinberger
e681646834 feat(cloud-workers): add crabbox worker provider plugin and profile-aware lease lifecycle (#104465)
* feat(cloud-workers): add Crabbox worker provider

* docs(cloud-workers): document Crabbox profiles

* chore(cloud-workers): drop changelog entry (release-only file)

* refactor(plugin-sdk): pass profiles to worker lease lifecycle

* docs(plugin-sdk): document worker lifecycle profiles

* chore(docs): regenerate plugin inventory, docs map, and sdk baseline after rebase

* fix(cloud-workers): state crabbox key-ref gap without warning-comment suppressions
2026-07-11 05:51:56 -07:00
qingminlong
a66d2959e9 fix(onboard): wait for gateway warnings before installing service (#104173)
* fix(onboard): wait for gateway warnings before installing service

* fix(onboard): show gateway warnings after plan errors

* refactor(onboard): drain install warnings from queue

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 05:49:34 -07:00
Peter Steinberger
3f33f0bb5f refactor(qqbot): adopt core typing keepalive loop with budget accounting intact (#104438)
* refactor(channels): adopt core typing keepalive loop

* chore(plugin-sdk): pin surface budget for typing keepalive re-export
2026-07-11 05:48:33 -07:00
Peter Steinberger
7ae5996bb3 fix(ci): validate older release targets (#103975)
* fix(ci): support older release targets

* fix(ci): guard optional channel contracts

* fix(ci): scope legacy release compatibility
2026-07-11 05:44:49 -07:00
qingminlong
02560243f3 fix(agents): truncate multibyte middleware details at byte limit (#104156)
* fix(agents): bound multibyte middleware details by bytes

* refactor(agents): bound middleware detail byte sizing

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 05:39:50 -07:00