Commit Graph

74771 Commits

Author SHA1 Message Date
Peter Steinberger
ad3e36ef33 fix(feishu): unify outbound delivery lifecycle (#117223)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 23:16:04 -07:00
SunnyShu
d75601478a docs(gateway): document llamacpp toolSchemaProfile for custom llama.cpp endpoints (#117120)
* docs(gateway): document llamacpp toolSchemaProfile for custom llama.cpp endpoints

Custom openai-completions providers pointed at a llama.cpp / llama-server
endpoint bypass the GBNF-safe schema normalization that built-in llama-cpp,
ollama, and lmstudio providers apply automatically. The toolSchemaProfile:
"llamacpp" switch activates it, but the supported value was never named in
the docs, so users hit llama.cpp 400 'failed to parse grammar' on tools with
large minLength/maxLength (e.g. cron trigger.script, maxLength 65536).

- Expand the toolSchemaProfile row to name the values recognized on a model's
  compat (llamacpp, gemini) and when llamacpp must be set explicitly;
  cross-reference the unsupportedToolSchemaKeywords escape hatch.
- Add a 'Local models (llama.cpp / llama-server)' provider example showing
  the required compat.toolSchemaProfile: "llamacpp" on a custom endpoint.

Related to #117070

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

* docs(gateway): describe llamacpp profile as stripping, not clamping

Address review feedback on #117120: the fallback sentence claimed the
llamacpp profile "also clamps" constraints, but cleanSchemaForLlamacppGbnf
only removes `pattern` outright and drops `maxLength` at or above the
2000-repetition threshold (LLAMACPP_GBNF_MAX_REPETITION_THRESHOLD). It
never clamps a value, and small bounds like `minLength: 1` are preserved
(confirmed by the projection test at src/plugin-sdk/provider-tools.test.ts).

Reword the escape-hatch sentence to describe the implemented stripping
behavior and contrast it with the unconditional keyword-list drops, so
operators do not expect a preserved bounded constraint.

No code or behavior changes; documentation only.

* docs(gateway): scope llamacpp profile description to its actual transformations

Address follow-up review on #117120: the toolSchemaProfile table row
described `llamacpp` as "rewriting tool schemas into the JSON Schema
subset llama.cpp can compile to GBNF," which overstates what
cleanSchemaForLlamacppGbnf does. The cleaner only removes `pattern`
outright and drops `maxLength` at or above the 2000-repetition threshold
(LLAMACPP_GBNF_MAX_REPETITION_THRESHOLD); it leaves every other keyword
and `minLength` untouched, and those are not guaranteed GBNF-safe.

Reword the row to state the exact transformation contract and explicitly
note it is a targeted compatibility cleaner, not a blanket GBNF-safety
guarantee. No code or behavior changes; documentation only.

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

* docs(gateway): tighten llama.cpp profile contract

* docs(gateway): order local model examples

---------

Co-authored-by: iCodeMate <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-01 14:11:22 +08:00
Yuval Dinodia
2364078063 fix(clickclack): thread replies stop being answered past the 100-reply thread window (#117225)
* fix(clickclack): answer thread replies past the server thread-reply window

Thread replies stopped being answered once a ClickClack thread passed 100
replies, with no reply, no transcript entry, no gateway warning, and no
replay after reconnect.

The gateway resolved a thread.reply_created event by fetching the whole
thread and searching its reply list. The ClickClack thread endpoint caps
that response at 100 earliest replies by default, so reply 101 was absent,
the lookup returned null, and the event was treated as handled while the
websocket cursor advanced past it. A DM thread reply was worse: it hit the
DM branch first, and thread replies never appear in the root DM timeline
that branch pages, so every DM thread reply was dropped.

Resolve the event's own message_id through the authoritative single-message
endpoint the plugin already uses, which collapses the three window
heuristics into one canonical path. Transient failures still propagate so
reconnect replays them; only a 404 resolves to unreadable, and that now
records an operator warning instead of counting as a handled event.

* test(clickclack): harden reply recovery proof

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-01 14:10:47 +08:00
Peter Steinberger
4caff51ff6 fix(agents): unify compaction successor resolution (#117250) 2026-07-31 23:07:24 -07:00
Peter Steinberger
1b8411958b fix(gateway): stop post-ready sidecar timers on close (#117242)
* fix(gateway): stop post-ready sidecar timers on close

* fix(gateway): return promise from generation timer admission callback
2026-07-31 23:03:10 -07:00
Harjoth Khara
6fb334fe84 test(gateway): pin MCP loopback drain proof to a server-side barrier (#117181)
The drain test asserted "close has not settled" after a fixed 20ms sleep.
Node only exempts a connection from close()'s idle sweep once its parser has
begun a message, so a client-side connect barrier let a loaded machine reach
close() before the server parsed the request: the socket was swept as idle,
the client saw ECONNRESET, and the drain settled inside the window.

Wait on capture admission (onRequestStart) instead, which fires server-side
after the headers are accepted, and move the assertion to just before the
successor is used so it proves the successor was minted mid-drain.
2026-08-01 14:03:02 +08:00
Peter Steinberger
137050cedd perf(update): reuse dev preflight build cache (#117246) 2026-07-31 22:59:44 -07:00
xingzhou
1f40646f7e fix(board): prevent emoji corruption in event notices (#111702)
* fix(board): preserve Unicode notice boundaries

* test(board): document surrogate boundary

* test(pr): isolate wrapper command inventory
2026-07-31 22:57:11 -07:00
MasterSwords1
732c57435c fix(cli): update plugins doctor clean message (#115073) (#117160)
* fix(cli): update plugins doctor clean message (#115073)

Root cause: plugins doctor reports 'No plugin issues detected.' even when a selected context-engine plugin is quarantined at runtime, because doctor is a fast static control-plane check.
Architectural owner: plugins-cli.runtime.ts
Canonical fix: Change clean status message to direct operators to 'openclaw health' for active runtime quarantine/fallback status.
Production LOC delta: +2 LOC

* fix(cli): update plugins doctor clean message wording (#115073)

Root cause: Refine the diagnostic text message to run openclaw health directly.
Architectural owner: src/cli/plugins-cli.runtime.ts

* fix(cli): clarify plugin doctor scope

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-01 13:54:37 +08:00
Peter Steinberger
0cd33bad88 fix(plugin-sdk): project recorded health facts through computed account status (#117236)
* fix(plugin-sdk): project recorded health facts through computed account status

* fix(plugin-sdk): regenerate API baseline and pin ingressUnavailable literal in test
2026-07-31 22:52:48 -07:00
Peter Steinberger
1f9ee89f25 fix(google): preserve canonical replay and provider error ownership (#117193)
* fix(google): preserve provider signatures and failure outcomes

* fix(google): satisfy SDK stream event and optional text types

* fix(google): preserve signed empty SDK response parts

---------

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 22:52:45 -07:00
Vincent Koc
fcb7338837 Merge pull request #117214 from openclaw/fix/talk-transcript-persistence-bound-clean 2026-08-01 13:49:35 +08:00
Peter Steinberger
80b0e78d62 fix(plugins): hash loader cache keys so plugin config never leaks into diagnostics (#117237) 2026-07-31 22:46:49 -07:00
Peter Steinberger
ad409a8285 fix(ui): preserve session, tool, archive, and focus ownership (#117191)
* fix(ui): unify tool, session, and keyboard interaction owners

* refactor(ui): separate archived session regression coverage

* test(ui): isolate memory plugin mutation mock registries

---------

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 22:45:53 -07:00
Vincent Koc
6922ddd936 fix(qa): isolate runner discovery facades (#117203) 2026-08-01 13:40:11 +08:00
Dallin Romney
bcff3a0de3 fix(qa): bind Codex auth fixture to runtime version (#116859)
* fix(qa): update Codex auth fixture protocol version

* test(qa): bind Codex auth fixture to runtime version

* test(qa): load Codex fixture version through public surface
2026-08-01 13:36:31 +08:00
Vincent Koc
a947b737f1 chore(talk): keep release changelog generated 2026-08-01 13:35:35 +08:00
Vincent Koc
0892684551 chore(ci): lower environment variable budget (#117224) 2026-08-01 13:29:08 +08:00
Vincent Koc
b786f4a804 fix(talk): expose one transcript queue policy 2026-08-01 13:27:38 +08:00
Dallin Romney
947886e764 fix(qa): align release harness contracts (#116812) 2026-08-01 13:24:10 +08:00
Dallin Romney
8b1a9ccaa4 fix(voice-call): preserve tool invocation context (#116856)
* fix(voice-call): preserve tool invocation context

* fix(voice-call): trust requester tool context

* style(voice-call): format invocation context test
2026-08-01 13:23:24 +08:00
Vincent Koc
137b65b4a9 fix(talk): stop overflow control spin 2026-08-01 13:20:42 +08:00
Vincent Koc
5188a23eb5 fix(talk): keep transcript overflow terminal 2026-08-01 13:15:56 +08:00
xingzhou
4fb19fb8c5 fix(gateway): clamp discovery advertise timeout (#117204) 2026-07-31 22:08:51 -07:00
Vincent Koc
26e18c0885 fix(talk): coalesce transcript flush barriers 2026-08-01 13:08:02 +08:00
Vincent Koc
82c40747bd fix(talk): bound durable transcript operations 2026-08-01 13:08:02 +08:00
Dallin Romney
2261a9c5b4 test(qa): align fanout catalog with public evidence (#117202) 2026-08-01 13:07:18 +08:00
RileyJJY
c7917cca36 fix(google-vertex): ignore blank project env (#109515) 2026-07-31 22:03:40 -07:00
Gio Della-Libera
752a910e8c fix(agents): allow explicit tool-less runs (#113403)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-31 21:56:20 -07:00
Dallin Romney
40f0847fc3 fix(qa): isolate Slack MPIM dedupe proof (#116843) 2026-08-01 12:56:10 +08:00
Dallin Romney
f58570cb8c fix(qa): stabilize Slack progress and table proofs (#116847)
* fix(qa): stabilize Slack progress and table proofs

* fix(qa): type Slack invalid-blocks instrumentation
2026-08-01 12:55:39 +08:00
Dallin Romney
bf32414a4a fix(qa): keep memory context proof on the QA channel (#116849)
* fix(qa): correct memory and Codex watchdog contracts

* test(qa): keep channel assertion in channel catalog
2026-08-01 12:53:00 +08:00
ljy-1351
bf6548bc8e fix(plugins): filter .d.mts and .d.cts declaration files in extension discovery (#107994)
* fix(plugins): filter .d.mts and .d.cts declaration files in extension discovery

isExtensionFile only checked for .d.ts but not .d.mts or .d.cts.
path.extname('.d.mts') returns '.mts' so these declaration files
passed through all checks and were treated as valid plugin entries.

Replaced the single .d.ts check with a regex covering all TS
declaration file variants.

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

* fix: update d.mts test to use distinct filenames so it fails on old code

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-31 21:48:12 -07:00
Peter Steinberger
618f3298c7 fix(memory): reject malformed direct and batch embedding vectors (#117200)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 21:38:31 -07:00
Vincent Koc
1b3572d08b Merge pull request #117201 from openclaw/fix/voice-call-provider-state-cleanup
fix(voice-call): release terminal provider state
2026-08-01 12:36:02 +08:00
Peter Steinberger
121a862105 fix(whatsapp): preserve accepted delivery across failures (#117198)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 21:31:06 -07:00
Peter Steinberger
cb16d739cf fix(inference): harden Codex streaming, cancellation, and live QA (#116012)
* fix(inference): harden Codex turns, streams, and live QA

* fix(inference): dispatch open CR-delimited response frames

* fix(inference): finish live goal and split streaming regressions

* fix(codex): wait for interrupted turn completion

* fix(codex): narrow terminal collector notification ownership

* fix(inference): harden completion authority and lifecycle

* fix(inference): use canonical source delivery contract

* test(inference): align lifecycle probes with current main

* style(inference): format source delivery verification

* fix(goals): prevent premature completion across staged work

* fix(qa): settle streamed goal turns before continuation

* fix(goals): require visible replies after goal completion

* test(qa): keep goal flow regressions within lint limits
2026-07-31 21:29:33 -07:00
Dallin Romney
f9d2f0dc86 fix(qa): restore WebChat auto-TTS proof (#116810) 2026-08-01 12:28:43 +08:00
Yangfan Wu Bot
9099520ae2 docs(media): clarify legacy MEDIA line formatting (#96275)
* docs(media): clarify legacy MEDIA line formatting

* docs(media): fix heading hierarchy

* docs: update docs map for rich output protocol

---------

Co-authored-by: 吴杨帆 <39647285+leno23@users.noreply.github.com>
2026-07-31 21:21:59 -07:00
xingzhou
8f8b23ff2c fix(voice-call): reject malformed UTF-8 provider JSON (#114267) 2026-07-31 21:13:42 -07:00
Peter Steinberger
ba81a26db6 fix(imessage): preserve attachment filenames and bound recovery clocks (#117197)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 21:12:24 -07:00
Alix-007
94ba7cc392 fix(nextcloud-talk): validate non-interactive base URLs (#111054) 2026-07-31 21:08:51 -07:00
Vincent Koc
995a3e20a4 merge: land PR #93985 without rewriting commits
Preserve the contributor commit series because GitHub merge commits are disabled and squash or rebase are not authorized.

PR: https://github.com/openclaw/openclaw/pull/93985
2026-08-01 12:08:10 +08:00
Wynne668
3be2964fc7 fix(sessions): repair migrated paths across short reads (#109400) 2026-07-31 21:04:51 -07:00
Vincent Koc
6c886107c3 merge(main): refresh voice call provider state cleanup
* commit '441d6ab254df14fb6939a8a261f474904ff9c500': (388 commits)
  fix(qqbot): ignore blank app id fallbacks (#109460)
  fix(feishu): consume implicit reply targets across media delivery (#117196)
  fix(exec): preserve approved command output when sessions resume (#117177)
  fix(qa): use public subagent fanout evidence (#116832)
  fix(googlechat): cancel unread auth response bodies before release (#115873)
  fix(queue): prevent cron saturation from starving hook dispatch (#116666)
  fix(gateway): sessions.steer retry no longer interrupts an active run when replaying a cached idempotency key (#116969)
  fix(irc): config validation rejects documented channels.irc.configWrites key (#112392)
  fix(mistral): keep terminal error branch lint-clean
  fix(onboard): stop a full reset from resetting the default workspace when the config is unreadable (#114110)
  refactor(i18n): remove unused Apple contradiction report (#117182)
  fix(google): stop scraping Gemini CLI OAuth credentials (#117167)
  perf: count large histories before Gateway prewarm (#117118)
  fix(signal): restore provider-safe original attachment filenames (#115107)
  refactor(channels): unify setup ownership across bundled channels (#117188)
  fix: allow gateway service commands for named profiles (#116314)
  fix(plugins): invalidate bundled artifact locations after metadata refresh (#117041)
  fix(ollama): honor model requests and pull completion contracts (#117171)
  fix(agents): prevent fallback after stale lifecycle abort (#117168)
  fix(telegram): confirm polling before long poll (#116970)
  ...
2026-08-01 12:03:58 +08:00
RileyJJY
441d6ab254 fix(qqbot): ignore blank app id fallbacks (#109460) 2026-07-31 21:01:56 -07:00
Peter Steinberger
b521ce626b fix(feishu): consume implicit reply targets across media delivery (#117196)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 21:01:45 -07:00
Vincent Koc
602b5759f2 fix(exec): preserve approved command output when sessions resume (#117177)
* fix(exec): preserve approved exec continuation output

Approved async exec continuations reused the compact background notification
formatter, so the agent resumed from the last 400 characters of output with all
whitespace collapsed and the head silently dropped.

Both hosts now render the continuation through a shared whitespace-preserving
formatter bounded at 16,000 UTF-16 units. Compact `notifyOnExit` notifications,
poll/retained output, and the gateway diagnostics branch are unchanged.

The truncation marker deliberately reports no exact omission count: output can
already be capped at capture time without leaving a marker, so an exact number
would describe only this cut while reading as though nothing else was lost.

Closes #41152

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2d9762e2-f967-4cdd-9895-299512a20114

* fix(exec): secure approved continuation handoff

* test(exec): cover authenticated approval handoff

* fix(exec): retain approved followup delivery ownership

* fix(exec): retain compact continuation fallback

* fix(exec): bound accepted followup observation

* fix(exec): keep observer diagnostics internal

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2d9762e2-f967-4cdd-9895-299512a20114
2026-08-01 11:59:51 +08:00
Vincent Koc
e73ff43db6 Merge pull request #117190 from openclaw/fix/mistral-realtime-transcript-bound-v2
* commit '834af948f4d9086b8c0d9a950150544d487dfe3c':
  fix(mistral): keep terminal error branch lint-clean
  fix(mistral): make realtime errors terminal
  test(mistral): cover realtime transcript overflow
  fix(mistral): bound realtime transcript accumulation
2026-08-01 11:58:52 +08:00
Dallin Romney
e3b069270c fix(qa): use public subagent fanout evidence (#116832) 2026-08-01 11:56:28 +08:00