Commit Graph
69112 Commits
Author SHA1 Message Date
fa9c3209d3 fix: queued voice replies are lost when the delivery queue retries them (#108502)
* fix(outbound): keep queued TTS/local media alive past its producer process

Outbound TTS synthesizes into a producer-owned temp and the raw path is
persisted into the durable delivery queue with no copy. The temp is removed
when its producer exits (and by a 5-minute timer well inside the queue's
~22-minute retry budget), so a deferred delivery replayed by a fresh recovery
process reads a path whose owner already deleted it: the send burns all five
retries on a missing file and the voice is never delivered.

Give the queue its own copy. Before a deliverable row is published, each
authorized local source is read through the same media access the live send
uses and copied into a process-generation-owned artifact root outside the
media TTL sweep; only the queue payload is rewritten, so the live send stays
copy-free on the original path. Custody is proven by owner identity rather
than by a marker file or lease table: artifacts are grouped under
<pid>-<processStartTime>-<nonce>, and reclaim touches a generation only when
its owner is provably gone. A live owner, an unverifiable owner, or a
recycled PID whose start time no longer matches are all handled without
deleting media that a pending row still needs. Wall-clock age is never an
ownership signal.

Ordering is durable-state-first: rows commit before artifacts are unlinked,
so a crash between the two leaves an orphan for reclaim rather than a
delivery that lost its media. Sensitive media reaches neither the spool nor
the row, so required sends fail closed and best-effort sends go live-only
instead of persisting a row that cannot replay.

No schema change, no public SDK surface, no lease/owner table.

* fix(outbound): resolve queue media owner identity on every platform

Generation ownership read process start time through the Linux/Darwin lock
reader only, so on Windows every generation stayed unverifiable and its
artifacts were never reclaimed. gateway-lock already paired that reader with
the Windows CIM/WMIC creation-time reader behind its own private helper, so
the pairing was duplicated policy waiting to drift.

Move the pair behind one owner-identity helper and route both callers through
it. No new process inspection: Windows still resolves through
readWindowsProcessStartTimeSync, Linux/Darwin still through
getFileLockProcessStartTime, and neither platform's behavior changes.

Also cover the production crash boundary end to end: a real child process
stages media, commits the row, and is killed before dispatch; a fresh process
then reclaims the dead generation while retaining the artifact its pending row
still needs, reads the same bytes after the producer's source is deleted, and
drops the artifact once the row is acked.

* fix(outbound): close reclaim race and partial-stage leak in queue media

Two defects found by external review of the previous commits.

Reclaim built its retain set before proving generation ownership, so a
short-lived producer (`openclaw message send`) that staged, committed its row,
and exited while a sweep was running would have its artifact judged against a
snapshot taken before that commit: the sweep saw a dead owner, missed the new
reference, and unlinked media a pending row still needed. The retain set is now
read after each death proof. That is sufficient rather than merely narrower: a
process only ever stages into its own generation, so once an owner is proven
dead no further references to it can appear, and everything it committed before
exiting is already durable.

Staging also leaked on partial failure. When a later source in an entry failed,
earlier copies were already published, no row would ever reference them, and
reclaim deliberately never touches a live owner's generation, so they
accumulated for the process lifetime. Failed staging now releases what it
published. Per-payload media staging is sequential for the same reason: a
concurrent copy could land after the cleanup ran and orphan itself anyway,
and one source at a time also bounds peak memory.

* fix(outbound): resolve queue media access exactly as the live send does

Queue staging read media through params.mediaAccess directly, while the live
send resolves an agent-scoped capability first. The two gates therefore
disagreed: agent-generated media under the agent workspace is reachable only
through the agent-scoped roots, so staging rejected sources the send itself
would have delivered. A required send failed outright, and a best-effort send
silently lost its write-ahead row for exactly the media class this change is
meant to protect.

Resolve the capability once and share it, so staging can neither reject media
the send would deliver nor read more than the send may. The live send now
routes through the same helper rather than keeping a second copy of the
argument list.

The spool test previously fabricated an explicit localRoots and placeholder
bytes, which hid the gap; it now uses the production shape (no explicit media
access, source in the OpenClaw temp root that TTS writes to) and real
buffer-verifiable audio, because host-local sends are content-verified.

* test(outbound): cover agent-workspace media that only the scoped capability reads

The existing staging test used a source in the OpenClaw temp root, which both
the raw and the agent-scoped capability permit, so it could not tell the two
apart and would have passed against the defect it was meant to guard.

Add a case whose source lives in an agent workspace at
<state>/workspace-<agentId>. The unscoped default roots reject that path by
construction, so a durable row exists only when staging resolves the same
agent-scoped capability the live send resolves. Reverting staging to the raw
media access, or bypassing the shared resolver, fails this test.

* test(outbound): pin agent-workspace staging to the agent-scoped capability

The regression case admitted its source two ways that had nothing to do with
agent scoping: the state dir sat inside the OpenClaw temp root, which is itself
a default media root, and parent-root expansion grants any declared source
directory. Either would keep the test green after the agent identity was
dropped from the resolver.

Move the state dir outside the temp root and set tools.fs.workspaceOnly, which
suppresses source-derived root expansion. The agent workspace is then reachable
only through the agent-scoped capability, so removing the agent identity, the
shared resolver, or reverting to the raw media access each fail the test.

* test(gateway): pin queue media retention across retry backoff

* fix(outbound): retain queued media for retries

Co-authored-by: Masato Hoshino <g515hoshino@gmail.com>

* fix(outbound): retain queued media for retries

Co-authored-by: Masato Hoshino <g515hoshino@gmail.com>

* fix(outbound): retain queued media for retries

Co-authored-by: Masato Hoshino <g515hoshino@gmail.com>

* docs(changelog): avoid queued TTS merge conflict

Co-authored-by: Masato Hoshino <g515hoshino@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-16 01:43:53 -07:00
3eec404aab fix(clickclack): bound websocket handshake waits at 30s (#106485)
* fix(clickclack): bound websocket handshake waits at 30s

* test(clickclack): prove WebSocket handshake deadline

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:41:53 -07:00
727f9e0a7e fix(ios): preserve active chat across foreground reconnects (#108241)
* fix(ios): preserve chat focus across reconnects

* chore(ios): sync native i18n inventory

* test(ios): strengthen reconnect ownership coverage

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>

---------

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:38:45 -07:00
Peter SteinbergerandGitHub 48183146f5 fix(gateway): block external webchat checkpoint branches (#108678)
* fix(gateway): block webchat checkpoint branches

* test(gateway): use immutable checkpoint key sort
2026-07-16 01:38:32 -07:00
Josh AvantandGitHub aaf5d23883 fix(heartbeat): stop reporting success after tool failures (#107735)
* fix(heartbeat): preserve terminal tool failures

* fix(heartbeat): handle absent failure payloads

* test(agents): align execution-state consumers

* fix(heartbeat): retain unmatched pending finals

* fix(heartbeat): preserve failures across retries

* refactor(agents): narrow terminal outcome boundary

* fix(copilot): preserve terminal tool failures

* fix(agents): bound tool execution tracking

* docs(plugins): document harness terminal outcomes

* fix(codex): preserve exact terminal boundaries

* test(codex): harden abort race fixtures
2026-07-16 01:23:06 -07:00
c90833a62e fix(android): preserve emoji in tool detail previews (#108330)
* fix(android): preserve emoji in tool detail previews

* fix(android): sync i18n after tool detail utf16 preview

* proof(android): add UTF-16 tool display boundary proof script

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

* chore: oxfmt proof-android-tool-display-utf16.mts

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

* chore: remove redundant proof script

The Robolectric ToolDisplayRegistryTest already covers the UTF-16 boundary
behavior. The standalone Node.js proof script triggers CI checks (max-lines
ratchet, check-test-types, session-accessor-boundary) and provides no
additional coverage beyond the existing Android JVM tests.

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

---------

Co-authored-by: nebulacoder-v8.0 <noreply@zte.com.cn>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:15:23 -07:00
e08e1a0ca8 fix(ios): attach EKAlarm to reminders.add so due-time notifications fire (#106376)
* fix(ios): attach EKAlarm to reminders.add so due-time notifications fire

EKReminder.dueDateComponents only sets the deadline; without an explicit
EKAlarm, iOS does not produce lock-screen or banner notifications.

Closes #105523

* fix(ios): configure reminder due alerts

Co-authored-by: xialonglee <li.xialong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:14:40 -07:00
Peter SteinbergerandGitHub 8959ac8b17 refactor(windows): remove launcher encoding test seam (#108750)
* refactor(windows): remove launcher encoding test hook

* test(windows): widen launcher fixture buffer type
2026-07-16 01:13:21 -07:00
Peter SteinbergerandGitHub b11d506c09 fix(amazon-bedrock): harden control-plane requests (#108756) 2026-07-16 01:13:16 -07:00
Peter SteinbergerandGitHub a7d5386896 improve: speed up ring-zero QA smoke (#108694)
* ci: speed up ring-zero QA smoke

* ci: scope QA sticky cache to Docker lane

* ci: keep QA dependency setup on actions cache

* test: restore modern Docker QA proof
2026-07-16 01:12:40 -07:00
Peter SteinbergerandGitHub e2fed32131 fix(onboarding): explain how to get provider tokens and revive logged-out CLI candidates (#108739)
* fix(onboarding): explain how to obtain provider tokens in auth setup copy

* fix(onboarding): add per-CLI login remediation to detected candidate details
2026-07-16 01:12:15 -07:00
Peter SteinbergerandGitHub 555c1a4e6a refactor(msteams): simplify request timeout cancellation (#108752) 2026-07-16 01:12:08 -07:00
175761d203 fix(sandbox): handle missing stat paths across locales (#105263)
* fix(sandbox): stabilize stat errors across locales

* fix(sandbox): normalize remote stat locale

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:11:33 -07:00
Stellar鱼andGitHub e481ed4229 fix(codex): decode sandbox exec PathUri inputs (#107644) 2026-07-16 01:10:02 -07:00
Aanish BhirudandGitHub 9f6b3aa118 fix(media): keep host-staged images available to native vision (#106416) 2026-07-16 01:04:40 -07:00
9026b9f4ac fix(reef): bound relay HTTP JSON response body reads (#106456)
* fix(reef): bound relay HTTP JSON response body reads

* test(reef): cover relay response boundaries

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:00:35 -07:00
Peter SteinbergerandGitHub 54f8957e12 fix(discord): Activities open correctly from packaged builds (#108725)
* fix(discord): resolve activity SDK from plugin root

* chore: keep release notes out of PR
2026-07-16 01:00:22 -07:00
f98de3fc25 fix(control-ui): preserve emoji in plugin fallback monograms (#105240)
* fix(control-ui): preserve emoji in plugin monograms

* test(ui): cover combining-mark monograms

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

---------

Co-authored-by: Colin Johnson <colin@solvely.net>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-16 00:59:37 -07:00
c6a9f5339b fix(agents,cron): remove pattern field from model-facing cron tool schema (#108360)
* fix(agents,cron): remove pattern field from model-facing cron tool schema

Fixes #107449

* fix(agents): regenerate prompt snapshots for cron schema pattern removal

Remove "pattern": "\\S" from the declarationKey field in the
model-facing cron tool schema across all three codex dynamic-tools
snapshot fixtures. This aligns the committed prompt contract with
the runtime schema change that removed the unanchored pattern
constraint incompatible with llama.cpp.

* test(cron): lock llama.cpp schema boundary

Co-authored-by: 李健0668000722 <li.jian21@xydigit.com>

* docs(changelog): place cron fix in release tail

Co-authored-by: 李健0668000722 <li.jian21@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:59:20 -07:00
Dallin RomneyandGitHub 9a2f25c82b refactor(qa): make channel drivers run-level (#108602) 2026-07-16 00:59:03 -07:00
139a310b96 fix(scripts): keep ntfy auth notifications from hanging (#108650)
* fix(scripts): bound ntfy auth notifications

* test(queue): align Sol default with current main

* fix(protocol): regenerate bundled clients for sessions thinkingLevel

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:57:19 -07:00
Peter SteinbergerandGitHub 4d25ce0605 refactor(agents): share OAuth file-lock mock factory (#108745) 2026-07-16 00:57:10 -07:00
NIOandGitHub e36f586325 fix(discord): reject invalid auto-archive durations before REST (#107610) 2026-07-16 00:56:34 -07:00
Alix-007andGitHub 3912cf38b9 fix(ci): bound workflow ShellCheck download (#108672) 2026-07-16 00:56:27 -07:00
Peter SteinbergerandGitHub 2c977bebce fix(plugins): preserve trust policy after update failures (#108649) 2026-07-16 00:56:06 -07:00
59a21e3429 fix(docker): keep setup chown from following symlinks (#107847)
* Fix Docker setup chown symlink handling

* fix(docker): harden setup ownership repair

Co-authored-by: luyifan <al3060388206@gmail.com>

* fix(docker): pin ownership repair path

* test(docker): assert ownership setup ordering

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-16 00:55:54 -07:00
47ffb49f71 fix(restart-sentinel): report persistence cleanup failures (#106385)
* fix(restart-sentinel): log DB errors instead of silently swallowing them

Replace empty catch blocks in clearRestartSentinel, readRestartSentinel,
and hasRestartSentinel with sentinelLog.warn(...) calls so SQLite errors
are visible in diagnostics while preserving best-effort fallback semantics.

Tests use deterministic fault injection via vi.mock on openclaw-state-db.js
with hoisted throw flags, replacing the previous non-deterministic state-dir
removal approach. Each error path asserts both the warning message and the
correct fallback return value.

* fix(restart-sentinel): report persistence failures

Co-authored-by: wendy-chsy <wan.wenyan@xydigit.com>

* ci: retrigger pull request checks

* chore(ci): prune stale max-lines baseline

* chore(ci): retest against repaired protocol baseline

* chore: stabilize restart sentinel changelog entry

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: wendy-chsy <wan.wenyan@xydigit.com>
2026-07-16 00:53:39 -07:00
Peter SteinbergerandGitHub ee6ff936ff refactor(diagnostics): unify recovery requests (#108736) 2026-07-16 00:52:42 -07:00
Peter SteinbergerandGitHub fcd2a784f4 fix(auto-reply): transcribe locked harness audio (#108714) 2026-07-16 00:46:24 -07:00
ccda5440e1 fix(discord): bound stalled probe response reads (#106036)
* fix(discord): bound stalled probe response reads

* fix(discord): bound application probe bodies

* fix(discord): preserve probe result within status budget

* style(discord): format probe timeout test

* chore(deadcode): allowlist test-only timeout constant exports

* refactor(discord): keep status probe budget in loader

* fix(discord): enforce total probe deadline

Co-authored-by: Alix-007 <li.long15@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:46:07 -07:00
Peter SteinbergerandGitHub 2a895ca8db fix(cron): prevent completed runs retrying after claim conflicts (#108682)
* fix(cron): avoid replay after lifecycle conflicts

* test(cron): type lifecycle race fixture

* chore: leave changelog to release flow

* fix(protocol): sync Swift session creation model
2026-07-16 00:45:59 -07:00
Peter SteinbergerandGitHub dde90a345a refactor(plugin-sdk): narrow wildcard barrels to explicit used exports (#108440)
* refactor(plugin-sdk): narrow wildcard barrels to explicit used exports

* refactor(tools): delete dead tool-planning module exposed by barrel narrowing

* fix(plugin-sdk): restore deprecation tag on OpenClawSchemaType alias

* test(agents): drop test for deleted runtime proxy module

* refactor(tools): trim descriptor types to cache consumers

* refactor(deadcode): harvest exports orphaned by barrel narrowing

* refactor(deadcode): harvest exports orphaned by barrel narrowing (rest)

* fix(agents): restore sdk imports and test markers via public predicate

* fix(plugin-sdk): named type re-exports in plugin-entry; trim types barrel precisely

* chore(plugin-sdk): account unmasked deprecated provider types in budgets

* fix(plugins): name star-only type rows for dts bundling

* fix(plugins): restore host-hook surface; unexport internal api compositions

* fix(plugins): named type imports for api composition; restore needed source exports

* fix(plugins): knip-visible type imports for registry surfaces

* test: adapt tests to privatized media and command internals

* fix(qa-lab): re-export snapshot conversation type

* style: format sessions sdk imports

* fix(plugins): restore smoke entry export; pin budgets to exact actuals

* fix(plugins): canonical smoke-entry import; drop orphaned root shims

* fix(plugins): allowlist manifest probe, repoint qa web import, drop dead browser barrels

* fix(plugin-sdk): pin codex auth marker and scaffold provider type

* fix(qa-lab): keep web-facing model-selection shim within boundary rules

* fix(plugin-sdk): preserve merged contracts through narrowed barrels

* chore(plugin-sdk): pin post-rebase surface budgets
2026-07-16 00:45:23 -07:00
Peter SteinbergerandGitHub a864c64d8a refactor(ui): unify terminal and browser panel tab strips (#108651)
* refactor(ui): share one panel tab strip between terminal and browser

Extract the terminal tab strip (tab + attached close button as one
surface, from #108611) into a shared panel-tab-strip module and migrate
the in-app browser panel onto it. The browser tabs inherit the attached
close design; terminal tabs gain middle-click close and long-label
ellipsis; both get the empty-group workaround and a strip that shrinks
inside the flex header. Net -24 prod LOC; duplicated tp-/bp- strip CSS
deleted.

* fix(ui): keep shared panel new-tab button stable
2026-07-16 00:44:23 -07:00
Peter SteinbergerandGitHub cc504e3cc0 refactor(web): narrow runtime context results (#108728) 2026-07-16 00:43:18 -07:00
cacf08364f fix(discord): add timeout to guarded gateway metadata fetches (#104580)
* fix(discord): add timeout to guarded gateway metadata fetches

* test(discord): release stalled metadata lookup

* test(discord): use inert token fixture

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:43:12 -07:00
ccec0224fa fix(daemon): gateway fails to launch on Windows when the profile path contains CJK characters (#107751)
* fix(daemon): write Windows gateway launchers in encodings wscript/cmd can decode

gateway.vbs and gateway.cmd were written as UTF-8 without BOM, but
wscript.exe only reads .vbs as ANSI or UTF-16 LE with BOM and cmd.exe
reads .cmd in the console OEM code page, so installs under CJK profile
paths failed with "file not found" (#107416).

Write .vbs as UTF-16 LE with BOM, write non-ASCII .cmd content in the
system code page when it matches the console page (CJK/Thai locales),
and BOM-sniff plus code-page-fallback on read so launchers from older
installs keep parsing and migrate on refresh. The hidden .vbs launch
path originates from #95480, which addressed console visibility only.

* refactor(daemon): drop unused WindowsLauncherScriptFormat export

The type is only referenced by encodeWindowsLauncherScript's format
parameter within the module, so the export tripped check-deadcode-exports.
Keep it module-local.

* fix(daemon): mark code-page cmd launchers with their encoding for deterministic readback

Prepend an ASCII '@rem openclaw-launcher-encoding=<label>' line to code-page
.cmd launchers and decode by that marker instead of sniffing UTF-8. Some GBK
byte sequences are valid UTF-8 (隆 = C2 A1 reads as ¡), so the old sniff
silently corrupted readback and rejected valid paths; the marker makes decode
deterministic and drops the code-page probe (a PowerShell spawn) from the
frequent readScheduledTaskCommand poll path.

Also fix the representability guard for euc-kr: Node ICU decodes euc-kr as
KS X 1001 only, but Windows code page 949 is cp949/UHC, so the TextDecoder
cross-check false-rejected ~8,800 UHC extension syllables (똠 = 8C 63) that
iconv encodes and cmd.exe reads fine. Verify euc-kr via iconv's own cp949
round-trip; keep TextDecoder for the other five labels.

* fix(infra): write Windows restart helper scripts through the launcher encoder

The update-time restart helper wrote its temp .cmd as raw UTF-8 while
embedding the restart-log path, task name, and task script path, so a CJK
profile path or task name broke the same way as the gateway launchers
(#107416). Route the write through encodeWindowsLauncherScript: ASCII content
stays byte-identical UTF-8, CJK content gets the marked code-page encoding, and
an unrepresentable task name now fails the restart attempt cleanly instead of
writing a script cmd.exe would misread.

* chore(deps): minimize pnpm-lock delta for the iconv-lite promotion

Reset pnpm-lock.yaml to origin/main and re-add only the iconv-lite root
importer entry, dropping the unrelated @types/node peer-context flips and
audio-decode deprecation metadata that a mismatched-toolchain regeneration had
pulled in. The diff vs main is now the three-line importer entry only; the
version already resolves in main's tree via express -> body-parser/raw-body.

* refactor(windows): centralize launcher encoding

Co-authored-by: Jason Yao <wsyjh8@gmail.com>

* style(windows): format launcher encoding test

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-16 00:42:56 -07:00
Peter SteinbergerandGitHub b23292cc3f test(ci): repair release validation gates (#108646)
* test(agents): harden Z.AI live output probe

* test(agents): classify live provider failures

* test(ci): strengthen package export contract

* chore(protocol): regenerate Swift session create params
2026-07-16 00:42:41 -07:00
73ada8fd4c fix(ai): preserve tool-result text for payload-less media (#108697)
* fix(ai): require payload bytes for tool media

Co-authored-by: Alex Knight <15041791+amknight@users.noreply.github.com>

Co-authored-by: 0668000539 <shu.zongyu@xydigit.com>

* chore: keep release notes out of PR

---------

Co-authored-by: 0668000539 <shu.zongyu@xydigit.com>
2026-07-16 00:42:36 -07:00
1c71f4104c fix(http-error-body): log response body snippet read errors instead of silently returning empty string (#106393)
* fix(http-error-body): log response body snippet read errors instead of silently returning empty string

readResponseBodySnippet used a bare catch {} that silently swallowed all
errors (network failure, body already consumed, decode errors, stream
aborts) and returned an empty string with no diagnostic. This made it
impossible to distinguish between a genuinely empty response body and
a read failure.

Replace catch {} with catch (err) { errorBodyLog.warn(...); return ""; }
so failures are visible in diagnostics while preserving the best-effort
snippet contract.

* fix(http-error-body): assert subsystem warning in error visibility tests

ClawSweeper review identified that the error-path tests only checked
the empty-string fallback, which the old silent catch would also pass.
Add mockWarn assertions to verify the warning is emitted with the
formatted error text, and add beforeEach to clear mocks between tests.

* test(http-error-body): assert logged read errors

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:42:25 -07:00
0960d07d8e ci: gate PR edit automation by changed field (#95010)
* ci: gate PR edit automation by changed field

* ci: include title edits in ClawSweeper dispatch gate

* ci: refine PR edit automation gates

Co-authored-by: Sash Zats <sash@zats.io>

* test(ci): require boolean workflow matcher

Co-authored-by: Sash Zats <sash@zats.io>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:42:14 -07:00
Peter SteinbergerandGitHub 48b11d1c66 fix(update): repair obsolete managed Gateway Node (#108668)
* fix(update): refresh stale managed service Node

* refactor(update): keep preflight result internal

* docs(changelog): defer update note to release
2026-07-16 00:41:43 -07:00
Peter SteinbergerandGitHub 7c19c3c068 refactor(agents): share Responses tool-call tracking (#108721) 2026-07-16 00:41:30 -07:00
Peter SteinbergerandGitHub 527c8cee0c feat(discord): adapt voice wake names to room size (#108696)
* feat(discord): adapt voice wake names to room size

* chore(discord): defer voice release note

* chore(protocol): regenerate session create model
2026-07-16 00:41:26 -07:00
1c7ad75966 fix(openrouter): forward safe music request policy (#104835)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:40:45 -07:00
e868a1dbd1 fix: recognize provider-wrapped HTTP status for session retry (#106850)
* fix: recognize provider-wrapped HTTP status for session retry

* fix(llm): scope wrapped status parsing to retry

Preserve the leading-status contract for rate-window and formatting callers while letting retry classification recognize built-in provider wrappers.

Co-authored-by: wuqingxuan <wu.qingxuan@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:40:15 -07:00
292e8c3e72 fix(msteams): add timeouts to SharePoint file send requests (#104288)
* fix(msteams): add timeouts to SharePoint file send requests

* fix(msteams): clean up SharePoint timeout proof

* fix(msteams): use transfer deadline for SharePoint uploads

* test(msteams): normalize SharePoint abort rejection reasons

* fix(msteams): size SharePoint upload deadline by file length

* chore(deadcode): allowlist test-only timeout constant exports

* fix(msteams): harden SharePoint sharing deadlines

Co-authored-by: Alix-007 <li.long15@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 00:39:40 -07:00
Peter SteinbergerandGitHub fca2e830e0 fix(auth): session refresh preserves OAuth providers (#108680)
* fix(auth): isolate OAuth provider registries

* fix(auth): remove OAuth registry back edge
2026-07-16 00:39:28 -07:00
Peter SteinbergerandGitHub fecd11fdc9 perf(test): unref process watchdogs (#108643) 2026-07-16 00:39:08 -07:00
Peter SteinbergerandGitHub 7a398fe6f8 fix(update): preserve plugin policy on failures (#108661) 2026-07-16 00:38:44 -07:00
Peter SteinbergerandGitHub 138178620d fix(protocol): regenerate Swift session thinking level (#108715) 2026-07-16 00:22:47 -07:00