@monoes/monobrowse 1.0.13 → 1.0.14

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 (107) hide show
  1. package/dist/src/__tests__/bridge-instruments.test.d.ts +2 -0
  2. package/dist/src/__tests__/bridge-instruments.test.d.ts.map +1 -0
  3. package/dist/src/__tests__/bridge-instruments.test.js +132 -0
  4. package/dist/src/__tests__/bridge-instruments.test.js.map +1 -0
  5. package/dist/src/__tests__/bridge-transport.test.d.ts +2 -0
  6. package/dist/src/__tests__/bridge-transport.test.d.ts.map +1 -0
  7. package/dist/src/__tests__/bridge-transport.test.js +287 -0
  8. package/dist/src/__tests__/bridge-transport.test.js.map +1 -0
  9. package/dist/src/__tests__/cdp-transport.test.d.ts +2 -0
  10. package/dist/src/__tests__/cdp-transport.test.d.ts.map +1 -0
  11. package/dist/src/__tests__/cdp-transport.test.js +167 -0
  12. package/dist/src/__tests__/cdp-transport.test.js.map +1 -0
  13. package/dist/src/browser/bridge.d.ts +119 -0
  14. package/dist/src/browser/bridge.d.ts.map +1 -0
  15. package/dist/src/browser/bridge.js +264 -0
  16. package/dist/src/browser/bridge.js.map +1 -0
  17. package/dist/src/browser/cdp.d.ts +11 -1
  18. package/dist/src/browser/cdp.d.ts.map +1 -1
  19. package/dist/src/browser/cdp.js +60 -56
  20. package/dist/src/browser/cdp.js.map +1 -1
  21. package/dist/src/browser/index.d.ts +2 -0
  22. package/dist/src/browser/index.d.ts.map +1 -1
  23. package/dist/src/browser/index.js +2 -0
  24. package/dist/src/browser/index.js.map +1 -1
  25. package/dist/src/browser/transport.d.ts +62 -0
  26. package/dist/src/browser/transport.d.ts.map +1 -0
  27. package/dist/src/browser/transport.js +65 -0
  28. package/dist/src/browser/transport.js.map +1 -0
  29. package/dist/src/cli/commander-adapter.d.ts +16 -0
  30. package/dist/src/cli/commander-adapter.d.ts.map +1 -0
  31. package/dist/src/cli/commander-adapter.js +68 -0
  32. package/dist/src/cli/commander-adapter.js.map +1 -0
  33. package/dist/src/cli/commands-context.d.ts +14 -0
  34. package/dist/src/cli/commands-context.d.ts.map +1 -0
  35. package/dist/src/cli/commands-context.js +351 -0
  36. package/dist/src/cli/commands-context.js.map +1 -0
  37. package/dist/src/cli/commands-data.d.ts +12 -0
  38. package/dist/src/cli/commands-data.d.ts.map +1 -0
  39. package/dist/src/cli/commands-data.js +246 -0
  40. package/dist/src/cli/commands-data.js.map +1 -0
  41. package/dist/src/cli/commands-element.d.ts +15 -0
  42. package/dist/src/cli/commands-element.d.ts.map +1 -0
  43. package/dist/src/cli/commands-element.js +262 -0
  44. package/dist/src/cli/commands-element.js.map +1 -0
  45. package/dist/src/cli/commands-files.d.ts +9 -0
  46. package/dist/src/cli/commands-files.d.ts.map +1 -0
  47. package/dist/src/cli/commands-files.js +207 -0
  48. package/dist/src/cli/commands-files.js.map +1 -0
  49. package/dist/src/cli/commands-input.d.ts +26 -0
  50. package/dist/src/cli/commands-input.d.ts.map +1 -0
  51. package/dist/src/cli/commands-input.js +399 -0
  52. package/dist/src/cli/commands-input.js.map +1 -0
  53. package/dist/src/cli/commands-navigate.d.ts +12 -0
  54. package/dist/src/cli/commands-navigate.d.ts.map +1 -0
  55. package/dist/src/cli/commands-navigate.js +389 -0
  56. package/dist/src/cli/commands-navigate.js.map +1 -0
  57. package/dist/src/cli/commands-page.d.ts +25 -0
  58. package/dist/src/cli/commands-page.d.ts.map +1 -0
  59. package/dist/src/cli/commands-page.js +377 -0
  60. package/dist/src/cli/commands-page.js.map +1 -0
  61. package/dist/src/cli/commands-report.d.ts +8 -0
  62. package/dist/src/cli/commands-report.d.ts.map +1 -0
  63. package/dist/src/cli/commands-report.js +256 -0
  64. package/dist/src/cli/commands-report.js.map +1 -0
  65. package/dist/src/cli/commands-script.d.ts +43 -0
  66. package/dist/src/cli/commands-script.d.ts.map +1 -0
  67. package/dist/src/cli/commands-script.js +168 -0
  68. package/dist/src/cli/commands-script.js.map +1 -0
  69. package/dist/src/cli/commands-session.d.ts +15 -0
  70. package/dist/src/cli/commands-session.d.ts.map +1 -0
  71. package/dist/src/cli/commands-session.js +357 -0
  72. package/dist/src/cli/commands-session.js.map +1 -0
  73. package/dist/src/cli/commands-trace.d.ts +12 -0
  74. package/dist/src/cli/commands-trace.d.ts.map +1 -0
  75. package/dist/src/cli/commands-trace.js +347 -0
  76. package/dist/src/cli/commands-trace.js.map +1 -0
  77. package/dist/src/cli/commands.d.ts +22 -42
  78. package/dist/src/cli/commands.d.ts.map +1 -1
  79. package/dist/src/cli/commands.js +42 -3648
  80. package/dist/src/cli/commands.js.map +1 -1
  81. package/dist/src/cli/session.d.ts +47 -0
  82. package/dist/src/cli/session.d.ts.map +1 -0
  83. package/dist/src/cli/session.js +343 -0
  84. package/dist/src/cli/session.js.map +1 -0
  85. package/dist/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +1 -1
  87. package/src/__tests__/bridge-instruments.test.ts +180 -0
  88. package/src/__tests__/bridge-transport.test.ts +365 -0
  89. package/src/__tests__/cdp-transport.test.ts +198 -0
  90. package/src/browser/bridge.ts +354 -0
  91. package/src/browser/cdp.ts +57 -52
  92. package/src/browser/index.ts +2 -0
  93. package/src/browser/transport.ts +111 -0
  94. package/src/cli/commander-adapter.ts +65 -0
  95. package/src/cli/commands-context.ts +367 -0
  96. package/src/cli/commands-data.ts +248 -0
  97. package/src/cli/commands-element.ts +305 -0
  98. package/src/cli/commands-files.ts +248 -0
  99. package/src/cli/commands-input.ts +434 -0
  100. package/src/cli/commands-navigate.ts +442 -0
  101. package/src/cli/commands-page.ts +420 -0
  102. package/src/cli/commands-report.ts +275 -0
  103. package/src/cli/commands-script.ts +183 -0
  104. package/src/cli/commands-session.ts +376 -0
  105. package/src/cli/commands-trace.ts +349 -0
  106. package/src/cli/commands.ts +95 -3943
  107. package/src/cli/session.ts +412 -0
@@ -0,0 +1,351 @@
1
+ /**
2
+ * Browsing context — which page, frame or window the session currently acts
3
+ * on, and saving or restoring that context.
4
+ *
5
+ * `frame`/`tab`/`window` retarget the session (an OOPIF gets its own CDP
6
+ * sessionId, which is why the parent is saved for `frame main`). `state`
7
+ * persists cookies and storage so a later run can pick the context back up.
8
+ */
9
+ import { output } from './output.js';
10
+ import { ensureConnected, getBrowser, print, session } from './session.js';
11
+ export const stateCommand = {
12
+ name: 'state',
13
+ description: 'Manage browser session state. Usage: monomind browse state save|load|list|rename|clean [name]',
14
+ options: [
15
+ {
16
+ name: 'older-than',
17
+ type: 'number',
18
+ description: 'For state clean: remove sessions older than N days',
19
+ },
20
+ ],
21
+ action: async (ctx) => {
22
+ const browser = await getBrowser();
23
+ const action = ctx.args[0];
24
+ if (!action)
25
+ throw new Error('Usage: monomind browse state save|load|list [name]');
26
+ switch (action) {
27
+ case 'list': {
28
+ const sessions = await browser.listSessions();
29
+ if (sessions.length === 0) {
30
+ output.printInfo('No saved sessions');
31
+ }
32
+ else {
33
+ output.printInfo('Saved sessions:');
34
+ for (const s of sessions)
35
+ print(` ${s}`);
36
+ }
37
+ return { success: true, data: { sessions } };
38
+ }
39
+ case 'save': {
40
+ const { client, sessionId } = await ensureConnected(session.port);
41
+ const target = ctx.args[1];
42
+ if (!target)
43
+ throw new Error('Usage: monomind browse state save <name-or-file>');
44
+ const url = await browser.getCurrentUrl(client, sessionId);
45
+ const title = await browser.getCurrentTitle(client, sessionId);
46
+ if (target.endsWith('.json')) {
47
+ await browser.saveStateFile(client, sessionId, session.targetId, target, url, title);
48
+ output.printSuccess(`State saved to ${target}`);
49
+ }
50
+ else {
51
+ const path = await browser.saveSession(client, sessionId, session.targetId, target, url, title);
52
+ output.printSuccess(`Session "${target}" saved to ${path}`);
53
+ }
54
+ return { success: true };
55
+ }
56
+ case 'load': {
57
+ const { client, sessionId } = await ensureConnected(session.port);
58
+ const target = ctx.args[1];
59
+ if (!target)
60
+ throw new Error('Usage: monomind browse state load <name-or-file>');
61
+ if (target.endsWith('.json')) {
62
+ await browser.loadStateFile(client, sessionId, target);
63
+ }
64
+ else {
65
+ await browser.loadSession(client, sessionId, target);
66
+ }
67
+ output.printSuccess(`State loaded from ${target}`);
68
+ return { success: true };
69
+ }
70
+ case 'show': {
71
+ const { client: c, sessionId: sid } = await ensureConnected(session.port);
72
+ const url = await browser.getCurrentUrl(c, sid);
73
+ const title = await browser.getCurrentTitle(c, sid);
74
+ const cookies = await browser.getCookies(c, sid);
75
+ const ls = await browser.getAllLocalStorage(c, sid);
76
+ const info = {
77
+ url,
78
+ title,
79
+ cookies: cookies.length,
80
+ localStorage: Object.keys(ls).length,
81
+ refs: session.refs.size,
82
+ };
83
+ print(JSON.stringify(info, null, 2));
84
+ return { success: true, data: info };
85
+ }
86
+ case 'clear': {
87
+ const { client: c, sessionId: sid } = await ensureConnected(session.port);
88
+ await browser.clearCookies(c, sid);
89
+ await browser.clearLocalStorage(c, sid);
90
+ await browser.clearSessionStorage(c, sid);
91
+ session.refs = new Map();
92
+ await browser.clearRefCache();
93
+ output.printSuccess('Browser state cleared (cookies, localStorage, sessionStorage, refs)');
94
+ return { success: true };
95
+ }
96
+ case 'rename': {
97
+ const oldName = ctx.args[1];
98
+ const newName = ctx.args[2];
99
+ if (!oldName || !newName)
100
+ throw new Error('Usage: monomind browse state rename <old-name> <new-name>');
101
+ const sessions = await browser.listSessions();
102
+ if (!sessions.includes(oldName))
103
+ throw new Error(`Session not found: ${oldName}`);
104
+ // W1: validate newName to prevent path traversal
105
+ const { basename: basenameFn } = await import('node:path');
106
+ const safeName = basenameFn(newName);
107
+ if (safeName !== newName || safeName.startsWith('.') || safeName.includes('/')) {
108
+ throw new Error('Invalid session name — must not contain path separators or start with "."');
109
+ }
110
+ const { unlink: unlinkRename, readFile, writeFile, mkdir: mkdirRename, } = await import('node:fs/promises');
111
+ const { join: joinR } = await import('node:path');
112
+ const { homedir } = await import('node:os');
113
+ const sessionDir = joinR(homedir(), '.monomind', 'browser-sessions');
114
+ const oldPath = joinR(sessionDir, `${oldName}.json`);
115
+ const newPath = joinR(sessionDir, `${newName}.json`);
116
+ const data = JSON.parse(await readFile(oldPath, 'utf8'));
117
+ data.name = newName;
118
+ await mkdirRename(sessionDir, { recursive: true });
119
+ await writeFile(newPath, JSON.stringify(data, null, 2), 'utf8');
120
+ await unlinkRename(oldPath).catch(() => { }); // C1: delete old file (not rename to /dev/null)
121
+ output.printSuccess(`Session renamed: ${oldName} → ${newName}`);
122
+ return { success: true };
123
+ }
124
+ case 'clean': {
125
+ const days = ctx.flags['older-than'] ?? 7;
126
+ const { unlink, stat } = await import('node:fs/promises');
127
+ const { join: joinC } = await import('node:path');
128
+ const { homedir: homedirC } = await import('node:os');
129
+ const sessionDir = joinC(homedirC(), '.monomind', 'browser-sessions');
130
+ const sessions = await browser.listSessions();
131
+ const cutoff = Date.now() - days * 86400 * 1000;
132
+ let removed = 0;
133
+ for (const name of sessions) {
134
+ const p = joinC(sessionDir, `${name}.json`);
135
+ const s = await stat(p).catch(() => null);
136
+ if (s && s.mtimeMs < cutoff) {
137
+ await unlink(p).catch(() => { });
138
+ removed++;
139
+ }
140
+ }
141
+ output.printSuccess(`Cleaned ${removed} session(s) older than ${days} days`);
142
+ return { success: true, data: { removed } };
143
+ }
144
+ default:
145
+ throw new Error(`Unknown action: ${action}. Use: save|load|list|show|clear|rename|clean`);
146
+ }
147
+ },
148
+ };
149
+ export const frameCommand = {
150
+ name: 'frame',
151
+ description: 'Switch to iframe or back to main. Usage: monomind browse frame "#frame-id" | frame main',
152
+ action: async (ctx) => {
153
+ const { client, sessionId } = await ensureConnected(session.port);
154
+ const browser = await getBrowser();
155
+ const target = ctx.args[0];
156
+ if (!target)
157
+ throw new Error('Usage: monomind browse frame <selector>|main');
158
+ if (target === 'main') {
159
+ if (session.parentSessionId) {
160
+ // Detach from the OOPIF session (best-effort — it may already be gone)
161
+ await client
162
+ .send('Target.detachFromTarget', { sessionId: session.sessionId })
163
+ .catch(() => { });
164
+ session.sessionId = session.parentSessionId;
165
+ session.parentSessionId = '';
166
+ }
167
+ output.printSuccess('Switched to main frame');
168
+ }
169
+ else {
170
+ const frameResult = await browser.switchToFrame(client, sessionId, target);
171
+ if (frameResult.sessionId) {
172
+ // Save the parent session so `frame main` can restore it
173
+ session.parentSessionId = session.sessionId;
174
+ session.sessionId = frameResult.sessionId;
175
+ // Enable CDP domains on the iframe's session so subsequent commands work
176
+ await browser.enableSessionDomains(client, session.sessionId);
177
+ }
178
+ output.printSuccess(`Switched to frame: ${frameResult.url ?? target}`);
179
+ }
180
+ return { success: true };
181
+ },
182
+ };
183
+ export const tabCommand = {
184
+ name: 'tab',
185
+ description: 'Tab management. Usage: monomind browse tab list|new|close [url]',
186
+ options: [{ name: 'label', type: 'string', description: 'Label for new tab' }],
187
+ action: async (ctx) => {
188
+ const { client, sessionId } = await ensureConnected(session.port);
189
+ const browser = await getBrowser();
190
+ const action = ctx.args[0];
191
+ switch (action ?? 'list') {
192
+ case 'list': {
193
+ const tabs = await browser.listTabs(session.port);
194
+ for (const t of tabs)
195
+ print(` ${t.id}: ${t.title} (${t.url})`);
196
+ return { success: true, data: { tabs } };
197
+ }
198
+ case 'new': {
199
+ const url = ctx.args[1];
200
+ const tab = await browser.newTab(session.port, url);
201
+ output.printSuccess(`New tab: ${tab.id} ${url ?? ''}`);
202
+ return { success: true, data: { tab } };
203
+ }
204
+ case 'close': {
205
+ const tabId = ctx.args[1];
206
+ if (!tabId)
207
+ throw new Error('Usage: monomind browse tab close <tabId>');
208
+ if (tabId === session.targetId) {
209
+ const sid = session.sessionId;
210
+ // Stop profiling before closing the tab so CDP commands still reach the live session
211
+ if (browser.getHarStatus(sid).recording) {
212
+ try {
213
+ await browser.stopHarRecording(client, sid);
214
+ }
215
+ catch {
216
+ /* ignore */
217
+ }
218
+ }
219
+ if (browser.getTraceStatus(sid)) {
220
+ try {
221
+ await browser.stopTrace(client, sid);
222
+ }
223
+ catch {
224
+ /* ignore */
225
+ }
226
+ }
227
+ if (browser.isProfilingActive(sid)) {
228
+ try {
229
+ await browser.stopCpuProfile(client, sid);
230
+ }
231
+ catch {
232
+ /* ignore */
233
+ }
234
+ }
235
+ browser.teardownRouteInterception(sid);
236
+ browser.stopRequestCapture(sid);
237
+ browser.teardownDialogHandling(sid);
238
+ browser.teardownConsoleCapture(sid);
239
+ await browser.closeTab(client, sessionId, tabId);
240
+ client.close();
241
+ session.client = null;
242
+ session.sessionId = '';
243
+ session.parentSessionId = '';
244
+ session.targetId = '';
245
+ session.refs = new Map();
246
+ }
247
+ else {
248
+ await browser.closeTab(client, sessionId, tabId);
249
+ }
250
+ output.printSuccess(`Closed tab: ${tabId}`);
251
+ break;
252
+ }
253
+ default: {
254
+ // Attach to new tab FIRST — only tear down old session if that succeeds
255
+ const newSid = await browser.activateTab(client, sessionId, action);
256
+ const oldSid = session.sessionId;
257
+ if (browser.getHarStatus(oldSid).recording) {
258
+ try {
259
+ await browser.stopHarRecording(client, oldSid);
260
+ }
261
+ catch {
262
+ /* ignore */
263
+ }
264
+ }
265
+ if (browser.getTraceStatus(oldSid)) {
266
+ try {
267
+ await browser.stopTrace(client, oldSid);
268
+ }
269
+ catch {
270
+ /* ignore */
271
+ }
272
+ }
273
+ if (browser.isProfilingActive(oldSid)) {
274
+ try {
275
+ await browser.stopCpuProfile(client, oldSid);
276
+ }
277
+ catch {
278
+ /* ignore */
279
+ }
280
+ }
281
+ await browser.disableInterception(client, oldSid).catch(() => { });
282
+ browser.stopRequestCapture(oldSid);
283
+ browser.teardownDialogHandling(oldSid);
284
+ browser.teardownConsoleCapture(oldSid);
285
+ session.sessionId = newSid;
286
+ session.targetId = action;
287
+ session.refs = new Map();
288
+ await browser.enableSessionDomains(client, session.sessionId);
289
+ output.printSuccess(`Switched to tab: ${action}`);
290
+ }
291
+ }
292
+ return { success: true };
293
+ },
294
+ };
295
+ export const windowCommand = {
296
+ name: 'window',
297
+ description: 'Browser window management. Usage: monomind browse window new [url]',
298
+ action: async (ctx) => {
299
+ const { client, sessionId: _sid } = await ensureConnected(session.port);
300
+ const browser = await getBrowser();
301
+ const action = ctx.args[0];
302
+ if (!action || action === 'new') {
303
+ // Create isolated browser context (incognito-like) with a fresh page
304
+ const ctxResult = await client.send('Target.createBrowserContext', {}, undefined);
305
+ const browserContextId = ctxResult.browserContextId;
306
+ const url = ctx.args[1] || 'about:blank';
307
+ const targetResult = await client.send('Target.createTarget', { url, browserContextId }, undefined);
308
+ const targetId = targetResult.targetId;
309
+ const attachResult = await client.send('Target.attachToTarget', { targetId, flatten: true }, undefined);
310
+ const newSessionId = attachResult.sessionId;
311
+ // W3: fully tear down old session before switching
312
+ const oldSid = session.sessionId;
313
+ if (browser.getHarStatus(oldSid).recording) {
314
+ try {
315
+ await browser.stopHarRecording(client, oldSid);
316
+ }
317
+ catch {
318
+ /* ignore */
319
+ }
320
+ }
321
+ if (browser.getTraceStatus(oldSid)) {
322
+ try {
323
+ await browser.stopTrace(client, oldSid);
324
+ }
325
+ catch {
326
+ /* ignore */
327
+ }
328
+ }
329
+ if (browser.isProfilingActive(oldSid)) {
330
+ try {
331
+ await browser.stopCpuProfile(client, oldSid);
332
+ }
333
+ catch {
334
+ /* ignore */
335
+ }
336
+ }
337
+ browser.teardownRouteInterception(oldSid);
338
+ browser.stopRequestCapture(oldSid);
339
+ browser.teardownDialogHandling(oldSid);
340
+ browser.teardownConsoleCapture(oldSid);
341
+ session.sessionId = newSessionId;
342
+ session.targetId = targetId;
343
+ session.refs = new Map();
344
+ await browser.enableSessionDomains(client, session.sessionId);
345
+ output.printSuccess(`Opened new window (isolated context): ${targetId} [${url}]`);
346
+ return { success: true, data: { targetId, browserContextId, sessionId: newSessionId } };
347
+ }
348
+ throw new Error(`Unknown window action: ${action}. Use: new`);
349
+ },
350
+ };
351
+ //# sourceMappingURL=commands-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-context.js","sourceRoot":"","sources":["../../../src/cli/commands-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The browser's own data and event surfaces — localStorage/sessionStorage,
3
+ * cookies, the clipboard, dialogs, and the captured console/error logs.
4
+ */
5
+ import type { Command } from './types.js';
6
+ export declare const clipboardCommand: Command;
7
+ export declare const dialogCommand: Command;
8
+ export declare const consoleLogCommand: Command;
9
+ export declare const errorsCommand: Command;
10
+ export declare const storageCommand: Command;
11
+ export declare const cookiesCommand: Command;
12
+ //# sourceMappingURL=commands-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-data.d.ts","sourceRoot":"","sources":["../../../src/cli/commands-data.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,YAAY,CAAC;AAEzE,eAAO,MAAM,gBAAgB,EAAE,OAsC9B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OAiC3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,OA2B/B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OAwB3B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OA4D5B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OA8C5B,CAAC"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * The browser's own data and event surfaces — localStorage/sessionStorage,
3
+ * cookies, the clipboard, dialogs, and the captured console/error logs.
4
+ */
5
+ import { output } from './output.js';
6
+ import { ensureConnected, getBrowser, print, session } from './session.js';
7
+ export const clipboardCommand = {
8
+ name: 'clipboard',
9
+ description: 'Clipboard operations. Usage: monomind browse clipboard read|write|copy|paste',
10
+ action: async (ctx) => {
11
+ const { client, sessionId } = await ensureConnected(session.port);
12
+ const browser = await getBrowser();
13
+ const action = ctx.args[0];
14
+ switch (action) {
15
+ case 'read': {
16
+ const text = await browser.readClipboard(client, sessionId);
17
+ print(text);
18
+ return { success: true, data: { text } };
19
+ }
20
+ case 'write': {
21
+ const text = ctx.args[1];
22
+ if (!text)
23
+ throw new Error('Usage: monomind browse clipboard write "text"');
24
+ await browser.writeClipboard(client, sessionId, text);
25
+ output.printSuccess('Clipboard written');
26
+ break;
27
+ }
28
+ case 'copy': {
29
+ const mod = process.platform === 'darwin' ? 4 : 2; // Meta/Cmd on macOS, Ctrl elsewhere
30
+ await browser.pressKeyCombo(client, sessionId, 'c', mod);
31
+ output.printSuccess('Copy sent');
32
+ break;
33
+ }
34
+ case 'paste': {
35
+ const mod = process.platform === 'darwin' ? 4 : 2;
36
+ await browser.pressKeyCombo(client, sessionId, 'v', mod);
37
+ output.printSuccess('Paste sent');
38
+ break;
39
+ }
40
+ default:
41
+ throw new Error('Usage: monomind browse clipboard read|write|copy|paste');
42
+ }
43
+ return { success: true };
44
+ },
45
+ };
46
+ export const dialogCommand = {
47
+ name: 'dialog',
48
+ description: 'Handle browser dialogs. Usage: monomind browse dialog accept|dismiss|status',
49
+ action: async (ctx) => {
50
+ const { client, sessionId } = await ensureConnected(session.port);
51
+ const browser = await getBrowser();
52
+ const action = ctx.args[0];
53
+ switch (action) {
54
+ case 'accept': {
55
+ const text = ctx.args[1];
56
+ await browser.acceptDialog(client, sessionId, text);
57
+ output.printSuccess('Dialog accepted');
58
+ break;
59
+ }
60
+ case 'dismiss':
61
+ await browser.dismissDialog(client, sessionId);
62
+ output.printSuccess('Dialog dismissed');
63
+ break;
64
+ case 'status': {
65
+ const info = browser.getDialogStatus(sessionId);
66
+ if (info) {
67
+ print(`Dialog open: type=${info.type} message="${info.message}"`);
68
+ }
69
+ else {
70
+ print('No dialog open');
71
+ }
72
+ return { success: true, data: { dialog: info } };
73
+ }
74
+ default:
75
+ throw new Error('Usage: monomind browse dialog accept|dismiss|status');
76
+ }
77
+ return { success: true };
78
+ },
79
+ };
80
+ export const consoleLogCommand = {
81
+ name: 'console',
82
+ description: 'View captured console messages. Usage: monomind browse console [--clear] [--json]',
83
+ options: [
84
+ { name: 'clear', type: 'boolean', description: 'Clear console messages', default: false },
85
+ { name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
86
+ { name: 'errors-only', type: 'boolean', description: 'Show only errors', default: false },
87
+ ],
88
+ action: async (ctx) => {
89
+ const browser = await getBrowser();
90
+ if (ctx.flags.clear) {
91
+ browser.clearConsoleMessages(session.sessionId);
92
+ output.printSuccess('Console cleared');
93
+ return { success: true };
94
+ }
95
+ const allMsgs = browser.getConsoleMessages(session.sessionId);
96
+ const msgs = ctx.flags['errors-only'] ? allMsgs.filter((m) => m.type === 'error') : allMsgs;
97
+ if (ctx.flags.json) {
98
+ print(JSON.stringify(msgs));
99
+ }
100
+ else {
101
+ for (const m of msgs) {
102
+ const prefix = m.type === 'error' ? '[ERROR]' : m.type === 'warn' ? '[WARN]' : '[LOG]';
103
+ print(`${prefix} ${m.text}`);
104
+ }
105
+ }
106
+ return { success: true, data: { messages: msgs } };
107
+ },
108
+ };
109
+ export const errorsCommand = {
110
+ name: 'errors',
111
+ description: 'View page errors (uncaught JS exceptions). Usage: monomind browse errors [--clear]',
112
+ options: [
113
+ { name: 'clear', type: 'boolean', description: 'Clear errors', default: false },
114
+ { name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
115
+ ],
116
+ action: async (ctx) => {
117
+ const browser = await getBrowser();
118
+ if (ctx.flags.clear) {
119
+ browser.clearPageErrors(session.sessionId);
120
+ output.printSuccess('Errors cleared');
121
+ return { success: true };
122
+ }
123
+ const errs = browser.getPageErrors(session.sessionId);
124
+ if (ctx.flags.json) {
125
+ print(JSON.stringify(errs));
126
+ }
127
+ else if (errs.length === 0) {
128
+ output.printSuccess('No page errors');
129
+ }
130
+ else {
131
+ for (const e of errs)
132
+ print(`[ERROR] ${e.text} (${e.url}:${e.lineNumber})`);
133
+ }
134
+ return { success: true, data: { errors: errs } };
135
+ },
136
+ };
137
+ export const storageCommand = {
138
+ name: 'storage',
139
+ description: 'localStorage/sessionStorage management. Usage: monomind browse storage local|session [key] [--set val] [--clear]',
140
+ options: [
141
+ { name: 'set', type: 'string', description: 'Value to set for key' },
142
+ { name: 'clear', type: 'boolean', description: 'Clear all storage', default: false },
143
+ { name: 'remove', type: 'boolean', description: 'Remove a specific key', default: false },
144
+ { name: 'json', type: 'boolean', description: 'Output as JSON', default: false },
145
+ ],
146
+ action: async (ctx) => {
147
+ const { client, sessionId } = await ensureConnected(session.port);
148
+ const browser = await getBrowser();
149
+ const storageType = ctx.args[0];
150
+ const key = ctx.args[1];
151
+ if (!storageType)
152
+ throw new Error('Usage: monomind browse storage local|session [key]');
153
+ const isLocal = storageType === 'local';
154
+ if (ctx.flags.clear) {
155
+ if (isLocal)
156
+ await browser.clearLocalStorage(client, sessionId);
157
+ else
158
+ await browser.clearSessionStorage(client, sessionId);
159
+ output.printSuccess(`${storageType}Storage cleared`);
160
+ return { success: true };
161
+ }
162
+ if (key && ctx.flags.set !== undefined) {
163
+ if (isLocal)
164
+ await browser.setLocalStorageKey(client, sessionId, key, ctx.flags.set);
165
+ else
166
+ await browser.setSessionStorageKey(client, sessionId, key, ctx.flags.set);
167
+ output.printSuccess(`Set ${key}`);
168
+ return { success: true };
169
+ }
170
+ if (key && ctx.flags.remove) {
171
+ if (isLocal)
172
+ await browser.removeLocalStorageKey(client, sessionId, key);
173
+ else
174
+ await browser.removeSessionStorageKey(client, sessionId, key);
175
+ output.printSuccess(`Removed ${key}`);
176
+ return { success: true };
177
+ }
178
+ if (key) {
179
+ const val = isLocal
180
+ ? await browser.getLocalStorageKey(client, sessionId, key)
181
+ : await browser.getSessionStorageKey(client, sessionId, key);
182
+ if (ctx.flags.json)
183
+ print(JSON.stringify({ data: val }));
184
+ else
185
+ print(val ?? '(null)');
186
+ return { success: true, data: { value: val } };
187
+ }
188
+ const all = isLocal
189
+ ? await browser.getAllLocalStorage(client, sessionId)
190
+ : await browser.getAllSessionStorage(client, sessionId);
191
+ if (ctx.flags.json)
192
+ print(JSON.stringify(all));
193
+ else {
194
+ for (const [k, v] of Object.entries(all))
195
+ print(` ${k}: ${v}`);
196
+ }
197
+ return { success: true, data: { storage: all } };
198
+ },
199
+ };
200
+ export const cookiesCommand = {
201
+ name: 'cookies',
202
+ description: 'Cookie management. Usage: monomind browse cookies [list|set|clear]',
203
+ options: [
204
+ { name: 'name', type: 'string', description: 'Cookie name' },
205
+ { name: 'value', type: 'string', description: 'Cookie value' },
206
+ { name: 'domain', type: 'string', description: 'Cookie domain' },
207
+ { name: 'curl', type: 'string', description: 'Import cookies from cURL dump file' },
208
+ ],
209
+ action: async (ctx) => {
210
+ const { client, sessionId } = await ensureConnected(session.port);
211
+ const browser = await getBrowser();
212
+ const action = ctx.args[0] ?? 'list';
213
+ switch (action) {
214
+ case 'list': {
215
+ const cookies = await browser.getCookies(client, sessionId);
216
+ print(JSON.stringify(cookies, null, 2));
217
+ return { success: true, data: { cookies } };
218
+ }
219
+ case 'set': {
220
+ // Support both: cookies set --name n --value v AND cookies set <name> <value>
221
+ const name = ctx.flags.name ?? ctx.args[1];
222
+ const value = ctx.flags.value ?? ctx.args[2];
223
+ if (!name || value === undefined) {
224
+ throw new Error('Usage: monomind browse cookies set <name> <value> [--domain <d>]');
225
+ }
226
+ await browser.setCookies(client, sessionId, [
227
+ {
228
+ name,
229
+ value,
230
+ domain: ctx.flags.domain,
231
+ },
232
+ ]);
233
+ output.printSuccess(`Cookie set: ${name}`);
234
+ break;
235
+ }
236
+ case 'clear':
237
+ await browser.clearCookies(client, sessionId);
238
+ output.printSuccess('Cookies cleared');
239
+ break;
240
+ default:
241
+ throw new Error('Usage: monomind browse cookies list|set|clear');
242
+ }
243
+ return { success: true };
244
+ },
245
+ };
246
+ //# sourceMappingURL=commands-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-data.js","sourceRoot":"","sources":["../../../src/cli/commands-data.ts"],"names":[],"mappings":"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"}