@sqlrooms/room-shell 0.28.0-rc.0 → 0.28.0

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.
@@ -38,5 +38,8 @@ export declare const RoomShell: typeof RoomShellBase & {
38
38
  LoadingProgress: FC<{
39
39
  className?: string;
40
40
  }>;
41
+ CommandPalette: (({ isOpen: controlledOpen, defaultOpen, onOpenChange, placeholder, emptyMessage, enableKeyboardShortcut, }: import("./RoomShellCommandPalette").RoomShellCommandPaletteProps) => import("react/jsx-runtime").JSX.Element) & {
42
+ Button: ({ className, icon: Icon, iconClassName, tooltip, variant, size, onClick, ...buttonProps }: import("./RoomShellCommandPalette").RoomShellCommandPaletteButtonProps) => import("react/jsx-runtime").JSX.Element;
43
+ };
41
44
  };
42
45
  //# sourceMappingURL=RoomShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShell.d.ts","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAwB,MAAM,OAAO,CAAC;AAMnE,OAAO,EAAC,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AAEvE,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,CAAC,2CAaD;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,CAenE,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAmDA,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAcpD,CAAC;AAEF,eAAO,MAAM,SAAS;;oBAzFsC,MAAM;;;;;;;;qBAzBnD,CAAC;;;;;;;;oBA2CF,MAAM;wBACF,MAAM;;;oBAsDsB,MAAM;;CAsBlD,CAAC"}
1
+ {"version":3,"file":"RoomShell.d.ts","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAwB,MAAM,OAAO,CAAC;AAOnE,OAAO,EAAC,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AAEvE,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,CAAC,2CAaD;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,CAenE,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAmDA,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAcpD,CAAC;AAEF,eAAO,MAAM,SAAS;;oBAzFsC,MAAM;;;;;;;;qBA5BjE,CAAC;;;;;;;;oBA8CY,MAAM;wBACF,MAAM;;;oBAsDsB,MAAM;;;;;CAuBlD,CAAC"}
package/dist/RoomShell.js CHANGED
@@ -3,13 +3,14 @@ import { MosaicLayout } from '@sqlrooms/layout';
3
3
  import { RoomStateProvider } from '@sqlrooms/room-store';
4
4
  import { cn, ErrorBoundary, ProgressModal, SpinnerPane, Toaster, TooltipProvider, } from '@sqlrooms/ui';
5
5
  import { Suspense, useCallback } from 'react';
6
+ import { RoomShellCommandPalette } from './RoomShellCommandPalette';
6
7
  import { RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
7
8
  import { useBaseRoomShellStore } from './RoomShellSlice';
8
9
  export function RoomShellBase({ className, children, roomStore, }) {
9
10
  return (_jsx(RoomStateProvider, { roomStore: roomStore, children: _jsx("div", { className: cn('flex h-full w-full', className), children: _jsx(ErrorBoundary, { children: _jsxs(Suspense, { fallback: _jsx(SpinnerPane, { h: "100%" }), children: [_jsx(TooltipProvider, { children: children }), _jsx(Toaster, {})] }) }) }) }));
10
11
  }
11
12
  export const RoomSidebar = ({ className, children, }) => {
12
- return (_jsxs("div", { className: cn('bg-muted/70 flex h-full w-12 flex-col items-center px-1 py-4', className), children: [_jsx(RoomShellSidebarButtons, {}), children] }));
13
+ return (_jsxs("div", { className: cn('bg-muted/70 flex h-full w-12 flex-col items-center gap-2 px-1 py-4', className), children: [_jsx(RoomShellSidebarButtons, {}), children] }));
13
14
  };
14
15
  export const LayoutComposer = ({ className, tileClassName }) => {
15
16
  const layout = useBaseRoomShellStore((state) => state.layout.config);
@@ -44,5 +45,6 @@ export const RoomShell = Object.assign(RoomShellBase, {
44
45
  SidebarButtons: RoomShellSidebarButtons,
45
46
  LayoutComposer: LayoutComposer,
46
47
  LoadingProgress: LoadingProgress,
48
+ CommandPalette: RoomShellCommandPalette,
47
49
  });
48
50
  //# sourceMappingURL=RoomShell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShell.js","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"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","sourcesContent":["import {MosaicLayout} from '@sqlrooms/layout';\nimport {RoomStateProvider} from '@sqlrooms/room-store';\nimport {\n cn,\n ErrorBoundary,\n ProgressModal,\n SpinnerPane,\n Toaster,\n TooltipProvider,\n} from '@sqlrooms/ui';\nimport {FC, PropsWithChildren, Suspense, useCallback} from 'react';\nimport {MosaicNode} from 'react-mosaic-component';\nimport {\n RoomShellSidebarButtons,\n SidebarButton,\n} from './RoomShellSidebarButtons';\nimport {RoomShellStore, useBaseRoomShellStore} from './RoomShellSlice';\n\nexport function RoomShellBase({\n className,\n children,\n roomStore,\n}: React.PropsWithChildren<{\n className?: string;\n roomStore?: RoomShellStore;\n}>) {\n return (\n <RoomStateProvider roomStore={roomStore}>\n <div className={cn('flex h-full w-full', className)}>\n <ErrorBoundary>\n <Suspense fallback={<SpinnerPane h=\"100%\" />}>\n <TooltipProvider>{children}</TooltipProvider>\n <Toaster />\n </Suspense>\n </ErrorBoundary>\n </div>\n </RoomStateProvider>\n );\n}\n\nexport const RoomSidebar: FC<PropsWithChildren<{className?: string}>> = ({\n className,\n children,\n}) => {\n return (\n <div\n className={cn(\n 'bg-muted/70 flex h-full w-12 flex-col items-center px-1 py-4',\n className,\n )}\n >\n <RoomShellSidebarButtons />\n {children}\n </div>\n );\n};\n\nexport const LayoutComposer: FC<{\n className?: string;\n tileClassName?: string;\n}> = ({className, tileClassName}) => {\n const layout = useBaseRoomShellStore((state) => state.layout.config);\n const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const ErrorBoundary = useBaseRoomShellStore(\n (state) => state.room.CustomErrorBoundary,\n );\n\n const handleLayoutChange = useCallback(\n (nodes: MosaicNode<string> | null) => {\n // Keep layout properties, e.g. 'pinned' and 'fixed'\n setLayout({...layout, nodes});\n },\n [setLayout, layout],\n );\n\n // const visibleRoomPanels = useMemo(\n // () => getVisibleMosaicLayoutPanels(layout?.nodes),\n // [layout],\n // );\n\n const renderTile = (panelId: string) => {\n // const panelId = visibleRoomPanels.find((p) => p === id);\n const PanelComp = panelId && panels[panelId]?.component;\n if (!PanelComp) {\n return <></>;\n }\n return (\n <ErrorBoundary key={panelId}>\n <PanelComp />\n </ErrorBoundary>\n );\n };\n\n return (\n <div\n className={cn(\n 'flex h-full w-full grow flex-col items-stretch',\n className,\n )}\n >\n {layout ? (\n <MosaicLayout\n renderTile={renderTile}\n value={layout.nodes}\n onChange={handleLayoutChange}\n tileClassName={tileClassName}\n />\n ) : null}\n </div>\n );\n};\n\nexport const LoadingProgress: FC<{className?: string}> = ({className}) => {\n const loadingProgress = useBaseRoomShellStore((state) =>\n state.room.getLoadingProgress(),\n );\n return (\n <ProgressModal\n className={className}\n isOpen={loadingProgress !== undefined}\n title=\"Loading\"\n loadingStage={loadingProgress?.message}\n indeterminate={true}\n // progress={loadingProgress?.progress}\n />\n );\n};\n\nexport const RoomShell = Object.assign(RoomShellBase, {\n Sidebar: RoomSidebar,\n SidebarButton: SidebarButton,\n SidebarButtons: RoomShellSidebarButtons,\n LayoutComposer: LayoutComposer,\n LoadingProgress: LoadingProgress,\n});\n"]}
1
+ {"version":3,"file":"RoomShell.js","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"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","sourcesContent":["import {MosaicLayout} from '@sqlrooms/layout';\nimport {RoomStateProvider} from '@sqlrooms/room-store';\nimport {\n cn,\n ErrorBoundary,\n ProgressModal,\n SpinnerPane,\n Toaster,\n TooltipProvider,\n} from '@sqlrooms/ui';\nimport {FC, PropsWithChildren, Suspense, useCallback} from 'react';\nimport {MosaicNode} from 'react-mosaic-component';\nimport {RoomShellCommandPalette} from './RoomShellCommandPalette';\nimport {\n RoomShellSidebarButtons,\n SidebarButton,\n} from './RoomShellSidebarButtons';\nimport {RoomShellStore, useBaseRoomShellStore} from './RoomShellSlice';\n\nexport function RoomShellBase({\n className,\n children,\n roomStore,\n}: React.PropsWithChildren<{\n className?: string;\n roomStore?: RoomShellStore;\n}>) {\n return (\n <RoomStateProvider roomStore={roomStore}>\n <div className={cn('flex h-full w-full', className)}>\n <ErrorBoundary>\n <Suspense fallback={<SpinnerPane h=\"100%\" />}>\n <TooltipProvider>{children}</TooltipProvider>\n <Toaster />\n </Suspense>\n </ErrorBoundary>\n </div>\n </RoomStateProvider>\n );\n}\n\nexport const RoomSidebar: FC<PropsWithChildren<{className?: string}>> = ({\n className,\n children,\n}) => {\n return (\n <div\n className={cn(\n 'bg-muted/70 flex h-full w-12 flex-col items-center gap-2 px-1 py-4',\n className,\n )}\n >\n <RoomShellSidebarButtons />\n {children}\n </div>\n );\n};\n\nexport const LayoutComposer: FC<{\n className?: string;\n tileClassName?: string;\n}> = ({className, tileClassName}) => {\n const layout = useBaseRoomShellStore((state) => state.layout.config);\n const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const ErrorBoundary = useBaseRoomShellStore(\n (state) => state.room.CustomErrorBoundary,\n );\n\n const handleLayoutChange = useCallback(\n (nodes: MosaicNode<string> | null) => {\n // Keep layout properties, e.g. 'pinned' and 'fixed'\n setLayout({...layout, nodes});\n },\n [setLayout, layout],\n );\n\n // const visibleRoomPanels = useMemo(\n // () => getVisibleMosaicLayoutPanels(layout?.nodes),\n // [layout],\n // );\n\n const renderTile = (panelId: string) => {\n // const panelId = visibleRoomPanels.find((p) => p === id);\n const PanelComp = panelId && panels[panelId]?.component;\n if (!PanelComp) {\n return <></>;\n }\n return (\n <ErrorBoundary key={panelId}>\n <PanelComp />\n </ErrorBoundary>\n );\n };\n\n return (\n <div\n className={cn(\n 'flex h-full w-full grow flex-col items-stretch',\n className,\n )}\n >\n {layout ? (\n <MosaicLayout\n renderTile={renderTile}\n value={layout.nodes}\n onChange={handleLayoutChange}\n tileClassName={tileClassName}\n />\n ) : null}\n </div>\n );\n};\n\nexport const LoadingProgress: FC<{className?: string}> = ({className}) => {\n const loadingProgress = useBaseRoomShellStore((state) =>\n state.room.getLoadingProgress(),\n );\n return (\n <ProgressModal\n className={className}\n isOpen={loadingProgress !== undefined}\n title=\"Loading\"\n loadingStage={loadingProgress?.message}\n indeterminate={true}\n // progress={loadingProgress?.progress}\n />\n );\n};\n\nexport const RoomShell = Object.assign(RoomShellBase, {\n Sidebar: RoomSidebar,\n SidebarButton: SidebarButton,\n SidebarButtons: RoomShellSidebarButtons,\n LayoutComposer: LayoutComposer,\n LoadingProgress: LoadingProgress,\n CommandPalette: RoomShellCommandPalette,\n});\n"]}
@@ -0,0 +1,24 @@
1
+ import { Button } from '@sqlrooms/ui';
2
+ import { ComponentProps, ComponentType } from 'react';
3
+ export type RoomShellCommandPaletteProps = {
4
+ isOpen?: boolean;
5
+ defaultOpen?: boolean;
6
+ onOpenChange?: (open: boolean) => void;
7
+ placeholder?: string;
8
+ emptyMessage?: string;
9
+ enableKeyboardShortcut?: boolean;
10
+ };
11
+ declare function RoomShellCommandPaletteBase({ isOpen: controlledOpen, defaultOpen, onOpenChange, placeholder, emptyMessage, enableKeyboardShortcut, }: RoomShellCommandPaletteProps): import("react/jsx-runtime").JSX.Element;
12
+ export type RoomShellCommandPaletteButtonProps = Omit<ComponentProps<typeof Button>, 'children'> & {
13
+ icon?: ComponentType<{
14
+ className?: string;
15
+ }>;
16
+ iconClassName?: string;
17
+ tooltip?: string;
18
+ };
19
+ declare function RoomShellCommandPaletteButton({ className, icon: Icon, iconClassName, tooltip, variant, size, onClick, ...buttonProps }: RoomShellCommandPaletteButtonProps): import("react/jsx-runtime").JSX.Element;
20
+ export declare const RoomShellCommandPalette: typeof RoomShellCommandPaletteBase & {
21
+ Button: typeof RoomShellCommandPaletteButton;
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=RoomShellCommandPalette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomShellCommandPalette.d.ts","sourceRoot":"","sources":["../src/RoomShellCommandPalette.tsx"],"names":[],"mappings":"AAYA,OAAO,EACL,MAAM,EAkBP,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,cAAc,EACd,aAAa,EAMd,MAAM,OAAO,CAAC;AAKf,MAAM,MAAM,4BAA4B,GAAG;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AA8CF,iBAAS,2BAA2B,CAAC,EACnC,MAAM,EAAE,cAAc,EACtB,WAAmB,EACnB,YAAY,EACZ,WAA2C,EAC3C,YAAmC,EACnC,sBAA6B,GAC9B,EAAE,4BAA4B,2CAiX9B;AAED,MAAM,MAAM,kCAAkC,GAAG,IAAI,CACnD,cAAc,CAAC,OAAO,MAAM,CAAC,EAC7B,UAAU,CACX,GAAG;IACF,IAAI,CAAC,EAAE,aAAa,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,iBAAS,6BAA6B,CAAC,EACrC,SAAS,EACT,IAAI,EAAE,IAAkB,EACxB,aAAa,EACb,OAAO,EACP,OAAiB,EACjB,IAAa,EACb,OAAO,EACP,GAAG,WAAW,EACf,EAAE,kCAAkC,2CAyBpC;AAED,eAAO,MAAM,uBAAuB;;CAKnC,CAAC"}
@@ -0,0 +1,394 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { JsonMonacoEditor } from '@sqlrooms/monaco-editor';
3
+ import { createRoomCommandExecutionContext, doesCommandRequireInput, exportCommandInputSchema, getCommandInputComponent, getCommandShortcut, useRoomStoreApi, } from '@sqlrooms/room-store';
4
+ import { Button, cn, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandShortcut, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Tooltip, TooltipContent, TooltipTrigger, } from '@sqlrooms/ui';
5
+ import { isMacOS } from '@sqlrooms/utils';
6
+ import { CommandIcon } from 'lucide-react';
7
+ import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
8
+ import { useBaseRoomShellStore } from './RoomShellSlice';
9
+ const GENERAL_COMMAND_GROUP = 'General';
10
+ const MONACO_MARKER_SEVERITY_ERROR = 8;
11
+ const commandPaletteControlListeners = new Set();
12
+ function subscribeToCommandPaletteControl(listener) {
13
+ commandPaletteControlListeners.add(listener);
14
+ return () => {
15
+ commandPaletteControlListeners.delete(listener);
16
+ };
17
+ }
18
+ function requestCommandPaletteControl(action) {
19
+ for (const listener of commandPaletteControlListeners) {
20
+ listener(action);
21
+ }
22
+ }
23
+ function RoomShellCommandPaletteBase({ isOpen: controlledOpen, defaultOpen = false, onOpenChange, placeholder = 'Type a command or search...', emptyMessage = 'No commands found.', enableKeyboardShortcut = true, }) {
24
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
25
+ const [activeInputCommandId, setActiveInputCommandId] = useState();
26
+ const [inputJsonValue, setInputJsonValue] = useState('{}');
27
+ const [inputError, setInputError] = useState();
28
+ const [hasJsonValidationErrors, setHasJsonValidationErrors] = useState(false);
29
+ const [isSubmittingInput, setIsSubmittingInput] = useState(false);
30
+ const isOpen = controlledOpen ?? uncontrolledOpen;
31
+ const isOpenRef = useRef(isOpen);
32
+ const commandInputEditorPathPrefixRef = useRef(`inmemory://sqlrooms/command-input/${Math.random().toString(36).slice(2)}`);
33
+ const roomStore = useRoomStoreApi();
34
+ const commandRegistry = useBaseRoomShellStore((state) => state.commands.registry);
35
+ const commandContext = useMemo(() => createRoomCommandExecutionContext(roomStore, { surface: 'palette' }), [roomStore]);
36
+ const commands = useMemo(() => {
37
+ const nextCommands = [];
38
+ for (const command of Object.values(commandRegistry)) {
39
+ if (!resolveCommandVisibility(command, commandContext)) {
40
+ continue;
41
+ }
42
+ nextCommands.push({
43
+ ...command,
44
+ enabled: resolveCommandEnabled(command, commandContext),
45
+ });
46
+ }
47
+ nextCommands.sort((first, second) => first.name.localeCompare(second.name));
48
+ return nextCommands;
49
+ }, [commandContext, commandRegistry]);
50
+ const groupedCommands = useMemo(() => {
51
+ const groups = new Map();
52
+ for (const command of commands) {
53
+ const groupName = command.group ?? GENERAL_COMMAND_GROUP;
54
+ const existingGroup = groups.get(groupName);
55
+ if (existingGroup) {
56
+ existingGroup.push(command);
57
+ }
58
+ else {
59
+ groups.set(groupName, [command]);
60
+ }
61
+ }
62
+ return Array.from(groups.entries()).sort(([firstGroup], [secondGroup]) => {
63
+ if (firstGroup === GENERAL_COMMAND_GROUP) {
64
+ return -1;
65
+ }
66
+ if (secondGroup === GENERAL_COMMAND_GROUP) {
67
+ return 1;
68
+ }
69
+ return firstGroup.localeCompare(secondGroup);
70
+ });
71
+ }, [commands]);
72
+ const activeInputCommand = useMemo(() => {
73
+ if (!activeInputCommandId) {
74
+ return undefined;
75
+ }
76
+ return commands.find((command) => command.id === activeInputCommandId);
77
+ }, [activeInputCommandId, commands]);
78
+ const ActiveInputComponent = activeInputCommand
79
+ ? getCommandInputComponent(activeInputCommand)
80
+ : undefined;
81
+ const activeInputCommandJsonSchema = useMemo(() => {
82
+ if (!activeInputCommand?.inputSchema) {
83
+ return undefined;
84
+ }
85
+ const portableInputSchema = exportCommandInputSchema(activeInputCommand.inputSchema);
86
+ const jsonSchema = toJsonSchema(portableInputSchema);
87
+ if (!jsonSchema) {
88
+ return undefined;
89
+ }
90
+ return {
91
+ $schema: 'http://json-schema.org/draft-07/schema#',
92
+ title: activeInputCommand.name,
93
+ ...jsonSchema,
94
+ };
95
+ }, [activeInputCommand]);
96
+ const activeInputEditorPath = useMemo(() => {
97
+ if (!activeInputCommand) {
98
+ return undefined;
99
+ }
100
+ return `${commandInputEditorPathPrefixRef.current}/${encodeURIComponent(activeInputCommand.id)}.json`;
101
+ }, [activeInputCommand]);
102
+ const setPaletteOpen = useCallback((nextOpen) => {
103
+ if (controlledOpen === undefined) {
104
+ setUncontrolledOpen(nextOpen);
105
+ }
106
+ onOpenChange?.(nextOpen);
107
+ }, [controlledOpen, onOpenChange]);
108
+ const onSelectCommand = useCallback(async (command) => {
109
+ if (!command.enabled) {
110
+ return;
111
+ }
112
+ if (getCommandInputComponent(command) ||
113
+ doesCommandRequireInput(command)) {
114
+ setPaletteOpen(false);
115
+ setActiveInputCommandId(command.id);
116
+ setInputJsonValue(createDefaultJsonInputValue(command));
117
+ setInputError(undefined);
118
+ setHasJsonValidationErrors(false);
119
+ return;
120
+ }
121
+ setPaletteOpen(false);
122
+ try {
123
+ await roomStore
124
+ .getState()
125
+ .commands.executeCommand(command.id, undefined, {
126
+ surface: 'palette',
127
+ });
128
+ }
129
+ catch {
130
+ // Errors are already captured by room.captureException.
131
+ }
132
+ }, [roomStore, setPaletteOpen]);
133
+ const closeCommandInputDialog = useCallback(() => {
134
+ if (isSubmittingInput) {
135
+ return;
136
+ }
137
+ setActiveInputCommandId(undefined);
138
+ setInputError(undefined);
139
+ setHasJsonValidationErrors(false);
140
+ }, [isSubmittingInput]);
141
+ const submitCommandInput = useCallback(async (input) => {
142
+ if (!activeInputCommand) {
143
+ return;
144
+ }
145
+ setInputError(undefined);
146
+ setIsSubmittingInput(true);
147
+ try {
148
+ await roomStore
149
+ .getState()
150
+ .commands.executeCommand(activeInputCommand.id, input, {
151
+ surface: 'palette',
152
+ });
153
+ setActiveInputCommandId(undefined);
154
+ }
155
+ catch (error) {
156
+ setInputError(getErrorMessage(error));
157
+ }
158
+ finally {
159
+ setIsSubmittingInput(false);
160
+ }
161
+ }, [activeInputCommand, roomStore]);
162
+ const submitJsonCommandInput = useCallback(async () => {
163
+ if (hasJsonValidationErrors) {
164
+ setInputError('Fix JSON validation errors before running the command.');
165
+ return;
166
+ }
167
+ const trimmedInput = inputJsonValue.trim();
168
+ if (!trimmedInput) {
169
+ await submitCommandInput(undefined);
170
+ return;
171
+ }
172
+ try {
173
+ await submitCommandInput(JSON.parse(trimmedInput));
174
+ }
175
+ catch (error) {
176
+ setInputError(getErrorMessage(error));
177
+ }
178
+ }, [hasJsonValidationErrors, inputJsonValue, submitCommandInput]);
179
+ const handleJsonEditorValidate = useCallback((markers) => {
180
+ const hasErrors = markers.some((marker) => marker.severity === MONACO_MARKER_SEVERITY_ERROR);
181
+ setHasJsonValidationErrors(hasErrors);
182
+ }, []);
183
+ useEffect(() => {
184
+ isOpenRef.current = isOpen;
185
+ }, [isOpen]);
186
+ useEffect(() => {
187
+ if (!enableKeyboardShortcut) {
188
+ return;
189
+ }
190
+ const onKeyDown = (event) => {
191
+ const isCommandPaletteShortcut = (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k';
192
+ if (!isCommandPaletteShortcut) {
193
+ return;
194
+ }
195
+ event.preventDefault();
196
+ setPaletteOpen(!isOpenRef.current);
197
+ };
198
+ // Use capture so this still works when focused widgets (e.g. Monaco)
199
+ // stop propagation during the bubble phase.
200
+ window.addEventListener('keydown', onKeyDown, true);
201
+ return () => {
202
+ window.removeEventListener('keydown', onKeyDown, true);
203
+ };
204
+ }, [enableKeyboardShortcut, setPaletteOpen]);
205
+ useEffect(() => {
206
+ return subscribeToCommandPaletteControl((action) => {
207
+ if (action === 'open') {
208
+ setPaletteOpen(true);
209
+ return;
210
+ }
211
+ if (action === 'close') {
212
+ setPaletteOpen(false);
213
+ return;
214
+ }
215
+ setPaletteOpen(!isOpenRef.current);
216
+ });
217
+ }, [setPaletteOpen]);
218
+ useEffect(() => {
219
+ if (activeInputCommandId && !activeInputCommand && !isSubmittingInput) {
220
+ setActiveInputCommandId(undefined);
221
+ setInputError(undefined);
222
+ }
223
+ }, [activeInputCommand, activeInputCommandId, isSubmittingInput]);
224
+ return (_jsxs(_Fragment, { children: [_jsxs(CommandDialog, { open: isOpen, onOpenChange: setPaletteOpen, children: [_jsx(CommandInput, { placeholder: placeholder }), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: emptyMessage }), groupedCommands.map(([groupName, groupCommands]) => (_jsx(CommandGroup, { heading: groupName, children: groupCommands.map((command) => (_jsxs(CommandItem, { value: getCommandSearchValue(command), disabled: !command.enabled, onSelect: () => {
225
+ void onSelectCommand(command);
226
+ }, children: [_jsxs("div", { className: "flex flex-col", children: [_jsx("span", { children: command.name }), command.description ? (_jsx("span", { className: "text-muted-foreground text-xs", children: command.description })) : null] }), getCommandShortcut(command) ? (_jsx(CommandShortcut, { children: getCommandShortcut(command) })) : null] }, command.id))) }, groupName)))] })] }), _jsx(Dialog, { open: Boolean(activeInputCommand), onOpenChange: (open) => {
227
+ if (!open) {
228
+ closeCommandInputDialog();
229
+ }
230
+ }, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: activeInputCommand?.name ?? 'Command input' }), activeInputCommand?.description ? (_jsx(DialogDescription, { children: activeInputCommand.description })) : null] }), ActiveInputComponent && activeInputCommand ? (_jsx(ActiveInputComponent, { commandId: activeInputCommand.id, commandName: activeInputCommand.name, isSubmitting: isSubmittingInput, error: inputError, onSubmit: (input) => {
231
+ void submitCommandInput(input);
232
+ }, onCancel: closeCommandInputDialog })) : (_jsxs(_Fragment, { children: [_jsx(DialogDescription, { children: activeInputCommand?.inputDescription ??
233
+ 'Provide command input as a JSON value. Example: {"panelId":"sql-editor"}' }), _jsx("div", { className: "relative h-56 w-full rounded-md border", children: _jsx(JsonMonacoEditor, { className: "absolute inset-0 h-full w-full", schema: activeInputCommandJsonSchema, value: inputJsonValue, path: activeInputEditorPath, readOnly: isSubmittingInput, onChange: (value) => {
234
+ setInputJsonValue(value ?? '');
235
+ setInputError(undefined);
236
+ }, onValidate: handleJsonEditorValidate, options: {
237
+ lineNumbers: 'off',
238
+ glyphMargin: false,
239
+ folding: false,
240
+ wordWrap: 'on',
241
+ tabSize: 2,
242
+ fixedOverflowWidgets: false,
243
+ automaticLayout: true,
244
+ } }) }), hasJsonValidationErrors ? (_jsx("p", { className: "text-destructive text-sm", children: "JSON input has syntax or schema validation errors." })) : null, inputError ? (_jsx("p", { className: "text-destructive text-sm", children: inputError })) : null, _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: closeCommandInputDialog, disabled: isSubmittingInput, children: "Cancel" }), _jsx(Button, { onClick: () => {
245
+ void submitJsonCommandInput();
246
+ }, disabled: isSubmittingInput || hasJsonValidationErrors, children: "Run command" })] })] }))] }) })] }));
247
+ }
248
+ function RoomShellCommandPaletteButton({ className, icon: Icon = CommandIcon, iconClassName, tooltip, variant = 'ghost', size = 'icon', onClick, ...buttonProps }) {
249
+ const shortcutText = isMacOS() ? 'Cmd+K' : 'Ctrl+K';
250
+ const tooltipText = tooltip ?? `Open command palette (${shortcutText})`;
251
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: variant, size: size, className: cn(className), onClick: (event) => {
252
+ requestCommandPaletteControl('open');
253
+ onClick?.(event);
254
+ }, "aria-label": "Open command palette", ...buttonProps, children: _jsx(Icon, { className: cn('h-5 w-5', iconClassName) }) }) }), _jsx(TooltipContent, { side: "right", children: tooltipText })] }));
255
+ }
256
+ export const RoomShellCommandPalette = Object.assign(RoomShellCommandPaletteBase, {
257
+ Button: RoomShellCommandPaletteButton,
258
+ });
259
+ function resolveCommandVisibility(command, context) {
260
+ if (command.ui?.hidden) {
261
+ return false;
262
+ }
263
+ if (!command.isVisible) {
264
+ return true;
265
+ }
266
+ try {
267
+ return command.isVisible(context);
268
+ }
269
+ catch (error) {
270
+ context.getState().room.captureException(error);
271
+ return false;
272
+ }
273
+ }
274
+ function resolveCommandEnabled(command, context) {
275
+ if (!command.isEnabled) {
276
+ return true;
277
+ }
278
+ try {
279
+ return command.isEnabled(context);
280
+ }
281
+ catch (error) {
282
+ context.getState().room.captureException(error);
283
+ return false;
284
+ }
285
+ }
286
+ function getCommandSearchValue(command) {
287
+ return [
288
+ command.name,
289
+ command.description,
290
+ command.inputDescription,
291
+ getCommandShortcut(command),
292
+ command.id,
293
+ ...(command.keywords ?? []),
294
+ ]
295
+ .filter((value) => Boolean(value))
296
+ .join(' ');
297
+ }
298
+ function getErrorMessage(error) {
299
+ if (error instanceof Error) {
300
+ return error.message;
301
+ }
302
+ return String(error);
303
+ }
304
+ function createDefaultJsonInputValue(command) {
305
+ const portableInputSchema = exportCommandInputSchema(command.inputSchema);
306
+ const jsonSchema = toJsonSchema(portableInputSchema);
307
+ const inputTemplate = createInputTemplateFromSchema(jsonSchema);
308
+ return safeStringifyJsonValue(inputTemplate ?? {});
309
+ }
310
+ function toJsonSchema(portableSchema) {
311
+ if (!portableSchema) {
312
+ return undefined;
313
+ }
314
+ return portableSchema;
315
+ }
316
+ function createInputTemplateFromSchema(schema) {
317
+ if (!schema) {
318
+ return {};
319
+ }
320
+ if (schema.default !== undefined) {
321
+ return schema.default;
322
+ }
323
+ if (schema.const !== undefined) {
324
+ return schema.const;
325
+ }
326
+ if (schema.enum && schema.enum.length > 0) {
327
+ return schema.enum[0];
328
+ }
329
+ if (schema.anyOf && schema.anyOf.length > 0) {
330
+ for (const variant of schema.anyOf) {
331
+ const value = createInputTemplateFromSchema(variant);
332
+ if (value !== undefined) {
333
+ return value;
334
+ }
335
+ }
336
+ }
337
+ const schemaType = resolveSchemaType(schema.type);
338
+ switch (schemaType) {
339
+ case 'object': {
340
+ const properties = schema.properties ?? {};
341
+ const requiredPropertyNames = new Set(schema.required ?? []);
342
+ const propertyEntries = Object.entries(properties);
343
+ const objectValue = {};
344
+ for (const [propertyName, propertySchema] of propertyEntries) {
345
+ if (requiredPropertyNames.size > 0 &&
346
+ !requiredPropertyNames.has(propertyName)) {
347
+ continue;
348
+ }
349
+ objectValue[propertyName] =
350
+ createInputTemplateFromSchema(propertySchema);
351
+ }
352
+ // If there are no required keys, include the first optional key as a hint.
353
+ if (Object.keys(objectValue).length === 0 &&
354
+ requiredPropertyNames.size === 0 &&
355
+ propertyEntries.length > 0) {
356
+ const firstProperty = propertyEntries[0];
357
+ if (firstProperty) {
358
+ const [firstPropertyName, firstPropertySchema] = firstProperty;
359
+ objectValue[firstPropertyName] =
360
+ createInputTemplateFromSchema(firstPropertySchema);
361
+ }
362
+ }
363
+ return objectValue;
364
+ }
365
+ case 'array':
366
+ return [];
367
+ case 'string':
368
+ return '';
369
+ case 'number':
370
+ case 'integer':
371
+ return 0;
372
+ case 'boolean':
373
+ return false;
374
+ case 'null':
375
+ return null;
376
+ default:
377
+ return {};
378
+ }
379
+ }
380
+ function resolveSchemaType(type) {
381
+ if (Array.isArray(type)) {
382
+ return type.find((variant) => variant !== 'null') ?? type[0];
383
+ }
384
+ return type;
385
+ }
386
+ function safeStringifyJsonValue(value) {
387
+ try {
388
+ return JSON.stringify(value, null, 2);
389
+ }
390
+ catch {
391
+ return '{}';
392
+ }
393
+ }
394
+ //# sourceMappingURL=RoomShellCommandPalette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomShellCommandPalette.js","sourceRoot":"","sources":["../src/RoomShellCommandPalette.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,iCAAiC,EACjC,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAIlB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,MAAM,EACN,EAAE,EACF,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,EAGL,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAsB,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAE5E,MAAM,qBAAqB,GAAG,SAAS,CAAC;AA+BxC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAOvC,MAAM,8BAA8B,GAAG,IAAI,GAAG,EAAiC,CAAC;AAEhF,SAAS,gCAAgC,CACvC,QAAuC;IAEvC,8BAA8B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,OAAO,GAAG,EAAE;QACV,8BAA8B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CAAC,MAAmC;IACvE,KAAK,MAAM,QAAQ,IAAI,8BAA8B,EAAE,CAAC;QACtD,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,EACnC,MAAM,EAAE,cAAc,EACtB,WAAW,GAAG,KAAK,EACnB,YAAY,EACZ,WAAW,GAAG,6BAA6B,EAC3C,YAAY,GAAG,oBAAoB,EACnC,sBAAsB,GAAG,IAAI,GACA;IAC7B,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtE,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,EAAU,CAAC;IAC3E,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,EAAU,CAAC;IACvD,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,cAAc,IAAI,gBAAgB,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,+BAA+B,GAAG,MAAM,CAC5C,qCAAqC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAC3E,CAAC;IACF,MAAM,SAAS,GAAG,eAAe,EAAuB,CAAC;IACzD,MAAM,eAAe,GAAG,qBAAqB,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CACnC,CAAC;IAEF,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC,iCAAiC,CAAC,SAAS,EAAE,EAAC,OAAO,EAAE,SAAS,EAAC,CAAC,EACxE,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,MAAM,YAAY,GAAqB,EAAE,CAAC;QAC1C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;gBACvD,SAAS;YACX,CAAC;YACD,YAAY,CAAC,IAAI,CAAC;gBAChB,GAAG,OAAO;gBACV,OAAO,EAAE,qBAAqB,CAAC,OAAO,EAAE,cAAc,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,OAAO,YAAY,CAAC;IACtB,CAAC,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IAEtC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;QACnD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC;YACzD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE;YACvE,IAAI,UAAU,KAAK,qBAAqB,EAAE,CAAC;gBACzC,OAAO,CAAC,CAAC,CAAC;YACZ,CAAC;YACD,IAAI,WAAW,KAAK,qBAAqB,EAAE,CAAC;gBAC1C,OAAO,CAAC,CAAC;YACX,CAAC;YACD,OAAO,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,oBAAoB,CAAC,CAAC;IACzE,CAAC,EAAE,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrC,MAAM,oBAAoB,GAAG,kBAAkB;QAC7C,CAAC,CAAC,wBAAwB,CAAC,kBAAkB,CAAC;QAC9C,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,EAAE;QAChD,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,mBAAmB,GAAG,wBAAwB,CAClD,kBAAkB,CAAC,WAAW,CAC/B,CAAC;QACF,MAAM,UAAU,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO;YACL,OAAO,EAAE,yCAAyC;YAClD,KAAK,EAAE,kBAAkB,CAAC,IAAI;YAC9B,GAAG,UAAU;SACO,CAAC;IACzB,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACzB,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,EAAE;QACzC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,+BAA+B,CAAC,OAAO,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,EAAE,CAAC,OAAO,CAAC;IACxG,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEzB,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,QAAiB,EAAE,EAAE;QACpB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QACD,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,EACD,CAAC,cAAc,EAAE,YAAY,CAAC,CAC/B,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CACjC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAChC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IACE,wBAAwB,CAAC,OAAO,CAAC;YACjC,uBAAuB,CAAC,OAAO,CAAC,EAChC,CAAC;YACD,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACpC,iBAAiB,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC;YACxD,aAAa,CAAC,SAAS,CAAC,CAAC;YACzB,0BAA0B,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,SAAS;iBACZ,QAAQ,EAAE;iBACV,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE;gBAC9C,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC,EACD,CAAC,SAAS,EAAE,cAAc,CAAC,CAC5B,CAAC;IAEF,MAAM,uBAAuB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/C,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACnC,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,kBAAkB,GAAG,WAAW,CACpC,KAAK,EAAE,KAAc,EAAE,EAAE;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,SAAS;iBACZ,QAAQ,EAAE;iBACV,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,EAAE,KAAK,EAAE;gBACrD,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC;YACL,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,EACD,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAChC,CAAC;IAEF,MAAM,sBAAsB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACpD,IAAI,uBAAuB,EAAE,CAAC;YAC5B,aAAa,CAAC,wDAAwD,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,EAAE,CAAC,uBAAuB,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAElE,MAAM,wBAAwB,GAAG,WAAW,CAAC,CAAC,OAAuB,EAAE,EAAE;QACvE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAC5B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,4BAA4B,CAC7D,CAAC;QACF,0BAA0B,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC7B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAE,EAAE;YACzC,MAAM,wBAAwB,GAC5B,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;YACtE,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,cAAc,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC,CAAC;QAEF,qEAAqE;QACrE,4CAA4C;QAC5C,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACpD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAC,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,gCAAgC,CAAC,CAAC,MAAM,EAAE,EAAE;YACjD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,cAAc,CAAC,KAAK,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,cAAc,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,oBAAoB,IAAI,CAAC,kBAAkB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtE,uBAAuB,CAAC,SAAS,CAAC,CAAC;YACnC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,EAAE,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAElE,OAAO,CACL,8BACE,MAAC,aAAa,IAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,aACvD,KAAC,YAAY,IAAC,WAAW,EAAE,WAAW,GAAI,EAC1C,MAAC,WAAW,eACV,KAAC,YAAY,cAAE,YAAY,GAAgB,EAC1C,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CACnD,KAAC,YAAY,IAAiB,OAAO,EAAE,SAAS,YAC7C,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAC9B,MAAC,WAAW,IAEV,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,EACrC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,EAC1B,QAAQ,EAAE,GAAG,EAAE;wCACb,KAAK,eAAe,CAAC,OAAO,CAAC,CAAC;oCAChC,CAAC,aAED,eAAK,SAAS,EAAC,eAAe,aAC5B,yBAAO,OAAO,CAAC,IAAI,GAAQ,EAC1B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CACrB,eAAM,SAAS,EAAC,+BAA+B,YAC5C,OAAO,CAAC,WAAW,GACf,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAC7B,KAAC,eAAe,cACb,kBAAkB,CAAC,OAAO,CAAC,GACZ,CACnB,CAAC,CAAC,CAAC,IAAI,KAnBH,OAAO,CAAC,EAAE,CAoBH,CACf,CAAC,IAxBe,SAAS,CAyBb,CAChB,CAAC,IACU,IACA,EAEhB,KAAC,MAAM,IACL,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACjC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;oBACrB,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,uBAAuB,EAAE,CAAC;oBAC5B,CAAC;gBACH,CAAC,YAED,MAAC,aAAa,eACZ,MAAC,YAAY,eACX,KAAC,WAAW,cACT,kBAAkB,EAAE,IAAI,IAAI,eAAe,GAChC,EACb,kBAAkB,EAAE,WAAW,CAAC,CAAC,CAAC,CACjC,KAAC,iBAAiB,cACf,kBAAkB,CAAC,WAAW,GACb,CACrB,CAAC,CAAC,CAAC,IAAI,IACK,EAEd,oBAAoB,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAC5C,KAAC,oBAAoB,IACnB,SAAS,EAAE,kBAAkB,CAAC,EAAE,EAChC,WAAW,EAAE,kBAAkB,CAAC,IAAI,EACpC,YAAY,EAAE,iBAAiB,EAC/B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gCAClB,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC;4BACjC,CAAC,EACD,QAAQ,EAAE,uBAAuB,GACjC,CACH,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,iBAAiB,cACf,kBAAkB,EAAE,gBAAgB;wCACnC,0EAA0E,GAC1D,EACpB,cAAK,SAAS,EAAC,wCAAwC,YACrD,KAAC,gBAAgB,IACf,SAAS,EAAC,gCAAgC,EAC1C,MAAM,EAAE,4BAA4B,EACpC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4CAClB,iBAAiB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;4CAC/B,aAAa,CAAC,SAAS,CAAC,CAAC;wCAC3B,CAAC,EACD,UAAU,EAAE,wBAAwB,EACpC,OAAO,EAAE;4CACP,WAAW,EAAE,KAAK;4CAClB,WAAW,EAAE,KAAK;4CAClB,OAAO,EAAE,KAAK;4CACd,QAAQ,EAAE,IAAI;4CACd,OAAO,EAAE,CAAC;4CACV,oBAAoB,EAAE,KAAK;4CAC3B,eAAe,EAAE,IAAI;yCACtB,GACD,GACE,EACL,uBAAuB,CAAC,CAAC,CAAC,CACzB,YAAG,SAAS,EAAC,0BAA0B,mEAEnC,CACL,CAAC,CAAC,CAAC,IAAI,EACP,UAAU,CAAC,CAAC,CAAC,CACZ,YAAG,SAAS,EAAC,0BAA0B,YAAE,UAAU,GAAK,CACzD,CAAC,CAAC,CAAC,IAAI,EACR,MAAC,YAAY,eACX,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,iBAAiB,uBAGpB,EACT,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE;gDACZ,KAAK,sBAAsB,EAAE,CAAC;4CAChC,CAAC,EACD,QAAQ,EAAE,iBAAiB,IAAI,uBAAuB,4BAG/C,IACI,IACd,CACJ,IACa,GACT,IACR,CACJ,CAAC;AACJ,CAAC;AAWD,SAAS,6BAA6B,CAAC,EACrC,SAAS,EACT,IAAI,EAAE,IAAI,GAAG,WAAW,EACxB,aAAa,EACb,OAAO,EACP,OAAO,GAAG,OAAO,EACjB,IAAI,GAAG,MAAM,EACb,OAAO,EACP,GAAG,WAAW,EACqB;IACnC,MAAM,YAAY,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACpD,MAAM,WAAW,GAAG,OAAO,IAAI,yBAAyB,YAAY,GAAG,CAAC;IAExE,OAAO,CACL,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EACxB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;wBACjB,4BAA4B,CAAC,MAAM,CAAC,CAAC;wBACrC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;oBACnB,CAAC,gBACU,sBAAsB,KAC7B,WAAW,YAEf,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,GAAI,GAC1C,GACM,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,OAAO,YAAE,WAAW,GAAkB,IACnD,CACX,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAClD,2BAA2B,EAC3B;IACE,MAAM,EAAE,6BAA6B;CACtC,CACF,CAAC;AAEF,SAAS,wBAAwB,CAC/B,OAA8B,EAC9B,OAAoC;IAEpC,IAAI,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAA8B,EAC9B,OAAoC;IAEpC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,OAA8B;IAC3D,OAAO;QACL,OAAO,CAAC,IAAI;QACZ,OAAO,CAAC,WAAW;QACnB,OAAO,CAAC,gBAAgB;QACxB,kBAAkB,CAAC,OAAO,CAAC;QAC3B,OAAO,CAAC,EAAE;QACV,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;KAC5B;SACE,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,2BAA2B,CAAC,OAA8B;IACjE,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,6BAA6B,CAAC,UAAU,CAAC,CAAC;IAChE,OAAO,sBAAsB,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,YAAY,CACnB,cAA0C;IAE1C,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,cAA4B,CAAC;AACtC,CAAC;AAED,SAAS,6BAA6B,CAAC,MAAmB;IACxD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YAC3C,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC7D,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,WAAW,GAA4B,EAAE,CAAC;YAEhD,KAAK,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,eAAe,EAAE,CAAC;gBAC7D,IACE,qBAAqB,CAAC,IAAI,GAAG,CAAC;oBAC9B,CAAC,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,EACxC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,WAAW,CAAC,YAAY,CAAC;oBACvB,6BAA6B,CAAC,cAAc,CAAC,CAAC;YAClD,CAAC;YAED,2EAA2E;YAC3E,IACE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC;gBACrC,qBAAqB,CAAC,IAAI,KAAK,CAAC;gBAChC,eAAe,CAAC,MAAM,GAAG,CAAC,EAC1B,CAAC;gBACD,MAAM,aAAa,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;gBACzC,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,GAAG,aAAa,CAAC;oBAC/D,WAAW,CAAC,iBAAiB,CAAC;wBAC5B,6BAA6B,CAAC,mBAAmB,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,KAAK,OAAO;YACV,OAAO,EAAE,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC;QACf,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAwB;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import {JsonMonacoEditor} from '@sqlrooms/monaco-editor';\nimport {\n createRoomCommandExecutionContext,\n doesCommandRequireInput,\n exportCommandInputSchema,\n getCommandInputComponent,\n getCommandShortcut,\n RegisteredRoomCommand,\n RoomCommandExecutionContext,\n RoomCommandPortableSchema,\n useRoomStoreApi,\n} from '@sqlrooms/room-store';\nimport {\n Button,\n cn,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandShortcut,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport {isMacOS} from '@sqlrooms/utils';\nimport {CommandIcon} from 'lucide-react';\nimport {\n ComponentProps,\n ComponentType,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {RoomShellSliceState, useBaseRoomShellStore} from './RoomShellSlice';\n\nconst GENERAL_COMMAND_GROUP = 'General';\n\nexport type RoomShellCommandPaletteProps = {\n isOpen?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n placeholder?: string;\n emptyMessage?: string;\n enableKeyboardShortcut?: boolean;\n};\n\ntype PaletteCommand = RegisteredRoomCommand & {\n enabled: boolean;\n};\ntype JsonSchema = {\n $schema?: string;\n title?: string;\n description?: string;\n type?: string | string[];\n enum?: unknown[];\n const?: unknown;\n default?: unknown;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema;\n anyOf?: JsonSchema[];\n};\ntype MonacoMarker = {\n severity: number;\n};\n\nconst MONACO_MARKER_SEVERITY_ERROR = 8;\n\ntype CommandPaletteControlAction = 'open' | 'close' | 'toggle';\ntype CommandPaletteControlListener = (\n action: CommandPaletteControlAction,\n) => void;\n\nconst commandPaletteControlListeners = new Set<CommandPaletteControlListener>();\n\nfunction subscribeToCommandPaletteControl(\n listener: CommandPaletteControlListener,\n) {\n commandPaletteControlListeners.add(listener);\n return () => {\n commandPaletteControlListeners.delete(listener);\n };\n}\n\nfunction requestCommandPaletteControl(action: CommandPaletteControlAction) {\n for (const listener of commandPaletteControlListeners) {\n listener(action);\n }\n}\n\nfunction RoomShellCommandPaletteBase({\n isOpen: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n placeholder = 'Type a command or search...',\n emptyMessage = 'No commands found.',\n enableKeyboardShortcut = true,\n}: RoomShellCommandPaletteProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const [activeInputCommandId, setActiveInputCommandId] = useState<string>();\n const [inputJsonValue, setInputJsonValue] = useState('{}');\n const [inputError, setInputError] = useState<string>();\n const [hasJsonValidationErrors, setHasJsonValidationErrors] = useState(false);\n const [isSubmittingInput, setIsSubmittingInput] = useState(false);\n const isOpen = controlledOpen ?? uncontrolledOpen;\n const isOpenRef = useRef(isOpen);\n const commandInputEditorPathPrefixRef = useRef(\n `inmemory://sqlrooms/command-input/${Math.random().toString(36).slice(2)}`,\n );\n const roomStore = useRoomStoreApi<RoomShellSliceState>();\n const commandRegistry = useBaseRoomShellStore(\n (state) => state.commands.registry,\n );\n\n const commandContext = useMemo(\n () => createRoomCommandExecutionContext(roomStore, {surface: 'palette'}),\n [roomStore],\n );\n\n const commands = useMemo(() => {\n const nextCommands: PaletteCommand[] = [];\n for (const command of Object.values(commandRegistry)) {\n if (!resolveCommandVisibility(command, commandContext)) {\n continue;\n }\n nextCommands.push({\n ...command,\n enabled: resolveCommandEnabled(command, commandContext),\n });\n }\n\n nextCommands.sort((first, second) => first.name.localeCompare(second.name));\n return nextCommands;\n }, [commandContext, commandRegistry]);\n\n const groupedCommands = useMemo(() => {\n const groups = new Map<string, PaletteCommand[]>();\n for (const command of commands) {\n const groupName = command.group ?? GENERAL_COMMAND_GROUP;\n const existingGroup = groups.get(groupName);\n if (existingGroup) {\n existingGroup.push(command);\n } else {\n groups.set(groupName, [command]);\n }\n }\n\n return Array.from(groups.entries()).sort(([firstGroup], [secondGroup]) => {\n if (firstGroup === GENERAL_COMMAND_GROUP) {\n return -1;\n }\n if (secondGroup === GENERAL_COMMAND_GROUP) {\n return 1;\n }\n return firstGroup.localeCompare(secondGroup);\n });\n }, [commands]);\n\n const activeInputCommand = useMemo(() => {\n if (!activeInputCommandId) {\n return undefined;\n }\n return commands.find((command) => command.id === activeInputCommandId);\n }, [activeInputCommandId, commands]);\n const ActiveInputComponent = activeInputCommand\n ? getCommandInputComponent(activeInputCommand)\n : undefined;\n const activeInputCommandJsonSchema = useMemo(() => {\n if (!activeInputCommand?.inputSchema) {\n return undefined;\n }\n const portableInputSchema = exportCommandInputSchema(\n activeInputCommand.inputSchema,\n );\n const jsonSchema = toJsonSchema(portableInputSchema);\n if (!jsonSchema) {\n return undefined;\n }\n return {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: activeInputCommand.name,\n ...jsonSchema,\n } satisfies JsonSchema;\n }, [activeInputCommand]);\n const activeInputEditorPath = useMemo(() => {\n if (!activeInputCommand) {\n return undefined;\n }\n return `${commandInputEditorPathPrefixRef.current}/${encodeURIComponent(activeInputCommand.id)}.json`;\n }, [activeInputCommand]);\n\n const setPaletteOpen = useCallback(\n (nextOpen: boolean) => {\n if (controlledOpen === undefined) {\n setUncontrolledOpen(nextOpen);\n }\n onOpenChange?.(nextOpen);\n },\n [controlledOpen, onOpenChange],\n );\n\n const onSelectCommand = useCallback(\n async (command: PaletteCommand) => {\n if (!command.enabled) {\n return;\n }\n if (\n getCommandInputComponent(command) ||\n doesCommandRequireInput(command)\n ) {\n setPaletteOpen(false);\n setActiveInputCommandId(command.id);\n setInputJsonValue(createDefaultJsonInputValue(command));\n setInputError(undefined);\n setHasJsonValidationErrors(false);\n return;\n }\n setPaletteOpen(false);\n try {\n await roomStore\n .getState()\n .commands.executeCommand(command.id, undefined, {\n surface: 'palette',\n });\n } catch {\n // Errors are already captured by room.captureException.\n }\n },\n [roomStore, setPaletteOpen],\n );\n\n const closeCommandInputDialog = useCallback(() => {\n if (isSubmittingInput) {\n return;\n }\n setActiveInputCommandId(undefined);\n setInputError(undefined);\n setHasJsonValidationErrors(false);\n }, [isSubmittingInput]);\n\n const submitCommandInput = useCallback(\n async (input: unknown) => {\n if (!activeInputCommand) {\n return;\n }\n\n setInputError(undefined);\n setIsSubmittingInput(true);\n try {\n await roomStore\n .getState()\n .commands.executeCommand(activeInputCommand.id, input, {\n surface: 'palette',\n });\n setActiveInputCommandId(undefined);\n } catch (error) {\n setInputError(getErrorMessage(error));\n } finally {\n setIsSubmittingInput(false);\n }\n },\n [activeInputCommand, roomStore],\n );\n\n const submitJsonCommandInput = useCallback(async () => {\n if (hasJsonValidationErrors) {\n setInputError('Fix JSON validation errors before running the command.');\n return;\n }\n\n const trimmedInput = inputJsonValue.trim();\n if (!trimmedInput) {\n await submitCommandInput(undefined);\n return;\n }\n\n try {\n await submitCommandInput(JSON.parse(trimmedInput));\n } catch (error) {\n setInputError(getErrorMessage(error));\n }\n }, [hasJsonValidationErrors, inputJsonValue, submitCommandInput]);\n\n const handleJsonEditorValidate = useCallback((markers: MonacoMarker[]) => {\n const hasErrors = markers.some(\n (marker) => marker.severity === MONACO_MARKER_SEVERITY_ERROR,\n );\n setHasJsonValidationErrors(hasErrors);\n }, []);\n\n useEffect(() => {\n isOpenRef.current = isOpen;\n }, [isOpen]);\n\n useEffect(() => {\n if (!enableKeyboardShortcut) {\n return;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n const isCommandPaletteShortcut =\n (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k';\n if (!isCommandPaletteShortcut) {\n return;\n }\n event.preventDefault();\n setPaletteOpen(!isOpenRef.current);\n };\n\n // Use capture so this still works when focused widgets (e.g. Monaco)\n // stop propagation during the bubble phase.\n window.addEventListener('keydown', onKeyDown, true);\n return () => {\n window.removeEventListener('keydown', onKeyDown, true);\n };\n }, [enableKeyboardShortcut, setPaletteOpen]);\n\n useEffect(() => {\n return subscribeToCommandPaletteControl((action) => {\n if (action === 'open') {\n setPaletteOpen(true);\n return;\n }\n if (action === 'close') {\n setPaletteOpen(false);\n return;\n }\n setPaletteOpen(!isOpenRef.current);\n });\n }, [setPaletteOpen]);\n\n useEffect(() => {\n if (activeInputCommandId && !activeInputCommand && !isSubmittingInput) {\n setActiveInputCommandId(undefined);\n setInputError(undefined);\n }\n }, [activeInputCommand, activeInputCommandId, isSubmittingInput]);\n\n return (\n <>\n <CommandDialog open={isOpen} onOpenChange={setPaletteOpen}>\n <CommandInput placeholder={placeholder} />\n <CommandList>\n <CommandEmpty>{emptyMessage}</CommandEmpty>\n {groupedCommands.map(([groupName, groupCommands]) => (\n <CommandGroup key={groupName} heading={groupName}>\n {groupCommands.map((command) => (\n <CommandItem\n key={command.id}\n value={getCommandSearchValue(command)}\n disabled={!command.enabled}\n onSelect={() => {\n void onSelectCommand(command);\n }}\n >\n <div className=\"flex flex-col\">\n <span>{command.name}</span>\n {command.description ? (\n <span className=\"text-muted-foreground text-xs\">\n {command.description}\n </span>\n ) : null}\n </div>\n {getCommandShortcut(command) ? (\n <CommandShortcut>\n {getCommandShortcut(command)}\n </CommandShortcut>\n ) : null}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n </CommandDialog>\n\n <Dialog\n open={Boolean(activeInputCommand)}\n onOpenChange={(open) => {\n if (!open) {\n closeCommandInputDialog();\n }\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {activeInputCommand?.name ?? 'Command input'}\n </DialogTitle>\n {activeInputCommand?.description ? (\n <DialogDescription>\n {activeInputCommand.description}\n </DialogDescription>\n ) : null}\n </DialogHeader>\n\n {ActiveInputComponent && activeInputCommand ? (\n <ActiveInputComponent\n commandId={activeInputCommand.id}\n commandName={activeInputCommand.name}\n isSubmitting={isSubmittingInput}\n error={inputError}\n onSubmit={(input) => {\n void submitCommandInput(input);\n }}\n onCancel={closeCommandInputDialog}\n />\n ) : (\n <>\n <DialogDescription>\n {activeInputCommand?.inputDescription ??\n 'Provide command input as a JSON value. Example: {\"panelId\":\"sql-editor\"}'}\n </DialogDescription>\n <div className=\"relative h-56 w-full rounded-md border\">\n <JsonMonacoEditor\n className=\"absolute inset-0 h-full w-full\"\n schema={activeInputCommandJsonSchema}\n value={inputJsonValue}\n path={activeInputEditorPath}\n readOnly={isSubmittingInput}\n onChange={(value) => {\n setInputJsonValue(value ?? '');\n setInputError(undefined);\n }}\n onValidate={handleJsonEditorValidate}\n options={{\n lineNumbers: 'off',\n glyphMargin: false,\n folding: false,\n wordWrap: 'on',\n tabSize: 2,\n fixedOverflowWidgets: false,\n automaticLayout: true,\n }}\n />\n </div>\n {hasJsonValidationErrors ? (\n <p className=\"text-destructive text-sm\">\n JSON input has syntax or schema validation errors.\n </p>\n ) : null}\n {inputError ? (\n <p className=\"text-destructive text-sm\">{inputError}</p>\n ) : null}\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={closeCommandInputDialog}\n disabled={isSubmittingInput}\n >\n Cancel\n </Button>\n <Button\n onClick={() => {\n void submitJsonCommandInput();\n }}\n disabled={isSubmittingInput || hasJsonValidationErrors}\n >\n Run command\n </Button>\n </DialogFooter>\n </>\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\nexport type RoomShellCommandPaletteButtonProps = Omit<\n ComponentProps<typeof Button>,\n 'children'\n> & {\n icon?: ComponentType<{className?: string}>;\n iconClassName?: string;\n tooltip?: string;\n};\n\nfunction RoomShellCommandPaletteButton({\n className,\n icon: Icon = CommandIcon,\n iconClassName,\n tooltip,\n variant = 'ghost',\n size = 'icon',\n onClick,\n ...buttonProps\n}: RoomShellCommandPaletteButtonProps) {\n const shortcutText = isMacOS() ? 'Cmd+K' : 'Ctrl+K';\n const tooltipText = tooltip ?? `Open command palette (${shortcutText})`;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant={variant}\n size={size}\n className={cn(className)}\n onClick={(event) => {\n requestCommandPaletteControl('open');\n onClick?.(event);\n }}\n aria-label=\"Open command palette\"\n {...buttonProps}\n >\n <Icon className={cn('h-5 w-5', iconClassName)} />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{tooltipText}</TooltipContent>\n </Tooltip>\n );\n}\n\nexport const RoomShellCommandPalette = Object.assign(\n RoomShellCommandPaletteBase,\n {\n Button: RoomShellCommandPaletteButton,\n },\n);\n\nfunction resolveCommandVisibility(\n command: RegisteredRoomCommand,\n context: RoomCommandExecutionContext,\n): boolean {\n if (command.ui?.hidden) {\n return false;\n }\n if (!command.isVisible) {\n return true;\n }\n try {\n return command.isVisible(context);\n } catch (error) {\n context.getState().room.captureException(error);\n return false;\n }\n}\n\nfunction resolveCommandEnabled(\n command: RegisteredRoomCommand,\n context: RoomCommandExecutionContext,\n): boolean {\n if (!command.isEnabled) {\n return true;\n }\n try {\n return command.isEnabled(context);\n } catch (error) {\n context.getState().room.captureException(error);\n return false;\n }\n}\n\nfunction getCommandSearchValue(command: RegisteredRoomCommand): string {\n return [\n command.name,\n command.description,\n command.inputDescription,\n getCommandShortcut(command),\n command.id,\n ...(command.keywords ?? []),\n ]\n .filter((value): value is string => Boolean(value))\n .join(' ');\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction createDefaultJsonInputValue(command: RegisteredRoomCommand): string {\n const portableInputSchema = exportCommandInputSchema(command.inputSchema);\n const jsonSchema = toJsonSchema(portableInputSchema);\n const inputTemplate = createInputTemplateFromSchema(jsonSchema);\n return safeStringifyJsonValue(inputTemplate ?? {});\n}\n\nfunction toJsonSchema(\n portableSchema?: RoomCommandPortableSchema,\n): JsonSchema | undefined {\n if (!portableSchema) {\n return undefined;\n }\n return portableSchema as JsonSchema;\n}\n\nfunction createInputTemplateFromSchema(schema?: JsonSchema): unknown {\n if (!schema) {\n return {};\n }\n if (schema.default !== undefined) {\n return schema.default;\n }\n if (schema.const !== undefined) {\n return schema.const;\n }\n if (schema.enum && schema.enum.length > 0) {\n return schema.enum[0];\n }\n if (schema.anyOf && schema.anyOf.length > 0) {\n for (const variant of schema.anyOf) {\n const value = createInputTemplateFromSchema(variant);\n if (value !== undefined) {\n return value;\n }\n }\n }\n\n const schemaType = resolveSchemaType(schema.type);\n switch (schemaType) {\n case 'object': {\n const properties = schema.properties ?? {};\n const requiredPropertyNames = new Set(schema.required ?? []);\n const propertyEntries = Object.entries(properties);\n const objectValue: Record<string, unknown> = {};\n\n for (const [propertyName, propertySchema] of propertyEntries) {\n if (\n requiredPropertyNames.size > 0 &&\n !requiredPropertyNames.has(propertyName)\n ) {\n continue;\n }\n objectValue[propertyName] =\n createInputTemplateFromSchema(propertySchema);\n }\n\n // If there are no required keys, include the first optional key as a hint.\n if (\n Object.keys(objectValue).length === 0 &&\n requiredPropertyNames.size === 0 &&\n propertyEntries.length > 0\n ) {\n const firstProperty = propertyEntries[0];\n if (firstProperty) {\n const [firstPropertyName, firstPropertySchema] = firstProperty;\n objectValue[firstPropertyName] =\n createInputTemplateFromSchema(firstPropertySchema);\n }\n }\n\n return objectValue;\n }\n case 'array':\n return [];\n case 'string':\n return '';\n case 'number':\n case 'integer':\n return 0;\n case 'boolean':\n return false;\n case 'null':\n return null;\n default:\n return {};\n }\n}\n\nfunction resolveSchemaType(type: JsonSchema['type']): string | undefined {\n if (Array.isArray(type)) {\n return type.find((variant) => variant !== 'null') ?? type[0];\n }\n return type;\n}\n\nfunction safeStringifyJsonValue(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return '{}';\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { DataTable, DuckDbConnector, DuckDbSliceState, LoadFileOptions } from '@sqlrooms/duckdb';
2
2
  import { CreateLayoutSliceProps, LayoutSliceState } from '@sqlrooms/layout';
3
3
  import { BaseRoomConfig, DataSource, FileDataSource, LayoutConfig } from '@sqlrooms/room-config';
4
- import { BaseRoomStoreState, CreateBaseRoomSliceProps } from '@sqlrooms/room-store';
4
+ import { BaseRoomStoreState, CommandSliceState, CreateBaseRoomSliceProps } from '@sqlrooms/room-store';
5
5
  import { ProgressInfo } from '@sqlrooms/utils';
6
6
  import { ReactNode } from 'react';
7
7
  import { StateCreator, StoreApi } from 'zustand';
@@ -85,7 +85,7 @@ export type RoomShellSliceState = {
85
85
  setRoomFileProgress(pathname: string, fileState: RoomFileState): void;
86
86
  addDataSource: (dataSource: DataSource, status?: DataSourceStatus) => Promise<void>;
87
87
  };
88
- } & DuckDbSliceState & LayoutSliceState;
88
+ } & DuckDbSliceState & LayoutSliceState & CommandSliceState;
89
89
  /**
90
90
  * This type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.
91
91
  */
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShellSlice.d.ts","sourceRoot":"","sources":["../src/RoomShellSlice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RoomShellSlice.d.ts","sourceRoot":"","sources":["../src/RoomShellSlice.ts"],"names":[],"mappings":"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"}