慣性聚合 高效追讀感興趣之博客、新聞、科技資訊
閱原文 以慣性聚合開啟

推薦訂閱源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
量子位
M
Microsoft Research Blog - Microsoft Research
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
罗磊的独立博客
V
Visual Studio Blog
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog

Recent Commits to openclaw:main

fix: render late source reply finals in TUI · openclaw/openclaw@59b8aea test: cover control ui source reply final retention · openclaw/openclaw@5534cad fix: keep TUI watchdog runs active · openclaw/openclaw@84d278a fix: back source reply media in transcripts · openclaw/openclaw@39226ea test: cover source reply media transcript backing · openclaw/openclaw@321d98b fix: keep source reply finals live in control ui · openclaw/openclaw@5e28574 fix: bound Codex post-reasoning source reply waits · openclaw/openclaw@f5b415f fix: avoid double terminal chat events for source replies · openclaw/openclaw@6a0e030 fix: keep long Codex source replies alive · openclaw/openclaw@c93dda9 fix: broadcast source reply finals for chat runs · openclaw/openclaw@84ac31b fix: preserve reply payload metadata · openclaw/openclaw@bfcd801 fix: preserve source reply metadata through TTS test: narrow transcript rewrite message content access · openclaw/openclaw@81dee15 docs: add TUI source reply changelog · openclaw/openclaw@589fd92 fix: guard transcript source reply rewrites · openclaw/openclaw@b074dc5 fix: ignore replayed empty TUI finals · openclaw/openclaw@17fc1d1 fix: avoid duplicate media source reply transcripts · openclaw/openclaw@a10e152 fix: gracefully escalate process supervisor cancellations (#85865) fix: preserve internal handoff status attribution [AI-assisted] (#85726) · openclaw/openclaw@f55e986 fix(browser): thread snapshot timeoutMs through agent tool and helper… · openclaw/openclaw@069c7b8 Disable Chrome MCP telemetry watchdog by default (#85886) · openclaw/openclaw@d581415 perf: cache stable gateway metadata · openclaw/openclaw@12f8227 chore(release): update appcast for 2026.5.22 · openclaw/openclaw@fc3c979 fix(codex): ensure codex subagent bootstrap parity with pi subagents … · openclaw/openclaw@7b3be04 fix(update): escape systemd update handoffs (#85414) · openclaw/openclaw@1f28c3e fix(media-understanding): restore image description token default · openclaw/openclaw@5dcbd38 chore: bump version to 2026.5.24 · openclaw/openclaw@0cba872 docs: note WebChat done ordering fix · openclaw/openclaw@6c21066 fix(ui): delay WebChat done indicator until reply renders feat(gateway): steer realtime relay agent runs feat(talk): add realtime active-run control · openclaw/openclaw@bbf9c45 feat(ui): control active realtime talk runs feat(discord): control active realtime voice runs docs(talk): document realtime active-run control · openclaw/openclaw@40d36b5 fix(tui): handle German AltGr input (#83947) · openclaw/openclaw@ee09481 docs: clarify commit fallback provenance · openclaw/openclaw@6e03d1c fix(pdf): move MiniMax PDF fallback policy to metadata · openclaw/openclaw@d92501d fix(pdf): use MiniMax text model fallback · openclaw/openclaw@89bb62e fix(pdf): preserve image fallback precedence fix(ui): preserve source config for Control UI saves (#85879) · openclaw/openclaw@1a60c19 fix(doctor): repair stale contextWindow for DeepSeek V4 Flash (#85840) · openclaw/openclaw@aa050a6 Feat/fix dashboard timeout error display (#85815) · openclaw/openclaw@a668982 fix(memory): write fallback dream diary on narrative timeout (#85821) · openclaw/openclaw@27a3290 fix(twitch): fail fast when auth provider cannot bind user (#85794) · openclaw/openclaw@72744fd docs: clarify PR provenance roles · openclaw/openclaw@9a73ddc fix(scripts): harden Windows QA runners · openclaw/openclaw@32f9150 docs(skills): prefer latest Parallels snapshots fix(telegram): normalize durable group retry targets (#85656) · openclaw/openclaw@f05f243 fix #84857: skip CLI runtime harness preflight during compaction (#85… · openclaw/openclaw@fa39bef docs(policy): add policy rule reference tables (#85795) · openclaw/openclaw@4ffbd07
修:存留回复元数据于媒体归一化 · openclaw/openclaw@a238f03
shakkernerd · 2026-05-24 · via Recent Commits to openclaw:main

@@ -2,6 +2,7 @@ import fs from "node:fs/promises";

22

import os from "node:os";

33

import path from "node:path";

44

import { beforeEach, describe, expect, it, vi } from "vitest";

5+

import { getReplyPayloadMetadata, setReplyPayloadMetadata } from "../reply-payload.js";

5667

const ensureSandboxWorkspaceForSession = vi.hoisted(() => vi.fn());

78

const resolveOutboundAttachmentFromUrl = vi.hoisted(() => vi.fn());

@@ -108,6 +109,39 @@ describe("createReplyMediaPathNormalizer", () => {

108109

expect(mediaAccess.workspaceDir).toBe("/tmp/agent-workspace");

109110

});

110111112+

it("preserves reply metadata when media normalization clones the payload", async () => {

113+

const normalize = createReplyMediaPathNormalizer({

114+

cfg: {},

115+

sessionKey: "session-key",

116+

workspaceDir: "/tmp/agent-workspace",

117+

});

118+

const payload = setReplyPayloadMetadata(

119+

{

120+

text: "Here is the image",

121+

mediaUrls: ["./out/photo.png"],

122+

},

123+

{

124+

sourceReplyTranscriptMirror: {

125+

sessionKey: "main",

126+

text: "Here is the image",

127+

mediaUrls: ["./out/photo.png"],

128+

idempotencyKey: "source-reply:0",

129+

},

130+

},

131+

);

132+133+

const result = await normalize(payload);

134+135+

expect(result).not.toBe(payload);

136+

expectMedia(result, "/tmp/outbound-media/photo.png", ["/tmp/outbound-media/photo.png"]);

137+

expect(getReplyPayloadMetadata(result)?.sourceReplyTranscriptMirror).toEqual({

138+

sessionKey: "main",

139+

text: "Here is the image",

140+

mediaUrls: ["./out/photo.png"],

141+

idempotencyKey: "source-reply:0",

142+

});

143+

});

144+111145

it("maps sandbox-relative media back to the host sandbox workspace before staging", async () => {

112146

ensureSandboxWorkspaceForSession.mockResolvedValue({

113147

workspaceDir: "/tmp/sandboxes/session-1",