Commit Graph

40805 Commits

Author SHA1 Message Date
Peter Steinberger 6fbaa4d232 ui: complete contextual Settings documentation links (#115665)
* feat(config): require docs decisions for root settings

* feat(ui): link settings pages to guides

* refactor(ui): keep model providers page compact

* fix(ui): style page subtitles and carry base hints in mock dev
2026-07-29 03:35:28 -04:00
Peter Steinberger 6090386dc7 fix: make Codex harness caching and benchmark parity exact (#115663) 2026-07-29 03:33:36 -04:00
Peter Steinberger 6ec84bc3bd fix(models): expose custom max and ultra reasoning tiers (#115690)
* fix(models): honor custom advanced reasoning levels

* fix(ci): restore code mode matrix boundaries
2026-07-29 03:33:30 -04:00
Peter Steinberger b9846c9332 refactor(agents): deduplicate fallback observations (#115687) 2026-07-29 03:31:07 -04:00
Peter Steinberger 14ad80481a perf(gateway): prewarm dashboard data caches after startup (#115710) 2026-07-29 03:30:46 -04:00
Vincent Koc 892907bf25 fix(agents): bound Code Mode repair retries (#115729) 2026-07-29 15:26:00 +08:00
Vincent Koc 25d6e5f841 fix(onboarding): Codex setup no longer fails after verification (#115704)
* fix(onboarding): keep verified Codex harness active

* chore(ci): refresh pull request base
2026-07-29 15:25:35 +08:00
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
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
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 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 665b312452 fix(delivery): keep session keys out of inferred message targets (#115657) 2026-07-29 02:26:02 -04: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 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
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
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 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 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 3b5676d2df fix(mcp): recover expired stateful HTTP sessions (#115614) 2026-07-29 01:52:30 -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
Peter Steinberger 42dd07748b fix(health): reduce diagnostic refresh spam (#115602) 2026-07-29 01:43:36 -04:00
Peter Steinberger 5fe07e4ae8 fix(update): honor declared plugin entrypoints during repair (#115610) 2026-07-29 01:43:30 -04:00
Peter Steinberger a3a969be5d fix(cli): avoid duplicate commentary delivery (#115596) 2026-07-29 01:40:55 -04:00
Peter Steinberger a24c1ceb3a fix(channels): release inbound debounce at admission (#115603)
Track full dispatch completion separately for error handling and shutdown drain while allowing same-session follow-ups to steer active runs. Fixes #113180.

Co-authored-by: Taksh <takshkothari09@gmail.com>
2026-07-29 01:38:15 -04:00
Peter Steinberger ec4c90c455 fix(onboard): reject conflicting custom inputs (#115595) 2026-07-29 01:34:54 -04:00
Peter Steinberger 161a136941 fix(gateway): speed up startup with stateless plugin paths (#115578) 2026-07-29 01:34:49 -04:00
Peter Steinberger 0588c4f44c fix(gateway): accept SDK Responses plain-text format (#115594)
Accept only the official OpenAI Responses SDK plain-text format and preserve strict rejection of unsupported structured outputs and verbosity.

Reported-by: @logicbridgedev

Refs: #80418
2026-07-29 01:33:42 -04:00
Peter Steinberger 98a066c90e fix(agents): project llama.cpp-safe tool schemas (#115598)
Co-authored-by: Jithin Mohandas <mohandasjithin@gmail.com>
2026-07-29 01:33:32 -04:00
joshavant 6831f05184 fix(message): authorize fallback broadcast provider 2026-07-29 00:30:47 -05:00
joshavant c4cd5a2bb4 fix(message): guard channel-less broadcast accounts 2026-07-29 00:30:47 -05:00
joshavant 23c318625b fix: bind delegated message accounts to current turns 2026-07-29 00:30:47 -05:00
Alex Knight be24db5f72 fix(auth): reuse Claude CLI logins natively and stop forwarding expired OAuth tokens (#115134)
* fix(auth): refresh selected Claude CLI profiles

* fix(auth): run imported Claude CLI logins as verified native passthrough

* fix(auth): satisfy CLI auth failure exhaustiveness

* docs: remove PR changelog entry

---------

Co-authored-by: Alex Knight <15041791+amknight@users.noreply.github.com>
2026-07-29 01:30:07 -04:00
Peter Steinberger c037c4ed45 fix(gateway): cancel disconnected HTTP tool calls (#115550) 2026-07-29 01:29:47 -04:00
Peter Steinberger 5d55258694 fix(heartbeat): deliver task-preempted same-session commitments (#115581) 2026-07-29 01:29:27 -04:00