Commit Graph

32946 Commits

Author SHA1 Message Date
Peter Steinberger
4fb2e2309e refactor: share timeout abort helper with matrix 2026-04-20 23:34:19 +01:00
Peter Steinberger
8b7418b127 refactor: share channel doctor alias normalization 2026-04-20 23:34:19 +01:00
Peter Steinberger
e2abd4bc62 test(ci): fix msteams and heartbeat red lanes 2026-04-20 23:33:49 +01:00
Peter Steinberger
1151d69bb8 test: use synthetic outbound routing fixtures 2026-04-20 23:33:25 +01:00
Peter Steinberger
68954f9c6c test: extract chat item builder coverage 2026-04-20 23:33:21 +01:00
Peter Steinberger
31d545260e test: merge acp manager retry cases 2026-04-20 23:33:21 +01:00
Peter Steinberger
f6c9912e37 test: use synthetic outbound binding fixtures 2026-04-20 23:29:43 +01:00
Peter Steinberger
7e8b58cb25 test: use synthetic outbound utility fixtures 2026-04-20 23:27:18 +01:00
Peter Steinberger
b07c40a5a8 test: merge system run denial matrices 2026-04-20 23:26:37 +01:00
Peter Steinberger
11eae6b2d8 test: use synthetic message action fixtures 2026-04-20 23:25:08 +01:00
Peter Steinberger
c1be9ac0a7 test: move chat tool disclosure coverage 2026-04-20 23:22:26 +01:00
Peter Steinberger
c561e4c11b test: use synthetic outbound core fixtures 2026-04-20 23:20:51 +01:00
Peter Steinberger
f1a544ef6d perf: avoid sort-for-single selection 2026-04-20 23:20:31 +01:00
Peter Steinberger
2d010306e4 test: split grouped chat rendering coverage 2026-04-20 23:17:21 +01:00
Peter Steinberger
3eb48ec3e7 refactor(telegram): split polling liveness tracking 2026-04-20 23:16:55 +01:00
Peter Steinberger
431e33b567 test: share channel directory id assertions 2026-04-20 23:15:58 +01:00
Peter Steinberger
da5a6b68bd refactor: share ssrf base url policy 2026-04-20 23:15:58 +01:00
Peter Steinberger
85450b3da9 test: share msteams message handler mocks 2026-04-20 23:15:58 +01:00
Peter Steinberger
3f8ac729f2 test: share msteams runtime setup 2026-04-20 23:15:58 +01:00
Peter Steinberger
72571f0d38 test: decouple outbound target tests from bundled plugins 2026-04-20 23:14:50 +01:00
Peter Steinberger
e0c01bf956 perf: trim hot path allocations 2026-04-20 23:13:20 +01:00
Peter Steinberger
9f9235b692 test(channels): shard registry-backed contracts 2026-04-20 23:10:46 +01:00
ly85206559
35cb59e3b5 fix(agents): reapply compaction settings after resource loader reload (#65602) (#67146)
Merged via squash.

Prepared head SHA: 4978f7b8b5
Co-authored-by: ly85206559 <12526624+ly85206559@users.noreply.github.com>
Co-authored-by: jalehman <550978+jalehman@users.noreply.github.com>
Reviewed-by: @jalehman
2026-04-20 15:10:24 -07:00
Peter Steinberger
d7c7905a52 refactor: share provider polling helper 2026-04-20 23:04:10 +01:00
Peter Steinberger
eb94d3af94 test: share provider stream capture helper 2026-04-20 23:04:10 +01:00
Peter Steinberger
614d0348a5 test: share msteams sso handler setup 2026-04-20 23:04:10 +01:00
Peter Steinberger
8f4920e2eb refactor: share line sdk types 2026-04-20 23:04:10 +01:00
Peter Steinberger
60fea81cf1 fix(telegram): harden polling transport liveness (#69476)
* fix(telegram): release undici dispatchers via TelegramTransport.close()

TelegramTransport now exposes an explicit close() that destroys every
owned undici dispatcher (default Agent plus lazily-created IPv4 and
IP-pinned fallback Agents) and the TCP sockets they hold. Dispatcher
constructors are also given bounded keep-alive defaults
(keepAliveTimeout, keepAliveMaxTimeout, connections, pipelining) as a
defence-in-depth layer so the pool cannot grow unbounded even if a
caller forgets to call close().

Without this, every transport that went through a fallback retry left
its fallback Agents anchored forever in a closure; long-running polling
sessions accumulated hundreds of ESTABLISHED keep-alive sockets to
api.telegram.org, saturating the per-IP quota on upstream forward
proxies and making the currently-active outbound node time out while
every other node still tested healthy.

Mock dispatchers in fetch.test.ts gain destroy() spies so the close()
chain is assertable. Call sites that built caller-owned transports from
globalThis.fetch (delivery.resolve-media, test helpers) return an async
no-op close(), matching the new required surface.

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

* fix(telegram): dispose polling transport on shutdown and dirty rebuild

Every recoverable network error and stall-watchdog trip sets
TelegramPollingTransportState.#transportDirty so the next polling
cycle rebuilds the transport inside acquireForNextCycle(). Previously
the rebuild simply overwrote the field, leaving the old transport's
keep-alive sockets anchored in the now-unreferenced dispatcher — the
polling loop has no natural GC point for these resources, and Node's
object GC never touches OS-level sockets.

acquireForNextCycle() now closes the previous transport (fire-and-
forget so the polling cycle is not blocked by a slow destroy) before
swapping in the rebuilt one. dispose() is a new method that the owning
TelegramPollingSession calls from the finally block of runUntilAbort(),
so a single transport is always tied to a single polling session
lifetime. After dispose(), acquireForNextCycle() returns undefined to
prevent zombie rebuilds.

Under high sustained polling traffic over long-lived sessions, this is
what stops the per-gateway connection count to api.telegram.org from
growing indefinitely and saturating upstream proxy quotas.

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

* docs(changelog): note Telegram undici dispatcher lifecycle fix

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

* fix(telegram): disable HTTP/2 for all Telegram polling dispatchers

Undici 8 enables HTTP/2 ALPN by default, but Telegram's long-polling
connections stall on Windows due to IPv6 + H2 multiplexing issues. The
core fetch-guard already sets allowH2:false for guarded paths, but the
Telegram extension creates its own Agent/ProxyAgent/EnvHttpProxyAgent
instances directly from undici without this flag.

Apply allowH2:false to all dispatcher constructors in the Telegram
transport layer, matching the approach used in src/infra/net/undici-runtime.ts.

Fixes #66885

* fix: avoid false telegram polling stall restarts

* fix(telegram): publish polling health liveness

---------

Co-authored-by: Ethan Chen <ethanbit@qq.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Magicray1217 <magicray1217@users.noreply.github.com>
Co-authored-by: aoao <aoao@openclaw>
2026-04-20 23:03:57 +01:00
Peter Steinberger
250c756fb4 test: share directive reply mock payloads 2026-04-20 22:51:16 +01:00
Peter Steinberger
ca2c9fef8c test: share gateway live client helpers 2026-04-20 22:51:16 +01:00
Peter Steinberger
c55e1f7566 test: share gateway broadcaster fixtures 2026-04-20 22:51:16 +01:00
Peter Steinberger
40eae3cbb7 refactor: share ui select option helper 2026-04-20 22:51:16 +01:00
Peter Steinberger
412d6cf21b test(ui): tighten app tool stream event helper type 2026-04-20 22:50:45 +01:00
Peter Steinberger
b7e5d9a96e test: decouple outbound tests from bundled plugins 2026-04-20 22:44:38 +01:00
Peter Steinberger
27c52f8062 ci: keep channel contract shards alive 2026-04-20 22:42:57 +01:00
Peter Steinberger
2003ab736a test: share app render settings fixture 2026-04-20 22:39:51 +01:00
Peter Steinberger
171077037a test: share tool stream event helpers 2026-04-20 22:39:07 +01:00
Peter Steinberger
b33ce7a371 refactor: share skills dialog opener 2026-04-20 22:37:50 +01:00
Peter Steinberger
e0621bd7b9 test: share nodes device render helper 2026-04-20 22:37:11 +01:00
Peter Steinberger
9dcbf911a0 refactor: share ui approval event handling 2026-04-20 22:36:23 +01:00
Peter Steinberger
1f951f36fd test: remove unused agent runtime support 2026-04-20 22:36:22 +01:00
Peter Steinberger
3e6758f55a test: share provider usage runtime mocks 2026-04-20 22:36:22 +01:00
Peter Steinberger
c63fb08f81 test: share approval native runtime stubs 2026-04-20 22:36:22 +01:00
Peter Steinberger
b248899878 perf(channels): narrow slow bundled channel entry imports 2026-04-20 22:34:11 +01:00
Peter Steinberger
88d97c55c7 test: share secrets runtime file fixture 2026-04-20 22:28:49 +01:00
Peter Steinberger
9cba6672d6 refactor: share inactive web provider warnings 2026-04-20 22:28:49 +01:00
Peter Steinberger
19525e1dd0 test: share media auth snapshot setup 2026-04-20 22:28:49 +01:00
Peter Steinberger
cf4354ad83 test: share plugin secret collector setup 2026-04-20 22:28:49 +01:00
Peter Steinberger
99b933f160 perf(gateway): skip cold startup sidecars until needed 2026-04-20 22:24:37 +01:00
Agustin Rivera
6d3ce088da fix(gateway): require read scope for chat websocket broadcasts (#69373)
* fix(gateway): guard chat-class websocket broadcasts

* fix(gateway): harden broadcast event scope guards

* fix(gateway): keep websocket seq per recipient

* fix(gateway): let nodes receive voicewake broadcasts

* fix(gateway): preserve seq gaps for dropped broadcasts

* fix(gateway): drop USER.md worklog from PR

* fix(gateway): add scope guard docstring for pairing exclusion

* fix(gateway): allow plugin.* broadcast events for write/admin scopes

- Plugin-defined gateway broadcast events (plugin.* namespace) are now
  delivered to operator.write and operator.admin scoped clients
- This preserves the ability for plugins to broadcast custom events
  through context.broadcast() without requiring explicit enumeration
- Explicit plugin.* entries in EVENT_SCOPE_GUARDS take precedence
  (e.g., plugin.approval.* uses APPROVALS_SCOPE)

* docs(changelog): note chat broadcast read-scope gating (#69373)

---------

Co-authored-by: Devin Robison <drobison@nvidia.com>
2026-04-20 15:24:34 -06:00