@reifydb/shell 0.2.0 → 0.3.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.
package/dist/index.css CHANGED
@@ -1,6 +1,17 @@
1
1
  /* src/terminal/styles.css */
2
+ .reifydb-shell-fullscreen {
3
+ position: fixed !important;
4
+ top: 0 !important;
5
+ left: 0 !important;
6
+ right: 0 !important;
7
+ bottom: 0 !important;
8
+ width: 100vw !important;
9
+ height: 100vh !important;
10
+ z-index: 9999 !important;
11
+ background: #1e1e2e !important;
12
+ }
2
13
  .xterm {
3
- padding: 0;
14
+ padding: 12px;
4
15
  }
5
16
  .xterm-viewport {
6
17
  scrollbar-width: thin;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/terminal/styles.css"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* Copyright (c) 2025 ReifyDB */\n\n/* xterm.js container styling */\n.xterm {\n padding: 0;\n}\n\n.xterm-viewport {\n /* Hide scrollbar but keep scrolling functional */\n scrollbar-width: thin;\n scrollbar-color: #45475a #1e1e2e;\n}\n\n.xterm-viewport::-webkit-scrollbar {\n width: 8px;\n}\n\n.xterm-viewport::-webkit-scrollbar-track {\n background: #1e1e2e;\n}\n\n.xterm-viewport::-webkit-scrollbar-thumb {\n background: #45475a;\n border-radius: 4px;\n}\n\n.xterm-viewport::-webkit-scrollbar-thumb:hover {\n background: #585b70;\n}\n"],"mappings":";AAIA,CAAC;AACC,WAAS;AACX;AAEA,CAAC;AAEC,mBAAiB;AACjB,mBAAiB,QAAQ;AAC3B;AAEA,CANC,cAMc;AACb,SAAO;AACT;AAEA,CAVC,cAUc;AACb,cAAY;AACd;AAEA,CAdC,cAcc;AACb,cAAY;AACZ,iBAAe;AACjB;AAEA,CAnBC,cAmBc,yBAAyB;AACtC,cAAY;AACd;","names":[]}
1
+ {"version":3,"sources":["../src/terminal/styles.css"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* Copyright (c) 2025 ReifyDB */\n\n/* Fullscreen mode */\n.reifydb-shell-fullscreen {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n width: 100vw !important;\n height: 100vh !important;\n z-index: 9999 !important;\n background: #1e1e2e !important;\n}\n\n/* xterm.js container styling */\n.xterm {\n padding: 12px;\n}\n\n.xterm-viewport {\n /* Hide scrollbar but keep scrolling functional */\n scrollbar-width: thin;\n scrollbar-color: #45475a #1e1e2e;\n}\n\n.xterm-viewport::-webkit-scrollbar {\n width: 8px;\n}\n\n.xterm-viewport::-webkit-scrollbar-track {\n background: #1e1e2e;\n}\n\n.xterm-viewport::-webkit-scrollbar-thumb {\n background: #45475a;\n border-radius: 4px;\n}\n\n.xterm-viewport::-webkit-scrollbar-thumb:hover {\n background: #585b70;\n}\n"],"mappings":";AAIA,CAAC;AACC,YAAU;AACV,OAAK;AACL,QAAM;AACN,SAAO;AACP,UAAQ;AACR,SAAO;AACP,UAAQ;AACR,WAAS;AACT,cAAY;AACd;AAGA,CAAC;AACC,WAAS;AACX;AAEA,CAAC;AAEC,mBAAiB;AACjB,mBAAiB,QAAQ;AAC3B;AAEA,CANC,cAMc;AACb,SAAO;AACT;AAEA,CAVC,cAUc;AACb,cAAY;AACd;AAEA,CAdC,cAcc;AACb,cAAY;AACZ,iBAAe;AACjB;AAEA,CAnBC,cAmBc,yBAAyB;AACtC,cAAY;AACd;","names":[]}
package/dist/index.d.ts CHANGED
@@ -59,8 +59,10 @@ type KeyHandler = (key: string, domEvent: KeyboardEvent) => void;
59
59
  declare class TerminalAdapter {
60
60
  private terminal;
61
61
  private fitAddon;
62
+ private container;
62
63
  private keyHandler;
63
64
  private resizeObserver;
65
+ private _isFullscreen;
64
66
  constructor(container: HTMLElement, theme?: TerminalTheme);
65
67
  onKey(handler: KeyHandler): void;
66
68
  write(text: string): void;
@@ -70,6 +72,9 @@ declare class TerminalAdapter {
70
72
  get rows(): number;
71
73
  focus(): void;
72
74
  dispose(): void;
75
+ get isFullscreen(): boolean;
76
+ enterFullscreen(): void;
77
+ exitFullscreen(): void;
73
78
  static readonly COLORS: {
74
79
  readonly reset: "\u001B[0m";
75
80
  readonly bold: "\u001B[1m";
@@ -192,13 +197,17 @@ interface ShellOptions {
192
197
  */
193
198
  historyStorage?: HistoryStorage;
194
199
  /**
195
- * Initial display mode (default: "truncate")
200
+ * Initial display mode (default: "full")
196
201
  */
197
202
  displayMode?: DisplayMode;
198
203
  /**
199
204
  * Callback when user exits the shell
200
205
  */
201
206
  onExit?: () => void;
207
+ /**
208
+ * Callback when fullscreen state changes
209
+ */
210
+ onFullscreenChange?: (isFullscreen: boolean) => void;
202
211
  }
203
212
  /**
204
213
  * Internal context passed to dot command handlers
@@ -213,6 +222,9 @@ interface DotCommandContext {
213
222
  displayMode: DisplayMode;
214
223
  setDisplayMode: (mode: DisplayMode) => void;
215
224
  clearScreen: () => void;
225
+ isFullscreen: boolean;
226
+ enterFullscreen: () => void;
227
+ exitFullscreen: () => void;
216
228
  }
217
229
  /**
218
230
  * Result from handling a dot command
@@ -237,9 +249,13 @@ declare class Shell {
237
249
  private continuationPromptLen;
238
250
  private welcomeMessage;
239
251
  private onExit;
252
+ private onFullscreenChange;
240
253
  constructor(container: HTMLElement, options: ShellOptions);
241
254
  start(): void;
242
255
  dispose(): void;
256
+ get isFullscreen(): boolean;
257
+ enterFullscreen(): void;
258
+ exitFullscreen(): void;
243
259
  private showWelcomeBanner;
244
260
  private showPrompt;
245
261
  private getCurrentPromptLen;
package/dist/index.js CHANGED
@@ -57,9 +57,12 @@ var COLORS = {
57
57
  var TerminalAdapter = class {
58
58
  terminal;
59
59
  fitAddon;
60
+ container;
60
61
  keyHandler = null;
61
62
  resizeObserver = null;
63
+ _isFullscreen = false;
62
64
  constructor(container, theme = defaultTheme) {
65
+ this.container = container;
63
66
  this.terminal = new Terminal({
64
67
  theme,
65
68
  fontFamily: "'JetBrains Mono', 'Fira Code', 'Consolas', 'Monaco', monospace",
@@ -113,6 +116,21 @@ var TerminalAdapter = class {
113
116
  }
114
117
  this.terminal.dispose();
115
118
  }
119
+ get isFullscreen() {
120
+ return this._isFullscreen;
121
+ }
122
+ enterFullscreen() {
123
+ if (this._isFullscreen) return;
124
+ this._isFullscreen = true;
125
+ this.container.classList.add("reifydb-shell-fullscreen");
126
+ this.fitAddon.fit();
127
+ }
128
+ exitFullscreen() {
129
+ if (!this._isFullscreen) return;
130
+ this._isFullscreen = false;
131
+ this.container.classList.remove("reifydb-shell-fullscreen");
132
+ this.fitAddon.fit();
133
+ }
116
134
  // ANSI escape code helpers - static for use without instance
117
135
  static COLORS = COLORS;
118
136
  // Cursor control helpers
@@ -417,13 +435,8 @@ async function handleDotCommand(input, context) {
417
435
  case ".help":
418
436
  showHelp(context.terminal);
419
437
  return { handled: true };
420
- case ".quit":
421
- case ".exit":
422
- context.terminal.writeln(`${C.yellow}Goodbye!${C.reset}`);
423
- context.terminal.writeln("");
424
- return { handled: true, exit: true };
425
438
  case ".clear":
426
- context.clearScreen();
439
+ context.terminal.write(TerminalAdapter.clearScreen());
427
440
  return { handled: true };
428
441
  case ".mode":
429
442
  handleMode(args, context);
@@ -437,6 +450,14 @@ async function handleDotCommand(input, context) {
437
450
  case ".schema":
438
451
  await showSchema(args, context);
439
452
  return { handled: true };
453
+ case ".fullscreen":
454
+ context.enterFullscreen();
455
+ return { handled: true };
456
+ case ".exit":
457
+ if (context.isFullscreen) {
458
+ context.exitFullscreen();
459
+ }
460
+ return { handled: true };
440
461
  default:
441
462
  if (command.startsWith(".")) {
442
463
  context.terminal.writeln(
@@ -453,12 +474,13 @@ function showHelp(terminal) {
453
474
  terminal.writeln(`${C.bold}${C.cyan}Available commands:${C.reset}`);
454
475
  terminal.writeln("");
455
476
  terminal.writeln(` ${C.green}.help${C.reset} Show this help message`);
456
- terminal.writeln(` ${C.green}.quit${C.reset}, ${C.green}.exit${C.reset} Exit message`);
457
477
  terminal.writeln(` ${C.green}.clear${C.reset} Clear the screen`);
458
478
  terminal.writeln(` ${C.green}.mode${C.reset} [mode] Set display mode (truncate|full)`);
459
479
  terminal.writeln(` ${C.green}.history${C.reset} Show command history`);
460
480
  terminal.writeln(` ${C.green}.tables${C.reset} List all tables`);
461
481
  terminal.writeln(` ${C.green}.schema${C.reset} [table] Show table schema`);
482
+ terminal.writeln(` ${C.green}.fullscreen${C.reset} Enter fullscreen mode`);
483
+ terminal.writeln(` ${C.green}.exit${C.reset} Exit fullscreen mode`);
462
484
  terminal.writeln("");
463
485
  terminal.writeln(`${C.bold}${C.cyan}Keyboard shortcuts:${C.reset}`);
464
486
  terminal.writeln("");
@@ -561,7 +583,7 @@ var TableRenderer = class {
561
583
  constructor(data, options = {}) {
562
584
  this.data = data;
563
585
  this.maxWidth = options.maxWidth ?? 120;
564
- this.truncate = options.truncate ?? true;
586
+ this.truncate = options.truncate ?? false;
565
587
  this.columns = this.calculateColumns();
566
588
  }
567
589
  calculateColumns() {
@@ -581,7 +603,10 @@ var TableRenderer = class {
581
603
  }
582
604
  formatValue(value) {
583
605
  if (value === null || value === void 0) {
584
- return "null";
606
+ return "undefined";
607
+ }
608
+ if (value && typeof value === "object" && "type" in value && typeof value.toString === "function") {
609
+ return value.toString();
585
610
  }
586
611
  if (typeof value === "object") {
587
612
  return JSON.stringify(value);
@@ -665,7 +690,7 @@ var C2 = TerminalAdapter.COLORS;
665
690
  var OutputFormatter = class {
666
691
  terminal;
667
692
  displayMode;
668
- constructor(terminal, displayMode = "truncate") {
693
+ constructor(terminal, displayMode = "full") {
669
694
  this.terminal = terminal;
670
695
  this.displayMode = displayMode;
671
696
  }
@@ -704,7 +729,9 @@ var OutputFormatter = class {
704
729
  }
705
730
  formatError(error, executionTime) {
706
731
  this.terminal.writeln("");
707
- this.terminal.writeln(`${C2.red}Error: ${error}${C2.reset}`);
732
+ for (const line of error.split("\n")) {
733
+ this.terminal.writeln(line);
734
+ }
708
735
  this.formatExecutionTime(executionTime);
709
736
  }
710
737
  formatExecutionTime(ms) {
@@ -734,11 +761,13 @@ var Shell = class {
734
761
  continuationPromptLen;
735
762
  welcomeMessage;
736
763
  onExit;
764
+ onFullscreenChange;
737
765
  constructor(container, options) {
738
766
  this.executor = options.executor;
739
- this.displayMode = options.displayMode ?? "truncate";
767
+ this.displayMode = options.displayMode ?? "full";
740
768
  this.welcomeMessage = options.welcomeMessage;
741
769
  this.onExit = options.onExit;
770
+ this.onFullscreenChange = options.onFullscreenChange;
742
771
  this.primaryPrompt = options.prompt ?? DEFAULT_PRIMARY_PROMPT;
743
772
  this.primaryPromptLen = options.promptLength ?? DEFAULT_PRIMARY_PROMPT_LEN;
744
773
  this.continuationPrompt = options.continuationPrompt ?? DEFAULT_CONTINUATION_PROMPT;
@@ -757,8 +786,20 @@ var Shell = class {
757
786
  }
758
787
  dispose() {
759
788
  this.isExited = true;
789
+ this.terminal.exitFullscreen();
760
790
  this.terminal.dispose();
761
791
  }
792
+ get isFullscreen() {
793
+ return this.terminal.isFullscreen;
794
+ }
795
+ enterFullscreen() {
796
+ this.terminal.enterFullscreen();
797
+ this.onFullscreenChange?.(true);
798
+ }
799
+ exitFullscreen() {
800
+ this.terminal.exitFullscreen();
801
+ this.onFullscreenChange?.(false);
802
+ }
762
803
  showWelcomeBanner() {
763
804
  if (this.welcomeMessage === void 0) {
764
805
  this.terminal.writeln("");
@@ -876,6 +917,9 @@ var Shell = class {
876
917
  case 9:
877
918
  return;
878
919
  case 27:
920
+ if (this.terminal.isFullscreen) {
921
+ this.exitFullscreen();
922
+ }
879
923
  return;
880
924
  }
881
925
  if (key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {
@@ -914,7 +958,10 @@ var Shell = class {
914
958
  this.displayMode = mode;
915
959
  this.formatter.setDisplayMode(mode);
916
960
  },
917
- clearScreen: () => this.clearScreen()
961
+ clearScreen: () => this.clearScreen(),
962
+ isFullscreen: this.isFullscreen,
963
+ enterFullscreen: () => this.enterFullscreen(),
964
+ exitFullscreen: () => this.exitFullscreen()
918
965
  });
919
966
  if (result.exit) {
920
967
  this.isExited = true;
@@ -980,12 +1027,12 @@ var WasmExecutor = class {
980
1027
  }
981
1028
  async getTables() {
982
1029
  try {
983
- const result = await this.db.admin("FROM system.tables MAP { namespace, name }");
1030
+ const result = await this.db.admin("FROM system::tables MAP { namespace, name }");
984
1031
  if (Array.isArray(result)) {
985
1032
  return result.map((row) => {
986
1033
  const ns = row.namespace;
987
1034
  const name = row.name;
988
- return ns ? `${ns}.${name}` : name;
1035
+ return ns ? `${ns}::${name}` : name;
989
1036
  });
990
1037
  }
991
1038
  return [];
@@ -996,7 +1043,7 @@ var WasmExecutor = class {
996
1043
  async getSchema(tableName) {
997
1044
  try {
998
1045
  const result = await this.db.admin(
999
- `FROM system.columns FILTER table = "${tableName}" MAP { name, type }`
1046
+ `FROM system::columns FILTER table = "${tableName}" MAP { name, type }`
1000
1047
  );
1001
1048
  if (Array.isArray(result) && result.length > 0) {
1002
1049
  const columns = result.map(
@@ -1038,11 +1085,7 @@ var WsExecutor = class {
1038
1085
  if (row && typeof row === "object") {
1039
1086
  const plainRow = {};
1040
1087
  for (const [key, value] of Object.entries(row)) {
1041
- if (value && typeof value === "object" && typeof value.valueOf === "function") {
1042
- plainRow[key] = value.valueOf();
1043
- } else {
1044
- plainRow[key] = value;
1045
- }
1088
+ plainRow[key] = value;
1046
1089
  }
1047
1090
  return plainRow;
1048
1091
  }
@@ -1074,7 +1117,7 @@ var WsExecutor = class {
1074
1117
  async getTables() {
1075
1118
  try {
1076
1119
  const frames = await this.client.admin(
1077
- "FROM system.tables MAP { namespace, name }",
1120
+ "FROM system::tables MAP { namespace, name }",
1078
1121
  null,
1079
1122
  []
1080
1123
  );
@@ -1083,7 +1126,7 @@ var WsExecutor = class {
1083
1126
  const r = row;
1084
1127
  const ns = this.extractValue(r.namespace);
1085
1128
  const name = this.extractValue(r.name);
1086
- return ns ? `${ns}.${name}` : name;
1129
+ return ns ? `${ns}::${name}` : name;
1087
1130
  });
1088
1131
  } catch {
1089
1132
  return [];
@@ -1092,7 +1135,7 @@ var WsExecutor = class {
1092
1135
  async getSchema(tableName) {
1093
1136
  try {
1094
1137
  const frames = await this.client.admin(
1095
- `FROM system.columns FILTER table = "${tableName}" MAP { name, type }`,
1138
+ `FROM system::columns FILTER table = "${tableName}" MAP { name, type }`,
1096
1139
  null,
1097
1140
  []
1098
1141
  );
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/terminal/adapter.ts","../src/terminal/theme.ts","../src/input/line-editor.ts","../src/input/history.ts","../src/input/multiline.ts","../src/commands/dot-commands.ts","../src/output/table.ts","../src/output/formatter.ts","../src/shell.ts","../src/executors/wasm-executor.ts","../src/executors/ws-executor.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { Terminal } from '@xterm/xterm';\nimport { FitAddon } from '@xterm/addon-fit';\nimport '@xterm/xterm/css/xterm.css';\nimport './styles.css';\nimport { defaultTheme, COLORS, type TerminalTheme } from './theme';\n\nexport type KeyHandler = (key: string, domEvent: KeyboardEvent) => void;\n\nexport class TerminalAdapter {\n private terminal: Terminal;\n private fitAddon: FitAddon;\n private keyHandler: KeyHandler | null = null;\n private resizeObserver: ResizeObserver | null = null;\n\n constructor(container: HTMLElement, theme: TerminalTheme = defaultTheme) {\n this.terminal = new Terminal({\n theme,\n fontFamily: \"'JetBrains Mono', 'Fira Code', 'Consolas', 'Monaco', monospace\",\n fontSize: 14,\n lineHeight: 1.2,\n cursorBlink: true,\n cursorStyle: 'block',\n scrollback: 10000,\n allowProposedApi: true,\n });\n\n this.fitAddon = new FitAddon();\n this.terminal.loadAddon(this.fitAddon);\n\n container.innerHTML = '';\n this.terminal.open(container);\n this.fitAddon.fit();\n\n // Handle resize\n this.resizeObserver = new ResizeObserver(() => {\n this.fitAddon.fit();\n });\n this.resizeObserver.observe(container);\n\n // Handle key input\n this.terminal.onKey(({ key, domEvent }) => {\n if (this.keyHandler) {\n this.keyHandler(key, domEvent);\n }\n });\n }\n\n onKey(handler: KeyHandler): void {\n this.keyHandler = handler;\n }\n\n write(text: string): void {\n this.terminal.write(text);\n }\n\n writeln(text: string): void {\n this.terminal.writeln(text);\n }\n\n clear(): void {\n this.terminal.clear();\n }\n\n get cols(): number {\n return this.terminal.cols;\n }\n\n get rows(): number {\n return this.terminal.rows;\n }\n\n focus(): void {\n this.terminal.focus();\n }\n\n dispose(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n this.terminal.dispose();\n }\n\n // ANSI escape code helpers - static for use without instance\n static readonly COLORS = COLORS;\n\n // Cursor control helpers\n static cursorUp(n: number = 1): string {\n return `\\x1b[${n}A`;\n }\n\n static cursorDown(n: number = 1): string {\n return `\\x1b[${n}B`;\n }\n\n static cursorForward(n: number = 1): string {\n return `\\x1b[${n}C`;\n }\n\n static cursorBack(n: number = 1): string {\n return `\\x1b[${n}D`;\n }\n\n static cursorPosition(row: number, col: number): string {\n return `\\x1b[${row};${col}H`;\n }\n\n static clearLine(): string {\n return '\\x1b[2K';\n }\n\n static clearToEndOfLine(): string {\n return '\\x1b[K';\n }\n\n static clearScreen(): string {\n return '\\x1b[2J\\x1b[3J\\x1b[H';\n }\n\n static saveCursor(): string {\n return '\\x1b[s';\n }\n\n static restoreCursor(): string {\n return '\\x1b[u';\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\n/**\n * Terminal color theme configuration\n */\nexport interface TerminalTheme {\n background: string;\n foreground: string;\n cursor: string;\n cursorAccent: string;\n selectionBackground: string;\n black: string;\n red: string;\n green: string;\n yellow: string;\n blue: string;\n magenta: string;\n cyan: string;\n white: string;\n brightBlack: string;\n brightRed: string;\n brightGreen: string;\n brightYellow: string;\n brightBlue: string;\n brightMagenta: string;\n brightCyan: string;\n brightWhite: string;\n}\n\n/**\n * Catppuccin Mocha theme - default theme\n */\nexport const defaultTheme: TerminalTheme = {\n background: '#1e1e2e',\n foreground: '#cdd6f4',\n cursor: '#f5e0dc',\n cursorAccent: '#1e1e2e',\n selectionBackground: '#45475a',\n black: '#45475a',\n red: '#f38ba8',\n green: '#a6e3a1',\n yellow: '#f9e2af',\n blue: '#89b4fa',\n magenta: '#f5c2e7',\n cyan: '#94e2d5',\n white: '#bac2de',\n brightBlack: '#585b70',\n brightRed: '#f38ba8',\n brightGreen: '#a6e3a1',\n brightYellow: '#f9e2af',\n brightBlue: '#89b4fa',\n brightMagenta: '#f5c2e7',\n brightCyan: '#94e2d5',\n brightWhite: '#a6adc8',\n};\n\n/**\n * ANSI escape codes for terminal colors and formatting\n */\nexport const COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n\n // Foreground colors\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n\n // Bright foreground colors\n brightBlack: '\\x1b[90m',\n brightRed: '\\x1b[91m',\n brightGreen: '\\x1b[92m',\n brightYellow: '\\x1b[93m',\n brightBlue: '\\x1b[94m',\n brightMagenta: '\\x1b[95m',\n brightCyan: '\\x1b[96m',\n brightWhite: '\\x1b[97m',\n} as const;\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\n\nexport class LineEditor {\n private buffer: string = '';\n private cursorPos: number = 0;\n private terminal: TerminalAdapter;\n\n constructor(terminal: TerminalAdapter) {\n this.terminal = terminal;\n }\n\n get value(): string {\n return this.buffer;\n }\n\n get cursor(): number {\n return this.cursorPos;\n }\n\n clear(): void {\n this.buffer = '';\n this.cursorPos = 0;\n }\n\n setValue(value: string): void {\n this.buffer = value;\n this.cursorPos = value.length;\n }\n\n insert(char: string): void {\n this.buffer =\n this.buffer.slice(0, this.cursorPos) +\n char +\n this.buffer.slice(this.cursorPos);\n this.cursorPos++;\n }\n\n backspace(): boolean {\n if (this.cursorPos > 0) {\n this.buffer =\n this.buffer.slice(0, this.cursorPos - 1) +\n this.buffer.slice(this.cursorPos);\n this.cursorPos--;\n return true;\n }\n return false;\n }\n\n delete(): boolean {\n if (this.cursorPos < this.buffer.length) {\n this.buffer =\n this.buffer.slice(0, this.cursorPos) +\n this.buffer.slice(this.cursorPos + 1);\n return true;\n }\n return false;\n }\n\n moveLeft(): boolean {\n if (this.cursorPos > 0) {\n this.cursorPos--;\n this.terminal.write(TerminalAdapter.cursorBack());\n return true;\n }\n return false;\n }\n\n moveRight(): boolean {\n if (this.cursorPos < this.buffer.length) {\n this.cursorPos++;\n this.terminal.write(TerminalAdapter.cursorForward());\n return true;\n }\n return false;\n }\n\n moveToStart(): void {\n if (this.cursorPos > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(this.cursorPos));\n this.cursorPos = 0;\n }\n }\n\n moveToEnd(): void {\n if (this.cursorPos < this.buffer.length) {\n const distance = this.buffer.length - this.cursorPos;\n this.terminal.write(TerminalAdapter.cursorForward(distance));\n this.cursorPos = this.buffer.length;\n }\n }\n\n moveWordLeft(): void {\n if (this.cursorPos === 0) return;\n\n let newPos = this.cursorPos - 1;\n\n // Skip whitespace\n while (newPos > 0 && /\\s/.test(this.buffer[newPos])) {\n newPos--;\n }\n\n // Move to start of word\n while (newPos > 0 && !/\\s/.test(this.buffer[newPos - 1])) {\n newPos--;\n }\n\n const distance = this.cursorPos - newPos;\n if (distance > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(distance));\n this.cursorPos = newPos;\n }\n }\n\n moveWordRight(): void {\n if (this.cursorPos >= this.buffer.length) return;\n\n let newPos = this.cursorPos;\n\n // Move past current word\n while (newPos < this.buffer.length && !/\\s/.test(this.buffer[newPos])) {\n newPos++;\n }\n\n // Skip whitespace\n while (newPos < this.buffer.length && /\\s/.test(this.buffer[newPos])) {\n newPos++;\n }\n\n const distance = newPos - this.cursorPos;\n if (distance > 0) {\n this.terminal.write(TerminalAdapter.cursorForward(distance));\n this.cursorPos = newPos;\n }\n }\n\n clearLine(): void {\n this.buffer = '';\n this.cursorPos = 0;\n }\n\n deleteToEnd(): void {\n this.buffer = this.buffer.slice(0, this.cursorPos);\n }\n\n deleteToStart(): void {\n this.buffer = this.buffer.slice(this.cursorPos);\n this.cursorPos = 0;\n }\n\n deleteWord(): void {\n if (this.cursorPos === 0) return;\n\n let newPos = this.cursorPos - 1;\n\n // Skip whitespace\n while (newPos > 0 && /\\s/.test(this.buffer[newPos])) {\n newPos--;\n }\n\n // Move to start of word\n while (newPos > 0 && !/\\s/.test(this.buffer[newPos - 1])) {\n newPos--;\n }\n\n this.buffer = this.buffer.slice(0, newPos) + this.buffer.slice(this.cursorPos);\n this.cursorPos = newPos;\n }\n\n // Called by shell to render the line with prompt\n render(prompt: string): void {\n this.terminal.write(\n '\\r' +\n TerminalAdapter.clearToEndOfLine() +\n prompt +\n this.buffer\n );\n\n // Position cursor correctly\n const cursorOffset = this.buffer.length - this.cursorPos;\n if (cursorOffset > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(cursorOffset));\n }\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { HistoryStorage } from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'reifydb-shell-history';\nconst MAX_HISTORY = 1000;\n\n/**\n * Default localStorage-based history storage\n */\nexport class LocalStorageHistoryStorage implements HistoryStorage {\n private key: string;\n\n constructor(key: string = DEFAULT_STORAGE_KEY) {\n this.key = key;\n }\n\n load(): string[] {\n try {\n const stored = localStorage.getItem(this.key);\n if (stored) {\n const parsed = JSON.parse(stored);\n if (Array.isArray(parsed)) {\n return parsed.filter((e): e is string => typeof e === 'string');\n }\n }\n } catch {\n // Ignore localStorage errors\n }\n return [];\n }\n\n save(entries: string[]): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(entries));\n } catch {\n // Ignore localStorage errors (quota exceeded, etc.)\n }\n }\n}\n\n/**\n * In-memory history storage (no persistence)\n */\nexport class MemoryHistoryStorage implements HistoryStorage {\n private entries: string[] = [];\n\n load(): string[] {\n return [...this.entries];\n }\n\n save(entries: string[]): void {\n this.entries = [...entries];\n }\n}\n\nexport class CommandHistory {\n private entries: string[] = [];\n private position: number = -1;\n private savedInput: string = '';\n private storage: HistoryStorage;\n\n constructor(storage?: HistoryStorage, historyKey?: string) {\n this.storage = storage ?? new LocalStorageHistoryStorage(historyKey);\n this.entries = this.storage.load();\n }\n\n add(command: string): void {\n const trimmed = command.trim();\n if (!trimmed) return;\n\n // Don't add duplicates at the end\n if (this.entries.length > 0 && this.entries[this.entries.length - 1] === trimmed) {\n this.reset();\n return;\n }\n\n this.entries.push(trimmed);\n\n // Limit size\n if (this.entries.length > MAX_HISTORY) {\n this.entries = this.entries.slice(-MAX_HISTORY);\n }\n\n this.storage.save(this.entries);\n this.reset();\n }\n\n previous(currentInput: string): string | null {\n if (this.entries.length === 0) return null;\n\n // Save current input when starting navigation\n if (this.position === -1) {\n this.savedInput = currentInput;\n this.position = this.entries.length;\n }\n\n if (this.position > 0) {\n this.position--;\n return this.entries[this.position];\n }\n\n return null;\n }\n\n next(): string | null {\n if (this.position === -1) return null;\n\n if (this.position < this.entries.length - 1) {\n this.position++;\n return this.entries[this.position];\n }\n\n if (this.position === this.entries.length - 1) {\n this.position = -1;\n return this.savedInput;\n }\n\n return null;\n }\n\n reset(): void {\n this.position = -1;\n this.savedInput = '';\n }\n\n getAll(): string[] {\n return [...this.entries];\n }\n\n clear(): void {\n this.entries = [];\n this.position = -1;\n this.savedInput = '';\n this.storage.save(this.entries);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nexport class MultilineBuffer {\n private lines: string[] = [];\n\n get isEmpty(): boolean {\n return this.lines.length === 0;\n }\n\n get content(): string {\n return this.lines.join(' ');\n }\n\n addLine(line: string): void {\n this.lines.push(line);\n }\n\n clear(): void {\n this.lines = [];\n }\n\n isComplete(): boolean {\n // A statement is complete when it ends with a semicolon\n const full = this.content.trim();\n return full.endsWith(';');\n }\n\n static isStatementComplete(input: string): boolean {\n const trimmed = input.trim();\n return trimmed.endsWith(';');\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\nimport type { DotCommandContext, DotCommandResult, DisplayMode } from '../types';\n\nconst C = TerminalAdapter.COLORS;\n\nexport async function handleDotCommand(\n input: string,\n context: DotCommandContext\n): Promise<DotCommandResult> {\n const parts = input.trim().split(/\\s+/);\n const command = parts[0].toLowerCase();\n const args = parts.slice(1);\n\n switch (command) {\n case '.help':\n showHelp(context.terminal);\n return { handled: true };\n\n case '.quit':\n case '.exit':\n context.terminal.writeln(`${C.yellow}Goodbye!${C.reset}`);\n context.terminal.writeln('');\n return { handled: true, exit: true };\n\n case '.clear':\n context.clearScreen();\n return { handled: true };\n\n case '.mode':\n handleMode(args, context);\n return { handled: true };\n\n case '.history':\n showHistory(context);\n return { handled: true };\n\n case '.tables':\n await showTables(context);\n return { handled: true };\n\n case '.schema':\n await showSchema(args, context);\n return { handled: true };\n\n default:\n if (command.startsWith('.')) {\n context.terminal.writeln(\n `${C.red}Unknown command: ${command}${C.reset}`\n );\n context.terminal.writeln(`Type ${C.cyan}.help${C.reset} for available commands.`);\n return { handled: true };\n }\n return { handled: false };\n }\n}\n\nfunction showHelp(terminal: TerminalAdapter): void {\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Available commands:${C.reset}`);\n terminal.writeln('');\n terminal.writeln(` ${C.green}.help${C.reset} Show this help message`);\n terminal.writeln(` ${C.green}.quit${C.reset}, ${C.green}.exit${C.reset} Exit message`);\n terminal.writeln(` ${C.green}.clear${C.reset} Clear the screen`);\n terminal.writeln(` ${C.green}.mode${C.reset} [mode] Set display mode (truncate|full)`);\n terminal.writeln(` ${C.green}.history${C.reset} Show command history`);\n terminal.writeln(` ${C.green}.tables${C.reset} List all tables`);\n terminal.writeln(` ${C.green}.schema${C.reset} [table] Show table schema`);\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Keyboard shortcuts:${C.reset}`);\n terminal.writeln('');\n terminal.writeln(` ${C.yellow}Left/Right${C.reset} Move cursor`);\n terminal.writeln(` ${C.yellow}Ctrl+Left/Right${C.reset} Move by word`);\n terminal.writeln(` ${C.yellow}Home/End${C.reset} Start/end of line`);\n terminal.writeln(` ${C.yellow}Ctrl+A/E${C.reset} Start/end of line`);\n terminal.writeln(` ${C.yellow}Ctrl+U${C.reset} Clear line`);\n terminal.writeln(` ${C.yellow}Ctrl+W${C.reset} Delete word`);\n terminal.writeln(` ${C.yellow}Up/Down${C.reset} Navigate history`);\n terminal.writeln(` ${C.yellow}Ctrl+C${C.reset} Cancel input`);\n terminal.writeln('');\n terminal.writeln(`${C.dim}Statements must end with a semicolon (;)${C.reset}`);\n terminal.writeln('');\n}\n\nfunction handleMode(args: string[], context: DotCommandContext): void {\n const terminal = context.terminal;\n\n if (args.length === 0) {\n terminal.writeln(`Current display mode: ${C.cyan}${context.displayMode}${C.reset}`);\n return;\n }\n\n const mode = args[0].toLowerCase();\n if (mode === 'truncate' || mode === 'full') {\n context.setDisplayMode(mode as DisplayMode);\n terminal.writeln(`Display mode set to: ${C.cyan}${mode}${C.reset}`);\n } else {\n terminal.writeln(\n `${C.red}Unknown mode: ${mode}${C.reset}. Use 'truncate' or 'full'.`\n );\n }\n}\n\nfunction showHistory(context: DotCommandContext): void {\n const terminal = context.terminal;\n const entries = context.history.getAll();\n\n if (entries.length === 0) {\n terminal.writeln(`${C.dim}No command history${C.reset}`);\n return;\n }\n\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Command history:${C.reset}`);\n terminal.writeln('');\n\n // Show last 20 entries\n const toShow = entries.slice(-20);\n const startIdx = entries.length - toShow.length;\n\n toShow.forEach((entry, i) => {\n const num = String(startIdx + i + 1).padStart(4, ' ');\n terminal.writeln(`${C.dim}${num}${C.reset} ${entry}`);\n });\n\n if (entries.length > 20) {\n terminal.writeln('');\n terminal.writeln(`${C.dim}... and ${entries.length - 20} more entries${C.reset}`);\n }\n terminal.writeln('');\n}\n\nasync function showTables(context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getTables) {\n terminal.writeln(`${C.dim}.tables command not supported by this executor${C.reset}`);\n return;\n }\n\n const tables = await context.executor.getTables();\n\n if (tables.length === 0) {\n terminal.writeln(`${C.dim}No tables found${C.reset}`);\n return;\n }\n\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Tables:${C.reset}`);\n terminal.writeln('');\n\n tables.forEach((table) => {\n terminal.writeln(` ${C.green}${table}${C.reset}`);\n });\n terminal.writeln('');\n}\n\nasync function showSchema(args: string[], context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getSchema) {\n terminal.writeln(`${C.dim}.schema command not supported by this executor${C.reset}`);\n return;\n }\n\n if (args.length === 0) {\n terminal.writeln(`${C.red}Usage: .schema <table_name>${C.reset}`);\n return;\n }\n\n const tableName = args[0];\n const schema = await context.executor.getSchema(tableName);\n\n if (schema) {\n terminal.writeln('');\n terminal.writeln(schema);\n terminal.writeln('');\n } else {\n terminal.writeln(`${C.red}Table not found: ${tableName}${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nexport interface TableColumn {\n name: string;\n width: number;\n}\n\nexport interface TableOptions {\n maxWidth?: number;\n truncate?: boolean;\n}\n\nexport class TableRenderer {\n private data: Record<string, unknown>[];\n private columns: TableColumn[];\n private maxWidth: number;\n private truncate: boolean;\n\n constructor(data: Record<string, unknown>[], options: TableOptions = {}) {\n this.data = data;\n this.maxWidth = options.maxWidth ?? 120;\n this.truncate = options.truncate ?? true;\n this.columns = this.calculateColumns();\n }\n\n private calculateColumns(): TableColumn[] {\n if (this.data.length === 0) return [];\n\n const columns: Map<string, number> = new Map();\n\n // Get all column names and calculate max widths\n for (const row of this.data) {\n for (const [key, value] of Object.entries(row)) {\n const valueStr = this.formatValue(value);\n const currentMax = columns.get(key) ?? key.length;\n columns.set(key, Math.max(currentMax, valueStr.length));\n }\n }\n\n return Array.from(columns.entries()).map(([name, width]) => ({\n name,\n width: Math.max(width, name.length),\n }));\n }\n\n private formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n private truncateString(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n if (maxLen <= 3) return str.slice(0, maxLen);\n return str.slice(0, maxLen - 3) + '...';\n }\n\n render(): string[] {\n if (this.data.length === 0 || this.columns.length === 0) {\n return ['(no results)'];\n }\n\n const lines: string[] = [];\n let columnsToShow = this.columns;\n let widths = this.columns.map((c) => c.width);\n\n // Calculate how many columns fit\n if (this.truncate) {\n const result = this.fitColumns(this.maxWidth);\n columnsToShow = result.columns;\n widths = result.widths;\n }\n\n // Build separator line\n const separator =\n '+' + widths.map((w) => '-'.repeat(w + 2)).join('+') + '+';\n\n lines.push(separator);\n\n // Build header\n const headerCells = columnsToShow.map((col, i) =>\n this.padCenter(col.name, widths[i])\n );\n lines.push('| ' + headerCells.join(' | ') + ' |');\n lines.push(separator);\n\n // Build rows\n for (const row of this.data) {\n const cells = columnsToShow.map((col, i) => {\n const value = this.formatValue(row[col.name]);\n const truncated = this.truncate\n ? this.truncateString(value, widths[i])\n : value;\n return this.padRight(truncated, widths[i]);\n });\n lines.push('| ' + cells.join(' | ') + ' |');\n }\n\n lines.push(separator);\n\n return lines;\n }\n\n private fitColumns(maxWidth: number): {\n columns: TableColumn[];\n widths: number[];\n } {\n const columns: TableColumn[] = [];\n const widths: number[] = [];\n let currentWidth = 1; // Starting '|'\n\n for (const col of this.columns) {\n // Each column: ' content ' + '|' = 3 extra chars\n const colWidth = Math.min(col.width, 40); // Cap individual column width\n const totalColWidth = colWidth + 3;\n\n if (currentWidth + totalColWidth <= maxWidth) {\n columns.push(col);\n widths.push(colWidth);\n currentWidth += totalColWidth;\n } else {\n break;\n }\n }\n\n // If no columns fit, show at least the first one\n if (columns.length === 0 && this.columns.length > 0) {\n const firstCol = this.columns[0];\n const availableWidth = maxWidth - 4; // '| ' and ' |'\n columns.push(firstCol);\n widths.push(Math.max(availableWidth, 10));\n }\n\n return { columns, widths };\n }\n\n private padCenter(str: string, width: number): string {\n const padding = width - str.length;\n if (padding <= 0) return str.slice(0, width);\n const left = Math.floor(padding / 2);\n const right = padding - left;\n return ' '.repeat(left) + str + ' '.repeat(right);\n }\n\n private padRight(str: string, width: number): string {\n const padding = width - str.length;\n if (padding <= 0) return str.slice(0, width);\n return str + ' '.repeat(padding);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\nimport { TableRenderer } from './table';\nimport type { ExecutionResult, DisplayMode } from '../types';\n\nconst C = TerminalAdapter.COLORS;\n\nexport class OutputFormatter {\n private terminal: TerminalAdapter;\n private displayMode: DisplayMode;\n\n constructor(terminal: TerminalAdapter, displayMode: DisplayMode = 'truncate') {\n this.terminal = terminal;\n this.displayMode = displayMode;\n }\n\n setDisplayMode(mode: DisplayMode): void {\n this.displayMode = mode;\n }\n\n formatResult(result: ExecutionResult): void {\n if (!result.success) {\n this.formatError(result.error ?? 'Unknown error', result.executionTime);\n return;\n }\n\n if (!result.data || result.data.length === 0) {\n this.terminal.writeln('');\n this.terminal.writeln(`${C.dim}Query executed successfully. No rows returned.${C.reset}`);\n this.formatExecutionTime(result.executionTime);\n return;\n }\n\n this.formatTable(result.data, result.executionTime);\n }\n\n private formatTable(data: Record<string, unknown>[], executionTime: number): void {\n const renderer = new TableRenderer(data, {\n maxWidth: this.displayMode === 'truncate' ? this.terminal.cols - 2 : undefined,\n truncate: this.displayMode === 'truncate',\n });\n\n const lines = renderer.render();\n this.terminal.writeln('');\n for (const line of lines) {\n this.terminal.writeln(line);\n }\n\n const rowCount = data.length;\n this.terminal.writeln('');\n this.terminal.write(\n `${C.green}${rowCount} row${rowCount !== 1 ? 's' : ''}${C.reset}`\n );\n this.formatExecutionTime(executionTime);\n }\n\n private formatError(error: string, executionTime: number): void {\n this.terminal.writeln('');\n this.terminal.writeln(`${C.red}Error: ${error}${C.reset}`);\n this.formatExecutionTime(executionTime);\n }\n\n private formatExecutionTime(ms: number): void {\n this.terminal.writeln(` ${C.dim}(${ms}ms)${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from './terminal/adapter';\nimport { COLORS } from './terminal/theme';\nimport { LineEditor } from './input/line-editor';\nimport { CommandHistory } from './input/history';\nimport { MultilineBuffer } from './input/multiline';\nimport { handleDotCommand } from './commands/dot-commands';\nimport { OutputFormatter } from './output/formatter';\nimport type { ShellOptions, DisplayMode, Executor } from './types';\n\nconst C = COLORS;\n\n// Default prompts\nconst DEFAULT_PRIMARY_PROMPT = `${C.cyan}reifydb${C.reset}${C.brightBlack}>${C.reset} `;\nconst DEFAULT_CONTINUATION_PROMPT = `${C.brightBlack} ...${C.reset} `;\n\n// Prompt lengths without ANSI codes (for cursor positioning)\nconst DEFAULT_PRIMARY_PROMPT_LEN = 9; // \"reifydb> \"\nconst DEFAULT_CONTINUATION_PROMPT_LEN = 8; // \" ... \"\n\nexport class Shell {\n private terminal: TerminalAdapter;\n private lineEditor: LineEditor;\n private history: CommandHistory;\n private multiline: MultilineBuffer;\n private executor: Executor;\n private formatter: OutputFormatter;\n private displayMode: DisplayMode;\n private isExited: boolean = false;\n\n // Configurable options\n private primaryPrompt: string;\n private primaryPromptLen: number;\n private continuationPrompt: string;\n private continuationPromptLen: number;\n private welcomeMessage: string | string[] | (() => string[]) | undefined;\n private onExit: (() => void) | undefined;\n\n constructor(container: HTMLElement, options: ShellOptions) {\n this.executor = options.executor;\n this.displayMode = options.displayMode ?? 'truncate';\n this.welcomeMessage = options.welcomeMessage;\n this.onExit = options.onExit;\n\n // Set up prompts\n this.primaryPrompt = options.prompt ?? DEFAULT_PRIMARY_PROMPT;\n this.primaryPromptLen = options.promptLength ?? DEFAULT_PRIMARY_PROMPT_LEN;\n this.continuationPrompt = options.continuationPrompt ?? DEFAULT_CONTINUATION_PROMPT;\n this.continuationPromptLen = options.continuationPromptLength ?? DEFAULT_CONTINUATION_PROMPT_LEN;\n\n // Initialize components\n this.terminal = new TerminalAdapter(container, options.theme);\n this.lineEditor = new LineEditor(this.terminal);\n this.history = new CommandHistory(options.historyStorage, options.historyKey);\n this.multiline = new MultilineBuffer();\n this.formatter = new OutputFormatter(this.terminal, this.displayMode);\n\n this.setupKeyHandler();\n }\n\n start(): void {\n this.showWelcomeBanner();\n this.showPrompt();\n this.terminal.focus();\n }\n\n dispose(): void {\n this.isExited = true;\n this.terminal.dispose();\n }\n\n private showWelcomeBanner(): void {\n if (this.welcomeMessage === undefined) {\n // Default welcome banner\n this.terminal.writeln('');\n this.terminal.writeln(`${C.bold}${C.cyan}ReifyDB Shell${C.reset}`);\n this.terminal.writeln('');\n this.terminal.writeln(`Type ${C.green}.help${C.reset} for available commands`);\n this.terminal.writeln(`Statements must end with a semicolon ${C.yellow};${C.reset}`);\n this.terminal.writeln('');\n return;\n }\n\n let lines: string[];\n if (typeof this.welcomeMessage === 'function') {\n lines = this.welcomeMessage();\n } else if (Array.isArray(this.welcomeMessage)) {\n lines = this.welcomeMessage;\n } else {\n lines = [this.welcomeMessage];\n }\n\n for (const line of lines) {\n this.terminal.writeln(line);\n }\n }\n\n private showPrompt(): void {\n const prompt = this.multiline.isEmpty ? this.primaryPrompt : this.continuationPrompt;\n this.terminal.write(prompt);\n }\n\n private getCurrentPromptLen(): number {\n return this.multiline.isEmpty ? this.primaryPromptLen : this.continuationPromptLen;\n }\n\n private setupKeyHandler(): void {\n this.terminal.onKey((key, event) => {\n if (this.isExited) return;\n this.handleKey(key, event);\n });\n }\n\n private handleKey(key: string, event: KeyboardEvent): void {\n const code = event.keyCode;\n\n // Handle Ctrl key combinations\n if (event.ctrlKey) {\n switch (event.key.toLowerCase()) {\n case 'a': // Ctrl+A - go to start\n event.preventDefault();\n this.lineEditor.moveToStart();\n return;\n\n case 'e': // Ctrl+E - go to end\n event.preventDefault();\n this.lineEditor.moveToEnd();\n return;\n\n case 'u': // Ctrl+U - clear line\n event.preventDefault();\n this.lineEditor.clearLine();\n this.redrawLine();\n return;\n\n case 'w': // Ctrl+W - delete word\n event.preventDefault();\n this.lineEditor.deleteWord();\n this.redrawLine();\n return;\n\n case 'c': // Ctrl+C - cancel\n event.preventDefault();\n this.terminal.writeln('^C');\n this.lineEditor.clear();\n this.multiline.clear();\n this.history.reset();\n this.showPrompt();\n return;\n\n case 'l': // Ctrl+L - clear screen\n event.preventDefault();\n this.clearScreen();\n return;\n }\n\n // Ctrl+Left/Right for word navigation\n if (code === 37) { // Left\n event.preventDefault();\n this.lineEditor.moveWordLeft();\n return;\n }\n if (code === 39) { // Right\n event.preventDefault();\n this.lineEditor.moveWordRight();\n return;\n }\n\n return;\n }\n\n // Handle special keys\n switch (code) {\n case 13: // Enter\n this.handleEnter();\n return;\n\n case 8: // Backspace\n if (this.lineEditor.backspace()) {\n this.redrawLine();\n }\n return;\n\n case 46: // Delete\n if (this.lineEditor.delete()) {\n this.redrawLine();\n }\n return;\n\n case 37: // Left arrow\n this.lineEditor.moveLeft();\n return;\n\n case 39: // Right arrow\n this.lineEditor.moveRight();\n return;\n\n case 38: // Up arrow\n this.navigateHistory('up');\n return;\n\n case 40: // Down arrow\n this.navigateHistory('down');\n return;\n\n case 36: // Home\n this.lineEditor.moveToStart();\n return;\n\n case 35: // End\n this.lineEditor.moveToEnd();\n return;\n\n case 9: // Tab - ignore for now\n return;\n\n case 27: // Escape - ignore\n return;\n }\n\n // Regular character input\n if (key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n this.lineEditor.insert(key);\n this.redrawLine();\n }\n }\n\n private redrawLine(): void {\n const prompt = this.multiline.isEmpty ? this.primaryPrompt : this.continuationPrompt;\n this.lineEditor.render(prompt);\n }\n\n private navigateHistory(direction: 'up' | 'down'): void {\n let entry: string | null;\n\n if (direction === 'up') {\n entry = this.history.previous(this.lineEditor.value);\n } else {\n entry = this.history.next();\n }\n\n if (entry !== null) {\n this.lineEditor.setValue(entry);\n this.redrawLine();\n }\n }\n\n private async handleEnter(): Promise<void> {\n const line = this.lineEditor.value;\n this.terminal.writeln('');\n this.lineEditor.clear();\n\n // Handle dot commands (only on first line)\n if (this.multiline.isEmpty && line.trim().startsWith('.')) {\n this.history.add(line);\n const result = await handleDotCommand(line, {\n terminal: this.terminal,\n executor: this.executor,\n history: this.history,\n displayMode: this.displayMode,\n setDisplayMode: (mode) => {\n this.displayMode = mode;\n this.formatter.setDisplayMode(mode);\n },\n clearScreen: () => this.clearScreen(),\n });\n\n if (result.exit) {\n this.isExited = true;\n if (this.onExit) {\n this.onExit();\n }\n return;\n }\n\n this.showPrompt();\n return;\n }\n\n // Add line to multiline buffer\n this.multiline.addLine(line);\n\n // Check if statement is complete\n if (this.multiline.isComplete()) {\n const statement = this.multiline.content;\n this.multiline.clear();\n this.history.add(statement);\n this.history.reset();\n\n // Execute the statement\n const result = await this.executor.execute(statement);\n this.formatter.formatResult(result);\n }\n\n this.showPrompt();\n }\n\n private clearScreen(): void {\n this.terminal.write(TerminalAdapter.clearScreen());\n this.showPrompt();\n this.terminal.write(this.lineEditor.value);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { Executor, ExecutionResult } from '../types';\n\n/**\n * Interface for WebAssembly database instances.\n * This matches the WasmDB interface from reifydb-wasm.\n */\nexport interface WasmDB {\n admin(rql: string): Promise<unknown> | unknown;\n}\n\n/**\n * Executor adapter for WebAssembly-based ReifyDB instances.\n */\nexport class WasmExecutor implements Executor {\n private db: WasmDB;\n\n constructor(db: WasmDB) {\n this.db = db;\n }\n\n async execute(statement: string): Promise<ExecutionResult> {\n const trimmed = statement.trim();\n\n // Remove trailing semicolon for execution\n const query = trimmed.endsWith(';')\n ? trimmed.slice(0, -1).trim()\n : trimmed;\n\n if (!query) {\n return {\n success: true,\n data: [],\n executionTime: 0,\n };\n }\n\n const startTime = performance.now();\n\n try {\n const results = await this.db.admin(query);\n const endTime = performance.now();\n\n return {\n success: true,\n data: Array.isArray(results) ? results : [],\n executionTime: Math.round(endTime - startTime),\n };\n } catch (error) {\n const endTime = performance.now();\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n executionTime: Math.round(endTime - startTime),\n };\n }\n }\n\n async getTables(): Promise<string[]> {\n try {\n // Query system catalog for tables\n const result = await this.db.admin('FROM system.tables MAP { namespace, name }');\n if (Array.isArray(result)) {\n return result.map((row: Record<string, unknown>) => {\n const ns = row.namespace as string;\n const name = row.name as string;\n return ns ? `${ns}.${name}` : name;\n });\n }\n return [];\n } catch {\n return [];\n }\n }\n\n async getSchema(tableName: string): Promise<string | null> {\n try {\n // Query system catalog for table schema\n const result = await this.db.admin(\n `FROM system.columns FILTER table = \"${tableName}\" MAP { name, type }`\n );\n if (Array.isArray(result) && result.length > 0) {\n const columns = result.map((row: Record<string, unknown>) =>\n ` ${row.name}: ${row.type}`\n ).join(',\\n');\n return `${tableName} {\\n${columns}\\n}`;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { Executor, ExecutionResult } from '../types';\n\n/**\n * Interface for WebSocket client.\n * This matches the WsClient interface from @reifydb/client.\n */\nexport interface WsClient {\n admin<const S extends readonly unknown[]>(\n statements: string | string[],\n params: unknown,\n schemas: S\n ): Promise<unknown[][]>;\n}\n\n/**\n * Executor adapter for WebSocket-based ReifyDB connections.\n */\nexport class WsExecutor implements Executor {\n private client: WsClient;\n\n constructor(client: WsClient) {\n this.client = client;\n }\n\n async execute(statement: string): Promise<ExecutionResult> {\n const trimmed = statement.trim();\n\n // Remove trailing semicolon for execution\n const query = trimmed.endsWith(';')\n ? trimmed.slice(0, -1).trim()\n : trimmed;\n\n if (!query) {\n return {\n success: true,\n data: [],\n executionTime: 0,\n };\n }\n\n const startTime = performance.now();\n\n try {\n // Execute via admin endpoint with no schema transformation\n const frames = await this.client.admin(query, null, []);\n const endTime = performance.now();\n\n // Get first frame results (admin typically returns single frame)\n const results = frames[0] ?? [];\n\n // Convert results to plain objects\n const data = results.map((row: unknown) => {\n if (row && typeof row === 'object') {\n const plainRow: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row as Record<string, unknown>)) {\n // Extract primitive value from Value objects if present\n if (value && typeof value === 'object' && typeof (value as { valueOf(): unknown }).valueOf === 'function') {\n plainRow[key] = (value as { valueOf(): unknown }).valueOf();\n } else {\n plainRow[key] = value;\n }\n }\n return plainRow;\n }\n return row as Record<string, unknown>;\n });\n\n return {\n success: true,\n data,\n executionTime: Math.round(endTime - startTime),\n };\n } catch (error) {\n const endTime = performance.now();\n\n // Extract error message from ReifyError if present\n let errorMessage: string;\n if (error && typeof error === 'object' && 'diagnostic' in error) {\n const diagnostic = (error as { diagnostic: { message: string } }).diagnostic;\n errorMessage = diagnostic.message;\n } else if (error instanceof Error) {\n errorMessage = error.message;\n } else {\n errorMessage = String(error);\n }\n\n return {\n success: false,\n error: errorMessage,\n executionTime: Math.round(endTime - startTime),\n };\n }\n }\n\n async getTables(): Promise<string[]> {\n try {\n const frames = await this.client.admin(\n 'FROM system.tables MAP { namespace, name }',\n null,\n []\n );\n const results = frames[0] ?? [];\n\n return results.map((row: unknown) => {\n const r = row as Record<string, unknown>;\n const ns = this.extractValue(r.namespace) as string;\n const name = this.extractValue(r.name) as string;\n return ns ? `${ns}.${name}` : name;\n });\n } catch {\n return [];\n }\n }\n\n async getSchema(tableName: string): Promise<string | null> {\n try {\n const frames = await this.client.admin(\n `FROM system.columns FILTER table = \"${tableName}\" MAP { name, type }`,\n null,\n []\n );\n const results = frames[0] ?? [];\n\n if (results.length > 0) {\n const columns = results.map((row: unknown) => {\n const r = row as Record<string, unknown>;\n return ` ${this.extractValue(r.name)}: ${this.extractValue(r.type)}`;\n }).join(',\\n');\n return `${tableName} {\\n${columns}\\n}`;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private extractValue(value: unknown): unknown {\n if (value && typeof value === 'object' && typeof (value as { valueOf(): unknown }).valueOf === 'function') {\n return (value as { valueOf(): unknown }).valueOf();\n }\n return value;\n }\n}\n"],"mappings":"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","names":["C","C"]}
1
+ {"version":3,"sources":["../src/terminal/adapter.ts","../src/terminal/theme.ts","../src/input/line-editor.ts","../src/input/history.ts","../src/input/multiline.ts","../src/commands/dot-commands.ts","../src/output/table.ts","../src/output/formatter.ts","../src/shell.ts","../src/executors/wasm-executor.ts","../src/executors/ws-executor.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { Terminal } from '@xterm/xterm';\nimport { FitAddon } from '@xterm/addon-fit';\nimport '@xterm/xterm/css/xterm.css';\nimport './styles.css';\nimport { defaultTheme, COLORS, type TerminalTheme } from './theme';\n\nexport type KeyHandler = (key: string, domEvent: KeyboardEvent) => void;\n\nexport class TerminalAdapter {\n private terminal: Terminal;\n private fitAddon: FitAddon;\n private container: HTMLElement;\n private keyHandler: KeyHandler | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private _isFullscreen: boolean = false;\n\n constructor(container: HTMLElement, theme: TerminalTheme = defaultTheme) {\n this.container = container;\n this.terminal = new Terminal({\n theme,\n fontFamily: \"'JetBrains Mono', 'Fira Code', 'Consolas', 'Monaco', monospace\",\n fontSize: 14,\n lineHeight: 1.2,\n cursorBlink: true,\n cursorStyle: 'block',\n scrollback: 10000,\n allowProposedApi: true,\n });\n\n this.fitAddon = new FitAddon();\n this.terminal.loadAddon(this.fitAddon);\n\n container.innerHTML = '';\n this.terminal.open(container);\n this.fitAddon.fit();\n\n // Handle resize\n this.resizeObserver = new ResizeObserver(() => {\n this.fitAddon.fit();\n });\n this.resizeObserver.observe(container);\n\n // Handle key input\n this.terminal.onKey(({ key, domEvent }) => {\n if (this.keyHandler) {\n this.keyHandler(key, domEvent);\n }\n });\n }\n\n onKey(handler: KeyHandler): void {\n this.keyHandler = handler;\n }\n\n write(text: string): void {\n this.terminal.write(text);\n }\n\n writeln(text: string): void {\n this.terminal.writeln(text);\n }\n\n clear(): void {\n this.terminal.clear();\n }\n\n get cols(): number {\n return this.terminal.cols;\n }\n\n get rows(): number {\n return this.terminal.rows;\n }\n\n focus(): void {\n this.terminal.focus();\n }\n\n dispose(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n this.terminal.dispose();\n }\n\n get isFullscreen(): boolean {\n return this._isFullscreen;\n }\n\n enterFullscreen(): void {\n if (this._isFullscreen) return;\n this._isFullscreen = true;\n this.container.classList.add('reifydb-shell-fullscreen');\n this.fitAddon.fit();\n }\n\n exitFullscreen(): void {\n if (!this._isFullscreen) return;\n this._isFullscreen = false;\n this.container.classList.remove('reifydb-shell-fullscreen');\n this.fitAddon.fit();\n }\n\n // ANSI escape code helpers - static for use without instance\n static readonly COLORS = COLORS;\n\n // Cursor control helpers\n static cursorUp(n: number = 1): string {\n return `\\x1b[${n}A`;\n }\n\n static cursorDown(n: number = 1): string {\n return `\\x1b[${n}B`;\n }\n\n static cursorForward(n: number = 1): string {\n return `\\x1b[${n}C`;\n }\n\n static cursorBack(n: number = 1): string {\n return `\\x1b[${n}D`;\n }\n\n static cursorPosition(row: number, col: number): string {\n return `\\x1b[${row};${col}H`;\n }\n\n static clearLine(): string {\n return '\\x1b[2K';\n }\n\n static clearToEndOfLine(): string {\n return '\\x1b[K';\n }\n\n static clearScreen(): string {\n return '\\x1b[2J\\x1b[3J\\x1b[H';\n }\n\n static saveCursor(): string {\n return '\\x1b[s';\n }\n\n static restoreCursor(): string {\n return '\\x1b[u';\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\n/**\n * Terminal color theme configuration\n */\nexport interface TerminalTheme {\n background: string;\n foreground: string;\n cursor: string;\n cursorAccent: string;\n selectionBackground: string;\n black: string;\n red: string;\n green: string;\n yellow: string;\n blue: string;\n magenta: string;\n cyan: string;\n white: string;\n brightBlack: string;\n brightRed: string;\n brightGreen: string;\n brightYellow: string;\n brightBlue: string;\n brightMagenta: string;\n brightCyan: string;\n brightWhite: string;\n}\n\n/**\n * Catppuccin Mocha theme - default theme\n */\nexport const defaultTheme: TerminalTheme = {\n background: '#1e1e2e',\n foreground: '#cdd6f4',\n cursor: '#f5e0dc',\n cursorAccent: '#1e1e2e',\n selectionBackground: '#45475a',\n black: '#45475a',\n red: '#f38ba8',\n green: '#a6e3a1',\n yellow: '#f9e2af',\n blue: '#89b4fa',\n magenta: '#f5c2e7',\n cyan: '#94e2d5',\n white: '#bac2de',\n brightBlack: '#585b70',\n brightRed: '#f38ba8',\n brightGreen: '#a6e3a1',\n brightYellow: '#f9e2af',\n brightBlue: '#89b4fa',\n brightMagenta: '#f5c2e7',\n brightCyan: '#94e2d5',\n brightWhite: '#a6adc8',\n};\n\n/**\n * ANSI escape codes for terminal colors and formatting\n */\nexport const COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n\n // Foreground colors\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n\n // Bright foreground colors\n brightBlack: '\\x1b[90m',\n brightRed: '\\x1b[91m',\n brightGreen: '\\x1b[92m',\n brightYellow: '\\x1b[93m',\n brightBlue: '\\x1b[94m',\n brightMagenta: '\\x1b[95m',\n brightCyan: '\\x1b[96m',\n brightWhite: '\\x1b[97m',\n} as const;\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\n\nexport class LineEditor {\n private buffer: string = '';\n private cursorPos: number = 0;\n private terminal: TerminalAdapter;\n\n constructor(terminal: TerminalAdapter) {\n this.terminal = terminal;\n }\n\n get value(): string {\n return this.buffer;\n }\n\n get cursor(): number {\n return this.cursorPos;\n }\n\n clear(): void {\n this.buffer = '';\n this.cursorPos = 0;\n }\n\n setValue(value: string): void {\n this.buffer = value;\n this.cursorPos = value.length;\n }\n\n insert(char: string): void {\n this.buffer =\n this.buffer.slice(0, this.cursorPos) +\n char +\n this.buffer.slice(this.cursorPos);\n this.cursorPos++;\n }\n\n backspace(): boolean {\n if (this.cursorPos > 0) {\n this.buffer =\n this.buffer.slice(0, this.cursorPos - 1) +\n this.buffer.slice(this.cursorPos);\n this.cursorPos--;\n return true;\n }\n return false;\n }\n\n delete(): boolean {\n if (this.cursorPos < this.buffer.length) {\n this.buffer =\n this.buffer.slice(0, this.cursorPos) +\n this.buffer.slice(this.cursorPos + 1);\n return true;\n }\n return false;\n }\n\n moveLeft(): boolean {\n if (this.cursorPos > 0) {\n this.cursorPos--;\n this.terminal.write(TerminalAdapter.cursorBack());\n return true;\n }\n return false;\n }\n\n moveRight(): boolean {\n if (this.cursorPos < this.buffer.length) {\n this.cursorPos++;\n this.terminal.write(TerminalAdapter.cursorForward());\n return true;\n }\n return false;\n }\n\n moveToStart(): void {\n if (this.cursorPos > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(this.cursorPos));\n this.cursorPos = 0;\n }\n }\n\n moveToEnd(): void {\n if (this.cursorPos < this.buffer.length) {\n const distance = this.buffer.length - this.cursorPos;\n this.terminal.write(TerminalAdapter.cursorForward(distance));\n this.cursorPos = this.buffer.length;\n }\n }\n\n moveWordLeft(): void {\n if (this.cursorPos === 0) return;\n\n let newPos = this.cursorPos - 1;\n\n // Skip whitespace\n while (newPos > 0 && /\\s/.test(this.buffer[newPos])) {\n newPos--;\n }\n\n // Move to start of word\n while (newPos > 0 && !/\\s/.test(this.buffer[newPos - 1])) {\n newPos--;\n }\n\n const distance = this.cursorPos - newPos;\n if (distance > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(distance));\n this.cursorPos = newPos;\n }\n }\n\n moveWordRight(): void {\n if (this.cursorPos >= this.buffer.length) return;\n\n let newPos = this.cursorPos;\n\n // Move past current word\n while (newPos < this.buffer.length && !/\\s/.test(this.buffer[newPos])) {\n newPos++;\n }\n\n // Skip whitespace\n while (newPos < this.buffer.length && /\\s/.test(this.buffer[newPos])) {\n newPos++;\n }\n\n const distance = newPos - this.cursorPos;\n if (distance > 0) {\n this.terminal.write(TerminalAdapter.cursorForward(distance));\n this.cursorPos = newPos;\n }\n }\n\n clearLine(): void {\n this.buffer = '';\n this.cursorPos = 0;\n }\n\n deleteToEnd(): void {\n this.buffer = this.buffer.slice(0, this.cursorPos);\n }\n\n deleteToStart(): void {\n this.buffer = this.buffer.slice(this.cursorPos);\n this.cursorPos = 0;\n }\n\n deleteWord(): void {\n if (this.cursorPos === 0) return;\n\n let newPos = this.cursorPos - 1;\n\n // Skip whitespace\n while (newPos > 0 && /\\s/.test(this.buffer[newPos])) {\n newPos--;\n }\n\n // Move to start of word\n while (newPos > 0 && !/\\s/.test(this.buffer[newPos - 1])) {\n newPos--;\n }\n\n this.buffer = this.buffer.slice(0, newPos) + this.buffer.slice(this.cursorPos);\n this.cursorPos = newPos;\n }\n\n // Called by shell to render the line with prompt\n render(prompt: string): void {\n this.terminal.write(\n '\\r' +\n TerminalAdapter.clearToEndOfLine() +\n prompt +\n this.buffer\n );\n\n // Position cursor correctly\n const cursorOffset = this.buffer.length - this.cursorPos;\n if (cursorOffset > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(cursorOffset));\n }\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { HistoryStorage } from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'reifydb-shell-history';\nconst MAX_HISTORY = 1000;\n\n/**\n * Default localStorage-based history storage\n */\nexport class LocalStorageHistoryStorage implements HistoryStorage {\n private key: string;\n\n constructor(key: string = DEFAULT_STORAGE_KEY) {\n this.key = key;\n }\n\n load(): string[] {\n try {\n const stored = localStorage.getItem(this.key);\n if (stored) {\n const parsed = JSON.parse(stored);\n if (Array.isArray(parsed)) {\n return parsed.filter((e): e is string => typeof e === 'string');\n }\n }\n } catch {\n // Ignore localStorage errors\n }\n return [];\n }\n\n save(entries: string[]): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(entries));\n } catch {\n // Ignore localStorage errors (quota exceeded, etc.)\n }\n }\n}\n\n/**\n * In-memory history storage (no persistence)\n */\nexport class MemoryHistoryStorage implements HistoryStorage {\n private entries: string[] = [];\n\n load(): string[] {\n return [...this.entries];\n }\n\n save(entries: string[]): void {\n this.entries = [...entries];\n }\n}\n\nexport class CommandHistory {\n private entries: string[] = [];\n private position: number = -1;\n private savedInput: string = '';\n private storage: HistoryStorage;\n\n constructor(storage?: HistoryStorage, historyKey?: string) {\n this.storage = storage ?? new LocalStorageHistoryStorage(historyKey);\n this.entries = this.storage.load();\n }\n\n add(command: string): void {\n const trimmed = command.trim();\n if (!trimmed) return;\n\n // Don't add duplicates at the end\n if (this.entries.length > 0 && this.entries[this.entries.length - 1] === trimmed) {\n this.reset();\n return;\n }\n\n this.entries.push(trimmed);\n\n // Limit size\n if (this.entries.length > MAX_HISTORY) {\n this.entries = this.entries.slice(-MAX_HISTORY);\n }\n\n this.storage.save(this.entries);\n this.reset();\n }\n\n previous(currentInput: string): string | null {\n if (this.entries.length === 0) return null;\n\n // Save current input when starting navigation\n if (this.position === -1) {\n this.savedInput = currentInput;\n this.position = this.entries.length;\n }\n\n if (this.position > 0) {\n this.position--;\n return this.entries[this.position];\n }\n\n return null;\n }\n\n next(): string | null {\n if (this.position === -1) return null;\n\n if (this.position < this.entries.length - 1) {\n this.position++;\n return this.entries[this.position];\n }\n\n if (this.position === this.entries.length - 1) {\n this.position = -1;\n return this.savedInput;\n }\n\n return null;\n }\n\n reset(): void {\n this.position = -1;\n this.savedInput = '';\n }\n\n getAll(): string[] {\n return [...this.entries];\n }\n\n clear(): void {\n this.entries = [];\n this.position = -1;\n this.savedInput = '';\n this.storage.save(this.entries);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nexport class MultilineBuffer {\n private lines: string[] = [];\n\n get isEmpty(): boolean {\n return this.lines.length === 0;\n }\n\n get content(): string {\n return this.lines.join(' ');\n }\n\n addLine(line: string): void {\n this.lines.push(line);\n }\n\n clear(): void {\n this.lines = [];\n }\n\n isComplete(): boolean {\n // A statement is complete when it ends with a semicolon\n const full = this.content.trim();\n return full.endsWith(';');\n }\n\n static isStatementComplete(input: string): boolean {\n const trimmed = input.trim();\n return trimmed.endsWith(';');\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\nimport type { DotCommandContext, DotCommandResult, DisplayMode } from '../types';\n\nconst C = TerminalAdapter.COLORS;\n\nexport async function handleDotCommand(\n input: string,\n context: DotCommandContext\n): Promise<DotCommandResult> {\n const parts = input.trim().split(/\\s+/);\n const command = parts[0].toLowerCase();\n const args = parts.slice(1);\n\n switch (command) {\n case '.help':\n showHelp(context.terminal);\n return { handled: true };\n\n case '.clear':\n context.terminal.write(TerminalAdapter.clearScreen());\n return { handled: true };\n\n case '.mode':\n handleMode(args, context);\n return { handled: true };\n\n case '.history':\n showHistory(context);\n return { handled: true };\n\n case '.tables':\n await showTables(context);\n return { handled: true };\n\n case '.schema':\n await showSchema(args, context);\n return { handled: true };\n\n case '.fullscreen':\n context.enterFullscreen();\n return { handled: true };\n\n case '.exit':\n if (context.isFullscreen) {\n context.exitFullscreen();\n }\n return { handled: true };\n\n default:\n if (command.startsWith('.')) {\n context.terminal.writeln(\n `${C.red}Unknown command: ${command}${C.reset}`\n );\n context.terminal.writeln(`Type ${C.cyan}.help${C.reset} for available commands.`);\n return { handled: true };\n }\n return { handled: false };\n }\n}\n\nfunction showHelp(terminal: TerminalAdapter): void {\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Available commands:${C.reset}`);\n terminal.writeln('');\n terminal.writeln(` ${C.green}.help${C.reset} Show this help message`);\n terminal.writeln(` ${C.green}.clear${C.reset} Clear the screen`);\n terminal.writeln(` ${C.green}.mode${C.reset} [mode] Set display mode (truncate|full)`);\n terminal.writeln(` ${C.green}.history${C.reset} Show command history`);\n terminal.writeln(` ${C.green}.tables${C.reset} List all tables`);\n terminal.writeln(` ${C.green}.schema${C.reset} [table] Show table schema`);\n terminal.writeln(` ${C.green}.fullscreen${C.reset} Enter fullscreen mode`);\n terminal.writeln(` ${C.green}.exit${C.reset} Exit fullscreen mode`);\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Keyboard shortcuts:${C.reset}`);\n terminal.writeln('');\n terminal.writeln(` ${C.yellow}Left/Right${C.reset} Move cursor`);\n terminal.writeln(` ${C.yellow}Ctrl+Left/Right${C.reset} Move by word`);\n terminal.writeln(` ${C.yellow}Home/End${C.reset} Start/end of line`);\n terminal.writeln(` ${C.yellow}Ctrl+A/E${C.reset} Start/end of line`);\n terminal.writeln(` ${C.yellow}Ctrl+U${C.reset} Clear line`);\n terminal.writeln(` ${C.yellow}Ctrl+W${C.reset} Delete word`);\n terminal.writeln(` ${C.yellow}Up/Down${C.reset} Navigate history`);\n terminal.writeln(` ${C.yellow}Ctrl+C${C.reset} Cancel input`);\n terminal.writeln('');\n terminal.writeln(`${C.dim}Statements must end with a semicolon (;)${C.reset}`);\n terminal.writeln('');\n}\n\nfunction handleMode(args: string[], context: DotCommandContext): void {\n const terminal = context.terminal;\n\n if (args.length === 0) {\n terminal.writeln(`Current display mode: ${C.cyan}${context.displayMode}${C.reset}`);\n return;\n }\n\n const mode = args[0].toLowerCase();\n if (mode === 'truncate' || mode === 'full') {\n context.setDisplayMode(mode as DisplayMode);\n terminal.writeln(`Display mode set to: ${C.cyan}${mode}${C.reset}`);\n } else {\n terminal.writeln(\n `${C.red}Unknown mode: ${mode}${C.reset}. Use 'truncate' or 'full'.`\n );\n }\n}\n\nfunction showHistory(context: DotCommandContext): void {\n const terminal = context.terminal;\n const entries = context.history.getAll();\n\n if (entries.length === 0) {\n terminal.writeln(`${C.dim}No command history${C.reset}`);\n return;\n }\n\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Command history:${C.reset}`);\n terminal.writeln('');\n\n // Show last 20 entries\n const toShow = entries.slice(-20);\n const startIdx = entries.length - toShow.length;\n\n toShow.forEach((entry, i) => {\n const num = String(startIdx + i + 1).padStart(4, ' ');\n terminal.writeln(`${C.dim}${num}${C.reset} ${entry}`);\n });\n\n if (entries.length > 20) {\n terminal.writeln('');\n terminal.writeln(`${C.dim}... and ${entries.length - 20} more entries${C.reset}`);\n }\n terminal.writeln('');\n}\n\nasync function showTables(context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getTables) {\n terminal.writeln(`${C.dim}.tables command not supported by this executor${C.reset}`);\n return;\n }\n\n const tables = await context.executor.getTables();\n\n if (tables.length === 0) {\n terminal.writeln(`${C.dim}No tables found${C.reset}`);\n return;\n }\n\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Tables:${C.reset}`);\n terminal.writeln('');\n\n tables.forEach((table) => {\n terminal.writeln(` ${C.green}${table}${C.reset}`);\n });\n terminal.writeln('');\n}\n\nasync function showSchema(args: string[], context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getSchema) {\n terminal.writeln(`${C.dim}.schema command not supported by this executor${C.reset}`);\n return;\n }\n\n if (args.length === 0) {\n terminal.writeln(`${C.red}Usage: .schema <table_name>${C.reset}`);\n return;\n }\n\n const tableName = args[0];\n const schema = await context.executor.getSchema(tableName);\n\n if (schema) {\n terminal.writeln('');\n terminal.writeln(schema);\n terminal.writeln('');\n } else {\n terminal.writeln(`${C.red}Table not found: ${tableName}${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nexport interface TableColumn {\n name: string;\n width: number;\n}\n\nexport interface TableOptions {\n maxWidth?: number;\n truncate?: boolean;\n}\n\nexport class TableRenderer {\n private data: Record<string, unknown>[];\n private columns: TableColumn[];\n private maxWidth: number;\n private truncate: boolean;\n\n constructor(data: Record<string, unknown>[], options: TableOptions = {}) {\n this.data = data;\n this.maxWidth = options.maxWidth ?? 120;\n this.truncate = options.truncate ?? false;\n this.columns = this.calculateColumns();\n }\n\n private calculateColumns(): TableColumn[] {\n if (this.data.length === 0) return [];\n\n const columns: Map<string, number> = new Map();\n\n // Get all column names and calculate max widths\n for (const row of this.data) {\n for (const [key, value] of Object.entries(row)) {\n const valueStr = this.formatValue(value);\n const currentMax = columns.get(key) ?? key.length;\n columns.set(key, Math.max(currentMax, valueStr.length));\n }\n }\n\n return Array.from(columns.entries()).map(([name, width]) => ({\n name,\n width: Math.max(width, name.length),\n }));\n }\n\n private formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'undefined';\n }\n // Check if it's a core Value object (has type property and toString)\n if (value && typeof value === 'object' && 'type' in value && typeof (value as { toString(): string }).toString === 'function') {\n return (value as { toString(): string }).toString();\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n private truncateString(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n if (maxLen <= 3) return str.slice(0, maxLen);\n return str.slice(0, maxLen - 3) + '...';\n }\n\n render(): string[] {\n if (this.data.length === 0 || this.columns.length === 0) {\n return ['(no results)'];\n }\n\n const lines: string[] = [];\n let columnsToShow = this.columns;\n let widths = this.columns.map((c) => c.width);\n\n // Calculate how many columns fit\n if (this.truncate) {\n const result = this.fitColumns(this.maxWidth);\n columnsToShow = result.columns;\n widths = result.widths;\n }\n\n // Build separator line\n const separator =\n '+' + widths.map((w) => '-'.repeat(w + 2)).join('+') + '+';\n\n lines.push(separator);\n\n // Build header\n const headerCells = columnsToShow.map((col, i) =>\n this.padCenter(col.name, widths[i])\n );\n lines.push('| ' + headerCells.join(' | ') + ' |');\n lines.push(separator);\n\n // Build rows\n for (const row of this.data) {\n const cells = columnsToShow.map((col, i) => {\n const value = this.formatValue(row[col.name]);\n const truncated = this.truncate\n ? this.truncateString(value, widths[i])\n : value;\n return this.padRight(truncated, widths[i]);\n });\n lines.push('| ' + cells.join(' | ') + ' |');\n }\n\n lines.push(separator);\n\n return lines;\n }\n\n private fitColumns(maxWidth: number): {\n columns: TableColumn[];\n widths: number[];\n } {\n const columns: TableColumn[] = [];\n const widths: number[] = [];\n let currentWidth = 1; // Starting '|'\n\n for (const col of this.columns) {\n // Each column: ' content ' + '|' = 3 extra chars\n const colWidth = Math.min(col.width, 40); // Cap individual column width\n const totalColWidth = colWidth + 3;\n\n if (currentWidth + totalColWidth <= maxWidth) {\n columns.push(col);\n widths.push(colWidth);\n currentWidth += totalColWidth;\n } else {\n break;\n }\n }\n\n // If no columns fit, show at least the first one\n if (columns.length === 0 && this.columns.length > 0) {\n const firstCol = this.columns[0];\n const availableWidth = maxWidth - 4; // '| ' and ' |'\n columns.push(firstCol);\n widths.push(Math.max(availableWidth, 10));\n }\n\n return { columns, widths };\n }\n\n private padCenter(str: string, width: number): string {\n const padding = width - str.length;\n if (padding <= 0) return str.slice(0, width);\n const left = Math.floor(padding / 2);\n const right = padding - left;\n return ' '.repeat(left) + str + ' '.repeat(right);\n }\n\n private padRight(str: string, width: number): string {\n const padding = width - str.length;\n if (padding <= 0) return str.slice(0, width);\n return str + ' '.repeat(padding);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\nimport { TableRenderer } from './table';\nimport type { ExecutionResult, DisplayMode } from '../types';\n\nconst C = TerminalAdapter.COLORS;\n\nexport class OutputFormatter {\n private terminal: TerminalAdapter;\n private displayMode: DisplayMode;\n\n constructor(terminal: TerminalAdapter, displayMode: DisplayMode = 'full') {\n this.terminal = terminal;\n this.displayMode = displayMode;\n }\n\n setDisplayMode(mode: DisplayMode): void {\n this.displayMode = mode;\n }\n\n formatResult(result: ExecutionResult): void {\n if (!result.success) {\n this.formatError(result.error ?? 'Unknown error', result.executionTime);\n return;\n }\n\n if (!result.data || result.data.length === 0) {\n this.terminal.writeln('');\n this.terminal.writeln(`${C.dim}Query executed successfully. No rows returned.${C.reset}`);\n this.formatExecutionTime(result.executionTime);\n return;\n }\n\n this.formatTable(result.data, result.executionTime);\n }\n\n private formatTable(data: Record<string, unknown>[], executionTime: number): void {\n const renderer = new TableRenderer(data, {\n maxWidth: this.displayMode === 'truncate' ? this.terminal.cols - 2 : undefined,\n truncate: this.displayMode === 'truncate',\n });\n\n const lines = renderer.render();\n this.terminal.writeln('');\n for (const line of lines) {\n this.terminal.writeln(line);\n }\n\n const rowCount = data.length;\n this.terminal.writeln('');\n this.terminal.write(\n `${C.green}${rowCount} row${rowCount !== 1 ? 's' : ''}${C.reset}`\n );\n this.formatExecutionTime(executionTime);\n }\n\n private formatError(error: string, executionTime: number): void {\n this.terminal.writeln('');\n for (const line of error.split('\\n')) {\n this.terminal.writeln(line);\n }\n this.formatExecutionTime(executionTime);\n }\n\n private formatExecutionTime(ms: number): void {\n this.terminal.writeln(` ${C.dim}(${ms}ms)${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from './terminal/adapter';\nimport { COLORS } from './terminal/theme';\nimport { LineEditor } from './input/line-editor';\nimport { CommandHistory } from './input/history';\nimport { MultilineBuffer } from './input/multiline';\nimport { handleDotCommand } from './commands/dot-commands';\nimport { OutputFormatter } from './output/formatter';\nimport type { ShellOptions, DisplayMode, Executor } from './types';\n\nconst C = COLORS;\n\n// Default prompts\nconst DEFAULT_PRIMARY_PROMPT = `${C.cyan}reifydb${C.reset}${C.brightBlack}>${C.reset} `;\nconst DEFAULT_CONTINUATION_PROMPT = `${C.brightBlack} ...${C.reset} `;\n\n// Prompt lengths without ANSI codes (for cursor positioning)\nconst DEFAULT_PRIMARY_PROMPT_LEN = 9; // \"reifydb> \"\nconst DEFAULT_CONTINUATION_PROMPT_LEN = 8; // \" ... \"\n\nexport class Shell {\n private terminal: TerminalAdapter;\n private lineEditor: LineEditor;\n private history: CommandHistory;\n private multiline: MultilineBuffer;\n private executor: Executor;\n private formatter: OutputFormatter;\n private displayMode: DisplayMode;\n private isExited: boolean = false;\n\n // Configurable options\n private primaryPrompt: string;\n private primaryPromptLen: number;\n private continuationPrompt: string;\n private continuationPromptLen: number;\n private welcomeMessage: string | string[] | (() => string[]) | undefined;\n private onExit: (() => void) | undefined;\n private onFullscreenChange: ((isFullscreen: boolean) => void) | undefined;\n\n constructor(container: HTMLElement, options: ShellOptions) {\n this.executor = options.executor;\n this.displayMode = options.displayMode ?? 'full';\n this.welcomeMessage = options.welcomeMessage;\n this.onExit = options.onExit;\n this.onFullscreenChange = options.onFullscreenChange;\n\n // Set up prompts\n this.primaryPrompt = options.prompt ?? DEFAULT_PRIMARY_PROMPT;\n this.primaryPromptLen = options.promptLength ?? DEFAULT_PRIMARY_PROMPT_LEN;\n this.continuationPrompt = options.continuationPrompt ?? DEFAULT_CONTINUATION_PROMPT;\n this.continuationPromptLen = options.continuationPromptLength ?? DEFAULT_CONTINUATION_PROMPT_LEN;\n\n // Initialize components\n this.terminal = new TerminalAdapter(container, options.theme);\n this.lineEditor = new LineEditor(this.terminal);\n this.history = new CommandHistory(options.historyStorage, options.historyKey);\n this.multiline = new MultilineBuffer();\n this.formatter = new OutputFormatter(this.terminal, this.displayMode);\n\n this.setupKeyHandler();\n }\n\n start(): void {\n this.showWelcomeBanner();\n this.showPrompt();\n this.terminal.focus();\n }\n\n dispose(): void {\n this.isExited = true;\n this.terminal.exitFullscreen();\n this.terminal.dispose();\n }\n\n get isFullscreen(): boolean {\n return this.terminal.isFullscreen;\n }\n\n enterFullscreen(): void {\n this.terminal.enterFullscreen();\n this.onFullscreenChange?.(true);\n }\n\n exitFullscreen(): void {\n this.terminal.exitFullscreen();\n this.onFullscreenChange?.(false);\n }\n\n private showWelcomeBanner(): void {\n if (this.welcomeMessage === undefined) {\n // Default welcome banner\n this.terminal.writeln('');\n this.terminal.writeln(`${C.bold}${C.cyan}ReifyDB Shell${C.reset}`);\n this.terminal.writeln('');\n this.terminal.writeln(`Type ${C.green}.help${C.reset} for available commands`);\n this.terminal.writeln(`Statements must end with a semicolon ${C.yellow};${C.reset}`);\n this.terminal.writeln('');\n return;\n }\n\n let lines: string[];\n if (typeof this.welcomeMessage === 'function') {\n lines = this.welcomeMessage();\n } else if (Array.isArray(this.welcomeMessage)) {\n lines = this.welcomeMessage;\n } else {\n lines = [this.welcomeMessage];\n }\n\n for (const line of lines) {\n this.terminal.writeln(line);\n }\n }\n\n private showPrompt(): void {\n const prompt = this.multiline.isEmpty ? this.primaryPrompt : this.continuationPrompt;\n this.terminal.write(prompt);\n }\n\n private getCurrentPromptLen(): number {\n return this.multiline.isEmpty ? this.primaryPromptLen : this.continuationPromptLen;\n }\n\n private setupKeyHandler(): void {\n this.terminal.onKey((key, event) => {\n if (this.isExited) return;\n this.handleKey(key, event);\n });\n }\n\n private handleKey(key: string, event: KeyboardEvent): void {\n const code = event.keyCode;\n\n // Handle Ctrl key combinations\n if (event.ctrlKey) {\n switch (event.key.toLowerCase()) {\n case 'a': // Ctrl+A - go to start\n event.preventDefault();\n this.lineEditor.moveToStart();\n return;\n\n case 'e': // Ctrl+E - go to end\n event.preventDefault();\n this.lineEditor.moveToEnd();\n return;\n\n case 'u': // Ctrl+U - clear line\n event.preventDefault();\n this.lineEditor.clearLine();\n this.redrawLine();\n return;\n\n case 'w': // Ctrl+W - delete word\n event.preventDefault();\n this.lineEditor.deleteWord();\n this.redrawLine();\n return;\n\n case 'c': // Ctrl+C - cancel\n event.preventDefault();\n this.terminal.writeln('^C');\n this.lineEditor.clear();\n this.multiline.clear();\n this.history.reset();\n this.showPrompt();\n return;\n\n case 'l': // Ctrl+L - clear screen\n event.preventDefault();\n this.clearScreen();\n return;\n }\n\n // Ctrl+Left/Right for word navigation\n if (code === 37) { // Left\n event.preventDefault();\n this.lineEditor.moveWordLeft();\n return;\n }\n if (code === 39) { // Right\n event.preventDefault();\n this.lineEditor.moveWordRight();\n return;\n }\n\n return;\n }\n\n // Handle special keys\n switch (code) {\n case 13: // Enter\n this.handleEnter();\n return;\n\n case 8: // Backspace\n if (this.lineEditor.backspace()) {\n this.redrawLine();\n }\n return;\n\n case 46: // Delete\n if (this.lineEditor.delete()) {\n this.redrawLine();\n }\n return;\n\n case 37: // Left arrow\n this.lineEditor.moveLeft();\n return;\n\n case 39: // Right arrow\n this.lineEditor.moveRight();\n return;\n\n case 38: // Up arrow\n this.navigateHistory('up');\n return;\n\n case 40: // Down arrow\n this.navigateHistory('down');\n return;\n\n case 36: // Home\n this.lineEditor.moveToStart();\n return;\n\n case 35: // End\n this.lineEditor.moveToEnd();\n return;\n\n case 9: // Tab - ignore for now\n return;\n\n case 27: // Escape - exit fullscreen\n if (this.terminal.isFullscreen) {\n this.exitFullscreen();\n }\n return;\n }\n\n // Regular character input\n if (key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n this.lineEditor.insert(key);\n this.redrawLine();\n }\n }\n\n private redrawLine(): void {\n const prompt = this.multiline.isEmpty ? this.primaryPrompt : this.continuationPrompt;\n this.lineEditor.render(prompt);\n }\n\n private navigateHistory(direction: 'up' | 'down'): void {\n let entry: string | null;\n\n if (direction === 'up') {\n entry = this.history.previous(this.lineEditor.value);\n } else {\n entry = this.history.next();\n }\n\n if (entry !== null) {\n this.lineEditor.setValue(entry);\n this.redrawLine();\n }\n }\n\n private async handleEnter(): Promise<void> {\n const line = this.lineEditor.value;\n this.terminal.writeln('');\n this.lineEditor.clear();\n\n // Handle dot commands (only on first line)\n if (this.multiline.isEmpty && line.trim().startsWith('.')) {\n this.history.add(line);\n const result = await handleDotCommand(line, {\n terminal: this.terminal,\n executor: this.executor,\n history: this.history,\n displayMode: this.displayMode,\n setDisplayMode: (mode) => {\n this.displayMode = mode;\n this.formatter.setDisplayMode(mode);\n },\n clearScreen: () => this.clearScreen(),\n isFullscreen: this.isFullscreen,\n enterFullscreen: () => this.enterFullscreen(),\n exitFullscreen: () => this.exitFullscreen(),\n });\n\n if (result.exit) {\n this.isExited = true;\n if (this.onExit) {\n this.onExit();\n }\n return;\n }\n\n this.showPrompt();\n return;\n }\n\n // Add line to multiline buffer\n this.multiline.addLine(line);\n\n // Check if statement is complete\n if (this.multiline.isComplete()) {\n const statement = this.multiline.content;\n this.multiline.clear();\n this.history.add(statement);\n this.history.reset();\n\n // Execute the statement\n const result = await this.executor.execute(statement);\n this.formatter.formatResult(result);\n }\n\n this.showPrompt();\n }\n\n private clearScreen(): void {\n this.terminal.write(TerminalAdapter.clearScreen());\n this.showPrompt();\n this.terminal.write(this.lineEditor.value);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { Executor, ExecutionResult } from '../types';\n\n/**\n * Interface for WebAssembly database instances.\n * This matches the WasmDB interface from reifydb-wasm.\n */\nexport interface WasmDB {\n admin(rql: string): Promise<unknown> | unknown;\n}\n\n/**\n * Executor adapter for WebAssembly-based ReifyDB instances.\n */\nexport class WasmExecutor implements Executor {\n private db: WasmDB;\n\n constructor(db: WasmDB) {\n this.db = db;\n }\n\n async execute(statement: string): Promise<ExecutionResult> {\n const trimmed = statement.trim();\n\n // Remove trailing semicolon for execution\n const query = trimmed.endsWith(';')\n ? trimmed.slice(0, -1).trim()\n : trimmed;\n\n if (!query) {\n return {\n success: true,\n data: [],\n executionTime: 0,\n };\n }\n\n const startTime = performance.now();\n\n try {\n const results = await this.db.admin(query);\n const endTime = performance.now();\n\n return {\n success: true,\n data: Array.isArray(results) ? results : [],\n executionTime: Math.round(endTime - startTime),\n };\n } catch (error) {\n const endTime = performance.now();\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n executionTime: Math.round(endTime - startTime),\n };\n }\n }\n\n async getTables(): Promise<string[]> {\n try {\n // Query system catalog for tables\n const result = await this.db.admin('FROM system::tables MAP { namespace, name }');\n if (Array.isArray(result)) {\n return result.map((row: Record<string, unknown>) => {\n const ns = row.namespace as string;\n const name = row.name as string;\n return ns ? `${ns}::${name}` : name;\n });\n }\n return [];\n } catch {\n return [];\n }\n }\n\n async getSchema(tableName: string): Promise<string | null> {\n try {\n // Query system catalog for table schema\n const result = await this.db.admin(\n `FROM system::columns FILTER table = \"${tableName}\" MAP { name, type }`\n );\n if (Array.isArray(result) && result.length > 0) {\n const columns = result.map((row: Record<string, unknown>) =>\n ` ${row.name}: ${row.type}`\n ).join(',\\n');\n return `${tableName} {\\n${columns}\\n}`;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { Executor, ExecutionResult } from '../types';\n\n/**\n * Interface for WebSocket client.\n * This matches the WsClient interface from @reifydb/client.\n */\nexport interface WsClient {\n admin<const S extends readonly unknown[]>(\n statements: string | string[],\n params: unknown,\n schemas: S\n ): Promise<unknown[][]>;\n}\n\n/**\n * Executor adapter for WebSocket-based ReifyDB connections.\n */\nexport class WsExecutor implements Executor {\n private client: WsClient;\n\n constructor(client: WsClient) {\n this.client = client;\n }\n\n async execute(statement: string): Promise<ExecutionResult> {\n const trimmed = statement.trim();\n\n // Remove trailing semicolon for execution\n const query = trimmed.endsWith(';')\n ? trimmed.slice(0, -1).trim()\n : trimmed;\n\n if (!query) {\n return {\n success: true,\n data: [],\n executionTime: 0,\n };\n }\n\n const startTime = performance.now();\n\n try {\n // Execute via admin endpoint with no schema transformation\n const frames = await this.client.admin(query, null, []);\n const endTime = performance.now();\n\n // Get first frame results (admin typically returns single frame)\n const results = frames[0] ?? [];\n\n // Convert results to plain objects, keeping Value objects as-is\n const data = results.map((row: unknown) => {\n if (row && typeof row === 'object') {\n const plainRow: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row as Record<string, unknown>)) {\n plainRow[key] = value; // Keep Value objects as-is\n }\n return plainRow;\n }\n return row as Record<string, unknown>;\n });\n\n return {\n success: true,\n data,\n executionTime: Math.round(endTime - startTime),\n };\n } catch (error) {\n const endTime = performance.now();\n\n // Extract error message from ReifyError if present\n let errorMessage: string;\n if (error && typeof error === 'object' && 'diagnostic' in error) {\n const diagnostic = (error as { diagnostic: { message: string } }).diagnostic;\n errorMessage = diagnostic.message;\n } else if (error instanceof Error) {\n errorMessage = error.message;\n } else {\n errorMessage = String(error);\n }\n\n return {\n success: false,\n error: errorMessage,\n executionTime: Math.round(endTime - startTime),\n };\n }\n }\n\n async getTables(): Promise<string[]> {\n try {\n const frames = await this.client.admin(\n 'FROM system::tables MAP { namespace, name }',\n null,\n []\n );\n const results = frames[0] ?? [];\n\n return results.map((row: unknown) => {\n const r = row as Record<string, unknown>;\n const ns = this.extractValue(r.namespace) as string;\n const name = this.extractValue(r.name) as string;\n return ns ? `${ns}::${name}` : name;\n });\n } catch {\n return [];\n }\n }\n\n async getSchema(tableName: string): Promise<string | null> {\n try {\n const frames = await this.client.admin(\n `FROM system::columns FILTER table = \"${tableName}\" MAP { name, type }`,\n null,\n []\n );\n const results = frames[0] ?? [];\n\n if (results.length > 0) {\n const columns = results.map((row: unknown) => {\n const r = row as Record<string, unknown>;\n return ` ${this.extractValue(r.name)}: ${this.extractValue(r.type)}`;\n }).join(',\\n');\n return `${tableName} {\\n${columns}\\n}`;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private extractValue(value: unknown): unknown {\n if (value && typeof value === 'object' && typeof (value as { valueOf(): unknown }).valueOf === 'function') {\n return (value as { valueOf(): unknown }).valueOf();\n }\n return value;\n }\n}\n"],"mappings":";AAGA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,OAAO;;;AC4BA,IAAM,eAA8B;AAAA,EACzC,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AACf;AAKO,IAAM,SAAS;AAAA,EACpB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AAAA;AAAA,EAGX,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA;AAAA,EAGP,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AACf;;;AD3EO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAgC;AAAA,EAChC,iBAAwC;AAAA,EACxC,gBAAyB;AAAA,EAEjC,YAAY,WAAwB,QAAuB,cAAc;AACvE,SAAK,YAAY;AACjB,SAAK,WAAW,IAAI,SAAS;AAAA,MAC3B;AAAA,MACA,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,kBAAkB;AAAA,IACpB,CAAC;AAED,SAAK,WAAW,IAAI,SAAS;AAC7B,SAAK,SAAS,UAAU,KAAK,QAAQ;AAErC,cAAU,YAAY;AACtB,SAAK,SAAS,KAAK,SAAS;AAC5B,SAAK,SAAS,IAAI;AAGlB,SAAK,iBAAiB,IAAI,eAAe,MAAM;AAC7C,WAAK,SAAS,IAAI;AAAA,IACpB,CAAC;AACD,SAAK,eAAe,QAAQ,SAAS;AAGrC,SAAK,SAAS,MAAM,CAAC,EAAE,KAAK,SAAS,MAAM;AACzC,UAAI,KAAK,YAAY;AACnB,aAAK,WAAW,KAAK,QAAQ;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAA2B;AAC/B,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,MAAoB;AACxB,SAAK,SAAS,MAAM,IAAI;AAAA,EAC1B;AAAA,EAEA,QAAQ,MAAoB;AAC1B,SAAK,SAAS,QAAQ,IAAI;AAAA,EAC5B;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,gBAAgB;AACvB,WAAK,eAAe,WAAW;AAC/B,WAAK,iBAAiB;AAAA,IACxB;AACA,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,eAAwB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAAwB;AACtB,QAAI,KAAK,cAAe;AACxB,SAAK,gBAAgB;AACrB,SAAK,UAAU,UAAU,IAAI,0BAA0B;AACvD,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,iBAAuB;AACrB,QAAI,CAAC,KAAK,cAAe;AACzB,SAAK,gBAAgB;AACrB,SAAK,UAAU,UAAU,OAAO,0BAA0B;AAC1D,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA;AAAA,EAGA,OAAgB,SAAS;AAAA;AAAA,EAGzB,OAAO,SAAS,IAAY,GAAW;AACrC,WAAO,QAAQ,CAAC;AAAA,EAClB;AAAA,EAEA,OAAO,WAAW,IAAY,GAAW;AACvC,WAAO,QAAQ,CAAC;AAAA,EAClB;AAAA,EAEA,OAAO,cAAc,IAAY,GAAW;AAC1C,WAAO,QAAQ,CAAC;AAAA,EAClB;AAAA,EAEA,OAAO,WAAW,IAAY,GAAW;AACvC,WAAO,QAAQ,CAAC;AAAA,EAClB;AAAA,EAEA,OAAO,eAAe,KAAa,KAAqB;AACtD,WAAO,QAAQ,GAAG,IAAI,GAAG;AAAA,EAC3B;AAAA,EAEA,OAAO,YAAoB;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,mBAA2B;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,cAAsB;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,aAAqB;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,gBAAwB;AAC7B,WAAO;AAAA,EACT;AACF;;;AEjJO,IAAM,aAAN,MAAiB;AAAA,EACd,SAAiB;AAAA,EACjB,YAAoB;AAAA,EACpB;AAAA,EAER,YAAY,UAA2B;AACrC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS;AACd,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,SAAS,OAAqB;AAC5B,SAAK,SAAS;AACd,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA,EAEA,OAAO,MAAoB;AACzB,SAAK,SACH,KAAK,OAAO,MAAM,GAAG,KAAK,SAAS,IACnC,OACA,KAAK,OAAO,MAAM,KAAK,SAAS;AAClC,SAAK;AAAA,EACP;AAAA,EAEA,YAAqB;AACnB,QAAI,KAAK,YAAY,GAAG;AACtB,WAAK,SACH,KAAK,OAAO,MAAM,GAAG,KAAK,YAAY,CAAC,IACvC,KAAK,OAAO,MAAM,KAAK,SAAS;AAClC,WAAK;AACL,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAkB;AAChB,QAAI,KAAK,YAAY,KAAK,OAAO,QAAQ;AACvC,WAAK,SACH,KAAK,OAAO,MAAM,GAAG,KAAK,SAAS,IACnC,KAAK,OAAO,MAAM,KAAK,YAAY,CAAC;AACtC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,WAAoB;AAClB,QAAI,KAAK,YAAY,GAAG;AACtB,WAAK;AACL,WAAK,SAAS,MAAM,gBAAgB,WAAW,CAAC;AAChD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAqB;AACnB,QAAI,KAAK,YAAY,KAAK,OAAO,QAAQ;AACvC,WAAK;AACL,WAAK,SAAS,MAAM,gBAAgB,cAAc,CAAC;AACnD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAoB;AAClB,QAAI,KAAK,YAAY,GAAG;AACtB,WAAK,SAAS,MAAM,gBAAgB,WAAW,KAAK,SAAS,CAAC;AAC9D,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,YAAkB;AAChB,QAAI,KAAK,YAAY,KAAK,OAAO,QAAQ;AACvC,YAAM,WAAW,KAAK,OAAO,SAAS,KAAK;AAC3C,WAAK,SAAS,MAAM,gBAAgB,cAAc,QAAQ,CAAC;AAC3D,WAAK,YAAY,KAAK,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,eAAqB;AACnB,QAAI,KAAK,cAAc,EAAG;AAE1B,QAAI,SAAS,KAAK,YAAY;AAG9B,WAAO,SAAS,KAAK,KAAK,KAAK,KAAK,OAAO,MAAM,CAAC,GAAG;AACnD;AAAA,IACF;AAGA,WAAO,SAAS,KAAK,CAAC,KAAK,KAAK,KAAK,OAAO,SAAS,CAAC,CAAC,GAAG;AACxD;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,YAAY;AAClC,QAAI,WAAW,GAAG;AAChB,WAAK,SAAS,MAAM,gBAAgB,WAAW,QAAQ,CAAC;AACxD,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,gBAAsB;AACpB,QAAI,KAAK,aAAa,KAAK,OAAO,OAAQ;AAE1C,QAAI,SAAS,KAAK;AAGlB,WAAO,SAAS,KAAK,OAAO,UAAU,CAAC,KAAK,KAAK,KAAK,OAAO,MAAM,CAAC,GAAG;AACrE;AAAA,IACF;AAGA,WAAO,SAAS,KAAK,OAAO,UAAU,KAAK,KAAK,KAAK,OAAO,MAAM,CAAC,GAAG;AACpE;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,KAAK;AAC/B,QAAI,WAAW,GAAG;AAChB,WAAK,SAAS,MAAM,gBAAgB,cAAc,QAAQ,CAAC;AAC3D,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,YAAkB;AAChB,SAAK,SAAS;AACd,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,cAAoB;AAClB,SAAK,SAAS,KAAK,OAAO,MAAM,GAAG,KAAK,SAAS;AAAA,EACnD;AAAA,EAEA,gBAAsB;AACpB,SAAK,SAAS,KAAK,OAAO,MAAM,KAAK,SAAS;AAC9C,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,aAAmB;AACjB,QAAI,KAAK,cAAc,EAAG;AAE1B,QAAI,SAAS,KAAK,YAAY;AAG9B,WAAO,SAAS,KAAK,KAAK,KAAK,KAAK,OAAO,MAAM,CAAC,GAAG;AACnD;AAAA,IACF;AAGA,WAAO,SAAS,KAAK,CAAC,KAAK,KAAK,KAAK,OAAO,SAAS,CAAC,CAAC,GAAG;AACxD;AAAA,IACF;AAEA,SAAK,SAAS,KAAK,OAAO,MAAM,GAAG,MAAM,IAAI,KAAK,OAAO,MAAM,KAAK,SAAS;AAC7E,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA,EAGA,OAAO,QAAsB;AAC3B,SAAK,SAAS;AAAA,MACZ,OACA,gBAAgB,iBAAiB,IACjC,SACA,KAAK;AAAA,IACP;AAGA,UAAM,eAAe,KAAK,OAAO,SAAS,KAAK;AAC/C,QAAI,eAAe,GAAG;AACpB,WAAK,SAAS,MAAM,gBAAgB,WAAW,YAAY,CAAC;AAAA,IAC9D;AAAA,EACF;AACF;;;ACrLA,IAAM,sBAAsB;AAC5B,IAAM,cAAc;AAKb,IAAM,6BAAN,MAA2D;AAAA,EACxD;AAAA,EAER,YAAY,MAAc,qBAAqB;AAC7C,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,OAAiB;AACf,QAAI;AACF,YAAM,SAAS,aAAa,QAAQ,KAAK,GAAG;AAC5C,UAAI,QAAQ;AACV,cAAM,SAAS,KAAK,MAAM,MAAM;AAChC,YAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,iBAAO,OAAO,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAAA,QAChE;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,KAAK,SAAyB;AAC5B,QAAI;AACF,mBAAa,QAAQ,KAAK,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IACxD,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAKO,IAAM,uBAAN,MAAqD;AAAA,EAClD,UAAoB,CAAC;AAAA,EAE7B,OAAiB;AACf,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA,EAEA,KAAK,SAAyB;AAC5B,SAAK,UAAU,CAAC,GAAG,OAAO;AAAA,EAC5B;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,UAAoB,CAAC;AAAA,EACrB,WAAmB;AAAA,EACnB,aAAqB;AAAA,EACrB;AAAA,EAER,YAAY,SAA0B,YAAqB;AACzD,SAAK,UAAU,WAAW,IAAI,2BAA2B,UAAU;AACnE,SAAK,UAAU,KAAK,QAAQ,KAAK;AAAA,EACnC;AAAA,EAEA,IAAI,SAAuB;AACzB,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,CAAC,QAAS;AAGd,QAAI,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,KAAK,QAAQ,SAAS,CAAC,MAAM,SAAS;AAChF,WAAK,MAAM;AACX;AAAA,IACF;AAEA,SAAK,QAAQ,KAAK,OAAO;AAGzB,QAAI,KAAK,QAAQ,SAAS,aAAa;AACrC,WAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,WAAW;AAAA,IAChD;AAEA,SAAK,QAAQ,KAAK,KAAK,OAAO;AAC9B,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,SAAS,cAAqC;AAC5C,QAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AAGtC,QAAI,KAAK,aAAa,IAAI;AACxB,WAAK,aAAa;AAClB,WAAK,WAAW,KAAK,QAAQ;AAAA,IAC/B;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB,WAAK;AACL,aAAO,KAAK,QAAQ,KAAK,QAAQ;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAsB;AACpB,QAAI,KAAK,aAAa,GAAI,QAAO;AAEjC,QAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC3C,WAAK;AACL,aAAO,KAAK,QAAQ,KAAK,QAAQ;AAAA,IACnC;AAEA,QAAI,KAAK,aAAa,KAAK,QAAQ,SAAS,GAAG;AAC7C,WAAK,WAAW;AAChB,aAAO,KAAK;AAAA,IACd;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,WAAW;AAChB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,SAAmB;AACjB,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,CAAC;AAChB,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,QAAQ,KAAK,KAAK,OAAO;AAAA,EAChC;AACF;;;ACtIO,IAAM,kBAAN,MAAsB;AAAA,EACnB,QAAkB,CAAC;AAAA,EAE3B,IAAI,UAAmB;AACrB,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AAAA,EAEA,IAAI,UAAkB;AACpB,WAAO,KAAK,MAAM,KAAK,GAAG;AAAA,EAC5B;AAAA,EAEA,QAAQ,MAAoB;AAC1B,SAAK,MAAM,KAAK,IAAI;AAAA,EACtB;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ,CAAC;AAAA,EAChB;AAAA,EAEA,aAAsB;AAEpB,UAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,WAAO,KAAK,SAAS,GAAG;AAAA,EAC1B;AAAA,EAEA,OAAO,oBAAoB,OAAwB;AACjD,UAAM,UAAU,MAAM,KAAK;AAC3B,WAAO,QAAQ,SAAS,GAAG;AAAA,EAC7B;AACF;;;AC1BA,IAAM,IAAI,gBAAgB;AAE1B,eAAsB,iBACpB,OACA,SAC2B;AAC3B,QAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,KAAK;AACtC,QAAM,UAAU,MAAM,CAAC,EAAE,YAAY;AACrC,QAAM,OAAO,MAAM,MAAM,CAAC;AAE1B,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,eAAS,QAAQ,QAAQ;AACzB,aAAO,EAAE,SAAS,KAAK;AAAA,IAEzB,KAAK;AACH,cAAQ,SAAS,MAAM,gBAAgB,YAAY,CAAC;AACpD,aAAO,EAAE,SAAS,KAAK;AAAA,IAEzB,KAAK;AACH,iBAAW,MAAM,OAAO;AACxB,aAAO,EAAE,SAAS,KAAK;AAAA,IAEzB,KAAK;AACH,kBAAY,OAAO;AACnB,aAAO,EAAE,SAAS,KAAK;AAAA,IAEzB,KAAK;AACH,YAAM,WAAW,OAAO;AACxB,aAAO,EAAE,SAAS,KAAK;AAAA,IAEzB,KAAK;AACH,YAAM,WAAW,MAAM,OAAO;AAC9B,aAAO,EAAE,SAAS,KAAK;AAAA,IAEzB,KAAK;AACH,cAAQ,gBAAgB;AACxB,aAAO,EAAE,SAAS,KAAK;AAAA,IAEzB,KAAK;AACH,UAAI,QAAQ,cAAc;AACxB,gBAAQ,eAAe;AAAA,MACzB;AACA,aAAO,EAAE,SAAS,KAAK;AAAA,IAEzB;AACE,UAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,gBAAQ,SAAS;AAAA,UACf,GAAG,EAAE,GAAG,oBAAoB,OAAO,GAAG,EAAE,KAAK;AAAA,QAC/C;AACA,gBAAQ,SAAS,QAAQ,QAAQ,EAAE,IAAI,QAAQ,EAAE,KAAK,0BAA0B;AAChF,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB;AACA,aAAO,EAAE,SAAS,MAAM;AAAA,EAC5B;AACF;AAEA,SAAS,SAAS,UAAiC;AACjD,WAAS,QAAQ,EAAE;AACnB,WAAS,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,sBAAsB,EAAE,KAAK,EAAE;AAClE,WAAS,QAAQ,EAAE;AACnB,WAAS,QAAQ,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,sCAAsC;AAClF,WAAS,QAAQ,KAAK,EAAE,KAAK,SAAS,EAAE,KAAK,+BAA+B;AAC5E,WAAS,QAAQ,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,gDAAgD;AAC5F,WAAS,QAAQ,KAAK,EAAE,KAAK,WAAW,EAAE,KAAK,iCAAiC;AAChF,WAAS,QAAQ,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,6BAA6B;AAC3E,WAAS,QAAQ,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,+BAA+B;AAC7E,WAAS,QAAQ,KAAK,EAAE,KAAK,cAAc,EAAE,KAAK,+BAA+B;AACjF,WAAS,QAAQ,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,oCAAoC;AAChF,WAAS,QAAQ,EAAE;AACnB,WAAS,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,sBAAsB,EAAE,KAAK,EAAE;AAClE,WAAS,QAAQ,EAAE;AACnB,WAAS,QAAQ,KAAK,EAAE,MAAM,aAAa,EAAE,KAAK,sBAAsB;AACxE,WAAS,QAAQ,KAAK,EAAE,MAAM,kBAAkB,EAAE,KAAK,kBAAkB;AACzE,WAAS,QAAQ,KAAK,EAAE,MAAM,WAAW,EAAE,KAAK,8BAA8B;AAC9E,WAAS,QAAQ,KAAK,EAAE,MAAM,WAAW,EAAE,KAAK,8BAA8B;AAC9E,WAAS,QAAQ,KAAK,EAAE,MAAM,SAAS,EAAE,KAAK,yBAAyB;AACvE,WAAS,QAAQ,KAAK,EAAE,MAAM,SAAS,EAAE,KAAK,0BAA0B;AACxE,WAAS,QAAQ,KAAK,EAAE,MAAM,UAAU,EAAE,KAAK,8BAA8B;AAC7E,WAAS,QAAQ,KAAK,EAAE,MAAM,SAAS,EAAE,KAAK,2BAA2B;AACzE,WAAS,QAAQ,EAAE;AACnB,WAAS,QAAQ,GAAG,EAAE,GAAG,2CAA2C,EAAE,KAAK,EAAE;AAC7E,WAAS,QAAQ,EAAE;AACrB;AAEA,SAAS,WAAW,MAAgB,SAAkC;AACpE,QAAM,WAAW,QAAQ;AAEzB,MAAI,KAAK,WAAW,GAAG;AACrB,aAAS,QAAQ,yBAAyB,EAAE,IAAI,GAAG,QAAQ,WAAW,GAAG,EAAE,KAAK,EAAE;AAClF;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,CAAC,EAAE,YAAY;AACjC,MAAI,SAAS,cAAc,SAAS,QAAQ;AAC1C,YAAQ,eAAe,IAAmB;AAC1C,aAAS,QAAQ,wBAAwB,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,KAAK,EAAE;AAAA,EACpE,OAAO;AACL,aAAS;AAAA,MACP,GAAG,EAAE,GAAG,iBAAiB,IAAI,GAAG,EAAE,KAAK;AAAA,IACzC;AAAA,EACF;AACF;AAEA,SAAS,YAAY,SAAkC;AACrD,QAAM,WAAW,QAAQ;AACzB,QAAM,UAAU,QAAQ,QAAQ,OAAO;AAEvC,MAAI,QAAQ,WAAW,GAAG;AACxB,aAAS,QAAQ,GAAG,EAAE,GAAG,qBAAqB,EAAE,KAAK,EAAE;AACvD;AAAA,EACF;AAEA,WAAS,QAAQ,EAAE;AACnB,WAAS,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,mBAAmB,EAAE,KAAK,EAAE;AAC/D,WAAS,QAAQ,EAAE;AAGnB,QAAM,SAAS,QAAQ,MAAM,GAAG;AAChC,QAAM,WAAW,QAAQ,SAAS,OAAO;AAEzC,SAAO,QAAQ,CAAC,OAAO,MAAM;AAC3B,UAAM,MAAM,OAAO,WAAW,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,aAAS,QAAQ,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,KAAK,KAAK,EAAE;AAAA,EACvD,CAAC;AAED,MAAI,QAAQ,SAAS,IAAI;AACvB,aAAS,QAAQ,EAAE;AACnB,aAAS,QAAQ,GAAG,EAAE,GAAG,WAAW,QAAQ,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE;AAAA,EAClF;AACA,WAAS,QAAQ,EAAE;AACrB;AAEA,eAAe,WAAW,SAA2C;AACnE,QAAM,WAAW,QAAQ;AAEzB,MAAI,CAAC,QAAQ,SAAS,WAAW;AAC/B,aAAS,QAAQ,GAAG,EAAE,GAAG,iDAAiD,EAAE,KAAK,EAAE;AACnF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,QAAQ,SAAS,UAAU;AAEhD,MAAI,OAAO,WAAW,GAAG;AACvB,aAAS,QAAQ,GAAG,EAAE,GAAG,kBAAkB,EAAE,KAAK,EAAE;AACpD;AAAA,EACF;AAEA,WAAS,QAAQ,EAAE;AACnB,WAAS,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,UAAU,EAAE,KAAK,EAAE;AACtD,WAAS,QAAQ,EAAE;AAEnB,SAAO,QAAQ,CAAC,UAAU;AACxB,aAAS,QAAQ,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,KAAK,EAAE;AAAA,EACnD,CAAC;AACD,WAAS,QAAQ,EAAE;AACrB;AAEA,eAAe,WAAW,MAAgB,SAA2C;AACnF,QAAM,WAAW,QAAQ;AAEzB,MAAI,CAAC,QAAQ,SAAS,WAAW;AAC/B,aAAS,QAAQ,GAAG,EAAE,GAAG,iDAAiD,EAAE,KAAK,EAAE;AACnF;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,GAAG;AACrB,aAAS,QAAQ,GAAG,EAAE,GAAG,8BAA8B,EAAE,KAAK,EAAE;AAChE;AAAA,EACF;AAEA,QAAM,YAAY,KAAK,CAAC;AACxB,QAAM,SAAS,MAAM,QAAQ,SAAS,UAAU,SAAS;AAEzD,MAAI,QAAQ;AACV,aAAS,QAAQ,EAAE;AACnB,aAAS,QAAQ,MAAM;AACvB,aAAS,QAAQ,EAAE;AAAA,EACrB,OAAO;AACL,aAAS,QAAQ,GAAG,EAAE,GAAG,oBAAoB,SAAS,GAAG,EAAE,KAAK,EAAE;AAAA,EACpE;AACF;;;AC9KO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAiC,UAAwB,CAAC,GAAG;AACvE,SAAK,OAAO;AACZ,SAAK,WAAW,QAAQ,YAAY;AACpC,SAAK,WAAW,QAAQ,YAAY;AACpC,SAAK,UAAU,KAAK,iBAAiB;AAAA,EACvC;AAAA,EAEQ,mBAAkC;AACxC,QAAI,KAAK,KAAK,WAAW,EAAG,QAAO,CAAC;AAEpC,UAAM,UAA+B,oBAAI,IAAI;AAG7C,eAAW,OAAO,KAAK,MAAM;AAC3B,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,cAAM,WAAW,KAAK,YAAY,KAAK;AACvC,cAAM,aAAa,QAAQ,IAAI,GAAG,KAAK,IAAI;AAC3C,gBAAQ,IAAI,KAAK,KAAK,IAAI,YAAY,SAAS,MAAM,CAAC;AAAA,MACxD;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,MAC3D;AAAA,MACA,OAAO,KAAK,IAAI,OAAO,KAAK,MAAM;AAAA,IACpC,EAAE;AAAA,EACJ;AAAA,EAEQ,YAAY,OAAwB;AAC1C,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,OAAO,UAAU,YAAY,UAAU,SAAS,OAAQ,MAAiC,aAAa,YAAY;AAC7H,aAAQ,MAAiC,SAAS;AAAA,IACpD;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,UAAU,KAAK;AAAA,IAC7B;AACA,WAAO,OAAO,KAAK;AAAA,EACrB;AAAA,EAEQ,eAAe,KAAa,QAAwB;AAC1D,QAAI,IAAI,UAAU,OAAQ,QAAO;AACjC,QAAI,UAAU,EAAG,QAAO,IAAI,MAAM,GAAG,MAAM;AAC3C,WAAO,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI;AAAA,EACpC;AAAA,EAEA,SAAmB;AACjB,QAAI,KAAK,KAAK,WAAW,KAAK,KAAK,QAAQ,WAAW,GAAG;AACvD,aAAO,CAAC,cAAc;AAAA,IACxB;AAEA,UAAM,QAAkB,CAAC;AACzB,QAAI,gBAAgB,KAAK;AACzB,QAAI,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK;AAG5C,QAAI,KAAK,UAAU;AACjB,YAAM,SAAS,KAAK,WAAW,KAAK,QAAQ;AAC5C,sBAAgB,OAAO;AACvB,eAAS,OAAO;AAAA,IAClB;AAGA,UAAM,YACJ,MAAM,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;AAEzD,UAAM,KAAK,SAAS;AAGpB,UAAM,cAAc,cAAc;AAAA,MAAI,CAAC,KAAK,MAC1C,KAAK,UAAU,IAAI,MAAM,OAAO,CAAC,CAAC;AAAA,IACpC;AACA,UAAM,KAAK,OAAO,YAAY,KAAK,KAAK,IAAI,IAAI;AAChD,UAAM,KAAK,SAAS;AAGpB,eAAW,OAAO,KAAK,MAAM;AAC3B,YAAM,QAAQ,cAAc,IAAI,CAAC,KAAK,MAAM;AAC1C,cAAM,QAAQ,KAAK,YAAY,IAAI,IAAI,IAAI,CAAC;AAC5C,cAAM,YAAY,KAAK,WACnB,KAAK,eAAe,OAAO,OAAO,CAAC,CAAC,IACpC;AACJ,eAAO,KAAK,SAAS,WAAW,OAAO,CAAC,CAAC;AAAA,MAC3C,CAAC;AACD,YAAM,KAAK,OAAO,MAAM,KAAK,KAAK,IAAI,IAAI;AAAA,IAC5C;AAEA,UAAM,KAAK,SAAS;AAEpB,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,UAGjB;AACA,UAAM,UAAyB,CAAC;AAChC,UAAM,SAAmB,CAAC;AAC1B,QAAI,eAAe;AAEnB,eAAW,OAAO,KAAK,SAAS;AAE9B,YAAM,WAAW,KAAK,IAAI,IAAI,OAAO,EAAE;AACvC,YAAM,gBAAgB,WAAW;AAEjC,UAAI,eAAe,iBAAiB,UAAU;AAC5C,gBAAQ,KAAK,GAAG;AAChB,eAAO,KAAK,QAAQ;AACpB,wBAAgB;AAAA,MAClB,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,KAAK,KAAK,QAAQ,SAAS,GAAG;AACnD,YAAM,WAAW,KAAK,QAAQ,CAAC;AAC/B,YAAM,iBAAiB,WAAW;AAClC,cAAQ,KAAK,QAAQ;AACrB,aAAO,KAAK,KAAK,IAAI,gBAAgB,EAAE,CAAC;AAAA,IAC1C;AAEA,WAAO,EAAE,SAAS,OAAO;AAAA,EAC3B;AAAA,EAEQ,UAAU,KAAa,OAAuB;AACpD,UAAM,UAAU,QAAQ,IAAI;AAC5B,QAAI,WAAW,EAAG,QAAO,IAAI,MAAM,GAAG,KAAK;AAC3C,UAAM,OAAO,KAAK,MAAM,UAAU,CAAC;AACnC,UAAM,QAAQ,UAAU;AACxB,WAAO,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,OAAO,KAAK;AAAA,EAClD;AAAA,EAEQ,SAAS,KAAa,OAAuB;AACnD,UAAM,UAAU,QAAQ,IAAI;AAC5B,QAAI,WAAW,EAAG,QAAO,IAAI,MAAM,GAAG,KAAK;AAC3C,WAAO,MAAM,IAAI,OAAO,OAAO;AAAA,EACjC;AACF;;;ACvJA,IAAMA,KAAI,gBAAgB;AAEnB,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EAER,YAAY,UAA2B,cAA2B,QAAQ;AACxE,SAAK,WAAW;AAChB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,eAAe,MAAyB;AACtC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,aAAa,QAA+B;AAC1C,QAAI,CAAC,OAAO,SAAS;AACnB,WAAK,YAAY,OAAO,SAAS,iBAAiB,OAAO,aAAa;AACtE;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,WAAW,GAAG;AAC5C,WAAK,SAAS,QAAQ,EAAE;AACxB,WAAK,SAAS,QAAQ,GAAGA,GAAE,GAAG,iDAAiDA,GAAE,KAAK,EAAE;AACxF,WAAK,oBAAoB,OAAO,aAAa;AAC7C;AAAA,IACF;AAEA,SAAK,YAAY,OAAO,MAAM,OAAO,aAAa;AAAA,EACpD;AAAA,EAEQ,YAAY,MAAiC,eAA6B;AAChF,UAAM,WAAW,IAAI,cAAc,MAAM;AAAA,MACvC,UAAU,KAAK,gBAAgB,aAAa,KAAK,SAAS,OAAO,IAAI;AAAA,MACrE,UAAU,KAAK,gBAAgB;AAAA,IACjC,CAAC;AAED,UAAM,QAAQ,SAAS,OAAO;AAC9B,SAAK,SAAS,QAAQ,EAAE;AACxB,eAAW,QAAQ,OAAO;AACxB,WAAK,SAAS,QAAQ,IAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,KAAK;AACtB,SAAK,SAAS,QAAQ,EAAE;AACxB,SAAK,SAAS;AAAA,MACZ,GAAGA,GAAE,KAAK,GAAG,QAAQ,OAAO,aAAa,IAAI,MAAM,EAAE,GAAGA,GAAE,KAAK;AAAA,IACjE;AACA,SAAK,oBAAoB,aAAa;AAAA,EACxC;AAAA,EAEQ,YAAY,OAAe,eAA6B;AAC9D,SAAK,SAAS,QAAQ,EAAE;AACxB,eAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,WAAK,SAAS,QAAQ,IAAI;AAAA,IAC5B;AACA,SAAK,oBAAoB,aAAa;AAAA,EACxC;AAAA,EAEQ,oBAAoB,IAAkB;AAC5C,SAAK,SAAS,QAAQ,IAAIA,GAAE,GAAG,IAAI,EAAE,MAAMA,GAAE,KAAK,EAAE;AAAA,EACtD;AACF;;;ACzDA,IAAMC,KAAI;AAGV,IAAM,yBAAyB,GAAGA,GAAE,IAAI,UAAUA,GAAE,KAAK,GAAGA,GAAE,WAAW,IAAIA,GAAE,KAAK;AACpF,IAAM,8BAA8B,GAAGA,GAAE,WAAW,WAAWA,GAAE,KAAK;AAGtE,IAAM,6BAA6B;AACnC,IAAM,kCAAkC;AAEjC,IAAM,QAAN,MAAY;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAoB;AAAA;AAAA,EAGpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,WAAwB,SAAuB;AACzD,SAAK,WAAW,QAAQ;AACxB,SAAK,cAAc,QAAQ,eAAe;AAC1C,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,SAAS,QAAQ;AACtB,SAAK,qBAAqB,QAAQ;AAGlC,SAAK,gBAAgB,QAAQ,UAAU;AACvC,SAAK,mBAAmB,QAAQ,gBAAgB;AAChD,SAAK,qBAAqB,QAAQ,sBAAsB;AACxD,SAAK,wBAAwB,QAAQ,4BAA4B;AAGjE,SAAK,WAAW,IAAI,gBAAgB,WAAW,QAAQ,KAAK;AAC5D,SAAK,aAAa,IAAI,WAAW,KAAK,QAAQ;AAC9C,SAAK,UAAU,IAAI,eAAe,QAAQ,gBAAgB,QAAQ,UAAU;AAC5E,SAAK,YAAY,IAAI,gBAAgB;AACrC,SAAK,YAAY,IAAI,gBAAgB,KAAK,UAAU,KAAK,WAAW;AAEpE,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,QAAc;AACZ,SAAK,kBAAkB;AACvB,SAAK,WAAW;AAChB,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEA,UAAgB;AACd,SAAK,WAAW;AAChB,SAAK,SAAS,eAAe;AAC7B,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,eAAwB;AAC1B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,kBAAwB;AACtB,SAAK,SAAS,gBAAgB;AAC9B,SAAK,qBAAqB,IAAI;AAAA,EAChC;AAAA,EAEA,iBAAuB;AACrB,SAAK,SAAS,eAAe;AAC7B,SAAK,qBAAqB,KAAK;AAAA,EACjC;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK,mBAAmB,QAAW;AAErC,WAAK,SAAS,QAAQ,EAAE;AACxB,WAAK,SAAS,QAAQ,GAAGA,GAAE,IAAI,GAAGA,GAAE,IAAI,gBAAgBA,GAAE,KAAK,EAAE;AACjE,WAAK,SAAS,QAAQ,EAAE;AACxB,WAAK,SAAS,QAAQ,QAAQA,GAAE,KAAK,QAAQA,GAAE,KAAK,yBAAyB;AAC7E,WAAK,SAAS,QAAQ,wCAAwCA,GAAE,MAAM,IAAIA,GAAE,KAAK,EAAE;AACnF,WAAK,SAAS,QAAQ,EAAE;AACxB;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,OAAO,KAAK,mBAAmB,YAAY;AAC7C,cAAQ,KAAK,eAAe;AAAA,IAC9B,WAAW,MAAM,QAAQ,KAAK,cAAc,GAAG;AAC7C,cAAQ,KAAK;AAAA,IACf,OAAO;AACL,cAAQ,CAAC,KAAK,cAAc;AAAA,IAC9B;AAEA,eAAW,QAAQ,OAAO;AACxB,WAAK,SAAS,QAAQ,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,aAAmB;AACzB,UAAM,SAAS,KAAK,UAAU,UAAU,KAAK,gBAAgB,KAAK;AAClE,SAAK,SAAS,MAAM,MAAM;AAAA,EAC5B;AAAA,EAEQ,sBAA8B;AACpC,WAAO,KAAK,UAAU,UAAU,KAAK,mBAAmB,KAAK;AAAA,EAC/D;AAAA,EAEQ,kBAAwB;AAC9B,SAAK,SAAS,MAAM,CAAC,KAAK,UAAU;AAClC,UAAI,KAAK,SAAU;AACnB,WAAK,UAAU,KAAK,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEQ,UAAU,KAAa,OAA4B;AACzD,UAAM,OAAO,MAAM;AAGnB,QAAI,MAAM,SAAS;AACjB,cAAQ,MAAM,IAAI,YAAY,GAAG;AAAA,QAC/B,KAAK;AACH,gBAAM,eAAe;AACrB,eAAK,WAAW,YAAY;AAC5B;AAAA,QAEF,KAAK;AACH,gBAAM,eAAe;AACrB,eAAK,WAAW,UAAU;AAC1B;AAAA,QAEF,KAAK;AACH,gBAAM,eAAe;AACrB,eAAK,WAAW,UAAU;AAC1B,eAAK,WAAW;AAChB;AAAA,QAEF,KAAK;AACH,gBAAM,eAAe;AACrB,eAAK,WAAW,WAAW;AAC3B,eAAK,WAAW;AAChB;AAAA,QAEF,KAAK;AACH,gBAAM,eAAe;AACrB,eAAK,SAAS,QAAQ,IAAI;AAC1B,eAAK,WAAW,MAAM;AACtB,eAAK,UAAU,MAAM;AACrB,eAAK,QAAQ,MAAM;AACnB,eAAK,WAAW;AAChB;AAAA,QAEF,KAAK;AACH,gBAAM,eAAe;AACrB,eAAK,YAAY;AACjB;AAAA,MACJ;AAGA,UAAI,SAAS,IAAI;AACf,cAAM,eAAe;AACrB,aAAK,WAAW,aAAa;AAC7B;AAAA,MACF;AACA,UAAI,SAAS,IAAI;AACf,cAAM,eAAe;AACrB,aAAK,WAAW,cAAc;AAC9B;AAAA,MACF;AAEA;AAAA,IACF;AAGA,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,aAAK,YAAY;AACjB;AAAA,MAEF,KAAK;AACH,YAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,eAAK,WAAW;AAAA,QAClB;AACA;AAAA,MAEF,KAAK;AACH,YAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,eAAK,WAAW;AAAA,QAClB;AACA;AAAA,MAEF,KAAK;AACH,aAAK,WAAW,SAAS;AACzB;AAAA,MAEF,KAAK;AACH,aAAK,WAAW,UAAU;AAC1B;AAAA,MAEF,KAAK;AACH,aAAK,gBAAgB,IAAI;AACzB;AAAA,MAEF,KAAK;AACH,aAAK,gBAAgB,MAAM;AAC3B;AAAA,MAEF,KAAK;AACH,aAAK,WAAW,YAAY;AAC5B;AAAA,MAEF,KAAK;AACH,aAAK,WAAW,UAAU;AAC1B;AAAA,MAEF,KAAK;AACH;AAAA,MAEF,KAAK;AACH,YAAI,KAAK,SAAS,cAAc;AAC9B,eAAK,eAAe;AAAA,QACtB;AACA;AAAA,IACJ;AAGA,QAAI,IAAI,WAAW,KAAK,CAAC,MAAM,WAAW,CAAC,MAAM,UAAU,CAAC,MAAM,SAAS;AACzE,WAAK,WAAW,OAAO,GAAG;AAC1B,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,aAAmB;AACzB,UAAM,SAAS,KAAK,UAAU,UAAU,KAAK,gBAAgB,KAAK;AAClE,SAAK,WAAW,OAAO,MAAM;AAAA,EAC/B;AAAA,EAEQ,gBAAgB,WAAgC;AACtD,QAAI;AAEJ,QAAI,cAAc,MAAM;AACtB,cAAQ,KAAK,QAAQ,SAAS,KAAK,WAAW,KAAK;AAAA,IACrD,OAAO;AACL,cAAQ,KAAK,QAAQ,KAAK;AAAA,IAC5B;AAEA,QAAI,UAAU,MAAM;AAClB,WAAK,WAAW,SAAS,KAAK;AAC9B,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAc,cAA6B;AACzC,UAAM,OAAO,KAAK,WAAW;AAC7B,SAAK,SAAS,QAAQ,EAAE;AACxB,SAAK,WAAW,MAAM;AAGtB,QAAI,KAAK,UAAU,WAAW,KAAK,KAAK,EAAE,WAAW,GAAG,GAAG;AACzD,WAAK,QAAQ,IAAI,IAAI;AACrB,YAAM,SAAS,MAAM,iBAAiB,MAAM;AAAA,QAC1C,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,gBAAgB,CAAC,SAAS;AACxB,eAAK,cAAc;AACnB,eAAK,UAAU,eAAe,IAAI;AAAA,QACpC;AAAA,QACA,aAAa,MAAM,KAAK,YAAY;AAAA,QACpC,cAAc,KAAK;AAAA,QACnB,iBAAiB,MAAM,KAAK,gBAAgB;AAAA,QAC5C,gBAAgB,MAAM,KAAK,eAAe;AAAA,MAC5C,CAAC;AAED,UAAI,OAAO,MAAM;AACf,aAAK,WAAW;AAChB,YAAI,KAAK,QAAQ;AACf,eAAK,OAAO;AAAA,QACd;AACA;AAAA,MACF;AAEA,WAAK,WAAW;AAChB;AAAA,IACF;AAGA,SAAK,UAAU,QAAQ,IAAI;AAG3B,QAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,YAAM,YAAY,KAAK,UAAU;AACjC,WAAK,UAAU,MAAM;AACrB,WAAK,QAAQ,IAAI,SAAS;AAC1B,WAAK,QAAQ,MAAM;AAGnB,YAAM,SAAS,MAAM,KAAK,SAAS,QAAQ,SAAS;AACpD,WAAK,UAAU,aAAa,MAAM;AAAA,IACpC;AAEA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,cAAoB;AAC1B,SAAK,SAAS,MAAM,gBAAgB,YAAY,CAAC;AACjD,SAAK,WAAW;AAChB,SAAK,SAAS,MAAM,KAAK,WAAW,KAAK;AAAA,EAC3C;AACF;;;ACvTO,IAAM,eAAN,MAAuC;AAAA,EACpC;AAAA,EAER,YAAY,IAAY;AACtB,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAM,QAAQ,WAA6C;AACzD,UAAM,UAAU,UAAU,KAAK;AAG/B,UAAM,QAAQ,QAAQ,SAAS,GAAG,IAC9B,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK,IAC1B;AAEJ,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,eAAe;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,YAAY,YAAY,IAAI;AAElC,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK;AACzC,YAAM,UAAU,YAAY,IAAI;AAEhC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAAA,QAC1C,eAAe,KAAK,MAAM,UAAU,SAAS;AAAA,MAC/C;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,YAAY,IAAI;AAEhC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC5D,eAAe,KAAK,MAAM,UAAU,SAAS;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAA+B;AACnC,QAAI;AAEF,YAAM,SAAS,MAAM,KAAK,GAAG,MAAM,6CAA6C;AAChF,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAO,OAAO,IAAI,CAAC,QAAiC;AAClD,gBAAM,KAAK,IAAI;AACf,gBAAM,OAAO,IAAI;AACjB,iBAAO,KAAK,GAAG,EAAE,KAAK,IAAI,KAAK;AAAA,QACjC,CAAC;AAAA,MACH;AACA,aAAO,CAAC;AAAA,IACV,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,WAA2C;AACzD,QAAI;AAEF,YAAM,SAAS,MAAM,KAAK,GAAG;AAAA,QAC3B,wCAAwC,SAAS;AAAA,MACnD;AACA,UAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC9C,cAAM,UAAU,OAAO;AAAA,UAAI,CAAC,QAC1B,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,QAC5B,EAAE,KAAK,KAAK;AACZ,eAAO,GAAG,SAAS;AAAA,EAAO,OAAO;AAAA;AAAA,MACnC;AACA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC3EO,IAAM,aAAN,MAAqC;AAAA,EAClC;AAAA,EAER,YAAY,QAAkB;AAC5B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,QAAQ,WAA6C;AACzD,UAAM,UAAU,UAAU,KAAK;AAG/B,UAAM,QAAQ,QAAQ,SAAS,GAAG,IAC9B,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK,IAC1B;AAEJ,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,eAAe;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,YAAY,YAAY,IAAI;AAElC,QAAI;AAEF,YAAM,SAAS,MAAM,KAAK,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC;AACtD,YAAM,UAAU,YAAY,IAAI;AAGhC,YAAM,UAAU,OAAO,CAAC,KAAK,CAAC;AAG9B,YAAM,OAAO,QAAQ,IAAI,CAAC,QAAiB;AACzC,YAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,gBAAM,WAAoC,CAAC;AAC3C,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AACzE,qBAAS,GAAG,IAAI;AAAA,UAClB;AACA,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,eAAe,KAAK,MAAM,UAAU,SAAS;AAAA,MAC/C;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,YAAY,IAAI;AAGhC,UAAI;AACJ,UAAI,SAAS,OAAO,UAAU,YAAY,gBAAgB,OAAO;AAC/D,cAAM,aAAc,MAA8C;AAClE,uBAAe,WAAW;AAAA,MAC5B,WAAW,iBAAiB,OAAO;AACjC,uBAAe,MAAM;AAAA,MACvB,OAAO;AACL,uBAAe,OAAO,KAAK;AAAA,MAC7B;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,eAAe,KAAK,MAAM,UAAU,SAAS;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAA+B;AACnC,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,OAAO;AAAA,QAC/B;AAAA,QACA;AAAA,QACA,CAAC;AAAA,MACH;AACA,YAAM,UAAU,OAAO,CAAC,KAAK,CAAC;AAE9B,aAAO,QAAQ,IAAI,CAAC,QAAiB;AACnC,cAAM,IAAI;AACV,cAAM,KAAK,KAAK,aAAa,EAAE,SAAS;AACxC,cAAM,OAAO,KAAK,aAAa,EAAE,IAAI;AACrC,eAAO,KAAK,GAAG,EAAE,KAAK,IAAI,KAAK;AAAA,MACjC,CAAC;AAAA,IACH,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,WAA2C;AACzD,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,OAAO;AAAA,QAC/B,wCAAwC,SAAS;AAAA,QACjD;AAAA,QACA,CAAC;AAAA,MACH;AACA,YAAM,UAAU,OAAO,CAAC,KAAK,CAAC;AAE9B,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,UAAU,QAAQ,IAAI,CAAC,QAAiB;AAC5C,gBAAM,IAAI;AACV,iBAAO,KAAK,KAAK,aAAa,EAAE,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE,IAAI,CAAC;AAAA,QACrE,CAAC,EAAE,KAAK,KAAK;AACb,eAAO,GAAG,SAAS;AAAA,EAAO,OAAO;AAAA;AAAA,MACnC;AACA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,aAAa,OAAyB;AAC5C,QAAI,SAAS,OAAO,UAAU,YAAY,OAAQ,MAAiC,YAAY,YAAY;AACzG,aAAQ,MAAiC,QAAQ;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AACF;","names":["C","C"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reifydb/shell",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Interactive terminal shell for ReifyDB databases",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -19,7 +19,7 @@
19
19
  "@xterm/addon-fit": "^0.10.0",
20
20
  "tsup": "^8.5.0",
21
21
  "typescript": "^5.8.3",
22
- "@reifydb/client": "0.2.0"
22
+ "@reifydb/client": "0.3.0"
23
23
  },
24
24
  "engines": {
25
25
  "node": ">=16.0.0"