Commit Graph

73289 Commits

Author SHA1 Message Date
Vincent Koc
dd3d1d1a8b fix(ui): hide pre-thread changes from session diffs (#115708)
* fix(ui): scope session diffs to thread changes

* docs: refresh generated map
2026-07-29 15:17:47 +08:00
Peter Steinberger
844329284e fix(ios): prevent duplicate native chat replies after tool runs (#115678) 2026-07-29 02:59:25 -04:00
Peter Steinberger
138675aeeb feat(apps): render collapsible details natively (#115641)
* feat(apps): render collapsible details natively in chat

* fix(apps): preserve reference definitions when folding disclosures

* fix(apps): keep authored details summaries unlocalized

* fix(apps): keep raw-HTML disclosure examples literal

* refactor(apps): isolate summaries and raw HTML contexts

* fix(apps): honor all CommonMark raw HTML contexts in disclosures

* chore(apps): refresh native i18n inventory for disclosure strings
2026-07-29 02:52:54 -04:00
Vincent Koc
9daa60961c fix(agents): serialize sandbox provisioning (#115645)
* fix(agents): serialize sandbox provisioning

* test(docker): add sandbox browser sidecar e2e

* fix(ci): register sandbox browser e2e entrypoint

* fix(ci): restore code mode matrix checks
2026-07-29 14:50:15 +08:00
iloveleon19
c193ffd554 fix(mattermost): key private channels as group on outbound routing (#96645)
* fix(mattermost): key private channels as group on outbound routing

A Mattermost private channel (server type `P`) is authoritatively chat_type
`group`, but it is addressed as the delivery target `channel:<id>` — the same
prefix as a public channel. Inbound classified it correctly as `group`, while
outbound/session reconstruction re-derived `channel` from the target string, so
one conversation was keyed under two session namespaces
(`...:mattermost:group:<id>:thread` inbound vs a phantom `...:channel:<id>:thread`
on delivery). Threaded/scheduled deliveries bound to one then failed to match the
other (fail-closed delivery, or a conversation split across two session keys).

The Mattermost outbound path could not represent `group` at all:
resolveMattermostOutboundSessionRoute only produced direct/channel, and
resolveMattermostOpaqueTarget only classified user/channel.

- session-route: key a conversation as `group` from an authoritative signal — the
  resolved target kind, an explicit `group:` prefix, or the inbound
  currentSessionKey peer kind — so outbound shares the inbound `group:<id>`
  namespace instead of forking `channel:<id>`.
- target-resolution: classify a bare channel id by its real channel type
  (P/G -> group, O -> channel), cached per id.

The wire target stays `channel:<id>` (Mattermost posts to the channel id either
way; parseMattermostTarget only accepts channel:/user:) — the group distinction
lives in the session key. Adds unit coverage for both paths.

Resolves #95646.

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

* fix(cron): route bound-session cron deliveries under the bound namespace

An isolated cron run executes under an ephemeral agentSessionKey that does not
carry the source conversation's namespace. resolveDirectCronDeliverySessionKey
resolved the outbound delivery route from that isolated key, so for a job bound
to a real conversation thread (e.g. the gitlab-pipeline-watch recheck bound to
agent:...:mattermost:group:<id>🧵<root>) the lossy channel:<id> target was
re-derived as `channel`, forking a phantom channel:<id> session and splitting the
private-channel thread across two namespaces (#95646).

Prefer the job's bound conversation identity as the currentSessionKey used to
resolve the route (new selectCronRouteCurrentSessionKey helper), so the existing
currentSessionKey-based namespace resolution keeps group:<id>. No channel-type
cache is introduced — which is what made the cache-based attempts brittle on cold
restart (a sibling PR documented exactly that failure mode). Falls back to the
isolated key for unbound jobs and cron-namespace bindings. Adds unit coverage.

Refs #95646.

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

* fix(mattermost): key public channels as channel in directory listing

listMattermostDirectoryGroups labeled every joined channel — public `O`
and private `P` — as kind `group`. A name-resolved public channel could
then be keyed as `mattermost:group:<id>` on outbound routing, forking a
phantom group session and splitting the transcript from the inbound
`channel:<id>` one. Derive the kind from the authoritative Mattermost
channel type (`O` -> channel, `P`/`G` -> group) and add a regression
test. This closes the public-channel regression path flagged in review
for #95646 while keeping private channels keyed as `group`.

* fix(mattermost): harden private channel routing

* test: expose cron route selection through production module

* fix. scope cron session reuse to Mattermost delivery

* fix(cron): validate bound delivery peer and channel authority

* fix(cron): capture validated delivery destination peer

---------

Co-authored-by: leon <leon@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 02:43:21 -04:00
Dallin Romney
7fe920a7d0 fix(ci): grant Telegram QA runtime scratch access (#115659) 2026-07-29 14:42:43 +08:00
Peter Steinberger
bf4122b0a7 fix(telegram): stop retrying blocked recipients (#115640)
Classify pinned Grammy blocked, kicked, and deactivated recipient 403 responses as permanently unreachable. Preserve retry behavior for recoverable permissions and flood control, inspect wrapped causes, and prove real SQLite ingress drain dead-lettering without duplicate dispatch.

Fixes #112893
2026-07-29 02:39:48 -04:00
Peter Steinberger
0babd1a73f fix(tts): persist generated speech in media store (#115647) 2026-07-29 02:37:19 -04:00
Peter Steinberger
1425a6ca28 fix(gateway): preserve complete streamed chat completions (#115652)
Preserve cumulative assistant snapshot prefixes and flush same-turn text before terminating OpenAI-compatible Gateway SSE.

Fixes #81991

Refs: #82355

Co-authored-by: honor2030 <19909783+honor2030@users.noreply.github.com>
2026-07-29 02:33:28 -04:00
Peter Steinberger
b2701ac9cf fix(mac): prevent app auth from blocking node-host startup (#115533)
* fix(mac): move device auth tokens to shared SQLite state

* fix(mac): fail identity migration when source auth vanishes mid-read

Missing-file tolerance now applies only to the first observation; a disappearance after the auth file was observed fails the migration so the claimed identity survives for retry instead of committing without its credentials.

* fix(ios): validate auth scope UTF-8 encoding

* fix(ios): isolate SQLite auth profiles

* chore(ios): refresh native source inventory

* fix(mac): keep device auth in the shared token table

* test(mac): pin shared-key token cache semantics
2026-07-29 02:33:03 -04:00
Peter Steinberger
32e522e88b fix(heartbeat): keep message-tool final replies private (#115629) 2026-07-29 02:28:55 -04:00
wm0018
a1d31204f1 fix(gateway): drain root work continuations before direct-stop process exit (#105848)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 14:28:14 +08:00
Peter Steinberger
f466ad0e71 fix(ollama): keep active streams within their idle timeout (#115648)
Retain the existing guarded-fetch timeout callback while consuming native Ollama NDJSON. Prove active slow HTTP streams remain alive and genuine stalls still expire.

Reconstructed from the independently reviewed contributor fix for #94251.

Co-authored-by: Henry <henrybrewer93@icloud.com>
2026-07-29 02:27:02 -04:00
Peter Steinberger
665b312452 fix(delivery): keep session keys out of inferred message targets (#115657) 2026-07-29 02:26:02 -04:00
Dallin Romney
7a8df4920d fix(ci): type code mode matrix catch callback (#115674) 2026-07-29 14:24:57 +08:00
Peter Steinberger
c55acff049 refactor(agents): centralize bundled CLI backend auth policy (#115633) 2026-07-29 02:22:40 -04:00
Peter Steinberger
ddd0b48673 refactor: remove 3,527 lines of runtime and test duplication (#115626)
* refactor: remove obsolete runtime and test duplication

* test: preserve typed cron and realtime fixtures
2026-07-29 02:21:20 -04:00
SunnyShu
f5ab77a241 [AI] fix(doctor): stop repeated bundledDiscovery migration noise on beta (#115208)
Beta versions (e.g. 2026.7.2-beta.5) are treated by SemVer as older than
the cutover release (2026.7.2), so migrateLegacyConfigMachineState would
re-infer plugins.bundledDiscovery = "compat" on every new CLI process.
The inferred entry always went into importConfigMachineState's 'kept'
bucket, which was then reported as a Doctor change — producing misleading
"Auto-migrated legacy state" / "Kept existing shared SQLite ..." output
on every restart.

Fix: skip the inferred compat candidate when the canonical SQLite row
already exists. A try/catch guards against temporary SQLite
unavailability.

Related to #115151

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-29 02:20:32 -04:00
Peter Steinberger
5da5551a5c fix(qa): verify paired Ollama nodes over the gateway (#115644) 2026-07-29 02:18:16 -04:00
Peter Steinberger
1b9481012b fix(active-memory): share one recall per run across retries (#115627)
* fix(active-memory): share one recall per run across retries

Register in-flight recalls per ctx.runId so overlapping or changed-prompt
attempts join a single execution, and gate replacement recalls on settled
timeout cleanup. Entries clear on agent_end. Fixes #106957.

* fix(active-memory): evict rejected recall entries

* test(active-memory): clarify run result retention

* test(active-memory): complete recall result fixture
2026-07-29 02:16:59 -04:00
Peter Steinberger
82de02209c refactor: reuse doctor migration durability helpers (#115625)
* refactor: reuse shared doctor durability helpers

* fix: update rebased durability call site
2026-07-29 02:16:45 -04:00
Sanjay Santhanam
b8b9f8949d docs: fix unsupported pnpm approve-builds -g in global install (#106180)
Closes #106166

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 02:15:18 -04:00
Peter Steinberger
921b0e1dda feat(openai): support GA realtime over ChatGPT OAuth (#115623) 2026-07-29 02:14:23 -04:00
Vincent Koc
1c36054494 feat(agents): add code mode model acceptance matrix (#115305)
* feat(agents): add code mode model acceptance matrix

* fix(qa): emit canonical Code Mode matrix evidence

* fix(qa): reserve code mode matrix output safely

* fix(qa): require fresh matrix builds

* fix(qa): protect matrix evidence paths
2026-07-29 14:12:20 +08:00
ToToKr
ac09e35bd3 fix(signal): reject malformed base64 attachment data (#114883)
signalRpcRequest returns the JSON-RPC result via a bare cast, so getAttachment data reaches Buffer.from unvalidated. Node drops out-of-alphabet characters instead of throwing, so a damaged payload was silently written to disk as a corrupted attachment. Canonicalize after the existing size guard and fail with the attachment id instead.
2026-07-29 02:11:40 -04:00
Peter Steinberger
5d0594d064 fix(onboard): reject remote flags in local mode (#115636) 2026-07-29 02:09:26 -04:00
Peter Steinberger
e93fa7567b refactor: table-drive retired model migrations (#115618) 2026-07-29 02:06:40 -04:00
Peter Steinberger
4f428e6226 fix(ui): fall back when profile hero avatar fails (#115600) 2026-07-29 02:06:10 -04:00
Peter Steinberger
8fd49c84aa feat: make self-learning automatic by default (#115576)
* feat: make self-learning automatic by default

* fix: preserve capture authorization boundaries

* test: split autonomous capture coverage
2026-07-29 02:04:57 -04:00
Vincent Koc
4f4fc7a7ca fix(agents): report embedded deadlines as timeouts (#115319)
* fix(agents): preserve embedded timeout outcomes

* fix(agents): stop fallback after hard timeout
2026-07-29 14:04:23 +08:00
Vincent Koc
3b3a64c322 fix(cli): keep JSON stdout valid through finalization (#115315)
* fix(cli): preserve JSON stdout through finalization

* test(cli): cover JSON entrypoint routing

* fix(cli): preserve native relay import ordering
2026-07-29 14:04:12 +08:00
Vincent Koc
44aaa2f916 fix(agents): clarify code mode contract for small models (#115275) 2026-07-29 14:04:01 +08:00
Peter Steinberger
117e44cb80 fix(linux): package media codecs for deb and AppImage (#115616)
* fix(linux): package media codecs

* fix(linux): bundle AppImage media codecs

* docs: refresh Linux page map
2026-07-29 02:03:55 -04:00
Peter Steinberger
95f62ee3ed fix(gateway): redact CLI-imported history before dedupe (#115597)
* fix: redact imported CLI chat history

Apply transcript redaction to Claude CLI messages before history merge so locally redacted and imported copies dedupe consistently.

This also prevents secrets present only in the CLI transcript from reaching Control UI chat history.

Fixes #112930

* fix(gateway): type imported history redaction bridge
2026-07-29 02:02:23 -04:00
Peter Steinberger
350a6b081a fix(gateway): bound stalled plugin shutdown (#115619)
Reuse the existing runtime shutdown grace so a hanging plugin stop cannot prevent channel and MCP/LSP child-process cleanup after SIGINT.

Fixes #106714

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 02:02:08 -04:00
Peter Steinberger
802c71cb1a refactor(gateway): deduplicate message operation routing (#115615) 2026-07-29 02:01:32 -04:00
Peter Steinberger
032defb172 fix(nodes): cancel paired local inference when callers disconnect (#115624) 2026-07-29 02:00:22 -04:00
Peter Steinberger
26aa0f5e59 fix(googlechat): surface failed replies without duplicate sends (#115638)
* fix(googlechat): surface reply send failures instead of silently dropping chunks

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

* test(googlechat): narrow regex match index for noUncheckedIndexedAccess

* fix(googlechat): isolate outbound delivery status reporting

---------

Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-29 02:00:06 -04:00
Vincent Koc
5ecd5f45db chore(i18n): refresh native locales (#115608) 2026-07-29 13:59:04 +08:00
Peter Steinberger
5b6d326567 refactor(chat): consolidate media and outbox lifecycle state (#115621) 2026-07-29 01:56:51 -04:00
Peter Steinberger
fed427a50e fix(codex): scope ephemeral runs to physical session bindings (#115601)
* fix(codex): scope ephemeral session bindings

* test(codex): normalize startup assertion errors
2026-07-29 01:56:46 -04:00
Peter Steinberger
26bfa88bb2 fix: restore native Talk transcripts, fallback, and microphone access (#115577)
* fix(ios): decode frameless Talk events

* fix(android): keep browser-only Talk models native

* fix(macos): gate dashboard media capture

* docs(talk): clarify native platform fallbacks

* chore(i18n): refresh native source inventory

* fix(android): gate relay entry on provider-level browser-only models too
2026-07-29 01:55:47 -04:00
Peter Steinberger
3b5676d2df fix(mcp): recover expired stateful HTTP sessions (#115614) 2026-07-29 01:52:30 -04:00
Peter Steinberger
23db233bb5 fix(msteams): recognize provider-prefixed target ids (#115609)
* fix(msteams): recognize provider-prefixed target ids

* style(msteams): format explicit target regression matrix
2026-07-29 01:51:48 -04:00
Peter Steinberger
d976c2ea82 fix(gateway): bound live session history memory (#115599) 2026-07-29 01:49:08 -04:00
Gio Della-Libera
47f654ea14 fix(claws): report plugin setup readiness (#114899)
* fix(claws): report plugin setup readiness

* fix(claws): keep setup readiness helper private

* fix(claws): honor local provider auth evidence

* fix(claws): require auth-method-only setup

* fix(azure-speech): keep setup envs credential-only

* revert(azure-speech): preserve compound setup metadata
2026-07-29 05:48:35 +00:00
Peter Steinberger
cc3b059497 fix(plugins): honor update channel for targeted probes (#115604) 2026-07-29 01:46:53 -04:00
Peter Steinberger
d131ec6016 fix(skills): isolate coding-agent Codex auth (#115611) 2026-07-29 01:43:42 -04:00
Dallin Romney
2fa91f48d0 fix(ci): validate frozen release candidates (#115605)
* fix(ci): support historical i18n targets

* test(ci): cover historical i18n verification
2026-07-29 13:43:39 +08:00
Peter Steinberger
42dd07748b fix(health): reduce diagnostic refresh spam (#115602) 2026-07-29 01:43:36 -04:00