feat: add guarded image generation controls

This commit is contained in:
john
2026-07-20 07:37:43 +08:00
parent 72ed4dde83
commit 105a72c1f1
19 changed files with 482 additions and 23 deletions
+42
View File
@@ -33,3 +33,45 @@ test('consumeSessionEventsUntilFinish resolves on Finish', async () => {
assert.equal(result.finishEvent.type, 'Finish');
assert.equal(result.tokenState.totalTokens, 12);
});
test('consumeSessionEventsUntilFinish records a successful raster generate_image result', async () => {
const toolResult = JSON.stringify({
ok: true,
jobId: 'job-1',
source: { mimeType: 'image/webp' },
asset: {
id: 'asset-1',
publicUrl: '/MindSpace/user/public/images/hero.webp',
workspaceRelativePath: 'public/images/hero.webp',
},
});
const frames = [
`data: ${JSON.stringify({
type: 'Message', request_id: 'req-1', message: {
content: [{
type: 'toolRequest', id: 'call-1',
toolCall: { value: { name: 'sandbox-fs__generate_image', arguments: { purpose: 'hero' } } },
}],
},
})}\n\n`,
`data: ${JSON.stringify({
type: 'Message', request_id: 'req-1', message: {
content: [{
type: 'toolResponse', id: 'call-1',
toolResult: { status: 'success', value: { content: [{ type: 'text', text: toolResult }], isError: false } },
}],
},
})}\n\n`,
'data: {"type":"Finish","request_id":"req-1"}\n\n',
];
const stream = new ReadableStream({
start(controller) {
for (const frame of frames) controller.enqueue(new TextEncoder().encode(frame));
controller.close();
},
});
const result = await consumeSessionEventsUntilFinish(stream, { requestId: 'req-1', timeoutMs: 5000 });
assert.equal(result.toolEvidence.generateImage.called, true);
assert.equal(result.toolEvidence.generateImage.succeeded, true);
assert.equal(result.toolEvidence.generateImage.jobId, 'job-1');
});