Skip to content

Commit 2a4ee05

Browse files
authored
Merge branch 'main' into policy-tool-posture-conformance
2 parents ae17007 + 0038813 commit 2a4ee05

80 files changed

Lines changed: 3702 additions & 716 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Docs: https://docs.openclaw.ai
2828
- Maintainer skills: exclude plugin SDK/API boundary work from `openclaw-landable-bug-sweep` so bugbash sweeps stay focused on small paper-cut fixes.
2929
- QA-Lab/diagnostics: extend the OpenTelemetry smoke harness to prove trace, metric, and log export, and add first-class Prometheus and observability smoke aliases.
3030
- Plugin SDK: add a generic channel-message poll sender so channel plugins can expose poll delivery without depending on channel-specific SDK facades.
31+
- Plugin SDK/cron delivery: route cron delivery through the modern target resolver and outbound session-route APIs, deprecate parser-backed target helpers and `plugin-sdk/messaging-targets`, and move bundled callers to `plugin-sdk/channel-targets`.
3132
- Crabbox: keep the local wrapper's provider validation synced with the installed Crabbox binary while preserving supported aliases such as `docker` and `blacksmith`. (#85302) Thanks @hxy91819.
3233
- Maintainer skills: add `openclaw-landable-bug-sweep` for producing five small, reviewed, CI-green OpenClaw bugfix PRs from issue/PR sweeps.
3334
- Control UI/chat: add search and Load More pagination to the chat session picker, keeping initial session loads bounded while making older conversations reachable. (#85237) Thanks @amknight.
@@ -57,6 +58,7 @@ Docs: https://docs.openclaw.ai
5758

5859
### Fixes
5960

61+
- Ollama: bypass the managed proxy for configured local embedding origins while keeping SSRF guardrails on unconfigured targets. Thanks @Kaspre.
6062
- Checks/Windows: route full `pnpm check` stage commands through the managed child runner so Windows avoids Node shell-argv deprecation warnings there too.
6163
- Checks/Windows: run managed child commands through explicit `cmd.exe` wrapping instead of Node shell mode with argv, avoiding Node 24 subprocess deprecation warnings during changed checks.
6264
- Models: prune retired Groq, GitHub Copilot, OpenAI, xAI, and old Claude catalog entries, with doctor migration to upgrade existing configs to current provider refs.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
e07c1b7a7bc8a6eb25a832961c2367f56d60a1fa54096dda460f8db1e572aa2a plugin-sdk-api-baseline.json
2-
34f2af745b9ed47eec90350b2c2a9000566744b8982440feee1c4a405d0a28ca plugin-sdk-api-baseline.jsonl
1+
434c62dfc32631e2c0cd862059f3257c0844d2c515e92db4d5670be7f3882a14 plugin-sdk-api-baseline.json
2+
2f6c82614fc6521ea27209e3d9888a4a6cdec30fa3082500aef4f8975358d9bf plugin-sdk-api-baseline.jsonl

docs/plugins/sdk-channel-plugins.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ route-like fields, compare a child thread with its parent route, or build a
119119
stable dedupe key from `{ channel, to, accountId, threadId }`. The helper
120120
normalizes numeric thread ids the same way core does, so plugins should prefer
121121
it over ad hoc `String(threadId)` comparisons.
122-
Plugins with provider-specific target grammar can inject their parser into
123-
`resolveChannelRouteTargetWithParser(...)` and still get the same route target
124-
shape and thread fallback semantics core uses.
122+
Plugins with provider-specific target grammar should expose
123+
`messaging.resolveOutboundSessionRoute(...)` so core gets provider-native
124+
session and thread identity without using parser shims.
125125

126126
Bundled plugins that need the same parsing before the channel registry boots
127127
can also expose a top-level `session-key-api.ts` file with a matching
@@ -253,7 +253,7 @@ surfaces:
253253
- `openclaw/plugin-sdk/inbound-envelope` and
254254
`openclaw/plugin-sdk/inbound-reply-dispatch` for inbound route/envelope and
255255
record-and-dispatch wiring
256-
- `openclaw/plugin-sdk/messaging-targets` for target parsing/matching
256+
- `openclaw/plugin-sdk/channel-targets` for target parsing helpers
257257
- `openclaw/plugin-sdk/outbound-media` and
258258
`openclaw/plugin-sdk/outbound-runtime` for media loading plus outbound
259259
identity/send delegates and payload planning

docs/plugins/sdk-migration.md

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -467,16 +467,23 @@ releases.
467467
| `channelRouteIdentityKey(...)` | `channelRouteDedupeKey(...)` |
468468
| `channelRouteKey(...)` | `channelRouteCompactKey(...)` |
469469
| `ComparableChannelTarget` | `ChannelRouteParsedTarget` |
470-
| `resolveComparableTargetForChannel(...)` | `resolveRouteTargetForChannel(...)` |
471-
| `resolveComparableTargetForLoadedChannel(...)` | `resolveRouteTargetForLoadedChannel(...)` |
472470
| `comparableChannelTargetsMatch(...)` | `channelRouteTargetsMatchExact(...)` |
473471
| `comparableChannelTargetsShareRoute(...)` | `channelRouteTargetsShareConversation(...)` |
474472

475473
The modern route helpers normalize `{ channel, to, accountId, threadId }`
476474
consistently across native approvals, reply suppression, inbound dedupe,
477-
cron delivery, and session routing. If your plugin owns custom target
478-
grammar, use `resolveChannelRouteTargetWithParser(...)` to adapt that
479-
parser into the same route target contract.
475+
cron delivery, and session routing.
476+
477+
Do not add new uses of `ChannelMessagingAdapter.parseExplicitTarget` or
478+
the parser-backed loaded-route helpers (`parseExplicitTargetForLoadedChannel`
479+
or `resolveRouteTargetForLoadedChannel`) or
480+
`resolveChannelRouteTargetWithParser(...)` from `plugin-sdk/channel-route`.
481+
Those hooks are deprecated and remain only for older plugins during the
482+
migration window. New channel plugins should use
483+
`messaging.targetResolver.resolveTarget(...)` for target id normalization
484+
and directory-miss fallback, `messaging.inferTargetChatType(...)` when core
485+
needs an early peer kind, and `messaging.resolveOutboundSessionRoute(...)`
486+
for provider-native session and thread identity.
480487

481488
</Step>
482489

@@ -518,7 +525,7 @@ releases.
518525
| `plugin-sdk/channel-lifecycle` | Account status and draft stream lifecycle helpers | `createAccountStatusSink`, draft preview finalization helpers |
519526
| `plugin-sdk/inbound-envelope` | Inbound envelope helpers | Shared route + envelope builder helpers |
520527
| `plugin-sdk/inbound-reply-dispatch` | Inbound reply helpers | Shared record-and-dispatch helpers |
521-
| `plugin-sdk/messaging-targets` | Messaging target parsing | Target parsing/matching helpers |
528+
| `plugin-sdk/messaging-targets` | Deprecated target parsing import path | Use `plugin-sdk/channel-targets` for generic target parsing helpers, `plugin-sdk/channel-route` for route comparison, and plugin-owned `messaging.targetResolver` / `messaging.resolveOutboundSessionRoute` for provider-specific target resolution |
522529
| `plugin-sdk/outbound-media` | Outbound media helpers | Shared outbound media loading |
523530
| `plugin-sdk/outbound-send-deps` | Outbound send dependency helpers | Lightweight `resolveOutboundSendDep` lookup without importing the full outbound runtime |
524531
| `plugin-sdk/outbound-runtime` | Outbound runtime helpers | Outbound delivery, identity/send delegate, session, formatting, and payload planning helpers |

docs/plugins/sdk-subpaths.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ focused channel/runtime subpaths, `config-contracts`, `string-coerce-runtime`,
117117
| `plugin-sdk/channel-message-runtime` | Runtime delivery helpers that may load outbound delivery, including `deliverInboundReplyWithMessageSendContext`, `sendDurableMessageBatch`, and `withDurableMessageSendContext`. Deprecated reply-dispatch bridges remain importable for compatibility dispatchers only. Use from monitor/send runtime modules, not hot plugin bootstrap files. |
118118
| `plugin-sdk/inbound-envelope` | Shared inbound route + envelope builder helpers |
119119
| `plugin-sdk/inbound-reply-dispatch` | Legacy shared inbound record-and-dispatch helpers, visible/final dispatch predicates, and deprecated `deliverDurableInboundReplyPayload` compatibility for prepared channel dispatchers. New channel receive/dispatch code should import runtime lifecycle helpers from `plugin-sdk/channel-message-runtime`. |
120-
| `plugin-sdk/messaging-targets` | Target parsing/matching helpers |
120+
| `plugin-sdk/messaging-targets` | Deprecated target parsing alias; use `plugin-sdk/channel-targets` |
121121
| `plugin-sdk/outbound-media` | Shared outbound media loading helpers |
122122
| `plugin-sdk/outbound-send-deps` | Lightweight outbound send dependency lookup for channel adapters |
123123
| `plugin-sdk/outbound-runtime` | Outbound identity, send delegate, session, formatting, and payload planning helpers. Direct delivery helpers such as `deliverOutboundPayloads` are deprecated compatibility substrate; use `plugin-sdk/channel-message-runtime` for new send paths. |

docs/providers/ollama.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,19 @@ For the full setup and behavior details, see [Ollama Web Search](/tools/ollama-s
916916
and API key, calls Ollama's current `/api/embed` endpoint, and batches
917917
multiple memory chunks into one `input` request when possible.
918918

919+
When `proxy.enabled=true`, Ollama memory embedding requests to the exact
920+
host-local loopback origin derived from the configured `baseUrl` use
921+
OpenClaw's guarded direct path instead of the managed forward proxy. The
922+
configured hostname must itself be `localhost` or a loopback IP literal;
923+
DNS names that merely resolve to loopback still use the managed proxy path.
924+
LAN, tailnet, private-network, and public Ollama hosts also stay on the
925+
managed proxy path. Redirects to another host or port do not inherit trust.
926+
Operators can still set the global `proxy.loopbackMode: "proxy"` setting to
927+
send loopback traffic through the proxy, or `proxy.loopbackMode: "block"`
928+
to deny loopback connections before opening a connection; see
929+
[Managed proxy](/security/network-proxy#gateway-loopback-mode) for the
930+
process-wide effect of this setting.
931+
919932
| Property | Value |
920933
| ------------- | ------------------- |
921934
| Default model | `nomic-embed-text` |

docs/security/network-proxy.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ OPENCLAW_PROXY_URL=http://127.0.0.1:3128 openclaw gateway run
8787

8888
### Gateway Loopback Mode
8989

90-
Local Gateway control-plane clients usually connect to a loopback WebSocket such as `ws://127.0.0.1:18789`. Use `proxy.loopbackMode` to choose how that traffic behaves while the managed proxy is active:
90+
Local Gateway control-plane clients usually connect to a loopback WebSocket such as `ws://127.0.0.1:18789`. Use `proxy.loopbackMode` to choose how loopback managed-proxy exceptions behave while the managed proxy is active:
9191

9292
```yaml
9393
proxy:
@@ -96,9 +96,9 @@ proxy:
9696
loopbackMode: gateway-only # gateway-only, proxy, or block
9797
```
9898

99-
- `gateway-only` (default): OpenClaw registers the Gateway loopback authority in Proxyline's managed bypass policy so local Gateway WebSocket traffic can connect directly. Custom loopback Gateway ports work because the active Gateway URL's host and port are registered.
100-
- `proxy`: OpenClaw does not register a Gateway loopback bypass, so local Gateway traffic is sent through the managed proxy. If the proxy is remote, it must provide special routing for the OpenClaw host's loopback service, such as mapping it to a proxy-reachable hostname, IP, or tunnel. Standard remote proxies resolve `127.0.0.1` and `localhost` from the proxy host, not from the OpenClaw host.
101-
- `block`: OpenClaw denies loopback Gateway control-plane connections before opening a socket.
99+
- `gateway-only` (default): OpenClaw registers the Gateway loopback authority in Proxyline's managed bypass policy so local Gateway WebSocket traffic can connect directly. Custom loopback Gateway ports work because the active Gateway URL's host and port are registered. The bundled Ollama memory embedding provider can also use its own narrower guarded direct path for the exact configured host-local loopback embedding origin.
100+
- `proxy`: OpenClaw does not register Gateway or Ollama loopback bypasses, so that loopback traffic is sent through the managed proxy. If the proxy is remote, it must provide special routing for the OpenClaw host's loopback service, such as mapping it to a proxy-reachable hostname, IP, or tunnel. Standard remote proxies resolve `127.0.0.1` and `localhost` from the proxy host, not from the OpenClaw host.
101+
- `block`: OpenClaw denies Gateway loopback control-plane connections and guarded Ollama host-local embedding loopback connections before opening a socket.
102102

103103
If `enabled=true` but no valid proxy URL is configured, protected commands fail startup instead of falling back to direct network access.
104104

@@ -253,7 +253,7 @@ proxy:
253253
- Raw `net`, `tls`, and `http2` sockets, native addons, and non-OpenClaw child processes may bypass Node-level proxy routing unless they inherit and respect proxy environment variables. Forked OpenClaw child CLIs inherit the managed proxy URL and `proxy.loopbackMode` state.
254254
- IRC is a raw TCP/TLS channel outside operator-managed forward proxy routing. In deployments that require all egress through that forward proxy, set `channels.irc.enabled=false` unless direct IRC egress is explicitly approved.
255255
- The local debug proxy is diagnostic tooling and its direct upstream forwarding for proxy requests and CONNECT tunnels is disabled by default while managed proxy mode is active; enable direct forwarding only for approved local diagnostics.
256-
- User local WebUIs and local model servers should be allowlisted in the operator proxy policy when needed; OpenClaw does not expose a general local-network bypass for them.
256+
- User local WebUIs and local model servers should be allowlisted in the operator proxy policy when needed; OpenClaw does not expose a general local-network bypass for them. The bundled Ollama memory embedding provider is narrower: it can use a guarded direct path only for the exact host-local loopback embedding origin derived from the configured `baseUrl` so host-local embeddings keep working when the managed proxy cannot reach host loopback. LAN, tailnet, private-network, and public Ollama embedding hosts still use the managed proxy path. `proxy.loopbackMode: "proxy"` sends this Ollama loopback traffic through the managed proxy, and `proxy.loopbackMode: "block"` denies it before opening a connection.
257257
- Gateway control-plane proxy bypass is intentionally limited to `localhost` and literal loopback IP URLs. Use `ws://127.0.0.1:18789`, `ws://[::1]:18789`, or `ws://localhost:18789` for local direct Gateway control-plane connections; other hostnames route like ordinary hostname-based traffic.
258258
- OpenClaw does not inspect, test, or certify your proxy policy.
259259
- Treat proxy policy changes as security-sensitive operational changes.

extensions/clickclack/src/channel.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,6 @@ export const clickClackPlugin: ChannelPlugin<ResolvedClickClackAccount> = create
9393
messaging: {
9494
targetPrefixes: ["clickclack", "cc"],
9595
normalizeTarget: normalizeClickClackTarget,
96-
parseExplicitTarget: ({ raw }) => {
97-
const parsed = parseClickClackTarget(raw);
98-
return {
99-
to: buildClickClackTarget(parsed),
100-
threadId: parsed.kind === "thread" ? parsed.id : undefined,
101-
chatType: parsed.chatType,
102-
};
103-
},
10496
inferTargetChatType: ({ to }) => parseClickClackTarget(to).chatType,
10597
targetResolver: {
10698
looksLikeId: looksLikeClickClackTarget,

0 commit comments

Comments
 (0)