@ank1015/llm-extension 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +214 -0
  2. package/dist/chrome/background.js +244 -0
  3. package/dist/chrome/manifest.json +23 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +8 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/native/host-wrapper.sh +11 -0
  9. package/dist/native/host.d.ts +2 -0
  10. package/dist/native/host.d.ts.map +1 -0
  11. package/dist/native/host.js +21 -0
  12. package/dist/native/host.js.map +1 -0
  13. package/dist/native/server.d.ts +28 -0
  14. package/dist/native/server.d.ts.map +1 -0
  15. package/dist/native/server.js +112 -0
  16. package/dist/native/server.js.map +1 -0
  17. package/dist/native/stdio.d.ts +21 -0
  18. package/dist/native/stdio.d.ts.map +1 -0
  19. package/dist/native/stdio.js +94 -0
  20. package/dist/native/stdio.js.map +1 -0
  21. package/dist/protocol/constants.d.ts +26 -0
  22. package/dist/protocol/constants.d.ts.map +1 -0
  23. package/dist/protocol/constants.js +26 -0
  24. package/dist/protocol/constants.js.map +1 -0
  25. package/dist/protocol/types.d.ts +39 -0
  26. package/dist/protocol/types.d.ts.map +1 -0
  27. package/dist/protocol/types.js +3 -0
  28. package/dist/protocol/types.js.map +1 -0
  29. package/dist/sdk/action/diff.d.ts +7 -0
  30. package/dist/sdk/action/diff.d.ts.map +1 -0
  31. package/dist/sdk/action/diff.js +54 -0
  32. package/dist/sdk/action/diff.js.map +1 -0
  33. package/dist/sdk/action/helpers.d.ts +23 -0
  34. package/dist/sdk/action/helpers.d.ts.map +1 -0
  35. package/dist/sdk/action/helpers.js +93 -0
  36. package/dist/sdk/action/helpers.js.map +1 -0
  37. package/dist/sdk/action/index.d.ts +6 -0
  38. package/dist/sdk/action/index.d.ts.map +1 -0
  39. package/dist/sdk/action/index.js +4 -0
  40. package/dist/sdk/action/index.js.map +1 -0
  41. package/dist/sdk/action/script.d.ts +4 -0
  42. package/dist/sdk/action/script.d.ts.map +1 -0
  43. package/dist/sdk/action/script.js +359 -0
  44. package/dist/sdk/action/script.js.map +1 -0
  45. package/dist/sdk/action/types.d.ts +47 -0
  46. package/dist/sdk/action/types.d.ts.map +1 -0
  47. package/dist/sdk/action/types.js +2 -0
  48. package/dist/sdk/action/types.js.map +1 -0
  49. package/dist/sdk/client.d.ts +42 -0
  50. package/dist/sdk/client.d.ts.map +1 -0
  51. package/dist/sdk/client.js +118 -0
  52. package/dist/sdk/client.js.map +1 -0
  53. package/dist/sdk/connect.d.ts +29 -0
  54. package/dist/sdk/connect.d.ts.map +1 -0
  55. package/dist/sdk/connect.js +99 -0
  56. package/dist/sdk/connect.js.map +1 -0
  57. package/dist/sdk/index.d.ts +17 -0
  58. package/dist/sdk/index.d.ts.map +1 -0
  59. package/dist/sdk/index.js +19 -0
  60. package/dist/sdk/index.js.map +1 -0
  61. package/dist/sdk/observe/helpers.d.ts +16 -0
  62. package/dist/sdk/observe/helpers.d.ts.map +1 -0
  63. package/dist/sdk/observe/helpers.js +278 -0
  64. package/dist/sdk/observe/helpers.js.map +1 -0
  65. package/dist/sdk/observe/index.d.ts +6 -0
  66. package/dist/sdk/observe/index.d.ts.map +1 -0
  67. package/dist/sdk/observe/index.js +4 -0
  68. package/dist/sdk/observe/index.js.map +1 -0
  69. package/dist/sdk/observe/script.d.ts +7 -0
  70. package/dist/sdk/observe/script.d.ts.map +1 -0
  71. package/dist/sdk/observe/script.js +680 -0
  72. package/dist/sdk/observe/script.js.map +1 -0
  73. package/dist/sdk/observe/storage.d.ts +39 -0
  74. package/dist/sdk/observe/storage.d.ts.map +1 -0
  75. package/dist/sdk/observe/storage.js +83 -0
  76. package/dist/sdk/observe/storage.js.map +1 -0
  77. package/dist/sdk/observe/types.d.ts +140 -0
  78. package/dist/sdk/observe/types.d.ts.map +1 -0
  79. package/dist/sdk/observe/types.js +2 -0
  80. package/dist/sdk/observe/types.js.map +1 -0
  81. package/dist/sdk/window.d.ts +97 -0
  82. package/dist/sdk/window.d.ts.map +1 -0
  83. package/dist/sdk/window.js +795 -0
  84. package/dist/sdk/window.js.map +1 -0
  85. package/package.json +55 -0
@@ -0,0 +1,112 @@
1
+ import { createServer } from 'node:net';
2
+ import { DEFAULT_PORT, MAX_TCP_MESSAGE_SIZE_BYTES } from '../protocol/constants.js';
3
+ import { readMessageWithOptions, writeMessageWithOptions } from './stdio.js';
4
+ /**
5
+ * TCP server that proxies Chrome API calls from external agents
6
+ * through a ChromeClient connected to Chrome's native messaging.
7
+ *
8
+ * Each TCP connection gets its own read loop and subscription tracking.
9
+ * Multiple agents can connect simultaneously.
10
+ */
11
+ export class ChromeServer {
12
+ server;
13
+ chromeClient;
14
+ constructor(chromeClient, opts) {
15
+ this.chromeClient = chromeClient;
16
+ const port = opts?.port ?? DEFAULT_PORT;
17
+ const host = opts?.host ?? '127.0.0.1';
18
+ this.server = createServer((socket) => {
19
+ this.handleConnection(socket);
20
+ });
21
+ this.server.on('error', (err) => {
22
+ process.stderr.write(`[server] error: ${err.message}\n`);
23
+ });
24
+ this.server.listen(port, host, () => {
25
+ process.stderr.write(`[server] listening on ${host}:${port}\n`);
26
+ });
27
+ }
28
+ async handleConnection(socket) {
29
+ const clientSubs = new Map();
30
+ socket.on('error', () => {
31
+ // Client disconnected unexpectedly — cleanup happens below
32
+ });
33
+ while (true) {
34
+ let msg;
35
+ try {
36
+ msg = await readMessageWithOptions(socket, {
37
+ maxMessageSizeBytes: MAX_TCP_MESSAGE_SIZE_BYTES,
38
+ });
39
+ }
40
+ catch {
41
+ break;
42
+ }
43
+ if (msg === null)
44
+ break;
45
+ switch (msg.type) {
46
+ case 'call':
47
+ // Fire-and-forget — multiple calls can be in-flight
48
+ this.handleCall(socket, msg);
49
+ break;
50
+ case 'subscribe':
51
+ this.handleSubscribe(socket, msg, clientSubs);
52
+ break;
53
+ case 'unsubscribe':
54
+ this.handleUnsubscribe(msg, clientSubs);
55
+ break;
56
+ }
57
+ }
58
+ // Client disconnected — clean up all subscriptions
59
+ for (const unsub of clientSubs.values())
60
+ unsub();
61
+ clientSubs.clear();
62
+ }
63
+ async handleCall(socket, msg) {
64
+ try {
65
+ const result = await this.chromeClient.call(msg.method, ...msg.args);
66
+ this.send(socket, { id: msg.id, type: 'result', data: result });
67
+ }
68
+ catch (e) {
69
+ this.send(socket, {
70
+ id: msg.id,
71
+ type: 'error',
72
+ error: e instanceof Error ? e.message : String(e),
73
+ });
74
+ }
75
+ }
76
+ handleSubscribe(socket, msg, clientSubs) {
77
+ const unsub = this.chromeClient.subscribe(msg.event, (data) => {
78
+ this.send(socket, { id: msg.id, type: 'event', data });
79
+ });
80
+ clientSubs.set(msg.id, unsub);
81
+ }
82
+ handleUnsubscribe(msg, clientSubs) {
83
+ const unsub = clientSubs.get(msg.id);
84
+ if (unsub) {
85
+ unsub();
86
+ clientSubs.delete(msg.id);
87
+ }
88
+ }
89
+ send(socket, message) {
90
+ try {
91
+ if (!socket.destroyed) {
92
+ writeMessageWithOptions(message, socket, {
93
+ maxMessageSizeBytes: MAX_TCP_MESSAGE_SIZE_BYTES,
94
+ });
95
+ }
96
+ }
97
+ catch {
98
+ // Socket write failed — client likely disconnected
99
+ }
100
+ }
101
+ close() {
102
+ this.server.close();
103
+ }
104
+ get address() {
105
+ const addr = this.server.address();
106
+ if (addr && typeof addr === 'object') {
107
+ return { port: addr.port, host: addr.address };
108
+ }
109
+ return null;
110
+ }
111
+ }
112
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/native/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ export interface MessageIOOptions {
3
+ maxMessageSizeBytes?: number;
4
+ }
5
+ /**
6
+ * Reads one length-prefixed JSON message from the input stream.
7
+ * Returns `null` on clean EOF (no more messages).
8
+ *
9
+ * @param input - Readable stream (defaults to `process.stdin`)
10
+ */
11
+ export declare function readMessage<T>(input?: Readable): Promise<T | null>;
12
+ export declare function readMessageWithOptions<T>(input?: Readable, options?: MessageIOOptions): Promise<T | null>;
13
+ /**
14
+ * Writes one length-prefixed JSON message to the output stream.
15
+ *
16
+ * @param message - Object to serialize as JSON
17
+ * @param output - Writable stream (defaults to `process.stdout`)
18
+ */
19
+ export declare function writeMessage(message: unknown, output?: Writable): void;
20
+ export declare function writeMessageWithOptions(message: unknown, output?: Writable, options?: MessageIOOptions): void;
21
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/native/stdio.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAsDD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAE,QAAwB,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAEvF;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,KAAK,GAAE,QAAwB,EAC/B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAoBnB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,QAAyB,GAAG,IAAI,CAEtF;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,MAAM,GAAE,QAAyB,EACjC,OAAO,CAAC,EAAE,gBAAgB,GACzB,IAAI,CAeN"}
@@ -0,0 +1,94 @@
1
+ import { LENGTH_PREFIX_BYTES, MAX_MESSAGE_SIZE_BYTES } from '../protocol/constants.js';
2
+ /**
3
+ * Reads exactly `size` bytes from a readable stream.
4
+ * Returns `null` on EOF before any bytes are read.
5
+ * Throws if the stream ends mid-read (partial data).
6
+ */
7
+ function readExactly(input, size) {
8
+ return new Promise((resolve, reject) => {
9
+ const chunks = [];
10
+ let remaining = size;
11
+ const onReadable = () => {
12
+ while (remaining > 0) {
13
+ const chunk = input.read(Math.min(remaining, input.readableLength || remaining));
14
+ if (chunk === null)
15
+ return; // wait for more data
16
+ chunks.push(chunk);
17
+ remaining -= chunk.length;
18
+ }
19
+ cleanup();
20
+ resolve(Buffer.concat(chunks));
21
+ };
22
+ const onEnd = () => {
23
+ cleanup();
24
+ if (chunks.length === 0 && remaining === size) {
25
+ resolve(null); // clean EOF
26
+ }
27
+ else {
28
+ reject(new Error(`Stream ended after ${size - remaining}/${size} bytes`));
29
+ }
30
+ };
31
+ const onError = (err) => {
32
+ cleanup();
33
+ reject(err);
34
+ };
35
+ const cleanup = () => {
36
+ input.removeListener('readable', onReadable);
37
+ input.removeListener('end', onEnd);
38
+ input.removeListener('error', onError);
39
+ };
40
+ input.on('readable', onReadable);
41
+ input.on('end', onEnd);
42
+ input.on('error', onError);
43
+ // Try reading immediately if data is already buffered
44
+ onReadable();
45
+ });
46
+ }
47
+ /**
48
+ * Reads one length-prefixed JSON message from the input stream.
49
+ * Returns `null` on clean EOF (no more messages).
50
+ *
51
+ * @param input - Readable stream (defaults to `process.stdin`)
52
+ */
53
+ export async function readMessage(input = process.stdin) {
54
+ return await readMessageWithOptions(input);
55
+ }
56
+ export async function readMessageWithOptions(input = process.stdin, options) {
57
+ const lengthBuf = await readExactly(input, LENGTH_PREFIX_BYTES);
58
+ if (lengthBuf === null)
59
+ return null;
60
+ const messageLength = lengthBuf.readUInt32LE(0);
61
+ const maxMessageSizeBytes = options?.maxMessageSizeBytes ?? MAX_MESSAGE_SIZE_BYTES;
62
+ if (messageLength === 0) {
63
+ throw new Error('Received zero-length message');
64
+ }
65
+ if (messageLength > maxMessageSizeBytes) {
66
+ throw new Error(`Message size ${messageLength} exceeds maximum ${maxMessageSizeBytes}`);
67
+ }
68
+ const messageBuf = await readExactly(input, messageLength);
69
+ if (messageBuf === null) {
70
+ throw new Error('Stream ended before message body could be read');
71
+ }
72
+ return JSON.parse(messageBuf.toString('utf-8'));
73
+ }
74
+ /**
75
+ * Writes one length-prefixed JSON message to the output stream.
76
+ *
77
+ * @param message - Object to serialize as JSON
78
+ * @param output - Writable stream (defaults to `process.stdout`)
79
+ */
80
+ export function writeMessage(message, output = process.stdout) {
81
+ writeMessageWithOptions(message, output);
82
+ }
83
+ export function writeMessageWithOptions(message, output = process.stdout, options) {
84
+ const json = Buffer.from(JSON.stringify(message), 'utf-8');
85
+ const maxMessageSizeBytes = options?.maxMessageSizeBytes ?? MAX_MESSAGE_SIZE_BYTES;
86
+ if (json.length > maxMessageSizeBytes) {
87
+ throw new Error(`Serialized message size ${json.length} exceeds maximum ${maxMessageSizeBytes}`);
88
+ }
89
+ const lengthBuf = Buffer.alloc(LENGTH_PREFIX_BYTES);
90
+ lengthBuf.writeUInt32LE(json.length, 0);
91
+ output.write(lengthBuf);
92
+ output.write(json);
93
+ }
94
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/native/stdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /** Name registered in the native messaging host manifest. */
2
+ export declare const NATIVE_HOST_NAME = "com.ank1015.llm";
3
+ /**
4
+ * Maximum message size from native host -> Chrome extension.
5
+ * Chrome native messaging enforces a strict 1 MB outbound limit.
6
+ */
7
+ export declare const MAX_HOST_TO_CHROME_MESSAGE_SIZE_BYTES: number;
8
+ /**
9
+ * Maximum message size from Chrome extension -> native host.
10
+ * Set larger to support large payloads (for example screenshots).
11
+ */
12
+ export declare const MAX_CHROME_TO_HOST_MESSAGE_SIZE_BYTES: number;
13
+ /**
14
+ * Maximum message size on the local TCP bridge (agent <-> native host).
15
+ * Set larger than native host outbound limit so large tool results can flow.
16
+ */
17
+ export declare const MAX_TCP_MESSAGE_SIZE_BYTES: number;
18
+ /**
19
+ * Backward-compatible alias. Prefer directional constants above for new code.
20
+ */
21
+ export declare const MAX_MESSAGE_SIZE_BYTES: number;
22
+ /** Byte length of the uint32 LE length prefix. */
23
+ export declare const LENGTH_PREFIX_BYTES = 4;
24
+ /** Default TCP port for the Chrome RPC server. */
25
+ export declare const DEFAULT_PORT = 9224;
26
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/protocol/constants.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,qCAAqC,QAAc,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,qCAAqC,QAAmB,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAAmB,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAwC,CAAC;AAE5E,kDAAkD;AAClD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,kDAAkD;AAClD,eAAO,MAAM,YAAY,OAAO,CAAC"}
@@ -0,0 +1,26 @@
1
+ /** Name registered in the native messaging host manifest. */
2
+ export const NATIVE_HOST_NAME = 'com.ank1015.llm';
3
+ /**
4
+ * Maximum message size from native host -> Chrome extension.
5
+ * Chrome native messaging enforces a strict 1 MB outbound limit.
6
+ */
7
+ export const MAX_HOST_TO_CHROME_MESSAGE_SIZE_BYTES = 1024 * 1024;
8
+ /**
9
+ * Maximum message size from Chrome extension -> native host.
10
+ * Set larger to support large payloads (for example screenshots).
11
+ */
12
+ export const MAX_CHROME_TO_HOST_MESSAGE_SIZE_BYTES = 64 * 1024 * 1024;
13
+ /**
14
+ * Maximum message size on the local TCP bridge (agent <-> native host).
15
+ * Set larger than native host outbound limit so large tool results can flow.
16
+ */
17
+ export const MAX_TCP_MESSAGE_SIZE_BYTES = 64 * 1024 * 1024;
18
+ /**
19
+ * Backward-compatible alias. Prefer directional constants above for new code.
20
+ */
21
+ export const MAX_MESSAGE_SIZE_BYTES = MAX_HOST_TO_CHROME_MESSAGE_SIZE_BYTES;
22
+ /** Byte length of the uint32 LE length prefix. */
23
+ export const LENGTH_PREFIX_BYTES = 4;
24
+ /** Default TCP port for the Chrome RPC server. */
25
+ export const DEFAULT_PORT = 9224;
26
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/protocol/constants.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjE;;;GAGG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtE;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,qCAAqC,CAAC;AAE5E,kDAAkD;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,kDAAkD;AAClD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC"}
@@ -0,0 +1,39 @@
1
+ /** Call a Chrome API method and get a single result back. */
2
+ export interface CallMessage {
3
+ id: string;
4
+ type: 'call';
5
+ method: string;
6
+ args: unknown[];
7
+ }
8
+ /** Subscribe to a Chrome event. Events stream back with the same id. */
9
+ export interface SubscribeMessage {
10
+ id: string;
11
+ type: 'subscribe';
12
+ event: string;
13
+ }
14
+ /** Stop an active subscription. */
15
+ export interface UnsubscribeMessage {
16
+ id: string;
17
+ type: 'unsubscribe';
18
+ }
19
+ export type HostMessage = CallMessage | SubscribeMessage | UnsubscribeMessage;
20
+ /** Successful result of a call. */
21
+ export interface ResultMessage {
22
+ id: string;
23
+ type: 'result';
24
+ data: unknown;
25
+ }
26
+ /** Failed result of a call or subscription setup. */
27
+ export interface ErrorMessage {
28
+ id: string;
29
+ type: 'error';
30
+ error: string;
31
+ }
32
+ /** An event pushed from an active subscription. */
33
+ export interface EventMessage {
34
+ id: string;
35
+ type: 'event';
36
+ data: unknown;
37
+ }
38
+ export type ChromeMessage = ResultMessage | ErrorMessage | EventMessage;
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"AAEA,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mCAAmC;AACnC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAI9E,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,YAAY,GAAG,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ // ── Host → Chrome (outbound from native host) ──────────────────────
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"AAAA,sEAAsE"}
@@ -0,0 +1,7 @@
1
+ import type { ObserveSnapshot } from '../observe/types.js';
2
+ export interface ActionDomDiffSummary {
3
+ hasChanges: boolean;
4
+ lines: string[];
5
+ }
6
+ export declare function summarizeActionDomChanges(before: ObserveSnapshot, after: ObserveSnapshot): ActionDomDiffSummary;
7
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/sdk/action/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAyBD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,eAAe,GACrB,oBAAoB,CAwCtB"}
@@ -0,0 +1,54 @@
1
+ function normalizeText(value, max = 120) {
2
+ const compact = value.replace(/\s+/g, ' ').trim();
3
+ if (compact.length <= max) {
4
+ return compact;
5
+ }
6
+ return `${compact.slice(0, Math.max(1, max - 3))}...`;
7
+ }
8
+ function diffStrings(before, after) {
9
+ const beforeSet = new Set(before.map((item) => item.trim()).filter(Boolean));
10
+ const result = [];
11
+ for (const item of after) {
12
+ const normalized = item.trim();
13
+ if (!normalized || beforeSet.has(normalized)) {
14
+ continue;
15
+ }
16
+ result.push(normalized);
17
+ }
18
+ return result;
19
+ }
20
+ export function summarizeActionDomChanges(before, after) {
21
+ const lines = [];
22
+ if (before.page.title !== after.page.title) {
23
+ lines.push(`- Title changed to: ${after.page.title || '(untitled)'}`);
24
+ }
25
+ if (before.summary.totalLinks !== after.summary.totalLinks) {
26
+ lines.push(`- Links count: ${before.summary.totalLinks} -> ${after.summary.totalLinks}`);
27
+ }
28
+ if (before.summary.totalButtons !== after.summary.totalButtons) {
29
+ lines.push(`- Buttons count: ${before.summary.totalButtons} -> ${after.summary.totalButtons}`);
30
+ }
31
+ if (before.summary.totalInputs !== after.summary.totalInputs) {
32
+ lines.push(`- Inputs count: ${before.summary.totalInputs} -> ${after.summary.totalInputs}`);
33
+ }
34
+ const newAlerts = diffStrings(before.alerts, after.alerts);
35
+ if (newAlerts.length > 0) {
36
+ const sample = newAlerts
37
+ .slice(0, 2)
38
+ .map((item) => `"${normalizeText(item)}"`)
39
+ .join(', ');
40
+ const suffix = newAlerts.length > 2 ? `, +${newAlerts.length - 2} more` : '';
41
+ lines.push(`- New alerts: ${sample}${suffix}`);
42
+ }
43
+ if (lines.length === 0) {
44
+ return {
45
+ hasChanges: false,
46
+ lines: ['- No broad page structure changes detected.'],
47
+ };
48
+ }
49
+ return {
50
+ hasChanges: true,
51
+ lines: lines.slice(0, 4),
52
+ };
53
+ }
54
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/sdk/action/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { WindowObservedActionTarget } from './types.js';
2
+ export declare const OBSERVE_BEFORE_ACT_MESSAGE = "You must observe before act";
3
+ export interface ResolveObservedTargetInput {
4
+ windowId: number;
5
+ tabId: number;
6
+ targetId: string;
7
+ }
8
+ export interface ResolveObservedTargetSuccess {
9
+ status: 'ok';
10
+ target: WindowObservedActionTarget;
11
+ }
12
+ export interface ResolveObservedTargetMissingObserve {
13
+ status: 'observe_required';
14
+ message: string;
15
+ }
16
+ export interface ResolveObservedTargetNotFound {
17
+ status: 'target_not_found';
18
+ message: string;
19
+ }
20
+ export type ResolveObservedTargetResult = ResolveObservedTargetSuccess | ResolveObservedTargetMissingObserve | ResolveObservedTargetNotFound;
21
+ export declare function resolveObservedTarget(input: ResolveObservedTargetInput): Promise<ResolveObservedTargetResult>;
22
+ export declare function buildSelectorCandidates(target: WindowObservedActionTarget): string[];
23
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/sdk/action/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAG7D,eAAO,MAAM,0BAA0B,gCAAgC,CAAC;AAExE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,0BAA0B,CAAC;CACpC;AAED,MAAM,WAAW,mCAAmC;IAClD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,2BAA2B,GACnC,4BAA4B,GAC5B,mCAAmC,GACnC,6BAA6B,CAAC;AAElC,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,2BAA2B,CAAC,CAkCtC;AAkBD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAqDpF"}
@@ -0,0 +1,93 @@
1
+ import { readLatestObserveSnapshot } from '../observe/storage.js';
2
+ export const OBSERVE_BEFORE_ACT_MESSAGE = 'You must observe before act';
3
+ export async function resolveObservedTarget(input) {
4
+ const record = await readLatestObserveSnapshot(input.windowId, input.tabId);
5
+ if (!record) {
6
+ return {
7
+ status: 'observe_required',
8
+ message: OBSERVE_BEFORE_ACT_MESSAGE,
9
+ };
10
+ }
11
+ const target = findTarget(record.snapshot.interactive, input.targetId);
12
+ if (!target) {
13
+ return {
14
+ status: 'target_not_found',
15
+ message: `Target "${input.targetId}" was not found in latest observe snapshot for tab ${input.tabId}`,
16
+ };
17
+ }
18
+ const normalizedTarget = {
19
+ id: target.id,
20
+ tag: target.tag,
21
+ role: target.role,
22
+ name: target.name,
23
+ locator: target.locator,
24
+ actions: target.actions,
25
+ };
26
+ if (target.href) {
27
+ normalizedTarget.href = target.href;
28
+ }
29
+ return {
30
+ status: 'ok',
31
+ target: normalizedTarget,
32
+ };
33
+ }
34
+ function findTarget(interactive, targetId) {
35
+ const normalized = targetId.trim().toUpperCase();
36
+ if (!normalized) {
37
+ return null;
38
+ }
39
+ return interactive.find((item) => item.id.toUpperCase() === normalized) ?? null;
40
+ }
41
+ function escapeForAttribute(value) {
42
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
43
+ }
44
+ export function buildSelectorCandidates(target) {
45
+ const selectors = [];
46
+ const add = (selector) => {
47
+ if (!selector)
48
+ return;
49
+ const trimmed = selector.trim();
50
+ if (!trimmed)
51
+ return;
52
+ if (!selectors.includes(trimmed)) {
53
+ selectors.push(trimmed);
54
+ }
55
+ };
56
+ if (target.locator.cssPath) {
57
+ add(target.locator.cssPath);
58
+ }
59
+ if (target.locator.id) {
60
+ const idEscaped = escapeForAttribute(target.locator.id);
61
+ add(`#${idEscaped}`);
62
+ add(`${target.tag}#${idEscaped}`);
63
+ add(`[id="${idEscaped}"]`);
64
+ }
65
+ if (target.locator.testId) {
66
+ const testIdEscaped = escapeForAttribute(target.locator.testId);
67
+ add(`[data-testid="${testIdEscaped}"]`);
68
+ add(`[data-test-id="${testIdEscaped}"]`);
69
+ add(`[data-test="${testIdEscaped}"]`);
70
+ add(`[data-qa="${testIdEscaped}"]`);
71
+ }
72
+ if (target.locator.name) {
73
+ const nameEscaped = escapeForAttribute(target.locator.name);
74
+ add(`${target.tag}[name="${nameEscaped}"]`);
75
+ add(`[name="${nameEscaped}"]`);
76
+ }
77
+ if (target.href) {
78
+ const hrefEscaped = escapeForAttribute(target.href);
79
+ add(`a[href="${hrefEscaped}"]`);
80
+ add(`a[href*="${hrefEscaped}"]`);
81
+ }
82
+ if (target.role && target.name) {
83
+ const roleEscaped = escapeForAttribute(target.role);
84
+ add(`${target.tag}[role="${roleEscaped}"]`);
85
+ add(`[role="${roleEscaped}"]`);
86
+ }
87
+ else if (target.role) {
88
+ const roleEscaped = escapeForAttribute(target.role);
89
+ add(`[role="${roleEscaped}"]`);
90
+ }
91
+ return selectors;
92
+ }
93
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/sdk/action/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { summarizeActionDomChanges } from './diff.js';
2
+ export type { ActionDomDiffSummary } from './diff.js';
3
+ export { OBSERVE_BEFORE_ACT_MESSAGE, buildSelectorCandidates, resolveObservedTarget, } from './helpers.js';
4
+ export { buildActionScript, parseActionExecutionResult } from './script.js';
5
+ export type { WindowActionScriptPayload, WindowActionExecutionResult, WindowActionOptions, WindowObservedActionTarget, WindowScrollBehavior, WindowScrollOptions, WindowTargetActionType, WindowTypeOptions, } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/action/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtD,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EACV,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACnB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { summarizeActionDomChanges } from './diff.js';
2
+ export { OBSERVE_BEFORE_ACT_MESSAGE, buildSelectorCandidates, resolveObservedTarget, } from './helpers.js';
3
+ export { buildActionScript, parseActionExecutionResult } from './script.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sdk/action/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAEtD,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { WindowActionExecutionResult, WindowActionScriptPayload } from './types.js';
2
+ export declare function buildActionScript(payload: WindowActionScriptPayload): string;
3
+ export declare function parseActionExecutionResult(raw: unknown): WindowActionExecutionResult;
4
+ //# sourceMappingURL=script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../../src/sdk/action/script.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAMzF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,yBAAyB,GAAG,MAAM,CA8U5E;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,2BAA2B,CAyBpF"}