Commit Graph

1988 Commits

Author SHA1 Message Date
Vincent Koc
a4faeae9df Merge pull request #101358 from mrunalp/podman-sandbox-backend
Add Podman sandbox backend
2026-08-01 00:00:18 +08:00
Vincent Koc
d194f4b712 fix(sandbox): gate Podman versioned features 2026-07-31 18:29:53 +08:00
Vincent Koc
a53caebb6f fix(sandbox): reject unsafe rootless Podman users 2026-07-31 18:02:27 +08:00
Vincent Koc
94c0f33f1f Merge pull request #116611 from openclaw/experiment/google-cli-supported-paths
fix(google): stop offering unsupported CLI setup
2026-07-31 17:48:18 +08:00
Vincent Koc
20e68e01df fix(gateway): sign device proofs with challenge time (#116679) 2026-07-31 16:45:53 +08:00
sallyom
4ba02b83e8 refactor(sandbox): share container backend with Podman
Signed-off-by: sallyom <somalley@redhat.com>
2026-07-31 00:06:33 -04:00
Vincent Koc
9e965073e5 Merge remote-tracking branch 'origin/main' into experiment/google-cli-supported-paths
* origin/main: (168 commits)
  fix(plugins): keep registry sqlite root consistent (#116427)
  fix(cli): keep Gateway auth failures parseable in JSON (#116597)
  fix(trajectory): preserve prompts in oversized events (#116220)
  test(buzz): add live QA Lab channel lane (#116298)
  chore(i18n): refresh native locales (#116567)
  feat: add OpenClaw TUI prototype skill (#116583)
  fix(update): accept concrete versions selected by ranges (#116585)
  fix(agents): preserve locked session model routes
  test(qa-lab): preserve Matrix fault proxy identity
  fix(ci): extend OpenAI live profile setup budget (#116580)
  fix: prevent configured models from stalling startup (#116553)
  fix(cli): close MCP listener after one-shot commands
  fix(auto-reply): keep explicit NO_REPLY silent (#116548)
  test(discord): cover deferred backpressure terminals
  fix(discord): cancel backpressured realtime playback
  test(discord): cover realtime output backpressure
  fix(codex): add remote WebSocket heartbeat and reconnect (#116135)
  fix(macos): wait for the current reconnect snapshot (#116550)
  fix(outbound): recognize current-source message-tool sends (#116560)
  fix(voice-call): type cancelled consult outcomes
  ...

# Conflicts:
#	extensions/google/setup-api.test.ts
#	ui/src/e2e/model-setup.e2e.test.ts
2026-07-31 09:30:03 +08:00
Mrunal Patel
903276c798 Add Podman sandbox backend
Closes #101348

Adds a bundled podman sandbox backend, SDK helper exports, policy/Codex integration, generated plugin docs, and focused tests.
2026-07-30 20:20:42 -04:00
Peter Steinberger
b4d9cafa14 fix(gateway): validate chat completion token caps (#116563) 2026-07-30 14:37:04 -07:00
Josh Avant
ce67ffb70e feat(agents): add tool-free isolated completion (#114343)
* feat: add isolated pure-inference completion

* fix(google): block ambient system prompt writes

* docs: refresh generated map
2026-07-30 13:24:45 -05:00
Vincent Koc
d540255ce7 docs(google): document supported auth paths 2026-07-30 22:56:26 +08:00
Omar Shahine
944cf08f94 docs(automation): rename scheduled-tasks feature wording to Automations (#114855)
* docs(automation): rename scheduled-tasks feature wording to Automations

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WhJ8EiMXue6ADLmHfb7FL6

* docs: regenerate docs map and add Automations glossary entries

* docs(templates): follow renamed automations-vs-heartbeat anchor

* docs(automation): fix markdown formatting drift

* docs(automation): teach the canonical automations tool and sync the copied heartbeat default

Review follow-ups: normal instructions use the automations tool with cron as
an explicit compatibility alias; every verbatim copy of the default heartbeat
prompt matches the new shipped text from the strings PR.

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 07:21:56 -07:00
Jesse Merhi
f1ee2a3098 fix(diagnostics-otel): agent turns split into one-span traces instead of a trace tree (#116246)
* fix(diagnostics-otel): keep parent span links across long turns

Retained trusted span contexts translate a completed lifecycle span's
diagnostic span id to the real OTel span context. That table was evicted
5s after run.completed, so children of a longer turn missed their parent
and OTel minted a fresh trace id for each one, silently splitting a turn
into single-span traces.

Retention is now identity-based and lives for the service lifetime,
bounded by MAX_RETAINED_TRUSTED_SPAN_CONTEXTS, which removes the timing
race and the drain/timeout cleanup subsystem.

Also nests openclaw.exec under its run: the exec event now carries a
trusted trace context and the recorder resolves the ambient run scope.

* fix(diagnostics-otel): key retained span contexts by diagnostic trace id

Retained lifecycle span contexts were stored under the span's OTel trace id
but looked up with the event's diagnostic trace id. Those are different id
spaces, so every post-completion parent lookup missed and each straggler
span started a brand-new trace.

The mocked suite could not catch this: its tracer reports the same trace id
the test feeds in, collapsing both id spaces into one value. Adds a boundary
test that runs the real OTel SDK and OTLP/protobuf exporter against a local
receiver and asserts on exported span bytes.

* fix(diagnostics-otel): harden span-linking contract after review

Review findings on the parent-span linking fix:

- completeTrackedLifecycleSpan now takes the DiagnosticTraceContext instead of a
  bare trace id beside a span id. Two adjacent hex strings let a transposition
  compile clean and silently reinstate split traces; DiagnosticTraceContext is
  the only shape an OTel SpanContext cannot satisfy (traceFlags string vs number).
- internalOrTrustedTraceContext composes normalizedTrustedTraceContext rather
  than spelling the trust predicate a third time.
- Corrected comments that claimed OTel ids never equal diagnostic ids. Spans
  parented from an upstream traceparent do adopt the diagnostic trace id; the
  removed guard only ever misfired on root lifecycle spans.
- Exec comment now states the real parent: the openclaw harness opens no run
  scope, so exec nests under openclaw.harness.run.

Test gaps closed:

- The core emitter switch was untested; reverting it kept every test green.
  The pty-fallback test now asserts the emitted metadata.
- The boundary test covered only run.completed of three lifecycle owners; it now
  covers harness.run.completed and message.processed too, each with a straggler.
- Dropped the service-context cast for the typed helper, which caught a bogus
  context.assembled field, and moved teardown into afterEach so a failed
  assertion cannot leak the real NodeSDK across files.
- Scoped the one-trace assertion to this turn's spans; faked Date so a lazy
  Date.now expiry cannot pass.

Docs: exec and tool spans now listed as staying on an upstream request trace.

* fix(diagnostics-otel): keep late children on the trace on every terminator

Native review found three correctness gaps in the previous commit:

- Exec spans could be exported naming a parent span id nothing ever emits. The
  ambient lookup fell through to a remote-parent fallback built from diagnostic
  ids, which is a regression from the previous clean-root behavior and breaks
  waterfalls and parent-id-keyed backends. Exec now resolves only spans this
  process exported and stays a root on a miss; message spans keep the remote
  fallback because their context can come from an inbound traceparent.
- harness.run.error never retained its span context, so an aborted turn still
  split. For the openclaw harness that span is the only ancestor a late child
  has, and aborted turns emit no run.completed.
- completeTrackedLifecycleSpan no longer takes a redundant spanId.

The boundary test now runs through the OPENCLAW_OTEL_PRELOADED seam with an
in-memory exporter and releases the global tracer provider in teardown. A
NodeSDK cannot be unregistered, so the old version would have made any later
real-SDK test silently export nothing. That also deletes the hand-rolled OTLP
protobuf decoder. Added guards for the aborted-turn path and for exec staying
parentless; both are mutation-verified.

* fix(diagnostics-otel): age retained parent contexts out after 10 minutes

Retention had no time bound at all, so a command backgrounded by a turn could
finish hours later and still attach to a parent that ended long before. Backends
derive trace latency from the span envelope, so a 30s turn rendered as hours with
a child extending past its parent.

The horizon is checked lazily on lookup rather than on a timer: a timer firing
mid-turn is exactly what silently split traces before. Past the horizon a
straggler starts its own trace, which only loses causality for a span that would
have skewed its parent's duration anyway.

The two bounds now pin each other - shrinking the horizon to the old 5s window
fails the original regression tests, and removing it fails the new horizon test.

* fix(diagnostics-otel): retain parent contexts until capacity
2026-07-30 20:41:41 +10:00
Ayaan Zaidi
21d3533460 fix(channels): ack mentions in groups that do not require them
The group-mentions ack gate returned false whenever a group did not require mentions, conflating group policy with whether this message mentioned the agent. Under the default scope, mentioning the agent in a group configured to answer everything produced no ack at all, so the user had no signal the turn was picked up until the reply arrived.

Behavior change on a default path: those groups now show the 👀 ack (and the lifecycle status reactions when messages.statusReactions.enabled is true) on mentions. Mention-required groups, group-all, unmentioned messages, and off/none are unchanged. The gate no longer reads requireMention, so the parameter is gone from the shared type and all channel call sites.

Proven live on Telegram across three configurations, including a no-mention control confirming group-mentions did not become group-all.
2026-07-30 17:58:46 +09:00
joshavant
1237c0cf81 docs(hooks): document validation responses 2026-07-30 02:59:06 -05:00
joshavant
54a6dba0d3 fix(gateway): validate hook delivery accounts 2026-07-30 02:59:06 -05:00
Vincent Koc
9e041cd386 fix(hooks): preserve multi-account agent delivery (#116095)
* fix(hooks): preserve account routing for agent delivery

Refs #43866

Co-authored-by: Paul Desmond Parker <paul.parker@dcconnect.cn>

* test(gateway): prove hook account delivery handoff

---------

Co-authored-by: Paul Desmond Parker <paul.parker@dcconnect.cn>
2026-07-30 07:10:21 +08:00
Vincent Koc
3226f07cad docs: correct timezone configuration contract (#116102) 2026-07-30 06:23:50 +08:00
Vincent Koc
54e273e695 fix(agents): keep date reasoning current in long-running sessions (#116090)
* fix(agents): ground date reasoning below cache boundary

Co-authored-by: Deepak Jain <406777+deepujain@users.noreply.github.com>

* docs: refresh temporal context map

* chore: leave release notes to release curation

* test(agents): keep compaction date mock complete

---------

Co-authored-by: Deepak Jain <406777+deepujain@users.noreply.github.com>
2026-07-29 22:12:47 +00:00
Peter Steinberger
ca07207649 docs(security): add safe Gmail reader setup (#116041)
* docs(security): add safe Gmail reader setup

* docs: leave release notes to release flow

* docs: refresh documentation map
2026-07-29 15:07:35 -04:00
Ryan Hughes
9560e17185 feat(hooks): add persistent hook session mode (#75918)
* feat(hooks): add explicit persistent sessions

* fix(hooks): validate persistent mapping session keys

* chore: leave persistent hooks note to release process

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 02:57:28 +08:00
Harjoth Khara
895b691c55 fix(daemon): refuse duplicate launchd gateway managers (#97285)
* fix(daemon): block duplicate launchd owners

Co-authored-by: Harjoth Khara <harjoth.khara@gmail.com>

* fix(ci): satisfy launchd docs and lint gates

* fix(ci): remove unused launchd exports

* docs: refresh gateway map

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 13:31:22 -04:00
Sascha Kuhlmann
814b9f6e36 fix(hooks): bound agent runner admission (#104712)
* fix(hooks): gate agent admission on runner entry

Co-authored-by: Sascha Kuhlmann <117685070+coolmanns@users.noreply.github.com>

* fix(hooks): bound agent runner admission

Co-authored-by: Sascha Kuhlmann <117685070+coolmanns@users.noreply.github.com>

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 01:01:46 +08:00
Peter Steinberger
ea967be0df feat(gateway): add loopback locality controls (#115959)
* feat(gateway): add loopback locality controls

* fix(gateway): keep loopback auth delays enforced under concurrency

The pending-timer cap let an attacker park cheap failures in every slot and then guess without penalty. Delays now key off a per-key deadline, so parallel guesses wait out the same escalating penalty and are still bounded by the max delay.

* fix(gateway): share one loopback penalty timer per key

Concurrent failures on a key now share a single timer and deadline instead of allocating one per in-flight request. Also corrects the security doc: the delay raises the cost of repeated guessing from one source, but credentials are compared before the failure response is delayed, so it is not a defense against parallel fan-out.

* docs(gateway): record why loopback delay stays post-verification

* docs: refresh generated docs map

* docs: refresh plugin SDK API baseline

* test: update loopback locality CI expectations
2026-07-29 12:25:57 -04:00
Sascha Kuhlmann
819961a292 fix(hooks): avoid implicit hook delivery targets (#100486)
* fix(gateway): bind hook delivery before scheduling

Co-authored-by: Sascha Kuhlmann <117685070+coolmanns@users.noreply.github.com>

* test(cli): make stderr tail fixture deterministic

* test(cli): allow loaded runners to start

* fix(gateway): narrow hook delivery binding

Co-authored-by: Sascha Kuhlmann <117685070+coolmanns@users.noreply.github.com>

* fix(gateway): keep hook delivery normalization internal

* style(gateway): format hook delivery helper

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 23:14:46 +08:00
synth
151c549494 fix(browser): uploads fail when the browser runs on a remote node (#115291)
* fix(browser): resolve upload paths on the owning browser node, not the Gateway

When a browser session is proxied to a remote node, the upload action
previously ran resolveExistingUploadPaths on the Gateway, pinning paths
to a filesystem the node cannot see and rejecting node-local files. The
node-side /hooks/file-chooser route already re-resolves paths against
its own filesystem, so skip Gateway-local resolution whenever the
request is proxied and forward the requested paths as-is.

Fixes openclaw/openclaw#115251

* fix(browser): transfer uploads to remote browser nodes

* fix(browser): normalize upload abort errors

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 20:31:46 +08:00
Peter Steinberger
bfb7ff189e docs(codex): replace stale app/list wording with app/installed (#115867) 2026-07-29 08:09:44 -04:00
Hannes Rudolph
6dc55fa65e fix(plugins): recover user turns with scoped reply hooks (#114836)
Allow before_agent_reply plugins to declare host-enforced trigger eligibility so scheduled-only hooks do not block interrupted user-turn recovery. Keep omitted and malformed scopes fail-closed, scope both memory-core maintenance hooks, and cover three runner reload cycles through the public registration contract.

Refs: #111442

Source: #114836

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 17:22:16 +08:00
Vincent Koc
30346f9788 fix(sandbox): scope runtimes by workspace (#115766)
Qualify non-shared sandbox identities by resolved workspace while preserving shared runtime names. Existing non-shared runtimes reset once under the new identity.

Related: #51363

Co-authored-by: Tayoun <39609208+tayoun@users.noreply.github.com>
2026-07-29 16:50:38 +08:00
Peter Steinberger
f14e8607e7 fix(agents): bound completed background process retention (#115760)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 04:45:08 -04:00
Pavan Kumar Gondhi
36984fe1af fix(diagnostics): keep internal thinking out of telemetry [AI] (#115261)
* fix(diagnostics): exclude internal thinking from telemetry

* fix(diagnostics): redact replay reasoning fields

* fix(diagnostics): omit replay signatures from telemetry

* chore: sync removed test helper
2026-07-29 14:05:45 +05:30
Vincent Koc
5578f27ce7 fix(agents): run reply hooks for restart recovery (#115711)
Co-authored-by: sweetcornna <96944678+sweetcornna@users.noreply.github.com>
2026-07-29 16:32:44 +08:00
Vincent Koc
bf91a5786c fix(plugins): enforce hook security invariants (#115701) 2026-07-29 16:10:34 +08:00
Peter Steinberger
e1a00726a3 feat(gateway): add least-privilege voice-node pairing (#115712)
* feat(gateway): add least-privilege voice-node pairing

* chore: leave voice-node note to release

* fix(gateway): keep bootstrap helpers private

* fix(ci): remove unused Code Mode type export

* fix(ci): remove stale model matrix import

* fix(ci): align QA evidence timeout guard
2026-07-29 04:09:37 -04:00
Peter Steinberger
8fd49c84aa feat: make self-learning automatic by default (#115576)
* feat: make self-learning automatic by default

* fix: preserve capture authorization boundaries

* test: split autonomous capture coverage
2026-07-29 02:04:57 -04:00
Alex Knight
be24db5f72 fix(auth): reuse Claude CLI logins natively and stop forwarding expired OAuth tokens (#115134)
* fix(auth): refresh selected Claude CLI profiles

* fix(auth): run imported Claude CLI logins as verified native passthrough

* fix(auth): satisfy CLI auth failure exhaustiveness

* docs: remove PR changelog entry

---------

Co-authored-by: Alex Knight <15041791+amknight@users.noreply.github.com>
2026-07-29 01:30:07 -04:00
Vincent Koc
4d439805aa fix(sandbox): reject and migrate browser network none (#115250)
* fix(sandbox): reject browser network none

* test(ui): reset location after tools panel tests

* chore(sandbox): drop release-owned changelog entry

* fix(config): migrate unsupported sandbox browser network

* fix(sandbox): isolate browser network constant

* fix(config): preserve blank browser network overrides

* chore: leave release changelog untouched
2026-07-29 06:22:33 +08:00
Patrick Erichsen
d2a63f9b22 docs(security): fix warning line wrap (#115388) 2026-07-28 14:56:32 -05:00
Sally O'Malley
8799a97efc feat(openshell): add workspace selection (#114952)
Signed-off-by: sallyom <somalley@redhat.com>
2026-07-28 14:53:46 -04:00
clawSean
a47c6b0ace docs(slack): clarify group DM bot membership (#101944)
* docs(slack): clarify group DM bot membership

* docs(slack): qualify MPDM API errors

* docs(slack): clarify MPDM invite requirements

Co-authored-by: clawSean <260045960+clawSean@users.noreply.github.com>

---------

Co-authored-by: clawSean <260045960+clawSean@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 14:27:09 -04:00
metaforismo
430de2299c fix(ios): use configured speech language for system voice (#113372)
* fix(ios): honor speech locale for system voice

* chore(ios): refresh talk locale i18n inventory

* fix(ios): fall through unavailable system voices

* chore(ios): refresh talk locale i18n inventory

---------

Co-authored-by: Colin Johnson <colin@solvely.net>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 14:10:23 -04:00
Yue Fei
1b4a465ea1 feat(gateway): accept WebSocket request trace context (#113189)
* feat(gateway): accept WebSocket request trace context

* test(gateway): prove WebSocket trace isolation

* test(gateway): simplify traced response match

* ci: allow iOS screenshot validation to finish

* fix(gateway): keep traced request failures scoped

* test(ci): align iOS screenshot timeout contract

* test(ui): reset config route location

* ci: scope iOS screenshots to native changes

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 13:15:05 -04:00
Peter Steinberger
58a3051910 fix(channels): report a channel that cannot receive as unhealthy instead of connected (#115229)
* fix(channels): make channel health reflect inbound ingress, not just the transport

`connected` is a transport signal, so a channel holding a healthy socket while its
durable ingress queue is unavailable evaluated as `health: healthy` and admitted
nothing. On a production gateway that hid 26+ hours of completely dead inbound Slack
behind `connected, bot:config, app:config, health:healthy`; outbound kept working,
which is what kept the transport looking fine.

Add inbound admission as its own health dimension rather than overloading `connected`
(deliberately tri-state since 30fda068aa, and 17 of 27 channel plugins depend on
absent meaning "no transport signal"). The shared ingress monitor now rethrows a
typed ChannelIngressUnavailableError when it cannot open its durable queue, the
channel supervisor records that as `ingressUnavailable` on the account, and
`evaluateChannelHealth` reports `ingress-unavailable` ahead of every lifecycle
window. Absence stays "unknown", never "fine", so socketless and simply quiet
channels are untouched; no traffic-staleness heuristic is introduced.

The health monitor deliberately does not restart such an account. A denied or
unusable ingress queue is a capability/config failure that a restart cannot fix, and
the channel's own bounded backoff ladder already tried. Today that case instead loops
at the 10-restarts-per-hour cap forever, so this removes a restart treadmill rather
than adding one.

* fix(channels): keep automatic recovery for a dead-ingress account

The health-monitor skip latched a transient queue-open failure into a permanent
inbound outage: ingressUnavailable is only cleared by a later start, and skipping
the restart meant that start never happened. Report the dimension and name the
restart reason instead of suppressing recovery.

* fix(channels): scope the ingress dimension to running accounts

Shadowing not-running would have made readiness flap during the supervisor's
documented restart-backoff grace. The blind spot the dimension exists for is a
running channel with a live transport and dead inbound, so evaluate it there and
leave stopped accounts on their lifecycle reason. Also applies oxfmt.

* fix(channels): keep the ingress reason and give readiness its own backoff grace

Two review cycles pulled in opposite directions on the same bounded window: the
health policy must keep the ingress cause in the not-running state a failed start
actually lands in, while readiness must not flap during restart backoff. Put each
in its owner -- the policy states the truth, and readiness extends its existing
restart-handoff grace to the ingress reason. Once the ladder stops setting
restartPending, the account stays red instead of hiding dead inbound.

* style: reshape the readiness backoff predicate for oxfmt

* fix(ci): regenerate the docs map and drop an unused ingress export

The new health.md section needs docs/docs_map.md regenerated, and knip flagged
CHANNEL_INGRESS_UNAVAILABLE_CODE as an unused production export -- it only has
callers inside its own module.
2026-07-28 12:08:53 -04:00
Peter Steinberger
2160b97cdc refactor(config): retire compaction truncateAfterCompaction gate (#115206) 2026-07-28 11:30:50 -04:00
Vincent Koc
0f41b401fd docs(browser): correct Docker sandbox setup (#115254) 2026-07-28 23:18:40 +08:00
Bryan Tegomoh, MD, MPH
15866acef5 Refresh macOS skills after node reconnect (#107660)
* Refresh macOS skills after node reconnect

* fix(macos): queue skills refresh during reconnect

* chore(i18n): refresh native skills inventory

* fix(macos): refresh skills from gateway invalidations

Co-authored-by: Bryan Tegomoh <bryan.tegomoh@gmail.com>

* fix(android): update gateway event catalog

Co-authored-by: Bryan Tegomoh <bryan.tegomoh@gmail.com>

* refactor(skills): keep remote eligibility helper bounded

Co-authored-by: Bryan Tegomoh <bryan.tegomoh@gmail.com>

* ci(test): pin model shard worker budget

Co-authored-by: Bryan Tegomoh <bryan.tegomoh@gmail.com>

* ci(test): isolate network-sensitive agent suites

Co-authored-by: Bryan Tegomoh <bryan.tegomoh@gmail.com>

* test: align isolated prefix routing expectation

Co-authored-by: Bryan Tegomoh <bryan.tegomoh@gmail.com>

* test(macos): isolate gateway process test port

Co-authored-by: Bryan Tegomoh <bryan.tegomoh@gmail.com>

* fix(macos): recover skills after failed refresh

Co-authored-by: Bryan Tegomoh <bryan.tegomoh@gmail.com>

* fix(ci): avoid duplicate agent test routing

Co-authored-by: Bryan Tegomoh <bryan.tegomoh@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 09:10:45 -04:00
Vincent Koc
ac157b3af0 fix(openshell): restore sandbox creation on current OpenShell (#115058)
* test(openshell): use structured gateway discovery

* fix(openshell): bound sandbox runtime names

* test(openshell): bound policy sandbox fixture

* docs(sandbox): document compatibility matrix

* fix(openshell): preserve registered runtime identities

* fix(openshell): quote recreate scope safely

* fix(openshell): match shipped legacy names

* docs(sandbox): refresh generated map

* test(sandbox): mock registered runtime lookup

* fix(openshell): reject non-ready legacy runtimes
2026-07-28 11:13:04 +02:00
Peter Steinberger
4b05d83035 fix: generated images do not appear in native chat (#115042)
* fix(chat): render managed images in native clients

Co-authored-by: Francesco Giannicola <francescogiannicola1@gmail.com>

* chore: keep release changelog owned

* refactor(macos): split managed image loading

* test(apple): prove managed image header policy

* test(native): stabilize managed image proof

* test(apple): satisfy strict concurrency checks

---------

Co-authored-by: Francesco Giannicola <francescogiannicola1@gmail.com>
2026-07-28 04:39:53 -04:00
Peter Steinberger
0d7fb8eb39 refactor(fs): adopt fs-safe 0.5 core primitives (#113705)
* refactor(fs): unify exclusive file publication

* fix(fs): fence stale lock reclamation

* refactor(fs): bound wiki scans and secret reads

* chore(fs): finalize fs-safe 0.5 compatibility

* fix(fs): preserve publication ownership and legacy mode

* fix(fs): fail closed on unverifiable lock owners

* fix(fs): preserve concurrent backup publications

* refactor(fs): preserve ambiguous backup outputs

* fix(fs): preserve mixed-version lock coordination

* refactor(file-transfer): adopt fs-safe archive extraction

* refactor(fs): add bounded walk and secret seams

* refactor(auth): replace proper-lockfile with fs-safe

* fix(fs): honor Windows mode override casing

* refactor(snapshot): adopt fs-safe publication

* refactor(memory-wiki): adopt prunable root walks

* refactor(fleet): adopt bounded archive restore

* fix(fs): preserve post-publication ownership receipts

* refactor(fs): harvest final fs-safe primitives

* style(fs): clean harvest lint

* chore(plugin-sdk): refresh move helper API baseline

* refactor(snapshot): adopt native Windows ACL facts

* refactor(fs): adopt hardened atomic outputs

* fix(fs): scope lock reentrancy to logical owners

* chore(config): lower env var count budget

* fix(deps): adopt published fs-safe 0.5.0

* fix(ci): align SDK surface ratchets

* fix(ci): regenerate SDK API baseline after rebase

* fix(fs): preserve owner-scoped file lock nesting

* fix(ci): refresh SDK API baseline for file locks

* fix(fs): separate SQLite and file lock reentrancy

* fix(imessage): bound pinned attachment reads

* fix(agents): narrow session-key lock options

* fix(fs): preserve fs-safe 0.5 compatibility contracts

* fix(windows): retain private SQLite directory owner

* refactor(sqlite): centralize exclusive coordinator

* refactor(snapshot): isolate Windows ACL policy

* fix(windows): retain snapshot ACL inspector

* chore(config): realign env budget after rebase

* test(agents): accept canonical sandbox escape error

* docs(changelog): defer fs-safe release note
2026-07-28 03:41:47 -04:00
Peter Steinberger
991a521d12 fix(gateway): let crash-looping channels reach their give-up state (#114976)
The health monitor treated an account sleeping between its own auto-restart
attempts as "stopped" and force-restarted it. That start booted nothing (the
channel supervisor still owned the account task), but the accompanying
resetRestartAttempts wiped the retry ladder, so a crash-looping channel
restarted at attempt 1 every cooldown and could never reach
"giving up after 10 restart attempts".

ChannelManager now reports isAutoRestartScheduled for the supervisor's backoff
sleep and replacement start, and the health monitor defers to it instead of
restarting, resetting attempts, or spending its cooldown/hourly budget. The
monitor stays the last restart owner once the supervisor gives up.

Live evidence (clawmac gateway logs, 2026-07-27/28): 198 "restarting
(reason: stopped)" lines, zero give-ups, attempt ladders truncated at 8/10.

Related: #110802, #111572
2026-07-28 03:16:36 -04:00