Commit Graph

66965 Commits

Author SHA1 Message Date
Acache
e7d6566b8f fix(feishu): publish transport health status (#90966)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Acache <acache@users.noreply.github.com>
2026-06-28 23:12:09 -07:00
Vincent Koc
c0ee7a1d20 test: gate symlink assertions on file symlink capability (#95531)
Co-authored-by: ANIRUDDHA ADAK <127435065+aniruddhaadak80@users.noreply.github.com>
2026-06-28 22:50:37 -07:00
Goutam Adwant
5715744ea0 fix(control-ui): apply seamColor bootstrap config (#93699) 2026-06-28 22:31:31 -07:00
Alex Knight
527f20f4b5 refactor(diagnostics): keep model-call prompt/usage types module-local to avoid SDK surface growth 2026-06-29 15:21:53 +10:00
Alex Knight
ee0d50bb2c fix(diagnostics): capture per-call usage on terminal error streams; skip prompt stats when diagnostics off 2026-06-29 15:21:53 +10:00
Alex Knight
aeab5f8418 feat: improve model call telemetry 2026-06-29 15:21:53 +10:00
solodmd
7e2f425c49 test(provider-usage): cover bounded shared response reads 2026-06-28 22:12:53 -07:00
Vincent Koc
db2786bde1 fix(provider-usage): bound usage response body reads 2026-06-28 21:57:22 -07:00
Alix-007
46e119074e fix(xai): bound video response body reads 2026-06-28 21:57:14 -07:00
NIO
748bea3434 fix(github-copilot): bound login JSON response reads 2026-06-28 21:57:06 -07:00
wangmiao0668000666
a6aaba76ac fix(google): bound OAuth response body reads 2026-06-28 21:49:13 -07:00
Josh Avant
75db48a175 fix(sessions): compare reply init revisions using persisted shape (#97657) 2026-06-28 23:45:50 -05:00
Vincent Koc
0392ff7242 fix(test): remove duplicate provider HTTP mock export 2026-06-28 21:44:50 -07:00
wangmiao0668000666
bf66b4e1ea fix(comfy): bound JSON response reads via readProviderJsonResponse 2026-06-28 21:33:30 -07:00
wangmiao0668000666
f83cdec217 fix(chutes-oauth): bound core helper JSON response reads 2026-06-28 21:33:24 -07:00
wangmiao0668000666
5723222bbb fix(chutes-oauth-plugin): bound plugin JSON response reads 2026-06-28 21:33:20 -07:00
wangmiao0668000666
238398e331 fix(video-generation): bound DashScope JSON response reads 2026-06-28 21:33:09 -07:00
wangmiao0668000666
ff820d3942 fix(openai-completions): bound SSE response reads via buildGuardedModelFetch
Rebased and narrowed to the current-main OpenAI completions guarded-fetch fix. Validation passed locally and GitHub checks were green before merge.
2026-06-28 21:28:27 -07:00
Alix-007
74a9beb83f fix(vydra): bound control response reads
Reviewed and accepted after live preflight: mergeable clean, checks passing, no unresolved review threads.
2026-06-28 21:11:23 -07:00
Alix-007
ce1217a49c fix(fal): bound music/video generation response reads
Reviewed and accepted after live preflight: mergeable clean, checks passing, no unresolved review threads.
2026-06-28 21:11:14 -07:00
Alix-007
ca1bc58759 fix(together, pixverse): bound video response reads
Reviewed and accepted after live preflight: mergeable clean, checks passing, no unresolved review threads.
2026-06-28 21:11:05 -07:00
Alix-007
f0e2f7b4f5 fix(openai): bound video create-submit response reads
Reviewed and accepted after live preflight: mergeable clean, checks passing, no unresolved review threads.
2026-06-28 21:10:55 -07:00
Alix-007
63b089383a fix(runway): bound video create/poll response reads
Reviewed and accepted after live preflight: mergeable clean, checks passing, no unresolved review threads.
2026-06-28 21:10:46 -07:00
Alix-007
89b5a87909 fix: bound APNs relay response body so an oversized relay reply can't exhaust gateway memory
Reviewed and accepted after live preflight: mergeable clean, checks passing, no unresolved review threads.
2026-06-28 21:10:38 -07:00
Alix-007
561c713bb1 fix(cli): bound and redact generated video downloads
Bounds the no-output generated video download path and redacts provider URLs from HTTP failure errors.
2026-06-28 21:04:29 -07:00
Alix-007
dd6143f60c fix(signal): bound container REST response reads
Bounds Signal container REST success and error response reads using shared provider HTTP readers.
2026-06-28 20:53:58 -07:00
Alix-007
5f86c3a90f fix(qa-matrix): bound homeserver response reads
Bounds Matrix QA homeserver JSON and media upload response reads with existing response-limit helpers.
2026-06-28 20:53:53 -07:00
wangmiao0668000666
e4e4b0161f fix(mistral): bound streaming response bodies
Bounds Mistral SDK response streams at 16 MiB using the existing streaming byte guard.
2026-06-28 20:53:49 -07:00
Josh Avant
7c47904bb4 Stage managed inbound media for runner access (#97647) 2026-06-28 22:40:42 -05:00
llagy009
6299b679c0 fix(tlon): truncate approval message preview on UTF-16 boundary (#97599)
* fix(tlon): truncate approval message preview on UTF-16 boundary

formatApprovalRequest called truncate() with raw .slice() before the
trailing ellipsis. A Tlon ship display name or message preview whose
emoji landed on the 100-character preview cap was split mid-surrogate
pair, emitting a lone surrogate in the owner notification. Use
sliceUtf16Safe so the truncation always falls on a code-point boundary.

* fix(tlon): guard all three messagePreview UTF-16 truncation sites

The prior commit only guarded the formatter (truncate in approval.ts).
The root-cause sites are in monitor/index.ts where PendingApproval is
constructed:

  messagePreview: rawText.slice(0, 100),     // channel mention path
  messagePreview: messageText.slice(0, 100), // DM path

An emoji whose high surrogate falls at position 99 was sliced mid-pair,
storing a lone \uD83D in the persistent PendingApproval before the
formatter ever ran.

Fix: replace both production sites with sliceUtf16Safe(), and also
guard the createPendingApproval() constructor itself so any future
caller that passes an untruncated preview is automatically safe.

Add regression tests that drive the full
createPendingApproval -> messagePreview -> formatApprovalRequest chain
for both the DM and channel paths with an emoji placed exactly at the
100-unit boundary.

* fix(tlon): truncate approval message preview on UTF-16 boundary

* fix(clownfish): repair validation for live-pr-inventory-20260629T032026-001 (2)

---------

Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
2026-06-28 20:40:32 -07:00
cxbAsDev
d5aca1d6d2 fix(xai): bound OAuth response reads to prevent OOM (#97615)
Replace unbounded response.text() in readResponseBody and
response.json() in the device-code polling loop with
readResponseWithLimit (16 MiB cap).
2026-06-28 20:26:20 -07:00
cxbAsDev
615558f6fb fix(provider-usage): bound Anthropic usage error response reads to prevent OOM (#97614)
Replace unbounded res.json() with readProviderJsonResponse in the
fetchClaudeUsage error path to cap error body reads at 16 MiB.
2026-06-28 20:26:11 -07:00
liuhao1024
f6115dd5fe fix(failover): allow model_not_found to trigger fallback chain when configured (#97571)
Remove model_not_found from the shouldEscalateRetryLimit exclusion list
so that configured fallback models are attempted when the primary model
is decommissioned by the provider. Previously, model_not_found was
treated as terminal, silently defeating the fallback chain for the
decommission case.

Fixes #97564
2026-06-28 20:24:23 -07:00
Colin Johnson
59d8462b1d fix(macos): open dashboard when Dock or Finder relaunches app (#97637)
* fix(macos): open dashboard on Dock reopen

* fix(macos): preserve visible-window Dock reopen

* style(macos): satisfy deep link switch formatting
2026-06-28 20:24:15 -07:00
Alix-007
2001b15f5b fix(google-meet): bound Drive document export reads to prevent OOM (#97620)
* fix(google-meet): bound Drive document export reads to prevent OOM

* test(google-meet): return full guarded fetch result

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-06-28 19:57:01 -07:00
Alex Knight
1f0c6a66a6 fix(plugins): plugin loggers drop writes after the log level is raised at runtime (#97617)
* fix(plugins): plugin loggers drop writes after the log level is raised at runtime

The plugin runtime logging facade captured a single tslog child logger per
getChildLogger() call. tslog snapshots a sublogger's min level at creation, so a
long-lived plugin logger (e.g. a channel monitor that runs for the whole gateway
session) kept dropping debug/verbose writes after the log level was raised at
runtime, even though shouldLogVerbose()/isFileLogLevelEnabled() reported the new
level. This made channels like Mattermost go dark while core subsystem loggers
(which re-resolve per emit) kept logging.

Resolve the child logger per call so it always reflects the current level, with a
cheap isFileLogLevelEnabled pre-gate (skipped for explicit overrides) to avoid
building a sublogger when the level is disabled. Fixes every channel that holds a
long-lived monitor logger (mattermost, matrix, msteams, irc, nextcloud-talk) at
the facade boundary with no plugin-code changes.

* test(plugins): type runtime log-level mock

---------

Co-authored-by: Alex Knight <15041791+amknight@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-06-28 19:55:37 -07:00
xydigit-sj
00c9ac55d6 fix(secrets): skip PLAINTEXT_FOUND for known non-secret apiKey markers (#97622)
Exclude models.providers.*.apiKey values that match isNonSecretApiKeyMarker
(e.g., lmstudio-local, ollama-local) from secrets audit plaintext warnings.
Regression test covers marker bypass and real-key flagging.

Closes #89233
2026-06-28 19:49:05 -07:00
Dallin Romney
a202dd0faf test: link mcp gateway transport coverage (#97609) 2026-06-28 19:20:15 -07:00
NIO
245257238b fix(agents): keep missing external channel providers in agents list 2026-06-28 19:19:58 -07:00
吴杨帆
63fe5c7402 fix(ui): scroll to cron run history 2026-06-28 19:18:26 -07:00
zhangqueping
15fc881281 fix(cli): clarify safe restart bounded-then-force behavior in help and docs 2026-06-28 19:18:13 -07:00
Wynne668
32d117c68b fix(control-ui): persist Set Default agent through config save 2026-06-28 19:15:27 -07:00
Yuval Dinodia
bbc4c56a6d fix(config): name openai-chatgpt-responses for the removed openai-codex-responses api id 2026-06-28 19:15:19 -07:00
liuhao1024
6dccb61e56 fix(memory): align session file counter denominator with indexer filter (fixes #77338) 2026-06-28 19:14:27 -07:00
linhongkuan
6d658c70ea fix(terminal-core): tighten docs link URL detection 2026-06-28 19:14:18 -07:00
llagy009
4109755592 fix(discord): truncate model picker button labels on UTF-16 boundary 2026-06-28 19:08:49 -07:00
llagy009
352f47f888 fix(imessage): coalesce merged text on UTF-16 code-point boundary 2026-06-28 19:08:39 -07:00
llagy009
1841c4caf5 fix(feishu): truncate comment prompt text on UTF-16 boundary 2026-06-28 19:07:11 -07:00
Dallin Romney
938855082a fix(reply): clear 'model unavailable' reply + correct operator hint for retired runtime models (#97611)
* fix(models): don't advise models.providers[] registration for runtime-bound models

When an agent's configured model is bound to an agent runtime (e.g. the
"codex" runtime, whose catalog comes from the OpenAI ChatGPT-account
app-server), and that model id is no longer offered by the runtime, model
resolution fails with "Unknown model: <provider>/<model>". The appended hint
told users to register the model in models.providers[].models[].

For runtime-owned models that advice is misleading: adding the registration
makes resolution "succeed" only for the request to be rejected later by the
provider — e.g. OpenAI returns 400 "model is not supported when using Codex
with a ChatGPT account" once a model id such as gpt-5.3-codex is deprecated.

Detect the agentRuntime binding on the configured agents.defaults.models entry
and instead point the user at the runtime's live catalog (openclaw models list
--provider <id>) and at switching the configured default to an available model.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(reply): show a clear "model unavailable" reply instead of generic failure

When a configured model is retired/renamed by the provider, model resolution
fails (run.ts throws a typed FailoverError with reason "model_not_found") and
the agent runner falls back to the generic "Something went wrong … use /new"
reply. That copy is actively misleading for this failure: retrying or starting
a new session can never help, because the model id itself must be changed in
config. Users on a deprecated model (e.g. gpt-5.3-codex on a Codex ChatGPT
account) just see the generic message on every message and on /new.

Classify this failure into a dedicated user-facing reply that explains the
model is unavailable and points at the config. Detection is structural — it
keys off the typed FailoverError reason, not provider error text — so it stays
robust as provider wording changes; free-text rejections without a typed reason
remain the responsibility of the failover layer that owns error classification.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 19:02:21 -07:00
moguangyu5-design
b28fcfe843 fix(telegram): fall back to plain text when rich message entity validation fails (#96642)
When Telegram rejects a rich message with RICH_MESSAGE_*_INVALID
(e.g., RICH_MESSAGE_EMAIL_INVALID on /status replies), the delivery
path now falls back to a plain text sendMessage instead of dropping
the reply.

Fixes #96363
2026-06-28 19:00:07 -07:00