@reifydb/shell 0.4.9 → 0.4.11
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 +12 -12
- package/dist/index.js +38 -38
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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
|
-
|
|
120
|
+
execution_time: number;
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
123
123
|
* Interface for executing database statements.
|
|
@@ -125,9 +125,9 @@ interface ExecutionResult {
|
|
|
125
125
|
*/
|
|
126
126
|
interface Executor {
|
|
127
127
|
/**
|
|
128
|
-
* Execute
|
|
128
|
+
* Execute RQL and return the result
|
|
129
129
|
*/
|
|
130
|
-
execute(
|
|
130
|
+
execute(rql: string): Promise<ExecutionResult>;
|
|
131
131
|
/**
|
|
132
132
|
* Get list of tables (optional, used by .tables command)
|
|
133
133
|
*/
|
|
@@ -135,7 +135,7 @@ interface Executor {
|
|
|
135
135
|
/**
|
|
136
136
|
* Get shape for a table (optional, used by .shape command)
|
|
137
137
|
*/
|
|
138
|
-
getShape?(
|
|
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
|
-
|
|
193
|
+
history_key?: string;
|
|
194
194
|
/**
|
|
195
195
|
* Custom history storage implementation.
|
|
196
|
-
* If provided,
|
|
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,
|
|
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;
|
|
@@ -380,9 +380,9 @@ interface WasmDB {
|
|
|
380
380
|
declare class WasmExecutor implements Executor {
|
|
381
381
|
private db;
|
|
382
382
|
constructor(db: WasmDB);
|
|
383
|
-
execute(
|
|
383
|
+
execute(rql: string): Promise<ExecutionResult>;
|
|
384
384
|
getTables(): Promise<string[]>;
|
|
385
|
-
getShape(
|
|
385
|
+
getShape(table_name: string): Promise<string | null>;
|
|
386
386
|
}
|
|
387
387
|
|
|
388
388
|
/**
|
|
@@ -390,7 +390,7 @@ declare class WasmExecutor implements Executor {
|
|
|
390
390
|
* This matches the WsClient interface from @reifydb/client.
|
|
391
391
|
*/
|
|
392
392
|
interface WsClient {
|
|
393
|
-
admin<const S extends readonly unknown[]>(
|
|
393
|
+
admin<const S extends readonly unknown[]>(rql: string, params: unknown, shapes: S): Promise<unknown[][]>;
|
|
394
394
|
}
|
|
395
395
|
/**
|
|
396
396
|
* Executor adapter for WebSocket-based ReifyDB connections.
|
|
@@ -398,9 +398,9 @@ interface WsClient {
|
|
|
398
398
|
declare class WsExecutor implements Executor {
|
|
399
399
|
private client;
|
|
400
400
|
constructor(client: WsClient);
|
|
401
|
-
execute(
|
|
401
|
+
execute(rql: string): Promise<ExecutionResult>;
|
|
402
402
|
getTables(): Promise<string[]>;
|
|
403
|
-
getShape(
|
|
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,
|
|
347
|
-
this.storage = storage ?? new LocalStorageHistoryStorage(
|
|
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
|
|
567
|
-
const shape = await context.executor.getShape(
|
|
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: ${
|
|
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.
|
|
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.
|
|
708
|
+
this.formatExecutionTime(result.execution_time);
|
|
709
709
|
return;
|
|
710
710
|
}
|
|
711
|
-
this.formatTable(result.data, result.
|
|
711
|
+
this.formatTable(result.data, result.execution_time);
|
|
712
712
|
}
|
|
713
|
-
formatTable(data,
|
|
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
|
|
723
|
+
const row_count = data.length;
|
|
724
724
|
this.terminal.writeln("");
|
|
725
725
|
this.terminal.write(
|
|
726
|
-
`${C2.green}${
|
|
726
|
+
`${C2.green}${row_count} row${row_count !== 1 ? "s" : ""}${C2.reset}`
|
|
727
727
|
);
|
|
728
|
-
this.formatExecutionTime(
|
|
728
|
+
this.formatExecutionTime(execution_time);
|
|
729
729
|
}
|
|
730
|
-
formatError(error,
|
|
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(
|
|
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.
|
|
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();
|
|
@@ -997,31 +997,31 @@ var WasmExecutor = class {
|
|
|
997
997
|
constructor(db) {
|
|
998
998
|
this.db = db;
|
|
999
999
|
}
|
|
1000
|
-
async execute(
|
|
1001
|
-
const trimmed =
|
|
1000
|
+
async execute(rql) {
|
|
1001
|
+
const trimmed = rql.trim();
|
|
1002
1002
|
const query = trimmed.endsWith(";") ? trimmed.slice(0, -1).trim() : trimmed;
|
|
1003
1003
|
if (!query) {
|
|
1004
1004
|
return {
|
|
1005
1005
|
success: true,
|
|
1006
1006
|
data: [],
|
|
1007
|
-
|
|
1007
|
+
execution_time: 0
|
|
1008
1008
|
};
|
|
1009
1009
|
}
|
|
1010
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
1043
|
+
async getShape(table_name) {
|
|
1044
1044
|
try {
|
|
1045
1045
|
const result = await this.db.admin(
|
|
1046
|
-
`FROM system::columns FILTER table = "${
|
|
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 `${
|
|
1052
|
+
return `${table_name} {
|
|
1053
1053
|
${columns}
|
|
1054
1054
|
}`;
|
|
1055
1055
|
}
|
|
@@ -1066,17 +1066,17 @@ var WsExecutor = class {
|
|
|
1066
1066
|
constructor(client) {
|
|
1067
1067
|
this.client = client;
|
|
1068
1068
|
}
|
|
1069
|
-
async execute(
|
|
1070
|
-
const trimmed =
|
|
1069
|
+
async execute(rql) {
|
|
1070
|
+
const trimmed = rql.trim();
|
|
1071
1071
|
const query = trimmed.endsWith(";") ? trimmed.slice(0, -1).trim() : trimmed;
|
|
1072
1072
|
if (!query) {
|
|
1073
1073
|
return {
|
|
1074
1074
|
success: true,
|
|
1075
1075
|
data: [],
|
|
1076
|
-
|
|
1076
|
+
execution_time: 0
|
|
1077
1077
|
};
|
|
1078
1078
|
}
|
|
1079
|
-
const
|
|
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
|
-
|
|
1097
|
+
execution_time: Math.round(endTime - start_time)
|
|
1098
1098
|
};
|
|
1099
1099
|
} catch (error) {
|
|
1100
1100
|
const endTime = performance.now();
|
|
1101
|
-
let
|
|
1101
|
+
let error_message;
|
|
1102
1102
|
if (error && typeof error === "object" && "diagnostic" in error) {
|
|
1103
1103
|
const diagnostic = error.diagnostic;
|
|
1104
|
-
|
|
1104
|
+
error_message = diagnostic.message;
|
|
1105
1105
|
} else if (error instanceof Error) {
|
|
1106
|
-
|
|
1106
|
+
error_message = error.message;
|
|
1107
1107
|
} else {
|
|
1108
|
-
|
|
1108
|
+
error_message = String(error);
|
|
1109
1109
|
}
|
|
1110
1110
|
return {
|
|
1111
1111
|
success: false,
|
|
1112
|
-
error:
|
|
1113
|
-
|
|
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(
|
|
1135
|
+
async getShape(table_name) {
|
|
1136
1136
|
try {
|
|
1137
1137
|
const frames = await this.client.admin(
|
|
1138
|
-
`FROM system::columns FILTER table = "${
|
|
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 `${
|
|
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(rql: string): Promise<ExecutionResult> {\n const trimmed = rql.trim();\n\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 rql: 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(rql: string): Promise<ExecutionResult> {\n const trimmed = rql.trim();\n\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.
|
|
3
|
+
"version": "0.4.11",
|
|
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.
|
|
22
|
+
"@reifydb/client": "0.4.11"
|
|
23
23
|
},
|
|
24
24
|
"engines": {
|
|
25
25
|
"node": ">=16.0.0"
|