惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
罗磊的独立博客
The Hacker News
The Hacker News
博客园 - 叶小钗
博客园 - 司徒正美
月光博客
月光博客
Latest news
Latest news
小众软件
小众软件
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
WordPress大学
WordPress大学
Know Your Adversary
Know Your Adversary
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
The Register - Security
The Register - Security
U
Unit 42
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
The GitHub Blog
The GitHub Blog
The Cloudflare Blog
P
Palo Alto Networks Blog
T
Threat Research - Cisco Blogs
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
大猫的无限游戏
大猫的无限游戏
I
Intezer
AWS News Blog
AWS News Blog
美团技术团队
Cisco Talos Blog
Cisco Talos Blog
Simon Willison's Weblog
Simon Willison's Weblog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
The Exploit Database - CXSecurity.com
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tenable Blog
L
Lohrmann on Cybersecurity
H
Help Net Security
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Privacy International News Feed
C
Cybersecurity and Infrastructure Security Agency CISA
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
Security Latest
Security Latest
MyScale Blog
MyScale Blog
T
Threatpost
Scott Helme
Scott Helme
K
Kaspersky official blog
J
Java Code Geeks

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4 test: trim doctor command hotspots · openclaw/openclaw@c66f16a test: isolate agent auth and spawn hotspots · openclaw/openclaw@9285935 test: stabilize MCP startup disposal race · openclaw/openclaw@dd9d2eb test: merge browser contract server suites · openclaw/openclaw@5817a76 test: narrow ollama provider discovery setup · openclaw/openclaw@a0d9598 build: declare qa-lab aimock runtime dependency · openclaw/openclaw@24431e5 test: speed up safe-bins exec harness · openclaw/openclaw@ee856ab test: preserve tool helpers in embedded runner mocks · openclaw/openclaw@acd86a0 refactor: move memory embeddings into provider plugins · openclaw/openclaw@77e6e4c test: reuse system-run temp fixtures · openclaw/openclaw@7e9ff0f test: trim hotspot wait overhead · openclaw/openclaw@12a59b0 Check: avoid duplicate boundary prep · openclaw/openclaw@baf11b8 test: reduce hotspot fixture overhead · openclaw/openclaw@3a59edd feat(ui): overhaul settings and slash command UX (#67819) thanks @Bun… · openclaw/openclaw@2cfb660 QA Matrix: exit cleanly on failure · openclaw/openclaw@42805d2 QA Matrix: isolate scenario coverage · openclaw/openclaw@7e659e1 Matrix: refresh crypto bootstrap state · openclaw/openclaw@94081d8 QA Lab: add provider registry · openclaw/openclaw@bb7e982 Matrix: add plugin changelog · openclaw/openclaw@4acab55 test: trim more hotspot overhead · openclaw/openclaw@f485311 test: trim remaining hotspot tests · openclaw/openclaw@6ba8626 test: narrow hotspot mocks · openclaw/openclaw@dbc8179 test: isolate gemini embedding request helpers · openclaw/openclaw@cd330f5 test: trim memory and mcp hotspots · openclaw/openclaw@fd48dfa test: slim provider registry mocks · openclaw/openclaw@2e08c77 test: harden Parallels update smoke · openclaw/openclaw@1a98090 feat: default Anthropic to Opus 4.7 · openclaw/openclaw@628b454 fix: harden node-host shell payload mutability checks · openclaw/openclaw@75c551e fix: land node-host approval binding for native binaries (#66731) (th… · openclaw/openclaw@29919bb CI: add daily schedule to CodeQL workflow (#67645) · openclaw/openclaw@69d25f5 fix(gateway): capture config hash after plugin auto-enable to prevent… · openclaw/openclaw@8c11210 fix: repair sanitized replay tool results before send (#67620) (thank… · openclaw/openclaw@c3c7a99 fix: restrict HTML timeout short-circuit to transient statuses · openclaw/openclaw@de129a6 fix: keep TUI watchdog bound to active run (#67401) (thanks @xantorres) · openclaw/openclaw@3525273 Gateway/skills: dedupe skills prefix-match + drop dead fallback on log · openclaw/openclaw@d7f489f Extensions/lmstudio: back off inference preload after consecutive fai… · openclaw/openclaw@b555214 TUI/streaming: add watchdog that resets the activity indicator after … · openclaw/openclaw@f44ab20 Agents/tool-loop: enable unknown-tool stream guard by default · openclaw/openclaw@36ed367 Gateway/skills: invalidate session skills snapshot on config write · openclaw/openclaw@b23d59a fix: classify HTML provider error pages correctly (#67642) (thanks @s… · openclaw/openclaw@e588e90 fix(skills): remove unused model-usage import (#67641) · openclaw/openclaw@55f05df docs(changelog): credit codex fix superseded PRs · openclaw/openclaw@e485f24 fix(openai-codex): normalize stale transport metadata in resolution a… · openclaw/openclaw@90801ba CI: pin Docker-related GitHub Actions (#67632) · openclaw/openclaw@f697b01 Android: modernize WebView and discovery API usage (#67627) · openclaw/openclaw@44a6e50 fix(deps): bump hono to 4.12.14 and @hono/node-server to 1.19.14 (GHS… · openclaw/openclaw@fbccc18 fix(deps): bump dompurify to 3.4.0 (#67614) · openclaw/openclaw@2c2dc00 CI: add explicit permissions to all workflow jobs (fixes code-scannin… · openclaw/openclaw@01b7516 fix: register bundled TTS providers and route overrides correctly (#6… · openclaw/openclaw@6ea3cdd fix: align host tilde paths with OS home (#62804) (thanks @stainlu) · openclaw/openclaw@ecfaf64 fix: flush creds queue before reconnect socket open (#67464) (thanks … · openclaw/openclaw@405c63f fix: strip standalone <function> tool call tags from visible text (#6… · openclaw/openclaw@78df859 fix(agents): preserve cli session metadata before transcript persist … · openclaw/openclaw@898fd04 docs(changelog): move cli transcript entry · openclaw/openclaw@c1817c6 fix(agents): normalize cli transcript api field · openclaw/openclaw@3a3fae0 docs(changelog): note cli transcript persistence · openclaw/openclaw@6c343f1 fix(agents): persist cli transcript turns · openclaw/openclaw@b8ef507 fix(msteams): harden security-sensitive flows (#65841) · openclaw/openclaw@c56b56e [Dashboard] Fix exec approval modal overflow for long command content… · openclaw/openclaw@053c5b0 Docs: remove QA changelog entry · openclaw/openclaw@7fd5771 QA: fix private runtime source loading (#67428) · openclaw/openclaw@d5933af docs(gateway): correct protocol.md schema path, hello-ok example, aut… · openclaw/openclaw@489404d CI: pin Node 22 runners to 22.18.0 · openclaw/openclaw@4ffa621 models.authStatus: normalize provider ids + tighten env-backed escape… · openclaw/openclaw@f2fdb9d Update CHANGELOG.md · openclaw/openclaw@7694a92 test(parallels): clean up npm update guard jobs · openclaw/openclaw@045ea7b Plugins: prefer scanDir override paths · openclaw/openclaw@b2974da fix(dreaming): default storage.mode to "separate" so phase blocks sto… · openclaw/openclaw@8c392f0 fix(memory-core): skip dreaming transcript ingestion via session stor… · openclaw/openclaw@a1b01f0 fix: dedupe replayed exec.finished node events (#67281) · openclaw/openclaw@5dcf526
fix #69443: [Bug] Subagent RPC callback to WeChat session key routed … · openclaw/openclaw@ba1be23
zhangguiping · 2026-06-15 · via Recent Commits to openclaw:main
Original file line numberDiff line numberDiff line change

@@ -30,6 +30,7 @@ Docs: https://docs.openclaw.ai

3030

- Memory, state, diagnostics, and config: split header-too-large embedding batches, keep QMD memory search enabled in transient mode, avoid SQLite WAL on NFS volumes, preserve recovery scheduling outside stuck-session warning backoff, and keep shell environment fallbacks contained in config write tests. (#92650, #92618, #92639, #91247, #92752) Thanks @mushuiyu886, @TurboTheTurtle, @849261680, and @gnanam1990.

3131

- UI/mobile/TUI: preserve dashboard session parent lineage, WebChat backscroll, reset soft command args, sidebar session picker interactivity, collapsed workspace files, resolved `/model` confirmation refs, and stale foreground iOS Gateway reconnects. (#90658, #92622, #91353, #92705, #92779, #92773, #92552) Thanks @luoyanglang, @TurboTheTurtle, @zhouhe-xydt, @NianJiuZst, @shakkernerd, @NarahariRaghava, and @Solvely-Colin.

3232

- Release and test reliability: extend slow Gateway/full-suite watchdogs, split local full-suite shards when throttled, stabilize plugin auth marker fixtures, avoid brittle provider-ref error text, and keep QA Lab bootstrap selection assertions aligned with flow-only scenarios. (#92652)

33+

- Agent routing: route subagent RPC callbacks addressed to an agent-shaped `--to` target to the correct session key instead of falling back to the main session, so WeChat (and other channel) session-key callbacks reach the intended subagent session. (#90231) Thanks @zhangguiping-xydt.

3334
3435

## 2026.6.6

3536
Original file line numberDiff line numberDiff line change

@@ -615,7 +615,13 @@ async function prepareAgentCommandExecution(opts: AgentCommandOpts, runtime: Run

615615

throw new Error("Message (--message) is required");

616616

}

617617

const rawExplicitSessionKey = opts.sessionKey?.trim();

618-

if (!opts.to && !opts.sessionId && !rawExplicitSessionKey && !opts.agentId) {

618+

const requestedSessionId = opts.sessionId?.trim() || undefined;

619+

const rawTo = opts.to?.trim();

620+

const toSessionKey =

621+

!rawExplicitSessionKey && !requestedSessionId && classifySessionKeyShape(rawTo) === "agent"

622+

? rawTo

623+

: undefined;

624+

if (!opts.to && !requestedSessionId && !rawExplicitSessionKey && !opts.agentId) {

619625

throw new Error(

620626

"Pass --to <E.164>, --session-key, --session-id, or --agent to choose a session",

621627

);

@@ -647,12 +653,14 @@ async function prepareAgentCommandExecution(opts: AgentCommandOpts, runtime: Run

647653

classifySessionKeyShape(rawExplicitSessionKey) === "legacy_or_alias" &&

648654

!isUnscopedSessionKeySentinel(rawExplicitSessionKey),

649655

);

650-

const explicitSessionKey = resolveExplicitAgentCommandSessionKey({

651-

rawExplicitSessionKey,

652-

agentIdOverride,

653-

shouldScopeDefaultAgentKey,

654-

cfg,

655-

});

656+

const explicitSessionKey =

657+

toSessionKey ??

658+

resolveExplicitAgentCommandSessionKey({

659+

rawExplicitSessionKey,

660+

agentIdOverride,

661+

shouldScopeDefaultAgentKey,

662+

cfg,

663+

});

656664

if (explicitSessionKey && classifySessionKeyShape(explicitSessionKey) === "malformed_agent") {

657665

throw new Error(

658666

`Invalid --session-key "${explicitSessionKey}". Agent-prefixed session keys must use agent:<agent-id>:<session-key>.`,

@@ -698,10 +706,13 @@ async function prepareAgentCommandExecution(opts: AgentCommandOpts, runtime: Run

698706

});

699707

const runTimeoutOverrideMs = hasExplicitTimeoutOption ? timeoutMs : undefined;

700708
709+

const commandOpts = toSessionKey

710+

? { ...opts, to: undefined, sessionKey: explicitSessionKey }

711+

: opts;

701712

const sessionResolution = resolveSession({

702713

cfg,

703-

to: opts.to,

704-

sessionId: opts.sessionId,

714+

to: commandOpts.to,

715+

sessionId: commandOpts.sessionId,

705716

sessionKey: explicitSessionKey,

706717

agentId: agentIdOverride,

707718

clone: false,

@@ -791,6 +802,7 @@ async function prepareAgentCommandExecution(opts: AgentCommandOpts, runtime: Run

791802

opts.transcriptMessage ?? resolveInternalEventTranscriptBody(message, opts.internalEvents);

792803
793804

return {

805+

opts: commandOpts,

794806

body,

795807

transcriptBody,

796808

cfg,

@@ -826,15 +838,17 @@ async function prepareAgentCommandExecution(opts: AgentCommandOpts, runtime: Run

826838

}

827839
828840

async function agentCommandInternal(

829-

opts: AgentCommandOpts,

841+

initialOpts: AgentCommandOpts,

830842

runtime: RuntimeEnv = defaultRuntime,

831843

deps?: CliDeps,

832844

) {

833845

const resolvedDeps = await resolveAgentCommandDeps(deps);

834-

const isRawModelRun = opts.modelRun === true || opts.promptMode === "none";

835-

const suppressVisibleSessionEffects = opts.sessionEffects === "internal";

836-

const preserveUserFacingSessionModelState = opts.preserveUserFacingSessionModelState === true;

837-

const prepared = await prepareAgentCommandExecution(opts, runtime);

846+

const isRawModelRun = initialOpts.modelRun === true || initialOpts.promptMode === "none";

847+

const suppressVisibleSessionEffects = initialOpts.sessionEffects === "internal";

848+

const preserveUserFacingSessionModelState =

849+

initialOpts.preserveUserFacingSessionModelState === true;

850+

const prepared = await prepareAgentCommandExecution(initialOpts, runtime);

851+

const opts = prepared.opts;

838852

const {

839853

body,

840854

transcriptBody,

Original file line numberDiff line numberDiff line change

@@ -29,6 +29,7 @@ import type { SessionEntry } from "../../config/sessions/types.js";

2929

import type { OpenClawConfig } from "../../config/types.openclaw.js";

3030

import {

3131

buildAgentMainSessionKey,

32+

classifySessionKeyShape,

3233

DEFAULT_AGENT_ID,

3334

isUnscopedSessionKeySentinel,

3435

normalizeAgentId,

@@ -252,8 +253,14 @@ export function resolveSessionKeyForRequest(opts: {

252253

const defaultAgentId = normalizeAgentId(resolveDefaultAgentId(opts.cfg));

253254

const requestedAgentId = opts.agentId?.trim() ? normalizeAgentId(opts.agentId) : undefined;

254255

const requestedSessionId = opts.sessionId?.trim() || undefined;

256+

const requestedSessionKey = opts.sessionKey?.trim() || undefined;

257+

const toSessionKey =

258+

!requestedSessionKey && !requestedSessionId && classifySessionKeyShape(opts.to) === "agent"

259+

? opts.to?.trim()

260+

: undefined;

255261

const explicitSessionKey =

256-

opts.sessionKey?.trim() ||

262+

requestedSessionKey ||

263+

toSessionKey ||

257264

(!requestedSessionId

258265

? resolveExplicitAgentSessionKey({

259266

cfg: opts.cfg,

Original file line numberDiff line numberDiff line change

@@ -349,6 +349,23 @@ describe("agentCliCommand", () => {

349349

});

350350

});

351351
352+

it("uses an agent-scoped --to value as the gateway session selector", async () => {

353+

await withTempStore(async () => {

354+

const sessionKey = "agent:main:openclaw-weixin:direct:o9cq802hhmfc@im.wechat";

355+

mockGatewaySuccessReply();

356+
357+

await agentCliCommand({ message: "hi", to: sessionKey }, runtime);

358+
359+

expect(callGateway).toHaveBeenCalledTimes(1);

360+

const request = requireRecord(requireFirstCallArg(callGateway, "gateway"), "gateway request");

361+

const params = requireRecord(request.params, "gateway request params");

362+

expect(params.sessionKey).toBe(sessionKey);

363+

expect(params.to).toBeUndefined();

364+

expect(agentCommand).not.toHaveBeenCalled();

365+

expect(loadAgentSessionModuleMock).not.toHaveBeenCalled();

366+

});

367+

});

368+
352369

it("retries gateway dispatch with shell env fallback only when credentials need it", async () => {

353370

await withTempStore(async ({ store }) => {

354371

const fastConfig = {

Original file line numberDiff line numberDiff line change

@@ -290,6 +290,14 @@ function validateExplicitSessionKeyForDispatch(

290290
291291

async function normalizeSessionKeyOptsForDispatch(opts: AgentCliOpts): Promise<AgentCliOpts> {

292292

const rawSessionKey = opts.sessionKey?.trim();

293+

const rawTo = opts.to?.trim();

294+

if (!rawSessionKey && !opts.sessionId?.trim() && classifySessionKeyShape(rawTo) === "agent") {

295+

return {

296+

...opts,

297+

to: undefined,

298+

sessionKey: rawTo,

299+

};

300+

}

293301

const isLegacySessionKey =

294302

rawSessionKey && classifySessionKeyShape(rawSessionKey) === "legacy_or_alias";

295303

const agentIdRaw = opts.agent?.trim();

Original file line numberDiff line numberDiff line change

@@ -7,6 +7,7 @@ import "./agent-command.test-mocks.js";

77

import { testing as acpManagerTesting } from "../acp/control-plane/manager.js";

88

import * as authProfileStoreModule from "../agents/auth-profiles/store.js";

99

import * as attemptExecutionRuntime from "../agents/command/attempt-execution.runtime.js";

10+

import { deliverAgentCommandResult } from "../agents/command/delivery.runtime.js";

1011

import { runEmbeddedAgent } from "../agents/embedded-agent.js";

1112

import { loadManifestModelCatalog, loadModelCatalog } from "../agents/model-catalog.js";

1213

import * as modelSelectionModule from "../agents/model-selection.js";

@@ -1281,6 +1282,49 @@ describe("agentCommand", () => {

12811282

});

12821283

});

12831284
1285+

it("rejects agent-scoped to session selectors that conflict with the requested agent", async () => {

1286+

await withTempHome(async (home) => {

1287+

const store = path.join(home, "sessions.json");

1288+

const sessionKey = "agent:main:openclaw-weixin:direct:o9cq802hhmfc@im.wechat";

1289+

writeSessionStoreSeed(store, {

1290+

[sessionKey]: { sessionId: "wechat-session", updatedAt: Date.now() },

1291+

});

1292+

mockConfig(home, store, undefined, undefined, [{ id: "main" }, { id: "work" }]);

1293+
1294+

await expect(

1295+

agentCommand({ message: "hi", agentId: "work", to: sessionKey }, runtime),

1296+

).rejects.toThrow('Agent id "work" does not match session key agent "main".');

1297+

expect(runEmbeddedAgent).not.toHaveBeenCalled();

1298+

});

1299+

});

1300+
1301+

it("does not forward agent-scoped to session selectors as delivery targets", async () => {

1302+

await withTempHome(async (home) => {

1303+

const store = path.join(home, "sessions.json");

1304+

const sessionKey = "agent:main:openclaw-weixin:direct:o9cq802hhmfc@im.wechat";

1305+

writeSessionStoreSeed(store, {

1306+

[sessionKey]: {

1307+

sessionId: "wechat-session",

1308+

updatedAt: Date.now(),

1309+

lastChannel: "telegram",

1310+

lastTo: "+1555",

1311+

},

1312+

});

1313+

mockConfig(home, store);

1314+
1315+

await agentCommand(

1316+

{ message: "hi", to: sessionKey, deliver: true, channel: "telegram" },

1317+

runtime,

1318+

);

1319+
1320+

const deliveryCall = vi.mocked(deliverAgentCommandResult).mock.calls.at(-1)?.[0] as

1321+

| { opts?: { to?: string }; sessionEntry?: { lastTo?: string } }

1322+

| undefined;

1323+

expect(deliveryCall?.opts?.to).toBeUndefined();

1324+

expect(deliveryCall?.sessionEntry?.lastTo).toBe("+1555");

1325+

});

1326+

});

1327+
12841328

it("scopes bare explicit session keys to the default agent for embedded runs", async () => {

12851329

await withTempHome(async (home) => {

12861330

const store = path.join(home, "sessions.json");

Original file line numberDiff line numberDiff line change

@@ -85,6 +85,21 @@ describe("resolveSessionKeyForRequest", () => {

8585

expect(result.sessionKey).toBe("agent:main:main");

8686

});

8787
88+

it("uses an agent-scoped --to value as the requested session key", () => {

89+

const sessionKey = "agent:main:openclaw-weixin:direct:o9cq802hhmfc@im.wechat";

90+

mocks.resolveStorePath.mockReturnValue(MAIN_STORE_PATH);

91+

mocks.loadSessionStore.mockReturnValue({

92+

[sessionKey]: { sessionId: "wechat-session", updatedAt: 0 },

93+

});

94+
95+

const result = resolveSessionKeyForRequest({

96+

cfg: baseCfg,

97+

to: sessionKey,

98+

});

99+
100+

expect(result.sessionKey).toBe(sessionKey);

101+

});

102+
88103

it("uses the configured default agent store for new --to sessions", () => {

89104

setupMainAndMybotStorePaths();

90105

mockStoresByPath({