Commit Graph
70876 Commits
Author SHA1 Message Date
8d4d02a3cf fix(usage): guard malformed Z.AI usage payloads (#110741)
* fix(usage): guard malformed Z.ai usage payloads

* fix(usage): normalize Z.ai usage payloads

* fix(usage): preserve empty Z.ai snapshots

---------

Co-authored-by: Leon-SK668 <17695126+Leon-SK668@users.noreply.github.com>
Co-authored-by: Altay <altay@hey.com>
2026-07-20 16:14:42 +03:00
8518603392 fix(tts): contract speech requests hang on stalled endpoints (#110725)
* fix(tts): time out stalled contract speech requests

* fix(tts): release discarded contract responses

* test(tts): reuse canonical HTTP server helper

* test(tts): mark fixture credential synthetic

---------

Co-authored-by: Mason Huang <masonxhuang@proton.me>
2026-07-20 21:02:39 +08:00
756de70e84 fix(signal): report malformed release metadata cleanly (#110824)
* fix(signal): validate release metadata before install

* refactor(signal): normalize release metadata once

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

* test(signal): prove normalized install version

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 05:19:34 -07:00
Colin JohnsonandGitHub 2f967bc8f3 test(ios): refresh chat voice and sidebar UI coverage (#111655) 2026-07-20 08:02:16 -04:00
Peter SteinbergerandGitHub 0ac7b24d56 feat(channels): batch 3 producers drop media placeholder bodies (#111800)
* feat(channels): batch 3 producers drop media placeholder bodies

Media-placeholder program batch 3: iMessage, Signal, and WhatsApp stop
minting <media:kind> placeholder bodies. Primary bodies carry captions
only with one aligned structured fact per native attachment (type-only
for missing/rejected/oversized). Echo, quote, and pending-history
records gain structured media facts so dedupe and previews work without
rendered text. Signal media-only outbound sends drop the placeholder
body entirely (signal-cli accepts attachment-only sends; recipients now
see just the media). WhatsApp audio preflight de-stringed; qa-lab
sticker recognizer moved to structured facts; WhatsApp gif maps to
video (presentation mode, no behavioral consumer).

* test(whatsapp): keep media classifier private
2026-07-20 04:22:44 -07:00
7bac63889e fix(nostr): prefixed targets fail to send (#110881)
* fix(nostr): prefixed targets send successfully

* fix(nostr): address target normalization review

* fix(nostr): preserve invalid prefixed allowlist tokens

* test(nostr): cover prefixed npub outbound targets

Co-authored-by: 杨浩宇0668001029 <yang.haoyu@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 04:21:49 -07:00
Pavan Kumar GondhiandGitHub 8d5ad804a6 fix: require admin for keyed session model changes [AI] (#111651)
* fix: gate keyed session model creation

* fix: preserve fresh keyed session creation

* fix: cover existing keyed model adoption

* fix: keep keyed session create idempotent

* fix: resolve keyed session model aliases before gating

* fix: tighten keyed session gate comparison

* docs: clarify keyed session gate fail-closed cases

* docs: explain keyed session model error gating

* fix: clarify unscoped keyed session gate

* fix: share session model patch resolution

* fix: preserve existing auth profile no-op creates

* fix: resolve subagent defaults in keyed session gate
2026-07-20 16:33:33 +05:30
Peter SteinbergerandGitHub 8bec61bab1 fix(cli): reject unknown models in config set (#111571)
* fix(cli): validate configured model references

* fix(cli): cover dependent model references

* fix(cli): reject malformed model references

* test(cli): satisfy model validation gates

* fix(cli): harden model validation drafts

* fix(cli): preserve model runtime ownership

* fix(cli): validate expanded model references

* fix(cli): close model validation gaps

* fix(cli): preserve model alias ownership

* fix(cli): secure model validation context

* fix(cli): redact expanded model references

* fix(cli): validate inherited agent catalogs

* fix(cli): align canonical model resolution

* fix(cli): scope inherited catalog validation

* fix(cli): compare resolved model snapshots

* fix(cli): cover model dependency transitions

* fix(cli): isolate model env validation

* fix(cli): redact dependent model checks

* fix(cli): compare agent model identity

* fix(cli): validate expanded model removal

* fix(cli): defer unresolved fallback validation

* fix(cli): preserve authored model changes
2026-07-20 03:31:03 -07:00
fab745b82d fix(infra): guard malformed Claude usage responses (#111088)
* fix(infra): guard malformed Claude usage responses

* fix(infra): normalize Claude usage payloads

Co-authored-by: Leon-SK668 <17695126+Leon-SK668@users.noreply.github.com>

---------

Co-authored-by: Leon-SK668 <17695126+Leon-SK668@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 03:26:33 -07:00
Peter SteinbergerandGitHub 7fe1d70a50 fix(mcp): prevent custom server config races and parsing errors (#111761)
* fix(mcp): harden custom server management

* fix(ui): keep config patch types private
2026-07-20 02:34:13 -07:00
Peter SteinbergerandGitHub a1f43b218a feat(ui): offer page refresh on protocol-mismatch failure (#111772) 2026-07-20 02:31:40 -07:00
VectorPeakGitHubchatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>Peter Steinberger
3ef2d8cf05 fix(sms): trim prefixed phone number spacing (#111111)
Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 02:29:06 -07:00
Peter SteinbergerandGitHub 7defd4a7b4 refactor(android): split offline client databases (#111710)
* refactor(android): split offline client databases

* chore(android): refresh native i18n inventory

* test(gateway): close databases before transcript cleanup
2026-07-20 02:28:02 -07:00
Peter SteinbergerandGitHub 473f2aca33 fix(gateway): honor session title model routing (#111757)
Route automatic dashboard titles through the effective session model and auth profile while preserving explicit cross-provider utility ownership and the existing generic title fallback.
2026-07-20 02:19:57 -07:00
Peter SteinbergerandGitHub 9056c43368 docs(gateway): add client-building and embedding guides (#111726)
* docs(gateway): add client-building and embedding guides

* docs(gateway): harden package rollout guidance
2026-07-20 02:12:52 -07:00
Peter SteinbergerandGitHub fd081d6521 fix(ui): keep Codex commentary visible after runs (#111648)
* fix(ui): keep Codex commentary visible

* fix(codex): preserve commentary transcript ordering

* fix(ui): preserve commentary retention opt-out
2026-07-20 02:10:56 -07:00
2c05365fbd fix(plugins): decode self-hosted discovery JSON with fatal UTF-8 validation (#111113)
* fix(plugins): decode self-hosted discovery JSON with fatal UTF-8 validation

* ci: retrigger checks

* refactor(plugins): share self-hosted JSON decoding

Co-authored-by: zenglingbiao <zeng.lingbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 02:07:45 -07:00
Peter SteinbergerandGitHub 922240568a fix(doctor): check every configured agent (#111758) 2026-07-20 02:05:53 -07:00
Peter SteinbergerandGitHub 5d80b62d21 fix(ui): nudge stale tabs after gateway updates (#111619)
* fix(ui): nudge stale tabs after gateway updates

* fix(ui): resolve external packages in worktrees
2026-07-20 01:51:22 -07:00
Wynne668andGitHub 72f77364b3 fix(google): keep embedding batch waits within timeout (#111674) 2026-07-20 11:46:06 +03:00
Peter SteinbergerandGitHub 6f2fa019bd fix: honor configured default agent in consults (#111749) 2026-07-20 01:43:00 -07:00
Jason (Json)andGitHub 779cf40d46 feat(dashboard): harden transcript MCP App pinning (#111748) 2026-07-20 02:42:00 -06:00
Pavan Kumar GondhiandGitHub 391c3bcb17 fix(ui): neutralize Usage CSV text cells [AI] (#111653)
* fix(ui): neutralize usage csv text cells

* test(ui): align usage csv fixture types

* fix(ui): preserve benign usage csv whitespace
2026-07-20 14:08:33 +05:30
Pavan Kumar GondhiandGitHub 1de4a099ca fix: keep exec approval carriers scoped [AI] (#111652)
* fix: unwrap shell argv carriers for exec approvals

* fix: constrain shell carrier unwraps

* fix: block command path-search carriers
2026-07-20 14:06:03 +05:30
Peter SteinbergerandGitHub 0e62293104 fix(ui): keep sidebar session titles aligned (#111698)
* fix(ui): stabilize sidebar session indicators

* test(ui): update sidebar leading-slot assertion
2026-07-20 01:27:25 -07:00
Peter SteinbergerandGitHub 343cfba638 fix(clickclack): private API base for gated hostnames and single discussion-provider registration (#111724)
* fix(clickclack): split API base and refresh discussion provider

* chore: regenerate bundled channel config metadata and docs map for the apiBaseUrl key
2026-07-20 01:27:13 -07:00
Peter SteinbergerandGitHub 629de998f9 feat(system-agent): agentic cached caretaker greeting with quick actions (#111615)
* feat(system-agent): agentic cached caretaker greeting with quick actions

* test(gateway): pin caretaker greeting in session-ownership tests

* fix(system-agent): offer agent handoff chip only when a model is available

* fix(ci): typecheck narrowing, lint, and knip gates for greeting module

* fix(system-agent): reject structured greeting output on every retained line

* test(gateway): split caretaker welcome tests under the max-lines gate
2026-07-20 01:21:09 -07:00
Peter SteinbergerandGitHub 6eee1dccfc fix(cloud-workers): reclaim sessions after workspace conflicts (#111714)
* fix(cloud-workers): make reclaim failures retryable

* chore: leave changelog to release flow

* chore: fix cloud reclaim lint

* fix(cloud-workers): preserve committed reclaim recovery
2026-07-20 01:16:07 -07:00
Peter SteinbergerandGitHub 83e78d8681 fix(ui): quiet the reconnect-wait queue row and hide its raw transport error (#111703) 2026-07-20 01:11:27 -07:00
Peter SteinbergerandGitHub 248726fafd feat(anthropic): import Claude Desktop custom groups (#111644)
* feat(anthropic): import Claude Desktop custom groups

* fix(anthropic): resolve Claude Desktop groups from LevelDB entries

Group discovery regexed whole decompressed blocks, so matches were not
attributable to a Local Storage value and byte order decided the winner.
On a real 5.4MB store that mislabelled 59 of 159 sessions, surfacing a
mojibake label spliced out of Snappy copy-record bytes.

Parse SSTable entries properly instead: prefix-delta keys bounded by the
restart array, newest internal sequence per user key (honoring deletions),
and record scanning confined to a single value. Values are normalized so
Chromium's UTF-16 form scans like Latin-1, and unflushed WAL writes keep
precedence over SSTables.

Prod LOC grows ~77; it buys structural correctness in place of ordering
luck, and folds the old index-only walk into one shared entry decoder.

Verified against the live store: 159 assignments, 0 mislabelled versus an
independent entry-level ground truth, 0 control-character labels.

* fix(ui): sort custom session groups ahead of project groups

Custom groups were pushed into the section list as encountered, so their
position depended on roster order rather than the documented behavior;
the existing test only passed because its fixture happened to be ordered
that way. Collect custom and project groups separately and concatenate,
and assert the guarantee with a reversed-input case.

* fix(anthropic): widen LevelDB fixture key type for test typecheck

The prefix-delta helper assigned a Buffer into a Buffer-typed accumulator
whose generic argument differed, which tsgo rejects in the test lane.

* chore(anthropic): drop release-owned changelog edit from the PR

CHANGELOG.md is generated at release time, so a normal PR must not carry
an entry. The release-note context lives in the feature commit message and
the PR body instead.
2026-07-20 00:30:37 -07:00
Peter SteinbergerandGitHub a971188a6d build(client): make @openclaw/gateway-client publishable to npm (#111707) 2026-07-20 00:23:36 -07:00
Peter SteinbergerandGitHub 3e14caa2bd fix(ui): give markdown list items more breathing room (#111693) 2026-07-20 00:15:04 -07:00
Peter SteinbergerandGitHub f5940ee92d fix(ui): make stale-chunk Reload survive the gateway restart (#111670)
* fix(ui): make stale-chunk Reload survive the gateway restart

The 'A new version is available' banner appears precisely because the
gateway was just updated — so when the user clicks Reload, that gateway
is usually still restarting. The handler probed once and, on failure,
silently fell back to revalidating the same replaced chunk, so the
button looked dead and a manual hard reload was the only way out.

Poll the document probe until the gateway answers (bounded, so an
unreachable gateway still degrades to the recoverable panel error
rather than a fatal navigation), and show a disabled 'Reloading…' state
while waiting.

* fix(ui): enforce the reload wait deadline locally

The bound was only checked after each probe settled, so it relied on the
probe timing itself out. The default probe does self-abort, but a
caller-supplied one need not, and a probe that never settles would leave
the Reload button disabled forever. Race each probe against the
remaining deadline instead.

* fix(ui): satisfy lint and deadcode gates for the reload retry

CI caught two things local oxlint does not: the wait default returned
the timer id from a Promise executor (eslint no-promise-executor-return),
and retryStaleChunkReload became an unused export once the lazy-route
button moved to the polling variant.

Wrap the executor body, and collapse the two near-identical retry paths
into one: the polling helper with timeoutMs: 0 is exactly the old
single-shot behavior, which the stylesheet-recovery banner keeps.

* fix(ui): keep the reload wait bounded across interval waits

The deadline was checked before the interval wait, so a wait that
carried past it left the next iteration taking the unbounded
single-shot branch — a probe that never settles would then strand the
disabled Reload button past its own bound. Only the first attempt may
probe from outside the window.
2026-07-20 00:11:01 -07:00
Peter SteinbergerandGitHub 873c2a0c32 fix(ui): keep completed work expanded outside dashboard sessions (#111640) 2026-07-20 00:08:53 -07:00
Peter SteinbergerandGitHub 46ceb21b89 fix(control-ui): keep OpenClaw in settings (#111686) 2026-07-20 00:00:23 -07:00
Peter SteinbergerandGitHub 8a5b4af660 fix(gateway): make agent deletion transactional (#111678)
* fix: make agent deletion transactional

* fix: align deletion proof with config IO

* test: align deletion mocks with strict types

* test: remove stale cron helper

* chore: drop changelog entry and unshipped-schema compat branches

* fix: preserve reclaimed agent state

* fix: make agent deletion recovery durable

* fix: make agent cleanup symlink-safe

* fix: retain failed agent database ownership

* fix: harden agent deletion path ownership

* fix: persist agent cleanup completion

* docs: name the local trust-boundary bound on deletion fencing

* fix: satisfy agent deletion CI guards
2026-07-19 23:58:02 -07:00
Peter SteinbergerandGitHub 34f942e89d fix(agents): tolerate auth mutation before first prepared-model-runtime owner (#111627) (#111701) 2026-07-19 23:53:53 -07:00
Peter SteinbergerandGitHub e2e394e1ab fix(ui): give roster rows their avatar-text gap and add presence mock fixtures (#111689)
* fix(ui): add avatar-text gap in roster menu and presence mock fixtures

* refactor(ui): keep presence snapshot helper out of the connect auth hunk
2026-07-19 23:38:40 -07:00
Jason (Json)andGitHub 8c1ea03da0 fix(ui): bound dashboard MCP App lifecycle (#111691) 2026-07-20 00:38:04 -06:00
Jason (Json)andGitHub 6304a47762 feat(dashboard): harden MCP widget authority (#111679) 2026-07-20 00:32:02 -06:00
Peter SteinbergerandGitHub 6b80b01369 chore(pr): warn when ci-dispatch targets a remote head behind local work (#111694) 2026-07-19 23:24:29 -07:00
Peter SteinbergerandGitHub fef846a3f0 build(protocol): make @openclaw/gateway-protocol publishable to npm (#111664)
* build(protocol): make @openclaw/gateway-protocol publishable to npm

* chore(mxc): align package version with release train

* fix(release): support gateway-only core packages
2026-07-19 23:18:24 -07:00
8e40acbbb7 fix(control-ui): tighten About build grid spacing (#111532)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 23:18:12 -07:00
Peter SteinbergerandGitHub 401ef9770e fix(ui): restyle chat pane error banner as a compact centered alert (#111681) 2026-07-19 23:12:03 -07:00
Peter SteinbergerandGitHub e67fda8ec8 fix(clickclack): accept omitted nullable managed-channel fields and auto-open the discussion panel (#111685)
* fix(clickclack): accept omitted nullable managed-channel fields and auto-open the discussion panel

* fix(ui): open the discussion when write access arrives after it resolved
2026-07-19 23:10:29 -07:00
Peter SteinbergerandGitHub f67e55ac00 refactor: unify the embedded-agent fallback run-entry across all four pipelines (#111608)
* refactor(agents): unify fallback run-entry across channel, command, memory, and follow-up paths

* refactor(agents): keep run-entry contracts module-local

* test(reply): derive run-entry params type locally
2026-07-19 23:08:55 -07:00
Peter SteinbergerandGitHub 250e636ffd fix(onboard): reject invalid setup options before writes (#111680)
* fix(onboard): validate setup options before mutation

* fix(onboard): keep flow helper type local
2026-07-19 23:05:23 -07:00
8c9ecd9242 fix(process): use a valid PTY type when TERM is blank (#111261)
* fix(process): ignore blank PTY terminal names

* fix(process): normalize PTY terminal identity

Co-authored-by: LZY3538 <liu.zhenye@xydigit.com>

* fix(process): keep PTY default private

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 22:58:24 -07:00
Peter SteinbergerandGitHub 104128dd32 chore(pr): dev-wrapper opt-in — advisory subcommands may dogfood modified wrappers (#111656)
* chore(pr): dev-wrapper opt-in — advisory subcommands may dogfood modified wrappers

* fix(pr): hermetic dev-wrapper test fixture and type narrowing
2026-07-19 22:58:15 -07:00
Peter SteinbergerandGitHub 6e19c36d41 feat(channels): batch 2 producers drop media placeholder bodies (#111665)
* feat(channels): batch 2 producers drop media placeholder bodies

Media-placeholder program batch 2: Discord, Feishu, and MSTeams stop
minting <media:kind> placeholder bodies. Primary bodies carry captions
only; native resources produce ordered structured facts with type-only
facts for failures/rejections (batch-1 alignment contract). Discord
stickers travel as native kind "sticker" (not MIME-derivable); text
carriers (forwarded snapshots, room history, thread starters, pending
text) render via formatMediaPlaceholderText. Feishu audio preflight and
MSTeams unavailable selection move from body-string equality to
structured facts; dead placeholder payload builders deleted.

* test(discord): make allowlist policy explicit
2026-07-19 22:48:32 -07:00