Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 25 additions & 11 deletions src/vs/workbench/contrib/chat/common/chatImageExtraction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,17 +189,31 @@ async function extractImageFromInlineReference(
}

export function coerceImageBuffer(value: unknown): Uint8Array | undefined {
return value instanceof Uint8Array
? value
: value instanceof ArrayBuffer
? new Uint8Array(value)
: (value && typeof value === 'object' && !Array.isArray(value))
? new Uint8Array(
Object.keys(value as Record<string, number>)
.sort((a, b) => Number(a) - Number(b))
.map(key => (value as Record<string, number>)[key])
)
: undefined;
if (value instanceof Uint8Array) {
return value;
}
if (value instanceof ArrayBuffer) {
return new Uint8Array(value);
}
if (!value || typeof value !== 'object' || Array.isArray(value)) {
return undefined;
}

const record = value as Record<string, unknown>;
const keys = Object.keys(record).sort((a, b) => Number(a) - Number(b));
if (keys.length === 0) {
return undefined;
}

const result = new Uint8Array(keys.length);
for (let index = 0; index < keys.length; index++) {
const byte = record[keys[index]];
if (keys[index] !== String(index) || typeof byte !== 'number' || !Number.isInteger(byte) || byte < 0 || byte > 255) {
return undefined;
}
result[index] = byte;
}
return result;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,15 @@ suite('extractImagesFromChatRequest', () => {
assert.deepStrictEqual([...result[0].data.buffer], [7, 8, 9]);
});

test('does not treat a URI-backed image attachment as inline image bytes', () => {
const uri = URI.file('/tmp/cat.png');
const request = makeRequest([
makeImageVariableEntry({ value: uri, references: [{ kind: 'reference', reference: uri }] }),
]);

assert.deepStrictEqual(extractImagesFromChatRequest(request), []);
});

test('uses attachment resource URI when available', () => {
const uri = URI.file('/tmp/cat.png');
const request = makeRequest([
Expand Down
Loading