@ticktockbent/charlotte 0.1.0

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 (136) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +21 -0
  3. package/README.md +254 -0
  4. package/dist/browser/browser-manager.d.ts +14 -0
  5. package/dist/browser/browser-manager.d.ts.map +1 -0
  6. package/dist/browser/browser-manager.js +72 -0
  7. package/dist/browser/browser-manager.js.map +1 -0
  8. package/dist/browser/cdp-session.d.ts +7 -0
  9. package/dist/browser/cdp-session.d.ts.map +1 -0
  10. package/dist/browser/cdp-session.js +35 -0
  11. package/dist/browser/cdp-session.js.map +1 -0
  12. package/dist/browser/page-manager.d.ts +30 -0
  13. package/dist/browser/page-manager.d.ts.map +1 -0
  14. package/dist/browser/page-manager.js +123 -0
  15. package/dist/browser/page-manager.js.map +1 -0
  16. package/dist/dev/auditor.d.ts +39 -0
  17. package/dist/dev/auditor.d.ts.map +1 -0
  18. package/dist/dev/auditor.js +474 -0
  19. package/dist/dev/auditor.js.map +1 -0
  20. package/dist/dev/dev-mode-state.d.ts +24 -0
  21. package/dist/dev/dev-mode-state.d.ts.map +1 -0
  22. package/dist/dev/dev-mode-state.js +93 -0
  23. package/dist/dev/dev-mode-state.js.map +1 -0
  24. package/dist/dev/file-watcher.d.ts +20 -0
  25. package/dist/dev/file-watcher.d.ts.map +1 -0
  26. package/dist/dev/file-watcher.js +78 -0
  27. package/dist/dev/file-watcher.js.map +1 -0
  28. package/dist/dev/static-server.d.ts +18 -0
  29. package/dist/dev/static-server.d.ts.map +1 -0
  30. package/dist/dev/static-server.js +73 -0
  31. package/dist/dev/static-server.js.map +1 -0
  32. package/dist/index.d.ts +3 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +60 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/renderer/accessibility-extractor.d.ts +19 -0
  37. package/dist/renderer/accessibility-extractor.d.ts.map +1 -0
  38. package/dist/renderer/accessibility-extractor.js +138 -0
  39. package/dist/renderer/accessibility-extractor.js.map +1 -0
  40. package/dist/renderer/content-extractor.d.ts +6 -0
  41. package/dist/renderer/content-extractor.d.ts.map +1 -0
  42. package/dist/renderer/content-extractor.js +150 -0
  43. package/dist/renderer/content-extractor.js.map +1 -0
  44. package/dist/renderer/dom-path.d.ts +4 -0
  45. package/dist/renderer/dom-path.d.ts.map +1 -0
  46. package/dist/renderer/dom-path.js +34 -0
  47. package/dist/renderer/dom-path.js.map +1 -0
  48. package/dist/renderer/element-id-generator.d.ts +19 -0
  49. package/dist/renderer/element-id-generator.d.ts.map +1 -0
  50. package/dist/renderer/element-id-generator.js +73 -0
  51. package/dist/renderer/element-id-generator.js.map +1 -0
  52. package/dist/renderer/interactive-extractor.d.ts +13 -0
  53. package/dist/renderer/interactive-extractor.d.ts.map +1 -0
  54. package/dist/renderer/interactive-extractor.js +161 -0
  55. package/dist/renderer/interactive-extractor.js.map +1 -0
  56. package/dist/renderer/layout-extractor.d.ts +8 -0
  57. package/dist/renderer/layout-extractor.d.ts.map +1 -0
  58. package/dist/renderer/layout-extractor.js +48 -0
  59. package/dist/renderer/layout-extractor.js.map +1 -0
  60. package/dist/renderer/renderer-pipeline.d.ts +26 -0
  61. package/dist/renderer/renderer-pipeline.d.ts.map +1 -0
  62. package/dist/renderer/renderer-pipeline.js +163 -0
  63. package/dist/renderer/renderer-pipeline.js.map +1 -0
  64. package/dist/server.d.ts +19 -0
  65. package/dist/server.d.ts.map +1 -0
  66. package/dist/server.js +39 -0
  67. package/dist/server.js.map +1 -0
  68. package/dist/state/differ.d.ts +9 -0
  69. package/dist/state/differ.d.ts.map +1 -0
  70. package/dist/state/differ.js +295 -0
  71. package/dist/state/differ.js.map +1 -0
  72. package/dist/state/snapshot-store.d.ts +52 -0
  73. package/dist/state/snapshot-store.d.ts.map +1 -0
  74. package/dist/state/snapshot-store.js +98 -0
  75. package/dist/state/snapshot-store.js.map +1 -0
  76. package/dist/tools/dev-mode.d.ts +4 -0
  77. package/dist/tools/dev-mode.d.ts.map +1 -0
  78. package/dist/tools/dev-mode.js +160 -0
  79. package/dist/tools/dev-mode.js.map +1 -0
  80. package/dist/tools/evaluate.d.ts +10 -0
  81. package/dist/tools/evaluate.d.ts.map +1 -0
  82. package/dist/tools/evaluate.js +109 -0
  83. package/dist/tools/evaluate.js.map +1 -0
  84. package/dist/tools/interaction.d.ts +4 -0
  85. package/dist/tools/interaction.d.ts.map +1 -0
  86. package/dist/tools/interaction.js +680 -0
  87. package/dist/tools/interaction.js.map +1 -0
  88. package/dist/tools/navigation.d.ts +4 -0
  89. package/dist/tools/navigation.d.ts.map +1 -0
  90. package/dist/tools/navigation.js +136 -0
  91. package/dist/tools/navigation.js.map +1 -0
  92. package/dist/tools/observation.d.ts +4 -0
  93. package/dist/tools/observation.d.ts.map +1 -0
  94. package/dist/tools/observation.js +278 -0
  95. package/dist/tools/observation.js.map +1 -0
  96. package/dist/tools/session.d.ts +4 -0
  97. package/dist/tools/session.d.ts.map +1 -0
  98. package/dist/tools/session.js +372 -0
  99. package/dist/tools/session.js.map +1 -0
  100. package/dist/tools/tool-helpers.d.ts +89 -0
  101. package/dist/tools/tool-helpers.d.ts.map +1 -0
  102. package/dist/tools/tool-helpers.js +127 -0
  103. package/dist/tools/tool-helpers.js.map +1 -0
  104. package/dist/types/config.d.ts +7 -0
  105. package/dist/types/config.d.ts.map +1 -0
  106. package/dist/types/config.js +7 -0
  107. package/dist/types/config.js.map +1 -0
  108. package/dist/types/element-id.d.ts +8 -0
  109. package/dist/types/element-id.d.ts.map +1 -0
  110. package/dist/types/element-id.js +19 -0
  111. package/dist/types/element-id.js.map +1 -0
  112. package/dist/types/errors.d.ts +22 -0
  113. package/dist/types/errors.d.ts.map +1 -0
  114. package/dist/types/errors.js +30 -0
  115. package/dist/types/errors.js.map +1 -0
  116. package/dist/types/page-representation.d.ts +84 -0
  117. package/dist/types/page-representation.d.ts.map +1 -0
  118. package/dist/types/page-representation.js +2 -0
  119. package/dist/types/page-representation.js.map +1 -0
  120. package/dist/types/snapshot.d.ts +22 -0
  121. package/dist/types/snapshot.d.ts.map +1 -0
  122. package/dist/types/snapshot.js +2 -0
  123. package/dist/types/snapshot.js.map +1 -0
  124. package/dist/utils/hash.d.ts +2 -0
  125. package/dist/utils/hash.d.ts.map +1 -0
  126. package/dist/utils/hash.js +6 -0
  127. package/dist/utils/hash.js.map +1 -0
  128. package/dist/utils/logger.d.ts +9 -0
  129. package/dist/utils/logger.d.ts.map +1 -0
  130. package/dist/utils/logger.js +31 -0
  131. package/dist/utils/logger.js.map +1 -0
  132. package/dist/utils/wait.d.ts +21 -0
  133. package/dist/utils/wait.d.ts.map +1 -0
  134. package/dist/utils/wait.js +55 -0
  135. package/dist/utils/wait.js.map +1 -0
  136. package/package.json +67 -0
@@ -0,0 +1,372 @@
1
+ import { z } from "zod";
2
+ import { logger } from "../utils/logger.js";
3
+ import { renderActivePage, formatPageResponse, handleToolError, } from "./tool-helpers.js";
4
+ const CookieSchema = z.object({
5
+ name: z.string().describe("Cookie name"),
6
+ value: z.string().describe("Cookie value"),
7
+ domain: z.string().describe("Cookie domain"),
8
+ path: z.string().optional().describe("Cookie path (default: '/')"),
9
+ secure: z.boolean().optional().describe("Secure flag"),
10
+ httpOnly: z.boolean().optional().describe("HttpOnly flag"),
11
+ sameSite: z
12
+ .enum(["Strict", "Lax", "None"])
13
+ .optional()
14
+ .describe("SameSite attribute"),
15
+ });
16
+ export function registerSessionTools(server, deps) {
17
+ // ─── charlotte:set_cookies ───
18
+ server.registerTool("charlotte:set_cookies", {
19
+ description: "Set cookies on the active page. Cookies persist for subsequent navigations within matching domains.",
20
+ inputSchema: {
21
+ cookies: z
22
+ .array(CookieSchema)
23
+ .describe("Array of cookie objects to set"),
24
+ },
25
+ }, async ({ cookies }) => {
26
+ try {
27
+ await deps.browserManager.ensureConnected();
28
+ const page = deps.pageManager.getActivePage();
29
+ logger.info("Setting cookies", { count: cookies.length });
30
+ const puppeteerCookies = cookies.map((cookie) => ({
31
+ name: cookie.name,
32
+ value: cookie.value,
33
+ domain: cookie.domain,
34
+ path: cookie.path ?? "/",
35
+ secure: cookie.secure,
36
+ httpOnly: cookie.httpOnly,
37
+ sameSite: cookie.sameSite,
38
+ }));
39
+ await page.setCookie(...puppeteerCookies);
40
+ return {
41
+ content: [
42
+ {
43
+ type: "text",
44
+ text: JSON.stringify({
45
+ success: true,
46
+ cookies_set: cookies.length,
47
+ details: cookies.map((c) => ({
48
+ name: c.name,
49
+ domain: c.domain,
50
+ path: c.path ?? "/",
51
+ })),
52
+ }),
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ catch (error) {
58
+ return handleToolError(error);
59
+ }
60
+ });
61
+ // ─── charlotte:set_headers ───
62
+ server.registerTool("charlotte:set_headers", {
63
+ description: "Set extra HTTP headers for subsequent requests. Headers persist for all navigations on the active page.",
64
+ inputSchema: {
65
+ headers: z
66
+ .record(z.string(), z.string())
67
+ .describe("Key-value header pairs (e.g. { 'Authorization': 'Bearer token' })"),
68
+ },
69
+ }, async ({ headers }) => {
70
+ try {
71
+ await deps.browserManager.ensureConnected();
72
+ const page = deps.pageManager.getActivePage();
73
+ logger.info("Setting extra HTTP headers", {
74
+ headerNames: Object.keys(headers),
75
+ });
76
+ await page.setExtraHTTPHeaders(headers);
77
+ return {
78
+ content: [
79
+ {
80
+ type: "text",
81
+ text: JSON.stringify({
82
+ success: true,
83
+ headers_set: Object.keys(headers),
84
+ }),
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ catch (error) {
90
+ return handleToolError(error);
91
+ }
92
+ });
93
+ // ─── charlotte:configure ───
94
+ server.registerTool("charlotte:configure", {
95
+ description: "Configure Charlotte runtime settings. Changes take effect immediately.",
96
+ inputSchema: {
97
+ snapshot_depth: z
98
+ .number()
99
+ .optional()
100
+ .describe("Ring buffer size for snapshots (default: 50, min: 5, max: 500)"),
101
+ auto_snapshot: z
102
+ .enum(["every_action", "observe_only", "manual"])
103
+ .optional()
104
+ .describe('"every_action" (default) — snapshot after every tool, "observe_only" — only on observe, "manual" — only with explicit snapshot: true'),
105
+ },
106
+ }, async ({ snapshot_depth, auto_snapshot }) => {
107
+ try {
108
+ logger.info("Configuring Charlotte", { snapshot_depth, auto_snapshot });
109
+ if (snapshot_depth !== undefined) {
110
+ deps.snapshotStore.setDepth(snapshot_depth);
111
+ deps.config.snapshotDepth = Math.max(5, Math.min(500, snapshot_depth));
112
+ }
113
+ if (auto_snapshot !== undefined) {
114
+ deps.config.autoSnapshot = auto_snapshot;
115
+ }
116
+ return {
117
+ content: [
118
+ {
119
+ type: "text",
120
+ text: JSON.stringify({
121
+ success: true,
122
+ config: {
123
+ snapshot_depth: deps.config.snapshotDepth,
124
+ auto_snapshot: deps.config.autoSnapshot,
125
+ },
126
+ }),
127
+ },
128
+ ],
129
+ };
130
+ }
131
+ catch (error) {
132
+ return handleToolError(error);
133
+ }
134
+ });
135
+ // ─── charlotte:tabs ───
136
+ server.registerTool("charlotte:tabs", {
137
+ description: "List all open browser tabs with their URLs, titles, and active status.",
138
+ inputSchema: {},
139
+ }, async () => {
140
+ try {
141
+ await deps.browserManager.ensureConnected();
142
+ const tabs = await deps.pageManager.listTabs();
143
+ return {
144
+ content: [
145
+ {
146
+ type: "text",
147
+ text: JSON.stringify({ tabs }),
148
+ },
149
+ ],
150
+ };
151
+ }
152
+ catch (error) {
153
+ return handleToolError(error);
154
+ }
155
+ });
156
+ // ─── charlotte:tab_open ───
157
+ server.registerTool("charlotte:tab_open", {
158
+ description: "Open a new browser tab. Optionally navigate to a URL. The new tab becomes the active tab.",
159
+ inputSchema: {
160
+ url: z
161
+ .string()
162
+ .optional()
163
+ .describe("URL to navigate to (default: blank page)"),
164
+ },
165
+ }, async ({ url }) => {
166
+ try {
167
+ await deps.browserManager.ensureConnected();
168
+ const tabId = await deps.pageManager.openTab(deps.browserManager, url);
169
+ logger.info("Opened new tab", { tabId, url });
170
+ const representation = await renderActivePage(deps, {
171
+ source: "action",
172
+ });
173
+ return {
174
+ content: [
175
+ {
176
+ type: "text",
177
+ text: JSON.stringify({
178
+ tab_id: tabId,
179
+ ...representation,
180
+ }, null, 2),
181
+ },
182
+ ],
183
+ };
184
+ }
185
+ catch (error) {
186
+ return handleToolError(error);
187
+ }
188
+ });
189
+ // ─── charlotte:tab_switch ───
190
+ server.registerTool("charlotte:tab_switch", {
191
+ description: "Switch to a different browser tab by its tab ID. Returns the page representation of the activated tab.",
192
+ inputSchema: {
193
+ tab_id: z.string().describe("ID of the tab to switch to"),
194
+ },
195
+ }, async ({ tab_id }) => {
196
+ try {
197
+ await deps.browserManager.ensureConnected();
198
+ await deps.pageManager.switchTab(tab_id);
199
+ logger.info("Switched to tab", { tab_id });
200
+ const representation = await renderActivePage(deps, {
201
+ source: "action",
202
+ });
203
+ return formatPageResponse(representation);
204
+ }
205
+ catch (error) {
206
+ return handleToolError(error);
207
+ }
208
+ });
209
+ // ─── charlotte:tab_close ───
210
+ server.registerTool("charlotte:tab_close", {
211
+ description: "Close a browser tab by its ID. If the closed tab was active, switches to the first remaining tab.",
212
+ inputSchema: {
213
+ tab_id: z.string().describe("ID of the tab to close"),
214
+ },
215
+ }, async ({ tab_id }) => {
216
+ try {
217
+ await deps.browserManager.ensureConnected();
218
+ await deps.pageManager.closeTab(tab_id);
219
+ logger.info("Closed tab", { tab_id });
220
+ const remainingTabs = await deps.pageManager.listTabs();
221
+ return {
222
+ content: [
223
+ {
224
+ type: "text",
225
+ text: JSON.stringify({
226
+ success: true,
227
+ closed: tab_id,
228
+ remaining_tabs: remainingTabs,
229
+ }),
230
+ },
231
+ ],
232
+ };
233
+ }
234
+ catch (error) {
235
+ return handleToolError(error);
236
+ }
237
+ });
238
+ // ─── charlotte:viewport ───
239
+ const DEVICE_PRESETS = {
240
+ mobile: { width: 375, height: 667 },
241
+ tablet: { width: 768, height: 1024 },
242
+ desktop: { width: 1280, height: 720 },
243
+ };
244
+ server.registerTool("charlotte:viewport", {
245
+ description: "Change the browser viewport dimensions. Use a device preset or specify custom width/height. Returns page representation at the new viewport size.",
246
+ inputSchema: {
247
+ width: z
248
+ .number()
249
+ .optional()
250
+ .describe("Viewport width in pixels"),
251
+ height: z
252
+ .number()
253
+ .optional()
254
+ .describe("Viewport height in pixels"),
255
+ device: z
256
+ .enum(["mobile", "tablet", "desktop"])
257
+ .optional()
258
+ .describe('Device preset (overrides width/height). "mobile" = 375×667, "tablet" = 768×1024, "desktop" = 1280×720'),
259
+ },
260
+ }, async ({ width, height, device }) => {
261
+ try {
262
+ await deps.browserManager.ensureConnected();
263
+ const page = deps.pageManager.getActivePage();
264
+ let viewportWidth;
265
+ let viewportHeight;
266
+ if (device) {
267
+ const preset = DEVICE_PRESETS[device];
268
+ viewportWidth = preset.width;
269
+ viewportHeight = preset.height;
270
+ }
271
+ else if (width !== undefined && height !== undefined) {
272
+ viewportWidth = width;
273
+ viewportHeight = height;
274
+ }
275
+ else {
276
+ viewportWidth = width ?? 1280;
277
+ viewportHeight = height ?? 720;
278
+ }
279
+ logger.info("Setting viewport", {
280
+ width: viewportWidth,
281
+ height: viewportHeight,
282
+ device,
283
+ });
284
+ await page.setViewport({
285
+ width: viewportWidth,
286
+ height: viewportHeight,
287
+ });
288
+ const representation = await renderActivePage(deps, {
289
+ source: "action",
290
+ });
291
+ return formatPageResponse(representation);
292
+ }
293
+ catch (error) {
294
+ return handleToolError(error);
295
+ }
296
+ });
297
+ // ─── charlotte:network ───
298
+ const THROTTLE_PRESETS = {
299
+ "3g": {
300
+ offline: false,
301
+ downloadThroughput: (1.6 * 1024 * 1024) / 8,
302
+ uploadThroughput: (750 * 1024) / 8,
303
+ latency: 150,
304
+ },
305
+ "4g": {
306
+ offline: false,
307
+ downloadThroughput: (4 * 1024 * 1024) / 8,
308
+ uploadThroughput: (3 * 1024 * 1024) / 8,
309
+ latency: 20,
310
+ },
311
+ offline: {
312
+ offline: true,
313
+ downloadThroughput: 0,
314
+ uploadThroughput: 0,
315
+ latency: 0,
316
+ },
317
+ none: {
318
+ offline: false,
319
+ downloadThroughput: -1,
320
+ uploadThroughput: -1,
321
+ latency: 0,
322
+ },
323
+ };
324
+ server.registerTool("charlotte:network", {
325
+ description: "Configure network conditions for the active page. Set throttling presets, block URL patterns, or enable request logging.",
326
+ inputSchema: {
327
+ throttle: z
328
+ .enum(["3g", "4g", "offline", "none"])
329
+ .optional()
330
+ .describe('Network throttling preset. "3g" = slow, "4g" = fast mobile, "offline" = no network, "none" = disable throttling'),
331
+ block: z
332
+ .array(z.string())
333
+ .optional()
334
+ .describe("URL patterns to block (e.g. [\"*.ads.com\", \"tracking.js\"]). Pass empty array to clear."),
335
+ },
336
+ }, async ({ throttle, block }) => {
337
+ try {
338
+ await deps.browserManager.ensureConnected();
339
+ const page = deps.pageManager.getActivePage();
340
+ const session = await page.createCDPSession();
341
+ const appliedSettings = {};
342
+ if (throttle !== undefined) {
343
+ const preset = THROTTLE_PRESETS[throttle];
344
+ await session.send("Network.emulateNetworkConditions", preset);
345
+ appliedSettings.throttle = throttle;
346
+ logger.info("Applied network throttling", { throttle });
347
+ }
348
+ if (block !== undefined) {
349
+ await session.send("Network.setBlockedURLs", { urls: block });
350
+ appliedSettings.blocked_patterns = block;
351
+ logger.info("Set blocked URL patterns", {
352
+ patternCount: block.length,
353
+ });
354
+ }
355
+ return {
356
+ content: [
357
+ {
358
+ type: "text",
359
+ text: JSON.stringify({
360
+ success: true,
361
+ network: appliedSettings,
362
+ }),
363
+ },
364
+ ],
365
+ };
366
+ }
367
+ catch (error) {
368
+ return handleToolError(error);
369
+ }
370
+ });
371
+ }
372
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import type { Page } from "puppeteer";
2
+ import type { PageManager } from "../browser/page-manager.js";
3
+ import type { BrowserManager } from "../browser/browser-manager.js";
4
+ import type { RendererPipeline } from "../renderer/renderer-pipeline.js";
5
+ import type { ElementIdGenerator } from "../renderer/element-id-generator.js";
6
+ import type { SnapshotStore } from "../state/snapshot-store.js";
7
+ import type { CharlotteConfig } from "../types/config.js";
8
+ import type { DevModeState } from "../dev/dev-mode-state.js";
9
+ import type { PageRepresentation, InteractiveElement } from "../types/page-representation.js";
10
+ import type { DetailLevel } from "../renderer/renderer-pipeline.js";
11
+ import { CharlotteError } from "../types/errors.js";
12
+ export interface ToolDependencies {
13
+ browserManager: BrowserManager;
14
+ pageManager: PageManager;
15
+ rendererPipeline: RendererPipeline;
16
+ elementIdGenerator: ElementIdGenerator;
17
+ snapshotStore: SnapshotStore;
18
+ config: CharlotteConfig;
19
+ devModeState?: DevModeState;
20
+ }
21
+ export interface RenderOptions {
22
+ detail?: DetailLevel;
23
+ selector?: string;
24
+ includeStyles?: boolean;
25
+ /** Who triggered this render. Controls auto-snapshot behavior. */
26
+ source?: "observe" | "action" | "internal";
27
+ /** Force a snapshot regardless of auto_snapshot config. */
28
+ forceSnapshot?: boolean;
29
+ }
30
+ /**
31
+ * Render the active page, attach console/network errors, and optionally
32
+ * push a snapshot to the store.
33
+ */
34
+ export declare function renderActivePage(deps: ToolDependencies, options?: RenderOptions): Promise<PageRepresentation>;
35
+ /**
36
+ * Resolve an element ID to a Puppeteer ElementHandle via CDP backend node ID.
37
+ * If the ID is stale (not found after re-render), throws ELEMENT_NOT_FOUND
38
+ * with a findSimilar suggestion.
39
+ */
40
+ export declare function resolveElement(deps: ToolDependencies, elementId: string): Promise<{
41
+ page: Page;
42
+ backendNodeId: number;
43
+ }>;
44
+ /**
45
+ * Render after an interaction action and attach a delta diff.
46
+ * Captures the pre-action snapshot (latest in store), renders post-action
47
+ * state, and computes a structural diff between them.
48
+ */
49
+ export declare function renderAfterAction(deps: ToolDependencies): Promise<PageRepresentation>;
50
+ /**
51
+ * Format a PageRepresentation as an MCP tool response.
52
+ */
53
+ export declare function formatPageResponse(representation: PageRepresentation): {
54
+ content: Array<{
55
+ type: "text";
56
+ text: string;
57
+ }>;
58
+ };
59
+ /**
60
+ * Format an array of interactive elements as an MCP tool response.
61
+ */
62
+ export declare function formatElementsResponse(elements: InteractiveElement[]): {
63
+ content: Array<{
64
+ type: "text";
65
+ text: string;
66
+ }>;
67
+ };
68
+ /**
69
+ * Format a CharlotteError as an MCP tool error response.
70
+ */
71
+ export declare function formatErrorResponse(error: CharlotteError): {
72
+ content: Array<{
73
+ type: "text";
74
+ text: string;
75
+ }>;
76
+ isError: true;
77
+ };
78
+ /**
79
+ * Wrap a tool handler to catch CharlotteErrors and unexpected errors,
80
+ * returning consistent error responses.
81
+ */
82
+ export declare function handleToolError(error: unknown): {
83
+ content: Array<{
84
+ type: "text";
85
+ text: string;
86
+ }>;
87
+ isError: true;
88
+ };
89
+ //# sourceMappingURL=tool-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-helpers.d.ts","sourceRoot":"","sources":["../../src/tools/tool-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import { CharlotteError, CharlotteErrorCode } from "../types/errors.js";
2
+ import { diffRepresentations } from "../state/differ.js";
3
+ /**
4
+ * Render the active page, attach console/network errors, and optionally
5
+ * push a snapshot to the store.
6
+ */
7
+ export async function renderActivePage(deps, options = {}) {
8
+ const { detail = "summary", selector, includeStyles, source = "internal", forceSnapshot = false, } = options;
9
+ const page = deps.pageManager.getActivePage();
10
+ const representation = await deps.rendererPipeline.render(page, {
11
+ detail,
12
+ selector,
13
+ includeStyles,
14
+ });
15
+ // Attach collected errors from page manager
16
+ representation.errors = {
17
+ console: deps.pageManager.getConsoleErrors(),
18
+ network: deps.pageManager.getNetworkErrors(),
19
+ };
20
+ // Determine whether to push a snapshot.
21
+ // "internal" renders (e.g. resolveElement re-renders) never auto-snapshot.
22
+ const shouldSnapshot = forceSnapshot ||
23
+ (source !== "internal" &&
24
+ (deps.config.autoSnapshot === "every_action" ||
25
+ (deps.config.autoSnapshot === "observe_only" && source === "observe")));
26
+ if (shouldSnapshot) {
27
+ deps.snapshotStore.push(representation);
28
+ }
29
+ // Attach pending reload event from dev mode, if any
30
+ const pendingReloadEvent = deps.devModeState?.consumePendingReloadEvent();
31
+ if (pendingReloadEvent) {
32
+ representation.reload_event = pendingReloadEvent;
33
+ }
34
+ return representation;
35
+ }
36
+ /**
37
+ * Resolve an element ID to a Puppeteer ElementHandle via CDP backend node ID.
38
+ * If the ID is stale (not found after re-render), throws ELEMENT_NOT_FOUND
39
+ * with a findSimilar suggestion.
40
+ */
41
+ export async function resolveElement(deps, elementId) {
42
+ const page = deps.pageManager.getActivePage();
43
+ // Step 1: Check current map
44
+ let backendNodeId = deps.elementIdGenerator.resolveId(elementId);
45
+ if (backendNodeId !== null) {
46
+ return { page, backendNodeId };
47
+ }
48
+ // Step 2: Re-render and check again (map was invalidated)
49
+ const freshRepresentation = await renderActivePage(deps, { detail: "minimal" });
50
+ backendNodeId = deps.elementIdGenerator.resolveId(elementId);
51
+ if (backendNodeId !== null) {
52
+ return { page, backendNodeId };
53
+ }
54
+ // Step 3: Element is genuinely gone — suggest similar
55
+ const similar = deps.elementIdGenerator.findSimilar(elementId, freshRepresentation.interactive);
56
+ const suggestion = similar
57
+ ? `Element '${elementId}' not found. Did you mean '${similar.id}' (${similar.type}: "${similar.label}")?`
58
+ : `Element '${elementId}' not found. Call charlotte:observe to get current page state.`;
59
+ throw new CharlotteError(CharlotteErrorCode.ELEMENT_NOT_FOUND, `Element '${elementId}' not found on page.`, suggestion);
60
+ }
61
+ /**
62
+ * Render after an interaction action and attach a delta diff.
63
+ * Captures the pre-action snapshot (latest in store), renders post-action
64
+ * state, and computes a structural diff between them.
65
+ */
66
+ export async function renderAfterAction(deps) {
67
+ const preActionSnapshot = deps.snapshotStore.getLatest();
68
+ const representation = await renderActivePage(deps, { source: "action" });
69
+ // Compute delta if we have a pre-action snapshot to compare against
70
+ if (preActionSnapshot) {
71
+ const postSnapshotId = representation.snapshot_id;
72
+ representation.delta = diffRepresentations(preActionSnapshot.representation, representation, preActionSnapshot.id, postSnapshotId);
73
+ }
74
+ return representation;
75
+ }
76
+ /**
77
+ * Format a PageRepresentation as an MCP tool response.
78
+ */
79
+ export function formatPageResponse(representation) {
80
+ return {
81
+ content: [
82
+ {
83
+ type: "text",
84
+ text: JSON.stringify(representation, null, 2),
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ /**
90
+ * Format an array of interactive elements as an MCP tool response.
91
+ */
92
+ export function formatElementsResponse(elements) {
93
+ return {
94
+ content: [
95
+ {
96
+ type: "text",
97
+ text: JSON.stringify(elements, null, 2),
98
+ },
99
+ ],
100
+ };
101
+ }
102
+ /**
103
+ * Format a CharlotteError as an MCP tool error response.
104
+ */
105
+ export function formatErrorResponse(error) {
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: JSON.stringify(error.toResponse()),
111
+ },
112
+ ],
113
+ isError: true,
114
+ };
115
+ }
116
+ /**
117
+ * Wrap a tool handler to catch CharlotteErrors and unexpected errors,
118
+ * returning consistent error responses.
119
+ */
120
+ export function handleToolError(error) {
121
+ if (error instanceof CharlotteError) {
122
+ return formatErrorResponse(error);
123
+ }
124
+ const sessionError = new CharlotteError(CharlotteErrorCode.SESSION_ERROR, `Unexpected error: ${error instanceof Error ? error.message : String(error)}`);
125
+ return formatErrorResponse(sessionError);
126
+ }
127
+ //# sourceMappingURL=tool-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-helpers.js","sourceRoot":"","sources":["../../src/tools/tool-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type AutoSnapshotMode = "every_action" | "observe_only" | "manual";
2
+ export interface CharlotteConfig {
3
+ snapshotDepth: number;
4
+ autoSnapshot: AutoSnapshotMode;
5
+ }
6
+ export declare function createDefaultConfig(): CharlotteConfig;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,cAAc,GAAG,QAAQ,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAED,wBAAgB,mBAAmB,IAAI,eAAe,CAKrD"}
@@ -0,0 +1,7 @@
1
+ export function createDefaultConfig() {
2
+ return {
3
+ snapshotDepth: 50,
4
+ autoSnapshot: "every_action",
5
+ };
6
+ }
7
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,aAAa,EAAE,EAAE;QACjB,YAAY,EAAE,cAAc;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const TYPE_PREFIX_MAP: Record<string, string>;
2
+ export interface DOMPathSignature {
3
+ nearestLandmarkRole: string | null;
4
+ nearestLandmarkLabel: string | null;
5
+ nearestLabelledContainer: string | null;
6
+ siblingIndex: number;
7
+ }
8
+ //# sourceMappingURL=element-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-id.d.ts","sourceRoot":"","sources":["../../src/types/element-id.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBlD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC;CACtB"}