@opentabs-dev/browser-extension 0.0.34
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/background-log-state.d.ts +10 -0
- package/dist/background-log-state.d.ts.map +1 -0
- package/dist/background-log-state.js +11 -0
- package/dist/background-log-state.js.map +1 -0
- package/dist/background-message-handlers.d.ts +41 -0
- package/dist/background-message-handlers.d.ts.map +1 -0
- package/dist/background-message-handlers.js +214 -0
- package/dist/background-message-handlers.js.map +1 -0
- package/dist/background.d.ts +2 -0
- package/dist/background.d.ts.map +1 -0
- package/dist/background.js +3780 -0
- package/dist/background.js.map +1 -0
- package/dist/bg-log-state.d.ts +10 -0
- package/dist/bg-log-state.d.ts.map +1 -0
- package/dist/bg-log-state.js +11 -0
- package/dist/bg-log-state.js.map +1 -0
- package/dist/browser-commands/content-commands.d.ts +25 -0
- package/dist/browser-commands/content-commands.d.ts.map +1 -0
- package/dist/browser-commands/content-commands.js +166 -0
- package/dist/browser-commands/content-commands.js.map +1 -0
- package/dist/browser-commands/cookie-commands.d.ts +14 -0
- package/dist/browser-commands/cookie-commands.d.ts.map +1 -0
- package/dist/browser-commands/cookie-commands.js +99 -0
- package/dist/browser-commands/cookie-commands.js.map +1 -0
- package/dist/browser-commands/extension-commands.d.ts +12 -0
- package/dist/browser-commands/extension-commands.d.ts.map +1 -0
- package/dist/browser-commands/extension-commands.js +386 -0
- package/dist/browser-commands/extension-commands.js.map +1 -0
- package/dist/browser-commands/helpers.d.ts +35 -0
- package/dist/browser-commands/helpers.d.ts.map +1 -0
- package/dist/browser-commands/helpers.js +121 -0
- package/dist/browser-commands/helpers.js.map +1 -0
- package/dist/browser-commands/index.d.ts +11 -0
- package/dist/browser-commands/index.d.ts.map +1 -0
- package/dist/browser-commands/index.js +10 -0
- package/dist/browser-commands/index.js.map +1 -0
- package/dist/browser-commands/interaction-commands.d.ts +23 -0
- package/dist/browser-commands/interaction-commands.d.ts.map +1 -0
- package/dist/browser-commands/interaction-commands.js +353 -0
- package/dist/browser-commands/interaction-commands.js.map +1 -0
- package/dist/browser-commands/key-press-command.d.ts +2 -0
- package/dist/browser-commands/key-press-command.d.ts.map +1 -0
- package/dist/browser-commands/key-press-command.js +144 -0
- package/dist/browser-commands/key-press-command.js.map +1 -0
- package/dist/browser-commands/network-commands.d.ts +6 -0
- package/dist/browser-commands/network-commands.d.ts.map +1 -0
- package/dist/browser-commands/network-commands.js +69 -0
- package/dist/browser-commands/network-commands.js.map +1 -0
- package/dist/browser-commands/resource-commands.d.ts +37 -0
- package/dist/browser-commands/resource-commands.d.ts.map +1 -0
- package/dist/browser-commands/resource-commands.js +153 -0
- package/dist/browser-commands/resource-commands.js.map +1 -0
- package/dist/browser-commands/scroll-command.d.ts +2 -0
- package/dist/browser-commands/scroll-command.d.ts.map +1 -0
- package/dist/browser-commands/scroll-command.js +133 -0
- package/dist/browser-commands/scroll-command.js.map +1 -0
- package/dist/browser-commands/tab-commands.d.ts +33 -0
- package/dist/browser-commands/tab-commands.d.ts.map +1 -0
- package/dist/browser-commands/tab-commands.js +121 -0
- package/dist/browser-commands/tab-commands.js.map +1 -0
- package/dist/browser-commands.d.ts +36 -0
- package/dist/browser-commands.d.ts.map +1 -0
- package/dist/browser-commands.js +1931 -0
- package/dist/browser-commands.js.map +1 -0
- package/dist/confirmation-badge.d.ts +17 -0
- package/dist/confirmation-badge.d.ts.map +1 -0
- package/dist/confirmation-badge.js +64 -0
- package/dist/confirmation-badge.js.map +1 -0
- package/dist/constants.d.ts +79 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +79 -0
- package/dist/constants.js.map +1 -0
- package/dist/dispatch-helpers.d.ts +61 -0
- package/dist/dispatch-helpers.d.ts.map +1 -0
- package/dist/dispatch-helpers.js +149 -0
- package/dist/dispatch-helpers.js.map +1 -0
- package/dist/extension-messages.d.ts +146 -0
- package/dist/extension-messages.d.ts.map +1 -0
- package/dist/extension-messages.js +2 -0
- package/dist/extension-messages.js.map +1 -0
- package/dist/iife-injection.d.ts +55 -0
- package/dist/iife-injection.d.ts.map +1 -0
- package/dist/iife-injection.js +474 -0
- package/dist/iife-injection.js.map +1 -0
- package/dist/json-rpc-errors.d.ts +8 -0
- package/dist/json-rpc-errors.d.ts.map +1 -0
- package/dist/json-rpc-errors.js +8 -0
- package/dist/json-rpc-errors.js.map +1 -0
- package/dist/known-methods.d.ts +19 -0
- package/dist/known-methods.d.ts.map +1 -0
- package/dist/known-methods.js +68 -0
- package/dist/known-methods.js.map +1 -0
- package/dist/log-collector.d.ts +45 -0
- package/dist/log-collector.d.ts.map +1 -0
- package/dist/log-collector.js +99 -0
- package/dist/log-collector.js.map +1 -0
- package/dist/message-router.d.ts +28 -0
- package/dist/message-router.d.ts.map +1 -0
- package/dist/message-router.js +367 -0
- package/dist/message-router.js.map +1 -0
- package/dist/messaging.d.ts +15 -0
- package/dist/messaging.d.ts.map +1 -0
- package/dist/messaging.js +41 -0
- package/dist/messaging.js.map +1 -0
- package/dist/network-capture.d.ts +56 -0
- package/dist/network-capture.d.ts.map +1 -0
- package/dist/network-capture.js +374 -0
- package/dist/network-capture.js.map +1 -0
- package/dist/offscreen/index.d.ts +16 -0
- package/dist/offscreen/index.d.ts.map +1 -0
- package/dist/offscreen/index.js +549 -0
- package/dist/offscreen/index.js.map +1 -0
- package/dist/plugin-storage.d.ts +19 -0
- package/dist/plugin-storage.d.ts.map +1 -0
- package/dist/plugin-storage.js +100 -0
- package/dist/plugin-storage.js.map +1 -0
- package/dist/rate-limiter.d.ts +18 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +53 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/resource-prompt-dispatch.d.ts +14 -0
- package/dist/resource-prompt-dispatch.d.ts.map +1 -0
- package/dist/resource-prompt-dispatch.js +195 -0
- package/dist/resource-prompt-dispatch.js.map +1 -0
- package/dist/sanitize-error.d.ts +8 -0
- package/dist/sanitize-error.d.ts.map +1 -0
- package/dist/sanitize-error.js +25 -0
- package/dist/sanitize-error.js.map +1 -0
- package/dist/sanitize-svg.d.ts +20 -0
- package/dist/sanitize-svg.d.ts.map +1 -0
- package/dist/sanitize-svg.js +296 -0
- package/dist/sanitize-svg.js.map +1 -0
- package/dist/side-panel/App.d.ts +3 -0
- package/dist/side-panel/App.d.ts.map +1 -0
- package/dist/side-panel/App.js +147 -0
- package/dist/side-panel/App.js.map +1 -0
- package/dist/side-panel/bridge.d.ts +50 -0
- package/dist/side-panel/bridge.d.ts.map +1 -0
- package/dist/side-panel/bridge.js +113 -0
- package/dist/side-panel/bridge.js.map +1 -0
- package/dist/side-panel/components/ConfirmationDialog.d.ts +16 -0
- package/dist/side-panel/components/ConfirmationDialog.d.ts.map +1 -0
- package/dist/side-panel/components/ConfirmationDialog.js +39 -0
- package/dist/side-panel/components/ConfirmationDialog.js.map +1 -0
- package/dist/side-panel/components/EmptyStates.d.ts +8 -0
- package/dist/side-panel/components/EmptyStates.d.ts.map +1 -0
- package/dist/side-panel/components/EmptyStates.js +40 -0
- package/dist/side-panel/components/EmptyStates.js.map +1 -0
- package/dist/side-panel/components/ErrorBoundary.d.ts +23 -0
- package/dist/side-panel/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/side-panel/components/ErrorBoundary.js +28 -0
- package/dist/side-panel/components/ErrorBoundary.js.map +1 -0
- package/dist/side-panel/components/FailedPluginCard.d.ts +6 -0
- package/dist/side-panel/components/FailedPluginCard.d.ts.map +1 -0
- package/dist/side-panel/components/FailedPluginCard.js +9 -0
- package/dist/side-panel/components/FailedPluginCard.js.map +1 -0
- package/dist/side-panel/components/Footer.d.ts +3 -0
- package/dist/side-panel/components/Footer.d.ts.map +1 -0
- package/dist/side-panel/components/Footer.js +32 -0
- package/dist/side-panel/components/Footer.js.map +1 -0
- package/dist/side-panel/components/Header.d.ts +5 -0
- package/dist/side-panel/components/Header.d.ts.map +1 -0
- package/dist/side-panel/components/Header.js +6 -0
- package/dist/side-panel/components/Header.js.map +1 -0
- package/dist/side-panel/components/PluginCard.d.ts +10 -0
- package/dist/side-panel/components/PluginCard.d.ts.map +1 -0
- package/dist/side-panel/components/PluginCard.js +50 -0
- package/dist/side-panel/components/PluginCard.js.map +1 -0
- package/dist/side-panel/components/PluginIcon.d.ts +21 -0
- package/dist/side-panel/components/PluginIcon.d.ts.map +1 -0
- package/dist/side-panel/components/PluginIcon.js +48 -0
- package/dist/side-panel/components/PluginIcon.js.map +1 -0
- package/dist/side-panel/components/PluginList.d.ts +11 -0
- package/dist/side-panel/components/PluginList.d.ts.map +1 -0
- package/dist/side-panel/components/PluginList.js +17 -0
- package/dist/side-panel/components/PluginList.js.map +1 -0
- package/dist/side-panel/components/ToolIcon.d.ts +7 -0
- package/dist/side-panel/components/ToolIcon.d.ts.map +1 -0
- package/dist/side-panel/components/ToolIcon.js +8 -0
- package/dist/side-panel/components/ToolIcon.js.map +1 -0
- package/dist/side-panel/components/ToolRow.d.ts +11 -0
- package/dist/side-panel/components/ToolRow.d.ts.map +1 -0
- package/dist/side-panel/components/ToolRow.js +8 -0
- package/dist/side-panel/components/ToolRow.js.map +1 -0
- package/dist/side-panel/components/VersionMismatchBanner.d.ts +3 -0
- package/dist/side-panel/components/VersionMismatchBanner.d.ts.map +1 -0
- package/dist/side-panel/components/VersionMismatchBanner.js +5 -0
- package/dist/side-panel/components/VersionMismatchBanner.js.map +1 -0
- package/dist/side-panel/components/retro/Accordion.d.ts +8 -0
- package/dist/side-panel/components/retro/Accordion.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Accordion.js +15 -0
- package/dist/side-panel/components/retro/Accordion.js.map +1 -0
- package/dist/side-panel/components/retro/Alert.d.ts +25 -0
- package/dist/side-panel/components/retro/Alert.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Alert.js +33 -0
- package/dist/side-panel/components/retro/Alert.js.map +1 -0
- package/dist/side-panel/components/retro/Badge.d.ts +15 -0
- package/dist/side-panel/components/retro/Badge.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Badge.js +23 -0
- package/dist/side-panel/components/retro/Badge.js.map +1 -0
- package/dist/side-panel/components/retro/Button.d.ts +13 -0
- package/dist/side-panel/components/retro/Button.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Button.js +33 -0
- package/dist/side-panel/components/retro/Button.js.map +1 -0
- package/dist/side-panel/components/retro/Empty.d.ts +31 -0
- package/dist/side-panel/components/retro/Empty.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Empty.js +25 -0
- package/dist/side-panel/components/retro/Empty.js.map +1 -0
- package/dist/side-panel/components/retro/Input.d.ts +8 -0
- package/dist/side-panel/components/retro/Input.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Input.js +7 -0
- package/dist/side-panel/components/retro/Input.js.map +1 -0
- package/dist/side-panel/components/retro/Loader.d.ts +14 -0
- package/dist/side-panel/components/retro/Loader.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Loader.js +30 -0
- package/dist/side-panel/components/retro/Loader.js.map +1 -0
- package/dist/side-panel/components/retro/Menu.d.ts +9 -0
- package/dist/side-panel/components/retro/Menu.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Menu.js +17 -0
- package/dist/side-panel/components/retro/Menu.js.map +1 -0
- package/dist/side-panel/components/retro/NumberStepper.d.ts +18 -0
- package/dist/side-panel/components/retro/NumberStepper.d.ts.map +1 -0
- package/dist/side-panel/components/retro/NumberStepper.js +38 -0
- package/dist/side-panel/components/retro/NumberStepper.js.map +1 -0
- package/dist/side-panel/components/retro/Progress.d.ts +9 -0
- package/dist/side-panel/components/retro/Progress.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Progress.js +6 -0
- package/dist/side-panel/components/retro/Progress.js.map +1 -0
- package/dist/side-panel/components/retro/Switch.d.ts +4 -0
- package/dist/side-panel/components/retro/Switch.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Switch.js +6 -0
- package/dist/side-panel/components/retro/Switch.js.map +1 -0
- package/dist/side-panel/components/retro/Text.d.ts +11 -0
- package/dist/side-panel/components/retro/Text.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Text.js +28 -0
- package/dist/side-panel/components/retro/Text.js.map +1 -0
- package/dist/side-panel/components/retro/Tooltip.d.ts +12 -0
- package/dist/side-panel/components/retro/Tooltip.d.ts.map +1 -0
- package/dist/side-panel/components/retro/Tooltip.js +32 -0
- package/dist/side-panel/components/retro/Tooltip.js.map +1 -0
- package/dist/side-panel/constants.d.ts +5 -0
- package/dist/side-panel/constants.d.ts.map +1 -0
- package/dist/side-panel/constants.js +5 -0
- package/dist/side-panel/constants.js.map +1 -0
- package/dist/side-panel/hooks/useServerNotifications.d.ts +21 -0
- package/dist/side-panel/hooks/useServerNotifications.d.ts.map +1 -0
- package/dist/side-panel/hooks/useServerNotifications.js +93 -0
- package/dist/side-panel/hooks/useServerNotifications.js.map +1 -0
- package/dist/side-panel/hooks/useTheme.d.ts +8 -0
- package/dist/side-panel/hooks/useTheme.d.ts.map +1 -0
- package/dist/side-panel/hooks/useTheme.js +30 -0
- package/dist/side-panel/hooks/useTheme.js.map +1 -0
- package/dist/side-panel/index.d.ts +2 -0
- package/dist/side-panel/index.d.ts.map +1 -0
- package/dist/side-panel/index.js +12 -0
- package/dist/side-panel/index.js.map +1 -0
- package/dist/side-panel/lib/cn.d.ts +3 -0
- package/dist/side-panel/lib/cn.d.ts.map +1 -0
- package/dist/side-panel/lib/cn.js +4 -0
- package/dist/side-panel/lib/cn.js.map +1 -0
- package/dist/side-panel/lib/utils.d.ts +3 -0
- package/dist/side-panel/lib/utils.d.ts.map +1 -0
- package/dist/side-panel/lib/utils.js +4 -0
- package/dist/side-panel/lib/utils.js.map +1 -0
- package/dist/side-panel/side-panel.js +78034 -0
- package/dist/side-panel/styles.css +2 -0
- package/dist/side-panel-state.d.ts +11 -0
- package/dist/side-panel-state.d.ts.map +1 -0
- package/dist/side-panel-state.js +38 -0
- package/dist/side-panel-state.js.map +1 -0
- package/dist/side-panel-toggle.d.ts +3 -0
- package/dist/side-panel-toggle.d.ts.map +1 -0
- package/dist/side-panel-toggle.js +31 -0
- package/dist/side-panel-toggle.js.map +1 -0
- package/dist/tab-matching.d.ts +51 -0
- package/dist/tab-matching.d.ts.map +1 -0
- package/dist/tab-matching.js +160 -0
- package/dist/tab-matching.js.map +1 -0
- package/dist/tab-state.d.ts +56 -0
- package/dist/tab-state.d.ts.map +1 -0
- package/dist/tab-state.js +282 -0
- package/dist/tab-state.js.map +1 -0
- package/dist/tool-dispatch.d.ts +19 -0
- package/dist/tool-dispatch.d.ts.map +1 -0
- package/dist/tool-dispatch.js +336 -0
- package/dist/tool-dispatch.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/icons/icon-128.png +0 -0
- package/icons/icon-16.png +0 -0
- package/icons/icon-32.png +0 -0
- package/icons/icon-48.png +0 -0
- package/icons/icon.svg +6 -0
- package/manifest.json +38 -0
- package/offscreen/offscreen.html +10 -0
- package/package.json +49 -0
- package/side-panel/dark-mode.js +29 -0
- package/side-panel/fonts/archivo-black-latin.woff2 +0 -0
- package/side-panel/fonts/space-grotesk-latin.woff2 +0 -0
- package/side-panel/fonts/space-mono-400-latin.woff2 +0 -0
- package/side-panel/fonts/space-mono-700-latin.woff2 +0 -0
- package/side-panel/fonts.css +34 -0
- package/side-panel/side-panel.html +16 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SpConfirmationRequestMessage } from '../../extension-messages.js';
|
|
2
|
+
type ConfirmationData = SpConfirmationRequestMessage['data'] & {
|
|
3
|
+
/** Timestamp when the confirmation was received in the side panel */
|
|
4
|
+
receivedAt: number;
|
|
5
|
+
};
|
|
6
|
+
type Decision = 'allow_once' | 'allow_always' | 'deny';
|
|
7
|
+
type Scope = 'tool_domain' | 'tool_all' | 'domain_all';
|
|
8
|
+
interface ConfirmationDialogProps {
|
|
9
|
+
confirmations: ConfirmationData[];
|
|
10
|
+
onRespond: (id: string, decision: Decision, scope?: Scope) => void;
|
|
11
|
+
onDenyAll: () => void;
|
|
12
|
+
}
|
|
13
|
+
declare const ConfirmationDialog: ({ confirmations, onRespond, onDenyAll }: ConfirmationDialogProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
14
|
+
export { ConfirmationDialog };
|
|
15
|
+
export type { ConfirmationData };
|
|
16
|
+
//# sourceMappingURL=ConfirmationDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmationDialog.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/ConfirmationDialog.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAEhF,KAAK,gBAAgB,GAAG,4BAA4B,CAAC,MAAM,CAAC,GAAG;IAC7D,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,MAAM,CAAC;AACvD,KAAK,KAAK,GAAG,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;AAEvD,UAAU,uBAAuB;IAC/B,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IACnE,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAgDD,QAAA,MAAM,kBAAkB,GAAI,yCAAyC,uBAAuB,mDAqG3F,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from './retro/Button.js';
|
|
3
|
+
import { Menu } from './retro/Menu.js';
|
|
4
|
+
import { Progress } from './retro/Progress.js';
|
|
5
|
+
import { Text } from './retro/Text.js';
|
|
6
|
+
import { COUNTDOWN_POLL_INTERVAL_MS } from '../constants.js';
|
|
7
|
+
import { ShieldAlert, ChevronDown } from 'lucide-react';
|
|
8
|
+
import { useState, useEffect } from 'react';
|
|
9
|
+
/** Renders a countdown bar and seconds remaining based on the confirmation timeout */
|
|
10
|
+
const CountdownBar = ({ timeoutMs, receivedAt }) => {
|
|
11
|
+
const [remaining, setRemaining] = useState(timeoutMs);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const update = () => {
|
|
14
|
+
const elapsed = Date.now() - receivedAt;
|
|
15
|
+
setRemaining(Math.max(0, timeoutMs - elapsed));
|
|
16
|
+
};
|
|
17
|
+
update();
|
|
18
|
+
const id = setInterval(update, COUNTDOWN_POLL_INTERVAL_MS);
|
|
19
|
+
return () => clearInterval(id);
|
|
20
|
+
}, [timeoutMs, receivedAt]);
|
|
21
|
+
const seconds = Math.ceil(remaining / 1000);
|
|
22
|
+
const fraction = remaining / timeoutMs;
|
|
23
|
+
return (_jsxs("div", { className: "mt-2 flex items-center gap-2", children: [_jsx(Progress, { value: fraction * 100, className: "flex-1", indicatorClassName: fraction > 0.33 ? 'bg-accent-foreground' : 'bg-destructive' }), _jsxs("span", { className: "text-muted-foreground font-mono text-xs tabular-nums", children: [seconds, "s"] })] }));
|
|
24
|
+
};
|
|
25
|
+
/** Renders the "Allow Always" button with a scope dropdown */
|
|
26
|
+
const AllowAlwaysButton = ({ domain, onSelect }) => (_jsxs(Menu, { children: [_jsx(Menu.Trigger, { asChild: true, children: _jsxs(Button, { size: "sm", variant: "outline", className: "w-full gap-1 text-xs", children: ["Allow Always", _jsx(ChevronDown, { className: "h-3 w-3" })] }) }), _jsxs(Menu.Content, { side: "top", align: "end", children: [_jsx(Menu.Item, { onSelect: () => onSelect('tool_domain'), children: "For this tool on this domain" }), _jsx(Menu.Item, { onSelect: () => onSelect('tool_all'), children: "For this tool everywhere" }), domain && _jsxs(Menu.Item, { onSelect: () => onSelect('domain_all'), children: ["For all tools on ", domain] })] })] }));
|
|
27
|
+
const ConfirmationDialog = ({ confirmations, onRespond, onDenyAll }) => {
|
|
28
|
+
const [currentId, setCurrentId] = useState(null);
|
|
29
|
+
// Find confirmation by ID; fall back to the first item when the tracked ID is gone
|
|
30
|
+
const currentIndex = confirmations.findIndex(c => c.id === currentId);
|
|
31
|
+
const safeIndex = currentIndex === -1 ? 0 : currentIndex;
|
|
32
|
+
const current = confirmations[safeIndex];
|
|
33
|
+
if (!current)
|
|
34
|
+
return null;
|
|
35
|
+
const count = confirmations.length;
|
|
36
|
+
return (_jsx("div", { className: "mt-2 mr-5 ml-4", role: "alert", children: _jsxs("div", { className: "border-accent-foreground bg-accent/30 rounded border-2 shadow-md", children: [_jsxs("div", { className: "border-accent-foreground flex items-center gap-2 border-b-2 px-3 py-2", children: [_jsx(ShieldAlert, { className: "text-accent-foreground h-4 w-4 shrink-0" }), _jsx(Text, { as: "h6", className: "flex-1 text-sm", children: "Approval Required" }), count > 1 && (_jsxs("span", { className: "text-muted-foreground font-mono text-xs", children: [safeIndex + 1, " of ", count] }))] }), _jsxs("div", { className: "space-y-2 px-3 py-2", children: [_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground font-sans text-xs", children: "Tool" }), _jsx("div", { className: "font-mono text-sm", children: current.tool })] }), current.domain && (_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground font-sans text-xs", children: "Domain" }), _jsx("div", { className: "font-sans text-sm", children: current.domain })] })), current.paramsPreview && (_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground font-sans text-xs", children: "Parameters" }), _jsx("pre", { className: "border-border bg-card mt-0.5 max-h-20 overflow-auto rounded border px-2 py-1 font-mono text-xs leading-tight", children: current.paramsPreview })] })), _jsx(CountdownBar, { timeoutMs: current.timeoutMs, receivedAt: current.receivedAt })] }), _jsxs("div", { className: "border-accent-foreground flex flex-col gap-1.5 border-t-2 py-2 pr-4 pl-3", children: [_jsx(Button, { size: "sm", className: "w-full", onClick: () => onRespond(current.id, 'allow_once'), children: "Allow Once" }), _jsx(AllowAlwaysButton, { domain: current.domain, onSelect: scope => onRespond(current.id, 'allow_always', scope) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", className: "text-destructive w-full text-xs", onClick: () => onRespond(current.id, 'deny'), children: "Deny" }), count > 1 && (_jsx(Button, { size: "sm", variant: "outline", className: "text-destructive w-full text-xs", onClick: onDenyAll, children: "Deny All" }))] })] }), count > 1 && (_jsxs("div", { className: "border-border flex justify-center gap-2 border-t px-3 py-1", children: [_jsx("button", { type: "button", className: "text-muted-foreground hover:text-foreground cursor-pointer font-mono text-xs disabled:cursor-not-allowed disabled:opacity-40", disabled: safeIndex === 0, onClick: () => setCurrentId(confirmations[safeIndex - 1]?.id ?? null), children: "prev" }), _jsx("button", { type: "button", className: "text-muted-foreground hover:text-foreground cursor-pointer font-mono text-xs disabled:cursor-not-allowed disabled:opacity-40", disabled: safeIndex >= count - 1, onClick: () => setCurrentId(confirmations[safeIndex + 1]?.id ?? null), children: "next" })] }))] }) }));
|
|
37
|
+
};
|
|
38
|
+
export { ConfirmationDialog };
|
|
39
|
+
//# sourceMappingURL=ConfirmationDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmationDialog.js","sourceRoot":"","sources":["../../../src/side-panel/components/ConfirmationDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DisconnectReason } from '../../extension-messages.js';
|
|
2
|
+
declare const DisconnectedState: ({ reason }: {
|
|
3
|
+
reason?: DisconnectReason;
|
|
4
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
declare const NoPluginsState: () => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
declare const LoadingState: () => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export { DisconnectedState, NoPluginsState, LoadingState };
|
|
8
|
+
//# sourceMappingURL=EmptyStates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyStates.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/EmptyStates.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AA4DpE,QAAA,MAAM,iBAAiB,GAAI,YAAY;IAAE,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAAE,4CAGnE,CAAC;AAEF,QAAA,MAAM,cAAc,+CASnB,CAAC;AAEF,QAAA,MAAM,YAAY,+CAA6B,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Empty } from './retro/Empty.js';
|
|
3
|
+
import { Loader } from './retro/Loader.js';
|
|
4
|
+
import { DEFAULT_SERVER_PORT, SERVER_PORT_KEY } from '../../constants.js';
|
|
5
|
+
import { useState, useEffect } from 'react';
|
|
6
|
+
const ConnectionRefusedState = () => {
|
|
7
|
+
const [port, setPort] = useState(DEFAULT_SERVER_PORT);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
chrome.storage.local.get(SERVER_PORT_KEY).then(result => {
|
|
10
|
+
const stored = result[SERVER_PORT_KEY];
|
|
11
|
+
if (typeof stored === 'number' && stored >= 1 && stored <= 65535) {
|
|
12
|
+
setPort(stored);
|
|
13
|
+
}
|
|
14
|
+
}, () => {
|
|
15
|
+
// Storage unavailable — keep default
|
|
16
|
+
});
|
|
17
|
+
const onChanged = (changes, area) => {
|
|
18
|
+
if (area !== 'local' || !(SERVER_PORT_KEY in changes))
|
|
19
|
+
return;
|
|
20
|
+
const newValue = changes[SERVER_PORT_KEY].newValue;
|
|
21
|
+
if (typeof newValue === 'number' && newValue >= 1 && newValue <= 65535) {
|
|
22
|
+
setPort(newValue);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
chrome.storage.onChanged.addListener(onChanged);
|
|
26
|
+
return () => chrome.storage.onChanged.removeListener(onChanged);
|
|
27
|
+
}, []);
|
|
28
|
+
const command = port === DEFAULT_SERVER_PORT ? 'opentabs start' : `opentabs start --port ${port}`;
|
|
29
|
+
return (_jsx(Empty, { className: "border-destructive/60", children: _jsxs(Empty.Content, { children: [_jsx(Empty.Title, { children: "Cannot Reach MCP Server" }), _jsx(Empty.Separator, { className: "bg-destructive" }), _jsx(Empty.Description, { children: "Start the MCP server:" }), _jsx("code", { className: "border-destructive/40 bg-destructive/10 rounded border-2 px-3 py-2 font-mono text-sm", children: command })] }) }));
|
|
30
|
+
};
|
|
31
|
+
const AuthFailedState = () => (_jsx(Empty, { className: "border-destructive/60", children: _jsxs(Empty.Content, { children: [_jsx(Empty.Title, { children: "Authentication Failed" }), _jsx(Empty.Separator, { className: "bg-destructive" }), _jsx(Empty.Description, { children: "The extension\u2019s secret does not match the server. Reload the extension to pick up the latest secret:" }), _jsx("code", { className: "border-destructive/40 bg-destructive/10 rounded border-2 px-3 py-2 font-mono text-sm", children: "chrome://extensions/ \u2192 reload" })] }) }));
|
|
32
|
+
const DisconnectedState = ({ reason }) => {
|
|
33
|
+
if (reason === 'auth_failed')
|
|
34
|
+
return _jsx(AuthFailedState, {});
|
|
35
|
+
return _jsx(ConnectionRefusedState, {});
|
|
36
|
+
};
|
|
37
|
+
const NoPluginsState = () => (_jsx(Empty, { children: _jsxs(Empty.Content, { children: [_jsx(Empty.Title, { children: "No Plugins Installed" }), _jsx(Empty.Separator, {}), _jsx(Empty.Description, { children: "Manage plugins with:" }), _jsx("code", { className: "rounded border-2 px-3 py-2 font-mono text-sm", children: "opentabs plugin" })] }) }));
|
|
38
|
+
const LoadingState = () => _jsx(Loader, { size: "md" });
|
|
39
|
+
export { DisconnectedState, NoPluginsState, LoadingState };
|
|
40
|
+
//# sourceMappingURL=EmptyStates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyStates.js","sourceRoot":"","sources":["../../../src/side-panel/components/EmptyStates.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Component } from 'react';
|
|
2
|
+
import type { ErrorInfo, ReactNode } from 'react';
|
|
3
|
+
interface ErrorBoundaryProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
}
|
|
6
|
+
interface ErrorBoundaryState {
|
|
7
|
+
hasError: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Top-level error boundary for the side panel. Catches render errors and
|
|
11
|
+
* displays a recoverable fallback UI instead of a white screen.
|
|
12
|
+
*
|
|
13
|
+
* React error boundaries must be class components — there is no hook-based
|
|
14
|
+
* equivalent for componentDidCatch/getDerivedStateFromError.
|
|
15
|
+
*/
|
|
16
|
+
declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
17
|
+
state: ErrorBoundaryState;
|
|
18
|
+
static getDerivedStateFromError(): ErrorBoundaryState;
|
|
19
|
+
componentDidCatch(error: Error, info: ErrorInfo): void;
|
|
20
|
+
render(): ReactNode;
|
|
21
|
+
}
|
|
22
|
+
export { ErrorBoundary };
|
|
23
|
+
//# sourceMappingURL=ErrorBoundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,cAAM,aAAc,SAAQ,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAClE,KAAK,EAAE,kBAAkB,CAAuB;IAEzD,MAAM,CAAC,wBAAwB,IAAI,kBAAkB;IAI5C,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAItD,MAAM,IAAI,SAAS;CAiB7B;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Alert } from './retro/Alert.js';
|
|
3
|
+
import { Button } from './retro/Button.js';
|
|
4
|
+
import { Component } from 'react';
|
|
5
|
+
/**
|
|
6
|
+
* Top-level error boundary for the side panel. Catches render errors and
|
|
7
|
+
* displays a recoverable fallback UI instead of a white screen.
|
|
8
|
+
*
|
|
9
|
+
* React error boundaries must be class components — there is no hook-based
|
|
10
|
+
* equivalent for componentDidCatch/getDerivedStateFromError.
|
|
11
|
+
*/
|
|
12
|
+
class ErrorBoundary extends Component {
|
|
13
|
+
state = { hasError: false };
|
|
14
|
+
static getDerivedStateFromError() {
|
|
15
|
+
return { hasError: true };
|
|
16
|
+
}
|
|
17
|
+
componentDidCatch(error, info) {
|
|
18
|
+
console.error('[opentabs:side-panel] Render error caught by ErrorBoundary:', error, info.componentStack);
|
|
19
|
+
}
|
|
20
|
+
render() {
|
|
21
|
+
if (this.state.hasError) {
|
|
22
|
+
return (_jsx("div", { className: "flex min-h-screen flex-col items-center justify-center px-4 py-16 text-center", children: _jsxs(Alert, { status: "error", className: "max-w-xs", children: [_jsx(Alert.Title, { children: "Something went wrong" }), _jsx(Alert.Description, { children: "The side panel encountered an unexpected error." }), _jsx(Button, { variant: "default", size: "sm", className: "mt-4 w-full", onClick: () => window.location.reload(), children: "Reload" })] }) }));
|
|
23
|
+
}
|
|
24
|
+
return this.props.children;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export { ErrorBoundary };
|
|
28
|
+
//# sourceMappingURL=ErrorBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../../src/side-panel/components/ErrorBoundary.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWlC;;;;;;GAMG;AACH,MAAM,aAAc,SAAQ,SAAiD;IAClE,KAAK,GAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAEzD,MAAM,CAAC,wBAAwB;QAC7B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAEQ,iBAAiB,CAAC,KAAY,EAAE,IAAe;QACtD,OAAO,CAAC,KAAK,CAAC,6DAA6D,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3G,CAAC;IAEQ,MAAM;QACb,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,OAAO,CACL,cAAK,SAAS,EAAC,+EAA+E,YAC5F,MAAC,KAAK,IAAC,MAAM,EAAC,OAAO,EAAC,SAAS,EAAC,UAAU,aACxC,KAAC,KAAK,CAAC,KAAK,uCAAmC,EAC/C,KAAC,KAAK,CAAC,WAAW,kEAAoE,EACtF,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,aAAa,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,uBAE1F,IACH,GACJ,CACP,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FailedPluginCard.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/FailedPluginCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,QAAA,MAAM,gBAAgB,GAAI,YAAY;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,4CAuBlE,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { AlertTriangle } from 'lucide-react';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
const FailedPluginCard = ({ plugin }) => {
|
|
5
|
+
const [expanded, setExpanded] = useState(false);
|
|
6
|
+
return (_jsxs("div", { className: "border-destructive/50 bg-destructive/10 rounded border-2 p-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AlertTriangle, { className: "text-destructive h-4 w-4 shrink-0" }), _jsx("span", { className: "text-destructive text-sm font-medium", children: "Failed to load" })] }), _jsx("div", { className: "text-muted-foreground mt-1 truncate text-xs", children: plugin.specifier }), _jsx("div", { className: `text-destructive/80 mt-1 text-xs leading-snug select-text ${expanded ? '' : 'line-clamp-2'}`, children: plugin.error }), plugin.error.length > 100 && (_jsx("button", { type: "button", onClick: () => setExpanded(!expanded), className: "text-muted-foreground mt-1 cursor-pointer text-xs underline", children: expanded ? 'Show less' : 'Show more' }))] }));
|
|
7
|
+
};
|
|
8
|
+
export { FailedPluginCard };
|
|
9
|
+
//# sourceMappingURL=FailedPluginCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FailedPluginCard.js","sourceRoot":"","sources":["../../../src/side-panel/components/FailedPluginCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,MAAM,gBAAgB,GAAG,CAAC,EAAE,MAAM,EAAiC,EAAE,EAAE;IACrE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,OAAO,CACL,eAAK,SAAS,EAAC,8DAA8D,aAC3E,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,aAAa,IAAC,SAAS,EAAC,mCAAmC,GAAG,EAC/D,eAAM,SAAS,EAAC,sCAAsC,+BAAsB,IACxE,EACN,cAAK,SAAS,EAAC,6CAA6C,YAAE,MAAM,CAAC,SAAS,GAAO,EACrF,cAAK,SAAS,EAAE,6DAA6D,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,YAC1G,MAAM,CAAC,KAAK,GACT,EACL,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAC5B,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EACrC,SAAS,EAAC,6DAA6D,YACtE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,GAC9B,CACV,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/Footer.tsx"],"names":[],"mappings":"AA8CA,QAAA,MAAM,MAAM,+CA6BX,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from './retro/Button.js';
|
|
3
|
+
import { NumberStepper } from './retro/NumberStepper.js';
|
|
4
|
+
import { DEFAULT_SERVER_PORT, SERVER_PORT_KEY } from '../../constants.js';
|
|
5
|
+
import { useTheme } from '../hooks/useTheme.js';
|
|
6
|
+
import { Moon, Sun } from 'lucide-react';
|
|
7
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
8
|
+
const PortEditor = () => {
|
|
9
|
+
const [initialPort, setInitialPort] = useState(null);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
chrome.storage.local.get(SERVER_PORT_KEY).then(result => {
|
|
12
|
+
const stored = result[SERVER_PORT_KEY];
|
|
13
|
+
setInitialPort(typeof stored === 'number' && stored >= 1 && stored <= 65535 ? stored : DEFAULT_SERVER_PORT);
|
|
14
|
+
}, () => {
|
|
15
|
+
setInitialPort(DEFAULT_SERVER_PORT);
|
|
16
|
+
});
|
|
17
|
+
}, []);
|
|
18
|
+
const handleChange = useCallback((value) => {
|
|
19
|
+
chrome.storage.local.set({ [SERVER_PORT_KEY]: value }).catch(() => { });
|
|
20
|
+
const message = { type: 'port-changed', port: value };
|
|
21
|
+
chrome.runtime.sendMessage(message).catch(() => { });
|
|
22
|
+
}, []);
|
|
23
|
+
if (initialPort === null)
|
|
24
|
+
return null;
|
|
25
|
+
return (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: "Port:" }), _jsx(NumberStepper, { defaultValue: initialPort, onChange: handleChange, min: 1, max: 65535, "aria-label": "Server port", className: "h-7" })] }));
|
|
26
|
+
};
|
|
27
|
+
const Footer = () => {
|
|
28
|
+
const { theme, toggleTheme } = useTheme();
|
|
29
|
+
return (_jsxs("footer", { className: "border-border bg-card sticky bottom-0 flex items-center justify-between border-t-2 py-3 pr-3.5 pl-3 text-sm", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", size: "icon", className: "h-9 w-9", asChild: true, children: _jsx("a", { href: "https://github.com/opentabs-dev/opentabs", target: "_blank", rel: "noopener noreferrer", "aria-label": "GitHub", children: _jsx("svg", { className: "h-[18px] w-[18px]", viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", children: _jsx("path", { d: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" }) }) }) }), _jsx(Button, { variant: "outline", size: "icon", onClick: toggleTheme, className: "h-9 w-9", "aria-label": theme === 'dark' ? 'Switch to light mode' : 'Switch to dark mode', children: theme === 'dark' ? _jsx(Sun, { className: "h-[18px] w-[18px]" }) : _jsx(Moon, { className: "h-[18px] w-[18px]" }) })] }), _jsx(PortEditor, {})] }));
|
|
30
|
+
};
|
|
31
|
+
export { Footer };
|
|
32
|
+
//# sourceMappingURL=Footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../../src/side-panel/components/Footer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/Header.tsx"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,GAAI,eAAe;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,4CAgBpD,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Badge } from './retro/Badge.js';
|
|
3
|
+
import { Zap } from 'lucide-react';
|
|
4
|
+
const Header = ({ connected }) => (_jsxs("header", { className: "border-border bg-background flex items-center justify-between border-b-2 px-4 py-2.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Zap, { className: "text-foreground h-5 w-5" }), _jsx("h1", { className: "font-head text-foreground text-sm tracking-tight", children: "OpenTabs" })] }), connected ? (_jsx(Badge, { variant: "surface", size: "sm", children: "Connected" })) : (_jsx(Badge, { variant: "outline", size: "sm", className: "text-destructive outline-destructive", children: "Disconnected" }))] }));
|
|
5
|
+
export { Header };
|
|
6
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/side-panel/components/Header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,MAAM,MAAM,GAAG,CAAC,EAAE,SAAS,EAA0B,EAAE,EAAE,CAAC,CACxD,kBAAQ,SAAS,EAAC,sFAAsF,aACtG,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,GAAG,IAAC,SAAS,EAAC,yBAAyB,GAAG,EAC3C,aAAI,SAAS,EAAC,kDAAkD,yBAAc,IAC1E,EACL,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,KAAK,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,0BAE1B,CACT,CAAC,CAAC,CAAC,CACF,KAAC,KAAK,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,sCAAsC,6BAE3E,CACT,IACM,CACV,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PluginState } from '../bridge.js';
|
|
2
|
+
import type { Dispatch, SetStateAction } from 'react';
|
|
3
|
+
declare const PluginCard: ({ plugin, activeTools, setPlugins, toolFilter, }: {
|
|
4
|
+
plugin: PluginState;
|
|
5
|
+
activeTools: Set<string>;
|
|
6
|
+
setPlugins: Dispatch<SetStateAction<PluginState[]>>;
|
|
7
|
+
toolFilter?: string;
|
|
8
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export { PluginCard };
|
|
10
|
+
//# sourceMappingURL=PluginCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginCard.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/PluginCard.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEtD,QAAA,MAAM,UAAU,GAAI,kDAKjB;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,4CA8HA,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { PluginIcon } from './PluginIcon.js';
|
|
3
|
+
import { Accordion } from './retro/Accordion.js';
|
|
4
|
+
import { Alert } from './retro/Alert.js';
|
|
5
|
+
import { Badge } from './retro/Badge.js';
|
|
6
|
+
import { Switch } from './retro/Switch.js';
|
|
7
|
+
import { Tooltip } from './retro/Tooltip.js';
|
|
8
|
+
import { ToolRow } from './ToolRow.js';
|
|
9
|
+
import { matchesTool, setToolEnabled, setAllToolsEnabled } from '../bridge.js';
|
|
10
|
+
import { ERROR_DISPLAY_DURATION_MS } from '../constants.js';
|
|
11
|
+
// PluginCard needs a custom header layout (icon + name + switch outside the trigger) that the retro Accordion wrapper does not support.
|
|
12
|
+
import * as AccordionPrimitive from '@radix-ui/react-accordion';
|
|
13
|
+
import { ChevronDown } from 'lucide-react';
|
|
14
|
+
import { useState, useEffect, useRef } from 'react';
|
|
15
|
+
const PluginCard = ({ plugin, activeTools, setPlugins, toolFilter, }) => {
|
|
16
|
+
const [toggleError, setToggleError] = useState(null);
|
|
17
|
+
const errorTimerRef = useRef(undefined);
|
|
18
|
+
useEffect(() => () => clearTimeout(errorTimerRef.current), []);
|
|
19
|
+
const showToggleError = (message) => {
|
|
20
|
+
clearTimeout(errorTimerRef.current);
|
|
21
|
+
setToggleError(message);
|
|
22
|
+
errorTimerRef.current = setTimeout(() => setToggleError(null), ERROR_DISPLAY_DURATION_MS);
|
|
23
|
+
};
|
|
24
|
+
const updatePluginTools = (updater) => setPlugins(prev => prev.map(p => (p.name === plugin.name ? { ...p, tools: updater(p.tools) } : p)));
|
|
25
|
+
const allEnabled = plugin.tools.length > 0 && plugin.tools.every(t => t.enabled);
|
|
26
|
+
const handleToggleAll = (checked) => {
|
|
27
|
+
const originalTools = plugin.tools;
|
|
28
|
+
updatePluginTools(tools => tools.map(t => ({ ...t, enabled: checked })));
|
|
29
|
+
void setAllToolsEnabled(plugin.name, checked).catch(() => {
|
|
30
|
+
updatePluginTools(() => originalTools);
|
|
31
|
+
showToggleError('Failed to toggle all tools');
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
const handleToggleTool = (toolName, currentEnabled) => {
|
|
35
|
+
const newEnabled = !currentEnabled;
|
|
36
|
+
updatePluginTools(tools => tools.map(t => (t.name === toolName ? { ...t, enabled: newEnabled } : t)));
|
|
37
|
+
void setToolEnabled(plugin.name, toolName, newEnabled).catch(() => {
|
|
38
|
+
updatePluginTools(tools => tools.map(t => (t.name === toolName ? { ...t, enabled: !newEnabled } : t)));
|
|
39
|
+
showToggleError(`Failed to toggle ${toolName}`);
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
const filterLower = toolFilter?.toLowerCase() ?? '';
|
|
43
|
+
const visibleTools = filterLower ? plugin.tools.filter(t => matchesTool(t, filterLower)) : plugin.tools;
|
|
44
|
+
return (_jsxs(Accordion.Item, { value: plugin.name, children: [_jsxs(AccordionPrimitive.Header, { className: "flex", children: [_jsxs(AccordionPrimitive.Trigger, { className: "font-head flex flex-1 cursor-pointer items-center gap-2 px-3 py-2 focus:outline-hidden [&[data-state=open]>svg]:rotate-180", children: [_jsxs(Tooltip, { children: [_jsx(Tooltip.Trigger, { asChild: true, children: _jsx("div", { children: _jsx(PluginIcon, { pluginName: plugin.name, displayName: plugin.displayName, tabState: plugin.tabState, hasUpdate: !!plugin.update, size: 32, iconSvg: plugin.iconSvg, iconInactiveSvg: plugin.iconInactiveSvg }) }) }), _jsxs(Tooltip.Content, { children: ["v", plugin.version, " \u00B7 ", plugin.trustTier, plugin.update && _jsxs(_Fragment, { children: [" \u00B7 Update: ", plugin.update.latestVersion] })] })] }), _jsxs("div", { className: "font-head text-foreground flex min-w-0 flex-1 items-center gap-1.5 truncate text-sm", children: [plugin.displayName, plugin.source === 'local' && (_jsx(Badge, { variant: "default", size: "sm", className: "align-middle", children: "DEV" })), !plugin.sdkVersion && (_jsxs(Tooltip, { children: [_jsx(Tooltip.Trigger, { asChild: true, children: _jsx(Badge, { variant: "outline", size: "sm", className: "border-accent bg-accent/10 text-accent-foreground align-middle", children: "SDK" }) }), _jsx(Tooltip.Content, { children: "SDK version mismatch \u2014 rebuild plugin" })] }))] }), _jsx(ChevronDown, { className: "h-4 w-4 shrink-0 transition-transform duration-200" })] }), _jsx("div", { className: "flex shrink-0 items-center px-3", onClick: (e) => e.stopPropagation(), onKeyDown: (e) => {
|
|
45
|
+
if (e.key === 'Enter' || e.key === ' ')
|
|
46
|
+
e.stopPropagation();
|
|
47
|
+
}, role: "presentation", children: _jsx(Switch, { checked: allEnabled, onCheckedChange: handleToggleAll, "aria-label": `Toggle all tools for ${plugin.name}` }) })] }), toggleError && (_jsx(Alert, { status: "error", className: "mx-3 mb-1 px-2 py-1 text-[11px]", children: toggleError })), _jsxs(Accordion.Content, { className: "border-border border-t", children: [toolFilter && (_jsxs("div", { className: "text-muted-foreground mb-1 px-3 pt-2 text-xs", children: [visibleTools.length, " of ", plugin.tools.length, " tools"] })), visibleTools.map(tool => (_jsx(ToolRow, { name: tool.name, displayName: tool.displayName, description: tool.description, icon: tool.icon, enabled: tool.enabled, active: activeTools.has(`${plugin.name}:${tool.name}`), onToggle: () => handleToggleTool(tool.name, tool.enabled) }, tool.name)))] })] }));
|
|
48
|
+
};
|
|
49
|
+
export { PluginCard };
|
|
50
|
+
//# sourceMappingURL=PluginCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginCard.js","sourceRoot":"","sources":["../../../src/side-panel/components/PluginCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { TabState } from '@opentabs-dev/shared';
|
|
2
|
+
declare const AVATAR_PALETTE_SIZE = 10;
|
|
3
|
+
/** djb2 string hash to unsigned 32-bit integer. */
|
|
4
|
+
declare const hashString: (str: string) => number;
|
|
5
|
+
/** Returns a CSS variable reference for the deterministic avatar color. */
|
|
6
|
+
declare const getAvatarVar: (pluginName: string) => string;
|
|
7
|
+
/** Extracts the display letter from the plugin's displayName, falling back to name. */
|
|
8
|
+
declare const getAvatarLetter: (displayName: string, pluginName: string) => string;
|
|
9
|
+
interface PluginIconProps {
|
|
10
|
+
pluginName: string;
|
|
11
|
+
displayName: string;
|
|
12
|
+
tabState?: TabState;
|
|
13
|
+
hasUpdate?: boolean;
|
|
14
|
+
size?: number;
|
|
15
|
+
className?: string;
|
|
16
|
+
iconSvg?: string;
|
|
17
|
+
iconInactiveSvg?: string;
|
|
18
|
+
}
|
|
19
|
+
declare const PluginIcon: ({ pluginName, displayName, tabState, hasUpdate, size, className, iconSvg, iconInactiveSvg, }: PluginIconProps) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export { AVATAR_PALETTE_SIZE, getAvatarLetter, getAvatarVar, hashString, PluginIcon };
|
|
21
|
+
//# sourceMappingURL=PluginIcon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginIcon.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/PluginIcon.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,QAAA,MAAM,mBAAmB,KAAK,CAAC;AAE/B,mDAAmD;AACnD,QAAA,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,MAMjC,CAAC;AAEF,2EAA2E;AAC3E,QAAA,MAAM,YAAY,GAAI,YAAY,MAAM,KAAG,MAC8B,CAAC;AAE1E,uFAAuF;AACvF,QAAA,MAAM,eAAe,GAAI,aAAa,MAAM,EAAE,YAAY,MAAM,KAAG,MACX,CAAC;AAEzD,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAuCD,QAAA,MAAM,UAAU,GAAI,8FASjB,eAAe,4CAuCjB,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { sanitizeSvg } from '../../sanitize-svg.js';
|
|
3
|
+
import { ArrowUp } from 'lucide-react';
|
|
4
|
+
const AVATAR_PALETTE_SIZE = 10;
|
|
5
|
+
/** djb2 string hash to unsigned 32-bit integer. */
|
|
6
|
+
const hashString = (str) => {
|
|
7
|
+
let hash = 5381;
|
|
8
|
+
for (let i = 0; i < str.length; i++) {
|
|
9
|
+
hash = (hash * 33) ^ str.charCodeAt(i);
|
|
10
|
+
}
|
|
11
|
+
return hash >>> 0;
|
|
12
|
+
};
|
|
13
|
+
/** Returns a CSS variable reference for the deterministic avatar color. */
|
|
14
|
+
const getAvatarVar = (pluginName) => `var(--avatar-${String(hashString(pluginName) % AVATAR_PALETTE_SIZE)})`;
|
|
15
|
+
/** Extracts the display letter from the plugin's displayName, falling back to name. */
|
|
16
|
+
const getAvatarLetter = (displayName, pluginName) => (displayName[0] ?? pluginName[0] ?? '?').toUpperCase();
|
|
17
|
+
/**
|
|
18
|
+
* Priority-based status indicator positioned at the bottom-right of the icon.
|
|
19
|
+
* Priority: closed = nothing, unavailable = yellow dot, ready+update = ArrowUp icon, ready = green dot.
|
|
20
|
+
*/
|
|
21
|
+
const StatusIndicator = ({ tabState, hasUpdate, size }) => {
|
|
22
|
+
if (tabState === 'closed')
|
|
23
|
+
return null;
|
|
24
|
+
const dotSize = Math.max(8, Math.round(size * 0.3));
|
|
25
|
+
if (tabState === 'unavailable') {
|
|
26
|
+
return (_jsx("div", { className: "bg-primary border-card absolute rounded-full border-2", style: { width: dotSize, height: dotSize, bottom: -2, right: -2 } }));
|
|
27
|
+
}
|
|
28
|
+
if (hasUpdate) {
|
|
29
|
+
const iconSize = Math.max(6, Math.round(dotSize * 0.6));
|
|
30
|
+
return (_jsx("div", { className: "bg-accent border-card absolute flex items-center justify-center rounded-full border-2", style: { width: dotSize, height: dotSize, bottom: -2, right: -2 }, children: _jsx(ArrowUp, { className: "text-accent-foreground", style: { width: iconSize, height: iconSize }, strokeWidth: 3 }) }));
|
|
31
|
+
}
|
|
32
|
+
return (_jsx("div", { className: "bg-success border-card absolute rounded-full border-2", style: { width: dotSize, height: dotSize, bottom: -2, right: -2 } }));
|
|
33
|
+
};
|
|
34
|
+
const PluginIcon = ({ pluginName, displayName, tabState = 'closed', hasUpdate = false, size = 32, className = '', iconSvg, iconInactiveSvg, }) => {
|
|
35
|
+
const isReady = tabState === 'ready';
|
|
36
|
+
const hasSvg = !!iconSvg;
|
|
37
|
+
const rawSvg = isReady ? iconSvg : iconInactiveSvg;
|
|
38
|
+
const svgToRender = rawSvg ? sanitizeSvg(rawSvg) : undefined;
|
|
39
|
+
const innerSize = Math.round(size * 0.6);
|
|
40
|
+
if (hasSvg && svgToRender) {
|
|
41
|
+
return (_jsxs("div", { className: `relative shrink-0 ${className}`, style: { width: size, height: size }, children: [_jsx("div", { className: "border-border flex h-full w-full items-center justify-center rounded border-2", style: { width: size, height: size }, children: _jsx("div", { className: "overflow-hidden", style: { width: innerSize, height: innerSize }, dangerouslySetInnerHTML: { __html: svgToRender } }) }), _jsx(StatusIndicator, { tabState: tabState, hasUpdate: hasUpdate, size: size })] }));
|
|
42
|
+
}
|
|
43
|
+
const letter = getAvatarLetter(displayName, pluginName);
|
|
44
|
+
const fontSize = Math.round(size * 0.55);
|
|
45
|
+
return (_jsxs("div", { className: `relative shrink-0 ${className}`, style: { width: size, height: size }, children: [_jsx("div", { className: "border-border flex h-full w-full items-center justify-center rounded border-2", style: { width: size, height: size, backgroundColor: getAvatarVar(pluginName) }, children: _jsx("span", { className: "font-head leading-none text-white select-none", style: { fontSize, letterSpacing: '-0.02em' }, children: letter }) }), _jsx(StatusIndicator, { tabState: tabState, hasUpdate: hasUpdate, size: size })] }));
|
|
46
|
+
};
|
|
47
|
+
export { AVATAR_PALETTE_SIZE, getAvatarLetter, getAvatarVar, hashString, PluginIcon };
|
|
48
|
+
//# sourceMappingURL=PluginIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginIcon.js","sourceRoot":"","sources":["../../../src/side-panel/components/PluginIcon.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FailedPluginState, PluginState } from '../bridge.js';
|
|
2
|
+
import type { Dispatch, SetStateAction } from 'react';
|
|
3
|
+
declare const PluginList: ({ plugins, failedPlugins, activeTools, setPlugins, toolFilter, }: {
|
|
4
|
+
plugins: PluginState[];
|
|
5
|
+
failedPlugins: FailedPluginState[];
|
|
6
|
+
activeTools: Set<string>;
|
|
7
|
+
setPlugins: Dispatch<SetStateAction<PluginState[]>>;
|
|
8
|
+
toolFilter: string;
|
|
9
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export { PluginList };
|
|
11
|
+
//# sourceMappingURL=PluginList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginList.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/PluginList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEtD,QAAA,MAAM,UAAU,GAAI,kEAMjB;IACD,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACpD,UAAU,EAAE,MAAM,CAAC;CACpB,4CAoCA,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { FailedPluginCard } from './FailedPluginCard.js';
|
|
3
|
+
import { PluginCard } from './PluginCard.js';
|
|
4
|
+
import { Accordion } from './retro/Accordion.js';
|
|
5
|
+
import { matchesTool } from '../bridge.js';
|
|
6
|
+
const PluginList = ({ plugins, failedPlugins, activeTools, setPlugins, toolFilter, }) => {
|
|
7
|
+
const filterLower = toolFilter.toLowerCase();
|
|
8
|
+
const visiblePlugins = filterLower ? plugins.filter(p => p.tools.some(t => matchesTool(t, filterLower))) : plugins;
|
|
9
|
+
// Hide failed plugins when filtering tools
|
|
10
|
+
const visibleFailed = filterLower ? [] : failedPlugins;
|
|
11
|
+
if (filterLower && visiblePlugins.length === 0) {
|
|
12
|
+
return (_jsxs("div", { className: "text-muted-foreground py-8 text-center text-sm", children: ["No tools matching \u201C", toolFilter, "\u201D"] }));
|
|
13
|
+
}
|
|
14
|
+
return (_jsxs(_Fragment, { children: [visibleFailed.length > 0 && (_jsx("div", { className: "mb-3 space-y-2", children: visibleFailed.map(fp => (_jsx(FailedPluginCard, { plugin: fp }, fp.specifier))) })), _jsx(Accordion, { type: "multiple", className: "space-y-2", children: visiblePlugins.map(plugin => (_jsx(PluginCard, { plugin: plugin, activeTools: activeTools, setPlugins: setPlugins, toolFilter: toolFilter }, plugin.name))) })] }));
|
|
15
|
+
};
|
|
16
|
+
export { PluginList };
|
|
17
|
+
//# sourceMappingURL=PluginList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginList.js","sourceRoot":"","sources":["../../../src/side-panel/components/PluginList.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAI3C,MAAM,UAAU,GAAG,CAAC,EAClB,OAAO,EACP,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,GAOX,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IAE7C,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEnH,2CAA2C;IAC3C,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;IAEvD,IAAI,WAAW,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,CACL,eAAK,SAAS,EAAC,gDAAgD,yCAA2B,UAAU,cAAc,CACnH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,8BACG,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAC3B,cAAK,SAAS,EAAC,gBAAgB,YAC5B,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CACvB,KAAC,gBAAgB,IAAoB,MAAM,EAAE,EAAE,IAAxB,EAAE,CAAC,SAAS,CAAgB,CACpD,CAAC,GACE,CACP,EACD,KAAC,SAAS,IAAC,IAAI,EAAC,UAAU,EAAC,SAAS,EAAC,WAAW,YAC7C,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAC5B,KAAC,UAAU,IAET,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,IAJjB,MAAM,CAAC,IAAI,CAKhB,CACH,CAAC,GACQ,IACX,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolIcon.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/ToolIcon.tsx"],"names":[],"mappings":"AAKA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,QAAA,MAAM,QAAQ,GAAI,qBAA0B,aAAa,4CAWxD,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Wrench } from 'lucide-react';
|
|
3
|
+
import { DynamicIcon } from 'lucide-react/dynamic';
|
|
4
|
+
import { Suspense } from 'react';
|
|
5
|
+
const FallbackIcon = () => _jsx(Wrench, { className: "text-muted-foreground h-3 w-3" });
|
|
6
|
+
const ToolIcon = ({ icon, className = '' }) => (_jsx("div", { className: `border-border bg-muted/50 flex h-6 w-6 shrink-0 items-center justify-center rounded border-2 ${className}`, children: icon ? (_jsx(Suspense, { fallback: _jsx(FallbackIcon, {}), children: _jsx(DynamicIcon, { name: icon, className: "text-muted-foreground h-3 w-3", fallback: FallbackIcon }) })) : (_jsx(FallbackIcon, {})) }));
|
|
7
|
+
export { ToolIcon };
|
|
8
|
+
//# sourceMappingURL=ToolIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolIcon.js","sourceRoot":"","sources":["../../../src/side-panel/components/ToolIcon.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQjC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,IAAC,SAAS,EAAC,+BAA+B,GAAG,CAAC;AAEhF,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,EAAiB,EAAE,EAAE,CAAC,CAC5D,cACE,SAAS,EAAE,gGAAgG,SAAS,EAAE,YACrH,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,YAAY,KAAG,YAClC,KAAC,WAAW,IAAC,IAAI,EAAE,IAAgB,EAAE,SAAS,EAAC,+BAA+B,EAAC,QAAQ,EAAE,YAAY,GAAI,GAChG,CACZ,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,KAAG,CACjB,GACG,CACP,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const ToolRow: ({ name, displayName, description, icon, enabled, active, onToggle, }: {
|
|
2
|
+
name: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
description: string;
|
|
5
|
+
icon: string;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
active: boolean;
|
|
8
|
+
onToggle: () => void;
|
|
9
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export { ToolRow };
|
|
11
|
+
//# sourceMappingURL=ToolRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolRow.d.ts","sourceRoot":"","sources":["../../../src/side-panel/components/ToolRow.tsx"],"names":[],"mappings":"AAKA,QAAA,MAAM,OAAO,GAAI,sEAQd;IACD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,4CAsBA,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Loader } from './retro/Loader.js';
|
|
3
|
+
import { Switch } from './retro/Switch.js';
|
|
4
|
+
import { Tooltip } from './retro/Tooltip.js';
|
|
5
|
+
import { ToolIcon } from './ToolIcon.js';
|
|
6
|
+
const ToolRow = ({ name, displayName, description, icon, enabled, active, onToggle, }) => (_jsxs("div", { className: `border-border hover:bg-muted/50 flex items-center gap-2 border-b px-3 py-2 transition-colors last:border-b-0 ${active ? 'bg-accent/20' : ''}`, children: [_jsx(ToolIcon, { icon: icon }), _jsxs(Tooltip, { children: [_jsx(Tooltip.Trigger, { asChild: true, children: _jsx("div", { className: "min-w-0 flex-1", children: _jsx("div", { className: "text-foreground truncate text-[13px]", children: displayName }) }) }), _jsx(Tooltip.Content, { children: description })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [active && _jsx(Loader, { size: "sm", count: 2, duration: 0.4, delayStep: 80 }), _jsx(Switch, { checked: enabled, onCheckedChange: () => onToggle(), onClick: (e) => e.stopPropagation(), "aria-label": `Toggle ${name} tool` })] })] }));
|
|
7
|
+
export { ToolRow };
|
|
8
|
+
//# sourceMappingURL=ToolRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolRow.js","sourceRoot":"","sources":["../../../src/side-panel/components/ToolRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,GAAG,CAAC,EACf,IAAI,EACJ,WAAW,EACX,WAAW,EACX,IAAI,EACJ,OAAO,EACP,MAAM,EACN,QAAQ,GAST,EAAE,EAAE,CAAC,CACJ,eACE,SAAS,EAAE,gHAAgH,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,aACzJ,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,GAAI,EACxB,MAAC,OAAO,eACN,KAAC,OAAO,CAAC,OAAO,IAAC,OAAO,kBACtB,cAAK,SAAS,EAAC,gBAAgB,YAC7B,cAAK,SAAS,EAAC,sCAAsC,YAAE,WAAW,GAAO,GACrE,GACU,EAClB,KAAC,OAAO,CAAC,OAAO,cAAE,WAAW,GAAmB,IACxC,EACV,eAAK,SAAS,EAAC,kCAAkC,aAC9C,MAAM,IAAI,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,GAAI,EACvE,KAAC,MAAM,IACL,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,EACjC,OAAO,EAAE,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,gBACzC,UAAU,IAAI,OAAO,GACjC,IACE,IACF,CACP,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
|