@inspecto-dev/core 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -3582,6 +3582,113 @@ var init_fix_bug_prompt = __esm({
3582
3582
  }
3583
3583
  });
3584
3584
 
3585
+ // src/menu-helpers.ts
3586
+ function formatSourceAnchor(location) {
3587
+ const fileName = location.file.split("/").pop() || location.file;
3588
+ return `${fileName}:${location.line}:${location.column}`;
3589
+ }
3590
+ function formatRuntimeErrorCount2(count) {
3591
+ if (count > 99) return "99+";
3592
+ return String(count);
3593
+ }
3594
+ function createMenuSection() {
3595
+ const section = document.createElement("div");
3596
+ section.className = menuSectionClass;
3597
+ return section;
3598
+ }
3599
+ function createAskInput(placeholder) {
3600
+ const inputWrapper = document.createElement("div");
3601
+ inputWrapper.className = menuInputWrapperClass;
3602
+ const input = document.createElement("input");
3603
+ input.className = menuInputClass;
3604
+ input.type = "text";
3605
+ input.placeholder = placeholder != null ? placeholder : "Add a custom ask or extra instruction...";
3606
+ input.setAttribute("aria-label", "Custom ask");
3607
+ const sendIcon = document.createElement("div");
3608
+ sendIcon.className = menuInputIconClass;
3609
+ sendIcon.innerHTML = `<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg>`;
3610
+ sendIcon.style.cursor = "pointer";
3611
+ inputWrapper.appendChild(input);
3612
+ inputWrapper.appendChild(sendIcon);
3613
+ return { input, inputWrapper, sendIcon };
3614
+ }
3615
+ function showError(menu, message, errorCode) {
3616
+ var _a2;
3617
+ (_a2 = menu.querySelector(`.${errorMsgClass}`)) == null ? void 0 : _a2.remove();
3618
+ const errEl = document.createElement("div");
3619
+ errEl.className = errorMsgClass;
3620
+ errEl.textContent = errorCode === "FILE_NOT_FOUND" ? "Source file not found. Is the server running?" : `Error: ${message}`;
3621
+ menu.appendChild(errEl);
3622
+ }
3623
+ function isFixIntent(intent) {
3624
+ return intent.aiIntent === "fix";
3625
+ }
3626
+ function isFixUiIntent(intent) {
3627
+ return intent.id === "fix-ui";
3628
+ }
3629
+ function createRuntimeContextUi(runtimeContext, options) {
3630
+ var _a2;
3631
+ if (!runtimeContext) return null;
3632
+ const summary = formatRuntimeContextSummary(runtimeContext);
3633
+ if (!summary) return null;
3634
+ const container = document.createElement("div");
3635
+ container.style.display = "flex";
3636
+ container.style.flexDirection = "column";
3637
+ container.style.gap = "4px";
3638
+ const summaryEl = document.createElement("div");
3639
+ summaryEl.className = menuContextSummaryClass;
3640
+ summaryEl.textContent = summary;
3641
+ container.appendChild(summaryEl);
3642
+ if (((_a2 = options.runtimeContext) == null ? void 0 : _a2.preview) !== true || runtimeContext.records.length === 0) {
3643
+ return container;
3644
+ }
3645
+ const toggle = document.createElement("button");
3646
+ toggle.type = "button";
3647
+ toggle.className = menuContextToggleClass;
3648
+ toggle.textContent = "Show preview";
3649
+ const preview = document.createElement("div");
3650
+ preview.className = menuContextPreviewClass;
3651
+ preview.hidden = true;
3652
+ preview.textContent = formatRuntimeContextPreview(runtimeContext.records);
3653
+ toggle.addEventListener("click", (event) => {
3654
+ event.preventDefault();
3655
+ event.stopPropagation();
3656
+ preview.hidden = !preview.hidden;
3657
+ toggle.textContent = preview.hidden ? "Show preview" : "Hide preview";
3658
+ });
3659
+ container.append(toggle, preview);
3660
+ return container;
3661
+ }
3662
+ function formatRuntimeContextSummary(runtimeContext) {
3663
+ const parts = [];
3664
+ const { runtimeErrorCount, failedRequestCount } = runtimeContext.summary;
3665
+ if (runtimeErrorCount > 0) {
3666
+ parts.push(
3667
+ `${runtimeErrorCount} ${runtimeErrorCount === 1 ? "runtime error" : "runtime errors"}`
3668
+ );
3669
+ }
3670
+ if (failedRequestCount > 0) {
3671
+ parts.push(
3672
+ `${failedRequestCount} ${failedRequestCount === 1 ? "failed request" : "failed requests"}`
3673
+ );
3674
+ }
3675
+ return parts.join(" \u2022 ");
3676
+ }
3677
+ function formatRuntimeContextPreview(records) {
3678
+ return records.slice(0, 3).map((record) => {
3679
+ var _a2, _b, _c, _d, _e, _f;
3680
+ const details = record.kind === "failed-request" ? `${(_b = (_a2 = record.request) == null ? void 0 : _a2.method) != null ? _b : "GET"} ${(_f = (_e = (_c = record.request) == null ? void 0 : _c.pathname) != null ? _e : (_d = record.request) == null ? void 0 : _d.url) != null ? _f : ""}`.trim() : `${record.occurrenceCount}x`;
3681
+ return `[${record.kind}] ${record.message}
3682
+ ${details}`;
3683
+ }).join("\n\n");
3684
+ }
3685
+ var init_menu_helpers = __esm({
3686
+ "src/menu-helpers.ts"() {
3687
+ "use strict";
3688
+ init_styles();
3689
+ }
3690
+ });
3691
+
3585
3692
  // src/menu-actions.ts
3586
3693
  function createIntentActionButtons(input) {
3587
3694
  return input.intents.map((intent) => {
@@ -3607,7 +3714,9 @@ function createIntentActionButtons(input) {
3607
3714
  }
3608
3715
  const requestRuntimeContext = input.resolveRuntimeContext(intent);
3609
3716
  const requestScreenshotContext = yield input.resolveScreenshotContext();
3610
- const requestCssContextPrompt = input.resolveCssContextPrompt();
3717
+ const requestCssContextPrompt = input.resolveCssContextPrompt(
3718
+ isFixUiIntent(intent) ? intent : void 0
3719
+ );
3611
3720
  const prompt = appendCssContextToPrompt(
3612
3721
  appendScreenshotContextToPrompt(
3613
3722
  buildPromptForIntent(intent, input.location, snippetResult, requestRuntimeContext),
@@ -3638,6 +3747,7 @@ var init_menu_actions = __esm({
3638
3747
  init_css_context();
3639
3748
  init_fix_bug_prompt();
3640
3749
  init_http();
3750
+ init_menu_helpers();
3641
3751
  init_styles();
3642
3752
  }
3643
3753
  });
@@ -3710,110 +3820,6 @@ var init_menu_send = __esm({
3710
3820
  }
3711
3821
  });
3712
3822
 
3713
- // src/menu-helpers.ts
3714
- function formatSourceAnchor(location) {
3715
- const fileName = location.file.split("/").pop() || location.file;
3716
- return `${fileName}:${location.line}:${location.column}`;
3717
- }
3718
- function formatRuntimeErrorCount2(count) {
3719
- if (count > 99) return "99+";
3720
- return String(count);
3721
- }
3722
- function createMenuSection() {
3723
- const section = document.createElement("div");
3724
- section.className = menuSectionClass;
3725
- return section;
3726
- }
3727
- function createAskInput(placeholder) {
3728
- const inputWrapper = document.createElement("div");
3729
- inputWrapper.className = menuInputWrapperClass;
3730
- const input = document.createElement("input");
3731
- input.className = menuInputClass;
3732
- input.type = "text";
3733
- input.placeholder = placeholder != null ? placeholder : "Add a custom ask or extra instruction...";
3734
- input.setAttribute("aria-label", "Custom ask");
3735
- const sendIcon = document.createElement("div");
3736
- sendIcon.className = menuInputIconClass;
3737
- sendIcon.innerHTML = `<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg>`;
3738
- sendIcon.style.cursor = "pointer";
3739
- inputWrapper.appendChild(input);
3740
- inputWrapper.appendChild(sendIcon);
3741
- return { input, inputWrapper, sendIcon };
3742
- }
3743
- function showError(menu, message, errorCode) {
3744
- var _a2;
3745
- (_a2 = menu.querySelector(`.${errorMsgClass}`)) == null ? void 0 : _a2.remove();
3746
- const errEl = document.createElement("div");
3747
- errEl.className = errorMsgClass;
3748
- errEl.textContent = errorCode === "FILE_NOT_FOUND" ? "Source file not found. Is the server running?" : `Error: ${message}`;
3749
- menu.appendChild(errEl);
3750
- }
3751
- function isFixIntent(intent) {
3752
- return intent.aiIntent === "fix";
3753
- }
3754
- function createRuntimeContextUi(runtimeContext, options) {
3755
- var _a2;
3756
- if (!runtimeContext) return null;
3757
- const summary = formatRuntimeContextSummary(runtimeContext);
3758
- if (!summary) return null;
3759
- const container = document.createElement("div");
3760
- container.style.display = "flex";
3761
- container.style.flexDirection = "column";
3762
- container.style.gap = "4px";
3763
- const summaryEl = document.createElement("div");
3764
- summaryEl.className = menuContextSummaryClass;
3765
- summaryEl.textContent = summary;
3766
- container.appendChild(summaryEl);
3767
- if (((_a2 = options.runtimeContext) == null ? void 0 : _a2.preview) !== true || runtimeContext.records.length === 0) {
3768
- return container;
3769
- }
3770
- const toggle = document.createElement("button");
3771
- toggle.type = "button";
3772
- toggle.className = menuContextToggleClass;
3773
- toggle.textContent = "Show preview";
3774
- const preview = document.createElement("div");
3775
- preview.className = menuContextPreviewClass;
3776
- preview.hidden = true;
3777
- preview.textContent = formatRuntimeContextPreview(runtimeContext.records);
3778
- toggle.addEventListener("click", (event) => {
3779
- event.preventDefault();
3780
- event.stopPropagation();
3781
- preview.hidden = !preview.hidden;
3782
- toggle.textContent = preview.hidden ? "Show preview" : "Hide preview";
3783
- });
3784
- container.append(toggle, preview);
3785
- return container;
3786
- }
3787
- function formatRuntimeContextSummary(runtimeContext) {
3788
- const parts = [];
3789
- const { runtimeErrorCount, failedRequestCount } = runtimeContext.summary;
3790
- if (runtimeErrorCount > 0) {
3791
- parts.push(
3792
- `${runtimeErrorCount} ${runtimeErrorCount === 1 ? "runtime error" : "runtime errors"}`
3793
- );
3794
- }
3795
- if (failedRequestCount > 0) {
3796
- parts.push(
3797
- `${failedRequestCount} ${failedRequestCount === 1 ? "failed request" : "failed requests"}`
3798
- );
3799
- }
3800
- return parts.join(" \u2022 ");
3801
- }
3802
- function formatRuntimeContextPreview(records) {
3803
- return records.slice(0, 3).map((record) => {
3804
- var _a2, _b, _c, _d, _e, _f;
3805
- const details = record.kind === "failed-request" ? `${(_b = (_a2 = record.request) == null ? void 0 : _a2.method) != null ? _b : "GET"} ${(_f = (_e = (_c = record.request) == null ? void 0 : _c.pathname) != null ? _e : (_d = record.request) == null ? void 0 : _d.url) != null ? _f : ""}`.trim() : `${record.occurrenceCount}x`;
3806
- return `[${record.kind}] ${record.message}
3807
- ${details}`;
3808
- }).join("\n\n");
3809
- }
3810
- var init_menu_helpers = __esm({
3811
- "src/menu-helpers.ts"() {
3812
- "use strict";
3813
- init_styles();
3814
- }
3815
- });
3816
-
3817
3823
  // src/menu-header.ts
3818
3824
  function createMenuHeaderDom(input) {
3819
3825
  var _a2;
@@ -4143,9 +4149,10 @@ function showIntentMenu(shadowRoot, location, clickX, clickY, options, onClose,
4143
4149
  return null;
4144
4150
  }
4145
4151
  });
4146
- const resolveCssContextPrompt = () => {
4152
+ const resolveCssContextPrompt = (intent) => {
4147
4153
  var _a3, _b2;
4148
- if (!cssContextEnabled) return null;
4154
+ const shouldAttachCssContext = cssContextEnabled || Boolean(intent && isFixUiIntent(intent));
4155
+ if (!shouldAttachCssContext) return null;
4149
4156
  try {
4150
4157
  return (_b2 = (_a3 = deps.captureCssContextPrompt) == null ? void 0 : _a3.call(deps)) != null ? _b2 : null;
4151
4158
  } catch (e) {