mirror of
https://github.com/Tencent/BrowserSkill.git
synced 2026-09-10 13:01:23 +08:00
fix(dsh-plugin-browserskill): serve observation thumbnails over the plugin's own route
The session-authorized client RPC (readAttachment) refuses images that no session log references — observation frames are plugin-owned runtime data, so every overlay thumbnail failed with ATTACHMENT_NOT_REFERENCED. The host now keeps the full attachment ref per frame and serves bytes through GET /bsk-observation/thumbnail/<id> (verified readImage path); the client loader is a plain fetch of that route.
This commit is contained in:
@@ -124,7 +124,20 @@ function setup(opts: {
|
||||
const attachments =
|
||||
"attachments" in opts
|
||||
? opts.attachments
|
||||
: { saveImage: async () => ({ attachmentId: "att-1" }) };
|
||||
: {
|
||||
saveImage: async (input: { data: Uint8Array; name?: string }) => ({
|
||||
attachmentId: "att-1",
|
||||
mediaType: "image/png",
|
||||
bytes: input.data.byteLength,
|
||||
width: 4,
|
||||
height: 4,
|
||||
name: input.name,
|
||||
}),
|
||||
readImage: async (ref: { attachmentId: unknown }) => ({
|
||||
data: new Uint8Array([1, 2, 3]),
|
||||
attachment: ref,
|
||||
}),
|
||||
};
|
||||
const service = new ObservationService({
|
||||
ctx: fakeCtx(attachments),
|
||||
runner,
|
||||
@@ -462,6 +475,22 @@ describe("availability and dead sessions", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("thumbnail read-back", () => {
|
||||
it("serves captured frames through readThumbnail and 404s unknown ids", async () => {
|
||||
const scheduler = fakeScheduler();
|
||||
const runner = fakeRunner();
|
||||
const { service } = setup({ runner, scheduler });
|
||||
service.addSession("s1");
|
||||
scheduler.runNext();
|
||||
await waitFor(() => service.getState()[0]?.thumbnailAttachmentId !== undefined);
|
||||
const frame = await service.readThumbnail("att-1");
|
||||
expect(frame?.mediaType).toBe("image/png");
|
||||
expect([...(frame?.data ?? [])]).toEqual([1, 2, 3]);
|
||||
expect(await service.readThumbnail("nope")).toBeUndefined();
|
||||
service.dispose();
|
||||
});
|
||||
});
|
||||
|
||||
describe("actionForLabel", () => {
|
||||
it("maps tool labels onto observation verbs", () => {
|
||||
expect(actionForLabel("navigate")).toBe("navigating");
|
||||
|
||||
Reference in New Issue
Block a user