Skip to content

Commit 8dd29c8

Browse files
committed
Fix PR 112 review follow-ups
Resolve the active Cursor profile pagination bug by preserving structured JSON for explicit empty pages, restore the cleaner computer_action structure from main with clipboard support, derive browser config payload types from the SDK, and remove stale dead types.
1 parent dd77f9f commit 8dd29c8

6 files changed

Lines changed: 300 additions & 306 deletions

File tree

src/lib/mcp/browser-config.ts

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
import type { KernelClient } from "@/lib/mcp/kernel-client";
2+
3+
type BrowserCreateParams = NonNullable<
4+
Parameters<KernelClient["browsers"]["create"]>[0]
5+
>;
6+
type BrowserUpdateParams = Parameters<KernelClient["browsers"]["update"]>[1];
7+
type BrowserPoolCreateParams = Parameters<
8+
KernelClient["browserPools"]["create"]
9+
>[0];
10+
type BrowserPoolUpdateParams = Parameters<
11+
KernelClient["browserPools"]["update"]
12+
>[1];
13+
114
export type BrowserProfileParams = {
215
profile_name?: string;
316
profile_id?: string;
@@ -28,36 +41,36 @@ export type BrowserCreateConfigParams = BrowserProfileParams &
2841
export type BrowserUpdateConfigParams = BrowserProfileParams &
2942
BrowserViewportUpdateParams;
3043

31-
type BrowserProfileConfig = {
32-
id?: string;
33-
name?: string;
34-
save_changes?: boolean;
35-
};
36-
37-
type BrowserExtensionConfig = Array<{
38-
id?: string;
39-
name?: string;
40-
}>;
41-
42-
type BrowserViewportConfig = {
43-
width: number;
44-
height: number;
45-
refresh_rate?: number;
46-
};
47-
48-
type BrowserViewportUpdateConfig = BrowserViewportConfig & { force?: boolean };
49-
50-
export type BrowserCreateConfig = {
51-
profile?: BrowserProfileConfig;
52-
extensions?: BrowserExtensionConfig;
53-
viewport?: BrowserViewportConfig;
54-
start_url?: string;
55-
};
56-
57-
export type BrowserUpdateConfig = {
58-
profile?: BrowserProfileConfig;
59-
viewport?: BrowserViewportUpdateConfig;
60-
};
44+
type BrowserProfileConfig = NonNullable<
45+
| BrowserCreateParams["profile"]
46+
| BrowserUpdateParams["profile"]
47+
| BrowserPoolCreateParams["profile"]
48+
| BrowserPoolUpdateParams["profile"]
49+
>;
50+
51+
type BrowserExtensionConfig = NonNullable<
52+
| BrowserCreateParams["extensions"]
53+
| BrowserPoolCreateParams["extensions"]
54+
| BrowserPoolUpdateParams["extensions"]
55+
>;
56+
57+
type BrowserViewportConfig = NonNullable<
58+
| BrowserCreateParams["viewport"]
59+
| BrowserPoolCreateParams["viewport"]
60+
| BrowserPoolUpdateParams["viewport"]
61+
>;
62+
63+
type BrowserViewportUpdateConfig = NonNullable<BrowserUpdateParams["viewport"]>;
64+
65+
export type BrowserCreateConfig = Pick<
66+
BrowserCreateParams,
67+
"profile" | "extensions" | "viewport" | "start_url"
68+
>;
69+
70+
export type BrowserUpdateConfig = Pick<
71+
BrowserUpdateParams,
72+
"profile" | "viewport"
73+
>;
6174

6275
export type BrowserConfigResult<T> =
6376
| { ok: true; value: T }

src/lib/mcp/responses.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ type PaginatedJsonResponseOptions<T, U = T> = {
1010
emptyText?: string;
1111
};
1212

13+
type ItemsJsonResponseOptions<T, U = T> = PaginatedJsonResponseOptions<T, U> & {
14+
has_more?: boolean | null;
15+
next_offset?: number | null;
16+
};
17+
1318
export function textResponse(text: string) {
1419
return { content: [{ type: "text" as const, text }] };
1520
}
@@ -18,20 +23,30 @@ export function jsonResponse(value: unknown) {
1823
return textResponse(JSON.stringify(value, null, 2) ?? String(value));
1924
}
2025

21-
export function paginatedJsonResponse<T, U = T>(
22-
page: PaginatedPage<T>,
23-
options: PaginatedJsonResponseOptions<T, U> = {},
26+
export function itemsJsonResponse<T, U = T>(
27+
items: T[],
28+
options: ItemsJsonResponseOptions<T, U> = {},
2429
) {
25-
const items = page.getPaginatedItems();
2630
if (items.length === 0 && options.emptyText) {
2731
return textResponse(options.emptyText);
2832
}
2933

3034
return jsonResponse({
3135
items: options.mapItem ? items.map(options.mapItem) : items,
36+
has_more: options.has_more,
37+
next_offset: options.next_offset,
38+
...(options.note && { note: options.note }),
39+
});
40+
}
41+
42+
export function paginatedJsonResponse<T, U = T>(
43+
page: PaginatedPage<T>,
44+
options: PaginatedJsonResponseOptions<T, U> = {},
45+
) {
46+
return itemsJsonResponse(page.getPaginatedItems(), {
47+
...options,
3248
has_more: page.has_more,
3349
next_offset: page.next_offset,
34-
...(options.note && { note: options.note }),
3550
});
3651
}
3752

src/lib/mcp/tools/browser-pools.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,6 @@ type BrowserPoolAcquireResponse = Awaited<
2727
ReturnType<KernelClient["browserPools"]["acquire"]>
2828
>;
2929

30-
type BrowserPoolAction =
31-
| "create"
32-
| "update"
33-
| "list"
34-
| "get"
35-
| "delete"
36-
| "flush"
37-
| "acquire"
38-
| "release";
39-
4030
type PoolConfigParams = BrowserCreateConfigParams & {
4131
size?: number;
4232
name?: string;

src/lib/mcp/tools/browsers.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ type TelemetryParams = {
2929
telemetry_interaction?: boolean;
3030
};
3131

32-
type BrowserAction = "create" | "update" | "list" | "get" | "delete";
33-
3432
const telemetryCategories = [
3533
["telemetry_console", "console"],
3634
["telemetry_network", "network"],
@@ -342,8 +340,12 @@ export function registerBrowserCapabilities(server: McpServer) {
342340
createParams.timeout_seconds = params.timeout_seconds;
343341
if (params.kiosk_mode !== undefined)
344342
createParams.kiosk_mode = params.kiosk_mode;
345-
if (params.chrome_policy)
343+
if (
344+
params.chrome_policy &&
345+
Object.keys(params.chrome_policy).length > 0
346+
) {
346347
createParams.chrome_policy = params.chrome_policy;
348+
}
347349
if (params.proxy_id) createParams.proxy_id = params.proxy_id;
348350
const browserConfig = buildBrowserCreateConfig(params);
349351
if (!browserConfig.ok) return errorResponse(browserConfig.error);

0 commit comments

Comments
 (0)