@haibun/web-playwright 1.43.0 → 1.44.1

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 (46) hide show
  1. package/build/BrowserFactory.d.ts +15 -27
  2. package/build/BrowserFactory.d.ts.map +1 -1
  3. package/build/BrowserFactory.js +71 -50
  4. package/build/BrowserFactory.js.map +1 -1
  5. package/build/PlaywrightEvents.d.ts +3 -3
  6. package/build/PlaywrightEvents.d.ts.map +1 -1
  7. package/build/PlaywrightEvents.js +17 -13
  8. package/build/PlaywrightEvents.js.map +1 -1
  9. package/build/monitor/XXlogToMonitor.d.ts +8 -0
  10. package/build/monitor/XXlogToMonitor.d.ts.map +1 -0
  11. package/build/monitor/XXlogToMonitor.js +151 -0
  12. package/build/monitor/XXlogToMonitor.js.map +1 -0
  13. package/build/monitor/controls.d.ts +3 -0
  14. package/build/monitor/controls.d.ts.map +1 -0
  15. package/build/monitor/controls.js +318 -0
  16. package/build/monitor/controls.js.map +1 -0
  17. package/build/monitor/disclosureJson.d.ts +3 -0
  18. package/build/monitor/disclosureJson.d.ts.map +1 -0
  19. package/build/monitor/disclosureJson.js +121 -0
  20. package/build/monitor/disclosureJson.js.map +1 -0
  21. package/build/monitor/mermaidDiagram.d.ts +22 -0
  22. package/build/monitor/mermaidDiagram.d.ts.map +1 -0
  23. package/build/monitor/mermaidDiagram.js +199 -0
  24. package/build/monitor/mermaidDiagram.js.map +1 -0
  25. package/build/monitor/messages.d.ts +18 -0
  26. package/build/monitor/messages.d.ts.map +1 -0
  27. package/build/monitor/messages.js +303 -0
  28. package/build/monitor/messages.js.map +1 -0
  29. package/build/monitor/monitor.d.ts +16 -0
  30. package/build/monitor/monitor.d.ts.map +1 -0
  31. package/build/monitor/monitor.js +61 -0
  32. package/build/monitor/monitor.js.map +1 -0
  33. package/build/monitor/monitorHandler.d.ts +12 -0
  34. package/build/monitor/monitorHandler.d.ts.map +1 -0
  35. package/build/monitor/monitorHandler.js +89 -0
  36. package/build/monitor/monitorHandler.js.map +1 -0
  37. package/build/rest-playwright.d.ts +60 -2
  38. package/build/rest-playwright.d.ts.map +1 -1
  39. package/build/rest-playwright.js +170 -51
  40. package/build/rest-playwright.js.map +1 -1
  41. package/build/web-playwright.d.ts +142 -54
  42. package/build/web-playwright.d.ts.map +1 -1
  43. package/build/web-playwright.js +327 -110
  44. package/build/web-playwright.js.map +1 -1
  45. package/package.json +5 -4
  46. package/web/monitor.html +2925 -0
@@ -0,0 +1,199 @@
1
+ import mermaid from 'mermaid';
2
+ import { shortenURI } from '@haibun/core/build/lib/util/index.js';
3
+ // Helper function for sanitization
4
+ const sanitizeMermaidContent = (message) => {
5
+ let sanitized = message.replace(/"/g, "'"); // Replace double quotes
6
+ // IMPORTANT: Escape semicolon FIRST to avoid breaking other entities
7
+ sanitized = sanitized.replace(/;/g, '#59;');
8
+ sanitized = sanitized.replace(/\(/g, '#40;');
9
+ sanitized = sanitized.replace(/\)/g, '#41;');
10
+ sanitized = sanitized.replace(/,/g, '#44;');
11
+ return sanitized;
12
+ };
13
+ const jsonFilters = {
14
+ request: {
15
+ method: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
16
+ accept: ['application/json'],
17
+ },
18
+ response: {
19
+ type: ['application/json'],
20
+ },
21
+ };
22
+ export class SequenceDiagramGenerator {
23
+ needsUpdate = false;
24
+ diagramLines = ['sequenceDiagram']; // Initialize with diagram type
25
+ pageNames = {};
26
+ pageCounter = 1;
27
+ participantAdded = {}; // Track added participants
28
+ // Add participant declaration if not already added
29
+ addParticipant(alias, name) {
30
+ if (!this.participantAdded[alias]) {
31
+ this.diagramLines.splice(1, 0, `participant ${alias} as ${name}`); // Insert after 'sequenceDiagram'
32
+ this.participantAdded[alias] = true;
33
+ }
34
+ }
35
+ processEvent(trace, httpEvent, filters = jsonFilters) {
36
+ this.needsUpdate = true; // Set flag immediately
37
+ const requestingPage = trace.requestingPage;
38
+ const requestingURL = trace.requestingURL;
39
+ const method = trace.method;
40
+ const status = trace.status;
41
+ const statusText = trace.statusText;
42
+ const headers = trace.headers;
43
+ // Use URL hostname as the server participant
44
+ let serverAlias = 'UnknownAlias'; // Default if URL is missing
45
+ let serverName = 'Unknown';
46
+ if (requestingURL) {
47
+ try {
48
+ const url = new URL(requestingURL);
49
+ serverName = url.hostname;
50
+ // Handle empty hostname (e.g., for about:blank)
51
+ if (serverName) {
52
+ serverAlias = serverName.replace(/[.-]/g, '');
53
+ if (!serverAlias) {
54
+ serverAlias = 'HostAlias'; // Fallback alias if replacement results in empty string
55
+ }
56
+ }
57
+ }
58
+ catch (e) {
59
+ serverAlias = 'InvalidURLAlias';
60
+ }
61
+ }
62
+ this.addParticipant(serverAlias, serverName);
63
+ if (skipEvent(filters, httpEvent, serverName, trace)) {
64
+ return;
65
+ }
66
+ if (requestingPage && requestingURL) {
67
+ let pageAlias = this.pageNames[requestingPage];
68
+ if (!pageAlias) {
69
+ let pageName = `Browser Page ${this.pageCounter}`;
70
+ let baseAlias = '';
71
+ try {
72
+ // Try to get hostname from the current URL for a better name
73
+ const url = new URL(requestingURL);
74
+ const hostname = url.hostname;
75
+ if (hostname && requestingURL !== 'about:blank') {
76
+ baseAlias = hostname.replace(/[.-]/g, '');
77
+ if (!baseAlias)
78
+ baseAlias = 'Host'; // Fallback if hostname becomes empty
79
+ pageName = `${hostname} ${this.pageCounter}`;
80
+ }
81
+ else {
82
+ // Fallback for about:blank or empty hostname
83
+ baseAlias = 'Page';
84
+ }
85
+ }
86
+ catch (e) {
87
+ // Fallback for invalid URL
88
+ baseAlias = 'Page';
89
+ }
90
+ // Ensure unique alias by appending counter
91
+ pageAlias = `${baseAlias}${this.pageCounter}`;
92
+ this.pageNames[requestingPage] = pageAlias;
93
+ this.addParticipant(pageAlias, pageName);
94
+ this.pageCounter++;
95
+ }
96
+ if (method) {
97
+ const message = sanitizeMermaidContent(`${method} ${shortenURI(requestingURL)}`);
98
+ this.diagramLines.push(`${pageAlias}->>${serverAlias}: ${message}`);
99
+ if (headers && headers.referer) {
100
+ const note = shortenURI(sanitizeMermaidContent(`Referer: ${headers.referer}`));
101
+ this.diagramLines.push(`Note right of ${pageAlias}: ${note}`);
102
+ }
103
+ if (headers && headers["accept"]) {
104
+ const note = sanitizeMermaidContent(`Accept: ${headers["accept"]}`);
105
+ this.diagramLines.push(`Note right of ${pageAlias}: ${note}`);
106
+ }
107
+ if (headers && headers["content-type"]) {
108
+ const note = sanitizeMermaidContent(`Content-type: ${headers['content-type']}`);
109
+ this.diagramLines.push(`Note right of ${pageAlias}: ${note}`);
110
+ }
111
+ }
112
+ if (status) {
113
+ // Sanitize response message
114
+ const message = sanitizeMermaidContent(`${status} ${statusText || ''}`);
115
+ this.diagramLines.push(`${serverAlias}-->>${pageAlias}: ${message}`);
116
+ }
117
+ }
118
+ // this.needsUpdate = true; // Moved to the beginning
119
+ }
120
+ getDiagram() {
121
+ return this.diagramLines.join("\n");
122
+ }
123
+ async update() {
124
+ // Only update the DOM and render if necessary
125
+ if (!this.needsUpdate) {
126
+ return;
127
+ }
128
+ const mermaidContainer = document.getElementById('sequence-diagram');
129
+ if (mermaidContainer) {
130
+ let diagramDefinition = ''; // Declare outside try
131
+ try {
132
+ diagramDefinition = this.getDiagram(); // Assign inside try
133
+ mermaid.initialize({ maxTextSize: 900000 });
134
+ // Ensure container is empty before rendering
135
+ mermaidContainer.innerHTML = '';
136
+ // Insert the diagram definition for Mermaid to process
137
+ const insert = `<pre class="mermaid">${diagramDefinition}</pre>`;
138
+ mermaidContainer.insertAdjacentHTML('beforeend', insert);
139
+ await mermaid.run({ nodes: [mermaidContainer.querySelector('.mermaid')] });
140
+ console.log("Mermaid diagram rendered.");
141
+ this.needsUpdate = false; // Reset flag only after successful render
142
+ }
143
+ catch (e) {
144
+ console.error("Failed Mermaid diagram definition:\n", diagramDefinition); // Log failing definition
145
+ console.error("Error rendering Mermaid diagram:", e);
146
+ const detailedError = (typeof e === 'object' && e !== null && 'str' in e) ? e.str : null;
147
+ const errorMessage = detailedError || (e instanceof Error ? e.message : String(e));
148
+ mermaidContainer.innerHTML = `<pre>Error rendering Mermaid diagram:\n\n${errorMessage}\n\n--- Diagram Definition ---\n${diagramDefinition}</pre>`;
149
+ // Optionally reset needsUpdate here too, or leave it true to retry later? Resetting for now.
150
+ this.needsUpdate = false;
151
+ }
152
+ }
153
+ else {
154
+ console.warn("Sequence diagram container not found.");
155
+ // Reset flag even if container not found to avoid repeated attempts
156
+ this.needsUpdate = false;
157
+ }
158
+ }
159
+ }
160
+ export function skipEvent(filters, httpEvent, serverName, { requestingPage, requestingURL, method, status, statusText, headers }) {
161
+ if (!serverName) {
162
+ console.info('No server name found, skipping result.');
163
+ return true;
164
+ }
165
+ if (requestingURL === 'about:blank') {
166
+ console.info('Requesting URL is about:blank, skipping result.');
167
+ return true;
168
+ }
169
+ if (httpEvent === 'request') {
170
+ if (headers && headers.accept) {
171
+ const acceptHeader = headers.accept;
172
+ if (!filters.request.accept.some(filterValue => acceptHeader.includes(filterValue))) {
173
+ console.info('qx', acceptHeader, filters.request.accept);
174
+ return true;
175
+ }
176
+ else {
177
+ console.info('qY', acceptHeader, filters.request.accept);
178
+ }
179
+ }
180
+ }
181
+ else if (httpEvent === 'response') {
182
+ if (headers && headers['content-type']) {
183
+ const contentTypeHeader = headers['content-type'];
184
+ if (!filters.response.type.some(filterValue => contentTypeHeader.includes(filterValue))) {
185
+ console.info('px', contentTypeHeader);
186
+ return true;
187
+ }
188
+ else {
189
+ console.info('pY', contentTypeHeader);
190
+ }
191
+ }
192
+ }
193
+ else {
194
+ console.warn(`Unknown HTTP event type: ${httpEvent}`);
195
+ return true;
196
+ }
197
+ return false;
198
+ }
199
+ //# sourceMappingURL=mermaidDiagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaidDiagram.js","sourceRoot":"","sources":["../../src/monitor/mermaidDiagram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { TMessageContext } from '@haibun/core/build/lib/interfaces/logger.js';
2
+ declare abstract class LogComponent<T extends HTMLElement = HTMLElement> {
3
+ readonly element: T;
4
+ constructor(tagName: keyof HTMLElementTagNameMap, className?: string | string[]);
5
+ append(child: LogComponent | HTMLElement): void;
6
+ addClass(className: string): void;
7
+ setData(key: string, value: string): void;
8
+ setHtml(html: string): void;
9
+ setText(text: string): void;
10
+ }
11
+ export declare class LogEntry extends LogComponent {
12
+ private detailsSummary;
13
+ private messageContent;
14
+ constructor(level: string, timestamp: number, message: string, messageContext?: TMessageContext);
15
+ private handleSpecialPlacements;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/monitor/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,eAAe,EAAgI,MAAM,6CAA6C,CAAC;AAIvN,uBAAe,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IAC9D,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBAER,OAAO,EAAE,MAAM,qBAAqB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAQ/E,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI;IAK/C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIjC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAG3B;AA6BD,qBAAa,QAAS,SAAQ,YAAY;IACzC,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,cAAc,CAAoB;gBAE9B,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,eAAe;IAgB/F,OAAO,CAAC,uBAAuB;CAqB/B"}
@@ -0,0 +1,303 @@
1
+ import { EExecutionMessageType } from '@haibun/core/build/lib/interfaces/logger.js';
2
+ import { sequenceDiagramGenerator } from './monitor.js';
3
+ import { disclosureJson } from './disclosureJson.js';
4
+ class LogComponent {
5
+ element;
6
+ constructor(tagName, className) {
7
+ this.element = document.createElement(tagName);
8
+ if (className) {
9
+ const classes = Array.isArray(className) ? className : [className];
10
+ this.element.classList.add(...classes);
11
+ }
12
+ }
13
+ append(child) {
14
+ // Type guard ensures we append the .element property if it's a LogComponent
15
+ this.element.appendChild(child instanceof LogComponent ? child.element : child);
16
+ }
17
+ addClass(className) {
18
+ this.element.classList.add(className);
19
+ }
20
+ setData(key, value) {
21
+ this.element.dataset[key] = value;
22
+ }
23
+ setHtml(html) {
24
+ this.element.innerHTML = html;
25
+ }
26
+ setText(text) {
27
+ this.element.textContent = text;
28
+ }
29
+ }
30
+ // --- Abstract Artifact Display Base Class ---
31
+ // Abstract base for artifact displays
32
+ class ArtifactDisplay extends LogComponent {
33
+ artifact;
34
+ label;
35
+ constructor(artifact, tagName, className) {
36
+ super(tagName, className);
37
+ this.artifact = artifact;
38
+ this.artifact = artifact;
39
+ this.label = this.deriveLabel();
40
+ this.render();
41
+ }
42
+ deriveLabel() {
43
+ return this.artifact.artifactType;
44
+ }
45
+ get artifactType() {
46
+ return this.artifact.artifactType;
47
+ }
48
+ }
49
+ export class LogEntry extends LogComponent {
50
+ detailsSummary;
51
+ messageContent;
52
+ constructor(level, timestamp, message, messageContext) {
53
+ super('div', ['haibun-log-entry', `haibun-level-${level}`]);
54
+ if (messageContext?.incident === EExecutionMessageType.STEP_START) {
55
+ this.addClass('haibun-step-start');
56
+ }
57
+ this.setData('time', `${timestamp}`);
58
+ this.detailsSummary = new LogDetailsSummary(level, timestamp);
59
+ this.messageContent = new LogMessageContent(message, messageContext);
60
+ this.append(this.detailsSummary);
61
+ this.append(this.messageContent);
62
+ this.handleSpecialPlacements();
63
+ }
64
+ handleSpecialPlacements() {
65
+ const artifactDisplay = this.messageContent.artifactDisplay;
66
+ if (!artifactDisplay)
67
+ return;
68
+ if (artifactDisplay.placementTarget === 'body') {
69
+ document.body.appendChild(artifactDisplay.element);
70
+ }
71
+ else if (artifactDisplay.placementTarget === 'haibun-video') {
72
+ const haibunVideoContainer = document.querySelector('#haibun-video');
73
+ if (haibunVideoContainer) {
74
+ haibunVideoContainer.replaceChildren(artifactDisplay.element);
75
+ haibunVideoContainer.style.display = 'flex';
76
+ }
77
+ }
78
+ else if (artifactDisplay.placementTarget === 'haibun-sequence-diagram') {
79
+ // The element is already rendered in the details by LogMessageContent.
80
+ // Here, we just need to ensure the data is processed for the diagram if needed.
81
+ // The JsonArtifactHTTPTrace.render method already handles this.
82
+ // No need to move the element itself.
83
+ // sequenceDiagramGenerator.processEvent is called within JsonArtifactHTTPTrace.render
84
+ }
85
+ // 'details' placement is handled within LogMessageContent constructor
86
+ }
87
+ }
88
+ // --- Log Entry Structure Components (Used by LogEntry) ---
89
+ class LogDetailsSummary extends LogComponent {
90
+ constructor(level, timestamp) {
91
+ super('summary', 'haibun-log-details-summary');
92
+ const relativeTime = calculateRelativeTime(timestamp);
93
+ this.setHtml(`${level}<div class="time-small">${formatTime(relativeTime)}s</div>`);
94
+ }
95
+ }
96
+ class LogMessageContent extends LogComponent {
97
+ artifactDisplay = null;
98
+ constructor(message, messageContext) {
99
+ super('div', 'haibun-message-content');
100
+ const summaryMessage = getSummaryMessage(message, messageContext);
101
+ if (messageContext) {
102
+ // Context exists: ALWAYS create the details structure
103
+ const incident = messageContext.incident;
104
+ const incidentDetails = messageContext.incidentDetails;
105
+ const artifact = messageContext.artifact;
106
+ let finalLabel = EExecutionMessageType[incident] || 'Context'; // Default label is incident type
107
+ // Check for artifact and update label if needed
108
+ if (artifact) {
109
+ this.artifactDisplay = createArtifactDisplay(artifact);
110
+ if (this.artifactDisplay) {
111
+ // Use artifact label if available and different, otherwise use type
112
+ finalLabel = (this.artifactDisplay.label !== this.artifactDisplay.artifactType)
113
+ ? this.artifactDisplay.label
114
+ : (this.artifactDisplay.artifactType || finalLabel);
115
+ // NOTE: We no longer check placementTarget or return early here
116
+ }
117
+ }
118
+ // --- Create Details Wrapper ---
119
+ const detailsElement = document.createElement('details');
120
+ detailsElement.classList.add('haibun-context-details');
121
+ // Create the summary line
122
+ const messageSummary = new LogMessageSummary(summaryMessage, finalLabel);
123
+ // Add loader specifically to the message summary if STEP_START
124
+ if (incident === EExecutionMessageType.STEP_START) {
125
+ const loader = document.createElement('div');
126
+ loader.className = 'haibun-loader';
127
+ messageSummary.element.prepend(loader); // Prepend to the summary element
128
+ }
129
+ detailsElement.appendChild(messageSummary.element); // Append the summary (with potential loader)
130
+ // Add incidentDetails JSON inside the details element
131
+ if (incidentDetails) {
132
+ const pre = document.createElement('pre');
133
+ pre.classList.add('haibun-message-details-json');
134
+ pre.appendChild(disclosureJson(incidentDetails));
135
+ detailsElement.appendChild(pre);
136
+ }
137
+ // Add artifact display if it exists.
138
+ // For JsonArtifactHTTPTrace, this ensures the <pre> is always added here.
139
+ if (this.artifactDisplay) {
140
+ detailsElement.appendChild(this.artifactDisplay.element);
141
+ }
142
+ this.append(detailsElement); // Append the whole details structure
143
+ // If artifact placement is NOT 'details', we might still want the simple message class on the parent
144
+ if (this.artifactDisplay && this.artifactDisplay.placementTarget !== 'details') {
145
+ this.addClass('haibun-simple-message');
146
+ // Optionally set text again if the summary text differs significantly from the desired simple text
147
+ // this.setText(summaryMessage);
148
+ }
149
+ }
150
+ else {
151
+ // No context: display simple message
152
+ this.addClass('haibun-simple-message');
153
+ this.setText(message); // Use original message
154
+ }
155
+ }
156
+ }
157
+ class LogMessageSummary extends LogComponent {
158
+ labelSpan;
159
+ constructor(summaryMessage, initialLabel) {
160
+ super('summary', 'haibun-log-message-summary');
161
+ this.labelSpan = document.createElement('span');
162
+ this.labelSpan.className = 'details-type'; // Class for styling the label
163
+ this.updateLabel(initialLabel); // Set initial label with formatting
164
+ // Set text first, then append span
165
+ this.setText(summaryMessage);
166
+ this.append(this.labelSpan);
167
+ }
168
+ updateLabel(newLabel) {
169
+ this.labelSpan.textContent = newLabel.replace(/_/g, ' ');
170
+ }
171
+ }
172
+ // --- Artifact Display Components (Details) ---
173
+ // Factory function to create the correct ArtifactDisplay instance
174
+ function createArtifactDisplay(artifact) {
175
+ const { artifactType } = artifact;
176
+ switch (artifactType) {
177
+ case 'html': return new HtmlArtifactDisplay(artifact);
178
+ case 'image': return new ImageArtifactDisplay(artifact);
179
+ case 'video': return new VideoArtifactDisplay(artifact);
180
+ case 'video/start': return new VideoStartArtifactDisplay(artifact);
181
+ case 'json': return new JsonArtifactDisplay(artifact);
182
+ case 'json/http/trace':
183
+ return new JsonArtifactHTTPTrace(artifact);
184
+ default: {
185
+ throw Error(`Unsupported artifact type "${artifact.artifactType}" for display from ${artifactType}`);
186
+ }
187
+ }
188
+ }
189
+ // Specific implementations for each artifact type
190
+ class HtmlArtifactDisplay extends ArtifactDisplay {
191
+ artifact;
192
+ placementTarget = 'details';
193
+ constructor(artifact) {
194
+ super(artifact, 'iframe');
195
+ this.artifact = artifact;
196
+ this.element.style.border = 'none';
197
+ this.element.style.width = '100%';
198
+ this.element.style.height = '80vh';
199
+ }
200
+ render() {
201
+ if (this.artifact.html) {
202
+ this.element.srcdoc = this.artifact.html;
203
+ }
204
+ }
205
+ }
206
+ class ImageArtifactDisplay extends ArtifactDisplay {
207
+ artifact;
208
+ placementTarget = 'details';
209
+ constructor(artifact) {
210
+ super(artifact, 'img');
211
+ this.artifact = artifact;
212
+ this.element.alt = 'Screen capture artifact';
213
+ }
214
+ render() {
215
+ this.element.src = getRuntimePath(this.artifact);
216
+ }
217
+ }
218
+ class VideoArtifactDisplay extends ArtifactDisplay {
219
+ artifact;
220
+ placementTarget;
221
+ constructor(artifact) {
222
+ super(artifact, 'video');
223
+ this.artifact = artifact;
224
+ const videoElement = this.element;
225
+ videoElement.controls = true;
226
+ videoElement.style.width = '320px';
227
+ this.placementTarget = document.querySelector('#haibun-video') ? 'haibun-video' : 'details';
228
+ if (this.placementTarget === 'details') {
229
+ console.info('Cannot find #haibun-video container; appending video to details.');
230
+ }
231
+ }
232
+ render() {
233
+ this.element.src = getRuntimePath(this.artifact);
234
+ }
235
+ }
236
+ class VideoStartArtifactDisplay extends ArtifactDisplay {
237
+ artifact;
238
+ placementTarget = 'body';
239
+ constructor(artifact) {
240
+ super(artifact, 'span');
241
+ this.artifact = artifact;
242
+ this.element.id = 'haibun-video-start';
243
+ }
244
+ render() {
245
+ this.setData('start', `${this.artifact.start}`);
246
+ }
247
+ }
248
+ class JsonArtifactHTTPTrace extends ArtifactDisplay {
249
+ artifact;
250
+ placementTarget;
251
+ constructor(artifact) {
252
+ super(artifact, 'pre', 'haibun-message-details-json');
253
+ this.artifact = artifact;
254
+ this.placementTarget = document.querySelector('#sequence-diagram') ? 'haibun-sequence-diagram' : 'details';
255
+ }
256
+ deriveLabel() {
257
+ return '⇄ Trace';
258
+ }
259
+ render() {
260
+ if (this.artifact.httpEvent !== 'route') {
261
+ sequenceDiagramGenerator.processEvent(this.artifact.trace, this.artifact.httpEvent);
262
+ }
263
+ this.append(disclosureJson(this.artifact.trace));
264
+ }
265
+ }
266
+ class JsonArtifactDisplay extends ArtifactDisplay {
267
+ artifact;
268
+ placementTarget = 'details';
269
+ constructor(artifact) {
270
+ super(artifact, 'pre', 'haibun-message-details-json');
271
+ this.artifact = artifact;
272
+ }
273
+ deriveLabel() {
274
+ return this.artifact.artifactType;
275
+ }
276
+ render() {
277
+ this.append(disclosureJson(this.artifact.json || {}));
278
+ }
279
+ }
280
+ // --- Helper Functions ---
281
+ function calculateRelativeTime(timestamp) {
282
+ const startTime = parseInt(document.body.dataset.startTime || `${Date.now()}`, 10);
283
+ return timestamp - startTime;
284
+ }
285
+ function formatTime(relativeTimeMs) {
286
+ return (relativeTimeMs / 1000).toFixed(3).replace('.', ':');
287
+ }
288
+ function getSummaryMessage(message, messageContext) {
289
+ // Check for STEP_END incident and access details via incidentDetails
290
+ if (messageContext?.incident === EExecutionMessageType.STEP_END && messageContext.incidentDetails?.result?.in) {
291
+ return `${message} ${messageContext.incidentDetails.result.in}`;
292
+ }
293
+ return message;
294
+ }
295
+ function getRuntimePath(artifact) {
296
+ const isRuntime = document.body.dataset.haibunRuntime === 'true';
297
+ if (isRuntime && artifact.runtimePath) {
298
+ const prefix = artifact.runtimePath.endsWith('/') ? artifact.runtimePath : `${artifact.runtimePath}/`;
299
+ return `${prefix}${artifact.path.replace(/^\.\//, '')}`;
300
+ }
301
+ return artifact.path;
302
+ }
303
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/monitor/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { SequenceDiagramGenerator } from './mermaidDiagram.js';
2
+ import { TAnyFixme } from '@haibun/core/build/lib/defs.js';
3
+ import { TLogLevel, TLogArgs, TMessageContext } from '@haibun/core/build/lib/interfaces/logger.js';
4
+ declare global {
5
+ interface Window {
6
+ haibunLogData: TAnyFixme[];
7
+ receiveLogData: (logEntry: {
8
+ level: TLogLevel;
9
+ message: TLogArgs;
10
+ messageContext?: TMessageContext;
11
+ timestamp: number;
12
+ }) => void;
13
+ }
14
+ }
15
+ export declare const sequenceDiagramGenerator: SequenceDiagramGenerator;
16
+ //# sourceMappingURL=monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/monitor/monitor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAyB,MAAM,6CAA6C,CAAC;AAI1H,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,aAAa,EAAE,SAAS,EAAE,CAAC;QAC3B,cAAc,EAAE,CAAC,QAAQ,EAAE;YAAE,KAAK,EAAE,SAAS,CAAC;YAAC,OAAO,EAAE,QAAQ,CAAC;YAAC,cAAc,CAAC,EAAE,eAAe,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;KACjI;CACD;AAYD,eAAO,MAAM,wBAAwB,0BAAiC,CAAC"}
@@ -0,0 +1,61 @@
1
+ import mermaid from 'mermaid';
2
+ import { SequenceDiagramGenerator } from './mermaidDiagram.js';
3
+ import { EExecutionMessageType } from '@haibun/core/build/lib/interfaces/logger.js'; // Moved EExecutionMessageType here
4
+ import { LogEntry } from './messages.js';
5
+ import { setupControls } from './controls.js';
6
+ window.haibunLogData = window.haibunLogData || [];
7
+ console.log('monitor', window.haibunLogData);
8
+ // Function exposed to Playwright to receive new logs
9
+ window.receiveLogData = (logEntry) => {
10
+ window.haibunLogData.push(logEntry);
11
+ renderLogEntry(logEntry);
12
+ void sequenceDiagramGenerator.update();
13
+ };
14
+ export const sequenceDiagramGenerator = new SequenceDiagramGenerator();
15
+ function renderLogEntry(logEntryData) {
16
+ const { level, message, messageContext, timestamp } = logEntryData;
17
+ const container = document.getElementById('haibun-log-display-area');
18
+ if (!container) {
19
+ console.error('Could not find log display area #haibun-log-display-area');
20
+ return;
21
+ }
22
+ const logEntry = new LogEntry(level, timestamp, message, messageContext);
23
+ const logEntryElement = logEntry.element; // Get the actual DOM element
24
+ container.appendChild(logEntryElement);
25
+ // On STEP_END, find the last active STEP_START entry and hide it
26
+ if (messageContext?.incident === EExecutionMessageType.STEP_END) {
27
+ // Find the last .haibun-step-start element that does NOT have .disappeared
28
+ const activeStepStartEntries = container.querySelectorAll('.haibun-step-start:not(.disappeared)');
29
+ if (activeStepStartEntries.length > 0) {
30
+ const lastActiveEntry = activeStepStartEntries[activeStepStartEntries.length - 1];
31
+ lastActiveEntry.classList.add('disappeared');
32
+ }
33
+ else {
34
+ // Warn if STEP_END received but no active STEP_START found
35
+ console.warn('Received STEP_END but found no active STEP_START log entry to hide.');
36
+ }
37
+ }
38
+ // Note: The .haibun-step-start class is added in messages.ts LogEntry constructor
39
+ // Auto-scroll the container to the bottom
40
+ container.scrollTop = container.scrollHeight;
41
+ }
42
+ function renderAllLogs() {
43
+ const container = document.getElementById('haibun-log-display-area');
44
+ if (container) {
45
+ window.haibunLogData.forEach(renderLogEntry);
46
+ void sequenceDiagramGenerator.update();
47
+ }
48
+ }
49
+ // Initial render on page load
50
+ document.addEventListener('DOMContentLoaded', () => {
51
+ console.log("Monitor DOMContentLoaded");
52
+ // Set start time on body for relative calculations
53
+ if (!document.body.dataset.startTime) {
54
+ document.body.dataset.startTime = `${Date.now()}`;
55
+ }
56
+ mermaid.initialize({ startOnLoad: false, securityLevel: 'loose' });
57
+ renderAllLogs();
58
+ setupControls();
59
+ console.log("Initial logs rendered.");
60
+ });
61
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/monitor/monitor.ts"],"names":[],"mappings":"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"}