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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
Y
Y Combinator Blog
F
Fortinet All Blogs
云风的 BLOG
云风的 BLOG
T
Tailwind CSS Blog
G
Google Developers Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MyScale Blog
MyScale Blog
N
Netflix TechBlog - Medium
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
P
Proofpoint News Feed
Jina AI
Jina AI
B
Blog RSS Feed
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志
D
Docker

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
fix(media): keep pinned routes account-bound · openclaw/o...
steipete · 2026-06-23 · via Recent Commits to openclaw:main
Original file line numberDiff line numberDiff line change

@@ -451,6 +451,39 @@ describe("createMediaGenerationTaskLifecycle", () => {

451451

);

452452

});

453453
454+

it("does not pin a session target from another account", () => {

455+

subagentAnnounceDeliveryMocks.loadRequesterSessionEntry.mockReturnValue({

456+

entry: {

457+

lastChannel: "telegram",

458+

lastTo: "peer-b",

459+

lastAccountId: "bot-b",

460+

},

461+

});

462+

const lifecycle = createMediaGenerationTaskLifecycle({

463+

toolName: "image_generate",

464+

taskKind: "image_generation",

465+

label: "Image generation",

466+

queuedProgressSummary: "Queued image generation",

467+

generatedLabel: "image",

468+

failureProgressSummary: "Image generation failed",

469+

eventSource: "image_generation",

470+

announceType: "image generation task",

471+

completionLabel: "image",

472+

});

473+
474+

const handle = lifecycle.createTaskRun({

475+

sessionKey: "agent:main:telegram:shared",

476+

requesterOrigin: { channel: "telegram", accountId: "bot-a" },

477+

prompt: "proof image",

478+

});

479+
480+

expect(handle?.requesterOrigin).toEqual({

481+

channel: "telegram",

482+

to: undefined,

483+

accountId: "bot-a",

484+

});

485+

});

486+
454487

it("returns the completion wake delivery result", async () => {

455488

subagentAnnounceDeliveryMocks.deliverSubagentAnnouncement.mockResolvedValueOnce({

456489

delivered: true,

Original file line numberDiff line numberDiff line change

@@ -63,6 +63,20 @@ export type MediaGenerateBackgroundScheduler = (work: () => Promise<void>) => vo

6363

/** Optional callback invoked when async media generation starts. */

6464

export type MediaGenerateAsyncStartCallback = (message: string) => Promise<void> | void;

6565
66+

function resolvePinnedMediaRequesterOrigin(params: {

67+

requesterOrigin?: DeliveryContext;

68+

sessionOrigin?: DeliveryContext;

69+

}): DeliveryContext | undefined {

70+

const requesterOrigin = normalizeDeliveryContext(params.requesterOrigin);

71+

const sessionOrigin = normalizeDeliveryContext(params.sessionOrigin);

72+

const accountsConflict =

73+

requesterOrigin?.channel === sessionOrigin?.channel &&

74+

requesterOrigin?.accountId &&

75+

sessionOrigin?.accountId &&

76+

requesterOrigin.accountId !== sessionOrigin.accountId;

77+

return accountsConflict ? requesterOrigin : mergeDeliveryContext(requesterOrigin, sessionOrigin);

78+

}

79+
6680

/** Returns whether a media generation request should detach for a session. */

6781

export function shouldDetachMediaGenerationTask(sessionKey: string | undefined): boolean {

6882

const normalizedSessionKey = sessionKey?.trim();

@@ -151,10 +165,10 @@ function createMediaGenerationTaskRun(params: {

151165

try {

152166

// Pin the complete requester route when detached work starts. Completion-time

153167

// session state can move to another peer while generation is still running.

154-

const requesterOrigin = mergeDeliveryContext(

155-

normalizeDeliveryContext(params.requesterOrigin),

156-

deliveryContextFromSession(loadRequesterSessionEntry(sessionKey).entry),

157-

);

168+

const requesterOrigin = resolvePinnedMediaRequesterOrigin({

169+

requesterOrigin: params.requesterOrigin,

170+

sessionOrigin: deliveryContextFromSession(loadRequesterSessionEntry(sessionKey).entry),

171+

});

158172

const task = createRunningTaskRun({

159173

runtime: "cli",

160174

taskKind: params.taskKind,