tracebug-sdk
Advanced tools
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } | ||
| var _chunkUIVYYBRNcjs = require('./chunk-UIVYYBRN.cjs'); | ||
| var _chunkTJC4FAJOcjs = require('./chunk-TJC4FAJO.cjs'); | ||
| // src/ui/issues-panel.ts | ||
| var PANEL_ID = "tracebug-issues-panel"; | ||
| var STYLE_ID = "tracebug-issues-panel-styles"; | ||
| var _isOpen = false; | ||
| var _root = null; | ||
| var SEVERITY_COLORS = { | ||
| critical: { bg: "#7f1d1d", fg: "#fee2e2", border: "#dc2626" }, | ||
| serious: { bg: "#7c2d12", fg: "#fed7aa", border: "#ea580c" }, | ||
| moderate: { bg: "#713f12", fg: "#fde68a", border: "#ca8a04" }, | ||
| minor: { bg: "#1e3a8a", fg: "#bfdbfe", border: "#2563eb" } | ||
| }; | ||
| var DETECTOR_LABELS = { | ||
| "axe-a11y": "A11y", | ||
| "broken-image": "Broken image", | ||
| "mixed-content": "Mixed content", | ||
| "console-error": "JS error", | ||
| "slow-api": "Slow API", | ||
| "failed-request": "Failed request", | ||
| "frustration-rage": "Rage clicks", | ||
| "frustration-dead": "Dead click", | ||
| "frustration-abandon": "Form abandoned", | ||
| "frustration-error-correlated": "Click \u2192 error" | ||
| }; | ||
| function isIssuesPanelOpen() { | ||
| return _isOpen; | ||
| } | ||
| async function showIssuesPanel(root, options) { | ||
| var _a; | ||
| if (_isOpen) return; | ||
| _root = root; | ||
| _injectStyles(); | ||
| _open(root, { issues: [], loading: true }); | ||
| try { | ||
| if ((_a = options == null ? void 0 : options.rescan) != null ? _a : true) { | ||
| await _chunkUIVYYBRNcjs.scan.call(void 0, ); | ||
| } | ||
| } catch (err) { | ||
| console.warn("[TraceBug] Scan failed:", err); | ||
| } | ||
| _renderBody(_chunkUIVYYBRNcjs.getIssues.call(void 0, )); | ||
| } | ||
| function _injectStyles() { | ||
| if (document.getElementById(STYLE_ID)) return; | ||
| const style = document.createElement("style"); | ||
| style.id = STYLE_ID; | ||
| style.textContent = ` | ||
| @keyframes tracebug-issue-locate-flash { | ||
| 0%, 100% { box-shadow: 0 0 0 0 rgba(123,97,255,0.0); outline: 2px solid transparent; } | ||
| 30% { box-shadow: 0 0 0 6px rgba(123,97,255,0.5); outline: 2px solid #7C5CFF; } | ||
| } | ||
| #${PANEL_ID}-overlay { | ||
| position: fixed !important; | ||
| inset: 0 !important; | ||
| z-index: 2147483647 !important; | ||
| background: rgba(0,0,0,0.75) !important; | ||
| backdrop-filter: blur(6px) !important; | ||
| display: flex !important; | ||
| align-items: center !important; | ||
| justify-content: center !important; | ||
| padding: 20px !important; | ||
| pointer-events: auto !important; | ||
| box-sizing: border-box !important; | ||
| } | ||
| #${PANEL_ID} { | ||
| background: var(--tb-bg-secondary, #1a1a2e) !important; | ||
| border: 1px solid var(--tb-border-hover, #3a3a5e) !important; | ||
| border-radius: var(--tb-radius-lg, 12px) !important; | ||
| width: 100% !important; | ||
| max-width: 720px !important; | ||
| max-height: 90vh !important; | ||
| display: flex !important; | ||
| flex-direction: column !important; | ||
| overflow: hidden !important; | ||
| font-family: var(--tb-font-family, system-ui, -apple-system, sans-serif) !important; | ||
| color: var(--tb-text-primary, #e0e0e0) !important; | ||
| box-sizing: border-box !important; | ||
| box-shadow: 0 20px 60px rgba(0,0,0,0.5) !important; | ||
| } | ||
| #${PANEL_ID} *, #${PANEL_ID} *::before, #${PANEL_ID} *::after { box-sizing: border-box !important; } | ||
| #${PANEL_ID} button { font-family: inherit !important; cursor: pointer !important; } | ||
| #${PANEL_ID} .tb-issue-row { | ||
| padding: 12px 14px; | ||
| border-top: 1px solid var(--tb-border, #2a2a3e); | ||
| display: flex; | ||
| gap: 12px; | ||
| align-items: flex-start; | ||
| } | ||
| #${PANEL_ID} .tb-issue-row:hover { background: var(--tb-bg-primary, #0f0f1a); } | ||
| #${PANEL_ID} .tb-sev-badge { | ||
| font-size: 10px; | ||
| font-weight: 700; | ||
| padding: 3px 7px; | ||
| border-radius: 4px; | ||
| letter-spacing: 0.4px; | ||
| text-transform: uppercase; | ||
| flex-shrink: 0; | ||
| border: 1px solid; | ||
| } | ||
| #${PANEL_ID} .tb-detector-tag { | ||
| font-size: 10px; | ||
| color: var(--tb-text-muted, #888); | ||
| background: var(--tb-bg-primary, #0f0f1a); | ||
| border: 1px solid var(--tb-border, #2a2a3e); | ||
| padding: 2px 6px; | ||
| border-radius: 4px; | ||
| flex-shrink: 0; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions { | ||
| display: flex; | ||
| gap: 6px; | ||
| flex-shrink: 0; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button { | ||
| background: transparent; | ||
| color: var(--tb-text-secondary, #aaa); | ||
| border: 1px solid var(--tb-border, #2a2a3e); | ||
| border-radius: 4px; | ||
| padding: 4px 10px; | ||
| font-size: 11px; | ||
| transition: all 0.15s; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button:hover { | ||
| background: var(--tb-btn-hover, #ffffff15); | ||
| color: var(--tb-text-primary, #fff); | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button[data-action="file"] { | ||
| background: var(--tb-accent, #7C5CFF); | ||
| color: #fff; | ||
| border-color: transparent; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button[data-action="file"]:hover { opacity: 0.9; } | ||
| `; | ||
| document.head.appendChild(style); | ||
| } | ||
| function _open(root, state) { | ||
| var _a; | ||
| _isOpen = true; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| const overlay = document.createElement("div"); | ||
| overlay.id = `${PANEL_ID}-overlay`; | ||
| overlay.dataset.tracebug = "issues-panel-overlay"; | ||
| overlay.setAttribute("role", "dialog"); | ||
| overlay.setAttribute("aria-modal", "true"); | ||
| overlay.setAttribute("aria-label", "Page issues"); | ||
| const panel = document.createElement("div"); | ||
| panel.id = PANEL_ID; | ||
| panel.dataset.tracebug = "issues-panel"; | ||
| panel.innerHTML = _shellHtml(state); | ||
| overlay.appendChild(panel); | ||
| root.appendChild(overlay); | ||
| _wireShellHandlers(overlay, panel); | ||
| } | ||
| function _shellHtml(state) { | ||
| return ` | ||
| <div data-tb-issues="header" style="padding:16px 18px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--tb-border, #2a2a3e)"> | ||
| <span style="font-size:20px">\u{1F50D}</span> | ||
| <div style="flex:1;min-width:0"> | ||
| <div style="font-size:16px;font-weight:700;color:var(--tb-text-primary, #fff)">Page Issues</div> | ||
| <div data-tb-issues="subtitle" style="font-size:11px;color:var(--tb-text-muted, #888);margin-top:2px">${state.loading ? "Scanning\u2026" : "No scan yet"}</div> | ||
| </div> | ||
| <button data-tb-issues="rescan" style="background:transparent;color:var(--tb-text-secondary, #aaa);border:1px solid var(--tb-border, #2a2a3e);border-radius:6px;padding:6px 12px;font-size:12px;display:flex;align-items:center;gap:6px"> | ||
| <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-3-6.7"/><polyline points="21 3 21 9 15 9"/></svg> | ||
| Rescan | ||
| </button> | ||
| <button data-tb-issues="close" aria-label="Close" style="background:none;border:none;color:var(--tb-text-muted, #888);font-size:20px;padding:4px 8px;border-radius:6px">×</button> | ||
| </div> | ||
| <div data-tb-issues="body" style="flex:1;overflow-y:auto;min-height:200px"> | ||
| ${state.loading ? _loadingHtml() : ""} | ||
| </div> | ||
| `; | ||
| } | ||
| function _loadingHtml() { | ||
| return ` | ||
| <div style="padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px"> | ||
| <div style="font-size:24px;margin-bottom:8px">\u{1F50D}</div> | ||
| Scanning page for issues\u2026 | ||
| <div style="font-size:11px;margin-top:6px;opacity:0.7">Loading axe-core, checking images, network calls, JS errors\u2026</div> | ||
| </div> | ||
| `; | ||
| } | ||
| function _wireShellHandlers(overlay, panel) { | ||
| const close = () => { | ||
| _isOpen = false; | ||
| overlay.remove(); | ||
| document.removeEventListener("keydown", escHandler); | ||
| }; | ||
| panel.querySelector('[data-tb-issues="close"]').addEventListener("click", close); | ||
| overlay.addEventListener("click", (e) => { | ||
| if (e.target === overlay) close(); | ||
| }); | ||
| panel.querySelector('[data-tb-issues="rescan"]').addEventListener("click", async () => { | ||
| const body = panel.querySelector('[data-tb-issues="body"]'); | ||
| body.innerHTML = _loadingHtml(); | ||
| const sub = panel.querySelector('[data-tb-issues="subtitle"]'); | ||
| sub.textContent = "Scanning\u2026"; | ||
| await _chunkUIVYYBRNcjs.scan.call(void 0, ); | ||
| _renderBody(_chunkUIVYYBRNcjs.getIssues.call(void 0, )); | ||
| }); | ||
| const escHandler = (e) => { | ||
| if (e.key === "Escape") close(); | ||
| }; | ||
| document.addEventListener("keydown", escHandler); | ||
| } | ||
| function _renderBody(issues) { | ||
| const panel = document.getElementById(PANEL_ID); | ||
| if (!panel) return; | ||
| const body = panel.querySelector('[data-tb-issues="body"]'); | ||
| const subtitle = panel.querySelector('[data-tb-issues="subtitle"]'); | ||
| if (issues.length === 0) { | ||
| subtitle.textContent = "No issues found"; | ||
| body.innerHTML = ` | ||
| <div style="padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px"> | ||
| <div style="font-size:32px;margin-bottom:8px">\u2713</div> | ||
| Clean scan \u2014 no issues detected on this page. | ||
| <div style="font-size:11px;margin-top:6px;opacity:0.7">Includes a11y \xB7 broken images \xB7 mixed content \xB7 JS errors \xB7 failed/slow API calls</div> | ||
| </div> | ||
| `; | ||
| return; | ||
| } | ||
| const counts = {}; | ||
| for (const i of issues) counts[i.severity] = (counts[i.severity] || 0) + 1; | ||
| const summary = ["critical", "serious", "moderate", "minor"].filter((s) => counts[s]).map((s) => `${counts[s]} ${s}`).join(" \xB7 "); | ||
| subtitle.textContent = `${issues.length} issue${issues.length === 1 ? "" : "s"} \xB7 ${summary}`; | ||
| body.innerHTML = issues.map((issue) => _issueRowHtml(issue)).join(""); | ||
| body.querySelectorAll("[data-tb-issue-id]").forEach((row) => { | ||
| var _a, _b, _c; | ||
| const id = row.dataset.tbIssueId; | ||
| const issue = issues.find((i) => i.id === id); | ||
| if (!issue) return; | ||
| (_a = row.querySelector('[data-action="locate"]')) == null ? void 0 : _a.addEventListener("click", () => _locate(issue)); | ||
| (_b = row.querySelector('[data-action="dismiss"]')) == null ? void 0 : _b.addEventListener("click", () => { | ||
| _chunkUIVYYBRNcjs.dismissIssue.call(void 0, id); | ||
| _renderBody(_chunkUIVYYBRNcjs.getIssues.call(void 0, )); | ||
| }); | ||
| (_c = row.querySelector('[data-action="file"]')) == null ? void 0 : _c.addEventListener("click", () => _fileAsBug(issue)); | ||
| }); | ||
| } | ||
| function _issueRowHtml(issue) { | ||
| const colors = SEVERITY_COLORS[issue.severity]; | ||
| const detectorLabel = DETECTOR_LABELS[issue.detector]; | ||
| const desc = issue.description.length > 240 ? issue.description.slice(0, 237) + "\u2026" : issue.description; | ||
| const repeats = (issue.occurrences || 1) > 1; | ||
| const samplesHtml = repeats && issue.contextSamples && issue.contextSamples.length > 0 ? `<details style="margin-top:6px;font-size:11px"> | ||
| <summary style="cursor:pointer;color:var(--tb-text-muted, #888)"> | ||
| View all ${issue.occurrences} contexts | ||
| </summary> | ||
| <ol style="margin:6px 0 0 20px;padding:0;color:var(--tb-text-secondary, #aaa);line-height:1.5"> | ||
| ${issue.contextSamples.map((s) => ` | ||
| <li>${new Date(s.timestamp).toLocaleTimeString()}${s.precedingAction ? ` \xB7 ${_chunkTJC4FAJOcjs.escapeHtml.call(void 0, s.precedingAction)}` : ""}</li> | ||
| `).join("")} | ||
| </ol> | ||
| </details>` : ""; | ||
| return ` | ||
| <div class="tb-issue-row" data-tb-issue-id="${issue.id}"> | ||
| <span class="tb-sev-badge" style="background:${colors.bg};color:${colors.fg};border-color:${colors.border}">${issue.severity}</span> | ||
| <div style="flex:1;min-width:0"> | ||
| <div style="display:flex;align-items:center;gap:6px;margin-bottom:4px;flex-wrap:wrap"> | ||
| <span class="tb-detector-tag">${detectorLabel}</span> | ||
| <span style="font-size:13px;color:var(--tb-text-primary, #e0e0e0);font-weight:500">${_chunkTJC4FAJOcjs.escapeHtml.call(void 0, issue.title)}</span> | ||
| </div> | ||
| <div style="font-size:11px;color:var(--tb-text-muted, #888);line-height:1.5;white-space:pre-wrap">${_chunkTJC4FAJOcjs.escapeHtml.call(void 0, desc)}</div> | ||
| ${issue.helpUrl ? `<a href="${issue.helpUrl}" target="_blank" rel="noopener noreferrer" style="font-size:11px;color:var(--tb-accent, #7C5CFF);margin-top:4px;display:inline-block">Learn more \u2192</a>` : ""} | ||
| ${samplesHtml} | ||
| </div> | ||
| <div class="tb-issue-actions"> | ||
| ${issue.selector ? `<button data-action="locate" title="Highlight on page">\u{1F4CD} Locate</button>` : ""} | ||
| <button data-action="file" title="File as bug ticket">File ticket</button> | ||
| <button data-action="dismiss" title="Dismiss for this session">Dismiss</button> | ||
| </div> | ||
| </div> | ||
| `; | ||
| } | ||
| function _locate(issue) { | ||
| var _a; | ||
| if (!issue.selector) return; | ||
| let el = null; | ||
| try { | ||
| el = document.querySelector(issue.selector); | ||
| } catch (e) { | ||
| el = null; | ||
| } | ||
| if (!el) return; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| _isOpen = false; | ||
| el.scrollIntoView({ behavior: "smooth", block: "center" }); | ||
| const htmlEl = el; | ||
| const prevOutline = htmlEl.style.outline; | ||
| const prevTransition = htmlEl.style.transition; | ||
| htmlEl.style.transition = "outline 0.2s, box-shadow 0.2s"; | ||
| htmlEl.style.outline = "3px solid #7C5CFF"; | ||
| htmlEl.style.boxShadow = "0 0 0 6px rgba(123,97,255,0.35)"; | ||
| setTimeout(() => { | ||
| htmlEl.style.outline = prevOutline; | ||
| htmlEl.style.boxShadow = ""; | ||
| htmlEl.style.transition = prevTransition; | ||
| }, 2400); | ||
| } | ||
| function _fileAsBug(issue) { | ||
| var _a; | ||
| const root = _root || document.getElementById("tracebug-root"); | ||
| if (!root) return; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| _isOpen = false; | ||
| Promise.resolve().then(() => _interopRequireWildcard(require("./quick-bug-EZNFAUXX.cjs"))).then((m) => { | ||
| m.showQuickBugCapture(root, { | ||
| prefilledTitle: issue.title, | ||
| prefilledDescription: _bugDescriptionFromIssue(issue) | ||
| }).catch(() => { | ||
| }); | ||
| }); | ||
| } | ||
| function _bugDescriptionFromIssue(issue) { | ||
| const lines = []; | ||
| lines.push(`> Detected by TraceBug auto-scanner: **${DETECTOR_LABELS[issue.detector]}** (${issue.severity})`); | ||
| lines.push(""); | ||
| lines.push(issue.description); | ||
| if (issue.selector) lines.push(` | ||
| **Selector:** \`${issue.selector}\``); | ||
| if (issue.url) lines.push(`**URL:** \`${issue.url}\``); | ||
| if (issue.helpUrl) lines.push(`**Reference:** ${issue.helpUrl}`); | ||
| return lines.join("\n"); | ||
| } | ||
| exports.isIssuesPanelOpen = isIssuesPanelOpen; exports.showIssuesPanel = showIssuesPanel; | ||
| //# sourceMappingURL=issues-panel-6DFTKBUY.cjs.map |
| {"version":3,"sources":["d:\\Project\\TraceBug-ai\\dist\\issues-panel-6DFTKBUY.cjs"],"names":[],"mappings":"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E,QAAQ,CAAC;AAChB,EAAE,CAAC;AACH,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAClC;AACA,SAAS,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;AAC5B,EAAE,IAAI,EAAE;AACR,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,8GAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAA;AACA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA,oBAAA;AACA;AACA;AACA,WAAA;AACA,iBAAA;AACA,WAAA;AACA;AACA,iBAAA;AACA,EAAA;AACA,gDAAA;AACA,mDAAA;AACA;AACA;AACA,wCAAA;AACA,6FAAA;AACA;AACA,0GAAA;AACA,QAAA;AACA,QAAA;AACA;AACA;AACA,QAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,gBAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA","file":"D:\\Project\\TraceBug-ai\\dist\\issues-panel-6DFTKBUY.cjs","sourcesContent":[null]} |
| import { | ||
| dismissIssue, | ||
| getIssues, | ||
| scan | ||
| } from "./chunk-6NVJTQ76.js"; | ||
| import { | ||
| escapeHtml | ||
| } from "./chunk-2HLGXXHV.js"; | ||
| // src/ui/issues-panel.ts | ||
| var PANEL_ID = "tracebug-issues-panel"; | ||
| var STYLE_ID = "tracebug-issues-panel-styles"; | ||
| var _isOpen = false; | ||
| var _root = null; | ||
| var SEVERITY_COLORS = { | ||
| critical: { bg: "#7f1d1d", fg: "#fee2e2", border: "#dc2626" }, | ||
| serious: { bg: "#7c2d12", fg: "#fed7aa", border: "#ea580c" }, | ||
| moderate: { bg: "#713f12", fg: "#fde68a", border: "#ca8a04" }, | ||
| minor: { bg: "#1e3a8a", fg: "#bfdbfe", border: "#2563eb" } | ||
| }; | ||
| var DETECTOR_LABELS = { | ||
| "axe-a11y": "A11y", | ||
| "broken-image": "Broken image", | ||
| "mixed-content": "Mixed content", | ||
| "console-error": "JS error", | ||
| "slow-api": "Slow API", | ||
| "failed-request": "Failed request", | ||
| "frustration-rage": "Rage clicks", | ||
| "frustration-dead": "Dead click", | ||
| "frustration-abandon": "Form abandoned", | ||
| "frustration-error-correlated": "Click \u2192 error" | ||
| }; | ||
| function isIssuesPanelOpen() { | ||
| return _isOpen; | ||
| } | ||
| async function showIssuesPanel(root, options) { | ||
| var _a; | ||
| if (_isOpen) return; | ||
| _root = root; | ||
| _injectStyles(); | ||
| _open(root, { issues: [], loading: true }); | ||
| try { | ||
| if ((_a = options == null ? void 0 : options.rescan) != null ? _a : true) { | ||
| await scan(); | ||
| } | ||
| } catch (err) { | ||
| console.warn("[TraceBug] Scan failed:", err); | ||
| } | ||
| _renderBody(getIssues()); | ||
| } | ||
| function _injectStyles() { | ||
| if (document.getElementById(STYLE_ID)) return; | ||
| const style = document.createElement("style"); | ||
| style.id = STYLE_ID; | ||
| style.textContent = ` | ||
| @keyframes tracebug-issue-locate-flash { | ||
| 0%, 100% { box-shadow: 0 0 0 0 rgba(123,97,255,0.0); outline: 2px solid transparent; } | ||
| 30% { box-shadow: 0 0 0 6px rgba(123,97,255,0.5); outline: 2px solid #7C5CFF; } | ||
| } | ||
| #${PANEL_ID}-overlay { | ||
| position: fixed !important; | ||
| inset: 0 !important; | ||
| z-index: 2147483647 !important; | ||
| background: rgba(0,0,0,0.75) !important; | ||
| backdrop-filter: blur(6px) !important; | ||
| display: flex !important; | ||
| align-items: center !important; | ||
| justify-content: center !important; | ||
| padding: 20px !important; | ||
| pointer-events: auto !important; | ||
| box-sizing: border-box !important; | ||
| } | ||
| #${PANEL_ID} { | ||
| background: var(--tb-bg-secondary, #1a1a2e) !important; | ||
| border: 1px solid var(--tb-border-hover, #3a3a5e) !important; | ||
| border-radius: var(--tb-radius-lg, 12px) !important; | ||
| width: 100% !important; | ||
| max-width: 720px !important; | ||
| max-height: 90vh !important; | ||
| display: flex !important; | ||
| flex-direction: column !important; | ||
| overflow: hidden !important; | ||
| font-family: var(--tb-font-family, system-ui, -apple-system, sans-serif) !important; | ||
| color: var(--tb-text-primary, #e0e0e0) !important; | ||
| box-sizing: border-box !important; | ||
| box-shadow: 0 20px 60px rgba(0,0,0,0.5) !important; | ||
| } | ||
| #${PANEL_ID} *, #${PANEL_ID} *::before, #${PANEL_ID} *::after { box-sizing: border-box !important; } | ||
| #${PANEL_ID} button { font-family: inherit !important; cursor: pointer !important; } | ||
| #${PANEL_ID} .tb-issue-row { | ||
| padding: 12px 14px; | ||
| border-top: 1px solid var(--tb-border, #2a2a3e); | ||
| display: flex; | ||
| gap: 12px; | ||
| align-items: flex-start; | ||
| } | ||
| #${PANEL_ID} .tb-issue-row:hover { background: var(--tb-bg-primary, #0f0f1a); } | ||
| #${PANEL_ID} .tb-sev-badge { | ||
| font-size: 10px; | ||
| font-weight: 700; | ||
| padding: 3px 7px; | ||
| border-radius: 4px; | ||
| letter-spacing: 0.4px; | ||
| text-transform: uppercase; | ||
| flex-shrink: 0; | ||
| border: 1px solid; | ||
| } | ||
| #${PANEL_ID} .tb-detector-tag { | ||
| font-size: 10px; | ||
| color: var(--tb-text-muted, #888); | ||
| background: var(--tb-bg-primary, #0f0f1a); | ||
| border: 1px solid var(--tb-border, #2a2a3e); | ||
| padding: 2px 6px; | ||
| border-radius: 4px; | ||
| flex-shrink: 0; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions { | ||
| display: flex; | ||
| gap: 6px; | ||
| flex-shrink: 0; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button { | ||
| background: transparent; | ||
| color: var(--tb-text-secondary, #aaa); | ||
| border: 1px solid var(--tb-border, #2a2a3e); | ||
| border-radius: 4px; | ||
| padding: 4px 10px; | ||
| font-size: 11px; | ||
| transition: all 0.15s; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button:hover { | ||
| background: var(--tb-btn-hover, #ffffff15); | ||
| color: var(--tb-text-primary, #fff); | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button[data-action="file"] { | ||
| background: var(--tb-accent, #7C5CFF); | ||
| color: #fff; | ||
| border-color: transparent; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button[data-action="file"]:hover { opacity: 0.9; } | ||
| `; | ||
| document.head.appendChild(style); | ||
| } | ||
| function _open(root, state) { | ||
| var _a; | ||
| _isOpen = true; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| const overlay = document.createElement("div"); | ||
| overlay.id = `${PANEL_ID}-overlay`; | ||
| overlay.dataset.tracebug = "issues-panel-overlay"; | ||
| overlay.setAttribute("role", "dialog"); | ||
| overlay.setAttribute("aria-modal", "true"); | ||
| overlay.setAttribute("aria-label", "Page issues"); | ||
| const panel = document.createElement("div"); | ||
| panel.id = PANEL_ID; | ||
| panel.dataset.tracebug = "issues-panel"; | ||
| panel.innerHTML = _shellHtml(state); | ||
| overlay.appendChild(panel); | ||
| root.appendChild(overlay); | ||
| _wireShellHandlers(overlay, panel); | ||
| } | ||
| function _shellHtml(state) { | ||
| return ` | ||
| <div data-tb-issues="header" style="padding:16px 18px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--tb-border, #2a2a3e)"> | ||
| <span style="font-size:20px">\u{1F50D}</span> | ||
| <div style="flex:1;min-width:0"> | ||
| <div style="font-size:16px;font-weight:700;color:var(--tb-text-primary, #fff)">Page Issues</div> | ||
| <div data-tb-issues="subtitle" style="font-size:11px;color:var(--tb-text-muted, #888);margin-top:2px">${state.loading ? "Scanning\u2026" : "No scan yet"}</div> | ||
| </div> | ||
| <button data-tb-issues="rescan" style="background:transparent;color:var(--tb-text-secondary, #aaa);border:1px solid var(--tb-border, #2a2a3e);border-radius:6px;padding:6px 12px;font-size:12px;display:flex;align-items:center;gap:6px"> | ||
| <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-3-6.7"/><polyline points="21 3 21 9 15 9"/></svg> | ||
| Rescan | ||
| </button> | ||
| <button data-tb-issues="close" aria-label="Close" style="background:none;border:none;color:var(--tb-text-muted, #888);font-size:20px;padding:4px 8px;border-radius:6px">×</button> | ||
| </div> | ||
| <div data-tb-issues="body" style="flex:1;overflow-y:auto;min-height:200px"> | ||
| ${state.loading ? _loadingHtml() : ""} | ||
| </div> | ||
| `; | ||
| } | ||
| function _loadingHtml() { | ||
| return ` | ||
| <div style="padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px"> | ||
| <div style="font-size:24px;margin-bottom:8px">\u{1F50D}</div> | ||
| Scanning page for issues\u2026 | ||
| <div style="font-size:11px;margin-top:6px;opacity:0.7">Loading axe-core, checking images, network calls, JS errors\u2026</div> | ||
| </div> | ||
| `; | ||
| } | ||
| function _wireShellHandlers(overlay, panel) { | ||
| const close = () => { | ||
| _isOpen = false; | ||
| overlay.remove(); | ||
| document.removeEventListener("keydown", escHandler); | ||
| }; | ||
| panel.querySelector('[data-tb-issues="close"]').addEventListener("click", close); | ||
| overlay.addEventListener("click", (e) => { | ||
| if (e.target === overlay) close(); | ||
| }); | ||
| panel.querySelector('[data-tb-issues="rescan"]').addEventListener("click", async () => { | ||
| const body = panel.querySelector('[data-tb-issues="body"]'); | ||
| body.innerHTML = _loadingHtml(); | ||
| const sub = panel.querySelector('[data-tb-issues="subtitle"]'); | ||
| sub.textContent = "Scanning\u2026"; | ||
| await scan(); | ||
| _renderBody(getIssues()); | ||
| }); | ||
| const escHandler = (e) => { | ||
| if (e.key === "Escape") close(); | ||
| }; | ||
| document.addEventListener("keydown", escHandler); | ||
| } | ||
| function _renderBody(issues) { | ||
| const panel = document.getElementById(PANEL_ID); | ||
| if (!panel) return; | ||
| const body = panel.querySelector('[data-tb-issues="body"]'); | ||
| const subtitle = panel.querySelector('[data-tb-issues="subtitle"]'); | ||
| if (issues.length === 0) { | ||
| subtitle.textContent = "No issues found"; | ||
| body.innerHTML = ` | ||
| <div style="padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px"> | ||
| <div style="font-size:32px;margin-bottom:8px">\u2713</div> | ||
| Clean scan \u2014 no issues detected on this page. | ||
| <div style="font-size:11px;margin-top:6px;opacity:0.7">Includes a11y \xB7 broken images \xB7 mixed content \xB7 JS errors \xB7 failed/slow API calls</div> | ||
| </div> | ||
| `; | ||
| return; | ||
| } | ||
| const counts = {}; | ||
| for (const i of issues) counts[i.severity] = (counts[i.severity] || 0) + 1; | ||
| const summary = ["critical", "serious", "moderate", "minor"].filter((s) => counts[s]).map((s) => `${counts[s]} ${s}`).join(" \xB7 "); | ||
| subtitle.textContent = `${issues.length} issue${issues.length === 1 ? "" : "s"} \xB7 ${summary}`; | ||
| body.innerHTML = issues.map((issue) => _issueRowHtml(issue)).join(""); | ||
| body.querySelectorAll("[data-tb-issue-id]").forEach((row) => { | ||
| var _a, _b, _c; | ||
| const id = row.dataset.tbIssueId; | ||
| const issue = issues.find((i) => i.id === id); | ||
| if (!issue) return; | ||
| (_a = row.querySelector('[data-action="locate"]')) == null ? void 0 : _a.addEventListener("click", () => _locate(issue)); | ||
| (_b = row.querySelector('[data-action="dismiss"]')) == null ? void 0 : _b.addEventListener("click", () => { | ||
| dismissIssue(id); | ||
| _renderBody(getIssues()); | ||
| }); | ||
| (_c = row.querySelector('[data-action="file"]')) == null ? void 0 : _c.addEventListener("click", () => _fileAsBug(issue)); | ||
| }); | ||
| } | ||
| function _issueRowHtml(issue) { | ||
| const colors = SEVERITY_COLORS[issue.severity]; | ||
| const detectorLabel = DETECTOR_LABELS[issue.detector]; | ||
| const desc = issue.description.length > 240 ? issue.description.slice(0, 237) + "\u2026" : issue.description; | ||
| const repeats = (issue.occurrences || 1) > 1; | ||
| const samplesHtml = repeats && issue.contextSamples && issue.contextSamples.length > 0 ? `<details style="margin-top:6px;font-size:11px"> | ||
| <summary style="cursor:pointer;color:var(--tb-text-muted, #888)"> | ||
| View all ${issue.occurrences} contexts | ||
| </summary> | ||
| <ol style="margin:6px 0 0 20px;padding:0;color:var(--tb-text-secondary, #aaa);line-height:1.5"> | ||
| ${issue.contextSamples.map((s) => ` | ||
| <li>${new Date(s.timestamp).toLocaleTimeString()}${s.precedingAction ? ` \xB7 ${escapeHtml(s.precedingAction)}` : ""}</li> | ||
| `).join("")} | ||
| </ol> | ||
| </details>` : ""; | ||
| return ` | ||
| <div class="tb-issue-row" data-tb-issue-id="${issue.id}"> | ||
| <span class="tb-sev-badge" style="background:${colors.bg};color:${colors.fg};border-color:${colors.border}">${issue.severity}</span> | ||
| <div style="flex:1;min-width:0"> | ||
| <div style="display:flex;align-items:center;gap:6px;margin-bottom:4px;flex-wrap:wrap"> | ||
| <span class="tb-detector-tag">${detectorLabel}</span> | ||
| <span style="font-size:13px;color:var(--tb-text-primary, #e0e0e0);font-weight:500">${escapeHtml(issue.title)}</span> | ||
| </div> | ||
| <div style="font-size:11px;color:var(--tb-text-muted, #888);line-height:1.5;white-space:pre-wrap">${escapeHtml(desc)}</div> | ||
| ${issue.helpUrl ? `<a href="${issue.helpUrl}" target="_blank" rel="noopener noreferrer" style="font-size:11px;color:var(--tb-accent, #7C5CFF);margin-top:4px;display:inline-block">Learn more \u2192</a>` : ""} | ||
| ${samplesHtml} | ||
| </div> | ||
| <div class="tb-issue-actions"> | ||
| ${issue.selector ? `<button data-action="locate" title="Highlight on page">\u{1F4CD} Locate</button>` : ""} | ||
| <button data-action="file" title="File as bug ticket">File ticket</button> | ||
| <button data-action="dismiss" title="Dismiss for this session">Dismiss</button> | ||
| </div> | ||
| </div> | ||
| `; | ||
| } | ||
| function _locate(issue) { | ||
| var _a; | ||
| if (!issue.selector) return; | ||
| let el = null; | ||
| try { | ||
| el = document.querySelector(issue.selector); | ||
| } catch (e) { | ||
| el = null; | ||
| } | ||
| if (!el) return; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| _isOpen = false; | ||
| el.scrollIntoView({ behavior: "smooth", block: "center" }); | ||
| const htmlEl = el; | ||
| const prevOutline = htmlEl.style.outline; | ||
| const prevTransition = htmlEl.style.transition; | ||
| htmlEl.style.transition = "outline 0.2s, box-shadow 0.2s"; | ||
| htmlEl.style.outline = "3px solid #7C5CFF"; | ||
| htmlEl.style.boxShadow = "0 0 0 6px rgba(123,97,255,0.35)"; | ||
| setTimeout(() => { | ||
| htmlEl.style.outline = prevOutline; | ||
| htmlEl.style.boxShadow = ""; | ||
| htmlEl.style.transition = prevTransition; | ||
| }, 2400); | ||
| } | ||
| function _fileAsBug(issue) { | ||
| var _a; | ||
| const root = _root || document.getElementById("tracebug-root"); | ||
| if (!root) return; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| _isOpen = false; | ||
| import("./quick-bug-GSDUMPVJ.js").then((m) => { | ||
| m.showQuickBugCapture(root, { | ||
| prefilledTitle: issue.title, | ||
| prefilledDescription: _bugDescriptionFromIssue(issue) | ||
| }).catch(() => { | ||
| }); | ||
| }); | ||
| } | ||
| function _bugDescriptionFromIssue(issue) { | ||
| const lines = []; | ||
| lines.push(`> Detected by TraceBug auto-scanner: **${DETECTOR_LABELS[issue.detector]}** (${issue.severity})`); | ||
| lines.push(""); | ||
| lines.push(issue.description); | ||
| if (issue.selector) lines.push(` | ||
| **Selector:** \`${issue.selector}\``); | ||
| if (issue.url) lines.push(`**URL:** \`${issue.url}\``); | ||
| if (issue.helpUrl) lines.push(`**Reference:** ${issue.helpUrl}`); | ||
| return lines.join("\n"); | ||
| } | ||
| export { | ||
| isIssuesPanelOpen, | ||
| showIssuesPanel | ||
| }; | ||
| //# sourceMappingURL=issues-panel-6FF6CTAU.js.map |
| {"version":3,"sources":["../src/ui/issues-panel.ts"],"sourcesContent":["// ── Issues Panel ──────────────────────────────────────────────────────────\r\n// Modal that lists scanner findings grouped by severity. Each row offers\r\n// \"Locate\" (flash the offending element on the page) and \"File ticket\"\r\n// (open the Quick Bug modal pre-filled with the issue's context).\r\n//\r\n// Styles are injected in <head> with !important so host-page CSS resets\r\n// (Tailwind preflight, Bootstrap, etc.) can't squish the layout.\r\n\r\nimport { Issue } from \"../types\";\r\nimport { dismissIssue, getIssues, scan } from \"../scanner\";\r\nimport { escapeHtml } from \"./helpers\";\r\n\r\nconst PANEL_ID = \"tracebug-issues-panel\";\r\nconst STYLE_ID = \"tracebug-issues-panel-styles\";\r\n\r\nlet _isOpen = false;\r\nlet _root: HTMLElement | null = null;\r\n\r\nconst SEVERITY_COLORS: Record<Issue[\"severity\"], { bg: string; fg: string; border: string }> = {\r\n critical: { bg: \"#7f1d1d\", fg: \"#fee2e2\", border: \"#dc2626\" },\r\n serious: { bg: \"#7c2d12\", fg: \"#fed7aa\", border: \"#ea580c\" },\r\n moderate: { bg: \"#713f12\", fg: \"#fde68a\", border: \"#ca8a04\" },\r\n minor: { bg: \"#1e3a8a\", fg: \"#bfdbfe\", border: \"#2563eb\" },\r\n};\r\n\r\nconst DETECTOR_LABELS: Record<Issue[\"detector\"], string> = {\r\n \"axe-a11y\": \"A11y\",\r\n \"broken-image\": \"Broken image\",\r\n \"mixed-content\": \"Mixed content\",\r\n \"console-error\": \"JS error\",\r\n \"slow-api\": \"Slow API\",\r\n \"failed-request\": \"Failed request\",\r\n \"frustration-rage\": \"Rage clicks\",\r\n \"frustration-dead\": \"Dead click\",\r\n \"frustration-abandon\": \"Form abandoned\",\r\n \"frustration-error-correlated\": \"Click → error\",\r\n};\r\n\r\nexport function isIssuesPanelOpen(): boolean {\r\n return _isOpen;\r\n}\r\n\r\n/**\r\n * Run a scan (or use cached results) and open the panel. The scan promise\r\n * resolves before we render so the panel never flashes empty.\r\n */\r\nexport async function showIssuesPanel(\r\n root: HTMLElement,\r\n options?: { rescan?: boolean }\r\n): Promise<void> {\r\n if (_isOpen) return;\r\n _root = root;\r\n _injectStyles();\r\n\r\n // Render shell with a loading state so the user gets immediate feedback.\r\n _open(root, { issues: [], loading: true });\r\n try {\r\n if (options?.rescan ?? true) {\r\n await scan();\r\n }\r\n } catch (err) {\r\n console.warn(\"[TraceBug] Scan failed:\", err);\r\n }\r\n _renderBody(getIssues());\r\n}\r\n\r\nfunction _injectStyles(): void {\r\n if (document.getElementById(STYLE_ID)) return;\r\n const style = document.createElement(\"style\");\r\n style.id = STYLE_ID;\r\n style.textContent = `\r\n @keyframes tracebug-issue-locate-flash {\r\n 0%, 100% { box-shadow: 0 0 0 0 rgba(123,97,255,0.0); outline: 2px solid transparent; }\r\n 30% { box-shadow: 0 0 0 6px rgba(123,97,255,0.5); outline: 2px solid #7C5CFF; }\r\n }\r\n #${PANEL_ID}-overlay {\r\n position: fixed !important;\r\n inset: 0 !important;\r\n z-index: 2147483647 !important;\r\n background: rgba(0,0,0,0.75) !important;\r\n backdrop-filter: blur(6px) !important;\r\n display: flex !important;\r\n align-items: center !important;\r\n justify-content: center !important;\r\n padding: 20px !important;\r\n pointer-events: auto !important;\r\n box-sizing: border-box !important;\r\n }\r\n #${PANEL_ID} {\r\n background: var(--tb-bg-secondary, #1a1a2e) !important;\r\n border: 1px solid var(--tb-border-hover, #3a3a5e) !important;\r\n border-radius: var(--tb-radius-lg, 12px) !important;\r\n width: 100% !important;\r\n max-width: 720px !important;\r\n max-height: 90vh !important;\r\n display: flex !important;\r\n flex-direction: column !important;\r\n overflow: hidden !important;\r\n font-family: var(--tb-font-family, system-ui, -apple-system, sans-serif) !important;\r\n color: var(--tb-text-primary, #e0e0e0) !important;\r\n box-sizing: border-box !important;\r\n box-shadow: 0 20px 60px rgba(0,0,0,0.5) !important;\r\n }\r\n #${PANEL_ID} *, #${PANEL_ID} *::before, #${PANEL_ID} *::after { box-sizing: border-box !important; }\r\n #${PANEL_ID} button { font-family: inherit !important; cursor: pointer !important; }\r\n #${PANEL_ID} .tb-issue-row {\r\n padding: 12px 14px;\r\n border-top: 1px solid var(--tb-border, #2a2a3e);\r\n display: flex;\r\n gap: 12px;\r\n align-items: flex-start;\r\n }\r\n #${PANEL_ID} .tb-issue-row:hover { background: var(--tb-bg-primary, #0f0f1a); }\r\n #${PANEL_ID} .tb-sev-badge {\r\n font-size: 10px;\r\n font-weight: 700;\r\n padding: 3px 7px;\r\n border-radius: 4px;\r\n letter-spacing: 0.4px;\r\n text-transform: uppercase;\r\n flex-shrink: 0;\r\n border: 1px solid;\r\n }\r\n #${PANEL_ID} .tb-detector-tag {\r\n font-size: 10px;\r\n color: var(--tb-text-muted, #888);\r\n background: var(--tb-bg-primary, #0f0f1a);\r\n border: 1px solid var(--tb-border, #2a2a3e);\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n flex-shrink: 0;\r\n }\r\n #${PANEL_ID} .tb-issue-actions {\r\n display: flex;\r\n gap: 6px;\r\n flex-shrink: 0;\r\n }\r\n #${PANEL_ID} .tb-issue-actions button {\r\n background: transparent;\r\n color: var(--tb-text-secondary, #aaa);\r\n border: 1px solid var(--tb-border, #2a2a3e);\r\n border-radius: 4px;\r\n padding: 4px 10px;\r\n font-size: 11px;\r\n transition: all 0.15s;\r\n }\r\n #${PANEL_ID} .tb-issue-actions button:hover {\r\n background: var(--tb-btn-hover, #ffffff15);\r\n color: var(--tb-text-primary, #fff);\r\n }\r\n #${PANEL_ID} .tb-issue-actions button[data-action=\"file\"] {\r\n background: var(--tb-accent, #7C5CFF);\r\n color: #fff;\r\n border-color: transparent;\r\n }\r\n #${PANEL_ID} .tb-issue-actions button[data-action=\"file\"]:hover { opacity: 0.9; }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\nfunction _open(root: HTMLElement, state: { issues: Issue[]; loading: boolean }): void {\r\n _isOpen = true;\r\n // Remove any prior overlay (defensive — should not happen).\r\n document.getElementById(`${PANEL_ID}-overlay`)?.remove();\r\n\r\n const overlay = document.createElement(\"div\");\r\n overlay.id = `${PANEL_ID}-overlay`;\r\n overlay.dataset.tracebug = \"issues-panel-overlay\";\r\n overlay.setAttribute(\"role\", \"dialog\");\r\n overlay.setAttribute(\"aria-modal\", \"true\");\r\n overlay.setAttribute(\"aria-label\", \"Page issues\");\r\n\r\n const panel = document.createElement(\"div\");\r\n panel.id = PANEL_ID;\r\n panel.dataset.tracebug = \"issues-panel\";\r\n\r\n panel.innerHTML = _shellHtml(state);\r\n\r\n overlay.appendChild(panel);\r\n root.appendChild(overlay);\r\n\r\n _wireShellHandlers(overlay, panel);\r\n}\r\n\r\nfunction _shellHtml(state: { issues: Issue[]; loading: boolean }): string {\r\n return `\r\n <div data-tb-issues=\"header\" style=\"padding:16px 18px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--tb-border, #2a2a3e)\">\r\n <span style=\"font-size:20px\">🔍</span>\r\n <div style=\"flex:1;min-width:0\">\r\n <div style=\"font-size:16px;font-weight:700;color:var(--tb-text-primary, #fff)\">Page Issues</div>\r\n <div data-tb-issues=\"subtitle\" style=\"font-size:11px;color:var(--tb-text-muted, #888);margin-top:2px\">${state.loading ? \"Scanning…\" : \"No scan yet\"}</div>\r\n </div>\r\n <button data-tb-issues=\"rescan\" style=\"background:transparent;color:var(--tb-text-secondary, #aaa);border:1px solid var(--tb-border, #2a2a3e);border-radius:6px;padding:6px 12px;font-size:12px;display:flex;align-items:center;gap:6px\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12a9 9 0 1 1-3-6.7\"/><polyline points=\"21 3 21 9 15 9\"/></svg>\r\n Rescan\r\n </button>\r\n <button data-tb-issues=\"close\" aria-label=\"Close\" style=\"background:none;border:none;color:var(--tb-text-muted, #888);font-size:20px;padding:4px 8px;border-radius:6px\">×</button>\r\n </div>\r\n <div data-tb-issues=\"body\" style=\"flex:1;overflow-y:auto;min-height:200px\">\r\n ${state.loading ? _loadingHtml() : \"\"}\r\n </div>\r\n `;\r\n}\r\n\r\nfunction _loadingHtml(): string {\r\n return `\r\n <div style=\"padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px\">\r\n <div style=\"font-size:24px;margin-bottom:8px\">🔍</div>\r\n Scanning page for issues…\r\n <div style=\"font-size:11px;margin-top:6px;opacity:0.7\">Loading axe-core, checking images, network calls, JS errors…</div>\r\n </div>\r\n `;\r\n}\r\n\r\nfunction _wireShellHandlers(overlay: HTMLElement, panel: HTMLElement): void {\r\n const close = () => {\r\n _isOpen = false;\r\n overlay.remove();\r\n document.removeEventListener(\"keydown\", escHandler);\r\n };\r\n panel.querySelector('[data-tb-issues=\"close\"]')!.addEventListener(\"click\", close);\r\n overlay.addEventListener(\"click\", (e) => { if (e.target === overlay) close(); });\r\n\r\n panel.querySelector('[data-tb-issues=\"rescan\"]')!.addEventListener(\"click\", async () => {\r\n const body = panel.querySelector('[data-tb-issues=\"body\"]') as HTMLElement;\r\n body.innerHTML = _loadingHtml();\r\n const sub = panel.querySelector('[data-tb-issues=\"subtitle\"]') as HTMLElement;\r\n sub.textContent = \"Scanning…\";\r\n await scan();\r\n _renderBody(getIssues());\r\n });\r\n\r\n const escHandler = (e: KeyboardEvent) => { if (e.key === \"Escape\") close(); };\r\n document.addEventListener(\"keydown\", escHandler);\r\n}\r\n\r\nfunction _renderBody(issues: Issue[]): void {\r\n const panel = document.getElementById(PANEL_ID);\r\n if (!panel) return;\r\n const body = panel.querySelector('[data-tb-issues=\"body\"]') as HTMLElement;\r\n const subtitle = panel.querySelector('[data-tb-issues=\"subtitle\"]') as HTMLElement;\r\n\r\n if (issues.length === 0) {\r\n subtitle.textContent = \"No issues found\";\r\n body.innerHTML = `\r\n <div style=\"padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px\">\r\n <div style=\"font-size:32px;margin-bottom:8px\">✓</div>\r\n Clean scan — no issues detected on this page.\r\n <div style=\"font-size:11px;margin-top:6px;opacity:0.7\">Includes a11y · broken images · mixed content · JS errors · failed/slow API calls</div>\r\n </div>\r\n `;\r\n return;\r\n }\r\n\r\n // Severity counts in subtitle\r\n const counts: Record<string, number> = {};\r\n for (const i of issues) counts[i.severity] = (counts[i.severity] || 0) + 1;\r\n const summary = [\"critical\", \"serious\", \"moderate\", \"minor\"]\r\n .filter(s => counts[s])\r\n .map(s => `${counts[s]} ${s}`)\r\n .join(\" · \");\r\n subtitle.textContent = `${issues.length} issue${issues.length === 1 ? \"\" : \"s\"} · ${summary}`;\r\n\r\n body.innerHTML = issues.map(issue => _issueRowHtml(issue)).join(\"\");\r\n\r\n // Wire row actions\r\n body.querySelectorAll<HTMLElement>(\"[data-tb-issue-id]\").forEach(row => {\r\n const id = row.dataset.tbIssueId!;\r\n const issue = issues.find(i => i.id === id);\r\n if (!issue) return;\r\n\r\n row.querySelector('[data-action=\"locate\"]')?.addEventListener(\"click\", () => _locate(issue));\r\n row.querySelector('[data-action=\"dismiss\"]')?.addEventListener(\"click\", () => {\r\n dismissIssue(id);\r\n _renderBody(getIssues());\r\n });\r\n row.querySelector('[data-action=\"file\"]')?.addEventListener(\"click\", () => _fileAsBug(issue));\r\n });\r\n}\r\n\r\nfunction _issueRowHtml(issue: Issue): string {\r\n const colors = SEVERITY_COLORS[issue.severity];\r\n const detectorLabel = DETECTOR_LABELS[issue.detector];\r\n const desc = issue.description.length > 240\r\n ? issue.description.slice(0, 237) + \"…\"\r\n : issue.description;\r\n\r\n // Fingerprint dedup: when occurrences > 1 show a collapsible <details>\r\n // listing each occurrence with its preceding action.\r\n const repeats = (issue.occurrences || 1) > 1;\r\n const samplesHtml = repeats && issue.contextSamples && issue.contextSamples.length > 0\r\n ? `<details style=\"margin-top:6px;font-size:11px\">\r\n <summary style=\"cursor:pointer;color:var(--tb-text-muted, #888)\">\r\n View all ${issue.occurrences} contexts\r\n </summary>\r\n <ol style=\"margin:6px 0 0 20px;padding:0;color:var(--tb-text-secondary, #aaa);line-height:1.5\">\r\n ${issue.contextSamples.map(s => `\r\n <li>${new Date(s.timestamp).toLocaleTimeString()}${s.precedingAction ? ` · ${escapeHtml(s.precedingAction)}` : \"\"}</li>\r\n `).join(\"\")}\r\n </ol>\r\n </details>`\r\n : \"\";\r\n\r\n return `\r\n <div class=\"tb-issue-row\" data-tb-issue-id=\"${issue.id}\">\r\n <span class=\"tb-sev-badge\" style=\"background:${colors.bg};color:${colors.fg};border-color:${colors.border}\">${issue.severity}</span>\r\n <div style=\"flex:1;min-width:0\">\r\n <div style=\"display:flex;align-items:center;gap:6px;margin-bottom:4px;flex-wrap:wrap\">\r\n <span class=\"tb-detector-tag\">${detectorLabel}</span>\r\n <span style=\"font-size:13px;color:var(--tb-text-primary, #e0e0e0);font-weight:500\">${escapeHtml(issue.title)}</span>\r\n </div>\r\n <div style=\"font-size:11px;color:var(--tb-text-muted, #888);line-height:1.5;white-space:pre-wrap\">${escapeHtml(desc)}</div>\r\n ${issue.helpUrl ? `<a href=\"${issue.helpUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"font-size:11px;color:var(--tb-accent, #7C5CFF);margin-top:4px;display:inline-block\">Learn more →</a>` : \"\"}\r\n ${samplesHtml}\r\n </div>\r\n <div class=\"tb-issue-actions\">\r\n ${issue.selector ? `<button data-action=\"locate\" title=\"Highlight on page\">📍 Locate</button>` : \"\"}\r\n <button data-action=\"file\" title=\"File as bug ticket\">File ticket</button>\r\n <button data-action=\"dismiss\" title=\"Dismiss for this session\">Dismiss</button>\r\n </div>\r\n </div>\r\n `;\r\n}\r\n\r\n/**\r\n * Briefly outline the offending element. Closes the panel so the page is\r\n * visible. Restores after 2.4s — non-destructive flash.\r\n */\r\nfunction _locate(issue: Issue): void {\r\n if (!issue.selector) return;\r\n let el: Element | null = null;\r\n try {\r\n el = document.querySelector(issue.selector);\r\n } catch {\r\n el = null;\r\n }\r\n if (!el) return;\r\n\r\n // Close the panel so the user can see the page.\r\n document.getElementById(`${PANEL_ID}-overlay`)?.remove();\r\n _isOpen = false;\r\n\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n const htmlEl = el as HTMLElement;\r\n const prevOutline = htmlEl.style.outline;\r\n const prevTransition = htmlEl.style.transition;\r\n htmlEl.style.transition = \"outline 0.2s, box-shadow 0.2s\";\r\n htmlEl.style.outline = \"3px solid #7C5CFF\";\r\n htmlEl.style.boxShadow = \"0 0 0 6px rgba(123,97,255,0.35)\";\r\n setTimeout(() => {\r\n htmlEl.style.outline = prevOutline;\r\n htmlEl.style.boxShadow = \"\";\r\n htmlEl.style.transition = prevTransition;\r\n }, 2400);\r\n}\r\n\r\n/**\r\n * Pre-fill the Quick Bug modal with the issue's title + description as the\r\n * starting point for a ticket. Reuses the existing ticket-export pipeline.\r\n */\r\nfunction _fileAsBug(issue: Issue): void {\r\n const root = _root || document.getElementById(\"tracebug-root\");\r\n if (!root) return;\r\n // Close the issues panel.\r\n document.getElementById(`${PANEL_ID}-overlay`)?.remove();\r\n _isOpen = false;\r\n\r\n import(\"./quick-bug\").then(m => {\r\n m.showQuickBugCapture(root, {\r\n prefilledTitle: issue.title,\r\n prefilledDescription: _bugDescriptionFromIssue(issue),\r\n }).catch(() => {});\r\n });\r\n}\r\n\r\nfunction _bugDescriptionFromIssue(issue: Issue): string {\r\n const lines: string[] = [];\r\n lines.push(`> Detected by TraceBug auto-scanner: **${DETECTOR_LABELS[issue.detector]}** (${issue.severity})`);\r\n lines.push(\"\");\r\n lines.push(issue.description);\r\n if (issue.selector) lines.push(`\\n**Selector:** \\`${issue.selector}\\``);\r\n if (issue.url) lines.push(`**URL:** \\`${issue.url}\\``);\r\n if (issue.helpUrl) lines.push(`**Reference:** ${issue.helpUrl}`);\r\n return lines.join(\"\\n\");\r\n}\r\n"],"mappings":"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","names":[]} |
| "use strict";Object.defineProperty(exports, "__esModule", {value: true}); | ||
| var _chunkEWCBKPY6cjs = require('./chunk-EWCBKPY6.cjs'); | ||
| require('./chunk-DGVJEOXU.cjs'); | ||
| require('./chunk-TJC4FAJO.cjs'); | ||
| exports.isQuickBugOpen = _chunkEWCBKPY6cjs.isQuickBugOpen; exports.refreshQuickBugCapture = _chunkEWCBKPY6cjs.refreshQuickBugCapture; exports.setCloudEndpoint = _chunkEWCBKPY6cjs.setCloudEndpoint; exports.setGithubRepo = _chunkEWCBKPY6cjs.setGithubRepo; exports.showQuickBugCapture = _chunkEWCBKPY6cjs.showQuickBugCapture; | ||
| //# sourceMappingURL=quick-bug-EZNFAUXX.cjs.map |
| {"version":3,"sources":["d:\\Project\\TraceBug-ai\\dist\\quick-bug-EZNFAUXX.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,kUAAC","file":"D:\\Project\\TraceBug-ai\\dist\\quick-bug-EZNFAUXX.cjs"} |
| import { | ||
| isQuickBugOpen, | ||
| refreshQuickBugCapture, | ||
| setCloudEndpoint, | ||
| setGithubRepo, | ||
| showQuickBugCapture | ||
| } from "./chunk-72WKX3GR.js"; | ||
| import "./chunk-YUUUST42.js"; | ||
| import "./chunk-2HLGXXHV.js"; | ||
| export { | ||
| isQuickBugOpen, | ||
| refreshQuickBugCapture, | ||
| setCloudEndpoint, | ||
| setGithubRepo, | ||
| showQuickBugCapture | ||
| }; | ||
| //# sourceMappingURL=quick-bug-GSDUMPVJ.js.map |
| {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]} |
+486
-12
| #!/usr/bin/env node | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||
| var __esm = (fn, res) => function __init() { | ||
| return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; | ||
| }; | ||
| var __export = (target, all) => { | ||
| for (var name in all) | ||
| __defProp(target, name, { get: all[name], enumerable: true }); | ||
| }; | ||
| // cli/mcp-server.ts | ||
| var mcp_server_exports = {}; | ||
| __export(mcp_server_exports, { | ||
| PROMPT_DEFINITIONS: () => PROMPT_DEFINITIONS, | ||
| TOOL_DEFINITIONS: () => TOOL_DEFINITIONS, | ||
| buildDebugPrompt: () => buildDebugPrompt, | ||
| buildInvestigationGuide: () => buildInvestigationGuide, | ||
| callTool: () => callTool, | ||
| handleMessage: () => handleMessage, | ||
| parseReportFile: () => parseReportFile, | ||
| runMcpServer: () => runMcpServer, | ||
| scanReportFiles: () => scanReportFiles, | ||
| toolGetBugReport: () => toolGetBugReport, | ||
| toolGetConsoleErrors: () => toolGetConsoleErrors, | ||
| toolGetNetworkActivity: () => toolGetNetworkActivity, | ||
| toolGetReproSteps: () => toolGetReproSteps, | ||
| toolGetScreenshot: () => toolGetScreenshot, | ||
| toolListBugReports: () => toolListBugReports | ||
| }); | ||
| import * as fs from "fs"; | ||
| import * as path from "path"; | ||
| function parseReportFile(filePath) { | ||
| let raw; | ||
| try { | ||
| raw = fs.readFileSync(filePath, "utf8"); | ||
| } catch { | ||
| return null; | ||
| } | ||
| try { | ||
| if (filePath.endsWith(".html")) { | ||
| const m = TB_DATA_RE.exec(raw); | ||
| if (!m) return null; | ||
| const payload = JSON.parse(m[1].replace(/<\\\/script>/gi, "</script>")); | ||
| return isReportPayload(payload) ? payload : null; | ||
| } | ||
| if (filePath.endsWith(".json")) { | ||
| const payload = JSON.parse(raw); | ||
| return isReportPayload(payload) ? payload : null; | ||
| } | ||
| } catch { | ||
| return null; | ||
| } | ||
| return null; | ||
| } | ||
| function isReportPayload(p) { | ||
| return typeof p === "object" && p !== null && typeof p.meta === "object" && p.meta !== null && typeof p.meta.title === "string" && typeof p.meta.sessionId === "string"; | ||
| } | ||
| function scanReportFiles(dir, depth = 0) { | ||
| if (depth > MAX_SCAN_DEPTH) return []; | ||
| let entries; | ||
| try { | ||
| entries = fs.readdirSync(dir, { withFileTypes: true }); | ||
| } catch { | ||
| return []; | ||
| } | ||
| const found = []; | ||
| for (const entry of entries) { | ||
| const full = path.join(dir, entry.name); | ||
| if (entry.isDirectory()) { | ||
| if (!SKIP_DIRS.has(entry.name) && !entry.name.startsWith(".")) { | ||
| found.push(...scanReportFiles(full, depth + 1)); | ||
| } | ||
| } else if (entry.name.endsWith(".html") || entry.name.endsWith(".json")) { | ||
| if (parseReportFile(full) !== null) found.push(full); | ||
| } | ||
| } | ||
| return found; | ||
| } | ||
| function requireReport(baseDir, file) { | ||
| const direct = path.isAbsolute(file) ? file : path.join(baseDir, file); | ||
| const directPayload = parseReportFile(direct); | ||
| if (directPayload) return { payload: directPayload, resolved: direct }; | ||
| const candidates = scanReportFiles(baseDir); | ||
| const query = file.toLowerCase(); | ||
| let match = candidates.find((c) => path.basename(c).toLowerCase() === query); | ||
| if (!match) { | ||
| match = candidates.find((c) => { | ||
| if (path.basename(c).toLowerCase().includes(query)) return true; | ||
| const p = parseReportFile(c); | ||
| return p !== null && p.meta.title.toLowerCase().includes(query); | ||
| }); | ||
| } | ||
| if (match) return { payload: parseReportFile(match), resolved: match }; | ||
| const available = candidates.map((c) => path.relative(baseDir, c) || c); | ||
| throw new Error( | ||
| `Not a TraceBug export: ${file}. ` + (available.length ? `Available reports: ${available.join(", ")}` : `No reports found under ${baseDir} \u2014 check the server's --dir.`) | ||
| ); | ||
| } | ||
| function buildInvestigationGuide(p) { | ||
| const steps = []; | ||
| const consoleErrors = p.consoleLogs?.filter((l) => l.level === "error").length ?? p.consoleErrors?.length ?? 0; | ||
| const netFailures = p.networkErrors?.length ?? 0; | ||
| const frustration = (p.actionChips ?? []).filter((c) => c.frustration).length; | ||
| const screenshots = p.screenshots?.length ?? 0; | ||
| const hintMentionsNetwork = /\b(request|response|http|4\d\d|5\d\d|status|api|fetch|xhr)\b/i.test( | ||
| p.rootCauseHint?.hint ?? "" | ||
| ); | ||
| const networkStep = netFailures > 0 && `[HIGH] get_network_activity \u2014 ${netFailures} failed request${netFailures === 1 ? "" : "s"} captured, with response-body snippets that often name the server-side error.`; | ||
| const consoleStep = consoleErrors > 0 && `[HIGH] get_console_errors \u2014 ${consoleErrors} console error${consoleErrors === 1 ? "" : "s"} captured; stack traces point at the failing file and function.`; | ||
| for (const step of hintMentionsNetwork ? [networkStep, consoleStep] : [consoleStep, networkStep]) { | ||
| if (step) steps.push(step); | ||
| } | ||
| steps.push( | ||
| frustration > 0 ? `[HIGH] get_repro_steps \u2014 includes ${frustration} frustration signal${frustration === 1 ? "" : "s"} (rage/dead clicks) marking where the user got stuck, plus the action-to-error timeline.` : `[MEDIUM] get_repro_steps \u2014 the plain-English steps and session timeline show what the user did leading up to the bug.` | ||
| ); | ||
| if (screenshots > 0) { | ||
| steps.push( | ||
| `[${consoleErrors || netFailures ? "MEDIUM" : "HIGH"}] get_screenshot \u2014 ${screenshots} screenshot${screenshots === 1 ? "" : "s"} showing the visual state when the bug was captured${consoleErrors || netFailures ? "" : " (no errors were captured, so visuals are a primary source)"}.` | ||
| ); | ||
| } | ||
| if (p.video?.comments?.length) { | ||
| steps.push( | ||
| `[MEDIUM] The video has ${p.video.comments.length} timestamped tester comment${p.video.comments.length === 1 ? "" : "s"} (included in get_bug_report) \u2014 read them, they mark the exact moments the tester flagged.` | ||
| ); | ||
| } | ||
| steps.push( | ||
| "Finally: cross-reference the findings with the codebase \u2014 search for the failing endpoint path, the symbols in the stack trace, or the UI text near the error \u2014 to locate the root cause and propose a fix." | ||
| ); | ||
| return steps; | ||
| } | ||
| function toolListBugReports(baseDir, args2) { | ||
| const scanDir = args2.dir ? path.isAbsolute(args2.dir) ? args2.dir : path.join(baseDir, args2.dir) : baseDir; | ||
| const files = scanReportFiles(scanDir); | ||
| const reports = files.map((file) => { | ||
| const p = parseReportFile(file); | ||
| return { | ||
| file: path.relative(baseDir, file) || file, | ||
| title: p.meta.title, | ||
| summary: p.meta.summary, | ||
| severity: p.meta.severity, | ||
| priority: p.meta.priority ?? null, | ||
| page: p.meta.page, | ||
| generatedAt: new Date(p.meta.generatedAt).toISOString(), | ||
| rootCause: p.rootCauseHint ?? p.meta.rootCause ?? null, | ||
| counts: { | ||
| consoleErrors: p.consoleErrors?.length ?? 0, | ||
| networkFailures: p.networkErrors?.length ?? 0, | ||
| userActions: p.actionChips?.length ?? p.actions?.length ?? 0, | ||
| screenshots: p.screenshots?.length ?? 0, | ||
| hasVideo: Boolean(p.video) | ||
| } | ||
| }; | ||
| }); | ||
| return { | ||
| count: reports.length, | ||
| scannedDir: scanDir, | ||
| reports, | ||
| ...reports.length ? { nextStep: "Call get_bug_report on a file for the full overview plus a prioritized investigation guide." } : {} | ||
| }; | ||
| } | ||
| function toolGetBugReport(baseDir, args2) { | ||
| const { payload: p } = requireReport(baseDir, args2.file); | ||
| return { | ||
| title: p.meta.title, | ||
| summary: p.meta.summary, | ||
| severity: p.meta.severity, | ||
| priority: p.meta.priority ?? null, | ||
| page: p.meta.page, | ||
| generatedAt: new Date(p.meta.generatedAt).toISOString(), | ||
| sessionDurationMs: p.meta.durationMs, | ||
| environment: p.meta.environment, | ||
| environmentDetails: p.info ?? [], | ||
| description: p.description || null, | ||
| rootCause: p.rootCauseHint ?? p.meta.rootCause ?? null, | ||
| annotations: p.annotations ?? [], | ||
| consoleErrorCount: p.consoleErrors?.length ?? 0, | ||
| networkFailureCount: p.networkErrors?.length ?? 0, | ||
| screenshotCount: p.screenshots?.length ?? 0, | ||
| video: p.video ? { durationMs: p.video.durationMs, comments: p.video.comments } : null, | ||
| investigationGuide: buildInvestigationGuide(p) | ||
| }; | ||
| } | ||
| function toolGetConsoleErrors(baseDir, args2) { | ||
| const { payload: p } = requireReport(baseDir, args2.file); | ||
| const logs = p.consoleLogs?.length ? p.consoleLogs : (p.consoleErrors ?? []).map((e) => ({ level: "error", ...e })); | ||
| return { | ||
| count: logs.length, | ||
| entries: logs.map((l) => ({ | ||
| level: l.level, | ||
| message: l.message, | ||
| stack: l.stack ?? null, | ||
| at: new Date(l.timestamp).toISOString() | ||
| })) | ||
| }; | ||
| } | ||
| function toolGetNetworkActivity(baseDir, args2) { | ||
| const { payload: p } = requireReport(baseDir, args2.file); | ||
| const failures = p.networkErrors ?? []; | ||
| const all = p.networkRequests ?? []; | ||
| const rows = args2.failuresOnly !== false ? failures : all.length ? all : failures; | ||
| return { | ||
| failureCount: failures.length, | ||
| totalCaptured: all.length || failures.length, | ||
| showing: args2.failuresOnly !== false ? "failures only (pass failuresOnly:false for all requests)" : "all requests", | ||
| requests: rows.map((r) => ({ | ||
| method: r.method, | ||
| url: r.url, | ||
| status: r.status, | ||
| durationMs: r.duration, | ||
| at: new Date(r.timestamp).toISOString(), | ||
| responseSnippet: r.response ?? null | ||
| })) | ||
| }; | ||
| } | ||
| function toolGetReproSteps(baseDir, args2) { | ||
| const { payload: p } = requireReport(baseDir, args2.file); | ||
| return { | ||
| title: p.meta.title, | ||
| rootCause: p.rootCauseHint ?? p.meta.rootCause ?? null, | ||
| steps: p.actions ?? [], | ||
| actions: (p.actionChips ?? []).map((c) => ({ | ||
| action: [c.verb, c.nounLabel ?? c.target].filter(Boolean).join(" "), | ||
| kind: c.kind, | ||
| detail: c.detail ?? null, | ||
| frustrationSignal: c.frustration ?? null, | ||
| causedError: c.isError ?? false, | ||
| at: new Date(c.timestamp).toISOString() | ||
| })), | ||
| timeline: (p.events ?? []).map((e) => ({ | ||
| elapsed: e.elapsed, | ||
| type: e.type, | ||
| description: e.description, | ||
| isError: e.isError | ||
| })) | ||
| }; | ||
| } | ||
| function toolGetScreenshot(baseDir, args2) { | ||
| const { payload: p } = requireReport(baseDir, args2.file); | ||
| const shots = p.screenshots ?? []; | ||
| const index = args2.index ?? 0; | ||
| if (!shots.length) throw new Error("This report contains no screenshots."); | ||
| if (index < 0 || index >= shots.length) { | ||
| throw new Error(`Screenshot index ${index} out of range (0\u2013${shots.length - 1}).`); | ||
| } | ||
| const shot = shots[index]; | ||
| const m = /^data:(image\/[a-z+]+);base64,(.+)$/s.exec(shot.dataUrl); | ||
| if (!m) throw new Error(`Screenshot ${index} has an unsupported data URL format.`); | ||
| return { | ||
| image: { mimeType: m[1], base64: m[2] }, | ||
| filename: shot.filename, | ||
| takenAt: new Date(shot.timestamp).toISOString(), | ||
| totalScreenshots: shots.length | ||
| }; | ||
| } | ||
| function buildDebugPrompt(file) { | ||
| const target = file?.trim(); | ||
| return [ | ||
| target ? `This is a TraceBug bug report: ${target}` : "Debug the most recent TraceBug bug report.", | ||
| "", | ||
| target ? `1. Call get_bug_report("${target}") to load the report overview and its investigation guide.` : "1. Call list_bug_reports to find the reports, then get_bug_report on the most recent one to load its overview and investigation guide.", | ||
| "2. Follow the investigation guide to gather the relevant data (console errors, network failures, repro steps, screenshots).", | ||
| "3. Cross-reference the findings with this codebase \u2014 search for the failing endpoint path, stack-trace symbols, or the UI text near the error \u2014 to identify the root cause.", | ||
| "4. Propose a concrete fix, citing the files and lines involved, and note edge cases worth testing once it lands." | ||
| ].join("\n"); | ||
| } | ||
| function callTool(baseDir, name, args2) { | ||
| try { | ||
| switch (name) { | ||
| case "list_bug_reports": | ||
| return textResult(toolListBugReports(baseDir, args2)); | ||
| case "get_bug_report": | ||
| return textResult(toolGetBugReport(baseDir, args2)); | ||
| case "get_console_errors": | ||
| return textResult(toolGetConsoleErrors(baseDir, args2)); | ||
| case "get_network_activity": | ||
| return textResult(toolGetNetworkActivity(baseDir, args2)); | ||
| case "get_repro_steps": | ||
| return textResult(toolGetReproSteps(baseDir, args2)); | ||
| case "get_screenshot": { | ||
| const r = toolGetScreenshot(baseDir, args2); | ||
| return { | ||
| content: [ | ||
| { type: "image", data: r.image.base64, mimeType: r.image.mimeType }, | ||
| { type: "text", text: JSON.stringify({ filename: r.filename, takenAt: r.takenAt, totalScreenshots: r.totalScreenshots }) } | ||
| ] | ||
| }; | ||
| } | ||
| default: | ||
| return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true }; | ||
| } | ||
| } catch (err) { | ||
| return { content: [{ type: "text", text: err instanceof Error ? err.message : String(err) }], isError: true }; | ||
| } | ||
| } | ||
| function textResult(data) { | ||
| return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] }; | ||
| } | ||
| function handleMessage(baseDir, msg) { | ||
| const isNotification = msg.id === void 0 || msg.id === null; | ||
| switch (msg.method) { | ||
| case "initialize": | ||
| return reply(msg.id, { | ||
| protocolVersion: msg.params?.protocolVersion || "2025-06-18", | ||
| capabilities: { tools: {}, prompts: {} }, | ||
| serverInfo: { name: "tracebug", version: SERVER_VERSION }, | ||
| instructions: "TraceBug exposes locally-exported bug reports (self-contained .html files) to AI agents. Call list_bug_reports to discover reports, then get_bug_report \u2014 it returns an investigation guide telling you which get_* tools to call next. All data is read from local disk \u2014 nothing is uploaded." | ||
| }); | ||
| case "ping": | ||
| return reply(msg.id, {}); | ||
| case "tools/list": | ||
| return reply(msg.id, { tools: TOOL_DEFINITIONS }); | ||
| case "tools/call": { | ||
| const name = msg.params?.name; | ||
| const args2 = msg.params?.arguments ?? {}; | ||
| return reply(msg.id, callTool(baseDir, name, args2)); | ||
| } | ||
| case "prompts/list": | ||
| return reply(msg.id, { prompts: PROMPT_DEFINITIONS }); | ||
| case "prompts/get": { | ||
| const promptName = msg.params?.name; | ||
| if (promptName !== "debug_bug_report") { | ||
| return { jsonrpc: "2.0", id: msg.id ?? null, error: { code: -32602, message: `Unknown prompt: ${promptName}` } }; | ||
| } | ||
| const promptArgs = msg.params?.arguments ?? {}; | ||
| return reply(msg.id, { | ||
| description: PROMPT_DEFINITIONS[0].description, | ||
| messages: [ | ||
| { role: "user", content: { type: "text", text: buildDebugPrompt(promptArgs.file) } } | ||
| ] | ||
| }); | ||
| } | ||
| default: | ||
| if (isNotification) return null; | ||
| return { jsonrpc: "2.0", id: msg.id, error: { code: -32601, message: `Method not found: ${msg.method}` } }; | ||
| } | ||
| } | ||
| function reply(id, result) { | ||
| return { jsonrpc: "2.0", id: id ?? null, result }; | ||
| } | ||
| function runMcpServer(baseDir, version) { | ||
| SERVER_VERSION = version; | ||
| process.stderr.write(`TraceBug MCP server \u2014 reading bug reports from ${baseDir} | ||
| `); | ||
| return new Promise((resolve) => { | ||
| let buffer = ""; | ||
| process.stdin.setEncoding("utf8"); | ||
| process.stdin.on("data", (chunk) => { | ||
| buffer += chunk; | ||
| let nl; | ||
| while ((nl = buffer.indexOf("\n")) !== -1) { | ||
| const line = buffer.slice(0, nl).trim(); | ||
| buffer = buffer.slice(nl + 1); | ||
| if (!line) continue; | ||
| let msg; | ||
| try { | ||
| msg = JSON.parse(line); | ||
| } catch { | ||
| process.stdout.write( | ||
| JSON.stringify({ jsonrpc: "2.0", id: null, error: { code: -32700, message: "Parse error" } }) + "\n" | ||
| ); | ||
| continue; | ||
| } | ||
| const response = handleMessage(baseDir, msg); | ||
| if (response) process.stdout.write(JSON.stringify(response) + "\n"); | ||
| } | ||
| }); | ||
| process.stdin.on("end", () => resolve()); | ||
| }); | ||
| } | ||
| var TB_DATA_RE, MAX_SCAN_DEPTH, SKIP_DIRS, FILE_PROP, TOOL_DEFINITIONS, PROMPT_DEFINITIONS, SERVER_VERSION; | ||
| var init_mcp_server = __esm({ | ||
| "cli/mcp-server.ts"() { | ||
| "use strict"; | ||
| TB_DATA_RE = /<script id="tb-data" type="application\/json">([\s\S]*?)<\/script>/; | ||
| MAX_SCAN_DEPTH = 3; | ||
| SKIP_DIRS = /* @__PURE__ */ new Set(["node_modules", ".git", ".next", "dist", "build", "coverage", "out"]); | ||
| FILE_PROP = { | ||
| file: { | ||
| type: "string", | ||
| description: "The report to read: a path to a TraceBug export file (.html), absolute or relative to the server's base directory \u2014 or just the filename, or a fragment of the filename or report title. Get exact paths from list_bug_reports." | ||
| } | ||
| }; | ||
| TOOL_DEFINITIONS = [ | ||
| { | ||
| name: "list_bug_reports", | ||
| description: "Scan a directory for TraceBug bug-report export files (.html/.json) and summarize each: title, summary, severity, root-cause hint, and captured-data counts. Start here.", | ||
| inputSchema: { | ||
| type: "object", | ||
| properties: { | ||
| dir: { type: "string", description: "Directory to scan (default: the server's base directory). Scans up to 3 levels deep, skipping node_modules etc." } | ||
| } | ||
| } | ||
| }, | ||
| { | ||
| name: "get_bug_report", | ||
| description: "Get the overview of one TraceBug bug report: title, summary, severity, root-cause hint, environment, tester annotations, and a prioritized investigation guide telling you which tools to call next for this specific bug. Call this before the other get_* tools.", | ||
| inputSchema: { type: "object", properties: { ...FILE_PROP }, required: ["file"] } | ||
| }, | ||
| { | ||
| name: "get_console_errors", | ||
| description: "Get the captured console output (errors, warnings, logs) with stack traces from a TraceBug bug report.", | ||
| inputSchema: { type: "object", properties: { ...FILE_PROP }, required: ["file"] } | ||
| }, | ||
| { | ||
| name: "get_network_activity", | ||
| description: "Get captured network requests from a TraceBug bug report. Defaults to failed requests (status >= 400 or 0) with response snippets; pass failuresOnly:false for every captured request.", | ||
| inputSchema: { | ||
| type: "object", | ||
| properties: { | ||
| ...FILE_PROP, | ||
| failuresOnly: { type: "boolean", description: "true (default) = failures only; false = all captured requests" } | ||
| }, | ||
| required: ["file"] | ||
| } | ||
| }, | ||
| { | ||
| name: "get_repro_steps", | ||
| description: "Get the reproduction context from a TraceBug bug report: plain-English steps, structured user actions (with rage/dead-click frustration signals), and the full session timeline.", | ||
| inputSchema: { type: "object", properties: { ...FILE_PROP }, required: ["file"] } | ||
| }, | ||
| { | ||
| name: "get_screenshot", | ||
| description: "Get one screenshot from a TraceBug bug report as an image. Screenshots are auto-named from the action that triggered them (e.g. 01_click_submit.png).", | ||
| inputSchema: { | ||
| type: "object", | ||
| properties: { | ||
| ...FILE_PROP, | ||
| index: { type: "number", description: "Zero-based screenshot index (default 0). list_bug_reports shows the count." } | ||
| }, | ||
| required: ["file"] | ||
| } | ||
| } | ||
| ]; | ||
| PROMPT_DEFINITIONS = [ | ||
| { | ||
| name: "debug_bug_report", | ||
| description: "Debug a TraceBug bug report: load it, follow its investigation guide, and cross-reference with the codebase to find the root cause and propose a fix.", | ||
| arguments: [ | ||
| { | ||
| name: "file", | ||
| description: "Which report to debug \u2014 a path, filename, or title fragment. Omit to pick the most recent report.", | ||
| required: false | ||
| } | ||
| ] | ||
| } | ||
| ]; | ||
| SERVER_VERSION = "0.0.0"; | ||
| } | ||
| }); | ||
| // cli/bin.ts | ||
@@ -20,4 +469,27 @@ var args = process.argv.slice(2); | ||
| } | ||
| if (command === "mcp") { | ||
| await startMcpServer(); | ||
| return; | ||
| } | ||
| console.log(`Unknown command: ${command}. Run ${CYAN}npx tracebug help${RESET}`); | ||
| } | ||
| async function startMcpServer() { | ||
| const { runMcpServer: runMcpServer2 } = await Promise.resolve().then(() => (init_mcp_server(), mcp_server_exports)); | ||
| const fs2 = await import("fs"); | ||
| const path2 = await import("path"); | ||
| const dirFlag = args.indexOf("--dir"); | ||
| const baseDir = dirFlag !== -1 && args[dirFlag + 1] ? path2.resolve(args[dirFlag + 1]) : process.cwd(); | ||
| let version = "0.0.0"; | ||
| for (const rel of ["./package.json", "../package.json"]) { | ||
| try { | ||
| const pkg = JSON.parse(fs2.readFileSync(new URL(rel, import.meta.url), "utf8")); | ||
| if (pkg.version) { | ||
| version = pkg.version; | ||
| break; | ||
| } | ||
| } catch { | ||
| } | ||
| } | ||
| await runMcpServer2(baseDir, version); | ||
| } | ||
| function printHelp() { | ||
@@ -29,2 +501,4 @@ console.log(` | ||
| ${CYAN}init${RESET} Set up TraceBug in your project | ||
| ${CYAN}mcp${RESET} Start the MCP server so AI agents (Claude Code, Cursor) can read | ||
| exported bug reports. Options: ${DIM}--dir <path>${RESET} (default: current dir) | ||
| ${CYAN}help${RESET} Show this help message | ||
@@ -43,10 +517,10 @@ | ||
| `); | ||
| const fs = await import("fs"); | ||
| const path = await import("path"); | ||
| const fs2 = await import("fs"); | ||
| const path2 = await import("path"); | ||
| const cwd = process.cwd(); | ||
| let framework = "vanilla"; | ||
| const pkgPath = path.join(cwd, "package.json"); | ||
| if (fs.existsSync(pkgPath)) { | ||
| const pkgPath = path2.join(cwd, "package.json"); | ||
| if (fs2.existsSync(pkgPath)) { | ||
| try { | ||
| const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8")); | ||
| const pkg = JSON.parse(fs2.readFileSync(pkgPath, "utf-8")); | ||
| const deps = { ...pkg.dependencies, ...pkg.devDependencies }; | ||
@@ -71,3 +545,3 @@ if (deps["next"]) framework = "nextjs"; | ||
| import("tracebug-sdk").then(({ default: TraceBug }) => { | ||
| TraceBug.init({ projectId: "${path.basename(cwd)}" }); | ||
| TraceBug.init({ projectId: "${path2.basename(cwd)}" }); | ||
| }); | ||
@@ -81,6 +555,6 @@ }, []); | ||
| import TraceBug from "tracebug-sdk"; | ||
| TraceBug.init({ projectId: "${path.basename(cwd)}" });`, | ||
| TraceBug.init({ projectId: "${path2.basename(cwd)}" });`, | ||
| vue: `// main.ts (add to your entry file) | ||
| import TraceBug from "tracebug-sdk"; | ||
| TraceBug.init({ projectId: "${path.basename(cwd)}" });`, | ||
| TraceBug.init({ projectId: "${path2.basename(cwd)}" });`, | ||
| svelte: `<!-- +layout.svelte (add to your root layout) --> | ||
@@ -90,11 +564,11 @@ <script> | ||
| import TraceBug from 'tracebug-sdk'; | ||
| onMount(() => TraceBug.init({ projectId: "${path.basename(cwd)}" })); | ||
| onMount(() => TraceBug.init({ projectId: "${path2.basename(cwd)}" })); | ||
| </script>`, | ||
| angular: `// app.component.ts (add to constructor or ngOnInit) | ||
| import TraceBug from "tracebug-sdk"; | ||
| TraceBug.init({ projectId: "${path.basename(cwd)}" });`, | ||
| TraceBug.init({ projectId: "${path2.basename(cwd)}" });`, | ||
| vanilla: `<!-- Add before </body> --> | ||
| <script type="module"> | ||
| import TraceBug from "tracebug-sdk"; | ||
| TraceBug.init({ projectId: "${path.basename(cwd)}" }); | ||
| TraceBug.init({ projectId: "${path2.basename(cwd)}" }); | ||
| </script>`, | ||
@@ -104,3 +578,3 @@ nuxt: `// plugins/tracebug.client.ts (create this file) | ||
| export default defineNuxtPlugin(() => { | ||
| TraceBug.init({ projectId: "${path.basename(cwd)}" }); | ||
| TraceBug.init({ projectId: "${path2.basename(cwd)}" }); | ||
| });` | ||
@@ -107,0 +581,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["d:\\Project\\TraceBug-ai\\dist\\index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;AACA,IAAI,mBAAmB,EAAE,GAAG;AAC5B,IAAI,wBAAwB,EAAE,GAAG;AACjC,IAAI,yBAAyB,EAAE,IAAI;AACnC,IAAI,mBAAmB,EAAE,EAAE,EAAE,GAAG;AAChC,IAAI,UAAU,EAAE,IAAI;AACpB,SAAS,SAAS,CAAC,aAAa,EAAE;AAClC,EAAE,GAAG,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,SAAS,IAAI,aAAa,EAAE;AAC1D,IAAI,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;AACpD,IAAI,UAAU,EAAE,IAAI,YAAY,CAAC,aAAa,CAAC;AAC/C,EAAE;AACF,EAAE,OAAO,SAAS;AAClB;AACA,IAAI,aAAa,EAAE,MAAM;AACzB,EAAE,WAAW,CAAC,aAAa,EAAE;AAC7B,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI;AACtB,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI;AAC5B,IAAI,IAAI,CAAC,QAAQ,kBAAkB,IAAI,GAAG,CAAC,CAAC;AAC5C,IAAI,IAAI,CAAC,oBAAoB,kBAAkB,IAAI,GAAG,CAAC,CAAC;AACxD,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI;AAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,oDAAoB,aAAc,CAAC;AACvD,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM;AAC/C,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACnD,EAAE;AACF;AACA,EAAE,KAAK,CAAC,EAAE;AACV,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,IAAI,CAAC,YAAY;AACnD,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;AACzD,MAAM,GAAG,CAAC,OAAO,OAAO,IAAI,YAAY,GAAG,OAAO,SAAS,IAAI,WAAW,EAAE;AAC5E,QAAQ,OAAO,CAAC,CAAC;AACjB,QAAQ,MAAM;AACd,MAAM;AACN,MAAM,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;AAC7D,MAAM,MAAM,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACrD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,EAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA;AACA,IAAA;AACA;AACA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACA,cAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"D:\\Project\\TraceBug-ai\\dist\\index.cjs","sourcesContent":[null]} | ||
| {"version":3,"sources":["d:\\Project\\TraceBug-ai\\dist\\index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;AACA,IAAI,mBAAmB,EAAE,GAAG;AAC5B,IAAI,wBAAwB,EAAE,GAAG;AACjC,IAAI,yBAAyB,EAAE,IAAI;AACnC,IAAI,mBAAmB,EAAE,EAAE,EAAE,GAAG;AAChC,IAAI,UAAU,EAAE,IAAI;AACpB,SAAS,SAAS,CAAC,aAAa,EAAE;AAClC,EAAE,GAAG,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,SAAS,IAAI,aAAa,EAAE;AAC1D,IAAI,UAAU,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;AACpD,IAAI,UAAU,EAAE,IAAI,YAAY,CAAC,aAAa,CAAC;AAC/C,EAAE;AACF,EAAE,OAAO,SAAS;AAClB;AACA,IAAI,aAAa,EAAE,MAAM;AACzB,EAAE,WAAW,CAAC,aAAa,EAAE;AAC7B,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI;AACtB,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI;AAC5B,IAAI,IAAI,CAAC,QAAQ,kBAAkB,IAAI,GAAG,CAAC,CAAC;AAC5C,IAAI,IAAI,CAAC,oBAAoB,kBAAkB,IAAI,GAAG,CAAC,CAAC;AACxD,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI;AAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,oDAAoB,aAAc,CAAC;AACvD,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM;AAC/C,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACnD,EAAE;AACF;AACA,EAAE,KAAK,CAAC,EAAE;AACV,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,IAAI,CAAC,YAAY;AACnD,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;AACzD,MAAM,GAAG,CAAC,OAAO,OAAO,IAAI,YAAY,GAAG,OAAO,SAAS,IAAI,WAAW,EAAE;AAC5E,QAAQ,OAAO,CAAC,CAAC;AACjB,QAAQ,MAAM;AACd,MAAM;AACN,MAAM,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;AAC7D,MAAM,MAAM,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACrD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,EAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA;AACA,IAAA;AACA;AACA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACA,cAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"D:\\Project\\TraceBug-ai\\dist\\index.cjs","sourcesContent":[null]} |
+2
-1
@@ -700,2 +700,3 @@ interface TraceBugConfig { | ||
| declare function generateAIPrompt(report: BugReport, options?: AIPromptOptions): string; | ||
| declare function generateMcpPrompt(filename: string): string; | ||
| declare function openInClaude(prompt: string): void; | ||
@@ -1098,2 +1099,2 @@ declare function openInChatGPT(prompt: string): void; | ||
| export { type AIPromptOptions, type Annotation, type AnnotationIntent, type BugReport, type ClickedElementSummary, type DrawRegion, type ElementAnnotation, type EnvironmentInfo, FREE_LIMITS, type Issue, type IssueDetector, type IssueSeverity, type JiraTicket, type NetworkErrorEntry, type NetworkFailure, type Plan, type RootCauseHint, type ScanResult, type ScreenshotData, type StoredSession, type TraceBugConfig, type TraceBugEvent, type TraceBugPlugin, type TraceBugUser, type UIAnnotationReport, type VideoComment, type VideoRecording, type VoiceTranscript, buildReport, buildTimeline, captureEnvironment, captureRegionScreenshot, captureRollingBuffer, captureScreenshot, clearAllSessions, clearIssues, clearVideoRecording, clearVoiceTranscripts, TraceBug as default, deleteSession, dismissIssue, downloadAllScreenshots, downloadPdfAsHtml, downloadVideoRecording, extractClickedElement, formatRootCauseLine, formatTimelineText, generateAIPrompt, generateBugTitle, generateFlowSummary, generateGitHubIssue, generateGitHubIssueUrl, generateJiraTicket, generatePdfReport, generateReproSteps, generateRootCauseHint, generateSessionSteps, generateSmartSummary, getAllSessions, getCaptureCount, getIssueById, getIssueCountsByDetector, getIssueCountsBySeverity, getIssues, getLastVideoRecording, getNetworkFailures, getPlan, getScreenshots, getVoiceTranscripts, hydratePlan, isPremium, isRollingMode, isVideoRecording, isVideoSupported as isVideoSupportedFn, isVoiceRecording, isVoiceSupported, openGitHubIssue, openInChatGPT, openInClaude, scan, setPlan, startVideoRecording, startVoiceRecording, stopVideoRecording, stopVoiceRecording, undismissIssue }; | ||
| export { type AIPromptOptions, type Annotation, type AnnotationIntent, type BugReport, type ClickedElementSummary, type DrawRegion, type ElementAnnotation, type EnvironmentInfo, FREE_LIMITS, type Issue, type IssueDetector, type IssueSeverity, type JiraTicket, type NetworkErrorEntry, type NetworkFailure, type Plan, type RootCauseHint, type ScanResult, type ScreenshotData, type StoredSession, type TraceBugConfig, type TraceBugEvent, type TraceBugPlugin, type TraceBugUser, type UIAnnotationReport, type VideoComment, type VideoRecording, type VoiceTranscript, buildReport, buildTimeline, captureEnvironment, captureRegionScreenshot, captureRollingBuffer, captureScreenshot, clearAllSessions, clearIssues, clearVideoRecording, clearVoiceTranscripts, TraceBug as default, deleteSession, dismissIssue, downloadAllScreenshots, downloadPdfAsHtml, downloadVideoRecording, extractClickedElement, formatRootCauseLine, formatTimelineText, generateAIPrompt, generateBugTitle, generateFlowSummary, generateGitHubIssue, generateGitHubIssueUrl, generateJiraTicket, generateMcpPrompt, generatePdfReport, generateReproSteps, generateRootCauseHint, generateSessionSteps, generateSmartSummary, getAllSessions, getCaptureCount, getIssueById, getIssueCountsByDetector, getIssueCountsBySeverity, getIssues, getLastVideoRecording, getNetworkFailures, getPlan, getScreenshots, getVoiceTranscripts, hydratePlan, isPremium, isRollingMode, isVideoRecording, isVideoSupported as isVideoSupportedFn, isVoiceRecording, isVoiceSupported, openGitHubIssue, openInChatGPT, openInClaude, scan, setPlan, startVideoRecording, startVoiceRecording, stopVideoRecording, stopVoiceRecording, undismissIssue }; |
+2
-1
@@ -700,2 +700,3 @@ interface TraceBugConfig { | ||
| declare function generateAIPrompt(report: BugReport, options?: AIPromptOptions): string; | ||
| declare function generateMcpPrompt(filename: string): string; | ||
| declare function openInClaude(prompt: string): void; | ||
@@ -1098,2 +1099,2 @@ declare function openInChatGPT(prompt: string): void; | ||
| export { type AIPromptOptions, type Annotation, type AnnotationIntent, type BugReport, type ClickedElementSummary, type DrawRegion, type ElementAnnotation, type EnvironmentInfo, FREE_LIMITS, type Issue, type IssueDetector, type IssueSeverity, type JiraTicket, type NetworkErrorEntry, type NetworkFailure, type Plan, type RootCauseHint, type ScanResult, type ScreenshotData, type StoredSession, type TraceBugConfig, type TraceBugEvent, type TraceBugPlugin, type TraceBugUser, type UIAnnotationReport, type VideoComment, type VideoRecording, type VoiceTranscript, buildReport, buildTimeline, captureEnvironment, captureRegionScreenshot, captureRollingBuffer, captureScreenshot, clearAllSessions, clearIssues, clearVideoRecording, clearVoiceTranscripts, TraceBug as default, deleteSession, dismissIssue, downloadAllScreenshots, downloadPdfAsHtml, downloadVideoRecording, extractClickedElement, formatRootCauseLine, formatTimelineText, generateAIPrompt, generateBugTitle, generateFlowSummary, generateGitHubIssue, generateGitHubIssueUrl, generateJiraTicket, generatePdfReport, generateReproSteps, generateRootCauseHint, generateSessionSteps, generateSmartSummary, getAllSessions, getCaptureCount, getIssueById, getIssueCountsByDetector, getIssueCountsBySeverity, getIssues, getLastVideoRecording, getNetworkFailures, getPlan, getScreenshots, getVoiceTranscripts, hydratePlan, isPremium, isRollingMode, isVideoRecording, isVideoSupported as isVideoSupportedFn, isVoiceRecording, isVoiceSupported, openGitHubIssue, openInChatGPT, openInClaude, scan, setPlan, startVideoRecording, startVoiceRecording, stopVideoRecording, stopVoiceRecording, undismissIssue }; | ||
| export { type AIPromptOptions, type Annotation, type AnnotationIntent, type BugReport, type ClickedElementSummary, type DrawRegion, type ElementAnnotation, type EnvironmentInfo, FREE_LIMITS, type Issue, type IssueDetector, type IssueSeverity, type JiraTicket, type NetworkErrorEntry, type NetworkFailure, type Plan, type RootCauseHint, type ScanResult, type ScreenshotData, type StoredSession, type TraceBugConfig, type TraceBugEvent, type TraceBugPlugin, type TraceBugUser, type UIAnnotationReport, type VideoComment, type VideoRecording, type VoiceTranscript, buildReport, buildTimeline, captureEnvironment, captureRegionScreenshot, captureRollingBuffer, captureScreenshot, clearAllSessions, clearIssues, clearVideoRecording, clearVoiceTranscripts, TraceBug as default, deleteSession, dismissIssue, downloadAllScreenshots, downloadPdfAsHtml, downloadVideoRecording, extractClickedElement, formatRootCauseLine, formatTimelineText, generateAIPrompt, generateBugTitle, generateFlowSummary, generateGitHubIssue, generateGitHubIssueUrl, generateJiraTicket, generateMcpPrompt, generatePdfReport, generateReproSteps, generateRootCauseHint, generateSessionSteps, generateSmartSummary, getAllSessions, getCaptureCount, getIssueById, getIssueCountsByDetector, getIssueCountsBySeverity, getIssues, getLastVideoRecording, getNetworkFailures, getPlan, getScreenshots, getVoiceTranscripts, hydratePlan, isPremium, isRollingMode, isVideoRecording, isVideoSupported as isVideoSupportedFn, isVoiceRecording, isVoiceSupported, openGitHubIssue, openInChatGPT, openInClaude, scan, setPlan, startVideoRecording, startVoiceRecording, stopVideoRecording, stopVoiceRecording, undismissIssue }; |
+2
-1
| { | ||
| "name": "tracebug-sdk", | ||
| "version": "1.4.0", | ||
| "version": "1.5.0", | ||
| "description": "Capture a bug, see the root cause, and create a GitHub issue in 5 seconds. Zero-backend, browser-only debugging assistant. Free Sentry/LogRocket alternative.", | ||
@@ -30,2 +30,3 @@ "type": "module", | ||
| "build:all": "tsup && echo [OK] npm package: dist/ && echo [OK] Chrome extension: tracebug-extension/tracebug-sdk.js", | ||
| "build:cli": "tsup && node -e \"require('fs').copyFileSync('dist/bin.mjs','packages/tracebug/bin.mjs');console.log('[OK] CLI package: packages/tracebug/bin.mjs')\"", | ||
| "build:example": "tsup && cd example-app && npm install && echo [OK] Example app updated", | ||
@@ -32,0 +33,0 @@ "dev": "tsup --watch", |
+15
-0
@@ -136,2 +136,16 @@ <h1 align="center">TraceBug</h1> | ||
| ### 🤖 MCP Server — AI Agents Debug Your Reports (v1.5) | ||
| Your coding agent (Claude Code, Cursor, Windsurf, VS Code) reads TraceBug bug reports and fixes the bug — **fully local, nothing uploaded**: | ||
| ```bash | ||
| claude mcp add tracebug -- npx -y tracebug mcp --dir ./bug-reports | ||
| ``` | ||
| The server reads the same self-contained `.html` files TraceBug exports. A tester hands a dev the report file, the dev drops it in the repo, and the agent gets six tools: `list_bug_reports`, `get_bug_report`, `get_console_errors`, `get_network_activity`, `get_repro_steps`, and `get_screenshot` (real image content). `get_bug_report` returns a prioritized **investigation guide** computed from what the report contains, so the agent knows exactly which tools to call next. Console stacks + failed-request bodies + repro steps + frustration signals — everything an agent needs to go from bug report to fix. | ||
| Kicking off is one paste: the extension shows a ready-made agent prompt after every **Export .html** (auto-copied), the exported file itself carries the same prompt in its **AI** tab, and in Claude Code you can just type `/tracebug:debug_bug_report`. | ||
| Other tools' MCP servers are cloud-hosted: your bug data must live on their servers first. TraceBug's runs on your machine over stdio and opens **zero network connections**. Try it instantly — this repo ships a demo report and a pre-configured [`.mcp.json`](.mcp.json). See [docs/mcp.md](docs/mcp.md). | ||
| ### Auto-Captured (Zero Effort) | ||
@@ -469,2 +483,3 @@ | ||
| - [Bug Reporting](docs/bug-reporting.md) — Screenshots, notes, voice, export | ||
| - [MCP Server](docs/mcp.md) — Let AI agents (Claude Code, Cursor) debug your reports | ||
| - [Annotate & Draw](docs/annotate-and-draw.md) — UI annotation features | ||
@@ -471,0 +486,0 @@ - [Chrome Extension](docs/chrome-extension.md) — Extension install & usage |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } | ||
| var _chunkUIVYYBRNcjs = require('./chunk-UIVYYBRN.cjs'); | ||
| var _chunkTJC4FAJOcjs = require('./chunk-TJC4FAJO.cjs'); | ||
| // src/ui/issues-panel.ts | ||
| var PANEL_ID = "tracebug-issues-panel"; | ||
| var STYLE_ID = "tracebug-issues-panel-styles"; | ||
| var _isOpen = false; | ||
| var _root = null; | ||
| var SEVERITY_COLORS = { | ||
| critical: { bg: "#7f1d1d", fg: "#fee2e2", border: "#dc2626" }, | ||
| serious: { bg: "#7c2d12", fg: "#fed7aa", border: "#ea580c" }, | ||
| moderate: { bg: "#713f12", fg: "#fde68a", border: "#ca8a04" }, | ||
| minor: { bg: "#1e3a8a", fg: "#bfdbfe", border: "#2563eb" } | ||
| }; | ||
| var DETECTOR_LABELS = { | ||
| "axe-a11y": "A11y", | ||
| "broken-image": "Broken image", | ||
| "mixed-content": "Mixed content", | ||
| "console-error": "JS error", | ||
| "slow-api": "Slow API", | ||
| "failed-request": "Failed request", | ||
| "frustration-rage": "Rage clicks", | ||
| "frustration-dead": "Dead click", | ||
| "frustration-abandon": "Form abandoned", | ||
| "frustration-error-correlated": "Click \u2192 error" | ||
| }; | ||
| function isIssuesPanelOpen() { | ||
| return _isOpen; | ||
| } | ||
| async function showIssuesPanel(root, options) { | ||
| var _a; | ||
| if (_isOpen) return; | ||
| _root = root; | ||
| _injectStyles(); | ||
| _open(root, { issues: [], loading: true }); | ||
| try { | ||
| if ((_a = options == null ? void 0 : options.rescan) != null ? _a : true) { | ||
| await _chunkUIVYYBRNcjs.scan.call(void 0, ); | ||
| } | ||
| } catch (err) { | ||
| console.warn("[TraceBug] Scan failed:", err); | ||
| } | ||
| _renderBody(_chunkUIVYYBRNcjs.getIssues.call(void 0, )); | ||
| } | ||
| function _injectStyles() { | ||
| if (document.getElementById(STYLE_ID)) return; | ||
| const style = document.createElement("style"); | ||
| style.id = STYLE_ID; | ||
| style.textContent = ` | ||
| @keyframes tracebug-issue-locate-flash { | ||
| 0%, 100% { box-shadow: 0 0 0 0 rgba(123,97,255,0.0); outline: 2px solid transparent; } | ||
| 30% { box-shadow: 0 0 0 6px rgba(123,97,255,0.5); outline: 2px solid #7C5CFF; } | ||
| } | ||
| #${PANEL_ID}-overlay { | ||
| position: fixed !important; | ||
| inset: 0 !important; | ||
| z-index: 2147483647 !important; | ||
| background: rgba(0,0,0,0.75) !important; | ||
| backdrop-filter: blur(6px) !important; | ||
| display: flex !important; | ||
| align-items: center !important; | ||
| justify-content: center !important; | ||
| padding: 20px !important; | ||
| pointer-events: auto !important; | ||
| box-sizing: border-box !important; | ||
| } | ||
| #${PANEL_ID} { | ||
| background: var(--tb-bg-secondary, #1a1a2e) !important; | ||
| border: 1px solid var(--tb-border-hover, #3a3a5e) !important; | ||
| border-radius: var(--tb-radius-lg, 12px) !important; | ||
| width: 100% !important; | ||
| max-width: 720px !important; | ||
| max-height: 90vh !important; | ||
| display: flex !important; | ||
| flex-direction: column !important; | ||
| overflow: hidden !important; | ||
| font-family: var(--tb-font-family, system-ui, -apple-system, sans-serif) !important; | ||
| color: var(--tb-text-primary, #e0e0e0) !important; | ||
| box-sizing: border-box !important; | ||
| box-shadow: 0 20px 60px rgba(0,0,0,0.5) !important; | ||
| } | ||
| #${PANEL_ID} *, #${PANEL_ID} *::before, #${PANEL_ID} *::after { box-sizing: border-box !important; } | ||
| #${PANEL_ID} button { font-family: inherit !important; cursor: pointer !important; } | ||
| #${PANEL_ID} .tb-issue-row { | ||
| padding: 12px 14px; | ||
| border-top: 1px solid var(--tb-border, #2a2a3e); | ||
| display: flex; | ||
| gap: 12px; | ||
| align-items: flex-start; | ||
| } | ||
| #${PANEL_ID} .tb-issue-row:hover { background: var(--tb-bg-primary, #0f0f1a); } | ||
| #${PANEL_ID} .tb-sev-badge { | ||
| font-size: 10px; | ||
| font-weight: 700; | ||
| padding: 3px 7px; | ||
| border-radius: 4px; | ||
| letter-spacing: 0.4px; | ||
| text-transform: uppercase; | ||
| flex-shrink: 0; | ||
| border: 1px solid; | ||
| } | ||
| #${PANEL_ID} .tb-detector-tag { | ||
| font-size: 10px; | ||
| color: var(--tb-text-muted, #888); | ||
| background: var(--tb-bg-primary, #0f0f1a); | ||
| border: 1px solid var(--tb-border, #2a2a3e); | ||
| padding: 2px 6px; | ||
| border-radius: 4px; | ||
| flex-shrink: 0; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions { | ||
| display: flex; | ||
| gap: 6px; | ||
| flex-shrink: 0; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button { | ||
| background: transparent; | ||
| color: var(--tb-text-secondary, #aaa); | ||
| border: 1px solid var(--tb-border, #2a2a3e); | ||
| border-radius: 4px; | ||
| padding: 4px 10px; | ||
| font-size: 11px; | ||
| transition: all 0.15s; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button:hover { | ||
| background: var(--tb-btn-hover, #ffffff15); | ||
| color: var(--tb-text-primary, #fff); | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button[data-action="file"] { | ||
| background: var(--tb-accent, #7C5CFF); | ||
| color: #fff; | ||
| border-color: transparent; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button[data-action="file"]:hover { opacity: 0.9; } | ||
| `; | ||
| document.head.appendChild(style); | ||
| } | ||
| function _open(root, state) { | ||
| var _a; | ||
| _isOpen = true; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| const overlay = document.createElement("div"); | ||
| overlay.id = `${PANEL_ID}-overlay`; | ||
| overlay.dataset.tracebug = "issues-panel-overlay"; | ||
| overlay.setAttribute("role", "dialog"); | ||
| overlay.setAttribute("aria-modal", "true"); | ||
| overlay.setAttribute("aria-label", "Page issues"); | ||
| const panel = document.createElement("div"); | ||
| panel.id = PANEL_ID; | ||
| panel.dataset.tracebug = "issues-panel"; | ||
| panel.innerHTML = _shellHtml(state); | ||
| overlay.appendChild(panel); | ||
| root.appendChild(overlay); | ||
| _wireShellHandlers(overlay, panel); | ||
| } | ||
| function _shellHtml(state) { | ||
| return ` | ||
| <div data-tb-issues="header" style="padding:16px 18px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--tb-border, #2a2a3e)"> | ||
| <span style="font-size:20px">\u{1F50D}</span> | ||
| <div style="flex:1;min-width:0"> | ||
| <div style="font-size:16px;font-weight:700;color:var(--tb-text-primary, #fff)">Page Issues</div> | ||
| <div data-tb-issues="subtitle" style="font-size:11px;color:var(--tb-text-muted, #888);margin-top:2px">${state.loading ? "Scanning\u2026" : "No scan yet"}</div> | ||
| </div> | ||
| <button data-tb-issues="rescan" style="background:transparent;color:var(--tb-text-secondary, #aaa);border:1px solid var(--tb-border, #2a2a3e);border-radius:6px;padding:6px 12px;font-size:12px;display:flex;align-items:center;gap:6px"> | ||
| <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-3-6.7"/><polyline points="21 3 21 9 15 9"/></svg> | ||
| Rescan | ||
| </button> | ||
| <button data-tb-issues="close" aria-label="Close" style="background:none;border:none;color:var(--tb-text-muted, #888);font-size:20px;padding:4px 8px;border-radius:6px">×</button> | ||
| </div> | ||
| <div data-tb-issues="body" style="flex:1;overflow-y:auto;min-height:200px"> | ||
| ${state.loading ? _loadingHtml() : ""} | ||
| </div> | ||
| `; | ||
| } | ||
| function _loadingHtml() { | ||
| return ` | ||
| <div style="padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px"> | ||
| <div style="font-size:24px;margin-bottom:8px">\u{1F50D}</div> | ||
| Scanning page for issues\u2026 | ||
| <div style="font-size:11px;margin-top:6px;opacity:0.7">Loading axe-core, checking images, network calls, JS errors\u2026</div> | ||
| </div> | ||
| `; | ||
| } | ||
| function _wireShellHandlers(overlay, panel) { | ||
| const close = () => { | ||
| _isOpen = false; | ||
| overlay.remove(); | ||
| document.removeEventListener("keydown", escHandler); | ||
| }; | ||
| panel.querySelector('[data-tb-issues="close"]').addEventListener("click", close); | ||
| overlay.addEventListener("click", (e) => { | ||
| if (e.target === overlay) close(); | ||
| }); | ||
| panel.querySelector('[data-tb-issues="rescan"]').addEventListener("click", async () => { | ||
| const body = panel.querySelector('[data-tb-issues="body"]'); | ||
| body.innerHTML = _loadingHtml(); | ||
| const sub = panel.querySelector('[data-tb-issues="subtitle"]'); | ||
| sub.textContent = "Scanning\u2026"; | ||
| await _chunkUIVYYBRNcjs.scan.call(void 0, ); | ||
| _renderBody(_chunkUIVYYBRNcjs.getIssues.call(void 0, )); | ||
| }); | ||
| const escHandler = (e) => { | ||
| if (e.key === "Escape") close(); | ||
| }; | ||
| document.addEventListener("keydown", escHandler); | ||
| } | ||
| function _renderBody(issues) { | ||
| const panel = document.getElementById(PANEL_ID); | ||
| if (!panel) return; | ||
| const body = panel.querySelector('[data-tb-issues="body"]'); | ||
| const subtitle = panel.querySelector('[data-tb-issues="subtitle"]'); | ||
| if (issues.length === 0) { | ||
| subtitle.textContent = "No issues found"; | ||
| body.innerHTML = ` | ||
| <div style="padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px"> | ||
| <div style="font-size:32px;margin-bottom:8px">\u2713</div> | ||
| Clean scan \u2014 no issues detected on this page. | ||
| <div style="font-size:11px;margin-top:6px;opacity:0.7">Includes a11y \xB7 broken images \xB7 mixed content \xB7 JS errors \xB7 failed/slow API calls</div> | ||
| </div> | ||
| `; | ||
| return; | ||
| } | ||
| const counts = {}; | ||
| for (const i of issues) counts[i.severity] = (counts[i.severity] || 0) + 1; | ||
| const summary = ["critical", "serious", "moderate", "minor"].filter((s) => counts[s]).map((s) => `${counts[s]} ${s}`).join(" \xB7 "); | ||
| subtitle.textContent = `${issues.length} issue${issues.length === 1 ? "" : "s"} \xB7 ${summary}`; | ||
| body.innerHTML = issues.map((issue) => _issueRowHtml(issue)).join(""); | ||
| body.querySelectorAll("[data-tb-issue-id]").forEach((row) => { | ||
| var _a, _b, _c; | ||
| const id = row.dataset.tbIssueId; | ||
| const issue = issues.find((i) => i.id === id); | ||
| if (!issue) return; | ||
| (_a = row.querySelector('[data-action="locate"]')) == null ? void 0 : _a.addEventListener("click", () => _locate(issue)); | ||
| (_b = row.querySelector('[data-action="dismiss"]')) == null ? void 0 : _b.addEventListener("click", () => { | ||
| _chunkUIVYYBRNcjs.dismissIssue.call(void 0, id); | ||
| _renderBody(_chunkUIVYYBRNcjs.getIssues.call(void 0, )); | ||
| }); | ||
| (_c = row.querySelector('[data-action="file"]')) == null ? void 0 : _c.addEventListener("click", () => _fileAsBug(issue)); | ||
| }); | ||
| } | ||
| function _issueRowHtml(issue) { | ||
| const colors = SEVERITY_COLORS[issue.severity]; | ||
| const detectorLabel = DETECTOR_LABELS[issue.detector]; | ||
| const desc = issue.description.length > 240 ? issue.description.slice(0, 237) + "\u2026" : issue.description; | ||
| const repeats = (issue.occurrences || 1) > 1; | ||
| const samplesHtml = repeats && issue.contextSamples && issue.contextSamples.length > 0 ? `<details style="margin-top:6px;font-size:11px"> | ||
| <summary style="cursor:pointer;color:var(--tb-text-muted, #888)"> | ||
| View all ${issue.occurrences} contexts | ||
| </summary> | ||
| <ol style="margin:6px 0 0 20px;padding:0;color:var(--tb-text-secondary, #aaa);line-height:1.5"> | ||
| ${issue.contextSamples.map((s) => ` | ||
| <li>${new Date(s.timestamp).toLocaleTimeString()}${s.precedingAction ? ` \xB7 ${_chunkTJC4FAJOcjs.escapeHtml.call(void 0, s.precedingAction)}` : ""}</li> | ||
| `).join("")} | ||
| </ol> | ||
| </details>` : ""; | ||
| return ` | ||
| <div class="tb-issue-row" data-tb-issue-id="${issue.id}"> | ||
| <span class="tb-sev-badge" style="background:${colors.bg};color:${colors.fg};border-color:${colors.border}">${issue.severity}</span> | ||
| <div style="flex:1;min-width:0"> | ||
| <div style="display:flex;align-items:center;gap:6px;margin-bottom:4px;flex-wrap:wrap"> | ||
| <span class="tb-detector-tag">${detectorLabel}</span> | ||
| <span style="font-size:13px;color:var(--tb-text-primary, #e0e0e0);font-weight:500">${_chunkTJC4FAJOcjs.escapeHtml.call(void 0, issue.title)}</span> | ||
| </div> | ||
| <div style="font-size:11px;color:var(--tb-text-muted, #888);line-height:1.5;white-space:pre-wrap">${_chunkTJC4FAJOcjs.escapeHtml.call(void 0, desc)}</div> | ||
| ${issue.helpUrl ? `<a href="${issue.helpUrl}" target="_blank" rel="noopener noreferrer" style="font-size:11px;color:var(--tb-accent, #7C5CFF);margin-top:4px;display:inline-block">Learn more \u2192</a>` : ""} | ||
| ${samplesHtml} | ||
| </div> | ||
| <div class="tb-issue-actions"> | ||
| ${issue.selector ? `<button data-action="locate" title="Highlight on page">\u{1F4CD} Locate</button>` : ""} | ||
| <button data-action="file" title="File as bug ticket">File ticket</button> | ||
| <button data-action="dismiss" title="Dismiss for this session">Dismiss</button> | ||
| </div> | ||
| </div> | ||
| `; | ||
| } | ||
| function _locate(issue) { | ||
| var _a; | ||
| if (!issue.selector) return; | ||
| let el = null; | ||
| try { | ||
| el = document.querySelector(issue.selector); | ||
| } catch (e) { | ||
| el = null; | ||
| } | ||
| if (!el) return; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| _isOpen = false; | ||
| el.scrollIntoView({ behavior: "smooth", block: "center" }); | ||
| const htmlEl = el; | ||
| const prevOutline = htmlEl.style.outline; | ||
| const prevTransition = htmlEl.style.transition; | ||
| htmlEl.style.transition = "outline 0.2s, box-shadow 0.2s"; | ||
| htmlEl.style.outline = "3px solid #7C5CFF"; | ||
| htmlEl.style.boxShadow = "0 0 0 6px rgba(123,97,255,0.35)"; | ||
| setTimeout(() => { | ||
| htmlEl.style.outline = prevOutline; | ||
| htmlEl.style.boxShadow = ""; | ||
| htmlEl.style.transition = prevTransition; | ||
| }, 2400); | ||
| } | ||
| function _fileAsBug(issue) { | ||
| var _a; | ||
| const root = _root || document.getElementById("tracebug-root"); | ||
| if (!root) return; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| _isOpen = false; | ||
| Promise.resolve().then(() => _interopRequireWildcard(require("./quick-bug-CZZUV6WK.cjs"))).then((m) => { | ||
| m.showQuickBugCapture(root, { | ||
| prefilledTitle: issue.title, | ||
| prefilledDescription: _bugDescriptionFromIssue(issue) | ||
| }).catch(() => { | ||
| }); | ||
| }); | ||
| } | ||
| function _bugDescriptionFromIssue(issue) { | ||
| const lines = []; | ||
| lines.push(`> Detected by TraceBug auto-scanner: **${DETECTOR_LABELS[issue.detector]}** (${issue.severity})`); | ||
| lines.push(""); | ||
| lines.push(issue.description); | ||
| if (issue.selector) lines.push(` | ||
| **Selector:** \`${issue.selector}\``); | ||
| if (issue.url) lines.push(`**URL:** \`${issue.url}\``); | ||
| if (issue.helpUrl) lines.push(`**Reference:** ${issue.helpUrl}`); | ||
| return lines.join("\n"); | ||
| } | ||
| exports.isIssuesPanelOpen = isIssuesPanelOpen; exports.showIssuesPanel = showIssuesPanel; | ||
| //# sourceMappingURL=issues-panel-S2JNIVDH.cjs.map |
| {"version":3,"sources":["d:\\Project\\TraceBug-ai\\dist\\issues-panel-S2JNIVDH.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;AACA,IAAI,SAAS,EAAE,uBAAuB;AACtC,IAAI,SAAS,EAAE,8BAA8B;AAC7C,IAAI,QAAQ,EAAE,KAAK;AACnB,IAAI,MAAM,EAAE,IAAI;AAChB,IAAI,gBAAgB,EAAE;AACtB,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC;AAC/D,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC;AAC9D,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC;AAC/D,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU;AAC3D,CAAC;AACD,IAAI,gBAAgB,EAAE;AACtB,EAAE,UAAU,EAAE,MAAM;AACpB,EAAE,cAAc,EAAE,cAAc;AAChC,EAAE,eAAe,EAAE,eAAe;AAClC,EAAE,eAAe,EAAE,UAAU;AAC7B,EAAE,UAAU,EAAE,UAAU;AACxB,EAAE,gBAAgB,EAAE,gBAAgB;AACpC,EAAE,kBAAkB,EAAE,aAAa;AACnC,EAAE,kBAAkB,EAAE,YAAY;AAClC,EAAE,qBAAqB,EAAE,gBAAgB;AACzC,EAAE,8BAA8B,EAAE;AAClC,CAAC;AACD,SAAS,iBAAiB,CAAC,EAAE;AAC7B,EAAE,OAAO,OAAO;AAChB;AACA,MAAM,SAAS,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE;AAC9C,EAAE,IAAI,EAAE;AACR,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM;AACrB,EAAE,MAAM,EAAE,IAAI;AACd,EAAE,aAAa,CAAC,CAAC;AACjB,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAC5C,EAAE,IAAI;AACN,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;AAC9E,MAAM,MAAM,oCAAI,CAAE;AAClB,IAAI;AACJ,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE;AAChB,IAAI,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,CAAC;AAChD,EAAE;AACF,EAAE,WAAW,CAAC,yCAAS,CAAE,CAAC;AAC1B;AACA,SAAS,aAAa,CAAC,EAAE;AACzB,EAAE,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM;AAC/C,EAAE,MAAM,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC/C,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ;AACrB,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;AACvB;AACA;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;AACxD,KAAK,EAAE,QAAQ,CAAC;AAChB,KAAK,EAAE,QAAQ,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC;AAChB,KAAK,EAAE,QAAQ,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC;AAChB;AACA;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC;AAChB;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC;AAChB;AACA;AACA;AACA;AACA,KAAK,EAAE,QAAQ,CAAC;AAChB,EAAE,CAAC;AACH,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAClC;AACA,SAAS,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;AAC5B,EAAE,IAAI,EAAE;AACR,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,8GAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAA;AACA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA;AACA;AACA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA,oBAAA;AACA;AACA;AACA,WAAA;AACA,iBAAA;AACA,WAAA;AACA;AACA,iBAAA;AACA,EAAA;AACA,gDAAA;AACA,mDAAA;AACA;AACA;AACA,wCAAA;AACA,6FAAA;AACA;AACA,0GAAA;AACA,QAAA;AACA,QAAA;AACA;AACA;AACA,QAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,gBAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA","file":"D:\\Project\\TraceBug-ai\\dist\\issues-panel-S2JNIVDH.cjs","sourcesContent":[null]} |
| import { | ||
| dismissIssue, | ||
| getIssues, | ||
| scan | ||
| } from "./chunk-6NVJTQ76.js"; | ||
| import { | ||
| escapeHtml | ||
| } from "./chunk-2HLGXXHV.js"; | ||
| // src/ui/issues-panel.ts | ||
| var PANEL_ID = "tracebug-issues-panel"; | ||
| var STYLE_ID = "tracebug-issues-panel-styles"; | ||
| var _isOpen = false; | ||
| var _root = null; | ||
| var SEVERITY_COLORS = { | ||
| critical: { bg: "#7f1d1d", fg: "#fee2e2", border: "#dc2626" }, | ||
| serious: { bg: "#7c2d12", fg: "#fed7aa", border: "#ea580c" }, | ||
| moderate: { bg: "#713f12", fg: "#fde68a", border: "#ca8a04" }, | ||
| minor: { bg: "#1e3a8a", fg: "#bfdbfe", border: "#2563eb" } | ||
| }; | ||
| var DETECTOR_LABELS = { | ||
| "axe-a11y": "A11y", | ||
| "broken-image": "Broken image", | ||
| "mixed-content": "Mixed content", | ||
| "console-error": "JS error", | ||
| "slow-api": "Slow API", | ||
| "failed-request": "Failed request", | ||
| "frustration-rage": "Rage clicks", | ||
| "frustration-dead": "Dead click", | ||
| "frustration-abandon": "Form abandoned", | ||
| "frustration-error-correlated": "Click \u2192 error" | ||
| }; | ||
| function isIssuesPanelOpen() { | ||
| return _isOpen; | ||
| } | ||
| async function showIssuesPanel(root, options) { | ||
| var _a; | ||
| if (_isOpen) return; | ||
| _root = root; | ||
| _injectStyles(); | ||
| _open(root, { issues: [], loading: true }); | ||
| try { | ||
| if ((_a = options == null ? void 0 : options.rescan) != null ? _a : true) { | ||
| await scan(); | ||
| } | ||
| } catch (err) { | ||
| console.warn("[TraceBug] Scan failed:", err); | ||
| } | ||
| _renderBody(getIssues()); | ||
| } | ||
| function _injectStyles() { | ||
| if (document.getElementById(STYLE_ID)) return; | ||
| const style = document.createElement("style"); | ||
| style.id = STYLE_ID; | ||
| style.textContent = ` | ||
| @keyframes tracebug-issue-locate-flash { | ||
| 0%, 100% { box-shadow: 0 0 0 0 rgba(123,97,255,0.0); outline: 2px solid transparent; } | ||
| 30% { box-shadow: 0 0 0 6px rgba(123,97,255,0.5); outline: 2px solid #7C5CFF; } | ||
| } | ||
| #${PANEL_ID}-overlay { | ||
| position: fixed !important; | ||
| inset: 0 !important; | ||
| z-index: 2147483647 !important; | ||
| background: rgba(0,0,0,0.75) !important; | ||
| backdrop-filter: blur(6px) !important; | ||
| display: flex !important; | ||
| align-items: center !important; | ||
| justify-content: center !important; | ||
| padding: 20px !important; | ||
| pointer-events: auto !important; | ||
| box-sizing: border-box !important; | ||
| } | ||
| #${PANEL_ID} { | ||
| background: var(--tb-bg-secondary, #1a1a2e) !important; | ||
| border: 1px solid var(--tb-border-hover, #3a3a5e) !important; | ||
| border-radius: var(--tb-radius-lg, 12px) !important; | ||
| width: 100% !important; | ||
| max-width: 720px !important; | ||
| max-height: 90vh !important; | ||
| display: flex !important; | ||
| flex-direction: column !important; | ||
| overflow: hidden !important; | ||
| font-family: var(--tb-font-family, system-ui, -apple-system, sans-serif) !important; | ||
| color: var(--tb-text-primary, #e0e0e0) !important; | ||
| box-sizing: border-box !important; | ||
| box-shadow: 0 20px 60px rgba(0,0,0,0.5) !important; | ||
| } | ||
| #${PANEL_ID} *, #${PANEL_ID} *::before, #${PANEL_ID} *::after { box-sizing: border-box !important; } | ||
| #${PANEL_ID} button { font-family: inherit !important; cursor: pointer !important; } | ||
| #${PANEL_ID} .tb-issue-row { | ||
| padding: 12px 14px; | ||
| border-top: 1px solid var(--tb-border, #2a2a3e); | ||
| display: flex; | ||
| gap: 12px; | ||
| align-items: flex-start; | ||
| } | ||
| #${PANEL_ID} .tb-issue-row:hover { background: var(--tb-bg-primary, #0f0f1a); } | ||
| #${PANEL_ID} .tb-sev-badge { | ||
| font-size: 10px; | ||
| font-weight: 700; | ||
| padding: 3px 7px; | ||
| border-radius: 4px; | ||
| letter-spacing: 0.4px; | ||
| text-transform: uppercase; | ||
| flex-shrink: 0; | ||
| border: 1px solid; | ||
| } | ||
| #${PANEL_ID} .tb-detector-tag { | ||
| font-size: 10px; | ||
| color: var(--tb-text-muted, #888); | ||
| background: var(--tb-bg-primary, #0f0f1a); | ||
| border: 1px solid var(--tb-border, #2a2a3e); | ||
| padding: 2px 6px; | ||
| border-radius: 4px; | ||
| flex-shrink: 0; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions { | ||
| display: flex; | ||
| gap: 6px; | ||
| flex-shrink: 0; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button { | ||
| background: transparent; | ||
| color: var(--tb-text-secondary, #aaa); | ||
| border: 1px solid var(--tb-border, #2a2a3e); | ||
| border-radius: 4px; | ||
| padding: 4px 10px; | ||
| font-size: 11px; | ||
| transition: all 0.15s; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button:hover { | ||
| background: var(--tb-btn-hover, #ffffff15); | ||
| color: var(--tb-text-primary, #fff); | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button[data-action="file"] { | ||
| background: var(--tb-accent, #7C5CFF); | ||
| color: #fff; | ||
| border-color: transparent; | ||
| } | ||
| #${PANEL_ID} .tb-issue-actions button[data-action="file"]:hover { opacity: 0.9; } | ||
| `; | ||
| document.head.appendChild(style); | ||
| } | ||
| function _open(root, state) { | ||
| var _a; | ||
| _isOpen = true; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| const overlay = document.createElement("div"); | ||
| overlay.id = `${PANEL_ID}-overlay`; | ||
| overlay.dataset.tracebug = "issues-panel-overlay"; | ||
| overlay.setAttribute("role", "dialog"); | ||
| overlay.setAttribute("aria-modal", "true"); | ||
| overlay.setAttribute("aria-label", "Page issues"); | ||
| const panel = document.createElement("div"); | ||
| panel.id = PANEL_ID; | ||
| panel.dataset.tracebug = "issues-panel"; | ||
| panel.innerHTML = _shellHtml(state); | ||
| overlay.appendChild(panel); | ||
| root.appendChild(overlay); | ||
| _wireShellHandlers(overlay, panel); | ||
| } | ||
| function _shellHtml(state) { | ||
| return ` | ||
| <div data-tb-issues="header" style="padding:16px 18px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--tb-border, #2a2a3e)"> | ||
| <span style="font-size:20px">\u{1F50D}</span> | ||
| <div style="flex:1;min-width:0"> | ||
| <div style="font-size:16px;font-weight:700;color:var(--tb-text-primary, #fff)">Page Issues</div> | ||
| <div data-tb-issues="subtitle" style="font-size:11px;color:var(--tb-text-muted, #888);margin-top:2px">${state.loading ? "Scanning\u2026" : "No scan yet"}</div> | ||
| </div> | ||
| <button data-tb-issues="rescan" style="background:transparent;color:var(--tb-text-secondary, #aaa);border:1px solid var(--tb-border, #2a2a3e);border-radius:6px;padding:6px 12px;font-size:12px;display:flex;align-items:center;gap:6px"> | ||
| <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-3-6.7"/><polyline points="21 3 21 9 15 9"/></svg> | ||
| Rescan | ||
| </button> | ||
| <button data-tb-issues="close" aria-label="Close" style="background:none;border:none;color:var(--tb-text-muted, #888);font-size:20px;padding:4px 8px;border-radius:6px">×</button> | ||
| </div> | ||
| <div data-tb-issues="body" style="flex:1;overflow-y:auto;min-height:200px"> | ||
| ${state.loading ? _loadingHtml() : ""} | ||
| </div> | ||
| `; | ||
| } | ||
| function _loadingHtml() { | ||
| return ` | ||
| <div style="padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px"> | ||
| <div style="font-size:24px;margin-bottom:8px">\u{1F50D}</div> | ||
| Scanning page for issues\u2026 | ||
| <div style="font-size:11px;margin-top:6px;opacity:0.7">Loading axe-core, checking images, network calls, JS errors\u2026</div> | ||
| </div> | ||
| `; | ||
| } | ||
| function _wireShellHandlers(overlay, panel) { | ||
| const close = () => { | ||
| _isOpen = false; | ||
| overlay.remove(); | ||
| document.removeEventListener("keydown", escHandler); | ||
| }; | ||
| panel.querySelector('[data-tb-issues="close"]').addEventListener("click", close); | ||
| overlay.addEventListener("click", (e) => { | ||
| if (e.target === overlay) close(); | ||
| }); | ||
| panel.querySelector('[data-tb-issues="rescan"]').addEventListener("click", async () => { | ||
| const body = panel.querySelector('[data-tb-issues="body"]'); | ||
| body.innerHTML = _loadingHtml(); | ||
| const sub = panel.querySelector('[data-tb-issues="subtitle"]'); | ||
| sub.textContent = "Scanning\u2026"; | ||
| await scan(); | ||
| _renderBody(getIssues()); | ||
| }); | ||
| const escHandler = (e) => { | ||
| if (e.key === "Escape") close(); | ||
| }; | ||
| document.addEventListener("keydown", escHandler); | ||
| } | ||
| function _renderBody(issues) { | ||
| const panel = document.getElementById(PANEL_ID); | ||
| if (!panel) return; | ||
| const body = panel.querySelector('[data-tb-issues="body"]'); | ||
| const subtitle = panel.querySelector('[data-tb-issues="subtitle"]'); | ||
| if (issues.length === 0) { | ||
| subtitle.textContent = "No issues found"; | ||
| body.innerHTML = ` | ||
| <div style="padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px"> | ||
| <div style="font-size:32px;margin-bottom:8px">\u2713</div> | ||
| Clean scan \u2014 no issues detected on this page. | ||
| <div style="font-size:11px;margin-top:6px;opacity:0.7">Includes a11y \xB7 broken images \xB7 mixed content \xB7 JS errors \xB7 failed/slow API calls</div> | ||
| </div> | ||
| `; | ||
| return; | ||
| } | ||
| const counts = {}; | ||
| for (const i of issues) counts[i.severity] = (counts[i.severity] || 0) + 1; | ||
| const summary = ["critical", "serious", "moderate", "minor"].filter((s) => counts[s]).map((s) => `${counts[s]} ${s}`).join(" \xB7 "); | ||
| subtitle.textContent = `${issues.length} issue${issues.length === 1 ? "" : "s"} \xB7 ${summary}`; | ||
| body.innerHTML = issues.map((issue) => _issueRowHtml(issue)).join(""); | ||
| body.querySelectorAll("[data-tb-issue-id]").forEach((row) => { | ||
| var _a, _b, _c; | ||
| const id = row.dataset.tbIssueId; | ||
| const issue = issues.find((i) => i.id === id); | ||
| if (!issue) return; | ||
| (_a = row.querySelector('[data-action="locate"]')) == null ? void 0 : _a.addEventListener("click", () => _locate(issue)); | ||
| (_b = row.querySelector('[data-action="dismiss"]')) == null ? void 0 : _b.addEventListener("click", () => { | ||
| dismissIssue(id); | ||
| _renderBody(getIssues()); | ||
| }); | ||
| (_c = row.querySelector('[data-action="file"]')) == null ? void 0 : _c.addEventListener("click", () => _fileAsBug(issue)); | ||
| }); | ||
| } | ||
| function _issueRowHtml(issue) { | ||
| const colors = SEVERITY_COLORS[issue.severity]; | ||
| const detectorLabel = DETECTOR_LABELS[issue.detector]; | ||
| const desc = issue.description.length > 240 ? issue.description.slice(0, 237) + "\u2026" : issue.description; | ||
| const repeats = (issue.occurrences || 1) > 1; | ||
| const samplesHtml = repeats && issue.contextSamples && issue.contextSamples.length > 0 ? `<details style="margin-top:6px;font-size:11px"> | ||
| <summary style="cursor:pointer;color:var(--tb-text-muted, #888)"> | ||
| View all ${issue.occurrences} contexts | ||
| </summary> | ||
| <ol style="margin:6px 0 0 20px;padding:0;color:var(--tb-text-secondary, #aaa);line-height:1.5"> | ||
| ${issue.contextSamples.map((s) => ` | ||
| <li>${new Date(s.timestamp).toLocaleTimeString()}${s.precedingAction ? ` \xB7 ${escapeHtml(s.precedingAction)}` : ""}</li> | ||
| `).join("")} | ||
| </ol> | ||
| </details>` : ""; | ||
| return ` | ||
| <div class="tb-issue-row" data-tb-issue-id="${issue.id}"> | ||
| <span class="tb-sev-badge" style="background:${colors.bg};color:${colors.fg};border-color:${colors.border}">${issue.severity}</span> | ||
| <div style="flex:1;min-width:0"> | ||
| <div style="display:flex;align-items:center;gap:6px;margin-bottom:4px;flex-wrap:wrap"> | ||
| <span class="tb-detector-tag">${detectorLabel}</span> | ||
| <span style="font-size:13px;color:var(--tb-text-primary, #e0e0e0);font-weight:500">${escapeHtml(issue.title)}</span> | ||
| </div> | ||
| <div style="font-size:11px;color:var(--tb-text-muted, #888);line-height:1.5;white-space:pre-wrap">${escapeHtml(desc)}</div> | ||
| ${issue.helpUrl ? `<a href="${issue.helpUrl}" target="_blank" rel="noopener noreferrer" style="font-size:11px;color:var(--tb-accent, #7C5CFF);margin-top:4px;display:inline-block">Learn more \u2192</a>` : ""} | ||
| ${samplesHtml} | ||
| </div> | ||
| <div class="tb-issue-actions"> | ||
| ${issue.selector ? `<button data-action="locate" title="Highlight on page">\u{1F4CD} Locate</button>` : ""} | ||
| <button data-action="file" title="File as bug ticket">File ticket</button> | ||
| <button data-action="dismiss" title="Dismiss for this session">Dismiss</button> | ||
| </div> | ||
| </div> | ||
| `; | ||
| } | ||
| function _locate(issue) { | ||
| var _a; | ||
| if (!issue.selector) return; | ||
| let el = null; | ||
| try { | ||
| el = document.querySelector(issue.selector); | ||
| } catch (e) { | ||
| el = null; | ||
| } | ||
| if (!el) return; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| _isOpen = false; | ||
| el.scrollIntoView({ behavior: "smooth", block: "center" }); | ||
| const htmlEl = el; | ||
| const prevOutline = htmlEl.style.outline; | ||
| const prevTransition = htmlEl.style.transition; | ||
| htmlEl.style.transition = "outline 0.2s, box-shadow 0.2s"; | ||
| htmlEl.style.outline = "3px solid #7C5CFF"; | ||
| htmlEl.style.boxShadow = "0 0 0 6px rgba(123,97,255,0.35)"; | ||
| setTimeout(() => { | ||
| htmlEl.style.outline = prevOutline; | ||
| htmlEl.style.boxShadow = ""; | ||
| htmlEl.style.transition = prevTransition; | ||
| }, 2400); | ||
| } | ||
| function _fileAsBug(issue) { | ||
| var _a; | ||
| const root = _root || document.getElementById("tracebug-root"); | ||
| if (!root) return; | ||
| (_a = document.getElementById(`${PANEL_ID}-overlay`)) == null ? void 0 : _a.remove(); | ||
| _isOpen = false; | ||
| import("./quick-bug-LCEDBECA.js").then((m) => { | ||
| m.showQuickBugCapture(root, { | ||
| prefilledTitle: issue.title, | ||
| prefilledDescription: _bugDescriptionFromIssue(issue) | ||
| }).catch(() => { | ||
| }); | ||
| }); | ||
| } | ||
| function _bugDescriptionFromIssue(issue) { | ||
| const lines = []; | ||
| lines.push(`> Detected by TraceBug auto-scanner: **${DETECTOR_LABELS[issue.detector]}** (${issue.severity})`); | ||
| lines.push(""); | ||
| lines.push(issue.description); | ||
| if (issue.selector) lines.push(` | ||
| **Selector:** \`${issue.selector}\``); | ||
| if (issue.url) lines.push(`**URL:** \`${issue.url}\``); | ||
| if (issue.helpUrl) lines.push(`**Reference:** ${issue.helpUrl}`); | ||
| return lines.join("\n"); | ||
| } | ||
| export { | ||
| isIssuesPanelOpen, | ||
| showIssuesPanel | ||
| }; | ||
| //# sourceMappingURL=issues-panel-SMHCIPV7.js.map |
| {"version":3,"sources":["../src/ui/issues-panel.ts"],"sourcesContent":["// ── Issues Panel ──────────────────────────────────────────────────────────\r\n// Modal that lists scanner findings grouped by severity. Each row offers\r\n// \"Locate\" (flash the offending element on the page) and \"File ticket\"\r\n// (open the Quick Bug modal pre-filled with the issue's context).\r\n//\r\n// Styles are injected in <head> with !important so host-page CSS resets\r\n// (Tailwind preflight, Bootstrap, etc.) can't squish the layout.\r\n\r\nimport { Issue } from \"../types\";\r\nimport { dismissIssue, getIssues, scan } from \"../scanner\";\r\nimport { escapeHtml } from \"./helpers\";\r\n\r\nconst PANEL_ID = \"tracebug-issues-panel\";\r\nconst STYLE_ID = \"tracebug-issues-panel-styles\";\r\n\r\nlet _isOpen = false;\r\nlet _root: HTMLElement | null = null;\r\n\r\nconst SEVERITY_COLORS: Record<Issue[\"severity\"], { bg: string; fg: string; border: string }> = {\r\n critical: { bg: \"#7f1d1d\", fg: \"#fee2e2\", border: \"#dc2626\" },\r\n serious: { bg: \"#7c2d12\", fg: \"#fed7aa\", border: \"#ea580c\" },\r\n moderate: { bg: \"#713f12\", fg: \"#fde68a\", border: \"#ca8a04\" },\r\n minor: { bg: \"#1e3a8a\", fg: \"#bfdbfe\", border: \"#2563eb\" },\r\n};\r\n\r\nconst DETECTOR_LABELS: Record<Issue[\"detector\"], string> = {\r\n \"axe-a11y\": \"A11y\",\r\n \"broken-image\": \"Broken image\",\r\n \"mixed-content\": \"Mixed content\",\r\n \"console-error\": \"JS error\",\r\n \"slow-api\": \"Slow API\",\r\n \"failed-request\": \"Failed request\",\r\n \"frustration-rage\": \"Rage clicks\",\r\n \"frustration-dead\": \"Dead click\",\r\n \"frustration-abandon\": \"Form abandoned\",\r\n \"frustration-error-correlated\": \"Click → error\",\r\n};\r\n\r\nexport function isIssuesPanelOpen(): boolean {\r\n return _isOpen;\r\n}\r\n\r\n/**\r\n * Run a scan (or use cached results) and open the panel. The scan promise\r\n * resolves before we render so the panel never flashes empty.\r\n */\r\nexport async function showIssuesPanel(\r\n root: HTMLElement,\r\n options?: { rescan?: boolean }\r\n): Promise<void> {\r\n if (_isOpen) return;\r\n _root = root;\r\n _injectStyles();\r\n\r\n // Render shell with a loading state so the user gets immediate feedback.\r\n _open(root, { issues: [], loading: true });\r\n try {\r\n if (options?.rescan ?? true) {\r\n await scan();\r\n }\r\n } catch (err) {\r\n console.warn(\"[TraceBug] Scan failed:\", err);\r\n }\r\n _renderBody(getIssues());\r\n}\r\n\r\nfunction _injectStyles(): void {\r\n if (document.getElementById(STYLE_ID)) return;\r\n const style = document.createElement(\"style\");\r\n style.id = STYLE_ID;\r\n style.textContent = `\r\n @keyframes tracebug-issue-locate-flash {\r\n 0%, 100% { box-shadow: 0 0 0 0 rgba(123,97,255,0.0); outline: 2px solid transparent; }\r\n 30% { box-shadow: 0 0 0 6px rgba(123,97,255,0.5); outline: 2px solid #7C5CFF; }\r\n }\r\n #${PANEL_ID}-overlay {\r\n position: fixed !important;\r\n inset: 0 !important;\r\n z-index: 2147483647 !important;\r\n background: rgba(0,0,0,0.75) !important;\r\n backdrop-filter: blur(6px) !important;\r\n display: flex !important;\r\n align-items: center !important;\r\n justify-content: center !important;\r\n padding: 20px !important;\r\n pointer-events: auto !important;\r\n box-sizing: border-box !important;\r\n }\r\n #${PANEL_ID} {\r\n background: var(--tb-bg-secondary, #1a1a2e) !important;\r\n border: 1px solid var(--tb-border-hover, #3a3a5e) !important;\r\n border-radius: var(--tb-radius-lg, 12px) !important;\r\n width: 100% !important;\r\n max-width: 720px !important;\r\n max-height: 90vh !important;\r\n display: flex !important;\r\n flex-direction: column !important;\r\n overflow: hidden !important;\r\n font-family: var(--tb-font-family, system-ui, -apple-system, sans-serif) !important;\r\n color: var(--tb-text-primary, #e0e0e0) !important;\r\n box-sizing: border-box !important;\r\n box-shadow: 0 20px 60px rgba(0,0,0,0.5) !important;\r\n }\r\n #${PANEL_ID} *, #${PANEL_ID} *::before, #${PANEL_ID} *::after { box-sizing: border-box !important; }\r\n #${PANEL_ID} button { font-family: inherit !important; cursor: pointer !important; }\r\n #${PANEL_ID} .tb-issue-row {\r\n padding: 12px 14px;\r\n border-top: 1px solid var(--tb-border, #2a2a3e);\r\n display: flex;\r\n gap: 12px;\r\n align-items: flex-start;\r\n }\r\n #${PANEL_ID} .tb-issue-row:hover { background: var(--tb-bg-primary, #0f0f1a); }\r\n #${PANEL_ID} .tb-sev-badge {\r\n font-size: 10px;\r\n font-weight: 700;\r\n padding: 3px 7px;\r\n border-radius: 4px;\r\n letter-spacing: 0.4px;\r\n text-transform: uppercase;\r\n flex-shrink: 0;\r\n border: 1px solid;\r\n }\r\n #${PANEL_ID} .tb-detector-tag {\r\n font-size: 10px;\r\n color: var(--tb-text-muted, #888);\r\n background: var(--tb-bg-primary, #0f0f1a);\r\n border: 1px solid var(--tb-border, #2a2a3e);\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n flex-shrink: 0;\r\n }\r\n #${PANEL_ID} .tb-issue-actions {\r\n display: flex;\r\n gap: 6px;\r\n flex-shrink: 0;\r\n }\r\n #${PANEL_ID} .tb-issue-actions button {\r\n background: transparent;\r\n color: var(--tb-text-secondary, #aaa);\r\n border: 1px solid var(--tb-border, #2a2a3e);\r\n border-radius: 4px;\r\n padding: 4px 10px;\r\n font-size: 11px;\r\n transition: all 0.15s;\r\n }\r\n #${PANEL_ID} .tb-issue-actions button:hover {\r\n background: var(--tb-btn-hover, #ffffff15);\r\n color: var(--tb-text-primary, #fff);\r\n }\r\n #${PANEL_ID} .tb-issue-actions button[data-action=\"file\"] {\r\n background: var(--tb-accent, #7C5CFF);\r\n color: #fff;\r\n border-color: transparent;\r\n }\r\n #${PANEL_ID} .tb-issue-actions button[data-action=\"file\"]:hover { opacity: 0.9; }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\nfunction _open(root: HTMLElement, state: { issues: Issue[]; loading: boolean }): void {\r\n _isOpen = true;\r\n // Remove any prior overlay (defensive — should not happen).\r\n document.getElementById(`${PANEL_ID}-overlay`)?.remove();\r\n\r\n const overlay = document.createElement(\"div\");\r\n overlay.id = `${PANEL_ID}-overlay`;\r\n overlay.dataset.tracebug = \"issues-panel-overlay\";\r\n overlay.setAttribute(\"role\", \"dialog\");\r\n overlay.setAttribute(\"aria-modal\", \"true\");\r\n overlay.setAttribute(\"aria-label\", \"Page issues\");\r\n\r\n const panel = document.createElement(\"div\");\r\n panel.id = PANEL_ID;\r\n panel.dataset.tracebug = \"issues-panel\";\r\n\r\n panel.innerHTML = _shellHtml(state);\r\n\r\n overlay.appendChild(panel);\r\n root.appendChild(overlay);\r\n\r\n _wireShellHandlers(overlay, panel);\r\n}\r\n\r\nfunction _shellHtml(state: { issues: Issue[]; loading: boolean }): string {\r\n return `\r\n <div data-tb-issues=\"header\" style=\"padding:16px 18px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--tb-border, #2a2a3e)\">\r\n <span style=\"font-size:20px\">🔍</span>\r\n <div style=\"flex:1;min-width:0\">\r\n <div style=\"font-size:16px;font-weight:700;color:var(--tb-text-primary, #fff)\">Page Issues</div>\r\n <div data-tb-issues=\"subtitle\" style=\"font-size:11px;color:var(--tb-text-muted, #888);margin-top:2px\">${state.loading ? \"Scanning…\" : \"No scan yet\"}</div>\r\n </div>\r\n <button data-tb-issues=\"rescan\" style=\"background:transparent;color:var(--tb-text-secondary, #aaa);border:1px solid var(--tb-border, #2a2a3e);border-radius:6px;padding:6px 12px;font-size:12px;display:flex;align-items:center;gap:6px\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12a9 9 0 1 1-3-6.7\"/><polyline points=\"21 3 21 9 15 9\"/></svg>\r\n Rescan\r\n </button>\r\n <button data-tb-issues=\"close\" aria-label=\"Close\" style=\"background:none;border:none;color:var(--tb-text-muted, #888);font-size:20px;padding:4px 8px;border-radius:6px\">×</button>\r\n </div>\r\n <div data-tb-issues=\"body\" style=\"flex:1;overflow-y:auto;min-height:200px\">\r\n ${state.loading ? _loadingHtml() : \"\"}\r\n </div>\r\n `;\r\n}\r\n\r\nfunction _loadingHtml(): string {\r\n return `\r\n <div style=\"padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px\">\r\n <div style=\"font-size:24px;margin-bottom:8px\">🔍</div>\r\n Scanning page for issues…\r\n <div style=\"font-size:11px;margin-top:6px;opacity:0.7\">Loading axe-core, checking images, network calls, JS errors…</div>\r\n </div>\r\n `;\r\n}\r\n\r\nfunction _wireShellHandlers(overlay: HTMLElement, panel: HTMLElement): void {\r\n const close = () => {\r\n _isOpen = false;\r\n overlay.remove();\r\n document.removeEventListener(\"keydown\", escHandler);\r\n };\r\n panel.querySelector('[data-tb-issues=\"close\"]')!.addEventListener(\"click\", close);\r\n overlay.addEventListener(\"click\", (e) => { if (e.target === overlay) close(); });\r\n\r\n panel.querySelector('[data-tb-issues=\"rescan\"]')!.addEventListener(\"click\", async () => {\r\n const body = panel.querySelector('[data-tb-issues=\"body\"]') as HTMLElement;\r\n body.innerHTML = _loadingHtml();\r\n const sub = panel.querySelector('[data-tb-issues=\"subtitle\"]') as HTMLElement;\r\n sub.textContent = \"Scanning…\";\r\n await scan();\r\n _renderBody(getIssues());\r\n });\r\n\r\n const escHandler = (e: KeyboardEvent) => { if (e.key === \"Escape\") close(); };\r\n document.addEventListener(\"keydown\", escHandler);\r\n}\r\n\r\nfunction _renderBody(issues: Issue[]): void {\r\n const panel = document.getElementById(PANEL_ID);\r\n if (!panel) return;\r\n const body = panel.querySelector('[data-tb-issues=\"body\"]') as HTMLElement;\r\n const subtitle = panel.querySelector('[data-tb-issues=\"subtitle\"]') as HTMLElement;\r\n\r\n if (issues.length === 0) {\r\n subtitle.textContent = \"No issues found\";\r\n body.innerHTML = `\r\n <div style=\"padding:48px 20px;text-align:center;color:var(--tb-text-muted, #888);font-size:13px\">\r\n <div style=\"font-size:32px;margin-bottom:8px\">✓</div>\r\n Clean scan — no issues detected on this page.\r\n <div style=\"font-size:11px;margin-top:6px;opacity:0.7\">Includes a11y · broken images · mixed content · JS errors · failed/slow API calls</div>\r\n </div>\r\n `;\r\n return;\r\n }\r\n\r\n // Severity counts in subtitle\r\n const counts: Record<string, number> = {};\r\n for (const i of issues) counts[i.severity] = (counts[i.severity] || 0) + 1;\r\n const summary = [\"critical\", \"serious\", \"moderate\", \"minor\"]\r\n .filter(s => counts[s])\r\n .map(s => `${counts[s]} ${s}`)\r\n .join(\" · \");\r\n subtitle.textContent = `${issues.length} issue${issues.length === 1 ? \"\" : \"s\"} · ${summary}`;\r\n\r\n body.innerHTML = issues.map(issue => _issueRowHtml(issue)).join(\"\");\r\n\r\n // Wire row actions\r\n body.querySelectorAll<HTMLElement>(\"[data-tb-issue-id]\").forEach(row => {\r\n const id = row.dataset.tbIssueId!;\r\n const issue = issues.find(i => i.id === id);\r\n if (!issue) return;\r\n\r\n row.querySelector('[data-action=\"locate\"]')?.addEventListener(\"click\", () => _locate(issue));\r\n row.querySelector('[data-action=\"dismiss\"]')?.addEventListener(\"click\", () => {\r\n dismissIssue(id);\r\n _renderBody(getIssues());\r\n });\r\n row.querySelector('[data-action=\"file\"]')?.addEventListener(\"click\", () => _fileAsBug(issue));\r\n });\r\n}\r\n\r\nfunction _issueRowHtml(issue: Issue): string {\r\n const colors = SEVERITY_COLORS[issue.severity];\r\n const detectorLabel = DETECTOR_LABELS[issue.detector];\r\n const desc = issue.description.length > 240\r\n ? issue.description.slice(0, 237) + \"…\"\r\n : issue.description;\r\n\r\n // Fingerprint dedup: when occurrences > 1 show a collapsible <details>\r\n // listing each occurrence with its preceding action.\r\n const repeats = (issue.occurrences || 1) > 1;\r\n const samplesHtml = repeats && issue.contextSamples && issue.contextSamples.length > 0\r\n ? `<details style=\"margin-top:6px;font-size:11px\">\r\n <summary style=\"cursor:pointer;color:var(--tb-text-muted, #888)\">\r\n View all ${issue.occurrences} contexts\r\n </summary>\r\n <ol style=\"margin:6px 0 0 20px;padding:0;color:var(--tb-text-secondary, #aaa);line-height:1.5\">\r\n ${issue.contextSamples.map(s => `\r\n <li>${new Date(s.timestamp).toLocaleTimeString()}${s.precedingAction ? ` · ${escapeHtml(s.precedingAction)}` : \"\"}</li>\r\n `).join(\"\")}\r\n </ol>\r\n </details>`\r\n : \"\";\r\n\r\n return `\r\n <div class=\"tb-issue-row\" data-tb-issue-id=\"${issue.id}\">\r\n <span class=\"tb-sev-badge\" style=\"background:${colors.bg};color:${colors.fg};border-color:${colors.border}\">${issue.severity}</span>\r\n <div style=\"flex:1;min-width:0\">\r\n <div style=\"display:flex;align-items:center;gap:6px;margin-bottom:4px;flex-wrap:wrap\">\r\n <span class=\"tb-detector-tag\">${detectorLabel}</span>\r\n <span style=\"font-size:13px;color:var(--tb-text-primary, #e0e0e0);font-weight:500\">${escapeHtml(issue.title)}</span>\r\n </div>\r\n <div style=\"font-size:11px;color:var(--tb-text-muted, #888);line-height:1.5;white-space:pre-wrap\">${escapeHtml(desc)}</div>\r\n ${issue.helpUrl ? `<a href=\"${issue.helpUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"font-size:11px;color:var(--tb-accent, #7C5CFF);margin-top:4px;display:inline-block\">Learn more →</a>` : \"\"}\r\n ${samplesHtml}\r\n </div>\r\n <div class=\"tb-issue-actions\">\r\n ${issue.selector ? `<button data-action=\"locate\" title=\"Highlight on page\">📍 Locate</button>` : \"\"}\r\n <button data-action=\"file\" title=\"File as bug ticket\">File ticket</button>\r\n <button data-action=\"dismiss\" title=\"Dismiss for this session\">Dismiss</button>\r\n </div>\r\n </div>\r\n `;\r\n}\r\n\r\n/**\r\n * Briefly outline the offending element. Closes the panel so the page is\r\n * visible. Restores after 2.4s — non-destructive flash.\r\n */\r\nfunction _locate(issue: Issue): void {\r\n if (!issue.selector) return;\r\n let el: Element | null = null;\r\n try {\r\n el = document.querySelector(issue.selector);\r\n } catch {\r\n el = null;\r\n }\r\n if (!el) return;\r\n\r\n // Close the panel so the user can see the page.\r\n document.getElementById(`${PANEL_ID}-overlay`)?.remove();\r\n _isOpen = false;\r\n\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n const htmlEl = el as HTMLElement;\r\n const prevOutline = htmlEl.style.outline;\r\n const prevTransition = htmlEl.style.transition;\r\n htmlEl.style.transition = \"outline 0.2s, box-shadow 0.2s\";\r\n htmlEl.style.outline = \"3px solid #7C5CFF\";\r\n htmlEl.style.boxShadow = \"0 0 0 6px rgba(123,97,255,0.35)\";\r\n setTimeout(() => {\r\n htmlEl.style.outline = prevOutline;\r\n htmlEl.style.boxShadow = \"\";\r\n htmlEl.style.transition = prevTransition;\r\n }, 2400);\r\n}\r\n\r\n/**\r\n * Pre-fill the Quick Bug modal with the issue's title + description as the\r\n * starting point for a ticket. Reuses the existing ticket-export pipeline.\r\n */\r\nfunction _fileAsBug(issue: Issue): void {\r\n const root = _root || document.getElementById(\"tracebug-root\");\r\n if (!root) return;\r\n // Close the issues panel.\r\n document.getElementById(`${PANEL_ID}-overlay`)?.remove();\r\n _isOpen = false;\r\n\r\n import(\"./quick-bug\").then(m => {\r\n m.showQuickBugCapture(root, {\r\n prefilledTitle: issue.title,\r\n prefilledDescription: _bugDescriptionFromIssue(issue),\r\n }).catch(() => {});\r\n });\r\n}\r\n\r\nfunction _bugDescriptionFromIssue(issue: Issue): string {\r\n const lines: string[] = [];\r\n lines.push(`> Detected by TraceBug auto-scanner: **${DETECTOR_LABELS[issue.detector]}** (${issue.severity})`);\r\n lines.push(\"\");\r\n lines.push(issue.description);\r\n if (issue.selector) lines.push(`\\n**Selector:** \\`${issue.selector}\\``);\r\n if (issue.url) lines.push(`**URL:** \\`${issue.url}\\``);\r\n if (issue.helpUrl) lines.push(`**Reference:** ${issue.helpUrl}`);\r\n return lines.join(\"\\n\");\r\n}\r\n"],"mappings":"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","names":[]} |
| "use strict";Object.defineProperty(exports, "__esModule", {value: true}); | ||
| var _chunkRGFNILXUcjs = require('./chunk-RGFNILXU.cjs'); | ||
| require('./chunk-DGVJEOXU.cjs'); | ||
| require('./chunk-TJC4FAJO.cjs'); | ||
| exports.isQuickBugOpen = _chunkRGFNILXUcjs.isQuickBugOpen; exports.refreshQuickBugCapture = _chunkRGFNILXUcjs.refreshQuickBugCapture; exports.setCloudEndpoint = _chunkRGFNILXUcjs.setCloudEndpoint; exports.setGithubRepo = _chunkRGFNILXUcjs.setGithubRepo; exports.showQuickBugCapture = _chunkRGFNILXUcjs.showQuickBugCapture; | ||
| //# sourceMappingURL=quick-bug-CZZUV6WK.cjs.map |
| {"version":3,"sources":["d:\\Project\\TraceBug-ai\\dist\\quick-bug-CZZUV6WK.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,kUAAC","file":"D:\\Project\\TraceBug-ai\\dist\\quick-bug-CZZUV6WK.cjs"} |
| import { | ||
| isQuickBugOpen, | ||
| refreshQuickBugCapture, | ||
| setCloudEndpoint, | ||
| setGithubRepo, | ||
| showQuickBugCapture | ||
| } from "./chunk-4E76V3ZY.js"; | ||
| import "./chunk-YUUUST42.js"; | ||
| import "./chunk-2HLGXXHV.js"; | ||
| export { | ||
| isQuickBugOpen, | ||
| refreshQuickBugCapture, | ||
| setCloudEndpoint, | ||
| setGithubRepo, | ||
| showQuickBugCapture | ||
| }; | ||
| //# sourceMappingURL=quick-bug-LCEDBECA.js.map |
| {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]} |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
3417142
1.52%37334
2.13%635
2.42%45
12.5%