Peter Steinberger
a741f5b8ae
refactor(mcp): centralize tool filter policy ( #124739 )
2026-08-16 11:51:23 -07:00
Peter Steinberger
4d872fbfbc
feat(nodes): expose installed worker bundle status ( #124640 )
...
* feat(nodes): expose installed worker bundle status
* perf(nodes): defer bundle status validation
* fix(nodes): tighten bundle status type contracts
* docs(gateway): document node worker bundle status
* refactor(gateway): split runner inventory runtime
* test(ui): keep healthy device status quiet
* fix(ui): preserve steer target ordering
* test(ui): isolate catalog handoff lifecycle
2026-08-16 10:04:46 -07:00
Peter Steinberger
146350f417
fix(nodes): keep MCP calls within the published catalog ( #124652 )
...
* fix(nodes): align MCP calls with published catalog
* chore(tests): shrink assertion safety baseline
2026-08-16 08:20:09 -07:00
Peter Steinberger
18d130fc1b
fix(workers): bound node bundle retention ( #124590 )
...
* fix(workers): bound node bundle retention
* docs(runners): track bundle retention
2026-08-16 06:25:05 -07:00
Peter Steinberger
dbad5e385d
refactor(workers): separate runner consent from capacity ( #124356 )
...
* refactor(workers): separate runner inventory state
* docs(runners): track inventory cleanup
* test(workers): use bundle-only launch wire
* test(workers): update optional inventory fixture
* test(workers): validate prewarm inventory capability
* fix(workers): version runner inventory cutover
2026-08-16 04:46:38 -07:00
Peter Steinberger
f19f62cb77
perf(node-host): prewarm worker bundles ( #124427 )
...
* perf(node-host): prewarm worker bundles
* test(gateway): gate worker finalization responsiveness
* fix(node-host): negotiate bundle prewarming
* fix(protocol): refresh worker prewarm models
* fix(node-host): preserve prewarm upgrade compatibility
2026-08-16 00:41:42 -07:00
Peter Steinberger
78502eda6d
feat(workers): run device sessions from Gateway bundles ( #124037 )
...
* feat(workers): run device sessions from Gateway bundles
Install the current Gateway bundle before a device environment becomes ready, verify it at attach and tunnel boundaries, launch only from the immutable namespaced bundle directory, and retire stale environments for idempotent reprovisioning. Remove the local execution mode and preserve the node-local build claim only as temporary inventory metadata for the final projection/cleanup slice.
* docs(runners): record Gateway bundle cutover
* test(ci): repair runner validation fixtures
# Conflicts:
# src/scripts/test-projects.test.ts
* fix(workers): surface outdated node recovery
Keep legacy runner inventory diagnostic-only while exposing the update-and-reconnect action through node, environment, provider, placement, and Control UI surfaces.
* fix(workers): reject legacy inventory with recovery
* fix(workers): bundle worker deploy closure
* test(workers): close bundle cutover gates
* fix(workers): compose browser runtime at build
* fix(workers): satisfy bundle cutover gates
* fix(workers): route temp runtime through infra
* docs(workers): align bundle host guidance
* fix(ui): fence outdated session destinations
2026-08-15 17:46:44 -07:00
Josh Lehman
9663cc7edc
fix: keep status read-only while gateway owns state ( #124142 )
2026-08-15 07:21:19 -07:00
Peter Steinberger
079bb34196
feat(cua-computer): recording family with host-owned resource handles ( #124035 )
...
* feat(cua-computer): add recording resource handles
* test(agents): split computer tool coverage
2026-08-15 00:14:13 -07:00
Peter Steinberger
7bb3909e4b
fix(workers): clean stale bundle install staging ( #124057 )
...
Serialize node worker installs per Gateway namespace so a later bundle hash reclaims interrupted staging from older hashes instead of leaking it indefinitely.
2026-08-14 23:47:42 -07:00
Peter Steinberger
53074ae91a
feat(workers): install Gateway bundles on nodes ( #123985 )
...
* feat(workers): install Gateway bundles on nodes
Add a private paired-channel install command backed by a one-use Gateway HTTP capability, bounded archive validation, script-disabled dependency materialization, and atomic gateway-namespaced publication. Existing device provisioning remains on the local-build path until the next cutover slice.
* docs(runners): record node bundle installer
2026-08-14 20:52:39 -07:00
Peter Steinberger
aec8096bbc
refactor(gateway): remove obsolete worker test seams ( #123970 )
2026-08-14 20:30:34 -07:00
Peter Steinberger
d913796112
fix(runners): preserve node workspaces across restarts ( #123889 )
...
* fix(runners): retain node workspaces from gateway state
* docs(plan): record authoritative node retention
2026-08-14 16:59:19 -07:00
Peter Steinberger
afb3b9defb
fix(worker): surface gateway admission failures ( #123773 )
...
* fix(worker): surface admission retry failures
* fix(worker): ignore cancellation connection errors
2026-08-14 13:29:36 -07:00
Peter Steinberger
15bf43fe19
fix(node-host): prevent false TLS mismatch after turns ( #123790 )
...
* fix(node-host): avoid resumed TLS pin mismatches
* test(node-host): cover pinned replacement sockets
* fix(node-host): preserve proxy routing for pinned transfers
* test(node-host): type proxy tunnel cleanup generically
2026-08-14 13:05:28 -07:00
Peter Steinberger
d9211bf14d
fix(runners): bound node workspace disk growth ( #123700 )
...
* fix(runners): prune superseded node workspaces
* docs(plan): record node retention progress
* fix(runners): drain workspace retention backlogs
* test(runners): await workspace retention cleanup
2026-08-14 08:27:59 -07:00
Peter Steinberger
bbca520108
refactor(runners): prune terminal launch receipts ( #123641 )
...
* refactor(runners): prune terminal launch receipts
* perf(runners): index launch receipt expiry
2026-08-14 05:49:55 -07:00
Peter Steinberger
38379a9a2e
feat(runners): enforce node worker capacity ( #123612 )
...
* feat(runners): enforce node worker capacity
* test(node-host): mock supervisor initialization
* fix(runners): surface capacity exhaustion
2026-08-14 04:49:47 -07:00
Peter Steinberger
d19c7553dd
feat(computer-use): computer.act v2 action contract with capability-filtered tool ( #123544 )
...
* feat(computer-use): computer.act v2 action contract with capability-filtered tool
* fix(computer-use): break contract import cycle, bound model-visible elements, regen swift protocol
* test(computer-use): satisfy curly rule in schema-cap helpers
* fix(computer-use): satisfy type-aware lint on contract and tool
* test(gateway-protocol): keep connect-params suite under the line cap
2026-08-14 02:40:56 -07:00
Peter Steinberger
8a3964f87c
fix: node workspace transfers fail after successful turns ( #123564 )
...
* fix(node-host): preserve TLS transfer failures
* fix(node-host): clean transfer backpressure listeners
* fix(gateway): explain node workspace sync paths
2026-08-14 01:51:42 -07:00
Peter Steinberger
7cadfb0bd6
fix: speed up local node launches and isolate scratch state ( #123503 )
...
* perf(node-host): reuse advertised worker build identity
* fix(agents): keep default workspaces inside state dir
* fix(plugins): package llama.cpp private SSRF runtime
* fix(node-host): silence missing skills directory
2026-08-13 23:24:54 -07:00
Peter Steinberger
860aeed8f6
feat(gateway): transfer node worker workspaces ( #123280 )
...
* feat(gateway): transfer node worker workspaces
* fix(gateway): harden node workspace transfer
* fix(gateway): isolate transfer HTTP contract
* fix(gateway): trim transfer HTTP exports
2026-08-13 21:00:44 -07:00
Peter Steinberger
438d035885
feat(gateway): launch workers on paired nodes ( #123157 )
...
* feat(gateway): launch workers on paired nodes
* docs(plan): track node worker launch wire
* fix(runners): restore node workspace ownership
Rehydrate durable workspace bindings after Gateway restart, fence timed-out node tunnel starts, and refuse incomplete clone fallback for submodule and Git LFS workspaces.
* test(runners): isolate node launch fixtures
2026-08-13 18:02:18 -07:00
Peter Steinberger
6c9916a48a
feat(runners): publish atomic device runner inventory ( #123094 )
...
* feat(runners): publish atomic node inventory
# Conflicts:
# docs/.generated/plugin-sdk-api-baseline/agent-harness-runtime.json
# src/gateway/server-methods/environments.ts
# src/gateway/worker-environments/device-provider.test.ts
* fix(runners): refresh topology on inventory removal
* fix(runners): resolve session host type overlap
* fix(protocol): document mobile runner inventory event
* fix(runners): project authoritative session host state
* docs(nodes): clarify prepared session host status
2026-08-13 04:54:26 -07:00
Peter Steinberger
7a4b5a0a41
feat(gateway): provision paired node session hosts ( #122966 )
...
* feat(gateway): provision paired node worker installs
* docs: record node local-install PR chain
* chore(protocol): regenerate node worker manifest models
* fix(gateway): resolve node worker build through the device runtime
Repairs a rebase artifact: startup referenced a stale deviceNodeRegistry
binding; the device runtime now owns the connected-node lookup via
resolveWorkerBuild.
2026-08-13 01:56:19 -07:00
Peter Steinberger
3f4d89505a
feat(worker): expose supervised terminal outcomes ( #123013 )
...
* feat(worker): expose supervised terminal outcomes
* docs(plan): track supervisor terminal outcomes
2026-08-12 22:19:49 -07:00
Peter Steinberger
5e67beb02e
feat(node-host): add negotiated private worker controls ( #122939 )
...
* feat(node-host): add private worker supervisor controls
* refactor(node-host): harden private worker controls
* refactor(node-host): simplify private worker controls
* docs(plan): track private worker controls
* fix(node-host): satisfy private control CI guards
* test(gateway): follow worker service construction boundary
* test(gateway): register private control release train
* fix(gateway): retain worker dialect across reapproval
2026-08-12 21:27:01 -07:00
Peter Steinberger
be600d0a24
fix: restore Telegram release isolation checks ( #122843 )
...
* fix(release): repair isolated Telegram QA runtime
sticky runner/SUT suite root permits config locks without config replacement; add PS1 after attested env verification for nested login shells.
* test(node-host): own desktop teardown resets
2026-08-12 16:21:45 -07:00
Peter Steinberger
6b9bea84f0
feat(node-host): supervise durable worker launches ( #122829 )
...
* feat(node-host): add worker launch supervision
* fix(node-host): harden worker lifecycle ownership
* fix(node-host): harden worker execution boundary
* fix(node-host): preserve worker trust settings
* chore(plugin-sdk): refresh worker lifecycle baselines
* docs(plan): track runner implementation slices
* test(node-host): await runtime shutdown owner
2026-08-12 15:24:05 -07:00
Peter Steinberger
0c824f09d5
feat(gateway): observe paired node desktops ( #122724 )
...
* feat(gateway): stream paired node desktops
* chore(protocol): refresh desktop observe model
* fix(gateway): preserve desktop stream boundaries
* fix(gateway): keep desktop streams lifetime-bound
* fix(gateway): harden node desktop stream lifecycle
* fix(gateway): stabilize node desktop lifecycle setup
* chore(plugin-sdk): refresh API baselines
2026-08-12 13:17:45 -07:00
Peter Steinberger
ade3456dd4
feat: add one-paste node onboarding ( #122499 )
...
* feat(pairing): add short join onboarding
* fix(gateway): isolate device join routing tests
2026-08-12 06:17:39 -07:00
Peter Steinberger
d44f70eb4b
feat(pairing): one-paste device pairing via oc-pair setup links ( #120768 )
...
* feat(pairing): one-paste device pairing via oc-pair setup links
Implements milestone 3 from docs/plan/runners.md.
* fix(pairing): sign bootstrap handshake, keep URL candidates, wire pairing countdown
* test(gateway): update client callsite guard
* fix(pairing): preserve setup URL context paths
* fix(ui): keep pairing help aligned with setup mode
* fix(pairing): isolate bootstrap credentials
* perf(ui): keep one-paste pairing within bundle budget
* refactor(pairing): isolate native pair URL prefix parsing
* fix(pairing): preserve candidate lifecycle state
* fix(pairing): retire shared credentials after bootstrap
* fix(pairing): apply rotated manifest through client owner
* test(pairing): prove bootstrap retirement across reconnect
* fix(pairing): preserve native gateway context paths
* fix(pairing): carry native context paths through reconnect
* fix(ios): preserve encoded gateway context path
* chore(plugin-sdk): refresh pairing API baselines
2026-08-12 02:01:33 -07:00
Peter Steinberger
3d76246792
refactor: eliminate final export name collisions ( #122083 )
...
* refactor: resolve final export name collisions
* refactor: update remaining collision rename consumers
* style: format rebased auth helpers
* test: update remaining session entry mocks
* test: update remaining runtime mock exports
* test: update delivery info path mock
* refactor: reconcile combined collision sweeps
* chore: regenerate collision and sdk baselines
2026-08-11 11:18:24 -07:00
Peter Steinberger
fa03d9b913
refactor: consolidate coercion helpers ( #121366 )
...
* refactor: consolidate coercion helpers
* fix: remove duplicate coercion imports
* fix: preserve serialized coercion guard
* chore: ratchet coercion helper carve-outs
* fix(test): keep gauntlet subprocess startup lean
* fix: preserve imported session timestamp semantics
* fix: preserve catalog timestamp string semantics
* chore: align plugin SDK surface ratchet
* fix: preserve trajectory and SDK string contracts
* fix(test): preserve QA record assertion semantics
* fix: complete standalone record guard rename
* refactor(cron): use canonical string coercion
* fix(acpx): preserve Pi timestamp parsing
* test(channels): adapt custody test harnesses
* test(telegram): classify media harness as test support
* test(acpx): split timestamp contract coverage
* test(channels): support generated custody contracts
* chore: ban the full coercion helper name set
Extends the declaration guard to all eleven consolidated helper names and
renames the cron schedule-identity readNumber wrapper to readScheduleInteger
so the banned generic name cannot regrow.
* fix(scripts): repair release-validation guard drift and lint cause
Restores the renamed isJsonRecord guard in assertTrustedWorkflowHarness after
main added isRecord call sites in parallel, and attaches the caught YAML error
as the thrown error cause (preserve-caught-error was red on main).
* fix: preserve Claude timestamp string semantics
* fix: preserve persisted timestamp string semantics
* fix: preserve date-first timestamp contracts
* fix(openai): harden delegation failure formatting
* chore: close coercion helper guard gaps
* test(openai): model non-error delegation rejection
* chore: refresh plugin SDK API contract
* fix(tasks): use canonical string field reader
* fix(ai): use canonical provider error field coercion
* fix(browser): migrate native bootstrap coercion
* docs(plugin-sdk): clarify text record export compatibility
* fix(gateway): normalize approval execution identity
* test(outbound): isolate message action poll harness
2026-08-11 00:02:18 -07:00
Vincent Koc
587def9c9d
fix(gateway): keep new nodes compatible with older gateways ( #119981 )
...
* fix(gateway): keep new nodes compatible with older gateways
Punchcard-Session: golden-brook-lantern-zp
* fix(gateway): clear protocol compatibility check failures
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): retire manifest before inventory refresh
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): keep new nodes compatible with older gateways
Punchcard-Session: golden-brook-lantern-zp
* fix(gateway): clear protocol compatibility check failures
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): retire manifest before inventory refresh
Punchcard-Session: cobalt-timber-orchard-d1
* docs(gateway-client): describe compatible admission
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): ignore retired publication failures
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): keep new nodes compatible with older gateways
Punchcard-Session: golden-brook-lantern-zp
* fix(gateway): clear protocol compatibility check failures
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): retire manifest before inventory refresh
Punchcard-Session: cobalt-timber-orchard-d1
* docs(gateway-client): describe compatible admission
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): ignore retired publication failures
Punchcard-Session: cobalt-timber-orchard-d1
* test(node-host): split optional publication coverage
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): retain latest rejected inventory
Punchcard-Session: cobalt-timber-orchard-d1
* chore(gateway-protocol): remove release-only changelog edits
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): normalize blank node host families
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): normalize node metadata before pairing
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): negotiate legacy node metadata
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): complete rolling node convergence
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): honor publication retry backoff
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): close rolling compatibility gaps
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): migrate node pairing rollback metadata
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): scope legacy support to wire admission
Punchcard-Session: cobalt-timber-orchard-d1
* test(gateway): type legacy hello protocol fixture
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): converge node protocol after upgrade
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): preserve publication retry backoff
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): honor latest node compatibility state
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): recover protocol negotiation after rollback
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): guard legacy metadata lookup
Punchcard-Session: cobalt-timber-orchard-d1
2026-08-09 13:16:37 +08:00
Peter Steinberger
fe85bba59e
fix(windows): normalize child environment key casing ( #120802 )
2026-08-08 19:03:48 -07:00
Peter Steinberger
909509a5db
fix(codex): resume catalog sessions with the catalog's CODEX_HOME; add main-content terminal placement ( #120708 )
...
* fix(codex): pin catalog CODEX_HOME onto terminal resume spawns
The Codex session catalog lists threads through the plugin's supervision
app-server connection, which can run on the agent-scoped Codex home
(homeScope: "agent"). The terminal resume plan spawned a bare
'codex resume <threadId>' under the operator login shell, so the CLI
resolved its default ~/.codex and failed with "No saved session found".
Terminal plans now carry the catalog connection's CODEX_HOME (local and
paired-node paths), the gateway merges plan env into the PTY spawn, and
the triplicated home-scope resolution collapses into one shared
resolveCodexAppServerLocalHomeDir.
* feat(ui): add main-content terminal placement
The terminal panel gains a third dock placement, "main", filling the
content region next to the sidebar like the transcript pane. The panel
header gets a bottom/right/main placement switcher (persisted in the
existing openclaw.terminal.panel.v1 store), and opening a Codex/Claude
session from the session catalog selects main mode so resumed sessions
appear as a full window instead of a bottom strip.
2026-08-08 14:33:20 -07:00
Peter Steinberger
e7a9f33d89
refactor(core): adopt normalization-core leaf helpers across production ( #120350 )
...
* refactor(core): adopt normalization-core leaf helpers across production
* fix(ci): keep plugin contract source-resolvable
* fix(errors): preserve adapter-owned error fields
* fix(errors): short-circuit existing errors before stringifying
* fix(errors): skip throwing structured getters
* ci: retrigger checks on current base
* fix(errors): guard structured error enumeration
* fix: harden error detail copying
2026-08-08 12:00:49 -07:00
joshavant
026f4045b7
Revert "fix(protocol): preserve gateway session attribution across node runs"
...
This reverts commit 735f176b01 .
2026-08-07 18:40:17 -05:00
joshavant
d4c9a4d8f1
Revert "feat(audit): preserve exact agent execution provenance"
...
This reverts commit 79b8775bc9 .
2026-08-07 18:40:17 -05:00
Vincent Koc
79b8775bc9
feat(audit): preserve exact agent execution provenance
2026-08-07 15:27:14 +08:00
Vincent Koc
735f176b01
fix(protocol): preserve gateway session attribution across node runs
2026-08-07 08:06:01 +08:00
Peter Steinberger
3b14a93000
test(mcp): isolate catalog size checks from wall-clock load ( #118871 )
2026-08-03 12:15:36 -07:00
Peter Steinberger
a67c52611e
fix(deps): bump brace-expansion override to 5.0.9 for HIGH advisory 1130705 ( #118804 )
...
* fix(deps): bump brace-expansion override to 5.0.9 for advisory 1130705
* test(mcp): isolate oversized catalog proof from wall-clock timeouts
2026-08-03 11:01:02 -07:00
Peter Steinberger
7c35cbc4f4
test(node-host): isolate linux plugin discovery ( #118556 )
...
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local >
2026-08-03 00:25:48 -07:00
Peter Steinberger
bc212450bc
test(node-host): reuse approvals database fixture ( #118517 )
...
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local >
2026-08-02 22:59:19 -07:00
Peter Steinberger
bb5c649e31
fix: bound pending approvals and preserve delivery order ( #118252 )
...
* refactor: centralize pending request lifecycles
Share timeout and settlement registries across worker, LSP, node-host, and approval fanout paths. Bound plugin conversation-binding approvals and preserve terminal notification ordering during slow delivery.
* style: satisfy pending registry lint rules
* test: await deferred plugin approval delivery
* test: satisfy forwarder type-aware lint
2026-08-02 17:30:53 -07:00
Peter Steinberger
75aa8306f7
fix: canonicalize single-flight promise caching ( #118245 )
...
* fix: canonicalize promise single-flight caches
* fix: make TUI refresh outcome explicit
* fix: satisfy single-flight lint contracts
2026-08-02 16:33:25 -07:00
Peter Steinberger
c574a6544c
fix(auth): retain the selected account when migrating Codex sessions ( #118205 )
...
* fix(auth): preserve selected OAuth accounts during Codex migrations
* test(auth): complete doctor context and stabilize MCP pagination
2026-08-02 16:14:11 -07:00
Peter Steinberger
6c9b38862d
refactor(plugins): root-owned bundle installation with scoped registry handles ( #117587 )
...
* refactor(plugins): root-owned bundle installation with scoped registry handles
* refactor(plugins): root-owned bundle installation with scoped registry handles
* test(gateway): expect gateway-binding fact in reload rewarm
* fix(agents): reuse gateway prepared runtime generations
* test(agents): isolate runtime handle fixtures
* test(agents): align runtime owner fixtures
* test(cron): mock run-owned registry loading
2026-08-01 16:17:30 -07:00