Commit Graph

16850 Commits

Author SHA1 Message Date
Aaron Eden 2cd4e5a8be fix: prevent empty Telegram sends for cron summaries (#104111)
* fix: prevent empty cron Telegram summary sends

* fix: move Telegram cron fallback normalization to adapter

* test: pin plugin SDK surface budget for cron fallback

* test: refresh plugin SDK API baseline

* fix(telegram): preserve cron fallback batch semantics

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-07-22 03:27:06 +05:30
Peter Steinberger 4541c27f30 fix(browser): regenerate stale copilot runtime bundle (#112379) 2026-07-21 14:28:56 -07:00
Jason (Json) c4911a2c77 improve(ui): simplify coding agent session headers (#112354)
* improve: simplify coding session catalog headers

* improve: simplify coding session catalog headers
2026-07-21 15:27:49 -06:00
pash-openai b0341b8693 Allow Codex plugin discovery enough startup time (#112418) 2026-07-21 14:22:23 -07:00
Vincent Koc 6c9446c5c1 fix(deps): refresh fast-uri plugin shrinkwraps 2026-07-22 05:11:45 +08:00
Vincent Koc b7e17855b9 fix(diagnostics-otel): update OpenTelemetry runtime 2026-07-22 05:11:45 +08:00
lzyyzznl e1ec51b1a4 fix(qqbot): preserve group announce routes (#98053)
Persist qualified QQBot group and guild routes so session announcements return to the originating conversation without letting direct-message turns overwrite the shared route.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: lzyyzznl <lzyyzznl@users.noreply.github.com>
2026-07-21 12:15:24 -07:00
mushuiyu886 e3a1c64d7b fix(kilocode): exclude image models from chat catalog (#111239)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 10:52:42 -07:00
Yiğit ERDOĞAN 1096b74ab7 fix(browser): retire durable tab rows whose browser never returns (#111307)
* fix(browser): retire durable tab rows whose browser never returns

Durable cleanup defers whenever ownership cannot be proven, so a browser
that never comes back at the same cdpUrl leaves its rows behind forever:
each sweep re-claims them, fails the identity lookup, warns, and defers
again. Nothing in the subsystem removes a row by age.

The `browser.session-tabs` namespace is opened with a 5000-row cap and
`reject-new`, so once those rows accumulate to the cap, tracking a new tab
throws PLUGIN_STATE_LIMIT_EXCEEDED. That propagates into the compensation
path in browser-tool-session-tabs.ts, which closes the tab the user just
opened and rethrows -- every `browser open` on that profile then opens a
tab, closes it again, and errors, with no self-healing path.

Bound the retry: when a close attempt reports the target unavailable and
the tab has been unused for longer than the retire window, drop the row
instead of deferring again. A browser returning after that long almost
always carries a fresh instance fingerprint, which retires the row through
the ownership-mismatch path anyway.

closeTrackedBrowserTabsForSessions now accepts `now` like the sweep does,
so lifecycle cleanup can be exercised on a coherent clock.

* refactor(browser): split session tab cleanup claim and test harness

check-lint failed on max-lines: session-tab-registry.ts was at 699 of its
700-line budget and the durable registry test at 982 of 1000, so the retire
branch and its regression test pushed both over.

Extract the cleanup claim bookkeeping (claim, ownership match, delete) into
session-tab-cleanup-claim.ts, and the durable registry test shapes into
session-tab-registry.sqlite.test-helpers.ts, matching the existing
*.test-helpers.ts convention in this directory. No behavior change.

* test(browser): protect unreachable retirement races

Co-authored-by: Yigtwxx <yigiterdogan023@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 10:10:28 -07:00
pick-cat fc52627ac1 fix(qa-lab): reject hex/exponent Telegram SUT uid env values (#107626)
* fix(qa-lab): reject hex/exponent Telegram SUT uid env values

* test(qa-lab): add direct unit tests for parseSutId strict int parsing

Export parseSutId and add 15 direct unit tests covering hex/exponent/fraction/
empty/whitespace/zero/negative rejection and valid decimal acceptance across
UID, GID, and CLEANUP_TIMEOUT_MS keys. The 3 existing integration tests
already prove the full CLI chain rejects malformed UIDs before gateway startup.

Mutation check: reverting to permissive Number() parsing causes 6 tests to
fail (4 unit + 2 integration).

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

* test(qa-lab): cover GID and cleanup-timeout CLI reject-before-gateway

* fix(qa-lab): drop stale live-scenario mocks from SUT uid tests

* style(qa-lab): oxfmt import order in telegram cli.runtime

* test(qa-lab): streamline strict SUT integer coverage

---------

Co-authored-by: nebulacoder-v8.0 <noreply@zte.com.cn>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:42:22 -07:00
mushuiyu886 53f13f0510 fix(chutes): discover models when HTTP proxy is required (#111266)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:38:36 -07:00
mushuiyu886 9c621b799a fix(vercel-ai-gateway): discover models when HTTP proxy is required (#111209)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:22:00 -07:00
Wynne668 0dea07bfdb fix(qqbot): reject blank client secret env fallback (#109815)
* fix(qqbot): reject blank client secret env fallback

Co-authored-by: Cursor <cursoragent@cursor.com>

* test(qqbot): format fallback regression

* fix(qqbot): normalize logout env token

* style(qqbot): format env fallback changes

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:17:40 -07:00
ZOOWH b16c6c75ce fix(github-copilot): redact embedding API errors (#109177)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:16:02 -07:00
mushuiyu886 a97d97f95b fix(opencode-go): expose DeepSeek V4 max thinking (#99643)
Preserve existing lower-level high effort while making xhigh/max available before runtime activation.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:12:46 -07:00
Dallin Romney 6d55f43a50 fix(openai): model auth login hangs after success (#112211)
* fix(openai): close OAuth callback sockets

* test(openai): simplify OAuth socket setup
2026-07-21 23:41:43 +09:00
Papilionidae 3dfb4c9cd7 fix(anthropic): accept "cli" entrypoint in Claude session catalog discovery (#105162)
* fix(anthropic): accept "cli" entrypoint in Claude session catalog discovery

Claude Code v2.x writes entrypoint: "cli" in its JSONL session files.
Previously only "sdk-cli" was recognized, causing all v2.x sessions to
be silently skipped.

Extract CLI_ENTRYPOINTS set and isCliEntrypoint() helper, then apply
the same fix to both TypeScript catalog and macOS paired-node native
catalog. Add matching regression coverage on both platforms.

Closes #105164

* fix(anthropic): refresh Claude CLI session discovery

Apply the reviewed cli/sdk-cli allowlist, mirrored negative coverage, and fallback-scope documentation to current main.

Co-authored-by: 黄攀0668000858 <huang.pan@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 07:14:42 -07:00
Peter Steinberger e1d5d3dc16 refactor(channels): move single-account promotion keys to plugin declarations (#112293)
* refactor(channels): move single-account promotion keys to plugin declarations

* fix(channels): keep legacy promotion tier for undeclared setup adapters

* fix(channels): keep plugin discovery lazy in setup promotion helpers

* fix(channels): resolve bundled promotion surfaces from setup-only artifacts

* test(matrix): use vi.stubEnv in setup test env helper
2026-07-21 06:48:30 -07:00
pick-cat c1cf439942 fix(amazon-bedrock): reject malformed inbound image base64 (#111872)
* fix(amazon-bedrock): reject malformed inbound image base64

Co-authored-by: Cursor <cursoragent@cursor.com>

* test(amazon-bedrock): compact malformed base64 coverage

Co-authored-by: Cursor <cursoragent@cursor.com>

* test(amazon-bedrock): avoid unsafe optional chaining in base64 coverage

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(amazon-bedrock): resolve TS18048 undefined firstMessage in base64 tests

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

* fix(amazon-bedrock): add braces around if body for eslint curly rule

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

* fix(amazon-bedrock): keep image decoding browser-safe

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: nebulacoder-v8.0 <noreply@zte.com.cn>
Co-authored-by: Altay <altay@hey.com>
2026-07-21 16:47:07 +03:00
Peter Steinberger f695be341c feat(cua-computer): add experimental Windows/Linux computer-use fulfiller (#112267)
* feat(cua-computer): add experimental Windows/Linux computer-use fulfiller

Bundled plugin that fulfills the capability-based computer.act + screen.snapshot
node contract on Windows and Linux by supervising a pinned cua-driver 0.10.x
daemon over MCP stdio. macOS keeps the Peekaboo fulfiller; this plugin is
disabled by default and never available on darwin.

Grounded in cua-driver 0.10.0 source (tool schemas, refusal codes, coordinate
spaces, session/daemon lifecycle). Notable safety and correctness properties:
- Deny-by-default env allowlist so OpenClaw secrets (provider/channel tokens,
  CUA_API_KEY) never reach the separately installed daemon; telemetry and
  update checks forced off.
- Version-gated handshake (exact-minor pin + capability/schema version),
  time-bounded so a corrected driver recovers without a node restart.
- Robust daemon supervision: full readiness-budget polling, startup-race
  tolerance, signal-death and spawn-error recovery, shared-daemon lifecycle
  (never killed on dispose).
- Frame authorization preserved within upstream limits (generation + full live
  geometry; capture refused when screen and screenshot geometry diverge).
- Action mapping refuses inputs cua-driver cannot faithfully deliver:
  layout-shifted keys, modifier-held drag/scroll, Linux modifier clicks,
  hold_key/mouse down-up, non-positive scroll; drag duration clamped.

* fix(cua-computer): satisfy lint, test-types, dead-code, and docs-map gates
2026-07-21 05:58:04 -07:00
Peter Steinberger 94557e1c57 refactor(media): ingress and preflight consumers ride ordered media facts (#112276)
* refactor(media): ingress and preflight consumers ride ordered media facts

Media-facts program PR 2: channel context retains ordered MediaFact[]
through finalization; inbound gates, hook mapping, current-turn
normalization, and all five channel families' audio preflights consume
facts. Four review cycles hardened the canonical/legacy merge: canonical
facts are authoritative (legacy fills gaps only), one shared staging
predicate covers MediaStaged and MediaWorkspaceDir, kind inference runs
after fallback MIME fills, legacy counts use max array cardinality, and
alignment-only empty slots no longer count as media presence — all
pinned by a 54-cell canonical×legacy×type merge-matrix test.

* fix(media): hide internal fact helper
2026-07-21 05:32:49 -07:00
Peter Steinberger b2aa21612d feat(ui): show PR status on Claude threads (#112180)
* feat(ui): show PR status on catalog threads

* fix(ui): complete PR summary protocol artifacts

* perf(anthropic): bound PR metadata deduplication
2026-07-21 05:01:04 -07:00
Masato Hoshino aa9cf01b56 fix(ollama): bound DNS preflight with guard-owned request timeouts (#111835)
* fix(ollama): bound DNS preflight with guard-owned request timeouts

Five ollama call sites passed their deadline as init.signal, which
fetchWithSsrFGuard only forwards to the final fetch. The DNS/proxy
preflight and dispatcher connect timeout read the top-level timeoutMs,
so a stalled lookup hung past the intended 3s/5s/15s deadline.

Move each deadline to the guard-owned timeoutMs. Values unchanged.

* test(ollama): assert preflight lookup ran and deadline bound both ways

Use plain counters instead of vi.fn for the injected lookup: vi.fn is not
assignable to the overloaded LookupFn type, which passed vitest but failed
the extension test-types lane.
2026-07-21 13:47:09 +03:00
Peter Steinberger d725632ee7 refactor(channels): move channel-flavored setup flags into plugin manifests (#112239)
* refactor(channels): move channel-flavored setup flags into plugin manifests

* refactor(channels): normalize manifest cliAddOptions formatting, drop changelog entry

* fix(channels): dedupe channels add options by commander switch identity

* fix(channels): let the selected channel's cliAddOptions win switch dedupe
2026-07-21 02:50:19 -07:00
Peter Steinberger a43d53e4fa fix(onboarding): label and mask wizard inputs (#112233)
* fix(onboarding): label and mask wizard inputs

* test(matrix): type sensitive prompt fixtures
2026-07-21 02:46:35 -07:00
Harjoth Khara 9405f2c5db fix(ollama): scope memory cache identity by endpoint (#97059)
Preserve the shipped default identity while hashing custom header identity without retaining raw values.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 02:23:18 -07:00
Peter Steinberger a230f742f2 fix(deps): bump protobufjs to 7.6.5 to resolve GHSA-j3f2-48v5-ccww (#112184) 2026-07-21 02:04:10 -07:00
Andy Ye 5f05c54e87 fix(approvals): handle stale plugin waits (#88203)
* fix(approvals): handle stale plugin waits

Recognize the gateway stale-id message through the shared classifier and map stale exec, Codex app-server, and native PermissionRequest waits to their existing fail-closed or defer contracts without swallowing aborts.

Closes #88111

Co-authored-by: Andy Ye <35905412+TurboTheTurtle@users.noreply.github.com>

* style(approvals): type stale wait catch values

Satisfy the catch-callback unknown lint without changing approval behavior.

Co-authored-by: Andy Ye <35905412+TurboTheTurtle@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 01:56:38 -07:00
Yuval Dinodia e942d7eadb fix(memory-search): preserve vector-only media relevance (#92196)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 01:33:05 -07:00
Dallin Romney c3c665f7f6 fix: make Copilot token exchange 403 errors actionable (#112025)
* fix: explain GitHub Copilot 403 recovery

* fix: keep control UI log hint internal

* fix: clarify log viewing hint
2026-07-21 17:11:25 +09:00
clawSean 7f32b6c984 fix(sms): authorize text slash commands (#90998)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: clawSean <260045960+clawSean@users.noreply.github.com>
2026-07-21 00:55:23 -07:00
Dallin Romney 32b49bf2f1 fix(qa): preserve Matrix replies across scenario config reloads (#112065)
* fix(ci): keep maturity evidence on stable provider mode

* fix(qa): preserve model policy during Matrix setup
2026-07-21 16:23:24 +09:00
mikasa 644645f4f9 fix #95291: message tool fails to deliver files/images on Feishu (400 volc-dcdn / write ECONNRESET) while same Lark SDK upload succeeds standalone (#95514)
* fix(feishu): normalize media upload multipart data

Convert Feishu SDK multipart Buffer upload parts into explicit FormData
before they reach the wrapped HTTP transport. The SDK upload helpers
pass multipart data as a plain object with Buffer media parts; relying on
implicit serialization in the timeout/proxy-aware HTTP wrapper was fragile
and caused file/image delivery failures (400 volc-dcdn / write ECONNRESET)
even though the same credentials succeeded via a standalone SDK upload.

Adds normalizeMultipartUploadData, applied on the request path of the
shared Feishu HTTP instance, plus a regression test covering the
multipart-to-FormData normalization.

Rebased onto current origin/main, which replaced the old synchronous
injectTimeout path with the async proxy-aware injectRequestOptions flow;
the multipart normalization is now applied before that flow.

* fix(feishu): scope multipart media normalization

* test(feishu): mark multipart auth fixture synthetic

* test(feishu): use field-shaped secret fixtures

* fix(feishu): validate multipart upload endpoints

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 23:31:03 -07:00
Peter Steinberger b4e27f8b3d refactor: move provider transports into packages/ai behind a typed host port (#111669)
* refactor(ai): invert plugin coupling behind the transport host port

* fix(ai): queue custom transport registrations until the host is configured

* refactor(ai): remove relocated transport sources from src/agents

* fix(ai): source core stream types from canonical packages and fix tarball fixtures

* fix(ai): invert plugin transport host wiring

* fix(ai): harden managed transport projection

* test(ai): register synchronous stream in transport mock

* fix(ai): lazily install transport runtime host

* fix(ai): preserve completion compat detection
2026-07-20 23:26:00 -07:00
Masato Hoshino f1205f5f0b fix(anthropic): complete transcript reverse-scan windows across short reads (#109431)
* fix(anthropic): complete transcript reverse-scan windows across short reads

readLocalClaudeTranscriptPage filled each reverse-scan window with a single
positional read and threw "Claude transcript changed while it was being read"
whenever bytesRead !== size. A positional read may return fewer bytes than
requested inside an unchanged file, so a benign short read failed the transcript
page load with a message implying the file changed. The forward metadata scan in
the same file already loops short reads; the reverse scan did not.

Fill each window across short reads, advancing both the buffer offset and the
file position. A zero-byte read before the window is filled is premature EOF and
still throws the same error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test(anthropic): tighten transcript short-read coverage

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 23:17:18 -07:00
QiuYuang 4a7b1d9a1c fix(qa-lab-web): guard dashboard json responses (#108943)
* fix(qa-lab-web): guard dashboard json responses

* fix(qa-lab-web): remove global json size cap

* test(qa-lab-web): cover production json routes

* fix(qa-lab-web): satisfy json guard checks

* test(qa-lab-web): cover JSON media contracts

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 23:12:46 -07:00
mikasa 7a73531321 fix(codex): stream sandbox file copies (#101511)
* fix(codex): cap sandbox file copy reads

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

* test(codex): use PathUri in oversized copy proof

* fix(codex): stream sandbox file copies

Co-authored-by: mikasa0818 <0668001030@xydigit.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 23:03:04 -07:00
chengzhichao-xydt 8636fdfc09 fix(extensions/anthropic): preserve migrated model entries when inherited keys shadow converted refs (#103622)
* fix(extensions/anthropic): write migrated model entries as own properties

* test(extensions/anthropic): guard optional models value in Object.hasOwn assertions

---------

Co-authored-by: chengzhichao-xydt <chengzhichao-xydt@users.noreply.github.com>
2026-07-20 23:00:02 -07:00
TUARAN 37ac5d671f fix(feishu): fall back media replies (#98320)
* fix(feishu): fall back media replies

* test(feishu): polish media fallback coverage

* test(feishu): cover media fallback policy wiring

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 22:52:08 -07:00
Peter Steinberger be5e427f56 feat(dashboard): plugin-declared widget data bindings and action verbs (#112083)
* feat(dashboard): add plugin capability declarations

* docs(dashboard): describe plugin capabilities

* fix(plugins): preserve registry map cloning

* fix(dashboard): make plugin grant ids unambiguous

* fix(dashboard): align generated plugin grant ids

* chore(boards): internalize verb ids and refresh protocol snapshots
2026-07-20 22:43:04 -07:00
Chunyue Wang 752f059753 fix(github-copilot): strip encrypted_content from reasoning replay items (#95493)
* fix(github-copilot): strip encrypted_content from reasoning replay items

* refactor(github-copilot): name replay sanitizer accurately

Use one provider-boundary sanitizer name for both connection-bound IDs and session-bound encrypted reasoning, and assert the final stream payload drops ciphertext.\n\nCo-authored-by: openperf <16864032@qq.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 22:31:39 -07:00
Mark d9ac878ea3 fix(telegram): clear generic callback buttons after click (#90169)
* fix(telegram): clear generic callback buttons

* test(telegram): simplify callback cleanup coverage

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 22:28:21 -07:00
Peter Steinberger 0adc2cf606 refactor(media): consolidate parallel media-kind unions onto canonical MediaKind (#112063)
* refactor(media): consolidate parallel media-kind unions onto canonical MediaKind

One canonical MediaKind union (media-core constants) replaces ~40
duplicate/parallel kind declarations across core and channel plugins;
channel-specific narrower contracts derive via Extract/Exclude. Also
fixes a review-caught fallback bug where a stored "unknown" reply-chain
kind preempted MIME inference and relabeled images as documents.

* refactor(ui): derive attachment kinds from MediaKind

* fix(telegram): drop type-dead unknown guard in reply-context kind fallback

* style(telegram): format media kind fallback
2026-07-20 22:27:22 -07:00
Peter Steinberger 695491458e fix(providers): reject malformed UTF-8 usage responses (#112081)
Co-authored-by: wahaha1223 <304197929+wahaha1223@users.noreply.github.com>
2026-07-20 22:16:25 -07:00
Owen e2b3519ea9 fix(openai): guard Codex GPT-5.6 discovery boundary (#104335)
* fix: guard OpenAI Codex model discovery boundary

DEV-20260711-001

* docs: narrow OpenAI Codex catalog comment

DEV-20260711-002

* test(openai): remove redundant catalog assertion

The exact model-id equality already excludes every static fallback row. Keep the new hidden-only regression as the distinct coverage.\n\nCo-authored-by: owen-ever <oh.whenever@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 22:07:09 -07:00
mikasa 1e7318e072 fix(tlon): stop monitor tracking state from growing forever (#103658)
* fix(tlon): bound monitor tracking state

* fix(tlon): fence invite snapshot generations

* fix(tlon): simplify bounded monitor tracking

Co-authored-by: mikasa0818 <0668001030@xydigit.com>

* fix(tlon): keep thread limit internal

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 22:00:47 -07:00
wahaha1223 1e4e588142 fix(memory-core): guard invalid timestamps in dreaming rankings (#110537) 2026-07-20 21:59:41 -07:00
chengzhichao-xydt 828845a08a fix(feishu): honor abortSignal during app registration poll interval (#109909)
* fix(feishu): honor abortSignal during app registration poll interval

* test(feishu): prove poll abort through a real loopback server
2026-07-20 21:53:45 -07:00
Alix-007 c0d461d3c4 fix(logbook): bound snapshot subprocesses (#109042)
* fix(logbook): bound snapshot subprocesses

* test(logbook): retain timeout spy handle
2026-07-20 21:39:41 -07:00
Miorbnli 5c9cd54b40 fix(zalo): strip internal tool traces (#103377)
Sanitize assistant-visible text at the Zalo outbound boundary.

Refs #103377; credit @miorbnli.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 21:36:35 -07:00