@reifydb/shell 0.4.9 → 0.4.10

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.d.ts CHANGED
@@ -117,7 +117,7 @@ interface ExecutionResult {
117
117
  success: boolean;
118
118
  data?: Record<string, unknown>[];
119
119
  error?: string;
120
- executionTime: number;
120
+ execution_time: number;
121
121
  }
122
122
  /**
123
123
  * Interface for executing database statements.
@@ -135,7 +135,7 @@ interface Executor {
135
135
  /**
136
136
  * Get shape for a table (optional, used by .shape command)
137
137
  */
138
- getShape?(tableName: string): Promise<string | null>;
138
+ getShape?(table_name: string): Promise<string | null>;
139
139
  }
140
140
  /**
141
141
  * Display mode for query results
@@ -190,10 +190,10 @@ interface ShellOptions {
190
190
  /**
191
191
  * Key for localStorage history (default: "reifydb-shell-history")
192
192
  */
193
- historyKey?: string;
193
+ history_key?: string;
194
194
  /**
195
195
  * Custom history storage implementation.
196
- * If provided, historyKey is ignored.
196
+ * If provided, history_key is ignored.
197
197
  */
198
198
  historyStorage?: HistoryStorage;
199
199
  /**
@@ -314,7 +314,7 @@ declare class CommandHistory {
314
314
  private position;
315
315
  private savedInput;
316
316
  private storage;
317
- constructor(storage?: HistoryStorage, historyKey?: string);
317
+ constructor(storage?: HistoryStorage, history_key?: string);
318
318
  add(command: string): void;
319
319
  previous(currentInput: string): string | null;
320
320
  next(): string | null;
@@ -382,7 +382,7 @@ declare class WasmExecutor implements Executor {
382
382
  constructor(db: WasmDB);
383
383
  execute(statement: string): Promise<ExecutionResult>;
384
384
  getTables(): Promise<string[]>;
385
- getShape(tableName: string): Promise<string | null>;
385
+ getShape(table_name: string): Promise<string | null>;
386
386
  }
387
387
 
388
388
  /**
@@ -400,7 +400,7 @@ declare class WsExecutor implements Executor {
400
400
  constructor(client: WsClient);
401
401
  execute(statement: string): Promise<ExecutionResult>;
402
402
  getTables(): Promise<string[]>;
403
- getShape(tableName: string): Promise<string | null>;
403
+ getShape(table_name: string): Promise<string | null>;
404
404
  private extractValue;
405
405
  }
406
406
 
package/dist/index.js CHANGED
@@ -343,8 +343,8 @@ var CommandHistory = class {
343
343
  position = -1;
344
344
  savedInput = "";
345
345
  storage;
346
- constructor(storage, historyKey) {
347
- this.storage = storage ?? new LocalStorageHistoryStorage(historyKey);
346
+ constructor(storage, history_key) {
347
+ this.storage = storage ?? new LocalStorageHistoryStorage(history_key);
348
348
  this.entries = this.storage.load();
349
349
  }
350
350
  add(command) {
@@ -563,14 +563,14 @@ async function showShape(args, context) {
563
563
  terminal.writeln(`${C.red}Usage: .shape <table_name>${C.reset}`);
564
564
  return;
565
565
  }
566
- const tableName = args[0];
567
- const shape = await context.executor.getShape(tableName);
566
+ const table_name = args[0];
567
+ const shape = await context.executor.getShape(table_name);
568
568
  if (shape) {
569
569
  terminal.writeln("");
570
570
  terminal.writeln(shape);
571
571
  terminal.writeln("");
572
572
  } else {
573
- terminal.writeln(`${C.red}Table not found: ${tableName}${C.reset}`);
573
+ terminal.writeln(`${C.red}Table not found: ${table_name}${C.reset}`);
574
574
  }
575
575
  }
576
576
 
@@ -699,18 +699,18 @@ var OutputFormatter = class {
699
699
  }
700
700
  formatResult(result) {
701
701
  if (!result.success) {
702
- this.formatError(result.error ?? "Unknown error", result.executionTime);
702
+ this.formatError(result.error ?? "Unknown error", result.execution_time);
703
703
  return;
704
704
  }
705
705
  if (!result.data || result.data.length === 0) {
706
706
  this.terminal.writeln("");
707
707
  this.terminal.writeln(`${C2.dim}Query executed successfully. No rows returned.${C2.reset}`);
708
- this.formatExecutionTime(result.executionTime);
708
+ this.formatExecutionTime(result.execution_time);
709
709
  return;
710
710
  }
711
- this.formatTable(result.data, result.executionTime);
711
+ this.formatTable(result.data, result.execution_time);
712
712
  }
713
- formatTable(data, executionTime) {
713
+ formatTable(data, execution_time) {
714
714
  const renderer = new TableRenderer(data, {
715
715
  maxWidth: this.displayMode === "truncate" ? this.terminal.cols - 2 : void 0,
716
716
  truncate: this.displayMode === "truncate"
@@ -720,19 +720,19 @@ var OutputFormatter = class {
720
720
  for (const line of lines) {
721
721
  this.terminal.writeln(line);
722
722
  }
723
- const rowCount = data.length;
723
+ const row_count = data.length;
724
724
  this.terminal.writeln("");
725
725
  this.terminal.write(
726
- `${C2.green}${rowCount} row${rowCount !== 1 ? "s" : ""}${C2.reset}`
726
+ `${C2.green}${row_count} row${row_count !== 1 ? "s" : ""}${C2.reset}`
727
727
  );
728
- this.formatExecutionTime(executionTime);
728
+ this.formatExecutionTime(execution_time);
729
729
  }
730
- formatError(error, executionTime) {
730
+ formatError(error, execution_time) {
731
731
  this.terminal.writeln("");
732
732
  for (const line of error.split("\n")) {
733
733
  this.terminal.writeln(line);
734
734
  }
735
- this.formatExecutionTime(executionTime);
735
+ this.formatExecutionTime(execution_time);
736
736
  }
737
737
  formatExecutionTime(ms) {
738
738
  this.terminal.writeln(` ${C2.dim}(${ms}ms)${C2.reset}`);
@@ -774,7 +774,7 @@ var Shell = class {
774
774
  this.continuationPromptLen = options.continuationPromptLength ?? DEFAULT_CONTINUATION_PROMPT_LEN;
775
775
  this.terminal = new TerminalAdapter(container, options.theme);
776
776
  this.lineEditor = new LineEditor(this.terminal);
777
- this.history = new CommandHistory(options.historyStorage, options.historyKey);
777
+ this.history = new CommandHistory(options.historyStorage, options.history_key);
778
778
  this.multiline = new MultilineBuffer();
779
779
  this.formatter = new OutputFormatter(this.terminal, this.displayMode);
780
780
  this.setupKeyHandler();
@@ -1004,24 +1004,24 @@ var WasmExecutor = class {
1004
1004
  return {
1005
1005
  success: true,
1006
1006
  data: [],
1007
- executionTime: 0
1007
+ execution_time: 0
1008
1008
  };
1009
1009
  }
1010
- const startTime = performance.now();
1010
+ const start_time = performance.now();
1011
1011
  try {
1012
1012
  const results = await this.db.admin(query);
1013
1013
  const endTime = performance.now();
1014
1014
  return {
1015
1015
  success: true,
1016
1016
  data: Array.isArray(results) ? results : [],
1017
- executionTime: Math.round(endTime - startTime)
1017
+ execution_time: Math.round(endTime - start_time)
1018
1018
  };
1019
1019
  } catch (error) {
1020
1020
  const endTime = performance.now();
1021
1021
  return {
1022
1022
  success: false,
1023
1023
  error: error instanceof Error ? error.message : String(error),
1024
- executionTime: Math.round(endTime - startTime)
1024
+ execution_time: Math.round(endTime - start_time)
1025
1025
  };
1026
1026
  }
1027
1027
  }
@@ -1040,16 +1040,16 @@ var WasmExecutor = class {
1040
1040
  return [];
1041
1041
  }
1042
1042
  }
1043
- async getShape(tableName) {
1043
+ async getShape(table_name) {
1044
1044
  try {
1045
1045
  const result = await this.db.admin(
1046
- `FROM system::columns FILTER table = "${tableName}" MAP { name, type }`
1046
+ `FROM system::columns FILTER table = "${table_name}" MAP { name, type }`
1047
1047
  );
1048
1048
  if (Array.isArray(result) && result.length > 0) {
1049
1049
  const columns = result.map(
1050
1050
  (row) => ` ${row.name}: ${row.type}`
1051
1051
  ).join(",\n");
1052
- return `${tableName} {
1052
+ return `${table_name} {
1053
1053
  ${columns}
1054
1054
  }`;
1055
1055
  }
@@ -1073,10 +1073,10 @@ var WsExecutor = class {
1073
1073
  return {
1074
1074
  success: true,
1075
1075
  data: [],
1076
- executionTime: 0
1076
+ execution_time: 0
1077
1077
  };
1078
1078
  }
1079
- const startTime = performance.now();
1079
+ const start_time = performance.now();
1080
1080
  try {
1081
1081
  const frames = await this.client.admin(query, null, []);
1082
1082
  const endTime = performance.now();
@@ -1094,23 +1094,23 @@ var WsExecutor = class {
1094
1094
  return {
1095
1095
  success: true,
1096
1096
  data,
1097
- executionTime: Math.round(endTime - startTime)
1097
+ execution_time: Math.round(endTime - start_time)
1098
1098
  };
1099
1099
  } catch (error) {
1100
1100
  const endTime = performance.now();
1101
- let errorMessage;
1101
+ let error_message;
1102
1102
  if (error && typeof error === "object" && "diagnostic" in error) {
1103
1103
  const diagnostic = error.diagnostic;
1104
- errorMessage = diagnostic.message;
1104
+ error_message = diagnostic.message;
1105
1105
  } else if (error instanceof Error) {
1106
- errorMessage = error.message;
1106
+ error_message = error.message;
1107
1107
  } else {
1108
- errorMessage = String(error);
1108
+ error_message = String(error);
1109
1109
  }
1110
1110
  return {
1111
1111
  success: false,
1112
- error: errorMessage,
1113
- executionTime: Math.round(endTime - startTime)
1112
+ error: error_message,
1113
+ execution_time: Math.round(endTime - start_time)
1114
1114
  };
1115
1115
  }
1116
1116
  }
@@ -1132,10 +1132,10 @@ var WsExecutor = class {
1132
1132
  return [];
1133
1133
  }
1134
1134
  }
1135
- async getShape(tableName) {
1135
+ async getShape(table_name) {
1136
1136
  try {
1137
1137
  const frames = await this.client.admin(
1138
- `FROM system::columns FILTER table = "${tableName}" MAP { name, type }`,
1138
+ `FROM system::columns FILTER table = "${table_name}" MAP { name, type }`,
1139
1139
  null,
1140
1140
  []
1141
1141
  );
@@ -1145,7 +1145,7 @@ var WsExecutor = class {
1145
1145
  const r = row;
1146
1146
  return ` ${this.extractValue(r.name)}: ${this.extractValue(r.type)}`;
1147
1147
  }).join(",\n");
1148
- return `${tableName} {
1148
+ return `${table_name} {
1149
1149
  ${columns}
1150
1150
  }`;
1151
1151
  }
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: Apache-2.0\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: Apache-2.0\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: Apache-2.0\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: Apache-2.0\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: Apache-2.0\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: Apache-2.0\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 '.shape':\n await showShape(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}.shape${C.reset} [table] Show table shape`);\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 showShape(args: string[], context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getShape) {\n terminal.writeln(`${C.dim}.shape command not supported by this executor${C.reset}`);\n return;\n }\n\n if (args.length === 0) {\n terminal.writeln(`${C.red}Usage: .shape <table_name>${C.reset}`);\n return;\n }\n\n const tableName = args[0];\n const shape = await context.executor.getShape(tableName);\n\n if (shape) {\n terminal.writeln('');\n terminal.writeln(shape);\n terminal.writeln('');\n } else {\n terminal.writeln(`${C.red}Table not found: ${tableName}${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: Apache-2.0\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: Apache-2.0\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: Apache-2.0\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: Apache-2.0\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 getShape(tableName: string): Promise<string | null> {\n try {\n // Query system catalog for table shape\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: Apache-2.0\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 shapes: 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 shape 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 getShape(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: Apache-2.0\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: Apache-2.0\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: Apache-2.0\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: Apache-2.0\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, history_key?: string) {\n this.storage = storage ?? new LocalStorageHistoryStorage(history_key);\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: Apache-2.0\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: Apache-2.0\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 '.shape':\n await showShape(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}.shape${C.reset} [table] Show table shape`);\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 showShape(args: string[], context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getShape) {\n terminal.writeln(`${C.dim}.shape command not supported by this executor${C.reset}`);\n return;\n }\n\n if (args.length === 0) {\n terminal.writeln(`${C.red}Usage: .shape <table_name>${C.reset}`);\n return;\n }\n\n const table_name = args[0];\n const shape = await context.executor.getShape(table_name);\n\n if (shape) {\n terminal.writeln('');\n terminal.writeln(shape);\n terminal.writeln('');\n } else {\n terminal.writeln(`${C.red}Table not found: ${table_name}${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: Apache-2.0\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: Apache-2.0\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.execution_time);\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.execution_time);\n return;\n }\n\n this.formatTable(result.data, result.execution_time);\n }\n\n private formatTable(data: Record<string, unknown>[], execution_time: 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 row_count = data.length;\n this.terminal.writeln('');\n this.terminal.write(\n `${C.green}${row_count} row${row_count !== 1 ? 's' : ''}${C.reset}`\n );\n this.formatExecutionTime(execution_time);\n }\n\n private formatError(error: string, execution_time: number): void {\n this.terminal.writeln('');\n for (const line of error.split('\\n')) {\n this.terminal.writeln(line);\n }\n this.formatExecutionTime(execution_time);\n }\n\n private formatExecutionTime(ms: number): void {\n this.terminal.writeln(` ${C.dim}(${ms}ms)${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: Apache-2.0\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.history_key);\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: Apache-2.0\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 execution_time: 0,\n };\n }\n\n const start_time = 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 execution_time: Math.round(endTime - start_time),\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 execution_time: Math.round(endTime - start_time),\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 getShape(table_name: string): Promise<string | null> {\n try {\n // Query system catalog for table shape\n const result = await this.db.admin(\n `FROM system::columns FILTER table = \"${table_name}\" 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 `${table_name} {\\n${columns}\\n}`;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n","// SPDX-License-Identifier: Apache-2.0\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 shapes: 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 execution_time: 0,\n };\n }\n\n const start_time = performance.now();\n\n try {\n // Execute via admin endpoint with no shape 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 execution_time: Math.round(endTime - start_time),\n };\n } catch (error) {\n const endTime = performance.now();\n\n // Extract error message from ReifyError if present\n let error_message: string;\n if (error && typeof error === 'object' && 'diagnostic' in error) {\n const diagnostic = (error as { diagnostic: { message: string } }).diagnostic;\n error_message = diagnostic.message;\n } else if (error instanceof Error) {\n error_message = error.message;\n } else {\n error_message = String(error);\n }\n\n return {\n success: false,\n error: error_message,\n execution_time: Math.round(endTime - start_time),\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 getShape(table_name: string): Promise<string | null> {\n try {\n const frames = await this.client.admin(\n `FROM system::columns FILTER table = \"${table_name}\" 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 `${table_name} {\\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reifydb/shell",
3
- "version": "0.4.9",
3
+ "version": "0.4.10",
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.4.9"
22
+ "@reifydb/client": "0.4.10"
23
23
  },
24
24
  "engines": {
25
25
  "node": ">=16.0.0"