Vincent Koc
fcc20d14a3
fix(google): stop scraping Gemini CLI OAuth credentials ( #117167 )
...
* fix(google): delegate Gemini OAuth refresh to the CLI
* refactor(google): remove retired Gemini OAuth stack
* chore(ci): prune retired Google OAuth baseline
* fix(google): retire Gemini CLI usage telemetry
* fix(google): remove retired usage token parser
2026-08-01 11:36:24 +08:00
Vincent Koc
541593dcb4
merge: refresh google live transcript bound onto main
...
* commit '7e78de747b8a64d52f30aee948b697bf4c528691': (359 commits)
refactor(ui): replace duplicated locale bundles with canonical translation memory (#117157 )
fix(ui): retire stale Gateway event-log observers (#117169 )
fix(agents): keep subagent status consistent after restart and large fan-outs (#117141 )
refactor(ui): unify filtered session list ownership (#117158 )
refactor(agents): consolidate context budgets and compaction recovery (#117149 )
fix(net-policy): redact sig and x-* auth params in URLs and bodies (#116957 )
refactor(agents): remove duplicate generated-media delivery fallbacks (#117150 )
refactor(reply): unify turn lifecycle state ownership (#117145 )
fix(ui): preserve emoji agent avatar initials (#104912 )
refactor(auto-reply): unify command and directive ownership (#117143 )
refactor(plugins): consolidate descriptor and startup ownership (#117146 )
fix(messages): reply actions leak citation markers and reply/poll answers draw the no-reply fallback (#116909 )
fix(slack): let durable ingress retry transient thread lookups (#117135 )
refactor(doctor): consolidate shipped state migration ownership (#117142 )
fix(ai): Codex stream shows internal parser text on a malformed frame (#116966 )
fix: guard every migrated session accessor path (#117140 )
fix(terminal): measure unicode display width consistently (#117062 )
fix(openai): clear ChatGPT SSE fallback per session (#117123 )
fix(mistral): reject incomplete streamed tool terminals (#117137 )
fix(ai): preserve structured chat content and refusals (#117136 )
...
2026-08-01 10:45:53 +08:00
Peter Steinberger
3cadc08593
fix(google): restore canonical Gemini and Vertex provider invariants ( #117042 )
...
Co-authored-by: Peter Steinberger <steipete@macos.shared >
2026-07-31 14:31:34 -07:00
Peter Steinberger
d2047364a8
fix(google): preserve streamed termination and usage facts ( #116822 )
...
Co-authored-by: Peter Steinberger <steipete@macos.shared >
2026-07-31 05:29:40 -07:00
Vincent Koc
c163f5272a
merge: refresh google live transcript bound onto main
...
* origin/main: (52 commits)
fix(setup): isolate failed channel probes and report doctor diagnostics (#116824 )
fix(telegram): preserve edit previews, message cache, and group history (#116818 )
fix(whatsapp): preserve interactive replies and normalize media MIME (#116816 )
fix(file-transfer): keep fetched media attachable in sandboxed replies (#116400 )
fix(browser): preserve doctor JSON failure status (#116811 )
fix(ollama): stream native tool call lifecycle (#116809 )
fix(matrix): preserve message-tool room thread routing (#116802 )
fix(ui): restore mobile navigation and accessible usage filters (#116751 )
fix(ui): coalesce profile identity refresh (#116764 )
fix(ui): preserve chat attachments and run ownership (#116752 )
fix(plugins): clean up partial service startup once (#116804 )
fix(qa-channel): enforce message and thread lifecycle ownership (#116801 )
fix(qa-lab): support groups and isolate thread timelines (#116803 )
feat(plugins): externalize Voyage embeddings (#116785 )
fix(outbound): strip echoed inbound metadata before delivery (#50520 )
fix(anthropic-vertex): correct multi-region endpoints (#116757 )
fix(ui): scope agent cron jobs and surface model catalog failures (#116771 )
fix(ui): preserve scoped session state across updates (#116772 )
fix(build): fail closed on symlinked build output roots (#116705 )
fix(commands): validate native settings and preserve Telegram ingress outcomes (#116773 )
...
2026-07-31 20:20:01 +08:00
Peter Steinberger
0d40cfbb53
fix(google): surface blocked Gemini prompts ( #116756 )
...
Co-authored-by: Peter Steinberger <steipete@macos.shared >
2026-07-31 04:29:06 -07:00
Vincent Koc
74918607d1
test(google): cover live transcript overflow
2026-07-31 18:20:45 +08:00
Vincent Koc
4f65b7e8fe
fix(google): bound live transcript accumulation
2026-07-31 18:20:45 +08:00
Vincent Koc
0ce230c861
test(google): cover expired CLI OAuth compatibility
2026-07-31 16:40:38 +08:00
Vincent Koc
091bc7f9ed
Merge remote-tracking branch 'origin/main' into experiment/google-cli-supported-paths
...
* origin/main: (115 commits)
test: type session request parameters (#116713 )
fix: retain event invalidation for pagination
docs: note queued session refresh fix
fix: preserve queued session refresh options
fix(exec): require approval for abbreviated inline eval flags [AI] (#116529 )
fix: keep owner-only tools out of non-owner skill commands [AI] (#116532 )
fix(tui): require a fresh agent roster (#116715 )
fix(memory-wiki): preserve user edits when rolling back ChatGPT imports (#116517 )
fix(agents): cron failures preserve timeout and cancellation reasons (#116566 )
fix(release): unblock beta validation workflows (#116708 )
fix(ci): discover frozen target startup benchmark cases (#116711 )
fix(session): preserve reset message payloads (#116195 )
fix(qa): tolerate loaded-runner bus delivery stalls (#116448 )
improve(ci): rebalance embedded agent test configs (#116436 )
fix(browser): return committed trace path (#116702 )
fix(qa): exceed Slack table aggregate limit in fallback probe (#116447 )
fix(qa): use built plugin tools server (#116442 )
fix(test): keep memory FD repro config valid (#116698 )
fix(telegram): keep queued tool progress in one message (#116685 )
fix(qa): stop waiting on yielded fanout runs (#116440 )
...
# Conflicts:
# src/system-agent/setup-inference-detect.ts
# ui/src/e2e/model-setup.e2e.test.ts
2026-07-31 16:40:33 +08:00
Vincent Koc
326a4831cc
test(google): cover realtime connection ownership
2026-07-31 11:47:59 +08:00
Vincent Koc
cc62f37d6e
fix(google): own realtime connection attempts
2026-07-31 11:47:59 +08:00
Vincent Koc
9e965073e5
Merge remote-tracking branch 'origin/main' into experiment/google-cli-supported-paths
...
* origin/main: (168 commits)
fix(plugins): keep registry sqlite root consistent (#116427 )
fix(cli): keep Gateway auth failures parseable in JSON (#116597 )
fix(trajectory): preserve prompts in oversized events (#116220 )
test(buzz): add live QA Lab channel lane (#116298 )
chore(i18n): refresh native locales (#116567 )
feat: add OpenClaw TUI prototype skill (#116583 )
fix(update): accept concrete versions selected by ranges (#116585 )
fix(agents): preserve locked session model routes
test(qa-lab): preserve Matrix fault proxy identity
fix(ci): extend OpenAI live profile setup budget (#116580 )
fix: prevent configured models from stalling startup (#116553 )
fix(cli): close MCP listener after one-shot commands
fix(auto-reply): keep explicit NO_REPLY silent (#116548 )
test(discord): cover deferred backpressure terminals
fix(discord): cancel backpressured realtime playback
test(discord): cover realtime output backpressure
fix(codex): add remote WebSocket heartbeat and reconnect (#116135 )
fix(macos): wait for the current reconnect snapshot (#116550 )
fix(outbound): recognize current-source message-tool sends (#116560 )
fix(voice-call): type cancelled consult outcomes
...
# Conflicts:
# extensions/google/setup-api.test.ts
# ui/src/e2e/model-setup.e2e.test.ts
2026-07-31 09:30:03 +08:00
Josh Avant
ce67ffb70e
feat(agents): add tool-free isolated completion ( #114343 )
...
* feat: add isolated pure-inference completion
* fix(google): block ambient system prompt writes
* docs: refresh generated map
2026-07-30 13:24:45 -05:00
Vincent Koc
c7d1205d51
fix(google): guide broken CLI profiles to supported auth
2026-07-30 22:40:20 +08:00
Vincent Koc
c568f93b03
fix(google): retire Gemini CLI OAuth setup
2026-07-30 16:33:33 +08:00
Vincent Koc
0370fce7ff
fix(test): isolate Google embedding batch timeout ( #116161 )
2026-07-30 10:11:29 +08:00
Peter Steinberger
5bfc65d7f4
refactor: remove 3,543 lines of redundant runtime and tests ( #115961 )
...
* refactor: remove 3,543 lines of redundant runtime and tests
* refactor: ratchet production environment variable budget
2026-07-29 11:43:41 -04:00
Monkey-wusky
79e0b559fe
fix(google): cancel unread response body on video download error ( #110045 )
...
* fix(google): cancel unread response body on video download error
* fix(google): safely cancel failed streaming video downloads
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 09:00:04 -04:00
Peter Steinberger
4232126bba
chore: update dependencies across workspace ( #115677 )
...
* chore(deps): update dependencies
* fix(deps): restore CI compatibility
2026-07-29 05:16:42 -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
Vito Cappello
33dae97b81
fix(agents): restore subagent completion delivery on CLI runtimes ( #115422 )
...
* fix(agents): deliver tool-free CLI completions
* fix(agents): enforce empty Gemini CLI tool caps
* refactor(agents): remove ineffective Gemini admin settings
* fix(agents): block inherited Gemini MCP servers
* fix(agents): enforce Gemini MCP cap via argv
---------
Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com >
Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com >
2026-07-28 21:07:02 -05:00
Peter Steinberger
d5907ca619
fix(google): keep static compat flags on discovered Gemini id variants ( #114831 )
2026-07-27 21:13:44 -04:00
Peter Steinberger
b5bb29a36e
fix(code-mode): preserve direct tools and secure suspended runs ( #114778 )
...
Preserve trusted policy-required message delivery and native image/computer tools across Code Mode catalogs and provider transports. Keep preferred Gemini capability metadata during live discovery, escape MCP declaration keywords, and reject suspended-run resumes with missing owner identity. Add before-and-after regressions for each user path. Closes #114753 .
2026-07-27 18:47:33 -04:00
Peter Steinberger
7394262cd1
feat: per-model code-mode capability flags with an "auto" master-switch tier ( #114695 )
...
* feat(tools): per-model code-mode capability flags and auto master-switch tier
* feat(anthropic): flag claude-sonnet-4-6 as code-mode preferred
* revert(anthropic): drop claude-sonnet-4-6 from the code-mode preferred set
* test(anthropic): type the manifest compat field in the catalog contract test
* fix(anthropic): carry catalog compat onto hand-built forward-compat model rows
2026-07-27 16:47:41 -04:00
Peter Steinberger
17ed69e103
fix(agents): preserve prompt caches across tool discovery ( #114572 )
2026-07-27 09:58:19 -04:00
Peter Steinberger
91b1f9676f
fix(media): reject malformed provider binary payloads ( #114514 )
2026-07-27 06:39:47 -04:00
zengLingbiao
a8e52b49a0
fix(google): reject malformed base64 audio in Gemini TTS responses ( #114041 )
...
* fix(google): reject malformed base64 audio in Gemini TTS responses
* fix(media): validate provider audio payloads
Co-authored-by: zengLingbiao <zeng.lingbiao@xydigit.com >
* fix(xai): terminate malformed realtime audio
Co-authored-by: zengLingbiao <zeng.lingbiao@xydigit.com >
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-27 04:17:35 -04:00
Peter Steinberger
8e4b6623e5
test(providers): consolidate streaming and model contract cases ( #114336 )
2026-07-27 01:36:32 -04:00
Peter Steinberger
caa01f4f5b
refactor(providers): table-driven forward compat and manifest-derived contract tests ( #113940 )
...
* refactor(providers): share family forward compat resolution
* test(providers): derive runtime contracts from manifests
* test(providers): validate manifest fixture inputs
* refactor(zai): narrow forward compat inputs
2026-07-25 18:09:37 -07:00
Masato Hoshino
bdcc5d54a5
fix(agents): honor run abort signal in image and pdf tools ( #112644 )
...
* fix(agents): honor run abort signal in image and pdf tools
The image and pdf agent tools declared `execute: async (_toolCallId, args)`
and dropped the run abort signal that `wrapToolWithAbortSignal` supplies as
the third execute argument. The wrapper only races the execute promise, so an
aborted run kept sequentially downloading images/PDFs (up to the per-tool cap,
each up to the byte cap) and still issued a paid vision/PDF-model call for a
dead run.
Thread the signal into the existing `requestInit: { signal }` seam (which the
media fetch layer already merges into the download fetch) and add
`signal.throwIfAborted()` between sequential loop items and before the paid
model call. No new media-options signal field; non-abort behavior is unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
* fix(agents): keep the pdf test suite under the lint ceiling; guard model dispatch
Follow-up on the abort-signal change, resolving the check-lint failure and a
review finding on the same seam.
max-lines
---------
Adding the two pdf abort tests pushed src/agents/tools/pdf-tool.test.ts to 1018
effective lines against a ceiling of 1000, failing check-lint. Resolved without
touching config/max-lines-baseline.txt — a suppression there would also have
tripped the max-lines ratchet.
- The new tests declared their own `describe` with `beforeEach`/`afterEach`
hooks identical to the existing `describe("createPdfTool")`. They exercise
that same tool, so they now live in it and the duplicated scaffolding is gone.
- `stubPdfToolInfra`, `createPdfModelRegistry` and `FAKE_PDF_MEDIA` moved to
pdf-tool.test-support.ts, which already exists for exactly this. They go
through `createPdfToolInfraStub(completeMock)` rather than being exported
directly, because the stub wires the suite's own `complete` mock into the
model registry and vi.mock handles are file-scoped. All 21 existing call
sites are unchanged.
Abort propagation into model dispatch
-------------------------------------
The previous revision stopped cancellation at download boundaries and before
the first model call, but `runImagePrompt`/`runPdfPrompt` never saw the signal.
A run cancelled while the first provider request was in flight could still
issue the remaining ones — the image path dispatches `describeImage` once per
image in a sequential loop, so a dead run kept paying for every later image.
Both now take an optional `signal` and check it immediately before each
provider dispatch (3 sites in image-tool, 4 in pdf-tool).
Forwarding the signal further, into the provider transports themselves, is a
different seam and is deliberately left out of this PR.
Also declares `requestInit` on `ImageToolLoadWebMediaOptions`. The local facade
omitted it while the underlying loader accepts it (web-media.ts declares it and
forwards it to readRemoteMediaBuffer), so the option worked at runtime and only
compiled because spread properties skip excess-property checking. A non-spread
call site would not have.
tsgo core + core-test, oxlint, oxfmt clean; pdf-tool and image-tool suites 266
tests pass.
* test(agents): prove in-flight media aborts
* test(agents): narrow PDF loader options
* test(agents): reject abort mocks with errors
* fix(agents): propagate media cancellation
* test(agents): type PDF abort fixture
* test(agents): type prepared runtime snapshot
* fix(agents): normalize abort rejection errors
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-25 05:17:09 -07:00
Peter Steinberger
b0603cb443
refactor(fs): adopt shared safe filesystem primitives ( #113596 )
...
* refactor(fs): adopt fs-safe helpers
* fix(zalouser): keep stable per-profile QR temp path
* fix(fs): route adoption through owned facades
2026-07-25 03:24:19 -07:00
Vincent Koc
749dbcb2a7
refactor(media): consolidate generated media byte limits ( #113556 )
2026-07-25 15:39:49 +08:00
joshavant
a325467557
fix(cron): preserve scheduled caps across CLI and worker upgrades
2026-07-24 01:24:03 -05:00
joshavant
8287e21445
fix(cron): enforce caps across CLI backends
2026-07-24 01:24:03 -05:00
Peter Steinberger
acd92f6a3d
chore(deps): refresh repository dependencies ( #112453 )
...
* build(deps): update QA broker dependency
* build(deps): refresh repository dependencies
* build(deps): reconcile rebased shrinkwraps
* test(plugins): remove stale loader test state
* test(deps): stabilize updated dependency coverage
* fix(swift): use caller-isolated TaskLocal overload
* build(deps): regenerate rebased shrinkwraps
* test(msteams): preserve DNS validation in fetch helper
* fix(deps): avoid vulnerable optional image stack
* test(deps): validate generated LRU override
* refactor(ui): extract chat resizable divider
* test(ui): update divider ownership path
* fix(matrix): retain restart-compatible SDK
* style(cron): format update test
2026-07-23 16:17:13 +00:00
Peter Steinberger
3c4a1ec905
refactor(agents): move CLI backend adapters from config DSL to registerCliBackend plugins (review request) ( #112539 )
...
* refactor(agents): move CLI backend adapters into plugins
* test(agents): register CLI backend fixtures through plugins
2026-07-22 00:25:29 -07:00
Peter Steinberger
edecdbd05e
refactor(config): config-surface reduction tranche 3 — product consolidations (review request) ( #111527 )
...
* refactor(config): consolidate media model lists
* refactor(config): unify memory configuration
* refactor(config): consolidate TTS ownership
* refactor(config): move typing policy to agents
* refactor(config): retire product-level config surfaces
* refactor(config): share scoped tool policy type
* chore(config): refresh generated baselines
* fix(config): honor agent typing overrides
* fix(config): migrate sibling config consumers
* refactor(infra): keep base64url decoder private
* fix(config): strip invalid legacy TTS values
* chore(config): refresh rebased baseline hash
* fix(doctor): route legacy messages.tts.realtime voice to talk during tts move
* refactor(config): polish final layout names
* refactor(config): freeze retired tuning defaults
* feat(config): add fast mode default symmetry
* refactor(config): key agent entries by id
* docs(config): update final layout reference
* test(config): cover final layout migrations
* chore(config): refresh final layout baselines
* fix(config): align final layout runtime readers
* fix(config): align remaining readers
* fix(config): stabilize final layout migrations
* fix(config): finalize config projection proof
* fix(config): address final layout review
* docs(release): preserve historical config names
* fix(config): complete keyed agent migration
* fix(config): close final migration gaps
* fix(config): finish full-branch review
* fix(config): complete runtime secret detection
* fix(config): close final review findings
* fix(config): finish canonical docs and heartbeat migration
* fix(config): integrate latest main after rebase
* refactor(env): isolate test-only controls
* refactor(env): isolate build and development controls
* refactor(env): collapse process identity indirection
* refactor(env): remove duplicate config and temp aliases
* docs(env): define the operator-facing allowlist
* ci(env): ratchet production variable count
* fix(env): remove stale provider helper import
* fix(env): make ratchet sorting explicit
* test(env): keep test seam in dead-code audit
* test(env): cover ratchet growth and boundary; document surface budgets
* docs(config): document tier-eval consolidations
* docs(config): clarify speech preference ownership
* test(memory): align retired tuning fixtures
* refactor(memory): freeze engine heuristics
* refactor(config): apply tier-eval tranche
* refactor(tts): move persona shaping to providers
* refactor(compaction): move prompt policy to providers
* test(config): align hookified prompt fixtures
* chore(deadcode): classify test-only exports
* chore(github): remove unused spawn helper
* chore(deadcode): classify queue diagnostics
* chore(deadcode): remove unused lane snapshot export
* chore(plugin-sdk): ratchet consolidated surface
* fix(config): integrate latest main after rebase
2026-07-21 20:28:43 -07:00
Jason (Json)
55cf9523e0
feat: discover models from live provider catalogs ( #112412 )
...
* feat: discover models from live provider catalogs
* fix(provider-catalog): satisfy current catalog contracts
* fix(deps): update fast-uri past new advisory
* fix(deps): refresh fast-uri shrinkwraps
* fix(openrouter): satisfy provider catalog lint
* fix(agents): preserve refreshable catalog metadata
* test(agents): keep catalog fallback proof within lint budget
* fix(provider-catalog): honor live model contracts
* fix(minimax): type discovery headers explicitly
* docs(plugin-sdk): define live model discovery contract
2026-07-21 19:29:57 -06:00
Wynne668
72f77364b3
fix(google): keep embedding batch waits within timeout ( #111674 )
2026-07-20 11:46:06 +03:00
Peter Steinberger
c7e7ac2728
refactor: remove expired plugin compatibility surfaces ( #111451 )
...
* docs(secrets): remove retired web credential paths
* refactor(web): remove retired provider compatibility paths
* refactor(providers): delete retired compatibility routes
* refactor(secrets): remove retired credential aliases
* refactor(plugin-sdk): delete retired compatibility surfaces
* docs(plugin-sdk): remove retired migration guidance
* chore(plugin-sdk): refresh rebased surface budgets
* chore(plugin-sdk): refresh API removal baseline
* refactor(compat): migrate retired internal callers
* chore(plugin-sdk): refresh current-main baselines
* test(config): migrate plugin-owned secret assertions
* test(gateway): narrow plugin secret refs
* fix(plugin-sdk): preserve private boundary type identity
* chore(compat): remove stale sweep references
* chore(lint): lower max-lines budget
* refactor(secrets): remove unused web helper
* build(plugin-sdk): drop removed compat entries
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): use Linux API baseline hash
* fix(plugin-sdk): preserve private bundled build entries
* fix(plugin-sdk): package private runtime facades
* fix(plugins): preserve external credential contracts
2026-07-19 11:04:48 -07:00
Peter Steinberger
3fd3ad8301
fix(ci): restore plugin prerelease validation ( #110787 )
...
* test: align plugin prerelease assertions
* test: remove stale vitest import
2026-07-18 17:00:15 +01:00
Peter Steinberger
349f78776d
fix(models): refresh bundled provider catalogs ( #109410 )
...
* fix(models): refresh bundled provider catalogs
* docs(models): refresh generated docs map
* fix(xiaomi): keep provider helper private
* chore(release): defer catalog release note
2026-07-16 16:47:25 -07:00
Peter Steinberger
0631252f4b
refactor: reduce plugin SDK test import overhead ( #109333 )
...
* refactor(test): split plugin SDK test helpers
* fix(test): align plugin SDK test subpaths
2026-07-16 13:55:23 -07:00
Peter Steinberger
04c31f453c
fix: reject oversized credential files in remaining readers ( #109260 )
...
* fix(security): bound remaining credential file reads
* fix(anthropic-vertex): keep ADC helper type private
2026-07-16 11:33:18 -07:00
Peter Steinberger
e2fed32131
fix(onboarding): explain how to get provider tokens and revive logged-out CLI candidates ( #108739 )
...
* fix(onboarding): explain how to obtain provider tokens in auth setup copy
* fix(onboarding): add per-CLI login remediation to detected candidate details
2026-07-16 01:12:15 -07:00
Peter Steinberger
73ada8fd4c
fix(ai): preserve tool-result text for payload-less media ( #108697 )
...
* fix(ai): require payload bytes for tool media
Co-authored-by: Alex Knight <15041791+amknight@users.noreply.github.com >
Co-authored-by: 0668000539 <shu.zongyu@xydigit.com >
* chore: keep release notes out of PR
---------
Co-authored-by: 0668000539 <shu.zongyu@xydigit.com >
2026-07-16 00:42:36 -07:00
Peter Steinberger
d3dcb36895
refactor(deadcode): tighten Google and xAI extension roots ( #108523 )
2026-07-15 17:34:53 -07:00
pick-cat
1c2bcbb56f
fix: classify provider code-only failover errors ( #95729 )
...
* fix(agents): classify provider-native failover errors
Co-authored-by: Altay <altay@hey.com >
* fix(agents): scope provider failover codes
* docs(changelog): credit provider failover fix
* style(anthropic): format failover classifier
* docs(changelog): defer release-owned entry
---------
Co-authored-by: Pick-cat <266665499+Pick-cat@users.noreply.github.com >
Co-authored-by: Altay <altay@hey.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-15 04:07:51 -07:00
Peter Steinberger
7b9a72fc4f
refactor(extensions): trim small plugin exports ( #107784 )
...
* refactor(workspaces): privatize internal plugin surfaces
* refactor(canvas): trim internal host exports
* refactor(qa-channel): privatize media URL validation
* refactor(google): remove web search test facade
* refactor(xai): remove response helper test facades
* chore(deadcode): shrink extension export baseline
2026-07-14 14:38:08 -07:00