






















@@ -10,7 +10,7 @@ import {
1010validateArtifactsListParams,
1111} from "../protocol/index.js";
1212import { resolveSessionKeyForRun } from "../server-session-key.js";
13-import { loadSessionEntry, readSessionMessages } from "../session-utils.js";
13+import { loadSessionEntry, visitSessionMessages } from "../session-utils.js";
1414import type { GatewayRequestHandlers, RespondFn } from "./types.js";
1515import { assertValidParams } from "./validation.js";
1616@@ -215,59 +215,70 @@ export function collectArtifactsFromMessages(params: {
215215const artifacts: ArtifactRecord[] = [];
216216let messageFallbackSeq = 0;
217217for (const message of params.messages) {
218-const msg = asRecord(message);
219-if (!msg) {
220-continue;
221-}
222218messageFallbackSeq += 1;
223-const messageSeq = resolveMessageSeq(msg, messageFallbackSeq);
224-const messageRunId = resolveMessageRunId(msg);
225-const messageTaskId = resolveMessageTaskId(msg);
226-if (params.runId && messageRunId !== params.runId) {
227-continue;
228-}
229-if (params.taskId && messageTaskId !== params.taskId) {
219+collectArtifactsFromMessage({ ...params, message, messageFallbackSeq, artifacts });
220+}
221+return artifacts;
222+}
223+224+function collectArtifactsFromMessage(params: {
225+message: unknown;
226+messageFallbackSeq: number;
227+artifacts: ArtifactRecord[];
228+sessionKey: string;
229+runId?: string;
230+taskId?: string;
231+}): void {
232+const msg = asRecord(params.message);
233+if (!msg) {
234+return;
235+}
236+const messageSeq = resolveMessageSeq(msg, params.messageFallbackSeq);
237+const messageRunId = resolveMessageRunId(msg);
238+const messageTaskId = resolveMessageTaskId(msg);
239+if (params.runId && messageRunId !== params.runId) {
240+return;
241+}
242+if (params.taskId && messageTaskId !== params.taskId) {
243+return;
244+}
245+const content = Array.isArray(msg.content) ? msg.content : [];
246+for (let contentIndex = 0; contentIndex < content.length; contentIndex += 1) {
247+const block = asRecord(content[contentIndex]);
248+if (!block || !isArtifactBlock(block)) {
230249continue;
231250}
232-const content = Array.isArray(msg.content) ? msg.content : [];
233-for (let contentIndex = 0; contentIndex < content.length; contentIndex += 1) {
234-const block = asRecord(content[contentIndex]);
235-if (!block || !isArtifactBlock(block)) {
236-continue;
237-}
238-const type = normalizeArtifactType(asNonEmptyString(block.type) ?? "file");
239-const title =
240-asNonEmptyString(block.title) ??
241-asNonEmptyString(block.fileName) ??
242-asNonEmptyString(block.filename) ??
243-asNonEmptyString(block.alt) ??
244-`${type} ${artifacts.length + 1}`;
245-const download = resolveBlockDownload(block);
246-const summary: ArtifactRecord = {
247-id: artifactId({
248-sessionKey: params.sessionKey,
249- messageSeq,
250- contentIndex,
251- title,
252- type,
253-}),
254- type,
255- title,
256- ...(download.mimeType ? { mimeType: download.mimeType } : {}),
257- ...(download.sizeBytes !== undefined ? { sizeBytes: download.sizeBytes } : {}),
251+const type = normalizeArtifactType(asNonEmptyString(block.type) ?? "file");
252+const title =
253+asNonEmptyString(block.title) ??
254+asNonEmptyString(block.fileName) ??
255+asNonEmptyString(block.filename) ??
256+asNonEmptyString(block.alt) ??
257+`${type} ${params.artifacts.length + 1}`;
258+const download = resolveBlockDownload(block);
259+const summary: ArtifactRecord = {
260+id: artifactId({
258261sessionKey: params.sessionKey,
259- ...(messageRunId ? { runId: messageRunId } : {}),
260- ...(messageTaskId ? { taskId: messageTaskId } : {}),
261262 messageSeq,
262-source: "session-transcript",
263-download: { mode: download.mode },
264- ...(download.data ? { data: download.data } : {}),
265- ...(download.url ? { url: download.url } : {}),
266-};
267-artifacts.push(summary);
268-}
263+ contentIndex,
264+ title,
265+ type,
266+}),
267+ type,
268+ title,
269+ ...(download.mimeType ? { mimeType: download.mimeType } : {}),
270+ ...(download.sizeBytes !== undefined ? { sizeBytes: download.sizeBytes } : {}),
271+sessionKey: params.sessionKey,
272+ ...(messageRunId ? { runId: messageRunId } : {}),
273+ ...(messageTaskId ? { taskId: messageTaskId } : {}),
274+ messageSeq,
275+source: "session-transcript",
276+download: { mode: download.mode },
277+ ...(download.data ? { data: download.data } : {}),
278+ ...(download.url ? { url: download.url } : {}),
279+};
280+params.artifacts.push(summary);
269281}
270-return artifacts;
271282}
272283273284function resolveQuerySessionKey(query: ArtifactQuery): string | undefined {
@@ -296,16 +307,23 @@ function loadArtifacts(query: ArtifactQuery): { artifacts: ArtifactRecord[]; ses
296307}
297308const { storePath, entry } = loadSessionEntry(sessionKey);
298309const sessionId = entry?.sessionId;
299-const messages =
300-sessionId && storePath ? readSessionMessages(sessionId, storePath, entry?.sessionFile) : [];
301-return {
302- sessionKey,
303-artifacts: collectArtifactsFromMessages({
304- messages,
310+if (!sessionId || !storePath) {
311+return { sessionKey, artifacts: [] };
312+}
313+const artifacts: ArtifactRecord[] = [];
314+visitSessionMessages(sessionId, storePath, entry?.sessionFile, (message, seq) => {
315+collectArtifactsFromMessage({
316+ message,
317+messageFallbackSeq: seq,
318+ artifacts,
305319 sessionKey,
306320runId: query.runId,
307321taskId: query.taskId,
308-}),
322+});
323+});
324+return {
325+ sessionKey,
326+ artifacts,
309327};
310328}
311329此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。