@opentabs-dev/browser-extension 0.0.65 → 0.0.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/background-message-handlers.d.ts +5 -1
  2. package/dist/background-message-handlers.d.ts.map +1 -1
  3. package/dist/background-message-handlers.js +97 -4
  4. package/dist/background-message-handlers.js.map +1 -1
  5. package/dist/background.js +166 -34
  6. package/dist/background.js.map +1 -1
  7. package/dist/constants.d.ts +1 -0
  8. package/dist/constants.d.ts.map +1 -1
  9. package/dist/constants.js +1 -0
  10. package/dist/constants.js.map +1 -1
  11. package/dist/extension-messages.d.ts +11 -1
  12. package/dist/extension-messages.d.ts.map +1 -1
  13. package/dist/last-seen-urls.d.ts +6 -0
  14. package/dist/last-seen-urls.d.ts.map +1 -0
  15. package/dist/last-seen-urls.js +45 -0
  16. package/dist/last-seen-urls.js.map +1 -0
  17. package/dist/message-router.d.ts.map +1 -1
  18. package/dist/message-router.js +3 -0
  19. package/dist/message-router.js.map +1 -1
  20. package/dist/server-state-cache.d.ts +1 -0
  21. package/dist/server-state-cache.d.ts.map +1 -1
  22. package/dist/server-state-cache.js +2 -0
  23. package/dist/server-state-cache.js.map +1 -1
  24. package/dist/side-panel/App.d.ts.map +1 -1
  25. package/dist/side-panel/App.js +4 -1
  26. package/dist/side-panel/App.js.map +1 -1
  27. package/dist/side-panel/bridge.d.ts +12 -1
  28. package/dist/side-panel/bridge.d.ts.map +1 -1
  29. package/dist/side-panel/bridge.js +5 -1
  30. package/dist/side-panel/bridge.js.map +1 -1
  31. package/dist/side-panel/components/BrowserToolsCard.d.ts +2 -1
  32. package/dist/side-panel/components/BrowserToolsCard.d.ts.map +1 -1
  33. package/dist/side-panel/components/BrowserToolsCard.js +2 -2
  34. package/dist/side-panel/components/BrowserToolsCard.js.map +1 -1
  35. package/dist/side-panel/components/BrowserToolsMenu.d.ts +2 -1
  36. package/dist/side-panel/components/BrowserToolsMenu.d.ts.map +1 -1
  37. package/dist/side-panel/components/BrowserToolsMenu.js +16 -3
  38. package/dist/side-panel/components/BrowserToolsMenu.js.map +1 -1
  39. package/dist/side-panel/components/EmptyStates.js +2 -2
  40. package/dist/side-panel/components/EmptyStates.js.map +1 -1
  41. package/dist/side-panel/components/PluginCard.d.ts.map +1 -1
  42. package/dist/side-panel/components/PluginCard.js +21 -2
  43. package/dist/side-panel/components/PluginCard.js.map +1 -1
  44. package/dist/side-panel/components/PluginMenu.d.ts.map +1 -1
  45. package/dist/side-panel/components/PluginMenu.js +13 -2
  46. package/dist/side-panel/components/PluginMenu.js.map +1 -1
  47. package/dist/side-panel/components/SearchResults.d.ts.map +1 -1
  48. package/dist/side-panel/components/SearchResults.js +1 -1
  49. package/dist/side-panel/components/SearchResults.js.map +1 -1
  50. package/dist/side-panel/components/retro/Empty.js +1 -1
  51. package/dist/side-panel/components/retro/Empty.js.map +1 -1
  52. package/dist/side-panel/components/retro/Menu.d.ts +3 -2
  53. package/dist/side-panel/components/retro/Menu.d.ts.map +1 -1
  54. package/dist/side-panel/components/retro/Menu.js +3 -4
  55. package/dist/side-panel/components/retro/Menu.js.map +1 -1
  56. package/dist/side-panel/side-panel.js +639 -429
  57. package/dist/side-panel/styles.css +1 -1
  58. package/dist/tab-state.d.ts.map +1 -1
  59. package/dist/tab-state.js +10 -0
  60. package/dist/tab-state.js.map +1 -1
  61. package/manifest.json +1 -1
  62. package/package.json +2 -1
@@ -58686,7 +58686,7 @@ var BROWSER_TOOLS_CATALOG = [{
58686
58686
  group: "Extension"
58687
58687
  }, {
58688
58688
  name: "plugin_analyze_site",
58689
- description: "Comprehensively analyze a web page to produce actionable intelligence for building OpenTabs plugins. Opens the URL in a new tab, captures network traffic and WebSocket frame content, probes the page for frameworks, globals, auth, forms, storage, and APIs, then generates concrete tool suggestions. Returns: auth methods (cookies, JWT, Bearer, API keys, CSRF, Basic, custom headers, globals) with extraction hints; API endpoints classified by protocol (REST, GraphQL, JSON-RPC, tRPC, gRPC-Web, WebSocket, SSE) with sample WebSocket frame payloads for real-time API detection; framework detection (React, Next.js, Vue, Nuxt, Angular, Svelte, jQuery, Ember, Backbone) with SPA/SSR flags; non-standard window globals; forms with field names; interactive elements; data-* attributes; storage keys (cookies, localStorage, sessionStorage); and tool suggestions with snake_case names, descriptions, and implementation approaches. Use this when starting to develop a new plugin for a website \u2014 it tells you everything you need to know about how the site works.",
58689
+ description: "Comprehensively analyze a web page to produce actionable intelligence for building OpenTabs plugins. Opens the URL in a new tab, captures network traffic and WebSocket frame content, probes the page for frameworks, globals, auth, forms, storage, and APIs, then generates concrete tool suggestions. Returns: auth methods (cookies, JWT, Bearer, API keys, CSRF, Basic, custom headers, globals) with extraction hints; API endpoints classified by protocol (REST, GraphQL, JSON-RPC, tRPC, gRPC-Web, WebSocket, SSE) with sample WebSocket frame payloads for real-time API detection; framework detection (React, Next.js, Vue, Nuxt, Angular, Svelte, jQuery, Ember, Backbone) with SPA/SSR flags; non-standard window globals; forms with field names; interactive elements; data-* attributes; storage keys (cookies, localStorage, sessionStorage); and tool suggestions with snake_case names, descriptions, and implementation approaches. Use this when starting to develop a new plugin for a website \u2014 it tells you everything you need to know about how the site works. This is Phase 2 of the plugin development workflow. For the complete step-by-step guide (including auth discovery, API mapping, scaffolding, and common gotchas), use the build-plugin skill.",
58690
58690
  summary: "Analyze a site for plugin development",
58691
58691
  icon: "scan-search",
58692
58692
  group: "Plugins"
@@ -58707,12 +58707,12 @@ init_check();
58707
58707
  init_chevron_down();
58708
58708
  init_chevron_up();
58709
58709
  init_copy();
58710
+ init_folder_open();
58710
58711
  init_ghost();
58711
58712
  init_key_round();
58712
58713
  init_moon();
58713
58714
  init_package();
58714
58715
  init_search();
58715
- init_server();
58716
58716
  init_shield_off();
58717
58717
  init_sun();
58718
58718
  init_trash_2();
@@ -61446,6 +61446,14 @@ var setSkipPermissions = (skipPermissions) => sendBgMessage({
61446
61446
  type: "bg:setSkipPermissions",
61447
61447
  skipPermissions
61448
61448
  });
61449
+ var openPluginTab = (pluginName) => sendBgMessage({
61450
+ type: "bg:openPluginTab",
61451
+ pluginName
61452
+ });
61453
+ var openFolder = (path) => sendBgMessage({
61454
+ type: "bg:openFolder",
61455
+ path
61456
+ });
61449
61457
  var sendConfirmationResponse = (id, decision, alwaysAllow) => {
61450
61458
  chrome.runtime.sendMessage({
61451
61459
  type: "sp:confirmationResponse",
@@ -67461,7 +67469,6 @@ var Trigger3 = DropdownMenuTrigger;
67461
67469
  var Portal22 = DropdownMenuPortal;
67462
67470
  var Content23 = DropdownMenuContent;
67463
67471
  var Item23 = DropdownMenuItem;
67464
- var Separator2 = DropdownMenuSeparator;
67465
67472
 
67466
67473
  // ../../node_modules/clsx/dist/clsx.mjs
67467
67474
  function r2(e2) {
@@ -70687,7 +70694,7 @@ var MenuContent2 = (t0) => {
70687
70694
  const sideOffset = t1 === void 0 ? 4 : t1;
70688
70695
  let t2;
70689
70696
  if ($2[5] !== className) {
70690
- t2 = cn("z-50 w-56 rounded border-2 border-border bg-card shadow-md", className);
70697
+ t2 = cn("z-50 min-w-[8rem] overflow-hidden border border-border bg-background font-mono font-semibold text-foreground text-xs shadow-md", className);
70691
70698
  $2[5] = className;
70692
70699
  $2[6] = t2;
70693
70700
  } else {
@@ -70714,13 +70721,15 @@ var MenuContent2 = (t0) => {
70714
70721
  return t3;
70715
70722
  };
70716
70723
  var MenuItem2 = (t0) => {
70717
- const $2 = (0, import_compiler_runtime.c)(10);
70724
+ const $2 = (0, import_compiler_runtime.c)(12);
70718
70725
  let className;
70719
70726
  let props;
70720
70727
  let ref;
70728
+ let variant;
70721
70729
  if ($2[0] !== t0) {
70722
70730
  ({
70723
70731
  className,
70732
+ variant,
70724
70733
  ref,
70725
70734
  ...props
70726
70735
  } = t0);
@@ -70728,92 +70737,139 @@ var MenuItem2 = (t0) => {
70728
70737
  $2[1] = className;
70729
70738
  $2[2] = props;
70730
70739
  $2[3] = ref;
70740
+ $2[4] = variant;
70731
70741
  } else {
70732
70742
  className = $2[1];
70733
70743
  props = $2[2];
70734
70744
  ref = $2[3];
70745
+ variant = $2[4];
70735
70746
  }
70736
- let t1;
70737
- if ($2[4] !== className) {
70738
- t1 = cn("relative flex cursor-pointer select-none items-center gap-2 px-3 py-1.5 font-sans text-foreground text-sm outline-none transition-colors focus:bg-primary focus:text-primary-foreground data-[disabled]:pointer-events-none data-[highlighted]:bg-primary data-[highlighted]:text-primary-foreground data-[disabled]:opacity-50 [&_svg:not([class*=size-])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className);
70739
- $2[4] = className;
70740
- $2[5] = t1;
70747
+ const t1 = variant === "destructive" && "text-destructive focus:bg-destructive/10 focus:text-destructive data-[highlighted]:bg-destructive/10 data-[highlighted]:text-destructive";
70748
+ let t2;
70749
+ if ($2[5] !== className || $2[6] !== t1) {
70750
+ t2 = cn("relative flex w-full cursor-default select-none items-center gap-2 px-2 py-1.5 outline-none focus:bg-primary focus:text-primary-foreground data-[disabled]:pointer-events-none data-[highlighted]:bg-primary data-[highlighted]:text-primary-foreground data-disabled:opacity-50 [&_svg:not([class*=size-])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", t1, className);
70751
+ $2[5] = className;
70752
+ $2[6] = t1;
70753
+ $2[7] = t2;
70741
70754
  } else {
70742
- t1 = $2[5];
70755
+ t2 = $2[7];
70743
70756
  }
70744
- let t2;
70745
- if ($2[6] !== props || $2[7] !== ref || $2[8] !== t1) {
70746
- t2 = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Item23, {
70757
+ let t3;
70758
+ if ($2[8] !== props || $2[9] !== ref || $2[10] !== t2) {
70759
+ t3 = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Item23, {
70747
70760
  ref,
70748
- className: t1,
70761
+ className: t2,
70749
70762
  ...props
70750
70763
  });
70751
- $2[6] = props;
70752
- $2[7] = ref;
70753
- $2[8] = t1;
70754
- $2[9] = t2;
70764
+ $2[8] = props;
70765
+ $2[9] = ref;
70766
+ $2[10] = t2;
70767
+ $2[11] = t3;
70755
70768
  } else {
70756
- t2 = $2[9];
70769
+ t3 = $2[11];
70757
70770
  }
70758
- return t2;
70771
+ return t3;
70759
70772
  };
70760
- var MenuSeparator2 = (t0) => {
70761
- const $2 = (0, import_compiler_runtime.c)(10);
70762
- let className;
70763
- let props;
70764
- let ref;
70765
- if ($2[0] !== t0) {
70766
- ({
70767
- className,
70768
- ref,
70769
- ...props
70770
- } = t0);
70771
- $2[0] = t0;
70772
- $2[1] = className;
70773
- $2[2] = props;
70774
- $2[3] = ref;
70775
- } else {
70776
- className = $2[1];
70777
- props = $2[2];
70778
- ref = $2[3];
70773
+ var MenuObject = Object.assign(Menu3, {
70774
+ Trigger: MenuTrigger,
70775
+ Content: MenuContent2,
70776
+ Item: MenuItem2
70777
+ });
70778
+
70779
+ // src/side-panel/components/BrowserToolsMenu.tsx
70780
+ var import_jsx_runtime20 = __toESM(require_jsx_runtime(), 1);
70781
+ var SERVER_NPM_PACKAGE = "@opentabs-dev/mcp-server";
70782
+ var isNpmInstall = (sourcePath) => sourcePath.includes("node_modules");
70783
+ var ServerVersionItem = (t0) => {
70784
+ const $2 = (0, import_compiler_runtime2.c)(12);
70785
+ const {
70786
+ serverVersion,
70787
+ serverSourcePath
70788
+ } = t0;
70789
+ const label = `Server ${serverVersion ? `v${serverVersion}` : "unknown"}`;
70790
+ if (serverSourcePath && isNpmInstall(serverSourcePath)) {
70791
+ let t12;
70792
+ if ($2[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
70793
+ t12 = /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Package, {
70794
+ className: "h-3.5 w-3.5"
70795
+ });
70796
+ $2[0] = t12;
70797
+ } else {
70798
+ t12 = $2[0];
70799
+ }
70800
+ let t22;
70801
+ if ($2[1] !== label) {
70802
+ t22 = /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(MenuObject.Item, {
70803
+ onSelect: _temp,
70804
+ children: [t12, label]
70805
+ });
70806
+ $2[1] = label;
70807
+ $2[2] = t22;
70808
+ } else {
70809
+ t22 = $2[2];
70810
+ }
70811
+ return t22;
70812
+ }
70813
+ if (serverSourcePath) {
70814
+ let t12;
70815
+ if ($2[3] !== serverSourcePath) {
70816
+ t12 = () => void openFolder(serverSourcePath);
70817
+ $2[3] = serverSourcePath;
70818
+ $2[4] = t12;
70819
+ } else {
70820
+ t12 = $2[4];
70821
+ }
70822
+ let t22;
70823
+ if ($2[5] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
70824
+ t22 = /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(FolderOpen, {
70825
+ className: "h-3.5 w-3.5"
70826
+ });
70827
+ $2[5] = t22;
70828
+ } else {
70829
+ t22 = $2[5];
70830
+ }
70831
+ let t3;
70832
+ if ($2[6] !== label || $2[7] !== t12) {
70833
+ t3 = /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(MenuObject.Item, {
70834
+ onSelect: t12,
70835
+ children: [t22, label]
70836
+ });
70837
+ $2[6] = label;
70838
+ $2[7] = t12;
70839
+ $2[8] = t3;
70840
+ } else {
70841
+ t3 = $2[8];
70842
+ }
70843
+ return t3;
70779
70844
  }
70780
70845
  let t1;
70781
- if ($2[4] !== className) {
70782
- t1 = cn("-mx-1 my-1 h-px bg-border", className);
70783
- $2[4] = className;
70784
- $2[5] = t1;
70846
+ if ($2[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
70847
+ t1 = /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Package, {
70848
+ className: "h-3.5 w-3.5"
70849
+ });
70850
+ $2[9] = t1;
70785
70851
  } else {
70786
- t1 = $2[5];
70852
+ t1 = $2[9];
70787
70853
  }
70788
70854
  let t2;
70789
- if ($2[6] !== props || $2[7] !== ref || $2[8] !== t1) {
70790
- t2 = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Separator2, {
70791
- ref,
70792
- className: t1,
70793
- ...props
70855
+ if ($2[10] !== label) {
70856
+ t2 = /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(MenuObject.Item, {
70857
+ disabled: true,
70858
+ className: "text-muted-foreground",
70859
+ children: [t1, label]
70794
70860
  });
70795
- $2[6] = props;
70796
- $2[7] = ref;
70797
- $2[8] = t1;
70798
- $2[9] = t2;
70861
+ $2[10] = label;
70862
+ $2[11] = t2;
70799
70863
  } else {
70800
- t2 = $2[9];
70864
+ t2 = $2[11];
70801
70865
  }
70802
70866
  return t2;
70803
70867
  };
70804
- var MenuObject = Object.assign(Menu3, {
70805
- Trigger: MenuTrigger,
70806
- Content: MenuContent2,
70807
- Item: MenuItem2,
70808
- Separator: MenuSeparator2
70809
- });
70810
-
70811
- // src/side-panel/components/BrowserToolsMenu.tsx
70812
- var import_jsx_runtime20 = __toESM(require_jsx_runtime(), 1);
70813
70868
  var BrowserToolsMenu = (t0) => {
70814
70869
  const $2 = (0, import_compiler_runtime2.c)(7);
70815
70870
  const {
70816
70871
  serverVersion,
70872
+ serverSourcePath,
70817
70873
  className
70818
70874
  } = t0;
70819
70875
  let t1;
@@ -70834,54 +70890,47 @@ var BrowserToolsMenu = (t0) => {
70834
70890
  t1 = $2[0];
70835
70891
  }
70836
70892
  let t2;
70837
- if ($2[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
70838
- t2 = /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Server, {
70839
- className: "h-3.5 w-3.5"
70840
- });
70841
- $2[1] = t2;
70842
- } else {
70843
- t2 = $2[1];
70844
- }
70845
- const t3 = serverVersion ? `v${serverVersion}` : "unknown";
70846
- let t4;
70847
- if ($2[2] !== t3) {
70848
- t4 = /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(MenuObject, {
70893
+ if ($2[1] !== serverSourcePath || $2[2] !== serverVersion) {
70894
+ t2 = /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(MenuObject, {
70849
70895
  children: [t1, /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(MenuObject.Content, {
70850
70896
  align: "end",
70851
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(MenuObject.Item, {
70852
- disabled: true,
70853
- className: "text-muted-foreground",
70854
- children: [t2, "Server ", t3]
70897
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ServerVersionItem, {
70898
+ serverVersion,
70899
+ serverSourcePath
70855
70900
  })
70856
70901
  })]
70857
70902
  });
70858
- $2[2] = t3;
70859
- $2[3] = t4;
70903
+ $2[1] = serverSourcePath;
70904
+ $2[2] = serverVersion;
70905
+ $2[3] = t2;
70860
70906
  } else {
70861
- t4 = $2[3];
70907
+ t2 = $2[3];
70862
70908
  }
70863
- let t5;
70864
- if ($2[4] !== className || $2[5] !== t4) {
70865
- t5 = /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", {
70909
+ let t3;
70910
+ if ($2[4] !== className || $2[5] !== t2) {
70911
+ t3 = /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", {
70866
70912
  className,
70867
- onClick: _temp,
70868
- onKeyDown: _temp2,
70913
+ onClick: _temp2,
70914
+ onKeyDown: _temp3,
70869
70915
  role: "presentation",
70870
- children: t4
70916
+ children: t2
70871
70917
  });
70872
70918
  $2[4] = className;
70873
- $2[5] = t4;
70874
- $2[6] = t5;
70919
+ $2[5] = t2;
70920
+ $2[6] = t3;
70875
70921
  } else {
70876
- t5 = $2[6];
70922
+ t3 = $2[6];
70877
70923
  }
70878
- return t5;
70924
+ return t3;
70879
70925
  };
70880
70926
  BrowserToolsMenu.displayName = "BrowserToolsMenu";
70881
- function _temp(e2) {
70927
+ function _temp() {
70928
+ return window.open(`https://www.npmjs.com/package/${SERVER_NPM_PACKAGE}`, "_blank");
70929
+ }
70930
+ function _temp2(e2) {
70882
70931
  return e2.stopPropagation();
70883
70932
  }
70884
- function _temp2(e_0) {
70933
+ function _temp3(e_0) {
70885
70934
  if (e_0.key === "Enter" || e_0.key === " ") {
70886
70935
  e_0.stopPropagation();
70887
70936
  }
@@ -73128,7 +73177,7 @@ var ItemText = SelectItemText;
73128
73177
  var ItemIndicator2 = SelectItemIndicator;
73129
73178
  var ScrollUpButton = SelectScrollUpButton;
73130
73179
  var ScrollDownButton = SelectScrollDownButton;
73131
- var Separator3 = SelectSeparator;
73180
+ var Separator2 = SelectSeparator;
73132
73181
 
73133
73182
  // src/side-panel/components/retro/Select.tsx
73134
73183
  var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1);
@@ -73361,7 +73410,7 @@ var SelectItem2 = (t0) => {
73361
73410
  return t4;
73362
73411
  };
73363
73412
  var SelectLabel2 = Label2;
73364
- var SelectSeparator2 = Separator3;
73413
+ var SelectSeparator2 = Separator2;
73365
73414
  var SelectObj = Object.assign(Select2, {
73366
73415
  Trigger: SelectTrigger2,
73367
73416
  Value: SelectValue2,
@@ -76096,7 +76145,7 @@ var PermissionSelect = (t0) => {
76096
76145
  if ($2[5] !== ariaLabel || $2[6] !== disabled || $2[7] !== t3) {
76097
76146
  t5 = /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SelectObj.Trigger, {
76098
76147
  className: t3,
76099
- onClick: _temp3,
76148
+ onClick: _temp4,
76100
76149
  disabled,
76101
76150
  "aria-label": ariaLabel,
76102
76151
  children: t4
@@ -76303,7 +76352,7 @@ var ToolRow = (t0) => {
76303
76352
  }
76304
76353
  return t16;
76305
76354
  };
76306
- function _temp3(e2) {
76355
+ function _temp4(e2) {
76307
76356
  return e2.stopPropagation();
76308
76357
  }
76309
76358
 
@@ -76343,13 +76392,14 @@ var import_jsx_runtime34 = __toESM(require_jsx_runtime(), 1);
76343
76392
  var CHROME_ICON_SVG = ['<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">', "<defs>", '<linearGradient id="chrome-a" x1="3.2173" y1="15" x2="44.7812" y2="15" gradientUnits="userSpaceOnUse">', '<stop offset="0" stop-color="#d93025"/><stop offset="1" stop-color="#ea4335"/>', "</linearGradient>", '<linearGradient id="chrome-b" x1="20.7219" y1="47.6791" x2="41.5039" y2="11.6837" gradientUnits="userSpaceOnUse">', '<stop offset="0" stop-color="#fcc934"/><stop offset="1" stop-color="#fbbc04"/>', "</linearGradient>", '<linearGradient id="chrome-c" x1="26.5981" y1="46.5015" x2="5.8161" y2="10.506" gradientUnits="userSpaceOnUse">', '<stop offset="0" stop-color="#1e8e3e"/><stop offset="1" stop-color="#34a853"/>', "</linearGradient>", "</defs>", '<circle cx="24" cy="23.9947" r="12" fill="#fff"/>', '<path d="M3.2154,36A24,24,0,1,0,12,3.2154,24,24,0,0,0,3.2154,36ZM34.3923,18A12,12,0,1,1,18,13.6077,12,12,0,0,1,34.3923,18Z" fill="none"/>', '<path d="M24,12H44.7812a23.9939,23.9939,0,0,0-41.5639.0029L13.6079,30l.0093-.0024A11.9852,11.9852,0,0,1,24,12Z" fill="url(#chrome-a)"/>', '<circle cx="24" cy="24" r="9.5" fill="#1a73e8"/>', '<path d="M34.3913,30.0029,24.0007,48A23.994,23.994,0,0,0,44.78,12.0031H23.9989l-.0025.0093A11.985,11.985,0,0,1,34.3913,30.0029Z" fill="url(#chrome-b)"/>', '<path d="M13.6086,30.0031,3.218,12.006A23.994,23.994,0,0,0,24.0025,48L34.3931,30.0029l-.0067-.0068a11.9852,11.9852,0,0,1-20.7778.007Z" fill="url(#chrome-c)"/>', "</svg>"].join("");
76344
76393
  var toDisplayName = (name) => name.replace(/^browser_/, "").split("_").map((w3) => w3.charAt(0).toUpperCase() + w3.slice(1)).join(" ");
76345
76394
  var BrowserToolsCard = (t0) => {
76346
- const $2 = (0, import_compiler_runtime11.c)(61);
76395
+ const $2 = (0, import_compiler_runtime11.c)(63);
76347
76396
  const {
76348
76397
  tools,
76349
76398
  activeTools,
76350
76399
  onToolsChange,
76351
76400
  toolFilter,
76352
76401
  serverVersion,
76402
+ serverSourcePath,
76353
76403
  browserPermission: t1,
76354
76404
  onBrowserPermissionChange
76355
76405
  } = t0;
@@ -76442,30 +76492,30 @@ var BrowserToolsCard = (t0) => {
76442
76492
  let t13;
76443
76493
  let t8;
76444
76494
  let t9;
76445
- if ($2[9] !== activeTools || $2[10] !== browserPermission || $2[11] !== handleBrowserPermissionChange || $2[12] !== handleToolPermissionChange || $2[13] !== serverVersion || $2[14] !== toggleError || $2[15] !== toolFilter || $2[16] !== tools) {
76495
+ if ($2[9] !== activeTools || $2[10] !== browserPermission || $2[11] !== handleBrowserPermissionChange || $2[12] !== handleToolPermissionChange || $2[13] !== serverSourcePath || $2[14] !== serverVersion || $2[15] !== toggleError || $2[16] !== toolFilter || $2[17] !== tools) {
76446
76496
  const filterLower = toolFilter?.toLowerCase() ?? "";
76447
76497
  const visibleTools = filterLower ? tools.filter((t_0) => toDisplayName(t_0.name).toLowerCase().includes(filterLower) || t_0.name.toLowerCase().includes(filterLower) || t_0.description.toLowerCase().includes(filterLower)) : tools;
76448
76498
  let t142;
76449
- if ($2[25] !== activeTools || $2[26] !== tools) {
76499
+ if ($2[26] !== activeTools || $2[27] !== tools) {
76450
76500
  let t153;
76451
- if ($2[28] !== activeTools) {
76501
+ if ($2[29] !== activeTools) {
76452
76502
  t153 = (t_1) => activeTools.has(`browser:${t_1.name}`);
76453
- $2[28] = activeTools;
76454
- $2[29] = t153;
76503
+ $2[29] = activeTools;
76504
+ $2[30] = t153;
76455
76505
  } else {
76456
- t153 = $2[29];
76506
+ t153 = $2[30];
76457
76507
  }
76458
76508
  t142 = tools.some(t153);
76459
- $2[25] = activeTools;
76460
- $2[26] = tools;
76461
- $2[27] = t142;
76509
+ $2[26] = activeTools;
76510
+ $2[27] = tools;
76511
+ $2[28] = t142;
76462
76512
  } else {
76463
- t142 = $2[27];
76513
+ t142 = $2[28];
76464
76514
  }
76465
76515
  const hasActiveTool = t142;
76466
76516
  const toolGroups = groupTools(visibleTools);
76467
76517
  let t152;
76468
- if ($2[30] !== activeTools || $2[31] !== handleToolPermissionChange) {
76518
+ if ($2[31] !== activeTools || $2[32] !== handleToolPermissionChange) {
76469
76519
  t152 = (toolList) => toolList.map((tool) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(ToolRow, {
76470
76520
  name: tool.name,
76471
76521
  displayName: toDisplayName(tool.name),
@@ -76476,17 +76526,17 @@ var BrowserToolsCard = (t0) => {
76476
76526
  active: activeTools.has(`browser:${tool.name}`),
76477
76527
  onPermissionChange: handleToolPermissionChange
76478
76528
  }, tool.name));
76479
- $2[30] = activeTools;
76480
- $2[31] = handleToolPermissionChange;
76481
- $2[32] = t152;
76529
+ $2[31] = activeTools;
76530
+ $2[32] = handleToolPermissionChange;
76531
+ $2[33] = t152;
76482
76532
  } else {
76483
- t152 = $2[32];
76533
+ t152 = $2[33];
76484
76534
  }
76485
76535
  const renderToolList = t152;
76486
76536
  T1 = AccordionComponent.Item;
76487
76537
  t11 = "browser-tools";
76488
76538
  let t16;
76489
- if ($2[33] !== hasActiveTool) {
76539
+ if ($2[34] !== hasActiveTool) {
76490
76540
  t16 = /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(PluginIcon, {
76491
76541
  pluginName: "browser",
76492
76542
  displayName: "Browser",
@@ -76496,14 +76546,14 @@ var BrowserToolsCard = (t0) => {
76496
76546
  iconInactiveSvg: CHROME_ICON_SVG,
76497
76547
  active: hasActiveTool
76498
76548
  });
76499
- $2[33] = hasActiveTool;
76500
- $2[34] = t16;
76549
+ $2[34] = hasActiveTool;
76550
+ $2[35] = t16;
76501
76551
  } else {
76502
- t16 = $2[34];
76552
+ t16 = $2[35];
76503
76553
  }
76504
76554
  let t17;
76505
76555
  let t18;
76506
- if ($2[35] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
76556
+ if ($2[36] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
76507
76557
  t17 = /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", {
76508
76558
  className: "flex min-w-0 flex-1 items-center gap-1.5 truncate font-head text-foreground text-sm",
76509
76559
  children: "Browser"
@@ -76511,36 +76561,38 @@ var BrowserToolsCard = (t0) => {
76511
76561
  t18 = /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(ChevronDown, {
76512
76562
  className: "chevron h-4 w-4 shrink-0 transition-transform duration-200"
76513
76563
  });
76514
- $2[35] = t17;
76515
- $2[36] = t18;
76564
+ $2[36] = t17;
76565
+ $2[37] = t18;
76516
76566
  } else {
76517
- t17 = $2[35];
76518
- t18 = $2[36];
76567
+ t17 = $2[36];
76568
+ t18 = $2[37];
76519
76569
  }
76520
76570
  let t19;
76521
- if ($2[37] !== t16) {
76571
+ if ($2[38] !== t16) {
76522
76572
  t19 = /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(Trigger2, {
76523
76573
  className: "focus-ring flex min-w-0 flex-1 cursor-pointer items-center gap-2 px-3 py-2 [&[data-state=open]>svg.chevron]:rotate-180",
76524
76574
  children: [t16, t17, t18]
76525
76575
  });
76526
- $2[37] = t16;
76527
- $2[38] = t19;
76576
+ $2[38] = t16;
76577
+ $2[39] = t19;
76528
76578
  } else {
76529
- t19 = $2[38];
76579
+ t19 = $2[39];
76530
76580
  }
76531
76581
  let t20;
76532
- if ($2[39] !== serverVersion) {
76582
+ if ($2[40] !== serverSourcePath || $2[41] !== serverVersion) {
76533
76583
  t20 = /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(BrowserToolsMenu, {
76534
76584
  serverVersion,
76585
+ serverSourcePath,
76535
76586
  className: "flex shrink-0 items-center px-1"
76536
76587
  });
76537
- $2[39] = serverVersion;
76538
- $2[40] = t20;
76588
+ $2[40] = serverSourcePath;
76589
+ $2[41] = serverVersion;
76590
+ $2[42] = t20;
76539
76591
  } else {
76540
- t20 = $2[40];
76592
+ t20 = $2[42];
76541
76593
  }
76542
76594
  let t21;
76543
- if ($2[41] !== browserPermission || $2[42] !== handleBrowserPermissionChange) {
76595
+ if ($2[43] !== browserPermission || $2[44] !== handleBrowserPermissionChange) {
76544
76596
  t21 = /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", {
76545
76597
  className: "flex shrink-0 items-center px-3",
76546
76598
  children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(PermissionSelect, {
@@ -76550,34 +76602,34 @@ var BrowserToolsCard = (t0) => {
76550
76602
  ariaLabel: "Permission for browser tools"
76551
76603
  })
76552
76604
  });
76553
- $2[41] = browserPermission;
76554
- $2[42] = handleBrowserPermissionChange;
76555
- $2[43] = t21;
76605
+ $2[43] = browserPermission;
76606
+ $2[44] = handleBrowserPermissionChange;
76607
+ $2[45] = t21;
76556
76608
  } else {
76557
- t21 = $2[43];
76609
+ t21 = $2[45];
76558
76610
  }
76559
- if ($2[44] !== t19 || $2[45] !== t20 || $2[46] !== t21) {
76611
+ if ($2[46] !== t19 || $2[47] !== t20 || $2[48] !== t21) {
76560
76612
  t12 = /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(Header, {
76561
76613
  className: "flex",
76562
76614
  children: [t19, t20, t21]
76563
76615
  });
76564
- $2[44] = t19;
76565
- $2[45] = t20;
76566
- $2[46] = t21;
76567
- $2[47] = t12;
76616
+ $2[46] = t19;
76617
+ $2[47] = t20;
76618
+ $2[48] = t21;
76619
+ $2[49] = t12;
76568
76620
  } else {
76569
- t12 = $2[47];
76621
+ t12 = $2[49];
76570
76622
  }
76571
- if ($2[48] !== toggleError) {
76623
+ if ($2[50] !== toggleError) {
76572
76624
  t13 = toggleError && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(AlertComponent, {
76573
76625
  status: "error",
76574
76626
  className: "mx-3 mb-1 px-2 py-1 text-xs",
76575
76627
  children: toggleError
76576
76628
  });
76577
- $2[48] = toggleError;
76578
- $2[49] = t13;
76629
+ $2[50] = toggleError;
76630
+ $2[51] = t13;
76579
76631
  } else {
76580
- t13 = $2[49];
76632
+ t13 = $2[51];
76581
76633
  }
76582
76634
  T0 = AccordionComponent.Content;
76583
76635
  t8 = "border-border border-t";
@@ -76599,56 +76651,57 @@ var BrowserToolsCard = (t0) => {
76599
76651
  $2[10] = browserPermission;
76600
76652
  $2[11] = handleBrowserPermissionChange;
76601
76653
  $2[12] = handleToolPermissionChange;
76602
- $2[13] = serverVersion;
76603
- $2[14] = toggleError;
76604
- $2[15] = toolFilter;
76605
- $2[16] = tools;
76606
- $2[17] = T0;
76607
- $2[18] = T1;
76608
- $2[19] = t10;
76609
- $2[20] = t11;
76610
- $2[21] = t12;
76611
- $2[22] = t13;
76612
- $2[23] = t8;
76613
- $2[24] = t9;
76654
+ $2[13] = serverSourcePath;
76655
+ $2[14] = serverVersion;
76656
+ $2[15] = toggleError;
76657
+ $2[16] = toolFilter;
76658
+ $2[17] = tools;
76659
+ $2[18] = T0;
76660
+ $2[19] = T1;
76661
+ $2[20] = t10;
76662
+ $2[21] = t11;
76663
+ $2[22] = t12;
76664
+ $2[23] = t13;
76665
+ $2[24] = t8;
76666
+ $2[25] = t9;
76614
76667
  } else {
76615
- T0 = $2[17];
76616
- T1 = $2[18];
76617
- t10 = $2[19];
76618
- t11 = $2[20];
76619
- t12 = $2[21];
76620
- t13 = $2[22];
76621
- t8 = $2[23];
76622
- t9 = $2[24];
76668
+ T0 = $2[18];
76669
+ T1 = $2[19];
76670
+ t10 = $2[20];
76671
+ t11 = $2[21];
76672
+ t12 = $2[22];
76673
+ t13 = $2[23];
76674
+ t8 = $2[24];
76675
+ t9 = $2[25];
76623
76676
  }
76624
76677
  let t14;
76625
- if ($2[50] !== T0 || $2[51] !== t10 || $2[52] !== t8 || $2[53] !== t9) {
76678
+ if ($2[52] !== T0 || $2[53] !== t10 || $2[54] !== t8 || $2[55] !== t9) {
76626
76679
  t14 = /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(T0, {
76627
76680
  className: t8,
76628
76681
  children: [t9, t10]
76629
76682
  });
76630
- $2[50] = T0;
76631
- $2[51] = t10;
76632
- $2[52] = t8;
76633
- $2[53] = t9;
76634
- $2[54] = t14;
76683
+ $2[52] = T0;
76684
+ $2[53] = t10;
76685
+ $2[54] = t8;
76686
+ $2[55] = t9;
76687
+ $2[56] = t14;
76635
76688
  } else {
76636
- t14 = $2[54];
76689
+ t14 = $2[56];
76637
76690
  }
76638
76691
  let t15;
76639
- if ($2[55] !== T1 || $2[56] !== t11 || $2[57] !== t12 || $2[58] !== t13 || $2[59] !== t14) {
76692
+ if ($2[57] !== T1 || $2[58] !== t11 || $2[59] !== t12 || $2[60] !== t13 || $2[61] !== t14) {
76640
76693
  t15 = /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(T1, {
76641
76694
  value: t11,
76642
76695
  children: [t12, t13, t14]
76643
76696
  });
76644
- $2[55] = T1;
76645
- $2[56] = t11;
76646
- $2[57] = t12;
76647
- $2[58] = t13;
76648
- $2[59] = t14;
76649
- $2[60] = t15;
76697
+ $2[57] = T1;
76698
+ $2[58] = t11;
76699
+ $2[59] = t12;
76700
+ $2[60] = t13;
76701
+ $2[61] = t14;
76702
+ $2[62] = t15;
76650
76703
  } else {
76651
- t15 = $2[60];
76704
+ t15 = $2[62];
76652
76705
  }
76653
76706
  return t15;
76654
76707
  };
@@ -77960,7 +78013,7 @@ var ConfirmationDialog = (t0) => {
77960
78013
  let t14;
77961
78014
  if ($2[31] !== t13 || $2[32] !== t7 || $2[33] !== t9) {
77962
78015
  t14 = /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(DialogObject.Content, {
77963
- onInteractOutside: _temp4,
78016
+ onInteractOutside: _temp5,
77964
78017
  onEscapeKeyDown: _temp22,
77965
78018
  children: [t7, t9, t13]
77966
78019
  });
@@ -77987,7 +78040,7 @@ var ConfirmationDialog = (t0) => {
77987
78040
  }
77988
78041
  return t15;
77989
78042
  };
77990
- function _temp4(e2) {
78043
+ function _temp5(e2) {
77991
78044
  return e2.preventDefault();
77992
78045
  }
77993
78046
  function _temp22(e_0) {
@@ -78113,7 +78166,7 @@ var EmptyIcon = (t0) => {
78113
78166
  }
78114
78167
  let t1;
78115
78168
  if ($2[4] !== className) {
78116
- t1 = cn(className);
78169
+ t1 = cn("flex items-center justify-center", className);
78117
78170
  $2[4] = className;
78118
78171
  $2[5] = t1;
78119
78172
  } else {
@@ -78122,7 +78175,7 @@ var EmptyIcon = (t0) => {
78122
78175
  let t2;
78123
78176
  if ($2[6] !== children) {
78124
78177
  t2 = children || /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(Ghost, {
78125
- className: "h-full w-full"
78178
+ size: 40
78126
78179
  });
78127
78180
  $2[6] = children;
78128
78181
  $2[7] = t2;
@@ -78478,7 +78531,7 @@ var ConnectionRefusedState = () => {
78478
78531
  if (typeof stored === "number" && stored >= 1 && stored <= 65535) {
78479
78532
  setPort(stored);
78480
78533
  }
78481
- }, _temp5);
78534
+ }, _temp6);
78482
78535
  const onChanged = (changes, area) => {
78483
78536
  if (area !== "local" || !(SERVER_PORT_KEY in changes)) {
78484
78537
  return;
@@ -78508,7 +78561,7 @@ var ConnectionRefusedState = () => {
78508
78561
  t2 = /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(EmptyComponent.Icon, {
78509
78562
  className: "h-10 w-10 text-destructive/60",
78510
78563
  children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Unplug, {
78511
- className: "h-full w-full"
78564
+ size: 40
78512
78565
  })
78513
78566
  });
78514
78567
  t3 = /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(EmptyComponent.Title, {
@@ -78588,7 +78641,7 @@ var AuthFailedState = () => {
78588
78641
  t0 = /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(EmptyComponent.Icon, {
78589
78642
  className: "h-10 w-10 text-destructive/60",
78590
78643
  children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(KeyRound, {
78591
- className: "h-full w-full"
78644
+ size: 40
78592
78645
  })
78593
78646
  });
78594
78647
  t1 = /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(EmptyComponent.Title, {
@@ -78675,7 +78728,7 @@ var LoadingState = () => {
78675
78728
  }
78676
78729
  return t0;
78677
78730
  };
78678
- function _temp5() {
78731
+ function _temp6() {
78679
78732
  }
78680
78733
 
78681
78734
  // src/side-panel/components/Footer.tsx
@@ -78691,7 +78744,7 @@ var applyTheme = (theme) => {
78691
78744
  };
78692
78745
  var useTheme = () => {
78693
78746
  const $2 = (0, import_compiler_runtime19.c)(5);
78694
- const [theme, setTheme] = (0, import_react15.useState)(_temp6);
78747
+ const [theme, setTheme] = (0, import_react15.useState)(_temp7);
78695
78748
  let t0;
78696
78749
  let t1;
78697
78750
  if ($2[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
@@ -78740,7 +78793,7 @@ var useTheme = () => {
78740
78793
  }
78741
78794
  return t3;
78742
78795
  };
78743
- function _temp6() {
78796
+ function _temp7() {
78744
78797
  return document.documentElement.classList.contains("dark") ? "dark" : "light";
78745
78798
  }
78746
78799
  function _temp23() {
@@ -79137,14 +79190,14 @@ var Footer = () => {
79137
79190
  }
79138
79191
  return t5;
79139
79192
  };
79140
- function _temp7() {
79193
+ function _temp8() {
79141
79194
  }
79142
79195
  function _temp24() {
79143
79196
  }
79144
79197
  function _temp34(value) {
79145
79198
  chrome.storage.local.set({
79146
79199
  [SERVER_PORT_KEY]: value
79147
- }).catch(_temp7);
79200
+ }).catch(_temp8);
79148
79201
  const message = {
79149
79202
  type: "port-changed",
79150
79203
  port: value
@@ -79427,6 +79480,101 @@ var import_react20 = __toESM(require_react(), 1);
79427
79480
  var import_compiler_runtime23 = __toESM(require_compiler_runtime(), 1);
79428
79481
  var import_react19 = __toESM(require_react(), 1);
79429
79482
  var import_jsx_runtime49 = __toESM(require_jsx_runtime(), 1);
79483
+ var VersionItem = (t0) => {
79484
+ const $2 = (0, import_compiler_runtime23.c)(15);
79485
+ const {
79486
+ plugin
79487
+ } = t0;
79488
+ if (plugin.source === "npm") {
79489
+ let t12;
79490
+ if ($2[0] !== plugin.name) {
79491
+ t12 = () => window.open(`https://www.npmjs.com/package/${plugin.name}`, "_blank");
79492
+ $2[0] = plugin.name;
79493
+ $2[1] = t12;
79494
+ } else {
79495
+ t12 = $2[1];
79496
+ }
79497
+ let t22;
79498
+ if ($2[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
79499
+ t22 = /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Package, {
79500
+ className: "h-3.5 w-3.5"
79501
+ });
79502
+ $2[2] = t22;
79503
+ } else {
79504
+ t22 = $2[2];
79505
+ }
79506
+ let t3;
79507
+ if ($2[3] !== plugin.version || $2[4] !== t12) {
79508
+ t3 = /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(MenuObject.Item, {
79509
+ onSelect: t12,
79510
+ children: [t22, "v", plugin.version]
79511
+ });
79512
+ $2[3] = plugin.version;
79513
+ $2[4] = t12;
79514
+ $2[5] = t3;
79515
+ } else {
79516
+ t3 = $2[5];
79517
+ }
79518
+ return t3;
79519
+ }
79520
+ const {
79521
+ sourcePath
79522
+ } = plugin;
79523
+ if (sourcePath) {
79524
+ let t12;
79525
+ if ($2[6] !== sourcePath) {
79526
+ t12 = () => void openFolder(sourcePath);
79527
+ $2[6] = sourcePath;
79528
+ $2[7] = t12;
79529
+ } else {
79530
+ t12 = $2[7];
79531
+ }
79532
+ let t22;
79533
+ if ($2[8] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
79534
+ t22 = /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(FolderOpen, {
79535
+ className: "h-3.5 w-3.5"
79536
+ });
79537
+ $2[8] = t22;
79538
+ } else {
79539
+ t22 = $2[8];
79540
+ }
79541
+ let t3;
79542
+ if ($2[9] !== plugin.version || $2[10] !== t12) {
79543
+ t3 = /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(MenuObject.Item, {
79544
+ onSelect: t12,
79545
+ children: [t22, "v", plugin.version]
79546
+ });
79547
+ $2[9] = plugin.version;
79548
+ $2[10] = t12;
79549
+ $2[11] = t3;
79550
+ } else {
79551
+ t3 = $2[11];
79552
+ }
79553
+ return t3;
79554
+ }
79555
+ let t1;
79556
+ if ($2[12] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
79557
+ t1 = /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(FolderOpen, {
79558
+ className: "h-3.5 w-3.5"
79559
+ });
79560
+ $2[12] = t1;
79561
+ } else {
79562
+ t1 = $2[12];
79563
+ }
79564
+ let t2;
79565
+ if ($2[13] !== plugin.version) {
79566
+ t2 = /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(MenuObject.Item, {
79567
+ disabled: true,
79568
+ className: "text-muted-foreground",
79569
+ children: [t1, "v", plugin.version]
79570
+ });
79571
+ $2[13] = plugin.version;
79572
+ $2[14] = t2;
79573
+ } else {
79574
+ t2 = $2[14];
79575
+ }
79576
+ return t2;
79577
+ };
79430
79578
  var PluginMenu = (t0) => {
79431
79579
  const $2 = (0, import_compiler_runtime23.c)(57);
79432
79580
  const {
@@ -79492,8 +79640,18 @@ var PluginMenu = (t0) => {
79492
79640
  t5 = $2[8];
79493
79641
  }
79494
79642
  let t6;
79495
- if ($2[9] !== onUpdate || $2[10] !== plugin.update || $2[11] !== updating) {
79496
- t6 = plugin.update && /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(MenuObject.Item, {
79643
+ if ($2[9] !== plugin) {
79644
+ t6 = /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(VersionItem, {
79645
+ plugin
79646
+ });
79647
+ $2[9] = plugin;
79648
+ $2[10] = t6;
79649
+ } else {
79650
+ t6 = $2[10];
79651
+ }
79652
+ let t7;
79653
+ if ($2[11] !== onUpdate || $2[12] !== plugin.update || $2[13] !== updating) {
79654
+ t7 = plugin.update && /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(MenuObject.Item, {
79497
79655
  onClick: onUpdate,
79498
79656
  children: [updating ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Loader2, {
79499
79657
  size: "sm"
@@ -79501,17 +79659,9 @@ var PluginMenu = (t0) => {
79501
79659
  className: "h-3.5 w-3.5"
79502
79660
  }), "Update to v", plugin.update.latestVersion]
79503
79661
  });
79504
- $2[9] = onUpdate;
79505
- $2[10] = plugin.update;
79506
- $2[11] = updating;
79507
- $2[12] = t6;
79508
- } else {
79509
- t6 = $2[12];
79510
- }
79511
- let t7;
79512
- if ($2[13] !== plugin.update) {
79513
- t7 = plugin.update && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(MenuObject.Separator, {});
79514
- $2[13] = plugin.update;
79662
+ $2[11] = onUpdate;
79663
+ $2[12] = plugin.update;
79664
+ $2[13] = updating;
79515
79665
  $2[14] = t7;
79516
79666
  } else {
79517
79667
  t7 = $2[14];
@@ -79539,7 +79689,8 @@ var PluginMenu = (t0) => {
79539
79689
  if ($2[18] !== removeLabel || $2[19] !== t9) {
79540
79690
  t10 = /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(MenuObject.Item, {
79541
79691
  onSelect: t8,
79542
- className: "text-destructive focus:bg-destructive/10 focus:text-destructive data-[highlighted]:bg-destructive/10 data-[highlighted]:text-destructive",
79692
+ variant: "destructive",
79693
+ className: "border-border border-t",
79543
79694
  children: [t9, removeLabel]
79544
79695
  });
79545
79696
  $2[18] = removeLabel;
@@ -79699,7 +79850,7 @@ var PluginMenu = (t0) => {
79699
79850
  if ($2[53] !== className || $2[54] !== t12 || $2[55] !== t22) {
79700
79851
  t23 = /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", {
79701
79852
  className,
79702
- onClick: _temp8,
79853
+ onClick: _temp9,
79703
79854
  onKeyDown: _temp25,
79704
79855
  role: "presentation",
79705
79856
  children: [t12, t22]
@@ -79714,7 +79865,7 @@ var PluginMenu = (t0) => {
79714
79865
  return t23;
79715
79866
  };
79716
79867
  PluginMenu.displayName = "PluginMenu";
79717
- function _temp8(e2) {
79868
+ function _temp9(e2) {
79718
79869
  return e2.stopPropagation();
79719
79870
  }
79720
79871
  function _temp25(e_0) {
@@ -79798,7 +79949,7 @@ Badge2.displayName = "Badge";
79798
79949
  // src/side-panel/components/PluginCard.tsx
79799
79950
  var import_jsx_runtime51 = __toESM(require_jsx_runtime(), 1);
79800
79951
  var PluginCard = (t0) => {
79801
- const $2 = (0, import_compiler_runtime25.c)(56);
79952
+ const $2 = (0, import_compiler_runtime25.c)(59);
79802
79953
  const {
79803
79954
  plugin,
79804
79955
  activeTools,
@@ -79893,10 +80044,10 @@ var PluginCard = (t0) => {
79893
80044
  const myVersion_0 = toggleCounter.current = toggleCounter.current + 1;
79894
80045
  updatePluginTools((prev_2) => {
79895
80046
  preToggleRef.current = prev_2;
79896
- return prev_2.map((t35) => t35.name === toolName ? {
79897
- ...t35,
80047
+ return prev_2.map((t37) => t37.name === toolName ? {
80048
+ ...t37,
79898
80049
  permission: newPermission_1
79899
- } : t35);
80050
+ } : t37);
79900
80051
  });
79901
80052
  setToolPermission(plugin.name, toolName, newPermission_1).catch(() => {
79902
80053
  if (toggleCounter.current === myVersion_0) {
@@ -79932,6 +80083,42 @@ var PluginCard = (t0) => {
79932
80083
  const hasActiveTool = pluginTools.some(t4);
79933
80084
  const toolGroups = groupTools(visibleTools);
79934
80085
  const inactive = plugin.tabState !== "ready";
80086
+ const tabCount = plugin.tabs?.length ?? 0;
80087
+ const hasHomepage = Boolean(plugin.homepage);
80088
+ const hasLastSeenUrl = Boolean(plugin.hasLastSeenUrl);
80089
+ const isClickable = tabCount > 0 || hasHomepage || hasLastSeenUrl;
80090
+ let t5;
80091
+ bb0: {
80092
+ if (!isClickable) {
80093
+ t5 = void 0;
80094
+ break bb0;
80095
+ }
80096
+ if (plugin.tabState === "closed") {
80097
+ if (hasHomepage) {
80098
+ t5 = `Open ${plugin.displayName} in new tab`;
80099
+ break bb0;
80100
+ }
80101
+ if (hasLastSeenUrl) {
80102
+ t5 = `Open ${plugin.displayName} (last visited)`;
80103
+ break bb0;
80104
+ }
80105
+ t5 = void 0;
80106
+ break bb0;
80107
+ }
80108
+ t5 = tabCount > 1 ? `Open ${plugin.displayName} (${tabCount} tabs)` : `Open ${plugin.displayName}`;
80109
+ }
80110
+ const tooltipText = t5;
80111
+ let t6;
80112
+ if ($2[8] !== plugin.name) {
80113
+ t6 = () => {
80114
+ openPluginTab(plugin.name);
80115
+ };
80116
+ $2[8] = plugin.name;
80117
+ $2[9] = t6;
80118
+ } else {
80119
+ t6 = $2[9];
80120
+ }
80121
+ const handleOpenTab = t6;
79935
80122
  const renderToolList = (tools) => tools.map((tool) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ToolRow, {
79936
80123
  name: tool.name,
79937
80124
  displayName: tool.displayName,
@@ -79943,33 +80130,23 @@ var PluginCard = (t0) => {
79943
80130
  muted: inactive,
79944
80131
  onPermissionChange: handleToolPermissionChange
79945
80132
  }, tool.name));
79946
- let t5;
79947
- if ($2[8] !== plugin.version) {
79948
- t5 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(TooltipObject.Content, {
79949
- children: ["v", plugin.version]
79950
- });
79951
- $2[8] = plugin.version;
79952
- $2[9] = t5;
79953
- } else {
79954
- t5 = $2[9];
79955
- }
79956
- const t6 = `flex min-w-0 flex-1 items-center gap-1.5 truncate font-head text-sm ${inactive ? "text-muted-foreground" : "text-foreground"}`;
79957
- let t7;
80133
+ const t7 = `flex min-w-0 flex-1 items-center gap-1.5 truncate font-head text-sm ${inactive ? "text-muted-foreground" : "text-foreground"}`;
80134
+ let t8;
79958
80135
  if ($2[10] !== plugin.source) {
79959
- t7 = plugin.source === "local" && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Badge2, {
80136
+ t8 = plugin.source === "local" && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Badge2, {
79960
80137
  variant: "default",
79961
80138
  size: "sm",
79962
80139
  className: "align-middle",
79963
80140
  children: "DEV"
79964
80141
  });
79965
80142
  $2[10] = plugin.source;
79966
- $2[11] = t7;
80143
+ $2[11] = t8;
79967
80144
  } else {
79968
- t7 = $2[11];
80145
+ t8 = $2[11];
79969
80146
  }
79970
- let t8;
80147
+ let t9;
79971
80148
  if ($2[12] !== plugin.reviewed) {
79972
- t8 = !plugin.reviewed && /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(TooltipObject, {
80149
+ t9 = !plugin.reviewed && /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(TooltipObject, {
79973
80150
  children: [/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(TooltipObject.Trigger, {
79974
80151
  asChild: true,
79975
80152
  children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ShieldQuestionMark, {
@@ -79980,91 +80157,103 @@ var PluginCard = (t0) => {
79980
80157
  })]
79981
80158
  });
79982
80159
  $2[12] = plugin.reviewed;
79983
- $2[13] = t8;
80160
+ $2[13] = t9;
79984
80161
  } else {
79985
- t8 = $2[13];
80162
+ t9 = $2[13];
79986
80163
  }
79987
- let t9;
79988
- if ($2[14] !== plugin.displayName || $2[15] !== t6 || $2[16] !== t7 || $2[17] !== t8) {
79989
- t9 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", {
79990
- className: t6,
79991
- children: [plugin.displayName, t7, t8]
80164
+ let t10;
80165
+ if ($2[14] !== plugin.displayName || $2[15] !== t7 || $2[16] !== t8 || $2[17] !== t9) {
80166
+ t10 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", {
80167
+ className: t7,
80168
+ children: [plugin.displayName, t8, t9]
79992
80169
  });
79993
80170
  $2[14] = plugin.displayName;
79994
- $2[15] = t6;
79995
- $2[16] = t7;
79996
- $2[17] = t8;
79997
- $2[18] = t9;
80171
+ $2[15] = t7;
80172
+ $2[16] = t8;
80173
+ $2[17] = t9;
80174
+ $2[18] = t10;
79998
80175
  } else {
79999
- t9 = $2[18];
80176
+ t10 = $2[18];
80000
80177
  }
80001
- const t10 = `h-4 w-4 shrink-0 transition-transform duration-200 ${inactive ? "text-muted-foreground" : ""}`;
80002
- let t11;
80003
- if ($2[19] !== t10) {
80004
- t11 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ChevronDown, {
80005
- className: t10
80178
+ const t11 = `h-4 w-4 shrink-0 transition-transform duration-200 ${inactive ? "text-muted-foreground" : ""}`;
80179
+ let t12;
80180
+ if ($2[19] !== t11) {
80181
+ t12 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ChevronDown, {
80182
+ className: t11
80006
80183
  });
80007
- $2[19] = t10;
80008
- $2[20] = t11;
80184
+ $2[19] = t11;
80185
+ $2[20] = t12;
80009
80186
  } else {
80010
- t11 = $2[20];
80187
+ t12 = $2[20];
80011
80188
  }
80012
- const t12 = onUpdate ?? _temp9;
80013
- const t13 = onRemove ?? _temp26;
80014
- const t14 = updatingPlugin ?? false;
80015
- const t15 = removingPlugin ?? false;
80016
- let t16;
80017
- if ($2[21] !== inactive || $2[22] !== plugin || $2[23] !== t12 || $2[24] !== t13 || $2[25] !== t14 || $2[26] !== t15) {
80018
- t16 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(PluginMenu, {
80189
+ let t13;
80190
+ if ($2[21] !== t10 || $2[22] !== t12) {
80191
+ t13 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(Trigger2, {
80192
+ className: "focus-ring flex min-w-0 flex-1 cursor-pointer items-center gap-2 py-2 pr-0 pl-2 [&[data-state=open]>svg]:rotate-180",
80193
+ children: [t10, t12]
80194
+ });
80195
+ $2[21] = t10;
80196
+ $2[22] = t12;
80197
+ $2[23] = t13;
80198
+ } else {
80199
+ t13 = $2[23];
80200
+ }
80201
+ const t14 = onUpdate ?? _temp10;
80202
+ const t15 = onRemove ?? _temp26;
80203
+ const t16 = updatingPlugin ?? false;
80204
+ const t17 = removingPlugin ?? false;
80205
+ let t18;
80206
+ if ($2[24] !== inactive || $2[25] !== plugin || $2[26] !== t14 || $2[27] !== t15 || $2[28] !== t16 || $2[29] !== t17) {
80207
+ t18 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(PluginMenu, {
80019
80208
  plugin,
80020
- onUpdate: t12,
80021
- onRemove: t13,
80022
- updating: t14,
80023
- removing: t15,
80209
+ onUpdate: t14,
80210
+ onRemove: t15,
80211
+ updating: t16,
80212
+ removing: t17,
80024
80213
  muted: inactive,
80025
80214
  className: "flex shrink-0 items-center px-1"
80026
80215
  });
80027
- $2[21] = inactive;
80028
- $2[22] = plugin;
80029
- $2[23] = t12;
80030
- $2[24] = t13;
80031
- $2[25] = t14;
80032
- $2[26] = t15;
80033
- $2[27] = t16;
80216
+ $2[24] = inactive;
80217
+ $2[25] = plugin;
80218
+ $2[26] = t14;
80219
+ $2[27] = t15;
80220
+ $2[28] = t16;
80221
+ $2[29] = t17;
80222
+ $2[30] = t18;
80034
80223
  } else {
80035
- t16 = $2[27];
80224
+ t18 = $2[30];
80036
80225
  }
80037
- let t17;
80038
- if ($2[28] !== toggleError) {
80039
- t17 = toggleError && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(AlertComponent, {
80226
+ let t19;
80227
+ if ($2[31] !== toggleError) {
80228
+ t19 = toggleError && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(AlertComponent, {
80040
80229
  status: "error",
80041
80230
  className: "mx-3 mb-1 px-2 py-1 text-xs",
80042
80231
  children: toggleError
80043
80232
  });
80044
- $2[28] = toggleError;
80045
- $2[29] = t17;
80233
+ $2[31] = toggleError;
80234
+ $2[32] = t19;
80046
80235
  } else {
80047
- t17 = $2[29];
80236
+ t19 = $2[32];
80048
80237
  }
80049
- let t18;
80050
- if ($2[30] !== actionError) {
80051
- t18 = actionError && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(AlertComponent, {
80238
+ let t20;
80239
+ if ($2[33] !== actionError) {
80240
+ t20 = actionError && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(AlertComponent, {
80052
80241
  status: "error",
80053
80242
  className: "mx-3 mb-1 px-2 py-1 text-xs",
80054
80243
  children: actionError
80055
80244
  });
80056
- $2[30] = actionError;
80057
- $2[31] = t18;
80245
+ $2[33] = actionError;
80246
+ $2[34] = t20;
80058
80247
  } else {
80059
- t18 = $2[31];
80248
+ t20 = $2[34];
80060
80249
  }
80061
- const t19 = AccordionComponent;
80062
- const t20 = "border-border border-t";
80063
- const t21 = toolFilter && /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", {
80250
+ const t21 = AccordionComponent;
80251
+ const t22 = "border-border border-t";
80252
+ const t23 = toolFilter && /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", {
80064
80253
  className: "mb-1 px-3 pt-2 text-muted-foreground text-xs",
80065
80254
  children: [visibleTools.length, " of ", pluginTools.length, " tools"]
80066
80255
  });
80067
- const t22 = toolGroups !== null ? toolGroups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", {
80256
+ const t24 = toolGroups !== null ? toolGroups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", {
80068
80257
  className: "[&:not(:first-child)]:mt-2",
80069
80258
  children: [/* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", {
80070
80259
  className: "border-border border-b border-l-2 border-l-primary bg-muted/30 px-3 py-1",
@@ -80074,83 +80263,83 @@ var PluginCard = (t0) => {
80074
80263
  })
80075
80264
  }), renderToolList(group.tools)]
80076
80265
  }, group.name)) : renderToolList(visibleTools);
80077
- let t23;
80078
- if ($2[32] !== t19.Content || $2[33] !== t21 || $2[34] !== t22) {
80079
- t23 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(t19.Content, {
80080
- className: t20,
80081
- children: [t21, t22]
80266
+ let t25;
80267
+ if ($2[35] !== t21.Content || $2[36] !== t23 || $2[37] !== t24) {
80268
+ t25 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(t21.Content, {
80269
+ className: t22,
80270
+ children: [t23, t24]
80082
80271
  });
80083
- $2[32] = t19.Content;
80084
- $2[33] = t21;
80085
- $2[34] = t22;
80086
- $2[35] = t23;
80272
+ $2[35] = t21.Content;
80273
+ $2[36] = t23;
80274
+ $2[37] = t24;
80275
+ $2[38] = t25;
80087
80276
  } else {
80088
- t23 = $2[35];
80277
+ t25 = $2[38];
80089
80278
  }
80090
- const t24 = pendingChange !== null;
80091
- let t25;
80092
- if ($2[36] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
80093
- t25 = (open) => !open && setPendingChange(null);
80094
- $2[36] = t25;
80279
+ const t26 = pendingChange !== null;
80280
+ let t27;
80281
+ if ($2[39] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
80282
+ t27 = (open) => !open && setPendingChange(null);
80283
+ $2[39] = t27;
80095
80284
  } else {
80096
- t25 = $2[36];
80285
+ t27 = $2[39];
80097
80286
  }
80098
- let t26;
80099
- if ($2[37] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
80100
- t26 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(DialogObject.Header, {
80287
+ let t28;
80288
+ if ($2[40] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
80289
+ t28 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(DialogObject.Header, {
80101
80290
  children: "Unreviewed Plugin"
80102
80291
  });
80103
- $2[37] = t26;
80292
+ $2[40] = t28;
80104
80293
  } else {
80105
- t26 = $2[37];
80294
+ t28 = $2[40];
80106
80295
  }
80107
- let t27;
80108
- if ($2[38] !== plugin.displayName || $2[39] !== plugin.version) {
80109
- t27 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("p", {
80296
+ let t29;
80297
+ if ($2[41] !== plugin.displayName || $2[42] !== plugin.version) {
80298
+ t29 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("p", {
80110
80299
  className: "font-mono text-foreground text-sm",
80111
80300
  children: [plugin.displayName, " v", plugin.version]
80112
80301
  });
80113
- $2[38] = plugin.displayName;
80114
- $2[39] = plugin.version;
80115
- $2[40] = t27;
80302
+ $2[41] = plugin.displayName;
80303
+ $2[42] = plugin.version;
80304
+ $2[43] = t29;
80116
80305
  } else {
80117
- t27 = $2[40];
80306
+ t29 = $2[43];
80118
80307
  }
80119
- let t28;
80120
- if ($2[41] !== plugin.name) {
80121
- t28 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("p", {
80308
+ let t30;
80309
+ if ($2[44] !== plugin.name) {
80310
+ t30 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("p", {
80122
80311
  className: "mt-2 text-foreground text-sm",
80123
80312
  children: ["This plugin version has not been reviewed. You can ask your AI agent to review the adapter code by saying \u201Creview the ", plugin.name, " plugin\u201D in your chat."]
80124
80313
  });
80125
- $2[41] = plugin.name;
80126
- $2[42] = t28;
80314
+ $2[44] = plugin.name;
80315
+ $2[45] = t30;
80127
80316
  } else {
80128
- t28 = $2[42];
80317
+ t30 = $2[45];
80129
80318
  }
80130
- let t29;
80131
- if ($2[43] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
80132
- t29 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("p", {
80319
+ let t31;
80320
+ if ($2[46] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
80321
+ t31 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("p", {
80133
80322
  className: "mt-2 text-muted-foreground text-xs",
80134
80323
  children: "You can also enable it now without review."
80135
80324
  });
80136
- $2[43] = t29;
80325
+ $2[46] = t31;
80137
80326
  } else {
80138
- t29 = $2[43];
80327
+ t31 = $2[46];
80139
80328
  }
80140
- let t30;
80141
- if ($2[44] !== t27 || $2[45] !== t28) {
80142
- t30 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(DialogObject.Body, {
80143
- children: [t27, t28, t29]
80329
+ let t32;
80330
+ if ($2[47] !== t29 || $2[48] !== t30) {
80331
+ t32 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(DialogObject.Body, {
80332
+ children: [t29, t30, t31]
80144
80333
  });
80145
- $2[44] = t27;
80146
- $2[45] = t28;
80147
- $2[46] = t30;
80334
+ $2[47] = t29;
80335
+ $2[48] = t30;
80336
+ $2[49] = t32;
80148
80337
  } else {
80149
- t30 = $2[46];
80338
+ t32 = $2[49];
80150
80339
  }
80151
- let t31;
80152
- if ($2[47] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
80153
- t31 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(DialogObject.Close, {
80340
+ let t33;
80341
+ if ($2[50] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
80342
+ t33 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(DialogObject.Close, {
80154
80343
  asChild: true,
80155
80344
  children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Button, {
80156
80345
  size: "sm",
@@ -80158,75 +80347,92 @@ var PluginCard = (t0) => {
80158
80347
  children: "Cancel"
80159
80348
  })
80160
80349
  });
80161
- $2[47] = t31;
80350
+ $2[50] = t33;
80162
80351
  } else {
80163
- t31 = $2[47];
80352
+ t33 = $2[50];
80164
80353
  }
80165
- let t32;
80166
- if ($2[48] !== handleEnableAnyway) {
80167
- t32 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(DialogObject.Footer, {
80168
- children: [t31, /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Button, {
80354
+ let t34;
80355
+ if ($2[51] !== handleEnableAnyway) {
80356
+ t34 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(DialogObject.Footer, {
80357
+ children: [t33, /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Button, {
80169
80358
  size: "sm",
80170
80359
  onClick: handleEnableAnyway,
80171
80360
  children: "Enable Anyway"
80172
80361
  })]
80173
80362
  });
80174
- $2[48] = handleEnableAnyway;
80175
- $2[49] = t32;
80363
+ $2[51] = handleEnableAnyway;
80364
+ $2[52] = t34;
80176
80365
  } else {
80177
- t32 = $2[49];
80366
+ t34 = $2[52];
80178
80367
  }
80179
- let t33;
80180
- if ($2[50] !== t30 || $2[51] !== t32) {
80181
- t33 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(DialogObject.Content, {
80368
+ let t35;
80369
+ if ($2[53] !== t32 || $2[54] !== t34) {
80370
+ t35 = /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(DialogObject.Content, {
80182
80371
  onInteractOutside: _temp35,
80183
- children: [t26, t30, t32]
80372
+ children: [t28, t32, t34]
80184
80373
  });
80185
- $2[50] = t30;
80186
- $2[51] = t32;
80187
- $2[52] = t33;
80374
+ $2[53] = t32;
80375
+ $2[54] = t34;
80376
+ $2[55] = t35;
80188
80377
  } else {
80189
- t33 = $2[52];
80378
+ t35 = $2[55];
80190
80379
  }
80191
- let t34;
80192
- if ($2[53] !== t24 || $2[54] !== t33) {
80193
- t34 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(DialogObject, {
80194
- open: t24,
80195
- onOpenChange: t25,
80196
- children: t33
80380
+ let t36;
80381
+ if ($2[56] !== t26 || $2[57] !== t35) {
80382
+ t36 = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(DialogObject, {
80383
+ open: t26,
80384
+ onOpenChange: t27,
80385
+ children: t35
80197
80386
  });
80198
- $2[53] = t24;
80199
- $2[54] = t33;
80200
- $2[55] = t34;
80387
+ $2[56] = t26;
80388
+ $2[57] = t35;
80389
+ $2[58] = t36;
80201
80390
  } else {
80202
- t34 = $2[55];
80391
+ t36 = $2[58];
80203
80392
  }
80204
80393
  return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(AccordionComponent.Item, {
80205
80394
  value: plugin.name,
80206
80395
  className: transitionClass ?? (removingPlugin ? "pointer-events-none opacity-60 transition-opacity" : inactive ? "opacity-70 transition-opacity" : void 0),
80207
80396
  children: [/* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(Header, {
80208
80397
  className: "flex",
80209
- children: [/* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(Trigger2, {
80210
- className: "focus-ring flex min-w-0 flex-1 cursor-pointer items-center gap-2 px-3 py-2 [&[data-state=open]>svg]:rotate-180",
80211
- children: [/* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(TooltipObject, {
80212
- children: [/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(TooltipObject.Trigger, {
80213
- asChild: true,
80214
- children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", {
80215
- children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(PluginIcon, {
80216
- pluginName: plugin.name,
80217
- displayName: plugin.displayName,
80218
- tabState: plugin.tabState,
80219
- size: 32,
80220
- iconSvg: plugin.iconSvg,
80221
- iconInactiveSvg: plugin.iconInactiveSvg,
80222
- iconDarkSvg: plugin.iconDarkSvg,
80223
- iconDarkInactiveSvg: plugin.iconDarkInactiveSvg,
80224
- active: hasActiveTool
80225
- })
80398
+ children: [tooltipText ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(TooltipObject, {
80399
+ children: [/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(TooltipObject.Trigger, {
80400
+ asChild: true,
80401
+ children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("button", {
80402
+ type: "button",
80403
+ className: "focus-ring flex shrink-0 cursor-pointer items-center py-2 pl-3",
80404
+ onClick: handleOpenTab,
80405
+ "aria-label": tooltipText,
80406
+ children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(PluginIcon, {
80407
+ pluginName: plugin.name,
80408
+ displayName: plugin.displayName,
80409
+ tabState: plugin.tabState,
80410
+ size: 32,
80411
+ iconSvg: plugin.iconSvg,
80412
+ iconInactiveSvg: plugin.iconInactiveSvg,
80413
+ iconDarkSvg: plugin.iconDarkSvg,
80414
+ iconDarkInactiveSvg: plugin.iconDarkInactiveSvg,
80415
+ active: hasActiveTool,
80416
+ className: "transition-transform hover:scale-105"
80226
80417
  })
80227
- }), t5]
80228
- }), t9, t11]
80229
- }), t16, /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", {
80418
+ })
80419
+ }), /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(TooltipObject.Content, {
80420
+ children: tooltipText
80421
+ })]
80422
+ }) : /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", {
80423
+ className: "flex shrink-0 items-center py-2 pl-3",
80424
+ children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(PluginIcon, {
80425
+ pluginName: plugin.name,
80426
+ displayName: plugin.displayName,
80427
+ tabState: plugin.tabState,
80428
+ size: 32,
80429
+ iconSvg: plugin.iconSvg,
80430
+ iconInactiveSvg: plugin.iconInactiveSvg,
80431
+ iconDarkSvg: plugin.iconDarkSvg,
80432
+ iconDarkInactiveSvg: plugin.iconDarkInactiveSvg,
80433
+ active: hasActiveTool
80434
+ })
80435
+ }), t13, t18, /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", {
80230
80436
  className: "flex shrink-0 items-center px-3",
80231
80437
  children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(PermissionSelect, {
80232
80438
  value: plugin.permission,
@@ -80236,10 +80442,10 @@ var PluginCard = (t0) => {
80236
80442
  ariaLabel: `Permission for ${plugin.name} plugin`
80237
80443
  })
80238
80444
  })]
80239
- }), t17, t18, t23, t34]
80445
+ }), t19, t20, t25, t36]
80240
80446
  });
80241
80447
  };
80242
- function _temp9() {
80448
+ function _temp10() {
80243
80449
  }
80244
80450
  function _temp26() {
80245
80451
  }
@@ -80438,7 +80644,7 @@ var PluginList = (t0) => {
80438
80644
  openReady,
80439
80645
  openNotReady
80440
80646
  }
80441
- }).catch(_temp10);
80647
+ }).catch(_temp11);
80442
80648
  }, [openReady, openNotReady, filterLower]);
80443
80649
  let t5;
80444
80650
  let t6;
@@ -80632,7 +80838,7 @@ var PluginList = (t0) => {
80632
80838
  }
80633
80839
  return t10;
80634
80840
  };
80635
- function _temp10() {
80841
+ function _temp11() {
80636
80842
  }
80637
80843
 
80638
80844
  // src/side-panel/components/retro/Input.tsx
@@ -80750,7 +80956,7 @@ var NpmPluginCard = (t0) => {
80750
80956
  target: "_blank",
80751
80957
  rel: "noopener noreferrer",
80752
80958
  className: "truncate font-head text-foreground text-sm hover:underline",
80753
- onClick: _temp11,
80959
+ onClick: _temp12,
80754
80960
  children: displayName
80755
80961
  });
80756
80962
  $2[5] = displayName;
@@ -80885,7 +81091,7 @@ var NpmPluginCard = (t0) => {
80885
81091
  return t14;
80886
81092
  };
80887
81093
  NpmPluginCard.displayName = "NpmPluginCard";
80888
- function _temp11(e2) {
81094
+ function _temp12(e2) {
80889
81095
  return e2.stopPropagation();
80890
81096
  }
80891
81097
 
@@ -80911,7 +81117,7 @@ var SectionHeader = (t0) => {
80911
81117
  };
80912
81118
  var matchesBrowserTool = (tool, filterLower) => toDisplayName(tool.name).toLowerCase().includes(filterLower) || tool.name.toLowerCase().includes(filterLower) || tool.description.toLowerCase().includes(filterLower);
80913
81119
  var SearchResults = (t0) => {
80914
- const $2 = (0, import_compiler_runtime29.c)(62);
81120
+ const $2 = (0, import_compiler_runtime29.c)(61);
80915
81121
  const {
80916
81122
  plugins,
80917
81123
  failedPlugins,
@@ -80958,7 +81164,7 @@ var SearchResults = (t0) => {
80958
81164
  const hasBrowserToolMatches = t2;
80959
81165
  let t3;
80960
81166
  if ($2[7] !== plugins) {
80961
- t3 = new Set(plugins.map(_temp12));
81167
+ t3 = new Set(plugins.map(_temp13));
80962
81168
  $2[7] = plugins;
80963
81169
  $2[8] = t3;
80964
81170
  } else {
@@ -81090,45 +81296,44 @@ var SearchResults = (t0) => {
81090
81296
  t6 = $2[34];
81091
81297
  }
81092
81298
  let t7;
81093
- if ($2[54] !== showNoResults || $2[55] !== toolFilter) {
81299
+ if ($2[54] !== showNoResults) {
81094
81300
  t7 = showNoResults && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(EmptyComponent, {
81095
81301
  className: "border-muted",
81096
81302
  children: /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(EmptyComponent.Content, {
81097
81303
  children: [/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(EmptyComponent.Icon, {
81098
81304
  className: "h-10 w-10 text-muted-foreground"
81099
- }), /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(EmptyComponent.Title, {
81305
+ }), /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(EmptyComponent.Title, {
81100
81306
  className: "text-base",
81101
- children: ["No results for \u201C", toolFilter, "\u201D"]
81307
+ children: "No plugins found"
81102
81308
  }), /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(EmptyComponent.Separator, {}), /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(EmptyComponent.Description, {
81103
81309
  className: "text-xs",
81104
- children: "Try searching by plugin name, tool name, or description."
81310
+ children: "Can\u2019t find what you\u2019re looking for? Ask your AI assistant to build a custom plugin for you \u2014 it only takes a minute."
81105
81311
  })]
81106
81312
  })
81107
81313
  });
81108
81314
  $2[54] = showNoResults;
81109
- $2[55] = toolFilter;
81110
- $2[56] = t7;
81315
+ $2[55] = t7;
81111
81316
  } else {
81112
- t7 = $2[56];
81317
+ t7 = $2[55];
81113
81318
  }
81114
81319
  let t8;
81115
- if ($2[57] !== t4 || $2[58] !== t5 || $2[59] !== t6 || $2[60] !== t7) {
81320
+ if ($2[56] !== t4 || $2[57] !== t5 || $2[58] !== t6 || $2[59] !== t7) {
81116
81321
  t8 = /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", {
81117
81322
  className: t4,
81118
81323
  children: [t5, t6, t7]
81119
81324
  });
81120
- $2[57] = t4;
81121
- $2[58] = t5;
81122
- $2[59] = t6;
81123
- $2[60] = t7;
81124
- $2[61] = t8;
81325
+ $2[56] = t4;
81326
+ $2[57] = t5;
81327
+ $2[58] = t6;
81328
+ $2[59] = t7;
81329
+ $2[60] = t8;
81125
81330
  } else {
81126
- t8 = $2[61];
81331
+ t8 = $2[60];
81127
81332
  }
81128
81333
  return t8;
81129
81334
  };
81130
81335
  SearchResults.displayName = "SearchResults";
81131
- function _temp12(p_1) {
81336
+ function _temp13(p_1) {
81132
81337
  return extractShortName(p_1.name);
81133
81338
  }
81134
81339
 
@@ -81262,7 +81467,7 @@ var useServerNotifications = (t0) => {
81262
81467
  // src/side-panel/App.tsx
81263
81468
  var import_jsx_runtime56 = __toESM(require_jsx_runtime(), 1);
81264
81469
  var App = () => {
81265
- const $2 = (0, import_compiler_runtime31.c)(73);
81470
+ const $2 = (0, import_compiler_runtime31.c)(74);
81266
81471
  const [connected, setConnected] = (0, import_react23.useState)(false);
81267
81472
  const [disconnectReason, setDisconnectReason] = (0, import_react23.useState)();
81268
81473
  let t0;
@@ -81285,6 +81490,7 @@ var App = () => {
81285
81490
  const [browserPermission, setBrowserPermission] = (0, import_react23.useState)("off");
81286
81491
  const [skipPermissions, setSkipPermissions2] = (0, import_react23.useState)(false);
81287
81492
  const [serverVersion, setServerVersion] = (0, import_react23.useState)(void 0);
81493
+ const [serverSourcePath, setServerSourcePath] = (0, import_react23.useState)(void 0);
81288
81494
  const [loading, setLoading] = (0, import_react23.useState)(true);
81289
81495
  let t2;
81290
81496
  if ($2[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
@@ -81635,6 +81841,7 @@ var App = () => {
81635
81841
  setBrowserPermission(result_1.browserPermission ?? "off");
81636
81842
  setSkipPermissions2(result_1.skipPermissions ?? false);
81637
81843
  setServerVersion(result_1.serverVersion);
81844
+ setServerSourcePath(result_1.serverSourcePath);
81638
81845
  setActiveTools((prev_13) => {
81639
81846
  const next_8 = /* @__PURE__ */ new Set();
81640
81847
  for (const key of prev_13) {
@@ -81691,6 +81898,7 @@ var App = () => {
81691
81898
  setBrowserPermission("off");
81692
81899
  setSkipPermissions2(false);
81693
81900
  setServerVersion(void 0);
81901
+ setServerSourcePath(void 0);
81694
81902
  setActiveTools(/* @__PURE__ */ new Set());
81695
81903
  setPendingConfirmations([]);
81696
81904
  setSearchQuery("");
@@ -81852,7 +82060,7 @@ var App = () => {
81852
82060
  }
81853
82061
  const t33 = `px-4 pb-4 ${showSearchBar ? "pt-2" : "pt-4"} ${showPlugins ? "" : "flex min-h-full items-center justify-center"}`;
81854
82062
  let t34;
81855
- if ($2[42] !== activeTools || $2[43] !== browserPermission || $2[44] !== browserTools || $2[45] !== browserToolsHydrated || $2[46] !== browserToolsOpen || $2[47] !== connected || $2[48] !== disconnectReason || $2[49] !== failedPlugins || $2[50] !== hasContent || $2[51] !== installErrors || $2[52] !== installingPlugins || $2[53] !== loading || $2[54] !== npmResults || $2[55] !== npmSearchError || $2[56] !== npmSearching || $2[57] !== pluginErrors || $2[58] !== plugins || $2[59] !== removingFailedPlugins || $2[60] !== removingPlugins || $2[61] !== searchQuery || $2[62] !== serverVersion) {
82063
+ if ($2[42] !== activeTools || $2[43] !== browserPermission || $2[44] !== browserTools || $2[45] !== browserToolsHydrated || $2[46] !== browserToolsOpen || $2[47] !== connected || $2[48] !== disconnectReason || $2[49] !== failedPlugins || $2[50] !== hasContent || $2[51] !== installErrors || $2[52] !== installingPlugins || $2[53] !== loading || $2[54] !== npmResults || $2[55] !== npmSearchError || $2[56] !== npmSearching || $2[57] !== pluginErrors || $2[58] !== plugins || $2[59] !== removingFailedPlugins || $2[60] !== removingPlugins || $2[61] !== searchQuery || $2[62] !== serverSourcePath || $2[63] !== serverVersion) {
81856
82064
  t34 = loading ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(LoadingState, {}) : !connected ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(DisconnectedState, {
81857
82065
  reason: disconnectReason
81858
82066
  }) : searchQuery ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(SearchResults, {
@@ -81893,6 +82101,7 @@ var App = () => {
81893
82101
  activeTools,
81894
82102
  onToolsChange: setBrowserTools,
81895
82103
  serverVersion,
82104
+ serverSourcePath,
81896
82105
  browserPermission,
81897
82106
  onBrowserPermissionChange: setBrowserPermission
81898
82107
  })
@@ -81915,7 +82124,7 @@ var App = () => {
81915
82124
  children: [/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(EmptyComponent.Icon, {
81916
82125
  className: "h-10 w-10 text-muted-foreground",
81917
82126
  children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Package, {
81918
- className: "h-full w-full"
82127
+ size: 40
81919
82128
  })
81920
82129
  }), /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(EmptyComponent.Title, {
81921
82130
  className: "text-base",
@@ -81947,13 +82156,14 @@ var App = () => {
81947
82156
  $2[59] = removingFailedPlugins;
81948
82157
  $2[60] = removingPlugins;
81949
82158
  $2[61] = searchQuery;
81950
- $2[62] = serverVersion;
81951
- $2[63] = t34;
82159
+ $2[62] = serverSourcePath;
82160
+ $2[63] = serverVersion;
82161
+ $2[64] = t34;
81952
82162
  } else {
81953
- t34 = $2[63];
82163
+ t34 = $2[64];
81954
82164
  }
81955
82165
  let t35;
81956
- if ($2[64] !== t33 || $2[65] !== t34) {
82166
+ if ($2[65] !== t33 || $2[66] !== t34) {
81957
82167
  t35 = /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(g2, {
81958
82168
  className: "flex-1",
81959
82169
  style: t31,
@@ -81963,45 +82173,45 @@ var App = () => {
81963
82173
  children: t34
81964
82174
  })
81965
82175
  });
81966
- $2[64] = t33;
81967
- $2[65] = t34;
81968
- $2[66] = t35;
82176
+ $2[65] = t33;
82177
+ $2[66] = t34;
82178
+ $2[67] = t35;
81969
82179
  } else {
81970
- t35 = $2[66];
82180
+ t35 = $2[67];
81971
82181
  }
81972
82182
  let t36;
81973
- if ($2[67] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
82183
+ if ($2[68] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
81974
82184
  t36 = /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Footer, {});
81975
- $2[67] = t36;
82185
+ $2[68] = t36;
81976
82186
  } else {
81977
- t36 = $2[67];
82187
+ t36 = $2[68];
81978
82188
  }
81979
82189
  let t37;
81980
- if ($2[68] !== t28 || $2[69] !== t29 || $2[70] !== t30 || $2[71] !== t35) {
82190
+ if ($2[69] !== t28 || $2[70] !== t29 || $2[71] !== t30 || $2[72] !== t35) {
81981
82191
  t37 = /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(TooltipObject.Provider, {
81982
82192
  children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", {
81983
82193
  className: "flex h-screen flex-col overflow-hidden text-foreground",
81984
82194
  children: [t28, t29, t30, t35, t36]
81985
82195
  })
81986
82196
  });
81987
- $2[68] = t28;
81988
- $2[69] = t29;
81989
- $2[70] = t30;
81990
- $2[71] = t35;
81991
- $2[72] = t37;
82197
+ $2[69] = t28;
82198
+ $2[70] = t29;
82199
+ $2[71] = t30;
82200
+ $2[72] = t35;
82201
+ $2[73] = t37;
81992
82202
  } else {
81993
- t37 = $2[72];
82203
+ t37 = $2[73];
81994
82204
  }
81995
82205
  return t37;
81996
82206
  };
81997
- function _temp13(t2) {
82207
+ function _temp14(t2) {
81998
82208
  return {
81999
82209
  ...t2,
82000
82210
  permission: "auto"
82001
82211
  };
82002
82212
  }
82003
82213
  function _temp27() {
82004
- return BROWSER_TOOLS_CATALOG.map(_temp13);
82214
+ return BROWSER_TOOLS_CATALOG.map(_temp14);
82005
82215
  }
82006
82216
  function _temp36(t_0) {
82007
82217
  return {