fix: preserve paired input evidence context (#204)
This commit is contained in:
@@ -92,6 +92,36 @@ export function extractImageTagPaths(text: string): {
|
||||
};
|
||||
}
|
||||
|
||||
export function expandImagePromptReferences(text: string): string {
|
||||
const codeSpans = fencedCodeSpans(text);
|
||||
const withMediaImages = text.replace(
|
||||
MEDIA_TAG_RE,
|
||||
(full: string, doubleQuoted, singleQuoted, backticked, bare, offset) => {
|
||||
if (isInsideSpans(offset, codeSpans)) return full;
|
||||
const filePath = String(
|
||||
doubleQuoted ?? singleQuoted ?? backticked ?? bare ?? '',
|
||||
).trim();
|
||||
if (!filePath.startsWith('/') || !IMAGE_EXT_RE.test(filePath)) {
|
||||
return full;
|
||||
}
|
||||
const name = attachmentName(filePath) ?? filePath;
|
||||
return `[Image: ${name} → ${filePath}]`;
|
||||
},
|
||||
);
|
||||
|
||||
const markdownCodeSpans = fencedCodeSpans(withMediaImages);
|
||||
return withMediaImages.replace(
|
||||
MARKDOWN_IMAGE_ABSOLUTE_LINK_RE,
|
||||
(full: string, rawPath: string, offset: number) => {
|
||||
if (isInsideSpans(offset, markdownCodeSpans)) return full;
|
||||
const filePath = rawPath.trim();
|
||||
if (!IMAGE_EXT_RE.test(filePath)) return full;
|
||||
const name = attachmentName(filePath) ?? filePath;
|
||||
return `[Image: ${name} → ${filePath}]`;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export type ImageTagPromptPart =
|
||||
| { type: 'text'; text: string }
|
||||
| { type: 'image'; label: string | null; path: string; raw: string };
|
||||
|
||||
@@ -38,6 +38,7 @@ export {
|
||||
type TaskContextMode,
|
||||
} from './task-runtime.js';
|
||||
export {
|
||||
expandImagePromptReferences,
|
||||
extractMarkdownImageAttachments,
|
||||
extractMediaAttachments,
|
||||
extractImageTagPaths,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import {
|
||||
expandImagePromptReferences,
|
||||
extractImageTagPaths,
|
||||
imageTagCaption,
|
||||
missingImageTagCaption,
|
||||
@@ -59,6 +60,23 @@ describe('shared agent protocol helpers', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('expands MEDIA image directives into image prompt tags', () => {
|
||||
expect(expandImagePromptReferences('증거\nMEDIA:/tmp/render.png\n끝')).toBe(
|
||||
'증거\n[Image: render.png → /tmp/render.png]\n끝',
|
||||
);
|
||||
});
|
||||
|
||||
it('expands markdown image links into image prompt tags', () => {
|
||||
expect(
|
||||
expandImagePromptReferences('증거  끝'),
|
||||
).toBe('증거 [Image: render.png → /tmp/render.png] 끝');
|
||||
});
|
||||
|
||||
it('keeps non-image media and fenced media text unchanged', () => {
|
||||
const text = 'MEDIA:/tmp/demo.mp4\n```text\nMEDIA:/tmp/render.png\n```';
|
||||
expect(expandImagePromptReferences(text)).toBe(text);
|
||||
});
|
||||
|
||||
it('normalizes plain text runner output as public text', () => {
|
||||
expect(normalizePublicTextOutput('DONE')).toEqual({
|
||||
result: 'DONE',
|
||||
|
||||
Reference in New Issue
Block a user