Commit Graph

66940 Commits

Author SHA1 Message Date
Dallin Romney
d2e6ccf4bb refactor(test): consolidate script declaration contracts (#100992) 2026-07-06 10:26:51 -07:00
Peter Steinberger
f8307bb44c style(android): apply ktlint to landed changes (#100304)
* style(android): apply current ktlint fixes

* style(android): format current app sources

* style(android): refresh native i18n inventory
2026-07-06 18:26:47 +01:00
Dallin Romney
a45c0999ce refactor(plugins): require initialized registry collections (#100990)
* refactor(plugins): require initialized registry collections

* test(plugins): keep empty registry imports lightweight
2026-07-06 10:25:22 -07:00
Peter Steinberger
553acdfc1a feat(gateway): add tts.speak method returning synthesized audio inline (#100770)
* feat(gateway): add tts.speak method returning synthesized audio inline

* test(gateway): type tts.speak synthesis mock for failure shapes

* fix(gateway): restore lowercase normalizer import used by talk catalog

* test(gateway): shift advertised-method window for tts.speak

* fix(gateway): ready tts speak for landing

* docs(changelog): record tts speak gateway API

* test(agents): stabilize fast auto startup synchronization

* test(crabbox): stabilize sparse checkout exit guard
2026-07-06 18:25:08 +01:00
Vincent Koc
3ad77774f0 fix: carry 2026.7.1 stability repairs into main (#101043)
* fix(telegram): throttle reconnect delivery drains

(cherry picked from commit 7182c74d04)

* fix(agents): honor aborts during session lock acquisition

(cherry picked from commit 6443c2a552)

* fix(cli): prefer installed launcher package roots

(cherry picked from commit 37e1b324db)

* fix(e2e): allow Linux onboarding to finish

(cherry picked from commit 88192552a0)

* fix(e2e): scrub single-plugin allowlists on Windows

(cherry picked from commit bee5dee521)

* fix(e2e): preserve Windows config shape during updates

(cherry picked from commit a580a7fe3f)
2026-07-06 10:17:36 -07:00
Peter Steinberger
a34b8a8d69 fix(cron): preserve implicit delivery on partial edits (#101027) 2026-07-06 18:11:58 +01:00
Peter Steinberger
2897c3c7df perf(test): isolate embedded provider runtime mocks 2026-07-06 13:11:23 -04:00
Peter Steinberger
d0dd18dd7f feat(android): richer Settings About screen with mascot hero and project links (#100994) 2026-07-06 18:10:50 +01:00
NIO
2f510a0ac1 fix(plugin-sdk): bound Copilot token exchange JSON response reads (#97579)
* fix(plugin-sdk): bound Copilot token exchange JSON response reads

* test(plugin-sdk): add HTTP transport proof for Copilot token bounds

* fix(test): cast HTTP transport fetch mocks to typeof fetch

---------

Co-authored-by: NIO <nocodet@mail.com>
2026-07-06 13:10:19 -04:00
Vincent Koc
bf8626c0e9 feat(providers): add LongCat API support (#100501)
* fix(ai): honor provider reasoning compatibility

* feat(longcat): add hosted provider plugin

* chore(longcat): register package metadata

* docs(longcat): add provider setup guide

* docs(longcat): document self-hosted model routing

* refactor(longcat): externalize provider plugin

* chore(longcat): add npm release artifacts
2026-07-06 10:07:08 -07:00
Vincent Koc
8336a94ecb test(live): accept yielded Codex bridge parent 2026-07-06 10:03:57 -07:00
NIO
db334b3cf7 fix(qa-channel): bound bus JSON response reads (#99169)
Co-authored-by: NIO <nocodet@mail.com>
2026-07-06 13:02:42 -04:00
NIO
2e967ea61d fix(google): bound OAuth JSON response reads (#97587)
Co-authored-by: NIO <nocodet@mail.com>
2026-07-06 13:01:25 -04:00
LZY3538
c2cdffa41b fix(acp): serialize state database shutdown (#100691)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 18:01:21 +01:00
Gio Della-Libera
5b06eba9fe policy: repair required deny tool findings (#99700) 2026-07-06 09:56:03 -07:00
Peter Steinberger
bfb89d3ea6 fix(discord): limit implicit reply fanout (#100784)
* fix(discord): limit implicit reply fanout

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

* fix(discord): preserve oversized fallback fanout

* refactor(discord): make reply metadata per-message

* fix(discord): keep reply receipts serializable

* docs(changelog): defer Discord entry to release

* refactor(discord): model native reply fanout

---------

Co-authored-by: qingminlong <qing.minlong@xydigit.com>
2026-07-06 17:55:23 +01:00
Peter Steinberger
06789ca4c2 fix(ios): keep offline chat sends on their original route (#100942) 2026-07-06 17:53:05 +01:00
cxbAsDev
68487e4c1e fix(codex): honor timeoutSeconds for dynamic tool calls when timeoutMs is absent (#100722)
* fix(codex): honor timeoutSeconds for dynamic tool calls when timeoutMs is absent

* fix(codex): enforce integer timeoutSeconds and cover side-question path

* chore(proof): extend codex timeoutSeconds proof to side-question path and fractional rejection

* fix(codex): leave headroom when arming watchdog from timeoutSeconds

* fix(codex): preserve dynamic tool timeout budgets

* test(codex): satisfy dynamic tool response types

* test(codex): type structured timeout promise

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:52:51 +01:00
Alix-007
02a099756e fix(control-ui): isolate gateway settings by base path (#97665)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:52:29 +01:00
Mukunda Rao Katta
675045f49f fix(browser): read Windows Chrome version from build dir in doctor (#87937)
* fix(browser): read Windows Chrome version metadata

Read PE ProductVersion before a conservative unambiguous install-layout fallback, without interpolating configured paths into PowerShell code.\n\nCo-authored-by: Mukunda Rao Katta <mukunda.vjcs6@gmail.com>

* style(browser): clarify Windows version probe

* fix(browser): use trusted Windows PowerShell path

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:50:34 +01:00
Vincent Koc
67732dd312 refactor(ui): localize view prop types (#101013) 2026-07-06 09:49:45 -07:00
Peter Steinberger
5b5a540e34 feat(android): per-gateway custom headers for gateways behind authenticating proxies (#100765)
* feat(android): support per-gateway custom headers for proxied gateway connections

Per-gateway custom request headers (Cloudflare Access-style service tokens)
for gateways behind authenticating reverse proxies. Headers are credentials:
EncryptedSharedPreferences-stored per endpoint stableId, masked in the manual
connection UI, injected on the OkHttp WebSocket upgrade at connect time via a
provider so edits apply on the next reconnect without re-pairing. Reserved
handshake headers and non-printable-ASCII are sanitized out (OkHttp throws on
them). TLS fingerprint pinning and pairing flows unchanged. Cross-gateway
isolation proven by MockWebServer upgrade-capture test.

Related: #100698

* chore(android): sync native i18n for custom header strings

* fix(android): harden gateway custom headers

* chore(android): resync native i18n inventory

* docs(changelog): defer Android release note

* fix(android): validate custom header names

* chore(android): refresh native i18n inventory
2026-07-06 17:48:57 +01:00
ZZIPP
979d198fd1 fix(media): recognize m2a as MPEG audio (#92167)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:48:37 +01:00
Peter Steinberger
077e35f3b2 feat(ios): read-only workspace Files browser on the Agents surface (#100767)
* feat(ios): add read-only workspace Files browser to the Agents surface

* fix(ios): keep nav bar visible on pushed workspace file routes

* fix(ios): make workspace file navigation stack-safe

* docs(ios): note workspace file browser

* fix(ios): isolate workspace share exports

* chore(i18n): refresh iOS Files inventory

* refactor(ios): encode workspace requests before dispatch

* chore(i18n): refresh iOS inventory after rebase
2026-07-06 17:47:52 +01:00
Peter Steinberger
84f21bd9fc feat(ui): clickable file links in chat with a workspace file viewer sidebar (#100679)
* feat(ui): link file paths in chat and add workspace file viewer sidebar

Auto-detect file paths in chat markdown (plain paths, path:line, inline
code, explicit/absolute links) and render them as clickable links that
open a dedicated file viewer sidebar with line numbers, highlight.js
syntax highlighting, scroll-to-line, in-file search, reveal-in-rail,
open-in-editor, and copy actions. Workspace rail browser entries are
now previewable even when the transcript never touched them;
sessions.files.get serves any file inside the workspace root with the
existing containment, symlink/hardlink, and size guards.

Closes #100615

* feat(ui): linkify file paths in sidebar markdown and fix file-view gutter width

Markdown rendered in the chat detail sidebar now gets the same clickable
file links as chat messages, opening files via the panel's own click
delegation. File viewer gutter uses a fixed per-file digit width so
short lines no longer indent their code past longer ones.

* fix(ui): keep browser-entry active highlight and narrow file content for editor open

loadWorkspace no longer clears the rail active marker for browser-only
entries, so Show in Files keeps the revealed file highlighted after the
forced reload. openInEditor narrows the sidebar content kind before use,
fixing the tsgo type error.

* chore(ui): fix lint findings in file viewer helpers

* fix(ui): harden workspace file previews

* fix(ui): wire file previews through chat panes

* fix(ui): preserve workspace file targets

* fix(ui): preserve workspace file targets
2026-07-06 17:47:28 +01:00
github-actions[bot]
6b99fd9a94 chore(i18n): refresh native locales 2026-07-06 16:41:42 +00:00
Masato Hoshino
c437f4af9d feat(doctor): warn when cron delivery targets inactive channel (#98184)
* feat(doctor): warn when cron delivery targets inactive channel

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

* fix(doctor): ignore disabled cron delivery targets

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 16:40:20 +00:00
Peter Steinberger
cc147c6a40 test(discord): align websocket mock constructor type 2026-07-06 12:30:35 -04:00
Vincent Koc
c55b52de83 test(live): allow full Codex reply runtime 2026-07-06 09:26:45 -07:00
Dallin Romney
5af7ba92ce refactor: consolidate byte-size formatting (#99768)
* refactor: consolidate byte-size formatting

* fix: stabilize byte formatter import boundary

* fix: keep byte formatter within SDK budget

* fix: emit byte formatter package entry

* refactor: trim byte formatter surface

* fix: use narrow byte formatter import

* refactor: remove byte formatter dependency changes

* fix: refresh rebased byte formatter baseline
2026-07-06 09:26:04 -07:00
Dallin Romney
b29d472e41 refactor(qa): add canonical live channel adapters (#99707) 2026-07-06 09:24:34 -07:00
Peter Steinberger
1af9cbe904 perf(test): avoid duplicate legacy migration scans 2026-07-06 12:22:25 -04:00
Huvee
edbf204537 fix(memory-wiki): fail with a readable error when the shared memory manager violates the contract (#100902)
searchMemoryWiki called sharedMemoryManager.search() and getMemoryWikiPage
called manager.readFile() with only a truthiness guard. A memory plugin
whose runtime returns a manager that does not implement the
MemorySearchManager contract crashed shared-backend wiki search with
"sharedMemoryManager.search is not a function" from inside the bundle --
@mem0/openclaw-mem0 <= 1.0.14 registered exactly such a partial manager
(status/probeEmbeddingAvailability/close only).

Guard both call sites and throw an actionable error instead: name the
missing contract method and point at search.backend="local" for wiki-only
access.
2026-07-06 09:20:43 -07:00
Peter Steinberger
0a488bd30b fix: device pairing floods stacked approval alerts for a retrying device and stale approvals no-op (#100976)
* fix(gateway): stop device pairing approval alert floods from retrying devices

A device retrying with a broken token minted a new pending requestId (and
approval alert broadcast) every 5-minute TTL window because refresh preserved
ts and expiry keyed on ts. Pending requests now stay alive via an internal
refreshedAtMs keepalive (ts still owns ordering/--latest), superseded device
requests broadcast device.pair.resolved like node pairing already did, and the
Mac app keeps one alert per device, closes superseded visible alerts, and
resyncs its queue when approving a stale request.

Closes #100974

* chore: satisfy swiftformat and refresh native i18n inventory for pairing prompter changes
2026-07-06 17:20:06 +01:00
Sahibzada
5e22787ba1 fix(sessions): clean stale atomic-write temps on startup (#90503)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:18:05 +01:00
Peter Steinberger
7853aa35a4 feat(ios): per-gateway custom headers for gateways behind authenticating proxies (#100768)
* feat(ios): support per-gateway custom headers for proxied gateway connections

Per-gateway custom request headers (Cloudflare Access-style service tokens)
for gateways behind authenticating reverse proxies. Headers are credentials:
Keychain-stored per gateway stableID, masked in settings UI, injected on the
WebSocket upgrade at connect time via a provider so edits apply on the next
reconnect without re-pairing. Reserved handshake headers and control chars
are sanitized out. TLS pinning and pairing flows unchanged. Push relay and
other non-gateway destinations proven header-free by regression test.

Related: #100698

* chore(ios): sync native i18n inventory for custom header strings

* fix(ios): harden gateway custom headers

* chore(ios): resync native i18n inventory

* fix(ios): validate custom header names
2026-07-06 17:17:07 +01:00
Peter Steinberger
161e66f7bd fix(ui): move Worktrees page from the sidebar into Settings navigation (#100995) 2026-07-06 17:16:39 +01:00
Peter Steinberger
61a29a7836 feat(android): read-only workspace Files browser with preview and share (#100776)
* feat(android): add read-only workspace Files browser with preview and share

* fix(android): degrade malformed base64 image payloads to no-preview instead of crashing

* fix(android): keep workspace paths verbatim from the gateway

* test(android): cover the overview Files card in shell logic tests

* fix(android): reset workspace browser across agents

* fix(android): isolate workspace share exports

* docs(android): note workspace file browser

* chore(i18n): refresh Android Files inventory

* docs(android): refresh workspace files map
2026-07-06 17:14:38 +01:00
Huvee
ddddb3dec1 fix(memory-wiki): drop malformed public artifacts and honor readMemoryArtifacts in status (#100900)
Two crashes when a memory plugin misbehaves in bridge mode:

- listActiveMemoryPublicArtifacts sorted plugin-returned artifacts
without
  validating them; an artifact missing any of the string fields the
  comparator dereferences (kind, workspaceDir, relativePath,
absolutePath,
  contentType) crashed wiki status and every other bridge consumer with
  "Cannot read properties of undefined (reading 'localeCompare')".
  @mem0/openclaw-mem0 <= 1.0.14 shipped record-shaped artifacts with
none
  of those fields, typed against a drifted SDK stub. Validate the shape,
  drop malformed entries (and non-array listings), and warn once naming
  the offending plugin -- the same treatment agentIds already got.

- resolveMemoryWikiStatus gated artifact counting on vaultMode/enabled
but
  not bridge.readMemoryArtifacts, so the wiki.status gateway method
still
  enumerated artifacts (and hit the crash above) with the flag off, even
  though the sync path (bridge.ts) and CLI gateway routing honor it. The
  documented workaround therefore never worked for the wiki_status agent
  tool. Add the flag to the gate; the count reports null when imports
are
  disabled, matching non-bridge modes.
2026-07-06 09:14:21 -07:00
Masato Hoshino
f36d170bc6 fix(agents): retry transient filesystem races when reading workspace bootstrap files (#100910)
* fix(agents): retry transient filesystem races when reading workspace bootstrap files

* fix(agents): retry transient boundary resolution

---------

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-07-06 16:12:04 +00:00
SunnyShu
e580ed2f71 fix(sessions): exclude done sessions from transcript freshness rollover guard (#99985)
* [AI] fix(sessions): exclude done sessions from transcript freshness rollover guard

Exclude status: "done" from resolveTerminalMainSessionTranscriptRegistryCheck alongside the already-excluded status: "failed". Successful main sessions should stay reusable for the next user message even when transcript mtime slightly exceeds registry updatedAt.

Updated test expectations in:
- src/gateway/server-methods/agent.test.ts (split it.each into done-reuse + endedAt-only-rotate)
- src/commands/agent.session.test.ts (split into done-reuse + endedAt-only-rotate)
- src/auto-reply/reply/session.test.ts (default-done case now expects reuse)

Related to #99964

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

* fix(ts): fix TypeScript error in endedAt-only test scenario type

Remove the conditional status spread that TS cannot resolve when
status is absent from the scenario type, and add 'as const' for
narrowed literal inference.

* [AI] fix(comment): correct mtime direction in done exclusion comment

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

* review: separate failed/done rationale in comment

* fix(sessions): reuse completed main transcripts

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:09:55 +01:00
sunlit-deng
de1bac6bc0 fix(discord): bound gateway websocket payloads (#99998)
* fix(discord): bound gateway websocket payloads

* fix(discord): raise gateway payload cap for large events

* refactor(discord): centralize gateway websocket policy

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:09:38 +01:00
machine3at
1021784c85 fix(telegram): stop local listener and bot on retry loop non-recoverable error (#100863)
* fix(telegram): stop local listener and bot on retry loop non-recoverable error

* fix(telegram): reuse webhook shutdown on setup failure

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:09:34 +01:00
cxbAsDev
5d3044f883 fix(auto-reply): handle stderr stream errors in sandbox media scpFile (#100861)
* fix(auto-reply): handle stderr stream errors in sandbox media scpFile

* chore(proof): add real behavior proof for stage-sandbox-media scp stderr stream errors

* chore(proof): fix promise executor lint in stage-sandbox-media proof

* fix(media): keep scp completion authoritative

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:09:15 +01:00
chenxiaoyu209
f28e0d6e99 fix(openai): strip status from replayed input items for custom openai-responses endpoints (#100831)
* fix(openai): strip status from replayed input items for custom openai-responses endpoints

* fix(openai): narrow replay status stripping

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:08:55 +01:00
maweibin
586107002a fix(runtime): throw typed ExitError instead of generic Error for simulated exit (#97796) (#97803)
createNonExitingRuntime.exit() threw a generic Error, making it
impossible for upstream try-catch to distinguish a simulated process
exit from a real runtime crash. Added an ExitError class (internal-only,
not exported from SDK) that callers can check via instanceof.

ExitError is kept internal to avoid expanding the public plugin SDK
API surface without maintainer approval. Tests import directly from
./runtime.js.

Fixes #97796.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 16:07:32 +00:00
machine3at
dbb70549be fix(telegram): pass proxy and apiRoot config when resolving runtime target usernames (#100868)
* fix(telegram): pass proxy and apiRoot config when resolving runtime target usernames

* fix(protocol,telegram): fix duplicate worktree exports and update resolveTargets test types

* fix(telegram): honor runtime routing in target resolution

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:06:18 +01:00
Peter Steinberger
255b7631e6 fix(android): keep chat model selection synchronized (#100985)
* fix(android): harden chat model selection

* fix(android): bound model metadata retries

* fix(android): preserve newer model selections

* chore: leave changelog to release workflow

* chore: sync native i18n inventory
2026-07-06 17:06:02 +01:00
cxbAsDev
ec8129ef12 fix(node-host): handle stdout/stderr stream errors in runCommand (#100849)
* fix(node-host): handle stdout/stderr stream errors in runCommand

* chore(proof): add real behavior proof for node-host runCommand stream errors

* fix(node-host): wait for child exit after stdout/stderr stream errors

* fix(node-host): lint and type errors in proof script and test

* fix(node-host): bound stream-error command shutdown

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:05:41 +01:00
machine3at
f1fb19351a fix(cron): do not set delivery mode to announce when disabling best-effort on payload edits (#100846)
* fix(cron): do not set delivery mode to announce when disabling best-effort on payload edits

* fix(cron-cli): update sibling test to expect undefined mode on no-best-effort-deliver

* fix(cron): preserve delivery mode when disabling best effort

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:05:22 +01:00