@haibun/web-playwright 3.0.2 → 3.0.5

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 (53) hide show
  1. package/build/BrowserFactory.d.ts +1 -1
  2. package/build/BrowserFactory.d.ts.map +1 -1
  3. package/build/BrowserFactory.js +2 -2
  4. package/build/BrowserFactory.js.map +1 -1
  5. package/build/PlaywrightEvents.d.ts +1 -0
  6. package/build/PlaywrightEvents.d.ts.map +1 -1
  7. package/build/PlaywrightEvents.js +2 -0
  8. package/build/PlaywrightEvents.js.map +1 -1
  9. package/build/cycles.d.ts.map +1 -1
  10. package/build/cycles.js +49 -55
  11. package/build/cycles.js.map +1 -1
  12. package/build/interactionSteps.d.ts +248 -2
  13. package/build/interactionSteps.d.ts.map +1 -1
  14. package/build/interactionSteps.js +7 -17
  15. package/build/interactionSteps.js.map +1 -1
  16. package/build/monitor/MonitorHandler.d.ts +7 -2
  17. package/build/monitor/MonitorHandler.d.ts.map +1 -1
  18. package/build/monitor/MonitorHandler.js +26 -10
  19. package/build/monitor/MonitorHandler.js.map +1 -1
  20. package/build/monitor/artifactDisplays/ResolvedFeaturesArtifactDisplay.d.ts.map +1 -1
  21. package/build/monitor/artifactDisplays/ResolvedFeaturesArtifactDisplay.js +112 -8
  22. package/build/monitor/artifactDisplays/ResolvedFeaturesArtifactDisplay.js.map +1 -1
  23. package/build/monitor/artifactDisplays/VideoArtifactDisplay.js +1 -1
  24. package/build/monitor/artifactDisplays/VideoArtifactDisplay.js.map +1 -1
  25. package/build/monitor/controls.d.ts.map +1 -1
  26. package/build/monitor/controls.js +247 -209
  27. package/build/monitor/controls.js.map +1 -1
  28. package/build/monitor/graph/generateMermaidGraph.d.ts +9 -2
  29. package/build/monitor/graph/generateMermaidGraph.d.ts.map +1 -1
  30. package/build/monitor/graph/generateMermaidGraph.js +240 -54
  31. package/build/monitor/graph/generateMermaidGraph.js.map +1 -1
  32. package/build/monitor/graph/graphUtils.d.ts.map +1 -1
  33. package/build/monitor/graph/graphUtils.js +21 -11
  34. package/build/monitor/graph/graphUtils.js.map +1 -1
  35. package/build/monitor/graph/mermaidGraphLinks.d.ts.map +1 -1
  36. package/build/monitor/graph/mermaidGraphLinks.js +0 -5
  37. package/build/monitor/graph/mermaidGraphLinks.js.map +1 -1
  38. package/build/monitor/messages.d.ts.map +1 -1
  39. package/build/monitor/messages.js +114 -26
  40. package/build/monitor/messages.js.map +1 -1
  41. package/build/monitor/monitor.d.ts +1 -0
  42. package/build/monitor/monitor.d.ts.map +1 -1
  43. package/build/monitor/monitor.js +464 -6
  44. package/build/monitor/monitor.js.map +1 -1
  45. package/build/rest-playwright.d.ts +57 -57
  46. package/build/rest-playwright.d.ts.map +1 -1
  47. package/build/rest-playwright.js.map +1 -1
  48. package/build/web-playwright.d.ts +12 -114
  49. package/build/web-playwright.d.ts.map +1 -1
  50. package/build/web-playwright.js +17 -16
  51. package/build/web-playwright.js.map +1 -1
  52. package/package.json +7 -7
  53. package/web/monitor.html +647 -343
@@ -3,9 +3,26 @@ import { LogEntry } from './messages.js';
3
3
  import { setupControls } from './controls.js';
4
4
  window.haibunCapturedMessages = window.haibunCapturedMessages || [];
5
5
  console.info('monitor.ts: window.haibunCapturedMessages initialized.');
6
+ // Track the number of messages we've already rendered to avoid duplicates
7
+ let renderedMessageCount = 0;
6
8
  // Function exposed to Playwright to receive new logs
7
9
  window.receiveLogData = (logEntry) => {
10
+ monitorState.isLive = true;
11
+ console.info(`[receiveLogData] Received log entry:`, logEntry.level, logEntry.message.substring(0, 50));
8
12
  window.haibunCapturedMessages.push(logEntry);
13
+ // Update start time if this is the first message or earlier than current start
14
+ if (window.haibunCapturedMessages.length === 1 || logEntry.timestamp < monitorState.startTime) {
15
+ monitorState.startTime = logEntry.timestamp;
16
+ // Sync display time base
17
+ document.body.dataset.startTime = `${monitorState.startTime}`;
18
+ // Force visibility update since start time changed
19
+ recalcVisibility(monitorState.currentTime);
20
+ updateTimelineMarkers();
21
+ }
22
+ if (logEntry.timestamp - monitorState.startTime > monitorState.maxTime) {
23
+ monitorState.maxTime = logEntry.timestamp - monitorState.startTime;
24
+ }
25
+ renderedMessageCount++;
9
26
  renderLogEntry(logEntry);
10
27
  };
11
28
  // Functions for statement input control
@@ -34,34 +51,475 @@ export function renderLogEntry(logEntryData) {
34
51
  const container = document.getElementById('haibun-log-display-area');
35
52
  const logEntry = new LogEntry(level, timestamp, message, messageContext);
36
53
  const logEntryElement = logEntry.element;
54
+ if (messageContext?.incident) {
55
+ logEntryElement.dataset.incident = messageContext.incident;
56
+ }
37
57
  container.appendChild(logEntryElement);
38
- // On STEP_END, find the last active STEP_START entry and hide it
58
+ // Update context header
59
+ if (messageContext?.incident === EExecutionMessageType.FEATURE_START) {
60
+ const feature = messageContext.incidentDetails.feature;
61
+ const text = `Feature: ${feature.name || feature.path}`;
62
+ logEntryElement.dataset.contextText = text;
63
+ const contextEl = document.getElementById('haibun-current-context');
64
+ if (contextEl)
65
+ contextEl.textContent = text;
66
+ }
67
+ else if (messageContext?.incident === EExecutionMessageType.SCENARIO_START) {
68
+ const contextEl = document.getElementById('haibun-current-context');
69
+ const scenarioTitle = messageContext.incidentDetails.scenarioTitle || `Scenario ${messageContext.incidentDetails.currentScenario}`;
70
+ logEntryElement.dataset.contextText = scenarioTitle;
71
+ if (contextEl) {
72
+ const current = contextEl.textContent || '';
73
+ if (current.startsWith('Feature: ')) {
74
+ contextEl.textContent = `${current.split(' > ')[0]} > ${scenarioTitle}`;
75
+ }
76
+ else {
77
+ contextEl.textContent = scenarioTitle;
78
+ }
79
+ }
80
+ }
81
+ else if (typeof message === 'string') {
82
+ if (message.startsWith('Feature: ')) {
83
+ const contextEl = document.getElementById('haibun-current-context');
84
+ if (contextEl)
85
+ contextEl.textContent = message;
86
+ }
87
+ else if (message.startsWith('Scenario: ')) {
88
+ const contextEl = document.getElementById('haibun-current-context');
89
+ if (contextEl) {
90
+ const current = contextEl.textContent || '';
91
+ if (current.startsWith('Feature: ')) {
92
+ contextEl.textContent = `${current.split(' > ')[0]} > ${message}`;
93
+ }
94
+ else {
95
+ contextEl.textContent = message;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ // On STEP_END, find the last active STEP_START entry and handle it
39
101
  if (messageContext?.incident === EExecutionMessageType.STEP_END) {
40
102
  const activeStepStartEntries = container.querySelectorAll('.haibun-step-start:not(.disappeared)');
41
103
  if (activeStepStartEntries.length > 0) {
42
104
  const lastActiveEntry = activeStepStartEntries[activeStepStartEntries.length - 1];
105
+ // Just mark as disappeared - don't add failed class to STEP_START
106
+ // The STEP_END entry itself will have the failed class if needed
43
107
  lastActiveEntry.classList.add('disappeared');
108
+ lastActiveEntry.dataset.endTime = `${timestamp}`;
109
+ // Check failure
110
+ const incidentDetails = messageContext.incidentDetails;
111
+ const actionResult = incidentDetails?.actionResult;
112
+ if (actionResult?.ok === false) {
113
+ markTimelineError(lastActiveEntry.dataset.time);
114
+ }
44
115
  }
45
116
  else {
46
117
  console.warn('Received STEP_END but found no active STEP_START log entry to hide.');
47
118
  }
48
119
  }
120
+ // Store seqPath if available
121
+ const incidentDetails = messageContext?.incidentDetails;
122
+ const featureStep = incidentDetails?.featureStep;
123
+ if (featureStep?.seqPath) {
124
+ const val = Array.isArray(featureStep.seqPath) ? featureStep.seqPath.join('.') : featureStep.seqPath;
125
+ logEntryElement.dataset.seqPath = val;
126
+ }
127
+ // On ENSURE_END, find the last active ENSURE_START entry and handle it
128
+ if (messageContext?.incident === EExecutionMessageType.ENSURE_END) {
129
+ const activeEnsureStartEntries = container.querySelectorAll('.haibun-ensure-start:not(.disappeared)');
130
+ if (activeEnsureStartEntries.length > 0) {
131
+ const lastActiveEntry = activeEnsureStartEntries[activeEnsureStartEntries.length - 1];
132
+ // Check if this ensure failed
133
+ const incidentDetails = messageContext.incidentDetails;
134
+ const actionResult = incidentDetails?.actionResult;
135
+ const ensureFailed = actionResult?.ok === false;
136
+ if (ensureFailed) {
137
+ // Mark as failed so it stays visible regardless of log level
138
+ lastActiveEntry.classList.add('haibun-ensure-failed');
139
+ markTimelineError(lastActiveEntry.dataset.time);
140
+ }
141
+ // Hide the ensure-start marker (but failed ensures will remain visible via CSS)
142
+ lastActiveEntry.classList.add('disappeared');
143
+ lastActiveEntry.dataset.endTime = `${timestamp}`;
144
+ }
145
+ else {
146
+ console.warn('Received ENSURE_END but found no active ENSURE_START log entry to hide.');
147
+ }
148
+ }
149
+ // Add timeline marker
150
+ if (messageContext?.incident === EExecutionMessageType.STEP_START || messageContext?.incident === EExecutionMessageType.ENSURE_START) {
151
+ addTimelineMarker(timestamp, messageContext.incident);
152
+ }
153
+ // Move prompt controls to the end
154
+ const promptControls = document.getElementById('haibun-prompt-controls-container');
155
+ if (promptControls) {
156
+ container.appendChild(promptControls);
157
+ }
49
158
  // Ensure scrolling happens after DOM update
50
- setTimeout(() => {
51
- container.scrollTop = container.scrollHeight;
52
- }, 0);
159
+ // if (monitorState.autoScroll) {
160
+ // setTimeout(() => {
161
+ // container.scrollTop = container.scrollHeight;
162
+ // }, 0);
163
+ // }
164
+ }
165
+ // --- Monitor State & Time Control ---
166
+ const monitorState = {
167
+ isPlaying: true,
168
+ autoScroll: true,
169
+ startTime: 0,
170
+ maxTime: 0,
171
+ currentTime: 0,
172
+ playbackSpeed: 1,
173
+ lastFrameTime: 0,
174
+ lastScrolled: null,
175
+ isLive: false
176
+ };
177
+ function markTimelineError(timestamp) {
178
+ if (!timestamp)
179
+ return;
180
+ const markersContainer = document.getElementById('haibun-timeline-markers');
181
+ if (!markersContainer)
182
+ return;
183
+ const marker = markersContainer.querySelector(`.timeline-marker[data-time="${timestamp}"]`);
184
+ if (marker) {
185
+ marker.classList.add('error');
186
+ }
187
+ }
188
+ function addTimelineMarker(timestamp, type) {
189
+ const markersContainer = document.getElementById('haibun-timeline-markers');
190
+ if (!markersContainer)
191
+ return;
192
+ const marker = document.createElement('div');
193
+ marker.className = 'timeline-marker';
194
+ if (type === EExecutionMessageType.ENSURE_START) {
195
+ marker.classList.add('ensure');
196
+ }
197
+ // Store absolute timestamp
198
+ marker.dataset.time = `${timestamp}`;
199
+ markersContainer.appendChild(marker);
200
+ updateTimelineMarkers();
201
+ }
202
+ function updateTimelineMarkers() {
203
+ const markersContainer = document.getElementById('haibun-timeline-markers');
204
+ if (!markersContainer || monitorState.maxTime === 0)
205
+ return;
206
+ const markers = markersContainer.children;
207
+ for (let i = 0; i < markers.length; i++) {
208
+ const marker = markers[i];
209
+ const timestamp = parseInt(marker.dataset.time || '0', 10);
210
+ const relativeTime = timestamp - monitorState.startTime;
211
+ const percent = (relativeTime / monitorState.maxTime) * 100;
212
+ marker.style.left = `${percent}%`;
213
+ }
214
+ }
215
+ function updatePlayPauseButton() {
216
+ const btn = document.getElementById('haibun-play-pause');
217
+ if (!btn)
218
+ return;
219
+ if (monitorState.isPlaying) {
220
+ if (monitorState.autoScroll) {
221
+ btn.textContent = '⏸️'; // Pause
222
+ btn.title = "Pause";
223
+ }
224
+ else {
225
+ btn.textContent = '🔦'; // Resume AutoScroll (Guided)
226
+ btn.title = "Resume Auto-Scroll";
227
+ }
228
+ }
229
+ else {
230
+ btn.textContent = '▶️'; // Play
231
+ btn.title = "Play";
232
+ }
233
+ }
234
+ function setupTimeControls() {
235
+ const slider = document.getElementById('haibun-time-slider');
236
+ const playPauseBtn = document.getElementById('haibun-play-pause');
237
+ const timeDisplay = document.getElementById('haibun-time-display');
238
+ const viewToggle = document.getElementById('haibun-view-toggle');
239
+ const speedSelect = document.getElementById('haibun-playback-speed');
240
+ const container = document.getElementById('haibun-log-display-area');
241
+ // Use the first log entry's timestamp as start time if available, otherwise fallback to body dataset or Date.now()
242
+ if (window.haibunCapturedMessages && window.haibunCapturedMessages.length > 0) {
243
+ monitorState.startTime = window.haibunCapturedMessages.reduce((min, m) => Math.min(min, m.timestamp), window.haibunCapturedMessages[0].timestamp);
244
+ const lastTimestamp = window.haibunCapturedMessages.reduce((max, m) => Math.max(max, m.timestamp), window.haibunCapturedMessages[0].timestamp);
245
+ monitorState.maxTime = lastTimestamp - monitorState.startTime;
246
+ // If we have captured messages, we are likely in replay mode, so start paused
247
+ monitorState.isPlaying = false;
248
+ monitorState.autoScroll = false;
249
+ // Set current time to end
250
+ monitorState.currentTime = monitorState.maxTime;
251
+ // Update slider and display immediately
252
+ if (slider) {
253
+ slider.max = `${monitorState.maxTime}`;
254
+ slider.value = `${monitorState.currentTime}`;
255
+ }
256
+ if (timeDisplay) {
257
+ timeDisplay.textContent = `${(monitorState.currentTime / 1000).toFixed(3)}s`;
258
+ }
259
+ // Force visibility update for the end state
260
+ setTimeout(() => {
261
+ recalcVisibility(monitorState.currentTime, true);
262
+ }, 100);
263
+ }
264
+ else {
265
+ monitorState.startTime = parseInt(document.body.dataset.startTime || `${Date.now()}`, 10);
266
+ }
267
+ // Sync display time base
268
+ document.body.dataset.startTime = `${monitorState.startTime}`;
269
+ const dateEl = document.getElementById('haibun-date');
270
+ if (dateEl) {
271
+ dateEl.textContent = new Date(monitorState.startTime).toISOString();
272
+ }
273
+ monitorState.lastFrameTime = Date.now();
274
+ if (container) {
275
+ const stopAutoScroll = () => {
276
+ if (monitorState.isPlaying && monitorState.autoScroll) {
277
+ monitorState.autoScroll = false;
278
+ updatePlayPauseButton();
279
+ }
280
+ };
281
+ // Rely on explicit user interaction to stop auto-scroll, rather than the generic 'scroll' event
282
+ // which can be triggered by layout shifts or programmatic scrolling in some environments (like Playwright).
283
+ container.addEventListener('wheel', stopAutoScroll, { passive: true });
284
+ container.addEventListener('touchmove', stopAutoScroll, { passive: true });
285
+ container.addEventListener('mousedown', stopAutoScroll);
286
+ container.addEventListener('keydown', stopAutoScroll);
287
+ }
288
+ updatePlayPauseButton();
289
+ playPauseBtn.addEventListener('click', () => {
290
+ if (monitorState.isPlaying && !monitorState.autoScroll) {
291
+ // Resume AutoScroll
292
+ monitorState.autoScroll = true;
293
+ updatePlayPauseButton();
294
+ // Force scroll immediately
295
+ recalcVisibility(monitorState.currentTime, true);
296
+ return;
297
+ }
298
+ // Restart if at end and not live
299
+ if (!monitorState.isPlaying && monitorState.currentTime >= monitorState.maxTime && !monitorState.isLive) {
300
+ monitorState.currentTime = 0;
301
+ // Reset slider and display
302
+ if (slider)
303
+ slider.value = '0';
304
+ if (timeDisplay)
305
+ timeDisplay.textContent = '0.000s';
306
+ recalcVisibility(0, true);
307
+ }
308
+ monitorState.isPlaying = !monitorState.isPlaying;
309
+ if (monitorState.isPlaying) {
310
+ monitorState.autoScroll = true;
311
+ monitorState.lastFrameTime = Date.now();
312
+ updateTimeLoop();
313
+ }
314
+ updatePlayPauseButton();
315
+ });
316
+ if (speedSelect) {
317
+ speedSelect.addEventListener('change', (e) => {
318
+ monitorState.playbackSpeed = parseFloat(e.target.value);
319
+ });
320
+ }
321
+ slider.addEventListener('input', (e) => {
322
+ monitorState.isPlaying = false;
323
+ monitorState.autoScroll = false;
324
+ updatePlayPauseButton();
325
+ const val = parseInt(e.target.value, 10);
326
+ monitorState.currentTime = val;
327
+ recalcVisibility(val, true);
328
+ timeDisplay.textContent = `${(val / 1000).toFixed(3)}s`;
329
+ });
330
+ if (viewToggle) {
331
+ const initialMode = window.HAIBUN_VIEW_MODE || 'timeline';
332
+ const timeControls = document.getElementById('haibun-time-controls');
333
+ if (initialMode === 'document') {
334
+ document.body.classList.add('view-documentation');
335
+ viewToggle.checked = true;
336
+ if (timeControls)
337
+ timeControls.style.visibility = 'hidden';
338
+ }
339
+ else {
340
+ document.body.classList.remove('view-documentation');
341
+ viewToggle.checked = false;
342
+ if (timeControls)
343
+ timeControls.style.visibility = 'visible';
344
+ }
345
+ viewToggle.addEventListener('change', (e) => {
346
+ if (e.target.checked) {
347
+ document.body.classList.add('view-documentation');
348
+ if (timeControls)
349
+ timeControls.style.visibility = 'hidden';
350
+ }
351
+ else {
352
+ document.body.classList.remove('view-documentation');
353
+ if (timeControls)
354
+ timeControls.style.visibility = 'visible';
355
+ }
356
+ });
357
+ }
358
+ const statementInput = document.getElementById('haibun-statement-input');
359
+ if (statementInput) {
360
+ statementInput.addEventListener('input', () => {
361
+ monitorState.currentTime = monitorState.maxTime;
362
+ monitorState.autoScroll = true;
363
+ recalcVisibility(monitorState.currentTime);
364
+ const slider = document.getElementById('haibun-time-slider');
365
+ if (slider)
366
+ slider.value = `${monitorState.currentTime}`;
367
+ const timeDisplay = document.getElementById('haibun-time-display');
368
+ if (timeDisplay)
369
+ timeDisplay.textContent = `${(monitorState.currentTime / 1000).toFixed(3)}s`;
370
+ });
371
+ }
372
+ updateTimeLoop();
373
+ }
374
+ function updateTimeLoop() {
375
+ if (!monitorState.isPlaying)
376
+ return;
377
+ const now = Date.now();
378
+ const delta = now - monitorState.lastFrameTime;
379
+ monitorState.lastFrameTime = now;
380
+ // If we are "live" (maxTime is increasing), we just follow real time
381
+ // But if we are replaying, we use speed.
382
+ // Actually, simpler: always use speed for currentTime advancement.
383
+ // But we need to know if we are at the "head" (live).
384
+ // Calculate "live" elapsed time
385
+ const liveElapsed = now - monitorState.startTime;
386
+ // If we are close to live edge, just sync to live (unless speed != 1)
387
+ // But user asked for slowdown control for replaying.
388
+ if (monitorState.playbackSpeed !== 1 || monitorState.currentTime < monitorState.maxTime - 100) {
389
+ monitorState.currentTime += delta * monitorState.playbackSpeed;
390
+ }
391
+ else {
392
+ // Live mode (speed 1, at head)
393
+ // Ensure we are at least at maxTime to show latest messages immediately (handles client clock lag)
394
+ // monitorState.currentTime = Math.max(liveElapsed, monitorState.maxTime);
395
+ }
396
+ // Update maxTime to be at least liveElapsed (if we are receiving new data)
397
+ // But if we are just viewing a static file, maxTime is fixed?
398
+ // In this monitor, we assume we might be receiving data.
399
+ if (monitorState.isLive && liveElapsed > monitorState.maxTime) {
400
+ monitorState.maxTime = liveElapsed;
401
+ }
402
+ // Cap currentTime at maxTime
403
+ if (monitorState.currentTime > monitorState.maxTime) {
404
+ monitorState.currentTime = monitorState.maxTime;
405
+ // Stop if at end and not live (replay finished)
406
+ if (monitorState.isPlaying && !monitorState.isLive) {
407
+ monitorState.isPlaying = false;
408
+ updatePlayPauseButton();
409
+ }
410
+ }
411
+ const slider = document.getElementById('haibun-time-slider');
412
+ const timeDisplay = document.getElementById('haibun-time-display');
413
+ if (slider) {
414
+ slider.max = `${monitorState.maxTime}`;
415
+ slider.value = `${monitorState.currentTime}`;
416
+ }
417
+ if (timeDisplay) {
418
+ timeDisplay.textContent = `${(monitorState.currentTime / 1000).toFixed(3)}s`;
419
+ }
420
+ recalcVisibility(monitorState.currentTime);
421
+ updateTimelineMarkers();
422
+ requestAnimationFrame(updateTimeLoop);
423
+ }
424
+ function recalcVisibility(timeMs, forceScroll = false) {
425
+ const container = document.getElementById('haibun-log-display-area');
426
+ if (!container)
427
+ return;
428
+ const entries = container.querySelectorAll('.haibun-log-entry');
429
+ let lastVisible = null;
430
+ let currentFeatureText = '';
431
+ let currentScenarioText = '';
432
+ // Reset highlights
433
+ entries.forEach(e => e.classList.remove('haibun-log-entry-current'));
434
+ for (let i = 0; i < entries.length; i++) {
435
+ const el = entries[i];
436
+ const entryTime = parseInt(el.dataset.time || '0', 10) - monitorState.startTime;
437
+ if (entryTime > timeMs + 250) {
438
+ el.classList.add('invisible-future');
439
+ continue;
440
+ }
441
+ if (el.dataset.incident === 'FEATURE_START') {
442
+ currentFeatureText = el.dataset.contextText || '';
443
+ currentScenarioText = '';
444
+ }
445
+ else if (el.dataset.incident === 'SCENARIO_START') {
446
+ currentScenarioText = el.dataset.contextText || '';
447
+ }
448
+ el.classList.remove('invisible-future');
449
+ if (el.dataset.endTime) {
450
+ const endTime = parseInt(el.dataset.endTime, 10) - monitorState.startTime;
451
+ if (endTime <= timeMs) {
452
+ el.classList.add('disappeared');
453
+ continue;
454
+ }
455
+ else {
456
+ el.classList.remove('disappeared');
457
+ }
458
+ }
459
+ lastVisible = el;
460
+ }
461
+ // Handle placeholders visibility: hide them if the content they represent is in the future
462
+ const placeholders = container.querySelectorAll('.haibun-log-depth-placeholder');
463
+ placeholders.forEach(p => {
464
+ const el = p;
465
+ const next = el.nextElementSibling;
466
+ // If the next element (the first hidden log entry) is future, hide the placeholder
467
+ if (next && next.classList.contains('invisible-future')) {
468
+ el.classList.add('invisible-future');
469
+ }
470
+ else {
471
+ el.classList.remove('invisible-future');
472
+ }
473
+ });
474
+ const videos = document.querySelectorAll('video');
475
+ if (videos.length > 0) {
476
+ videos.forEach(v => {
477
+ try {
478
+ v.currentTime = timeMs / 1000;
479
+ v.pause();
480
+ }
481
+ catch (e) {
482
+ console.error('Error updating video time:', e);
483
+ }
484
+ });
485
+ }
486
+ const contextEl = document.getElementById('haibun-current-context');
487
+ if (contextEl) {
488
+ if (currentFeatureText && currentScenarioText) {
489
+ contextEl.textContent = `${currentFeatureText} > ${currentScenarioText}`;
490
+ }
491
+ else if (currentFeatureText) {
492
+ contextEl.textContent = currentFeatureText;
493
+ }
494
+ else if (currentScenarioText) {
495
+ contextEl.textContent = currentScenarioText;
496
+ }
497
+ }
498
+ if (lastVisible) {
499
+ lastVisible.classList.add('haibun-log-entry-current');
500
+ if (forceScroll || (monitorState.autoScroll && lastVisible !== monitorState.lastScrolled)) {
501
+ lastVisible.scrollIntoView({ block: 'center', behavior: 'auto' });
502
+ monitorState.lastScrolled = lastVisible;
503
+ }
504
+ }
53
505
  }
54
506
  function renderAllLogs() {
55
507
  const container = document.getElementById('haibun-log-display-area');
56
508
  if (container) {
57
- console.info(`Rendering ${window.haibunCapturedMessages.length} log entries...`);
58
- window.haibunCapturedMessages.forEach(renderLogEntry);
509
+ // Only render messages that haven't been rendered yet
510
+ const messagesToRender = window.haibunCapturedMessages.slice(renderedMessageCount);
511
+ console.info(`Rendering ${messagesToRender.length} new log entries (already had ${renderedMessageCount})...`);
512
+ messagesToRender.forEach(logEntry => {
513
+ renderLogEntry(logEntry);
514
+ renderedMessageCount++;
515
+ });
59
516
  }
60
517
  }
61
518
  document.addEventListener('DOMContentLoaded', () => {
62
519
  if (!document.body.dataset.startTime) {
63
520
  document.body.dataset.startTime = `${Date.now()}`;
64
521
  }
522
+ setupTimeControls();
65
523
  renderAllLogs();
66
524
  setupControls();
67
525
  console.info("Initial logs rendered.");
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/monitor/monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/monitor/monitor.ts"],"names":[],"mappings":"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"}