Commit Graph

73457 Commits

Author SHA1 Message Date
ACD_RD4駱俊馳 e7f0fdfd9b fix: CJK replies are silently dropped instead of recovered when the model skips message(action=send) (#115556)
* fix(auto-reply): count CJK sentence terminators in stranded private-final detection

* fix(auto-reply): compare private-final substance thresholds with the CJK-aware estimator

* fix(auto-reply): detect CJK sentence boundaries

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:23:33 -04:00
Vincent Koc f6e874835c fix(gateway): stop managed crash loops for pending agent DB migrations (#115631)
* fix(gateway): recover managed services after agent DB migration

* test(infra): use managed temp directory cleanup
2026-07-29 19:21:46 +08:00
zhanxingxin1998 943ebc012e fix(plugins): validate constrained empty config schemas (#109569)
Route pattern, dependency, and active conditional schemas through the real plugin config validator while keeping standalone conditional annotations on the empty-config path.

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:20:52 -04:00
Totó Busnello d7864458a7 fix(cli-runner): scope bundle-MCP cleanup to the run's session, not the process-wide loopback server (#110251)
* fix(cli-runner): scope bundle-MCP cleanup to the run's session, not the process-wide loopback server

On run end, runCliAgentInternal handled cleanupBundleMcpOnRunEnd by calling
closeMcpLoopbackServer(), which tears down the process-wide MCP loopback HTTP
server for the whole gateway. Any concurrent CLI turn or restart-recovered live
session that already baked that loopback port into its --mcp-config is left
pinned to a dead port ("Unable to connect"), while the gateway still reports the
session as recovered. This is the same hazard the embedded-runner (run-loop.ts)
and CLI dispatch (cli-backend-dispatch.ts) paths already avoid by retiring only
session-scoped MCP runtimes.

Retire only this run's session-scoped MCP runtime here too (by session key, with
a session-id fallback), leaving the shared loopback server up for other sessions.
Every CLI spawn/respawn already re-derives the current loopback port and rewrites
mcp.json via prepareCliRunContext, so removing this teardown keeps recovered
sessions on a live transport instead of stranding them.

Fixes #98435

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMPjCgbgHTiB8X3R9XACPW

* fix(cli): preserve rebound MCP session owners

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:18:50 -04:00
zw-xysk ebf9fcc02c fix(feishu): log message content JSON parse failures instead of silently swallowing (#107947)
* fix(feishu): log message content JSON parse failures instead of silently swallowing

Replace formatErrorMessage(err) with safe metadata-only logging in
parseFeishuMessageContent to prevent potential message content leaks
through V8 JSON.parse error messages.

Changes:
- Remove formatErrorMessage import (security: V8 JSON.parse errors can
  include input content in the message)
- Log only msgType and optional messageId (safe metadata) when parse
  fails, never the exception message or raw content
- Add assertion that raw content is NOT present in the log output
- Pass messageId through to enable richer diagnostics

The raw content is still preserved as the function return value (existing
fallback behavior).

* fix(feishu): move parse-failure test into getMessageFeishu suite

The test 'logs a safe diagnostic (not raw content) when message content
is not valid JSON' was declared after the closing brace of
describe('getMessageFeishu'), so it did not inherit that suite's fixture
setup and reset hooks (beforeEach/afterAll). Move it inside the suite
so it benefits from the shared mock reset and cleanup.

Fixes ClawSweeper P2: 'Keep the parse-failure test inside the fetch suite'

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:16:24 -04:00
Ayaan Zaidi 987522fdcc docs(vision,agents): layer calibration, interface-on-demand, telemetry opt-in, whole-document guidance rules 2026-07-29 20:13:45 +09:00
Peter Steinberger 216f45af8e fix(memory): preserve Windows session ownership (#115851)
* fix(memory): preserve Windows session ownership

* test(memory): cover custom and nested Windows transcripts

* fix(memory): retain nested and custom Windows transcripts

* fix(memory): isolate agent-local Windows transcript stores

* style(memory): format Windows ownership regression coverage

* fix(memory): validate physical transcript ownership boundaries

* fix(memory): bind external session paths to configured agent stores

* fix(memory): reject unowned shared transcript store roots

* fix(memory): restrict transcript archives to agent-owned roots

* refactor(memory): preserve canonical transcript corpus contracts

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:11:24 -04:00
Peter Steinberger bc3a4c6757 fix(compaction): drop context-engine fallback on codex ownership skip (#114155) (#115666)
Co-authored-by: HOYALIM <HOYALIM@users.noreply.github.com>
2026-07-29 07:11:21 -04:00
wahaha1223 8bcbc3178b fix(msteams): ignore blank certificate settings (#109112)
* fix(msteams): ignore blank certificate settings

* fix(msteams): preserve federated certificate path behavior

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:10:47 -04:00
Leon-SK668 7c024cad48 fix(usage): guard malformed DeepSeek payloads (#110785)
Co-authored-by: Leon-SK668 <17695126+Leon-SK668@users.noreply.github.com>
2026-07-29 07:02:44 -04:00
Ayaan Zaidi e92da4c8ba docs(agents): reword imported review rules in repo voice 2026-07-29 19:54:37 +09:00
Ayaan Zaidi 9182999eb6 docs(agents): add context-budget, tool-description, cache-invalidation, and review-premise rules 2026-07-29 19:54:37 +09:00
Ayaan Zaidi 344a8e48df docs(agents): mock-gateway proof satisfies gate without discouraging live proof 2026-07-29 19:54:37 +09:00
Ayaan Zaidi c9f8c05598 docs(agents): add vitest in-flight edit rule and mock-gateway proof recipe 2026-07-29 19:54:37 +09:00
Ayaan Zaidi 620bf5a9c0 docs(agents): restructure root AGENTS.md around product doctrine and deduped policy 2026-07-29 19:54:37 +09:00
Peter Steinberger e6fec4d51b fix(codex): keep completed answers over audit gaps (#115849) 2026-07-29 06:52:21 -04:00
Peter Steinberger f20fc70cb4 test(cli): isolate unknown-command process validation (#115848) 2026-07-29 06:49:55 -04:00
loong 7bdd1f646b fix(memory-host-sdk): resolve stable execPath for worker fork to survive Homebrew Node upgrades (#99318)
* fix(memory): survive Homebrew Node upgrades

Co-authored-by: 袁龙辉0668001277 <yuan.longhui@xydigit.com>

* test(whatsapp): isolate last-route coverage

* fix(deepinfra): preserve offline model compatibility

* test(memory): isolate migration cleanup lifecycle

* test: stabilize aggregate extension gates

* ci: retrigger pull request workflow

* test: preserve inherited Node options

* test(cli): tolerate cold hosted startup

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:49:02 -04:00
Peter Steinberger f27899181e feat(ui): add composer capability menu (#115800)
* feat(ui): composer capability menu with per-session overrides

* refactor(ui): keep chat render within lint ceiling

* fix(ui): preserve loaded capability overrides

* fix(ui): remove stale capability menu field

* fix(ui): gate capability menu on runtime-config readiness
2026-07-29 06:48:08 -04:00
wangmiao0668000666 77e9ee092f fix(synology-chat): stop fabricating send message ids (#110770)
* fix(synology-chat): stop fabricating send message ids

The incoming-webhook send contract acks with a bare boolean and carries
no platform message id, but the adapter returned a synthetic
`sc-${Date.now()}` id and stamped it into the delivery receipt. Return
the established empty-id sentinel and an empty receipt instead, matching
the honest no-platform-id shape used by sibling channels (qqbot,
googlechat) and the plugin-sdk empty-id contract.

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

* test(synology-chat): verify truthful webhook receipts

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:44:44 -04:00
Goutam Adwant b11ed1877c fix(feishu): reply to direct messages by chat id (#109637)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:42:41 -04:00
krissding ee820b185c fix(acp): attach error listener to spawned ACP agent process (#109529)
The spawned agent child process in createAcpClient had no error
listener. If the agent binary failed to start, the error event
would be unhandled and could crash the process.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:40:34 -04:00
Peter Steinberger 1f4f1bbc33 fix(sessions): deliver agent announcements to direct message sessions (#115811)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: avatasia <eric.tomcat@gmail.com>
2026-07-29 06:35:42 -04:00
Masato Hoshino 46b2bed375 fix(nextcloud-talk): reject reactions for disabled or unconfigured accounts (#112675)
The react message-action handler dispatched straight to the sender without
checking the resolved account, so a disabled Nextcloud Talk account
(`enabled:false`) that still had a baseUrl/botSecret in config could keep
emitting reactions. `describeMessageTool` already hides the tool for
unconfigured accounts, but an explicit accountId can reach `handleAction`
directly. Enforce the same enabled+configured gate at dispatch, mirroring
the Signal reaction fix (#112607).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:34:54 -04:00
Peter Steinberger af70829cdf refactor(ui): move Agent Defaults entry from the sidebar into the Agents page (#115836)
* refactor(ui): move Agent Defaults entry from the sidebar into the Agents page

* fix(ui): keep Agent Defaults searchable
2026-07-29 06:30:40 -04:00
Peter Steinberger 662abec754 feat(gateway): push session PR indicators to subscribed clients (#115643)
* feat(gateway): push session PR indicators to subscribed clients

* test(gateway): fix PR indicator drift

* chore(protocol): allowlist PR-indicator event for native apps (Control UI surface)

* test: align PR indicator lifecycle coverage

* fix(ui): scope session PR store listeners to active watchers
2026-07-29 06:30:01 -04:00
Vincent Koc b6f70ea440 fix(setup): make Gemini recovery actionable (#115835) 2026-07-29 18:29:32 +08:00
coder-master-0915 745f780c34 fix(terminal-core): prevent String.replace $ pattern injection in display-string (#111398)
* fix(terminal-core): prevent $ pattern injection in replaceHomePath

The second argument of String.prototype.replace() interprets $ sequences
as special replacement patterns ($&, $`, $', $1-$9, $<name>). When the
user home directory path contains $ followed by special characters, the
replacement produces a corrupted path in the display string.

Using a replacer function (() => fallbackHome) instead of the raw string
argument prevents $ pattern interpretation, ensuring the literal home
directory path is used regardless of its content.

* test(terminal-core): cover literal dollar home paths

---------

Co-authored-by: lizeyu-xydt <li.zeyu@xydigit.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:24:49 -04:00
Peter Steinberger 986e5d1758 refactor(channels): share ingress retention defaults (#115824) 2026-07-29 06:24:30 -04:00
mushuiyu886 d8935248e4 fix(nostr): profile imports vary on timestamp ties (#111798)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:22:33 -04:00
stevenlee-oai a00438a867 fix(codex): restore connected apps for token-authenticated runs (#115075)
* fix(codex): restore connected apps for token-authenticated runs

* fix(codex): keep app inventory protocol types private

* fix(codex): align native runtime with Codex 0.146.0

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): clean up latest app-server integration

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): keep internal protocol types private

* fix(ci): repair current main Codex landing gates

* fix(ci): format inherited code mode matrix

* fix(codex): reconcile native app-server contracts with main

Prepare a verified GitHub-hosted mainline merge while preserving the reviewed Codex 0.146.0 fixes and canonical OpenAI authentication.

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): keep QA evidence in its owning plugin

Resolve the current-main Code Mode test rename without resurrecting the retired core test path.

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): enforce canonical OpenAI app-server auth

Reject retired provider aliases without runtime compatibility, direct operators to the doctor migration, and remove the redundant OpenAI API-key predicate.

Co-authored-by: Steven Lee <stevenlee@openai.com>

* chore(codex): reconcile latest main dependency graph

Preserve current main dependency changes while preparing the original Codex PR for an ancestry-preserving signed mainline merge.

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): unify bundled Codex 0.146 runtimes

Keep the ACP adapter on the same 0.146.0 Codex release as the managed runtime, remove obsolete 0.145.0 platform artifacts and unused semver compatibility, and preserve the latest main dependency upgrades.

Co-authored-by: Steven Lee <stevenlee@openai.com>

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:21:25 -04:00
Peter Steinberger 7bc453f508 fix(codex): classify hosted search timeouts (#115837) 2026-07-29 06:21:11 -04:00
dongdong 1219ebff9a fix(msteams): keep attachment replies in channel threads (#94348)
* fix(msteams): keep file replies in channel threads

* fix(msteams): keep SharePoint files in channel threads

Fixes #88836 by forwarding channel thread roots through the existing Microsoft Teams proactive activity boundary while preserving top-level, group chat, and personal delivery.

Co-authored-by: Jasmine Zhang <jasminezhang@JasminedeMac-mini.local>

* test(msteams): use lint-safe real SDK HTTP capture

---------

Co-authored-by: Jasmine Zhang <jasminezhang@JasminedeMac-mini.local>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:19:11 -04:00
Zakaria Rahali a9391d7312 fix(telegram): linkPreview:false is ignored on streamed replies (#114125)
* fix(telegram): linkPreview:false is ignored on streamed replies

Replies delivered through draft streaming still unfurled the first URL
even with channels.telegram.linkPreview: false. Non-streamed sends
already honored the flag.

createTelegramDraftStream never received linkPreview and never set
link_preview_options, on either its initial sendMessage or its
editMessageText calls. Finalization could not clean it up: it skips the
final edit when the streamed draft text already equals the final text,
which is the common case, so the draft message stays as-is with the
preview attached.

Passes linkPreview from telegramCfg into the draft stream and applies
link_preview_options: { is_disabled: true } on the send and on every
edit, since an edit that omits the field re-enables the preview
server-side. Rich messages keep expressing this as skip_entity_detection
at render time, which already worked.

Call arity is preserved when no preview options apply, so existing edit
assertions are unaffected.

Closes #111525

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

* test(telegram): cover streamed reply option parity

Co-authored-by: Zakaria Rahali <zakariarahali288@gmail.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:18:35 -04:00
Vincent Koc 951e7a39bd fix(protocol): make Swift model checks non-mutating (#115793)
* fix(protocol): make Swift drift checks non-mutating

* test(protocol): cover core Swift gateway frames

* docs(protocol): clarify Swift model update flow
2026-07-29 18:17:36 +08:00
VectorPeak 404fafff77 fix(searxng): avoid duplicating search endpoint (#113661)
Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
2026-07-29 06:15:51 -04:00
Peter Steinberger bed7014273 fix(agents): preserve tool-result middleware identity (#115821)
Fixes #106910.

Preserve the contributor design from #107000 while updating both the normal and current compaction owner paths.

Co-authored-by: Sebastien Tardif <sebtardif@ncf.ca>
2026-07-29 06:13:50 -04:00
Peter Steinberger 9721ca15d2 refactor(meetings): consolidate runtime facades (#115819)
* refactor(meetings): consolidate runtime facades

* fix(meetings): keep facade contracts acyclic
2026-07-29 06:13:37 -04:00
sunlit-deng da8a2208d2 fix(browser): reject malformed proxy file base64 (#115045)
* fix(browser): reject malformed proxy file base64

* fix(browser): preserve empty proxy downloads

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:08:01 -04:00
Peter Steinberger 4f31ba97c2 fix(sandbox): repair workspace state without crossing agent owners (#115784)
* fix(sandbox): safely repair sandbox workspace state

Fixes #111661. Repair active agent, shared, session, and global sandbox workspace state through the existing canonical SQLite registry without importing inactive or unrelated agent state.

Preserves and builds on the original sandbox doctor migration and regression from #111812.

Co-authored-by: TianT1209 <55179364+TianT1209@users.noreply.github.com>

* fix(sandbox): isolate doctor sandbox state by profile

Resolve exact sandbox scope ownership from the state directory requested by doctor, not ambient process state, and cover cross-profile SQLite registry isolation.

Co-authored-by: TianT1209 <55179364+TianT1209@users.noreply.github.com>

* test(sandbox): preserve typed workspace ownership proof

Keep exact inactive and active sandbox fixture paths non-optional under the repository core-test typecheck.

Co-authored-by: TianT1209 <55179364+TianT1209@users.noreply.github.com>

* fix(sandbox): ignore stale non-session workspace scopes

Validate canonical registered session ownership before Doctor migrates sandbox workspace state; preserve exact profile isolation and leave the existing registry untouched.

Co-authored-by: TianT1209 <55179364+TianT1209@users.noreply.github.com>

* fix(doctor): derive sandbox ownership from durable sessions

Read the existing agent-owned SQLite session store without opening writable handles. Repair pruned, global and unscoped sandbox workspaces and resolve omitted sandbox roots from the selected state profile. Retire the transient runtime registry reader.

Co-authored-by: TianT1209 <55179364+TianT1209@users.noreply.github.com>

* test(doctor): derive overlap workspace from agent owner

Honor current main workspace-qualified sandbox scope contract when proving non-default agent ownership in hosted CI.

Co-authored-by: TianT1209 <55179364+TianT1209@users.noreply.github.com>

---------

Co-authored-by: TianT1209 <55179364+TianT1209@users.noreply.github.com>
2026-07-29 06:06:21 -04:00
Peter Steinberger 20668eed03 fix(memory): quarantine writes from tainted agent turns (#115818)
* feat(memory): taint writes after network tools

* fix(memory): keep provenance mutations recoverable

* fix(memory): roll back failed provenance writes

* fix(memory): serialize provenance mutations

* docs(memory): explain flush provenance boundary

* refactor(memory): share provenance mutation wrapper

* docs(memory): clarify flush provenance fallback

* fix(memory): canonicalize provenance paths
2026-07-29 06:02:06 -04:00
Chris Zhang 70251e415d fix(feishu): cache inaccessible sender lookups (#111700)
Co-authored-by: Chris <4436110+zqchris@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 05:59:55 -04:00
maweibin aa4c9416a7 docs(status): document missing --timeout flag (#102363) 2026-07-29 05:59:18 -04:00
Wynne668 522c747d3c fix(exa): reject invalid UTF-8 search responses (#111736) 2026-07-29 05:58:02 -04:00
Vincent Koc 99b5df0fd2 fix(openai): satisfy realtime lifecycle lint 2026-07-29 17:57:59 +08:00
Vincent Koc 5e0a75f0e5 fix(openai): close realtime lifecycle races 2026-07-29 17:57:59 +08:00
Vincent Koc 1cc2e28b5b chore(openai): keep lifecycle types internal 2026-07-29 17:57:59 +08:00
Vincent Koc 3bf40870ad refactor(openai): apply lifecycle to realtime bridge 2026-07-29 17:57:59 +08:00
Vincent Koc dd0e416303 refactor(openai): apply lifecycle to GPT-Live bridge 2026-07-29 17:57:59 +08:00
Vincent Koc 61cadc1459 refactor(openai): add realtime voice lifecycle 2026-07-29 17:57:59 +08:00