@ytspar/sweetlink 1.13.0 → 1.14.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 (78) hide show
  1. package/README.md +91 -12
  2. package/claude-skills/screenshot/SKILL.md +121 -20
  3. package/dist/cli/outputSchemas.d.ts +16 -0
  4. package/dist/cli/outputSchemas.d.ts.map +1 -1
  5. package/dist/cli/outputSchemas.js +33 -0
  6. package/dist/cli/outputSchemas.js.map +1 -1
  7. package/dist/cli/sweetlink-dev.js +0 -0
  8. package/dist/cli/sweetlink.js +347 -11
  9. package/dist/cli/sweetlink.js.map +1 -1
  10. package/dist/daemon/browser.d.ts +51 -0
  11. package/dist/daemon/browser.d.ts.map +1 -0
  12. package/dist/daemon/browser.js +153 -0
  13. package/dist/daemon/browser.js.map +1 -0
  14. package/dist/daemon/client.d.ts +32 -0
  15. package/dist/daemon/client.d.ts.map +1 -0
  16. package/dist/daemon/client.js +133 -0
  17. package/dist/daemon/client.js.map +1 -0
  18. package/dist/daemon/cursor.d.ts +15 -0
  19. package/dist/daemon/cursor.d.ts.map +1 -0
  20. package/dist/daemon/cursor.js +76 -0
  21. package/dist/daemon/cursor.js.map +1 -0
  22. package/dist/daemon/devices.d.ts +39 -0
  23. package/dist/daemon/devices.d.ts.map +1 -0
  24. package/dist/daemon/devices.js +101 -0
  25. package/dist/daemon/devices.js.map +1 -0
  26. package/dist/daemon/diff.d.ts +20 -0
  27. package/dist/daemon/diff.d.ts.map +1 -0
  28. package/dist/daemon/diff.js +181 -0
  29. package/dist/daemon/diff.js.map +1 -0
  30. package/dist/daemon/evidence.d.ts +29 -0
  31. package/dist/daemon/evidence.d.ts.map +1 -0
  32. package/dist/daemon/evidence.js +130 -0
  33. package/dist/daemon/evidence.js.map +1 -0
  34. package/dist/daemon/index.d.ts +10 -0
  35. package/dist/daemon/index.d.ts.map +1 -0
  36. package/dist/daemon/index.js +90 -0
  37. package/dist/daemon/index.js.map +1 -0
  38. package/dist/daemon/listeners.d.ts +55 -0
  39. package/dist/daemon/listeners.d.ts.map +1 -0
  40. package/dist/daemon/listeners.js +129 -0
  41. package/dist/daemon/listeners.js.map +1 -0
  42. package/dist/daemon/recording.d.ts +44 -0
  43. package/dist/daemon/recording.d.ts.map +1 -0
  44. package/dist/daemon/recording.js +133 -0
  45. package/dist/daemon/recording.js.map +1 -0
  46. package/dist/daemon/refs.d.ts +70 -0
  47. package/dist/daemon/refs.d.ts.map +1 -0
  48. package/dist/daemon/refs.js +185 -0
  49. package/dist/daemon/refs.js.map +1 -0
  50. package/dist/daemon/ringBuffer.d.ts +26 -0
  51. package/dist/daemon/ringBuffer.d.ts.map +1 -0
  52. package/dist/daemon/ringBuffer.js +54 -0
  53. package/dist/daemon/ringBuffer.js.map +1 -0
  54. package/dist/daemon/server.d.ts +23 -0
  55. package/dist/daemon/server.d.ts.map +1 -0
  56. package/dist/daemon/server.js +508 -0
  57. package/dist/daemon/server.js.map +1 -0
  58. package/dist/daemon/session.d.ts +41 -0
  59. package/dist/daemon/session.d.ts.map +1 -0
  60. package/dist/daemon/session.js +8 -0
  61. package/dist/daemon/session.js.map +1 -0
  62. package/dist/daemon/stateFile.d.ts +49 -0
  63. package/dist/daemon/stateFile.d.ts.map +1 -0
  64. package/dist/daemon/stateFile.js +162 -0
  65. package/dist/daemon/stateFile.js.map +1 -0
  66. package/dist/daemon/types.d.ts +72 -0
  67. package/dist/daemon/types.d.ts.map +1 -0
  68. package/dist/daemon/types.js +28 -0
  69. package/dist/daemon/types.js.map +1 -0
  70. package/dist/daemon/viewer.d.ts +33 -0
  71. package/dist/daemon/viewer.d.ts.map +1 -0
  72. package/dist/daemon/viewer.js +226 -0
  73. package/dist/daemon/viewer.js.map +1 -0
  74. package/dist/daemon/visualDiff.d.ts +34 -0
  75. package/dist/daemon/visualDiff.d.ts.map +1 -0
  76. package/dist/daemon/visualDiff.js +80 -0
  77. package/dist/daemon/visualDiff.js.map +1 -0
  78. package/package.json +20 -12
@@ -0,0 +1,508 @@
1
+ /**
2
+ * Daemon HTTP Server
3
+ *
4
+ * Localhost-only HTTP server with bearer token auth.
5
+ * Routes POST requests to /api/{action} and dispatches to handlers.
6
+ * Manages idle timer for auto-shutdown.
7
+ */
8
+ import { createServer } from 'http';
9
+ import { closeBrowser, getPage, initBrowser, takeResponsiveScreenshots, takeScreenshot } from './browser.js';
10
+ import { annotateScreenshot, diffSnapshots } from './diff.js';
11
+ import { takeDeviceScreenshots } from './devices.js';
12
+ import { consoleBuffer, dialogBuffer, formatConsoleEntries, formatNetworkEntries, getErrorCount, getWarningCount, networkBuffer, } from './listeners.js';
13
+ import { getRecordingStatus, isRecording, logAction, startRecording, stopRecording } from './recording.js';
14
+ import { generateViewer } from './viewer.js';
15
+ import { visualDiff } from './visualDiff.js';
16
+ import { buildRefMap, checkRefStale, formatRefMap, getBaseline, getCurrentRefMap, resolveRef, setBaseline, } from './refs.js';
17
+ import { DAEMON_IDLE_TIMEOUT_MS, DEFAULT_RESPONSIVE_VIEWPORTS } from './types.js';
18
+ // ============================================================================
19
+ // State
20
+ // ============================================================================
21
+ let httpServer = null;
22
+ let idleTimer = null;
23
+ let shutdownCallback = null;
24
+ // ============================================================================
25
+ // Idle Timer
26
+ // ============================================================================
27
+ function resetIdleTimer() {
28
+ if (idleTimer)
29
+ clearTimeout(idleTimer);
30
+ idleTimer = setTimeout(() => {
31
+ console.error('[Daemon] Idle timeout reached. Shutting down...');
32
+ shutdown();
33
+ }, DAEMON_IDLE_TIMEOUT_MS);
34
+ }
35
+ // ============================================================================
36
+ // Action Handlers
37
+ // ============================================================================
38
+ async function handlePing() {
39
+ return { ok: true, data: { pong: true, timestamp: Date.now() } };
40
+ }
41
+ async function handleShutdown() {
42
+ // Schedule shutdown after response is sent
43
+ setTimeout(() => shutdown(), 100);
44
+ return { ok: true, data: { message: 'Daemon shutting down' } };
45
+ }
46
+ async function handleScreenshot(params, url) {
47
+ await initBrowser(url);
48
+ const { buffer, width, height } = await takeScreenshot({
49
+ selector: params.selector,
50
+ fullPage: params.fullPage,
51
+ viewport: params.viewport,
52
+ });
53
+ return {
54
+ ok: true,
55
+ data: {
56
+ screenshot: buffer.toString('base64'),
57
+ width,
58
+ height,
59
+ },
60
+ };
61
+ }
62
+ async function handleResponsiveScreenshot(params, url) {
63
+ await initBrowser(url);
64
+ const viewports = params.viewports ?? DEFAULT_RESPONSIVE_VIEWPORTS;
65
+ const results = await takeResponsiveScreenshots({
66
+ viewports,
67
+ fullPage: params.fullPage,
68
+ });
69
+ return {
70
+ ok: true,
71
+ data: {
72
+ screenshots: results.map((r) => ({
73
+ width: r.width,
74
+ height: r.height,
75
+ screenshot: r.buffer.toString('base64'),
76
+ label: r.label,
77
+ })),
78
+ },
79
+ };
80
+ }
81
+ // ============================================================================
82
+ // Ref System Handlers
83
+ // ============================================================================
84
+ async function handleSnapshot(params, url) {
85
+ await initBrowser(url);
86
+ const page = getPage();
87
+ const interactive = params.interactive;
88
+ const diff = params.diff;
89
+ const annotate = params.annotate;
90
+ // If diffing, we need the baseline before taking new snapshot
91
+ const baseline = diff ? getBaseline() : null;
92
+ const resolved = await buildRefMap(page, { interactive: interactive !== false });
93
+ // Handle diff mode
94
+ if (diff) {
95
+ if (!baseline) {
96
+ return {
97
+ ok: false,
98
+ error: 'No baseline snapshot to diff against. Run `snapshot` first, then make changes, then `snapshot -D`.',
99
+ };
100
+ }
101
+ const diffText = diffSnapshots(baseline, resolved);
102
+ setBaseline(); // Update baseline for next diff
103
+ return {
104
+ ok: true,
105
+ data: {
106
+ diff: diffText,
107
+ tree: formatRefMap(resolved),
108
+ refs: resolved.entries,
109
+ count: resolved.entries.length,
110
+ },
111
+ };
112
+ }
113
+ // Handle annotated screenshot mode
114
+ if (annotate) {
115
+ const currentRefs = getCurrentRefMap();
116
+ if (!currentRefs || currentRefs.entries.length === 0) {
117
+ return { ok: false, error: 'No refs to annotate. Run `snapshot -i` first.' };
118
+ }
119
+ const buffer = await annotateScreenshot(page, currentRefs);
120
+ setBaseline();
121
+ return {
122
+ ok: true,
123
+ data: {
124
+ screenshot: buffer.toString('base64'),
125
+ tree: formatRefMap(resolved),
126
+ refs: resolved.entries,
127
+ count: resolved.entries.length,
128
+ },
129
+ };
130
+ }
131
+ // Default: set as baseline for future diffs
132
+ setBaseline();
133
+ return {
134
+ ok: true,
135
+ data: {
136
+ tree: formatRefMap(resolved),
137
+ refs: resolved.entries,
138
+ count: resolved.entries.length,
139
+ rawSnapshot: resolved.rawSnapshot,
140
+ },
141
+ };
142
+ }
143
+ async function handleClickRef(params, url) {
144
+ await initBrowser(url);
145
+ const page = getPage();
146
+ const ref = params.ref;
147
+ if (!ref)
148
+ return { ok: false, error: 'Missing ref parameter' };
149
+ const stale = await checkRefStale(page, ref);
150
+ if (stale) {
151
+ return {
152
+ ok: false,
153
+ error: `Ref ${ref} is stale — element no longer exists. Run \`snapshot\` to get fresh refs.`,
154
+ };
155
+ }
156
+ const locator = resolveRef(page, ref);
157
+ const box = await locator.boundingBox();
158
+ await locator.click();
159
+ // Log action if recording
160
+ if (isRecording()) {
161
+ await logAction('click', [ref], page, box ?? undefined);
162
+ }
163
+ return { ok: true, data: { clicked: ref } };
164
+ }
165
+ async function handleFillRef(params, url) {
166
+ await initBrowser(url);
167
+ const page = getPage();
168
+ const ref = params.ref;
169
+ const value = params.value;
170
+ if (!ref)
171
+ return { ok: false, error: 'Missing ref parameter' };
172
+ if (value === undefined)
173
+ return { ok: false, error: 'Missing value parameter' };
174
+ const stale = await checkRefStale(page, ref);
175
+ if (stale) {
176
+ return {
177
+ ok: false,
178
+ error: `Ref ${ref} is stale — element no longer exists. Run \`snapshot\` to get fresh refs.`,
179
+ };
180
+ }
181
+ const locator = resolveRef(page, ref);
182
+ const box = await locator.boundingBox();
183
+ await locator.fill(value);
184
+ if (isRecording()) {
185
+ await logAction('fill', [ref, value], page, box ?? undefined);
186
+ }
187
+ return { ok: true, data: { filled: ref, value } };
188
+ }
189
+ async function handleHoverRef(params, url) {
190
+ await initBrowser(url);
191
+ const page = getPage();
192
+ const ref = params.ref;
193
+ if (!ref)
194
+ return { ok: false, error: 'Missing ref parameter' };
195
+ const stale = await checkRefStale(page, ref);
196
+ if (stale) {
197
+ return {
198
+ ok: false,
199
+ error: `Ref ${ref} is stale — element no longer exists. Run \`snapshot\` to get fresh refs.`,
200
+ };
201
+ }
202
+ const locator = resolveRef(page, ref);
203
+ await locator.hover();
204
+ return { ok: true, data: { hovered: ref } };
205
+ }
206
+ async function handlePressKey(params, url) {
207
+ await initBrowser(url);
208
+ const page = getPage();
209
+ const key = params.key;
210
+ if (!key)
211
+ return { ok: false, error: 'Missing key parameter' };
212
+ await page.keyboard.press(key);
213
+ return { ok: true, data: { pressed: key } };
214
+ }
215
+ // ============================================================================
216
+ // Ring Buffer Handlers
217
+ // ============================================================================
218
+ async function handleConsoleRead(params) {
219
+ const errorsOnly = params.errors;
220
+ const last = params.last;
221
+ let entries = errorsOnly
222
+ ? consoleBuffer.filter((e) => e.level === 'error')
223
+ : consoleBuffer.toArray();
224
+ if (last) {
225
+ entries = entries.slice(-last);
226
+ }
227
+ return {
228
+ ok: true,
229
+ data: {
230
+ entries,
231
+ formatted: formatConsoleEntries(entries),
232
+ total: consoleBuffer.size,
233
+ errorCount: getErrorCount(),
234
+ warningCount: getWarningCount(),
235
+ },
236
+ };
237
+ }
238
+ async function handleNetworkRead(params) {
239
+ const failedOnly = params.failed;
240
+ const last = params.last;
241
+ let entries = failedOnly
242
+ ? networkBuffer.filter((e) => e.status >= 400 || e.status === 0)
243
+ : networkBuffer.toArray();
244
+ if (last) {
245
+ entries = entries.slice(-last);
246
+ }
247
+ return {
248
+ ok: true,
249
+ data: {
250
+ entries,
251
+ formatted: formatNetworkEntries(entries),
252
+ total: networkBuffer.size,
253
+ failedCount: networkBuffer.filter((e) => e.status >= 400 || e.status === 0).length,
254
+ },
255
+ };
256
+ }
257
+ async function handleDialogRead() {
258
+ const entries = dialogBuffer.toArray();
259
+ return {
260
+ ok: true,
261
+ data: { entries, total: dialogBuffer.size },
262
+ };
263
+ }
264
+ async function handleScreenshotDevices(params, url) {
265
+ await initBrowser(url);
266
+ const page = getPage();
267
+ const devices = params.devices;
268
+ if (!devices || devices.length === 0) {
269
+ return { ok: false, error: 'Missing devices parameter' };
270
+ }
271
+ const results = await takeDeviceScreenshots(page, devices, {
272
+ fullPage: params.fullPage,
273
+ });
274
+ return {
275
+ ok: true,
276
+ data: {
277
+ screenshots: results.map((r) => ({
278
+ device: r.device.name,
279
+ width: r.device.viewport.width,
280
+ height: r.device.viewport.height,
281
+ screenshot: r.buffer.toString('base64'),
282
+ })),
283
+ },
284
+ };
285
+ }
286
+ async function handleRecordStart(url) {
287
+ await initBrowser(url);
288
+ const page = getPage();
289
+ const result = await startRecording(page, '.sweetlink');
290
+ return { ok: true, data: { sessionId: result.sessionId } };
291
+ }
292
+ async function handleRecordStop() {
293
+ const manifest = await stopRecording();
294
+ if (!manifest) {
295
+ return { ok: false, error: 'No recording in progress' };
296
+ }
297
+ // Auto-generate viewer HTML
298
+ const sessionDir = `.sweetlink/${manifest.sessionId}`;
299
+ try {
300
+ const viewerPath = await generateViewer(manifest, {
301
+ sessionDir,
302
+ consoleEntries: consoleBuffer.toArray(),
303
+ networkEntries: networkBuffer.toArray(),
304
+ });
305
+ return { ok: true, data: { manifest, viewerPath } };
306
+ }
307
+ catch {
308
+ // Viewer generation is optional — still return the manifest
309
+ return { ok: true, data: { manifest } };
310
+ }
311
+ }
312
+ async function handleRecordStatus() {
313
+ const status = getRecordingStatus();
314
+ return { ok: true, data: status };
315
+ }
316
+ async function handleGenerateViewer(params) {
317
+ const sessionDir = params.sessionDir;
318
+ const outputPath = params.outputPath;
319
+ if (!sessionDir)
320
+ return { ok: false, error: 'Missing sessionDir parameter' };
321
+ try {
322
+ const { promises: fsp } = await import('fs');
323
+ const manifestRaw = await fsp.readFile(`${sessionDir}/sweetlink-session.json`, 'utf-8');
324
+ const manifest = JSON.parse(manifestRaw);
325
+ const viewerPath = await generateViewer(manifest, {
326
+ sessionDir,
327
+ outputPath,
328
+ consoleEntries: consoleBuffer.toArray(),
329
+ networkEntries: networkBuffer.toArray(),
330
+ });
331
+ return { ok: true, data: { viewerPath } };
332
+ }
333
+ catch (error) {
334
+ return { ok: false, error: `Failed to generate viewer: ${error instanceof Error ? error.message : error}` };
335
+ }
336
+ }
337
+ async function handleVisualDiff(params) {
338
+ const baseline = params.baseline;
339
+ const current = params.current;
340
+ const threshold = params.threshold;
341
+ if (!baseline || !current) {
342
+ return { ok: false, error: 'Missing baseline or current parameter (base64 encoded PNG)' };
343
+ }
344
+ const baselineBuffer = Buffer.from(baseline, 'base64');
345
+ const currentBuffer = Buffer.from(current, 'base64');
346
+ const result = await visualDiff(baselineBuffer, currentBuffer, { threshold });
347
+ return {
348
+ ok: true,
349
+ data: {
350
+ mismatchPercentage: result.mismatchPercentage,
351
+ mismatchCount: result.mismatchCount,
352
+ totalPixels: result.totalPixels,
353
+ pass: result.pass,
354
+ },
355
+ };
356
+ }
357
+ // ============================================================================
358
+ // Request Handling
359
+ // ============================================================================
360
+ async function handleRequest(action, params, url) {
361
+ switch (action) {
362
+ case 'ping':
363
+ return handlePing();
364
+ case 'shutdown':
365
+ return handleShutdown();
366
+ case 'screenshot':
367
+ return handleScreenshot(params, url);
368
+ case 'screenshot-responsive':
369
+ return handleResponsiveScreenshot(params, url);
370
+ case 'snapshot':
371
+ return handleSnapshot(params, url);
372
+ case 'click-ref':
373
+ return handleClickRef(params, url);
374
+ case 'fill-ref':
375
+ return handleFillRef(params, url);
376
+ case 'hover-ref':
377
+ return handleHoverRef(params, url);
378
+ case 'press-key':
379
+ return handlePressKey(params, url);
380
+ case 'console-read':
381
+ return handleConsoleRead(params);
382
+ case 'network-read':
383
+ return handleNetworkRead(params);
384
+ case 'dialog-read':
385
+ return handleDialogRead();
386
+ case 'screenshot-devices':
387
+ return handleScreenshotDevices(params, url);
388
+ case 'visual-diff':
389
+ return handleVisualDiff(params);
390
+ case 'record-start':
391
+ return handleRecordStart(url);
392
+ case 'record-stop':
393
+ return handleRecordStop();
394
+ case 'record-status':
395
+ return handleRecordStatus();
396
+ case 'generate-viewer':
397
+ return handleGenerateViewer(params);
398
+ default:
399
+ return { ok: false, error: `Unknown action: ${action}` };
400
+ }
401
+ }
402
+ function readBody(req) {
403
+ return new Promise((resolve, reject) => {
404
+ const chunks = [];
405
+ let size = 0;
406
+ const MAX_BODY = 1024 * 1024; // 1MB max
407
+ req.on('data', (chunk) => {
408
+ size += chunk.length;
409
+ if (size > MAX_BODY) {
410
+ req.destroy();
411
+ reject(new Error('Request body too large'));
412
+ return;
413
+ }
414
+ chunks.push(chunk);
415
+ });
416
+ req.on('end', () => resolve(Buffer.concat(chunks).toString()));
417
+ req.on('error', reject);
418
+ });
419
+ }
420
+ function sendJson(res, status, body) {
421
+ res.writeHead(status, { 'Content-Type': 'application/json' });
422
+ res.end(JSON.stringify(body));
423
+ }
424
+ /**
425
+ * Start the daemon HTTP server.
426
+ * Binds to 127.0.0.1 (localhost only) on the specified port.
427
+ */
428
+ export function startServer(options) {
429
+ return new Promise((resolve, reject) => {
430
+ shutdownCallback = options.onShutdown;
431
+ httpServer = createServer(async (req, res) => {
432
+ // CORS preflight
433
+ if (req.method === 'OPTIONS') {
434
+ res.writeHead(204, {
435
+ 'Access-Control-Allow-Origin': '*',
436
+ 'Access-Control-Allow-Methods': 'POST',
437
+ 'Access-Control-Allow-Headers': 'Content-Type, Authorization',
438
+ });
439
+ res.end();
440
+ return;
441
+ }
442
+ // Only accept POST
443
+ if (req.method !== 'POST') {
444
+ sendJson(res, 405, { ok: false, error: 'Method not allowed' });
445
+ return;
446
+ }
447
+ // Validate bearer token
448
+ const auth = req.headers.authorization;
449
+ if (!auth || auth !== `Bearer ${options.token}`) {
450
+ sendJson(res, 401, { ok: false, error: 'Unauthorized' });
451
+ return;
452
+ }
453
+ // Parse action from URL path: /api/{action}
454
+ const urlPath = req.url ?? '/';
455
+ const match = urlPath.match(/^\/api\/([a-z-]+)$/);
456
+ if (!match) {
457
+ sendJson(res, 404, { ok: false, error: 'Not found' });
458
+ return;
459
+ }
460
+ const action = match[1];
461
+ // Reset idle timer on every valid request
462
+ resetIdleTimer();
463
+ try {
464
+ const body = await readBody(req);
465
+ const parsed = body ? JSON.parse(body) : {};
466
+ const params = parsed.params ?? {};
467
+ const response = await handleRequest(action, params, options.url);
468
+ sendJson(res, response.ok ? 200 : 400, response);
469
+ }
470
+ catch (error) {
471
+ const message = error instanceof Error ? error.message : String(error);
472
+ console.error('[Daemon] Request error:', message);
473
+ sendJson(res, 500, { ok: false, error: message });
474
+ }
475
+ });
476
+ httpServer.on('error', (error) => {
477
+ if (error.code === 'EADDRINUSE') {
478
+ reject(new Error(`Port ${options.port} is in use`));
479
+ }
480
+ else {
481
+ reject(error);
482
+ }
483
+ });
484
+ // Bind to localhost only
485
+ httpServer.listen(options.port, '127.0.0.1', () => {
486
+ console.error(`[Daemon] HTTP server listening on http://127.0.0.1:${options.port}`);
487
+ resetIdleTimer();
488
+ resolve();
489
+ });
490
+ });
491
+ }
492
+ /**
493
+ * Shut down the daemon: close browser, close HTTP server, call shutdown callback.
494
+ */
495
+ export async function shutdown() {
496
+ console.error('[Daemon] Shutting down...');
497
+ if (idleTimer) {
498
+ clearTimeout(idleTimer);
499
+ idleTimer = null;
500
+ }
501
+ await closeBrowser();
502
+ if (httpServer) {
503
+ httpServer.close();
504
+ httpServer = null;
505
+ }
506
+ shutdownCallback?.();
507
+ }
508
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Session Manifest
3
+ *
4
+ * Machine-readable session description for viewer generation,
5
+ * report generation, and PR evidence upload.
6
+ */
7
+ export interface ActionEntry {
8
+ /** Seconds since session start */
9
+ timestamp: number;
10
+ /** Command name (click, fill, snapshot, screenshot, etc.) */
11
+ action: string;
12
+ /** Command arguments */
13
+ args: string[];
14
+ /** Duration of the action in ms */
15
+ duration: number;
16
+ /** Bounding box of the target element (if applicable) */
17
+ boundingBox?: {
18
+ x: number;
19
+ y: number;
20
+ width: number;
21
+ height: number;
22
+ };
23
+ /** Screenshot filename taken at this action */
24
+ screenshot?: string;
25
+ }
26
+ export interface SessionManifest {
27
+ sessionId: string;
28
+ startedAt: string;
29
+ endedAt: string;
30
+ /** Duration in seconds */
31
+ duration: number;
32
+ commands: ActionEntry[];
33
+ screenshots: string[];
34
+ video?: string;
35
+ errors: {
36
+ console: number;
37
+ network: number;
38
+ server: number;
39
+ };
40
+ }
41
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/daemon/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,WAAW,CAAC,EAAE;QACZ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Session Manifest
3
+ *
4
+ * Machine-readable session description for viewer generation,
5
+ * report generation, and PR evidence upload.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/daemon/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Daemon State File Management
3
+ *
4
+ * Handles reading, writing, and cleanup of .sweetlink/daemon.json.
5
+ * Uses atomic writes (tmp + rename) and lockfiles to prevent race conditions.
6
+ */
7
+ import type { DaemonState } from './types.js';
8
+ /**
9
+ * Get the .sweetlink directory path for a given project root
10
+ */
11
+ export declare function getStateDir(projectRoot: string): string;
12
+ /**
13
+ * Get the daemon.json file path
14
+ */
15
+ export declare function getStateFilePath(projectRoot: string): string;
16
+ /**
17
+ * Get the daemon.lock file path
18
+ */
19
+ export declare function getLockFilePath(projectRoot: string): string;
20
+ /**
21
+ * Write daemon state to .sweetlink/daemon.json atomically.
22
+ * Creates the directory if it doesn't exist.
23
+ * Sets file permissions to 600 (owner read/write only) for security.
24
+ */
25
+ export declare function writeDaemonState(projectRoot: string, state: DaemonState): void;
26
+ /**
27
+ * Read daemon state from .sweetlink/daemon.json.
28
+ * Returns null if the file doesn't exist or is invalid.
29
+ */
30
+ export declare function readDaemonState(projectRoot: string): DaemonState | null;
31
+ /**
32
+ * Remove daemon state file and lock file
33
+ */
34
+ export declare function removeDaemonState(projectRoot: string): void;
35
+ /**
36
+ * Check if a daemon is alive by sending an HTTP ping.
37
+ * Returns true if the daemon responds, false otherwise.
38
+ */
39
+ export declare function isDaemonAlive(state: DaemonState): Promise<boolean>;
40
+ /**
41
+ * Acquire a lockfile to prevent concurrent daemon starts.
42
+ * Returns true if the lock was acquired, false if another process holds it.
43
+ */
44
+ export declare function acquireLock(projectRoot: string): boolean;
45
+ /**
46
+ * Release the lockfile
47
+ */
48
+ export declare function releaseLock(projectRoot: string): void;
49
+ //# sourceMappingURL=stateFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateFile.d.ts","sourceRoot":"","sources":["../../src/daemon/stateFile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAY9E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAmBvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAa3D;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBxE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAiCxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAOrD"}