agentmb 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 (91) hide show
  1. package/INSTALL.md +154 -0
  2. package/README.md +228 -0
  3. package/dist/audit/logger.d.ts +25 -0
  4. package/dist/audit/logger.d.ts.map +1 -0
  5. package/dist/audit/logger.js +56 -0
  6. package/dist/audit/logger.js.map +1 -0
  7. package/dist/browser/actions.d.ts +111 -0
  8. package/dist/browser/actions.d.ts.map +1 -0
  9. package/dist/browser/actions.js +291 -0
  10. package/dist/browser/actions.js.map +1 -0
  11. package/dist/browser/manager.d.ts +51 -0
  12. package/dist/browser/manager.d.ts.map +1 -0
  13. package/dist/browser/manager.js +233 -0
  14. package/dist/browser/manager.js.map +1 -0
  15. package/dist/cli/client.d.ts +13 -0
  16. package/dist/cli/client.d.ts.map +1 -0
  17. package/dist/cli/client.js +109 -0
  18. package/dist/cli/client.js.map +1 -0
  19. package/dist/cli/commands/actions.d.ts +3 -0
  20. package/dist/cli/commands/actions.d.ts.map +1 -0
  21. package/dist/cli/commands/actions.js +349 -0
  22. package/dist/cli/commands/actions.js.map +1 -0
  23. package/dist/cli/commands/pages.d.ts +3 -0
  24. package/dist/cli/commands/pages.d.ts.map +1 -0
  25. package/dist/cli/commands/pages.js +107 -0
  26. package/dist/cli/commands/pages.js.map +1 -0
  27. package/dist/cli/commands/route.d.ts +3 -0
  28. package/dist/cli/commands/route.d.ts.map +1 -0
  29. package/dist/cli/commands/route.js +72 -0
  30. package/dist/cli/commands/route.js.map +1 -0
  31. package/dist/cli/commands/session.d.ts +3 -0
  32. package/dist/cli/commands/session.d.ts.map +1 -0
  33. package/dist/cli/commands/session.js +57 -0
  34. package/dist/cli/commands/session.js.map +1 -0
  35. package/dist/cli/commands/start.d.ts +8 -0
  36. package/dist/cli/commands/start.d.ts.map +1 -0
  37. package/dist/cli/commands/start.js +66 -0
  38. package/dist/cli/commands/start.js.map +1 -0
  39. package/dist/cli/commands/status.d.ts +6 -0
  40. package/dist/cli/commands/status.d.ts.map +1 -0
  41. package/dist/cli/commands/status.js +25 -0
  42. package/dist/cli/commands/status.js.map +1 -0
  43. package/dist/cli/commands/stop.d.ts +6 -0
  44. package/dist/cli/commands/stop.d.ts.map +1 -0
  45. package/dist/cli/commands/stop.js +53 -0
  46. package/dist/cli/commands/stop.js.map +1 -0
  47. package/dist/cli/commands/trace.d.ts +3 -0
  48. package/dist/cli/commands/trace.d.ts.map +1 -0
  49. package/dist/cli/commands/trace.js +43 -0
  50. package/dist/cli/commands/trace.js.map +1 -0
  51. package/dist/cli/index.d.ts +3 -0
  52. package/dist/cli/index.d.ts.map +1 -0
  53. package/dist/cli/index.js +44 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/daemon/config.d.ts +25 -0
  56. package/dist/daemon/config.d.ts.map +1 -0
  57. package/dist/daemon/config.js +35 -0
  58. package/dist/daemon/config.js.map +1 -0
  59. package/dist/daemon/index.d.ts +7 -0
  60. package/dist/daemon/index.d.ts.map +1 -0
  61. package/dist/daemon/index.js +84 -0
  62. package/dist/daemon/index.js.map +1 -0
  63. package/dist/daemon/routes/actions.d.ts +5 -0
  64. package/dist/daemon/routes/actions.d.ts.map +1 -0
  65. package/dist/daemon/routes/actions.js +425 -0
  66. package/dist/daemon/routes/actions.js.map +1 -0
  67. package/dist/daemon/routes/sessions.d.ts +5 -0
  68. package/dist/daemon/routes/sessions.d.ts.map +1 -0
  69. package/dist/daemon/routes/sessions.js +507 -0
  70. package/dist/daemon/routes/sessions.js.map +1 -0
  71. package/dist/daemon/server.d.ts +6 -0
  72. package/dist/daemon/server.d.ts.map +1 -0
  73. package/dist/daemon/server.js +66 -0
  74. package/dist/daemon/server.js.map +1 -0
  75. package/dist/daemon/session.d.ts +52 -0
  76. package/dist/daemon/session.d.ts.map +1 -0
  77. package/dist/daemon/session.js +191 -0
  78. package/dist/daemon/session.js.map +1 -0
  79. package/dist/daemon/types.d.ts +17 -0
  80. package/dist/daemon/types.d.ts.map +1 -0
  81. package/dist/daemon/types.js +3 -0
  82. package/dist/daemon/types.js.map +1 -0
  83. package/dist/policy/engine.d.ts +43 -0
  84. package/dist/policy/engine.d.ts.map +1 -0
  85. package/dist/policy/engine.js +234 -0
  86. package/dist/policy/engine.js.map +1 -0
  87. package/dist/policy/types.d.ts +40 -0
  88. package/dist/policy/types.d.ts.map +1 -0
  89. package/dist/policy/types.js +53 -0
  90. package/dist/policy/types.js.map +1 -0
  91. package/package.json +61 -0
@@ -0,0 +1,507 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerSessionRoutes = registerSessionRoutes;
40
+ const crypto_1 = __importDefault(require("crypto"));
41
+ require("../types"); // T11: Fastify type augmentation
42
+ // ---------------------------------------------------------------------------
43
+ // T12: CDP error sanitization
44
+ // ---------------------------------------------------------------------------
45
+ /**
46
+ * Sanitize CDP error messages before returning them to callers.
47
+ * Removes internal file paths, stack frames, and truncates to 300 chars.
48
+ */
49
+ function sanitizeCdpError(raw) {
50
+ return raw
51
+ .replace(/\s*at\s+\S+\s*\([^)]*\)/g, '') // remove stack frames
52
+ .replace(/file:\/\/\/[^\s,)]+/g, '[internal]') // replace internal paths
53
+ .replace(/\n+/g, ' ')
54
+ .trim()
55
+ .slice(0, 300);
56
+ }
57
+ function registerSessionRoutes(server, registry) {
58
+ // POST /api/v1/sessions — create session
59
+ server.post('/api/v1/sessions', async (req, reply) => {
60
+ const { profile, headless = true, agent_id, accept_downloads = false } = req.body ?? {};
61
+ const manager = server.browserManager;
62
+ if (!manager) {
63
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
64
+ }
65
+ const id = registry.create({ profile, headless, agentId: agent_id });
66
+ try {
67
+ await manager.launchSession(id, { profile, headless, acceptDownloads: accept_downloads });
68
+ }
69
+ catch (err) {
70
+ // Use registry.close() so persist() is called and sessions.json stays clean
71
+ await registry.close(id);
72
+ return reply.code(500).send({ error: err.message });
73
+ }
74
+ const s = registry.get(id);
75
+ return reply.code(201).send({
76
+ session_id: s.id,
77
+ profile: s.profile,
78
+ headless: s.headless,
79
+ created_at: s.createdAt,
80
+ accept_downloads: manager.getAcceptDownloads(id),
81
+ });
82
+ });
83
+ // GET /api/v1/sessions — list (normalized to snake_case for SDK)
84
+ server.get('/api/v1/sessions', async () => {
85
+ return registry.list().map((s) => ({
86
+ session_id: s.id,
87
+ profile: s.profile,
88
+ headless: s.headless,
89
+ created_at: s.createdAt,
90
+ state: s.state,
91
+ agent_id: s.agentId ?? null,
92
+ }));
93
+ });
94
+ // GET /api/v1/sessions/:id
95
+ server.get('/api/v1/sessions/:id', async (req, reply) => {
96
+ const s = registry.get(req.params.id);
97
+ if (!s)
98
+ return reply.code(404).send({ error: 'Not found' });
99
+ return {
100
+ session_id: s.id,
101
+ profile: s.profile,
102
+ headless: s.headless,
103
+ created_at: s.createdAt,
104
+ state: s.state,
105
+ agent_id: s.agentId ?? null,
106
+ };
107
+ });
108
+ // DELETE /api/v1/sessions/:id
109
+ server.delete('/api/v1/sessions/:id', async (req, reply) => {
110
+ const s = registry.get(req.params.id);
111
+ if (!s)
112
+ return reply.code(404).send({ error: 'Not found' });
113
+ // Clean up BrowserManager internal state first, then registry
114
+ const manager = server.browserManager;
115
+ if (manager)
116
+ await manager.closeSession(req.params.id);
117
+ await registry.close(req.params.id);
118
+ return reply.code(204).send();
119
+ });
120
+ // POST /api/v1/sessions/:id/mode — switch headless/headed
121
+ server.post('/api/v1/sessions/:id/mode', async (req, reply) => {
122
+ const s = registry.get(req.params.id);
123
+ if (!s)
124
+ return reply.code(404).send({ error: 'Not found' });
125
+ const manager = server.browserManager;
126
+ if (!manager)
127
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
128
+ const { mode } = req.body;
129
+ await manager.switchMode(req.params.id, mode === 'headed');
130
+ return { session_id: req.params.id, mode };
131
+ });
132
+ // POST /api/v1/sessions/:id/handoff/start — open browser visually for human login
133
+ server.post('/api/v1/sessions/:id/handoff/start', async (req, reply) => {
134
+ const s = registry.get(req.params.id);
135
+ if (!s)
136
+ return reply.code(404).send({ error: 'Not found' });
137
+ const manager = server.browserManager;
138
+ if (!manager)
139
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
140
+ await manager.switchMode(req.params.id, true /* headed */);
141
+ return {
142
+ session_id: req.params.id,
143
+ mode: 'headed',
144
+ message: 'Browser is now visible. Complete login and POST to handoff/complete to resume automation.',
145
+ };
146
+ });
147
+ // POST /api/v1/sessions/:id/handoff/complete — return browser to headless after human login
148
+ server.post('/api/v1/sessions/:id/handoff/complete', async (req, reply) => {
149
+ const s = registry.get(req.params.id);
150
+ if (!s)
151
+ return reply.code(404).send({ error: 'Not found' });
152
+ const manager = server.browserManager;
153
+ if (!manager)
154
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
155
+ await manager.switchMode(req.params.id, false /* headless */);
156
+ return {
157
+ session_id: req.params.id,
158
+ mode: 'headless',
159
+ message: 'Session returned to headless mode. Automation can resume.',
160
+ };
161
+ });
162
+ // ---------------------------------------------------------------------------
163
+ // Multi-page management (T03)
164
+ // ---------------------------------------------------------------------------
165
+ // GET /api/v1/sessions/:id/pages — list all open pages in a session
166
+ server.get('/api/v1/sessions/:id/pages', async (req, reply) => {
167
+ const s = registry.get(req.params.id);
168
+ if (!s)
169
+ return reply.code(404).send({ error: 'Not found' });
170
+ const manager = server.browserManager;
171
+ if (!manager)
172
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
173
+ return { session_id: req.params.id, pages: manager.listPages(req.params.id) };
174
+ });
175
+ // POST /api/v1/sessions/:id/pages — open a new tab/page
176
+ server.post('/api/v1/sessions/:id/pages', async (req, reply) => {
177
+ const s = registry.get(req.params.id);
178
+ if (!s)
179
+ return reply.code(404).send({ error: 'Not found' });
180
+ const manager = server.browserManager;
181
+ if (!manager)
182
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
183
+ const page = await manager.createPage(req.params.id);
184
+ return reply.code(201).send({ session_id: req.params.id, ...page });
185
+ });
186
+ // POST /api/v1/sessions/:id/pages/switch — make a page the active target
187
+ server.post('/api/v1/sessions/:id/pages/switch', async (req, reply) => {
188
+ const s = registry.get(req.params.id);
189
+ if (!s)
190
+ return reply.code(404).send({ error: 'Not found' });
191
+ const manager = server.browserManager;
192
+ if (!manager)
193
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
194
+ try {
195
+ manager.switchPage(req.params.id, req.body.page_id);
196
+ }
197
+ catch (err) {
198
+ return reply.code(404).send({ error: err.message });
199
+ }
200
+ return { session_id: req.params.id, active_page_id: req.body.page_id };
201
+ });
202
+ // DELETE /api/v1/sessions/:id/pages/:pageId — close a page
203
+ server.delete('/api/v1/sessions/:id/pages/:pageId', async (req, reply) => {
204
+ const s = registry.get(req.params.id);
205
+ if (!s)
206
+ return reply.code(404).send({ error: 'Not found' });
207
+ const manager = server.browserManager;
208
+ if (manager) {
209
+ try {
210
+ await manager.closePage(req.params.id, req.params.pageId);
211
+ }
212
+ catch (err) {
213
+ // r05-c05 P2: last-page guard → 409 Conflict
214
+ if (err.code === 'LAST_PAGE') {
215
+ return reply.code(409).send({ error: err.message });
216
+ }
217
+ throw err;
218
+ }
219
+ }
220
+ return reply.code(204).send();
221
+ });
222
+ function getLogger() {
223
+ return server.auditLogger;
224
+ }
225
+ // GET /api/v1/sessions/:id/cdp — return CDP target info for the session's page
226
+ server.get('/api/v1/sessions/:id/cdp', async (req, reply) => {
227
+ const live = registry.getLive(req.params.id);
228
+ if ('notFound' in live)
229
+ return reply.code(404).send({ error: `Session not found: ${req.params.id}` });
230
+ if ('zombie' in live)
231
+ return reply.code(410).send({ error: 'Session browser is not running', state: 'zombie' });
232
+ const { context, page } = live;
233
+ const cdpSession = await context.newCDPSession(page);
234
+ try {
235
+ const { targetInfos } = await cdpSession.send('Target.getTargets');
236
+ getLogger()?.write({
237
+ session_id: req.params.id,
238
+ action_id: 'act_' + crypto_1.default.randomBytes(6).toString('hex'),
239
+ type: 'cdp',
240
+ action: 'cdp_info',
241
+ url: page.url(),
242
+ params: { method: 'Target.getTargets' },
243
+ result: { target_count: targetInfos.length },
244
+ });
245
+ return {
246
+ session_id: req.params.id,
247
+ url: page.url(),
248
+ targets: targetInfos,
249
+ };
250
+ }
251
+ finally {
252
+ await cdpSession.detach();
253
+ }
254
+ });
255
+ // ---------------------------------------------------------------------------
256
+ // T06: CDP WebSocket native URL
257
+ // ---------------------------------------------------------------------------
258
+ // GET /api/v1/sessions/:id/cdp/ws — return browser-level CDP WebSocket URL
259
+ server.get('/api/v1/sessions/:id/cdp/ws', async (req, reply) => {
260
+ const live = registry.getLive(req.params.id);
261
+ if ('notFound' in live)
262
+ return reply.code(404).send({ error: `Session not found: ${req.params.id}` });
263
+ if ('zombie' in live)
264
+ return reply.code(410).send({ error: 'Session browser is not running', state: 'zombie' });
265
+ const manager = server.browserManager;
266
+ if (!manager)
267
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
268
+ const wsUrl = manager.getCdpWsUrl(req.params.id);
269
+ getLogger()?.write({
270
+ session_id: req.params.id,
271
+ action_id: 'act_' + crypto_1.default.randomBytes(6).toString('hex'),
272
+ type: 'cdp',
273
+ action: 'cdp_ws_url',
274
+ url: live.page?.url?.() ?? '',
275
+ params: {},
276
+ result: { ws_available: wsUrl !== null },
277
+ });
278
+ return {
279
+ session_id: req.params.id,
280
+ browser_ws_url: wsUrl,
281
+ note: 'Connect directly to browser_ws_url for native CDP WebSocket access. Not proxied through daemon auth.',
282
+ };
283
+ });
284
+ // ---------------------------------------------------------------------------
285
+ // T07: Network route mock management
286
+ // ---------------------------------------------------------------------------
287
+ // GET /api/v1/sessions/:id/routes — list active route mocks
288
+ server.get('/api/v1/sessions/:id/routes', async (req, reply) => {
289
+ const s = registry.get(req.params.id);
290
+ if (!s)
291
+ return reply.code(404).send({ error: 'Not found' });
292
+ const manager = server.browserManager;
293
+ if (!manager)
294
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
295
+ return { session_id: req.params.id, routes: manager.listRoutes(req.params.id) };
296
+ });
297
+ // POST /api/v1/sessions/:id/route — register a route mock
298
+ server.post('/api/v1/sessions/:id/route', async (req, reply) => {
299
+ const s = registry.get(req.params.id);
300
+ if (!s)
301
+ return reply.code(404).send({ error: 'Not found' });
302
+ const manager = server.browserManager;
303
+ if (!manager)
304
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
305
+ const { pattern, mock } = req.body;
306
+ if (!pattern)
307
+ return reply.code(400).send({ error: 'pattern is required' });
308
+ try {
309
+ await manager.addRoute(req.params.id, pattern, mock ?? {});
310
+ getLogger()?.write({
311
+ session_id: req.params.id,
312
+ action_id: 'act_' + crypto_1.default.randomBytes(6).toString('hex'),
313
+ type: 'action',
314
+ action: 'route_add',
315
+ params: { pattern, mock },
316
+ result: { status: 'ok' },
317
+ });
318
+ return reply.code(201).send({ session_id: req.params.id, pattern, mock });
319
+ }
320
+ catch (err) {
321
+ return reply.code(400).send({ error: err.message });
322
+ }
323
+ });
324
+ // DELETE /api/v1/sessions/:id/route — remove a route mock
325
+ server.delete('/api/v1/sessions/:id/route', async (req, reply) => {
326
+ const s = registry.get(req.params.id);
327
+ if (!s)
328
+ return reply.code(404).send({ error: 'Not found' });
329
+ const manager = server.browserManager;
330
+ if (!manager)
331
+ return reply.code(503).send({ error: 'Browser manager not initialized' });
332
+ const { pattern } = req.body ?? {};
333
+ if (!pattern)
334
+ return reply.code(400).send({ error: 'pattern is required' });
335
+ await manager.removeRoute(req.params.id, pattern);
336
+ getLogger()?.write({
337
+ session_id: req.params.id,
338
+ action_id: 'act_' + crypto_1.default.randomBytes(6).toString('hex'),
339
+ type: 'action',
340
+ action: 'route_remove',
341
+ params: { pattern },
342
+ result: { status: 'ok' },
343
+ });
344
+ return reply.code(204).send();
345
+ });
346
+ // POST /api/v1/sessions/:id/cdp — send a single CDP command and return the result
347
+ server.post('/api/v1/sessions/:id/cdp', async (req, reply) => {
348
+ const live = registry.getLive(req.params.id);
349
+ if ('notFound' in live)
350
+ return reply.code(404).send({ error: `Session not found: ${req.params.id}` });
351
+ if ('zombie' in live)
352
+ return reply.code(410).send({ error: 'Session browser is not running', state: 'zombie' });
353
+ const { method, params = {}, purpose, operator } = req.body;
354
+ if (!method)
355
+ return reply.code(400).send({ error: 'method is required' });
356
+ const { context, page } = live;
357
+ const cdpSession = await context.newCDPSession(page);
358
+ try {
359
+ const result = await cdpSession.send(method, params);
360
+ getLogger()?.write({
361
+ session_id: req.params.id,
362
+ action_id: 'act_' + crypto_1.default.randomBytes(6).toString('hex'),
363
+ type: 'cdp',
364
+ action: 'cdp_send',
365
+ url: page.url(),
366
+ params: { method },
367
+ result: { status: 'ok' },
368
+ purpose,
369
+ operator,
370
+ });
371
+ return { result };
372
+ }
373
+ catch (err) {
374
+ // T12: log full error internally; return sanitized message to caller
375
+ getLogger()?.write({
376
+ session_id: req.params.id,
377
+ action_id: 'act_' + crypto_1.default.randomBytes(6).toString('hex'),
378
+ type: 'cdp',
379
+ action: 'cdp_send',
380
+ url: page.url(),
381
+ params: { method },
382
+ error: err.message, // full error in audit log
383
+ purpose,
384
+ operator,
385
+ });
386
+ return reply.code(400).send({ error: sanitizeCdpError(err.message) });
387
+ }
388
+ finally {
389
+ await cdpSession.detach();
390
+ }
391
+ });
392
+ // ---------------------------------------------------------------------------
393
+ // T08: Playwright trace export
394
+ // ---------------------------------------------------------------------------
395
+ // POST /api/v1/sessions/:id/trace/start — begin Playwright trace recording
396
+ server.post('/api/v1/sessions/:id/trace/start', async (req, reply) => {
397
+ const live = registry.getLive(req.params.id);
398
+ if ('notFound' in live)
399
+ return reply.code(404).send({ error: `Session not found: ${req.params.id}` });
400
+ if ('zombie' in live)
401
+ return reply.code(410).send({ error: 'Session browser is not running', state: 'zombie' });
402
+ const { screenshots = true, snapshots = true } = req.body ?? {};
403
+ const { context } = live;
404
+ try {
405
+ await context.tracing.start({ screenshots, snapshots });
406
+ return { session_id: req.params.id, tracing: true, screenshots, snapshots };
407
+ }
408
+ catch (err) {
409
+ return reply.code(400).send({ error: err.message });
410
+ }
411
+ });
412
+ // ---------------------------------------------------------------------------
413
+ // r06-c02: Per-session safety policy override
414
+ // ---------------------------------------------------------------------------
415
+ // POST /api/v1/sessions/:id/policy — override the safety policy for this session
416
+ server.post('/api/v1/sessions/:id/policy', async (req, reply) => {
417
+ const s = registry.get(req.params.id);
418
+ if (!s)
419
+ return reply.code(404).send({ error: 'Not found' });
420
+ const engine = server.policyEngine;
421
+ if (!engine)
422
+ return reply.code(503).send({ error: 'Policy engine not initialized' });
423
+ const profile = (req.body?.profile ?? 'safe');
424
+ const validProfiles = ['safe', 'permissive', 'disabled'];
425
+ if (!validProfiles.includes(profile)) {
426
+ return reply.code(400).send({ error: `Invalid profile '${profile}'. Valid values: ${validProfiles.join(', ')}` });
427
+ }
428
+ const overrides = req.body?.allow_sensitive_actions !== undefined
429
+ ? { allowSensitiveActions: req.body.allow_sensitive_actions }
430
+ : undefined;
431
+ engine.setSessionPolicy(req.params.id, profile, overrides);
432
+ const effective = engine.getSessionPolicy(req.params.id);
433
+ getLogger()?.write({
434
+ session_id: req.params.id,
435
+ action_id: 'act_' + crypto_1.default.randomBytes(6).toString('hex'),
436
+ type: 'policy',
437
+ action: 'policy_set',
438
+ params: { profile, allow_sensitive_actions: effective.allowSensitiveActions },
439
+ result: { status: 'ok' },
440
+ });
441
+ return {
442
+ session_id: req.params.id,
443
+ profile: effective.profile,
444
+ domain_min_interval_ms: effective.domainMinIntervalMs,
445
+ jitter_ms: effective.jitterMs,
446
+ cooldown_after_error_ms: effective.cooldownAfterErrorMs,
447
+ max_retries_per_domain: effective.maxRetriesPerDomain,
448
+ max_actions_per_minute: effective.maxActionsPerMinute,
449
+ allow_sensitive_actions: effective.allowSensitiveActions,
450
+ };
451
+ });
452
+ // GET /api/v1/sessions/:id/policy — get current policy for this session
453
+ server.get('/api/v1/sessions/:id/policy', async (req, reply) => {
454
+ const s = registry.get(req.params.id);
455
+ if (!s)
456
+ return reply.code(404).send({ error: 'Not found' });
457
+ const engine = server.policyEngine;
458
+ if (!engine)
459
+ return reply.code(503).send({ error: 'Policy engine not initialized' });
460
+ const effective = engine.getSessionPolicy(req.params.id);
461
+ return {
462
+ session_id: req.params.id,
463
+ profile: effective.profile,
464
+ domain_min_interval_ms: effective.domainMinIntervalMs,
465
+ jitter_ms: effective.jitterMs,
466
+ cooldown_after_error_ms: effective.cooldownAfterErrorMs,
467
+ max_retries_per_domain: effective.maxRetriesPerDomain,
468
+ max_actions_per_minute: effective.maxActionsPerMinute,
469
+ allow_sensitive_actions: effective.allowSensitiveActions,
470
+ };
471
+ });
472
+ // POST /api/v1/sessions/:id/trace/stop — stop trace and return base64-encoded ZIP
473
+ server.post('/api/v1/sessions/:id/trace/stop', async (req, reply) => {
474
+ const live = registry.getLive(req.params.id);
475
+ if ('notFound' in live)
476
+ return reply.code(404).send({ error: `Session not found: ${req.params.id}` });
477
+ if ('zombie' in live)
478
+ return reply.code(410).send({ error: 'Session browser is not running', state: 'zombie' });
479
+ const { context } = live;
480
+ const tmpPath = `/tmp/agentmb-trace-${req.params.id}.zip`;
481
+ try {
482
+ await context.tracing.stop({ path: tmpPath });
483
+ const { readFileSync, unlinkSync } = await Promise.resolve().then(() => __importStar(require('fs')));
484
+ const buffer = readFileSync(tmpPath);
485
+ unlinkSync(tmpPath);
486
+ const t0 = Date.now();
487
+ getLogger()?.write({
488
+ session_id: req.params.id,
489
+ action_id: 'act_' + crypto_1.default.randomBytes(6).toString('hex'),
490
+ type: 'action',
491
+ action: 'trace_export',
492
+ params: {},
493
+ result: { size_bytes: buffer.length },
494
+ });
495
+ return {
496
+ session_id: req.params.id,
497
+ data: buffer.toString('base64'),
498
+ format: 'zip',
499
+ size_bytes: buffer.length,
500
+ };
501
+ }
502
+ catch (err) {
503
+ return reply.code(400).send({ error: err.message });
504
+ }
505
+ });
506
+ }
507
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/daemon/routes/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ import { SessionRegistry } from './session';
3
+ import { DaemonConfig } from './config';
4
+ import './types';
5
+ export declare function buildServer(config: DaemonConfig, registry: SessionRegistry): FastifyInstance;
6
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAA;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC,OAAO,SAAS,CAAA;AAEhB,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,GAAG,eAAe,CA2D5F"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildServer = buildServer;
7
+ const fastify_1 = __importDefault(require("fastify"));
8
+ const sessions_1 = require("./routes/sessions");
9
+ const actions_1 = require("./routes/actions");
10
+ // T11: Fastify instance type augmentation — makes auditLogger/browserManager type-safe
11
+ require("./types");
12
+ function buildServer(config, registry) {
13
+ const server = (0, fastify_1.default)({
14
+ logger: {
15
+ level: config.logLevel,
16
+ ...(process.stdout.isTTY
17
+ ? {
18
+ transport: {
19
+ target: 'pino-pretty',
20
+ options: { colorize: true, translateTime: 'SYS:HH:MM:ss' },
21
+ },
22
+ }
23
+ : {}),
24
+ },
25
+ });
26
+ // API token authentication (optional — only enforced when AGENTMB_API_TOKEN is set)
27
+ if (config.apiToken) {
28
+ server.addHook('preHandler', async (req, reply) => {
29
+ // Skip auth for health check
30
+ if (req.url === '/health')
31
+ return;
32
+ const xToken = req.headers['x-api-token'];
33
+ const authHeader = req.headers['authorization'];
34
+ const bearerToken = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : undefined;
35
+ const provided = xToken ?? bearerToken;
36
+ if (provided !== config.apiToken) {
37
+ reply.code(401).send({ error: 'Unauthorized — provide X-API-Token or Authorization: Bearer <token>' });
38
+ }
39
+ });
40
+ }
41
+ // Health check — always accessible (auth-exempt)
42
+ server.get('/health', async () => {
43
+ return {
44
+ status: 'ok',
45
+ version: '0.1.0',
46
+ uptime_s: Math.floor(process.uptime()),
47
+ sessions_active: registry.count(),
48
+ };
49
+ });
50
+ server.get('/api/v1/status', async () => {
51
+ return {
52
+ pid: process.pid,
53
+ uptime_s: Math.floor(process.uptime()),
54
+ sessions: registry.list().map((s) => ({
55
+ id: s.id,
56
+ profile: s.profile,
57
+ headless: s.headless,
58
+ created_at: s.createdAt,
59
+ })),
60
+ };
61
+ });
62
+ (0, sessions_1.registerSessionRoutes)(server, registry);
63
+ (0, actions_1.registerActionRoutes)(server, registry);
64
+ return server;
65
+ }
66
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":";;;;;AAQA,kCA2DC;AAnED,sDAAgF;AAEhF,gDAAyD;AACzD,8CAAuD;AAEvD,uFAAuF;AACvF,mBAAgB;AAEhB,SAAgB,WAAW,CAAC,MAAoB,EAAE,QAAyB;IACzE,MAAM,MAAM,GAAG,IAAA,iBAAO,EAAC;QACrB,MAAM,EAAE;YACN,KAAK,EAAE,MAAM,CAAC,QAAQ;YACtB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;gBACtB,CAAC,CAAC;oBACE,SAAS,EAAE;wBACT,MAAM,EAAE,aAAa;wBACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE;qBAC3D;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;KACF,CAAC,CAAA;IAEF,oFAAoF;IACpF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;YAC9E,6BAA6B;YAC7B,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;gBAAE,OAAM;YAEjC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAuB,CAAA;YAC/D,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAuB,CAAA;YACrE,MAAM,WAAW,GAAG,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACvF,MAAM,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAA;YAEtC,IAAI,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qEAAqE,EAAE,CAAC,CAAA;YACxG,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACtC,eAAe,EAAE,QAAQ,CAAC,KAAK,EAAE;SAClC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QACtC,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACtC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,UAAU,EAAE,CAAC,CAAC,SAAS;aACxB,CAAC,CAAC;SACJ,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAA,gCAAqB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACvC,IAAA,8BAAoB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAEtC,OAAO,MAAM,CAAA;AACf,CAAC"}