@reifydb/shell 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.css +12 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.js +67 -24
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.css
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
/* src/terminal/styles.css */
|
|
2
|
+
.reifydb-shell-fullscreen {
|
|
3
|
+
position: fixed !important;
|
|
4
|
+
top: 0 !important;
|
|
5
|
+
left: 0 !important;
|
|
6
|
+
right: 0 !important;
|
|
7
|
+
bottom: 0 !important;
|
|
8
|
+
width: 100vw !important;
|
|
9
|
+
height: 100vh !important;
|
|
10
|
+
z-index: 9999 !important;
|
|
11
|
+
background: #1e1e2e !important;
|
|
12
|
+
}
|
|
2
13
|
.xterm {
|
|
3
|
-
padding:
|
|
14
|
+
padding: 12px;
|
|
4
15
|
}
|
|
5
16
|
.xterm-viewport {
|
|
6
17
|
scrollbar-width: thin;
|
package/dist/index.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/terminal/styles.css"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* Copyright (c) 2025 ReifyDB */\n\n/* xterm.js container styling */\n.xterm {\n padding:
|
|
1
|
+
{"version":3,"sources":["../src/terminal/styles.css"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* Copyright (c) 2025 ReifyDB */\n\n/* Fullscreen mode */\n.reifydb-shell-fullscreen {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n width: 100vw !important;\n height: 100vh !important;\n z-index: 9999 !important;\n background: #1e1e2e !important;\n}\n\n/* xterm.js container styling */\n.xterm {\n padding: 12px;\n}\n\n.xterm-viewport {\n /* Hide scrollbar but keep scrolling functional */\n scrollbar-width: thin;\n scrollbar-color: #45475a #1e1e2e;\n}\n\n.xterm-viewport::-webkit-scrollbar {\n width: 8px;\n}\n\n.xterm-viewport::-webkit-scrollbar-track {\n background: #1e1e2e;\n}\n\n.xterm-viewport::-webkit-scrollbar-thumb {\n background: #45475a;\n border-radius: 4px;\n}\n\n.xterm-viewport::-webkit-scrollbar-thumb:hover {\n background: #585b70;\n}\n"],"mappings":";AAIA,CAAC;AACC,YAAU;AACV,OAAK;AACL,QAAM;AACN,SAAO;AACP,UAAQ;AACR,SAAO;AACP,UAAQ;AACR,WAAS;AACT,cAAY;AACd;AAGA,CAAC;AACC,WAAS;AACX;AAEA,CAAC;AAEC,mBAAiB;AACjB,mBAAiB,QAAQ;AAC3B;AAEA,CANC,cAMc;AACb,SAAO;AACT;AAEA,CAVC,cAUc;AACb,cAAY;AACd;AAEA,CAdC,cAcc;AACb,cAAY;AACZ,iBAAe;AACjB;AAEA,CAnBC,cAmBc,yBAAyB;AACtC,cAAY;AACd;","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -59,8 +59,10 @@ type KeyHandler = (key: string, domEvent: KeyboardEvent) => void;
|
|
|
59
59
|
declare class TerminalAdapter {
|
|
60
60
|
private terminal;
|
|
61
61
|
private fitAddon;
|
|
62
|
+
private container;
|
|
62
63
|
private keyHandler;
|
|
63
64
|
private resizeObserver;
|
|
65
|
+
private _isFullscreen;
|
|
64
66
|
constructor(container: HTMLElement, theme?: TerminalTheme);
|
|
65
67
|
onKey(handler: KeyHandler): void;
|
|
66
68
|
write(text: string): void;
|
|
@@ -70,6 +72,9 @@ declare class TerminalAdapter {
|
|
|
70
72
|
get rows(): number;
|
|
71
73
|
focus(): void;
|
|
72
74
|
dispose(): void;
|
|
75
|
+
get isFullscreen(): boolean;
|
|
76
|
+
enterFullscreen(): void;
|
|
77
|
+
exitFullscreen(): void;
|
|
73
78
|
static readonly COLORS: {
|
|
74
79
|
readonly reset: "\u001B[0m";
|
|
75
80
|
readonly bold: "\u001B[1m";
|
|
@@ -192,13 +197,17 @@ interface ShellOptions {
|
|
|
192
197
|
*/
|
|
193
198
|
historyStorage?: HistoryStorage;
|
|
194
199
|
/**
|
|
195
|
-
* Initial display mode (default: "
|
|
200
|
+
* Initial display mode (default: "full")
|
|
196
201
|
*/
|
|
197
202
|
displayMode?: DisplayMode;
|
|
198
203
|
/**
|
|
199
204
|
* Callback when user exits the shell
|
|
200
205
|
*/
|
|
201
206
|
onExit?: () => void;
|
|
207
|
+
/**
|
|
208
|
+
* Callback when fullscreen state changes
|
|
209
|
+
*/
|
|
210
|
+
onFullscreenChange?: (isFullscreen: boolean) => void;
|
|
202
211
|
}
|
|
203
212
|
/**
|
|
204
213
|
* Internal context passed to dot command handlers
|
|
@@ -213,6 +222,9 @@ interface DotCommandContext {
|
|
|
213
222
|
displayMode: DisplayMode;
|
|
214
223
|
setDisplayMode: (mode: DisplayMode) => void;
|
|
215
224
|
clearScreen: () => void;
|
|
225
|
+
isFullscreen: boolean;
|
|
226
|
+
enterFullscreen: () => void;
|
|
227
|
+
exitFullscreen: () => void;
|
|
216
228
|
}
|
|
217
229
|
/**
|
|
218
230
|
* Result from handling a dot command
|
|
@@ -237,9 +249,13 @@ declare class Shell {
|
|
|
237
249
|
private continuationPromptLen;
|
|
238
250
|
private welcomeMessage;
|
|
239
251
|
private onExit;
|
|
252
|
+
private onFullscreenChange;
|
|
240
253
|
constructor(container: HTMLElement, options: ShellOptions);
|
|
241
254
|
start(): void;
|
|
242
255
|
dispose(): void;
|
|
256
|
+
get isFullscreen(): boolean;
|
|
257
|
+
enterFullscreen(): void;
|
|
258
|
+
exitFullscreen(): void;
|
|
243
259
|
private showWelcomeBanner;
|
|
244
260
|
private showPrompt;
|
|
245
261
|
private getCurrentPromptLen;
|
package/dist/index.js
CHANGED
|
@@ -57,9 +57,12 @@ var COLORS = {
|
|
|
57
57
|
var TerminalAdapter = class {
|
|
58
58
|
terminal;
|
|
59
59
|
fitAddon;
|
|
60
|
+
container;
|
|
60
61
|
keyHandler = null;
|
|
61
62
|
resizeObserver = null;
|
|
63
|
+
_isFullscreen = false;
|
|
62
64
|
constructor(container, theme = defaultTheme) {
|
|
65
|
+
this.container = container;
|
|
63
66
|
this.terminal = new Terminal({
|
|
64
67
|
theme,
|
|
65
68
|
fontFamily: "'JetBrains Mono', 'Fira Code', 'Consolas', 'Monaco', monospace",
|
|
@@ -113,6 +116,21 @@ var TerminalAdapter = class {
|
|
|
113
116
|
}
|
|
114
117
|
this.terminal.dispose();
|
|
115
118
|
}
|
|
119
|
+
get isFullscreen() {
|
|
120
|
+
return this._isFullscreen;
|
|
121
|
+
}
|
|
122
|
+
enterFullscreen() {
|
|
123
|
+
if (this._isFullscreen) return;
|
|
124
|
+
this._isFullscreen = true;
|
|
125
|
+
this.container.classList.add("reifydb-shell-fullscreen");
|
|
126
|
+
this.fitAddon.fit();
|
|
127
|
+
}
|
|
128
|
+
exitFullscreen() {
|
|
129
|
+
if (!this._isFullscreen) return;
|
|
130
|
+
this._isFullscreen = false;
|
|
131
|
+
this.container.classList.remove("reifydb-shell-fullscreen");
|
|
132
|
+
this.fitAddon.fit();
|
|
133
|
+
}
|
|
116
134
|
// ANSI escape code helpers - static for use without instance
|
|
117
135
|
static COLORS = COLORS;
|
|
118
136
|
// Cursor control helpers
|
|
@@ -417,13 +435,8 @@ async function handleDotCommand(input, context) {
|
|
|
417
435
|
case ".help":
|
|
418
436
|
showHelp(context.terminal);
|
|
419
437
|
return { handled: true };
|
|
420
|
-
case ".quit":
|
|
421
|
-
case ".exit":
|
|
422
|
-
context.terminal.writeln(`${C.yellow}Goodbye!${C.reset}`);
|
|
423
|
-
context.terminal.writeln("");
|
|
424
|
-
return { handled: true, exit: true };
|
|
425
438
|
case ".clear":
|
|
426
|
-
context.clearScreen();
|
|
439
|
+
context.terminal.write(TerminalAdapter.clearScreen());
|
|
427
440
|
return { handled: true };
|
|
428
441
|
case ".mode":
|
|
429
442
|
handleMode(args, context);
|
|
@@ -437,6 +450,14 @@ async function handleDotCommand(input, context) {
|
|
|
437
450
|
case ".schema":
|
|
438
451
|
await showSchema(args, context);
|
|
439
452
|
return { handled: true };
|
|
453
|
+
case ".fullscreen":
|
|
454
|
+
context.enterFullscreen();
|
|
455
|
+
return { handled: true };
|
|
456
|
+
case ".exit":
|
|
457
|
+
if (context.isFullscreen) {
|
|
458
|
+
context.exitFullscreen();
|
|
459
|
+
}
|
|
460
|
+
return { handled: true };
|
|
440
461
|
default:
|
|
441
462
|
if (command.startsWith(".")) {
|
|
442
463
|
context.terminal.writeln(
|
|
@@ -453,12 +474,13 @@ function showHelp(terminal) {
|
|
|
453
474
|
terminal.writeln(`${C.bold}${C.cyan}Available commands:${C.reset}`);
|
|
454
475
|
terminal.writeln("");
|
|
455
476
|
terminal.writeln(` ${C.green}.help${C.reset} Show this help message`);
|
|
456
|
-
terminal.writeln(` ${C.green}.quit${C.reset}, ${C.green}.exit${C.reset} Exit message`);
|
|
457
477
|
terminal.writeln(` ${C.green}.clear${C.reset} Clear the screen`);
|
|
458
478
|
terminal.writeln(` ${C.green}.mode${C.reset} [mode] Set display mode (truncate|full)`);
|
|
459
479
|
terminal.writeln(` ${C.green}.history${C.reset} Show command history`);
|
|
460
480
|
terminal.writeln(` ${C.green}.tables${C.reset} List all tables`);
|
|
461
481
|
terminal.writeln(` ${C.green}.schema${C.reset} [table] Show table schema`);
|
|
482
|
+
terminal.writeln(` ${C.green}.fullscreen${C.reset} Enter fullscreen mode`);
|
|
483
|
+
terminal.writeln(` ${C.green}.exit${C.reset} Exit fullscreen mode`);
|
|
462
484
|
terminal.writeln("");
|
|
463
485
|
terminal.writeln(`${C.bold}${C.cyan}Keyboard shortcuts:${C.reset}`);
|
|
464
486
|
terminal.writeln("");
|
|
@@ -561,7 +583,7 @@ var TableRenderer = class {
|
|
|
561
583
|
constructor(data, options = {}) {
|
|
562
584
|
this.data = data;
|
|
563
585
|
this.maxWidth = options.maxWidth ?? 120;
|
|
564
|
-
this.truncate = options.truncate ??
|
|
586
|
+
this.truncate = options.truncate ?? false;
|
|
565
587
|
this.columns = this.calculateColumns();
|
|
566
588
|
}
|
|
567
589
|
calculateColumns() {
|
|
@@ -581,7 +603,10 @@ var TableRenderer = class {
|
|
|
581
603
|
}
|
|
582
604
|
formatValue(value) {
|
|
583
605
|
if (value === null || value === void 0) {
|
|
584
|
-
return "
|
|
606
|
+
return "undefined";
|
|
607
|
+
}
|
|
608
|
+
if (value && typeof value === "object" && "type" in value && typeof value.toString === "function") {
|
|
609
|
+
return value.toString();
|
|
585
610
|
}
|
|
586
611
|
if (typeof value === "object") {
|
|
587
612
|
return JSON.stringify(value);
|
|
@@ -665,7 +690,7 @@ var C2 = TerminalAdapter.COLORS;
|
|
|
665
690
|
var OutputFormatter = class {
|
|
666
691
|
terminal;
|
|
667
692
|
displayMode;
|
|
668
|
-
constructor(terminal, displayMode = "
|
|
693
|
+
constructor(terminal, displayMode = "full") {
|
|
669
694
|
this.terminal = terminal;
|
|
670
695
|
this.displayMode = displayMode;
|
|
671
696
|
}
|
|
@@ -704,7 +729,9 @@ var OutputFormatter = class {
|
|
|
704
729
|
}
|
|
705
730
|
formatError(error, executionTime) {
|
|
706
731
|
this.terminal.writeln("");
|
|
707
|
-
|
|
732
|
+
for (const line of error.split("\n")) {
|
|
733
|
+
this.terminal.writeln(line);
|
|
734
|
+
}
|
|
708
735
|
this.formatExecutionTime(executionTime);
|
|
709
736
|
}
|
|
710
737
|
formatExecutionTime(ms) {
|
|
@@ -734,11 +761,13 @@ var Shell = class {
|
|
|
734
761
|
continuationPromptLen;
|
|
735
762
|
welcomeMessage;
|
|
736
763
|
onExit;
|
|
764
|
+
onFullscreenChange;
|
|
737
765
|
constructor(container, options) {
|
|
738
766
|
this.executor = options.executor;
|
|
739
|
-
this.displayMode = options.displayMode ?? "
|
|
767
|
+
this.displayMode = options.displayMode ?? "full";
|
|
740
768
|
this.welcomeMessage = options.welcomeMessage;
|
|
741
769
|
this.onExit = options.onExit;
|
|
770
|
+
this.onFullscreenChange = options.onFullscreenChange;
|
|
742
771
|
this.primaryPrompt = options.prompt ?? DEFAULT_PRIMARY_PROMPT;
|
|
743
772
|
this.primaryPromptLen = options.promptLength ?? DEFAULT_PRIMARY_PROMPT_LEN;
|
|
744
773
|
this.continuationPrompt = options.continuationPrompt ?? DEFAULT_CONTINUATION_PROMPT;
|
|
@@ -757,8 +786,20 @@ var Shell = class {
|
|
|
757
786
|
}
|
|
758
787
|
dispose() {
|
|
759
788
|
this.isExited = true;
|
|
789
|
+
this.terminal.exitFullscreen();
|
|
760
790
|
this.terminal.dispose();
|
|
761
791
|
}
|
|
792
|
+
get isFullscreen() {
|
|
793
|
+
return this.terminal.isFullscreen;
|
|
794
|
+
}
|
|
795
|
+
enterFullscreen() {
|
|
796
|
+
this.terminal.enterFullscreen();
|
|
797
|
+
this.onFullscreenChange?.(true);
|
|
798
|
+
}
|
|
799
|
+
exitFullscreen() {
|
|
800
|
+
this.terminal.exitFullscreen();
|
|
801
|
+
this.onFullscreenChange?.(false);
|
|
802
|
+
}
|
|
762
803
|
showWelcomeBanner() {
|
|
763
804
|
if (this.welcomeMessage === void 0) {
|
|
764
805
|
this.terminal.writeln("");
|
|
@@ -876,6 +917,9 @@ var Shell = class {
|
|
|
876
917
|
case 9:
|
|
877
918
|
return;
|
|
878
919
|
case 27:
|
|
920
|
+
if (this.terminal.isFullscreen) {
|
|
921
|
+
this.exitFullscreen();
|
|
922
|
+
}
|
|
879
923
|
return;
|
|
880
924
|
}
|
|
881
925
|
if (key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {
|
|
@@ -914,7 +958,10 @@ var Shell = class {
|
|
|
914
958
|
this.displayMode = mode;
|
|
915
959
|
this.formatter.setDisplayMode(mode);
|
|
916
960
|
},
|
|
917
|
-
clearScreen: () => this.clearScreen()
|
|
961
|
+
clearScreen: () => this.clearScreen(),
|
|
962
|
+
isFullscreen: this.isFullscreen,
|
|
963
|
+
enterFullscreen: () => this.enterFullscreen(),
|
|
964
|
+
exitFullscreen: () => this.exitFullscreen()
|
|
918
965
|
});
|
|
919
966
|
if (result.exit) {
|
|
920
967
|
this.isExited = true;
|
|
@@ -980,12 +1027,12 @@ var WasmExecutor = class {
|
|
|
980
1027
|
}
|
|
981
1028
|
async getTables() {
|
|
982
1029
|
try {
|
|
983
|
-
const result = await this.db.admin("FROM system
|
|
1030
|
+
const result = await this.db.admin("FROM system::tables MAP { namespace, name }");
|
|
984
1031
|
if (Array.isArray(result)) {
|
|
985
1032
|
return result.map((row) => {
|
|
986
1033
|
const ns = row.namespace;
|
|
987
1034
|
const name = row.name;
|
|
988
|
-
return ns ? `${ns}
|
|
1035
|
+
return ns ? `${ns}::${name}` : name;
|
|
989
1036
|
});
|
|
990
1037
|
}
|
|
991
1038
|
return [];
|
|
@@ -996,7 +1043,7 @@ var WasmExecutor = class {
|
|
|
996
1043
|
async getSchema(tableName) {
|
|
997
1044
|
try {
|
|
998
1045
|
const result = await this.db.admin(
|
|
999
|
-
`FROM system
|
|
1046
|
+
`FROM system::columns FILTER table = "${tableName}" MAP { name, type }`
|
|
1000
1047
|
);
|
|
1001
1048
|
if (Array.isArray(result) && result.length > 0) {
|
|
1002
1049
|
const columns = result.map(
|
|
@@ -1038,11 +1085,7 @@ var WsExecutor = class {
|
|
|
1038
1085
|
if (row && typeof row === "object") {
|
|
1039
1086
|
const plainRow = {};
|
|
1040
1087
|
for (const [key, value] of Object.entries(row)) {
|
|
1041
|
-
|
|
1042
|
-
plainRow[key] = value.valueOf();
|
|
1043
|
-
} else {
|
|
1044
|
-
plainRow[key] = value;
|
|
1045
|
-
}
|
|
1088
|
+
plainRow[key] = value;
|
|
1046
1089
|
}
|
|
1047
1090
|
return plainRow;
|
|
1048
1091
|
}
|
|
@@ -1074,7 +1117,7 @@ var WsExecutor = class {
|
|
|
1074
1117
|
async getTables() {
|
|
1075
1118
|
try {
|
|
1076
1119
|
const frames = await this.client.admin(
|
|
1077
|
-
"FROM system
|
|
1120
|
+
"FROM system::tables MAP { namespace, name }",
|
|
1078
1121
|
null,
|
|
1079
1122
|
[]
|
|
1080
1123
|
);
|
|
@@ -1083,7 +1126,7 @@ var WsExecutor = class {
|
|
|
1083
1126
|
const r = row;
|
|
1084
1127
|
const ns = this.extractValue(r.namespace);
|
|
1085
1128
|
const name = this.extractValue(r.name);
|
|
1086
|
-
return ns ? `${ns}
|
|
1129
|
+
return ns ? `${ns}::${name}` : name;
|
|
1087
1130
|
});
|
|
1088
1131
|
} catch {
|
|
1089
1132
|
return [];
|
|
@@ -1092,7 +1135,7 @@ var WsExecutor = class {
|
|
|
1092
1135
|
async getSchema(tableName) {
|
|
1093
1136
|
try {
|
|
1094
1137
|
const frames = await this.client.admin(
|
|
1095
|
-
`FROM system
|
|
1138
|
+
`FROM system::columns FILTER table = "${tableName}" MAP { name, type }`,
|
|
1096
1139
|
null,
|
|
1097
1140
|
[]
|
|
1098
1141
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/terminal/adapter.ts","../src/terminal/theme.ts","../src/input/line-editor.ts","../src/input/history.ts","../src/input/multiline.ts","../src/commands/dot-commands.ts","../src/output/table.ts","../src/output/formatter.ts","../src/shell.ts","../src/executors/wasm-executor.ts","../src/executors/ws-executor.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { Terminal } from '@xterm/xterm';\nimport { FitAddon } from '@xterm/addon-fit';\nimport '@xterm/xterm/css/xterm.css';\nimport './styles.css';\nimport { defaultTheme, COLORS, type TerminalTheme } from './theme';\n\nexport type KeyHandler = (key: string, domEvent: KeyboardEvent) => void;\n\nexport class TerminalAdapter {\n private terminal: Terminal;\n private fitAddon: FitAddon;\n private keyHandler: KeyHandler | null = null;\n private resizeObserver: ResizeObserver | null = null;\n\n constructor(container: HTMLElement, theme: TerminalTheme = defaultTheme) {\n this.terminal = new Terminal({\n theme,\n fontFamily: \"'JetBrains Mono', 'Fira Code', 'Consolas', 'Monaco', monospace\",\n fontSize: 14,\n lineHeight: 1.2,\n cursorBlink: true,\n cursorStyle: 'block',\n scrollback: 10000,\n allowProposedApi: true,\n });\n\n this.fitAddon = new FitAddon();\n this.terminal.loadAddon(this.fitAddon);\n\n container.innerHTML = '';\n this.terminal.open(container);\n this.fitAddon.fit();\n\n // Handle resize\n this.resizeObserver = new ResizeObserver(() => {\n this.fitAddon.fit();\n });\n this.resizeObserver.observe(container);\n\n // Handle key input\n this.terminal.onKey(({ key, domEvent }) => {\n if (this.keyHandler) {\n this.keyHandler(key, domEvent);\n }\n });\n }\n\n onKey(handler: KeyHandler): void {\n this.keyHandler = handler;\n }\n\n write(text: string): void {\n this.terminal.write(text);\n }\n\n writeln(text: string): void {\n this.terminal.writeln(text);\n }\n\n clear(): void {\n this.terminal.clear();\n }\n\n get cols(): number {\n return this.terminal.cols;\n }\n\n get rows(): number {\n return this.terminal.rows;\n }\n\n focus(): void {\n this.terminal.focus();\n }\n\n dispose(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n this.terminal.dispose();\n }\n\n // ANSI escape code helpers - static for use without instance\n static readonly COLORS = COLORS;\n\n // Cursor control helpers\n static cursorUp(n: number = 1): string {\n return `\\x1b[${n}A`;\n }\n\n static cursorDown(n: number = 1): string {\n return `\\x1b[${n}B`;\n }\n\n static cursorForward(n: number = 1): string {\n return `\\x1b[${n}C`;\n }\n\n static cursorBack(n: number = 1): string {\n return `\\x1b[${n}D`;\n }\n\n static cursorPosition(row: number, col: number): string {\n return `\\x1b[${row};${col}H`;\n }\n\n static clearLine(): string {\n return '\\x1b[2K';\n }\n\n static clearToEndOfLine(): string {\n return '\\x1b[K';\n }\n\n static clearScreen(): string {\n return '\\x1b[2J\\x1b[3J\\x1b[H';\n }\n\n static saveCursor(): string {\n return '\\x1b[s';\n }\n\n static restoreCursor(): string {\n return '\\x1b[u';\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\n/**\n * Terminal color theme configuration\n */\nexport interface TerminalTheme {\n background: string;\n foreground: string;\n cursor: string;\n cursorAccent: string;\n selectionBackground: string;\n black: string;\n red: string;\n green: string;\n yellow: string;\n blue: string;\n magenta: string;\n cyan: string;\n white: string;\n brightBlack: string;\n brightRed: string;\n brightGreen: string;\n brightYellow: string;\n brightBlue: string;\n brightMagenta: string;\n brightCyan: string;\n brightWhite: string;\n}\n\n/**\n * Catppuccin Mocha theme - default theme\n */\nexport const defaultTheme: TerminalTheme = {\n background: '#1e1e2e',\n foreground: '#cdd6f4',\n cursor: '#f5e0dc',\n cursorAccent: '#1e1e2e',\n selectionBackground: '#45475a',\n black: '#45475a',\n red: '#f38ba8',\n green: '#a6e3a1',\n yellow: '#f9e2af',\n blue: '#89b4fa',\n magenta: '#f5c2e7',\n cyan: '#94e2d5',\n white: '#bac2de',\n brightBlack: '#585b70',\n brightRed: '#f38ba8',\n brightGreen: '#a6e3a1',\n brightYellow: '#f9e2af',\n brightBlue: '#89b4fa',\n brightMagenta: '#f5c2e7',\n brightCyan: '#94e2d5',\n brightWhite: '#a6adc8',\n};\n\n/**\n * ANSI escape codes for terminal colors and formatting\n */\nexport const COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n\n // Foreground colors\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n\n // Bright foreground colors\n brightBlack: '\\x1b[90m',\n brightRed: '\\x1b[91m',\n brightGreen: '\\x1b[92m',\n brightYellow: '\\x1b[93m',\n brightBlue: '\\x1b[94m',\n brightMagenta: '\\x1b[95m',\n brightCyan: '\\x1b[96m',\n brightWhite: '\\x1b[97m',\n} as const;\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\n\nexport class LineEditor {\n private buffer: string = '';\n private cursorPos: number = 0;\n private terminal: TerminalAdapter;\n\n constructor(terminal: TerminalAdapter) {\n this.terminal = terminal;\n }\n\n get value(): string {\n return this.buffer;\n }\n\n get cursor(): number {\n return this.cursorPos;\n }\n\n clear(): void {\n this.buffer = '';\n this.cursorPos = 0;\n }\n\n setValue(value: string): void {\n this.buffer = value;\n this.cursorPos = value.length;\n }\n\n insert(char: string): void {\n this.buffer =\n this.buffer.slice(0, this.cursorPos) +\n char +\n this.buffer.slice(this.cursorPos);\n this.cursorPos++;\n }\n\n backspace(): boolean {\n if (this.cursorPos > 0) {\n this.buffer =\n this.buffer.slice(0, this.cursorPos - 1) +\n this.buffer.slice(this.cursorPos);\n this.cursorPos--;\n return true;\n }\n return false;\n }\n\n delete(): boolean {\n if (this.cursorPos < this.buffer.length) {\n this.buffer =\n this.buffer.slice(0, this.cursorPos) +\n this.buffer.slice(this.cursorPos + 1);\n return true;\n }\n return false;\n }\n\n moveLeft(): boolean {\n if (this.cursorPos > 0) {\n this.cursorPos--;\n this.terminal.write(TerminalAdapter.cursorBack());\n return true;\n }\n return false;\n }\n\n moveRight(): boolean {\n if (this.cursorPos < this.buffer.length) {\n this.cursorPos++;\n this.terminal.write(TerminalAdapter.cursorForward());\n return true;\n }\n return false;\n }\n\n moveToStart(): void {\n if (this.cursorPos > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(this.cursorPos));\n this.cursorPos = 0;\n }\n }\n\n moveToEnd(): void {\n if (this.cursorPos < this.buffer.length) {\n const distance = this.buffer.length - this.cursorPos;\n this.terminal.write(TerminalAdapter.cursorForward(distance));\n this.cursorPos = this.buffer.length;\n }\n }\n\n moveWordLeft(): void {\n if (this.cursorPos === 0) return;\n\n let newPos = this.cursorPos - 1;\n\n // Skip whitespace\n while (newPos > 0 && /\\s/.test(this.buffer[newPos])) {\n newPos--;\n }\n\n // Move to start of word\n while (newPos > 0 && !/\\s/.test(this.buffer[newPos - 1])) {\n newPos--;\n }\n\n const distance = this.cursorPos - newPos;\n if (distance > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(distance));\n this.cursorPos = newPos;\n }\n }\n\n moveWordRight(): void {\n if (this.cursorPos >= this.buffer.length) return;\n\n let newPos = this.cursorPos;\n\n // Move past current word\n while (newPos < this.buffer.length && !/\\s/.test(this.buffer[newPos])) {\n newPos++;\n }\n\n // Skip whitespace\n while (newPos < this.buffer.length && /\\s/.test(this.buffer[newPos])) {\n newPos++;\n }\n\n const distance = newPos - this.cursorPos;\n if (distance > 0) {\n this.terminal.write(TerminalAdapter.cursorForward(distance));\n this.cursorPos = newPos;\n }\n }\n\n clearLine(): void {\n this.buffer = '';\n this.cursorPos = 0;\n }\n\n deleteToEnd(): void {\n this.buffer = this.buffer.slice(0, this.cursorPos);\n }\n\n deleteToStart(): void {\n this.buffer = this.buffer.slice(this.cursorPos);\n this.cursorPos = 0;\n }\n\n deleteWord(): void {\n if (this.cursorPos === 0) return;\n\n let newPos = this.cursorPos - 1;\n\n // Skip whitespace\n while (newPos > 0 && /\\s/.test(this.buffer[newPos])) {\n newPos--;\n }\n\n // Move to start of word\n while (newPos > 0 && !/\\s/.test(this.buffer[newPos - 1])) {\n newPos--;\n }\n\n this.buffer = this.buffer.slice(0, newPos) + this.buffer.slice(this.cursorPos);\n this.cursorPos = newPos;\n }\n\n // Called by shell to render the line with prompt\n render(prompt: string): void {\n this.terminal.write(\n '\\r' +\n TerminalAdapter.clearToEndOfLine() +\n prompt +\n this.buffer\n );\n\n // Position cursor correctly\n const cursorOffset = this.buffer.length - this.cursorPos;\n if (cursorOffset > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(cursorOffset));\n }\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { HistoryStorage } from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'reifydb-shell-history';\nconst MAX_HISTORY = 1000;\n\n/**\n * Default localStorage-based history storage\n */\nexport class LocalStorageHistoryStorage implements HistoryStorage {\n private key: string;\n\n constructor(key: string = DEFAULT_STORAGE_KEY) {\n this.key = key;\n }\n\n load(): string[] {\n try {\n const stored = localStorage.getItem(this.key);\n if (stored) {\n const parsed = JSON.parse(stored);\n if (Array.isArray(parsed)) {\n return parsed.filter((e): e is string => typeof e === 'string');\n }\n }\n } catch {\n // Ignore localStorage errors\n }\n return [];\n }\n\n save(entries: string[]): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(entries));\n } catch {\n // Ignore localStorage errors (quota exceeded, etc.)\n }\n }\n}\n\n/**\n * In-memory history storage (no persistence)\n */\nexport class MemoryHistoryStorage implements HistoryStorage {\n private entries: string[] = [];\n\n load(): string[] {\n return [...this.entries];\n }\n\n save(entries: string[]): void {\n this.entries = [...entries];\n }\n}\n\nexport class CommandHistory {\n private entries: string[] = [];\n private position: number = -1;\n private savedInput: string = '';\n private storage: HistoryStorage;\n\n constructor(storage?: HistoryStorage, historyKey?: string) {\n this.storage = storage ?? new LocalStorageHistoryStorage(historyKey);\n this.entries = this.storage.load();\n }\n\n add(command: string): void {\n const trimmed = command.trim();\n if (!trimmed) return;\n\n // Don't add duplicates at the end\n if (this.entries.length > 0 && this.entries[this.entries.length - 1] === trimmed) {\n this.reset();\n return;\n }\n\n this.entries.push(trimmed);\n\n // Limit size\n if (this.entries.length > MAX_HISTORY) {\n this.entries = this.entries.slice(-MAX_HISTORY);\n }\n\n this.storage.save(this.entries);\n this.reset();\n }\n\n previous(currentInput: string): string | null {\n if (this.entries.length === 0) return null;\n\n // Save current input when starting navigation\n if (this.position === -1) {\n this.savedInput = currentInput;\n this.position = this.entries.length;\n }\n\n if (this.position > 0) {\n this.position--;\n return this.entries[this.position];\n }\n\n return null;\n }\n\n next(): string | null {\n if (this.position === -1) return null;\n\n if (this.position < this.entries.length - 1) {\n this.position++;\n return this.entries[this.position];\n }\n\n if (this.position === this.entries.length - 1) {\n this.position = -1;\n return this.savedInput;\n }\n\n return null;\n }\n\n reset(): void {\n this.position = -1;\n this.savedInput = '';\n }\n\n getAll(): string[] {\n return [...this.entries];\n }\n\n clear(): void {\n this.entries = [];\n this.position = -1;\n this.savedInput = '';\n this.storage.save(this.entries);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nexport class MultilineBuffer {\n private lines: string[] = [];\n\n get isEmpty(): boolean {\n return this.lines.length === 0;\n }\n\n get content(): string {\n return this.lines.join(' ');\n }\n\n addLine(line: string): void {\n this.lines.push(line);\n }\n\n clear(): void {\n this.lines = [];\n }\n\n isComplete(): boolean {\n // A statement is complete when it ends with a semicolon\n const full = this.content.trim();\n return full.endsWith(';');\n }\n\n static isStatementComplete(input: string): boolean {\n const trimmed = input.trim();\n return trimmed.endsWith(';');\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\nimport type { DotCommandContext, DotCommandResult, DisplayMode } from '../types';\n\nconst C = TerminalAdapter.COLORS;\n\nexport async function handleDotCommand(\n input: string,\n context: DotCommandContext\n): Promise<DotCommandResult> {\n const parts = input.trim().split(/\\s+/);\n const command = parts[0].toLowerCase();\n const args = parts.slice(1);\n\n switch (command) {\n case '.help':\n showHelp(context.terminal);\n return { handled: true };\n\n case '.quit':\n case '.exit':\n context.terminal.writeln(`${C.yellow}Goodbye!${C.reset}`);\n context.terminal.writeln('');\n return { handled: true, exit: true };\n\n case '.clear':\n context.clearScreen();\n return { handled: true };\n\n case '.mode':\n handleMode(args, context);\n return { handled: true };\n\n case '.history':\n showHistory(context);\n return { handled: true };\n\n case '.tables':\n await showTables(context);\n return { handled: true };\n\n case '.schema':\n await showSchema(args, context);\n return { handled: true };\n\n default:\n if (command.startsWith('.')) {\n context.terminal.writeln(\n `${C.red}Unknown command: ${command}${C.reset}`\n );\n context.terminal.writeln(`Type ${C.cyan}.help${C.reset} for available commands.`);\n return { handled: true };\n }\n return { handled: false };\n }\n}\n\nfunction showHelp(terminal: TerminalAdapter): void {\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Available commands:${C.reset}`);\n terminal.writeln('');\n terminal.writeln(` ${C.green}.help${C.reset} Show this help message`);\n terminal.writeln(` ${C.green}.quit${C.reset}, ${C.green}.exit${C.reset} Exit message`);\n terminal.writeln(` ${C.green}.clear${C.reset} Clear the screen`);\n terminal.writeln(` ${C.green}.mode${C.reset} [mode] Set display mode (truncate|full)`);\n terminal.writeln(` ${C.green}.history${C.reset} Show command history`);\n terminal.writeln(` ${C.green}.tables${C.reset} List all tables`);\n terminal.writeln(` ${C.green}.schema${C.reset} [table] Show table schema`);\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Keyboard shortcuts:${C.reset}`);\n terminal.writeln('');\n terminal.writeln(` ${C.yellow}Left/Right${C.reset} Move cursor`);\n terminal.writeln(` ${C.yellow}Ctrl+Left/Right${C.reset} Move by word`);\n terminal.writeln(` ${C.yellow}Home/End${C.reset} Start/end of line`);\n terminal.writeln(` ${C.yellow}Ctrl+A/E${C.reset} Start/end of line`);\n terminal.writeln(` ${C.yellow}Ctrl+U${C.reset} Clear line`);\n terminal.writeln(` ${C.yellow}Ctrl+W${C.reset} Delete word`);\n terminal.writeln(` ${C.yellow}Up/Down${C.reset} Navigate history`);\n terminal.writeln(` ${C.yellow}Ctrl+C${C.reset} Cancel input`);\n terminal.writeln('');\n terminal.writeln(`${C.dim}Statements must end with a semicolon (;)${C.reset}`);\n terminal.writeln('');\n}\n\nfunction handleMode(args: string[], context: DotCommandContext): void {\n const terminal = context.terminal;\n\n if (args.length === 0) {\n terminal.writeln(`Current display mode: ${C.cyan}${context.displayMode}${C.reset}`);\n return;\n }\n\n const mode = args[0].toLowerCase();\n if (mode === 'truncate' || mode === 'full') {\n context.setDisplayMode(mode as DisplayMode);\n terminal.writeln(`Display mode set to: ${C.cyan}${mode}${C.reset}`);\n } else {\n terminal.writeln(\n `${C.red}Unknown mode: ${mode}${C.reset}. Use 'truncate' or 'full'.`\n );\n }\n}\n\nfunction showHistory(context: DotCommandContext): void {\n const terminal = context.terminal;\n const entries = context.history.getAll();\n\n if (entries.length === 0) {\n terminal.writeln(`${C.dim}No command history${C.reset}`);\n return;\n }\n\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Command history:${C.reset}`);\n terminal.writeln('');\n\n // Show last 20 entries\n const toShow = entries.slice(-20);\n const startIdx = entries.length - toShow.length;\n\n toShow.forEach((entry, i) => {\n const num = String(startIdx + i + 1).padStart(4, ' ');\n terminal.writeln(`${C.dim}${num}${C.reset} ${entry}`);\n });\n\n if (entries.length > 20) {\n terminal.writeln('');\n terminal.writeln(`${C.dim}... and ${entries.length - 20} more entries${C.reset}`);\n }\n terminal.writeln('');\n}\n\nasync function showTables(context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getTables) {\n terminal.writeln(`${C.dim}.tables command not supported by this executor${C.reset}`);\n return;\n }\n\n const tables = await context.executor.getTables();\n\n if (tables.length === 0) {\n terminal.writeln(`${C.dim}No tables found${C.reset}`);\n return;\n }\n\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Tables:${C.reset}`);\n terminal.writeln('');\n\n tables.forEach((table) => {\n terminal.writeln(` ${C.green}${table}${C.reset}`);\n });\n terminal.writeln('');\n}\n\nasync function showSchema(args: string[], context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getSchema) {\n terminal.writeln(`${C.dim}.schema command not supported by this executor${C.reset}`);\n return;\n }\n\n if (args.length === 0) {\n terminal.writeln(`${C.red}Usage: .schema <table_name>${C.reset}`);\n return;\n }\n\n const tableName = args[0];\n const schema = await context.executor.getSchema(tableName);\n\n if (schema) {\n terminal.writeln('');\n terminal.writeln(schema);\n terminal.writeln('');\n } else {\n terminal.writeln(`${C.red}Table not found: ${tableName}${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nexport interface TableColumn {\n name: string;\n width: number;\n}\n\nexport interface TableOptions {\n maxWidth?: number;\n truncate?: boolean;\n}\n\nexport class TableRenderer {\n private data: Record<string, unknown>[];\n private columns: TableColumn[];\n private maxWidth: number;\n private truncate: boolean;\n\n constructor(data: Record<string, unknown>[], options: TableOptions = {}) {\n this.data = data;\n this.maxWidth = options.maxWidth ?? 120;\n this.truncate = options.truncate ?? true;\n this.columns = this.calculateColumns();\n }\n\n private calculateColumns(): TableColumn[] {\n if (this.data.length === 0) return [];\n\n const columns: Map<string, number> = new Map();\n\n // Get all column names and calculate max widths\n for (const row of this.data) {\n for (const [key, value] of Object.entries(row)) {\n const valueStr = this.formatValue(value);\n const currentMax = columns.get(key) ?? key.length;\n columns.set(key, Math.max(currentMax, valueStr.length));\n }\n }\n\n return Array.from(columns.entries()).map(([name, width]) => ({\n name,\n width: Math.max(width, name.length),\n }));\n }\n\n private formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n private truncateString(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n if (maxLen <= 3) return str.slice(0, maxLen);\n return str.slice(0, maxLen - 3) + '...';\n }\n\n render(): string[] {\n if (this.data.length === 0 || this.columns.length === 0) {\n return ['(no results)'];\n }\n\n const lines: string[] = [];\n let columnsToShow = this.columns;\n let widths = this.columns.map((c) => c.width);\n\n // Calculate how many columns fit\n if (this.truncate) {\n const result = this.fitColumns(this.maxWidth);\n columnsToShow = result.columns;\n widths = result.widths;\n }\n\n // Build separator line\n const separator =\n '+' + widths.map((w) => '-'.repeat(w + 2)).join('+') + '+';\n\n lines.push(separator);\n\n // Build header\n const headerCells = columnsToShow.map((col, i) =>\n this.padCenter(col.name, widths[i])\n );\n lines.push('| ' + headerCells.join(' | ') + ' |');\n lines.push(separator);\n\n // Build rows\n for (const row of this.data) {\n const cells = columnsToShow.map((col, i) => {\n const value = this.formatValue(row[col.name]);\n const truncated = this.truncate\n ? this.truncateString(value, widths[i])\n : value;\n return this.padRight(truncated, widths[i]);\n });\n lines.push('| ' + cells.join(' | ') + ' |');\n }\n\n lines.push(separator);\n\n return lines;\n }\n\n private fitColumns(maxWidth: number): {\n columns: TableColumn[];\n widths: number[];\n } {\n const columns: TableColumn[] = [];\n const widths: number[] = [];\n let currentWidth = 1; // Starting '|'\n\n for (const col of this.columns) {\n // Each column: ' content ' + '|' = 3 extra chars\n const colWidth = Math.min(col.width, 40); // Cap individual column width\n const totalColWidth = colWidth + 3;\n\n if (currentWidth + totalColWidth <= maxWidth) {\n columns.push(col);\n widths.push(colWidth);\n currentWidth += totalColWidth;\n } else {\n break;\n }\n }\n\n // If no columns fit, show at least the first one\n if (columns.length === 0 && this.columns.length > 0) {\n const firstCol = this.columns[0];\n const availableWidth = maxWidth - 4; // '| ' and ' |'\n columns.push(firstCol);\n widths.push(Math.max(availableWidth, 10));\n }\n\n return { columns, widths };\n }\n\n private padCenter(str: string, width: number): string {\n const padding = width - str.length;\n if (padding <= 0) return str.slice(0, width);\n const left = Math.floor(padding / 2);\n const right = padding - left;\n return ' '.repeat(left) + str + ' '.repeat(right);\n }\n\n private padRight(str: string, width: number): string {\n const padding = width - str.length;\n if (padding <= 0) return str.slice(0, width);\n return str + ' '.repeat(padding);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\nimport { TableRenderer } from './table';\nimport type { ExecutionResult, DisplayMode } from '../types';\n\nconst C = TerminalAdapter.COLORS;\n\nexport class OutputFormatter {\n private terminal: TerminalAdapter;\n private displayMode: DisplayMode;\n\n constructor(terminal: TerminalAdapter, displayMode: DisplayMode = 'truncate') {\n this.terminal = terminal;\n this.displayMode = displayMode;\n }\n\n setDisplayMode(mode: DisplayMode): void {\n this.displayMode = mode;\n }\n\n formatResult(result: ExecutionResult): void {\n if (!result.success) {\n this.formatError(result.error ?? 'Unknown error', result.executionTime);\n return;\n }\n\n if (!result.data || result.data.length === 0) {\n this.terminal.writeln('');\n this.terminal.writeln(`${C.dim}Query executed successfully. No rows returned.${C.reset}`);\n this.formatExecutionTime(result.executionTime);\n return;\n }\n\n this.formatTable(result.data, result.executionTime);\n }\n\n private formatTable(data: Record<string, unknown>[], executionTime: number): void {\n const renderer = new TableRenderer(data, {\n maxWidth: this.displayMode === 'truncate' ? this.terminal.cols - 2 : undefined,\n truncate: this.displayMode === 'truncate',\n });\n\n const lines = renderer.render();\n this.terminal.writeln('');\n for (const line of lines) {\n this.terminal.writeln(line);\n }\n\n const rowCount = data.length;\n this.terminal.writeln('');\n this.terminal.write(\n `${C.green}${rowCount} row${rowCount !== 1 ? 's' : ''}${C.reset}`\n );\n this.formatExecutionTime(executionTime);\n }\n\n private formatError(error: string, executionTime: number): void {\n this.terminal.writeln('');\n this.terminal.writeln(`${C.red}Error: ${error}${C.reset}`);\n this.formatExecutionTime(executionTime);\n }\n\n private formatExecutionTime(ms: number): void {\n this.terminal.writeln(` ${C.dim}(${ms}ms)${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from './terminal/adapter';\nimport { COLORS } from './terminal/theme';\nimport { LineEditor } from './input/line-editor';\nimport { CommandHistory } from './input/history';\nimport { MultilineBuffer } from './input/multiline';\nimport { handleDotCommand } from './commands/dot-commands';\nimport { OutputFormatter } from './output/formatter';\nimport type { ShellOptions, DisplayMode, Executor } from './types';\n\nconst C = COLORS;\n\n// Default prompts\nconst DEFAULT_PRIMARY_PROMPT = `${C.cyan}reifydb${C.reset}${C.brightBlack}>${C.reset} `;\nconst DEFAULT_CONTINUATION_PROMPT = `${C.brightBlack} ...${C.reset} `;\n\n// Prompt lengths without ANSI codes (for cursor positioning)\nconst DEFAULT_PRIMARY_PROMPT_LEN = 9; // \"reifydb> \"\nconst DEFAULT_CONTINUATION_PROMPT_LEN = 8; // \" ... \"\n\nexport class Shell {\n private terminal: TerminalAdapter;\n private lineEditor: LineEditor;\n private history: CommandHistory;\n private multiline: MultilineBuffer;\n private executor: Executor;\n private formatter: OutputFormatter;\n private displayMode: DisplayMode;\n private isExited: boolean = false;\n\n // Configurable options\n private primaryPrompt: string;\n private primaryPromptLen: number;\n private continuationPrompt: string;\n private continuationPromptLen: number;\n private welcomeMessage: string | string[] | (() => string[]) | undefined;\n private onExit: (() => void) | undefined;\n\n constructor(container: HTMLElement, options: ShellOptions) {\n this.executor = options.executor;\n this.displayMode = options.displayMode ?? 'truncate';\n this.welcomeMessage = options.welcomeMessage;\n this.onExit = options.onExit;\n\n // Set up prompts\n this.primaryPrompt = options.prompt ?? DEFAULT_PRIMARY_PROMPT;\n this.primaryPromptLen = options.promptLength ?? DEFAULT_PRIMARY_PROMPT_LEN;\n this.continuationPrompt = options.continuationPrompt ?? DEFAULT_CONTINUATION_PROMPT;\n this.continuationPromptLen = options.continuationPromptLength ?? DEFAULT_CONTINUATION_PROMPT_LEN;\n\n // Initialize components\n this.terminal = new TerminalAdapter(container, options.theme);\n this.lineEditor = new LineEditor(this.terminal);\n this.history = new CommandHistory(options.historyStorage, options.historyKey);\n this.multiline = new MultilineBuffer();\n this.formatter = new OutputFormatter(this.terminal, this.displayMode);\n\n this.setupKeyHandler();\n }\n\n start(): void {\n this.showWelcomeBanner();\n this.showPrompt();\n this.terminal.focus();\n }\n\n dispose(): void {\n this.isExited = true;\n this.terminal.dispose();\n }\n\n private showWelcomeBanner(): void {\n if (this.welcomeMessage === undefined) {\n // Default welcome banner\n this.terminal.writeln('');\n this.terminal.writeln(`${C.bold}${C.cyan}ReifyDB Shell${C.reset}`);\n this.terminal.writeln('');\n this.terminal.writeln(`Type ${C.green}.help${C.reset} for available commands`);\n this.terminal.writeln(`Statements must end with a semicolon ${C.yellow};${C.reset}`);\n this.terminal.writeln('');\n return;\n }\n\n let lines: string[];\n if (typeof this.welcomeMessage === 'function') {\n lines = this.welcomeMessage();\n } else if (Array.isArray(this.welcomeMessage)) {\n lines = this.welcomeMessage;\n } else {\n lines = [this.welcomeMessage];\n }\n\n for (const line of lines) {\n this.terminal.writeln(line);\n }\n }\n\n private showPrompt(): void {\n const prompt = this.multiline.isEmpty ? this.primaryPrompt : this.continuationPrompt;\n this.terminal.write(prompt);\n }\n\n private getCurrentPromptLen(): number {\n return this.multiline.isEmpty ? this.primaryPromptLen : this.continuationPromptLen;\n }\n\n private setupKeyHandler(): void {\n this.terminal.onKey((key, event) => {\n if (this.isExited) return;\n this.handleKey(key, event);\n });\n }\n\n private handleKey(key: string, event: KeyboardEvent): void {\n const code = event.keyCode;\n\n // Handle Ctrl key combinations\n if (event.ctrlKey) {\n switch (event.key.toLowerCase()) {\n case 'a': // Ctrl+A - go to start\n event.preventDefault();\n this.lineEditor.moveToStart();\n return;\n\n case 'e': // Ctrl+E - go to end\n event.preventDefault();\n this.lineEditor.moveToEnd();\n return;\n\n case 'u': // Ctrl+U - clear line\n event.preventDefault();\n this.lineEditor.clearLine();\n this.redrawLine();\n return;\n\n case 'w': // Ctrl+W - delete word\n event.preventDefault();\n this.lineEditor.deleteWord();\n this.redrawLine();\n return;\n\n case 'c': // Ctrl+C - cancel\n event.preventDefault();\n this.terminal.writeln('^C');\n this.lineEditor.clear();\n this.multiline.clear();\n this.history.reset();\n this.showPrompt();\n return;\n\n case 'l': // Ctrl+L - clear screen\n event.preventDefault();\n this.clearScreen();\n return;\n }\n\n // Ctrl+Left/Right for word navigation\n if (code === 37) { // Left\n event.preventDefault();\n this.lineEditor.moveWordLeft();\n return;\n }\n if (code === 39) { // Right\n event.preventDefault();\n this.lineEditor.moveWordRight();\n return;\n }\n\n return;\n }\n\n // Handle special keys\n switch (code) {\n case 13: // Enter\n this.handleEnter();\n return;\n\n case 8: // Backspace\n if (this.lineEditor.backspace()) {\n this.redrawLine();\n }\n return;\n\n case 46: // Delete\n if (this.lineEditor.delete()) {\n this.redrawLine();\n }\n return;\n\n case 37: // Left arrow\n this.lineEditor.moveLeft();\n return;\n\n case 39: // Right arrow\n this.lineEditor.moveRight();\n return;\n\n case 38: // Up arrow\n this.navigateHistory('up');\n return;\n\n case 40: // Down arrow\n this.navigateHistory('down');\n return;\n\n case 36: // Home\n this.lineEditor.moveToStart();\n return;\n\n case 35: // End\n this.lineEditor.moveToEnd();\n return;\n\n case 9: // Tab - ignore for now\n return;\n\n case 27: // Escape - ignore\n return;\n }\n\n // Regular character input\n if (key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n this.lineEditor.insert(key);\n this.redrawLine();\n }\n }\n\n private redrawLine(): void {\n const prompt = this.multiline.isEmpty ? this.primaryPrompt : this.continuationPrompt;\n this.lineEditor.render(prompt);\n }\n\n private navigateHistory(direction: 'up' | 'down'): void {\n let entry: string | null;\n\n if (direction === 'up') {\n entry = this.history.previous(this.lineEditor.value);\n } else {\n entry = this.history.next();\n }\n\n if (entry !== null) {\n this.lineEditor.setValue(entry);\n this.redrawLine();\n }\n }\n\n private async handleEnter(): Promise<void> {\n const line = this.lineEditor.value;\n this.terminal.writeln('');\n this.lineEditor.clear();\n\n // Handle dot commands (only on first line)\n if (this.multiline.isEmpty && line.trim().startsWith('.')) {\n this.history.add(line);\n const result = await handleDotCommand(line, {\n terminal: this.terminal,\n executor: this.executor,\n history: this.history,\n displayMode: this.displayMode,\n setDisplayMode: (mode) => {\n this.displayMode = mode;\n this.formatter.setDisplayMode(mode);\n },\n clearScreen: () => this.clearScreen(),\n });\n\n if (result.exit) {\n this.isExited = true;\n if (this.onExit) {\n this.onExit();\n }\n return;\n }\n\n this.showPrompt();\n return;\n }\n\n // Add line to multiline buffer\n this.multiline.addLine(line);\n\n // Check if statement is complete\n if (this.multiline.isComplete()) {\n const statement = this.multiline.content;\n this.multiline.clear();\n this.history.add(statement);\n this.history.reset();\n\n // Execute the statement\n const result = await this.executor.execute(statement);\n this.formatter.formatResult(result);\n }\n\n this.showPrompt();\n }\n\n private clearScreen(): void {\n this.terminal.write(TerminalAdapter.clearScreen());\n this.showPrompt();\n this.terminal.write(this.lineEditor.value);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { Executor, ExecutionResult } from '../types';\n\n/**\n * Interface for WebAssembly database instances.\n * This matches the WasmDB interface from reifydb-wasm.\n */\nexport interface WasmDB {\n admin(rql: string): Promise<unknown> | unknown;\n}\n\n/**\n * Executor adapter for WebAssembly-based ReifyDB instances.\n */\nexport class WasmExecutor implements Executor {\n private db: WasmDB;\n\n constructor(db: WasmDB) {\n this.db = db;\n }\n\n async execute(statement: string): Promise<ExecutionResult> {\n const trimmed = statement.trim();\n\n // Remove trailing semicolon for execution\n const query = trimmed.endsWith(';')\n ? trimmed.slice(0, -1).trim()\n : trimmed;\n\n if (!query) {\n return {\n success: true,\n data: [],\n executionTime: 0,\n };\n }\n\n const startTime = performance.now();\n\n try {\n const results = await this.db.admin(query);\n const endTime = performance.now();\n\n return {\n success: true,\n data: Array.isArray(results) ? results : [],\n executionTime: Math.round(endTime - startTime),\n };\n } catch (error) {\n const endTime = performance.now();\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n executionTime: Math.round(endTime - startTime),\n };\n }\n }\n\n async getTables(): Promise<string[]> {\n try {\n // Query system catalog for tables\n const result = await this.db.admin('FROM system.tables MAP { namespace, name }');\n if (Array.isArray(result)) {\n return result.map((row: Record<string, unknown>) => {\n const ns = row.namespace as string;\n const name = row.name as string;\n return ns ? `${ns}.${name}` : name;\n });\n }\n return [];\n } catch {\n return [];\n }\n }\n\n async getSchema(tableName: string): Promise<string | null> {\n try {\n // Query system catalog for table schema\n const result = await this.db.admin(\n `FROM system.columns FILTER table = \"${tableName}\" MAP { name, type }`\n );\n if (Array.isArray(result) && result.length > 0) {\n const columns = result.map((row: Record<string, unknown>) =>\n ` ${row.name}: ${row.type}`\n ).join(',\\n');\n return `${tableName} {\\n${columns}\\n}`;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { Executor, ExecutionResult } from '../types';\n\n/**\n * Interface for WebSocket client.\n * This matches the WsClient interface from @reifydb/client.\n */\nexport interface WsClient {\n admin<const S extends readonly unknown[]>(\n statements: string | string[],\n params: unknown,\n schemas: S\n ): Promise<unknown[][]>;\n}\n\n/**\n * Executor adapter for WebSocket-based ReifyDB connections.\n */\nexport class WsExecutor implements Executor {\n private client: WsClient;\n\n constructor(client: WsClient) {\n this.client = client;\n }\n\n async execute(statement: string): Promise<ExecutionResult> {\n const trimmed = statement.trim();\n\n // Remove trailing semicolon for execution\n const query = trimmed.endsWith(';')\n ? trimmed.slice(0, -1).trim()\n : trimmed;\n\n if (!query) {\n return {\n success: true,\n data: [],\n executionTime: 0,\n };\n }\n\n const startTime = performance.now();\n\n try {\n // Execute via admin endpoint with no schema transformation\n const frames = await this.client.admin(query, null, []);\n const endTime = performance.now();\n\n // Get first frame results (admin typically returns single frame)\n const results = frames[0] ?? [];\n\n // Convert results to plain objects\n const data = results.map((row: unknown) => {\n if (row && typeof row === 'object') {\n const plainRow: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row as Record<string, unknown>)) {\n // Extract primitive value from Value objects if present\n if (value && typeof value === 'object' && typeof (value as { valueOf(): unknown }).valueOf === 'function') {\n plainRow[key] = (value as { valueOf(): unknown }).valueOf();\n } else {\n plainRow[key] = value;\n }\n }\n return plainRow;\n }\n return row as Record<string, unknown>;\n });\n\n return {\n success: true,\n data,\n executionTime: Math.round(endTime - startTime),\n };\n } catch (error) {\n const endTime = performance.now();\n\n // Extract error message from ReifyError if present\n let errorMessage: string;\n if (error && typeof error === 'object' && 'diagnostic' in error) {\n const diagnostic = (error as { diagnostic: { message: string } }).diagnostic;\n errorMessage = diagnostic.message;\n } else if (error instanceof Error) {\n errorMessage = error.message;\n } else {\n errorMessage = String(error);\n }\n\n return {\n success: false,\n error: errorMessage,\n executionTime: Math.round(endTime - startTime),\n };\n }\n }\n\n async getTables(): Promise<string[]> {\n try {\n const frames = await this.client.admin(\n 'FROM system.tables MAP { namespace, name }',\n null,\n []\n );\n const results = frames[0] ?? [];\n\n return results.map((row: unknown) => {\n const r = row as Record<string, unknown>;\n const ns = this.extractValue(r.namespace) as string;\n const name = this.extractValue(r.name) as string;\n return ns ? `${ns}.${name}` : name;\n });\n } catch {\n return [];\n }\n }\n\n async getSchema(tableName: string): Promise<string | null> {\n try {\n const frames = await this.client.admin(\n `FROM system.columns FILTER table = \"${tableName}\" MAP { name, type }`,\n null,\n []\n );\n const results = frames[0] ?? [];\n\n if (results.length > 0) {\n const columns = results.map((row: unknown) => {\n const r = row as Record<string, unknown>;\n return ` ${this.extractValue(r.name)}: ${this.extractValue(r.type)}`;\n }).join(',\\n');\n return `${tableName} {\\n${columns}\\n}`;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private extractValue(value: unknown): unknown {\n if (value && typeof value === 'object' && typeof (value as { valueOf(): unknown }).valueOf === 'function') {\n return (value as { valueOf(): unknown }).valueOf();\n }\n return value;\n }\n}\n"],"mappings":"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","names":["C","C"]}
|
|
1
|
+
{"version":3,"sources":["../src/terminal/adapter.ts","../src/terminal/theme.ts","../src/input/line-editor.ts","../src/input/history.ts","../src/input/multiline.ts","../src/commands/dot-commands.ts","../src/output/table.ts","../src/output/formatter.ts","../src/shell.ts","../src/executors/wasm-executor.ts","../src/executors/ws-executor.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { Terminal } from '@xterm/xterm';\nimport { FitAddon } from '@xterm/addon-fit';\nimport '@xterm/xterm/css/xterm.css';\nimport './styles.css';\nimport { defaultTheme, COLORS, type TerminalTheme } from './theme';\n\nexport type KeyHandler = (key: string, domEvent: KeyboardEvent) => void;\n\nexport class TerminalAdapter {\n private terminal: Terminal;\n private fitAddon: FitAddon;\n private container: HTMLElement;\n private keyHandler: KeyHandler | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private _isFullscreen: boolean = false;\n\n constructor(container: HTMLElement, theme: TerminalTheme = defaultTheme) {\n this.container = container;\n this.terminal = new Terminal({\n theme,\n fontFamily: \"'JetBrains Mono', 'Fira Code', 'Consolas', 'Monaco', monospace\",\n fontSize: 14,\n lineHeight: 1.2,\n cursorBlink: true,\n cursorStyle: 'block',\n scrollback: 10000,\n allowProposedApi: true,\n });\n\n this.fitAddon = new FitAddon();\n this.terminal.loadAddon(this.fitAddon);\n\n container.innerHTML = '';\n this.terminal.open(container);\n this.fitAddon.fit();\n\n // Handle resize\n this.resizeObserver = new ResizeObserver(() => {\n this.fitAddon.fit();\n });\n this.resizeObserver.observe(container);\n\n // Handle key input\n this.terminal.onKey(({ key, domEvent }) => {\n if (this.keyHandler) {\n this.keyHandler(key, domEvent);\n }\n });\n }\n\n onKey(handler: KeyHandler): void {\n this.keyHandler = handler;\n }\n\n write(text: string): void {\n this.terminal.write(text);\n }\n\n writeln(text: string): void {\n this.terminal.writeln(text);\n }\n\n clear(): void {\n this.terminal.clear();\n }\n\n get cols(): number {\n return this.terminal.cols;\n }\n\n get rows(): number {\n return this.terminal.rows;\n }\n\n focus(): void {\n this.terminal.focus();\n }\n\n dispose(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n this.terminal.dispose();\n }\n\n get isFullscreen(): boolean {\n return this._isFullscreen;\n }\n\n enterFullscreen(): void {\n if (this._isFullscreen) return;\n this._isFullscreen = true;\n this.container.classList.add('reifydb-shell-fullscreen');\n this.fitAddon.fit();\n }\n\n exitFullscreen(): void {\n if (!this._isFullscreen) return;\n this._isFullscreen = false;\n this.container.classList.remove('reifydb-shell-fullscreen');\n this.fitAddon.fit();\n }\n\n // ANSI escape code helpers - static for use without instance\n static readonly COLORS = COLORS;\n\n // Cursor control helpers\n static cursorUp(n: number = 1): string {\n return `\\x1b[${n}A`;\n }\n\n static cursorDown(n: number = 1): string {\n return `\\x1b[${n}B`;\n }\n\n static cursorForward(n: number = 1): string {\n return `\\x1b[${n}C`;\n }\n\n static cursorBack(n: number = 1): string {\n return `\\x1b[${n}D`;\n }\n\n static cursorPosition(row: number, col: number): string {\n return `\\x1b[${row};${col}H`;\n }\n\n static clearLine(): string {\n return '\\x1b[2K';\n }\n\n static clearToEndOfLine(): string {\n return '\\x1b[K';\n }\n\n static clearScreen(): string {\n return '\\x1b[2J\\x1b[3J\\x1b[H';\n }\n\n static saveCursor(): string {\n return '\\x1b[s';\n }\n\n static restoreCursor(): string {\n return '\\x1b[u';\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\n/**\n * Terminal color theme configuration\n */\nexport interface TerminalTheme {\n background: string;\n foreground: string;\n cursor: string;\n cursorAccent: string;\n selectionBackground: string;\n black: string;\n red: string;\n green: string;\n yellow: string;\n blue: string;\n magenta: string;\n cyan: string;\n white: string;\n brightBlack: string;\n brightRed: string;\n brightGreen: string;\n brightYellow: string;\n brightBlue: string;\n brightMagenta: string;\n brightCyan: string;\n brightWhite: string;\n}\n\n/**\n * Catppuccin Mocha theme - default theme\n */\nexport const defaultTheme: TerminalTheme = {\n background: '#1e1e2e',\n foreground: '#cdd6f4',\n cursor: '#f5e0dc',\n cursorAccent: '#1e1e2e',\n selectionBackground: '#45475a',\n black: '#45475a',\n red: '#f38ba8',\n green: '#a6e3a1',\n yellow: '#f9e2af',\n blue: '#89b4fa',\n magenta: '#f5c2e7',\n cyan: '#94e2d5',\n white: '#bac2de',\n brightBlack: '#585b70',\n brightRed: '#f38ba8',\n brightGreen: '#a6e3a1',\n brightYellow: '#f9e2af',\n brightBlue: '#89b4fa',\n brightMagenta: '#f5c2e7',\n brightCyan: '#94e2d5',\n brightWhite: '#a6adc8',\n};\n\n/**\n * ANSI escape codes for terminal colors and formatting\n */\nexport const COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n\n // Foreground colors\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n\n // Bright foreground colors\n brightBlack: '\\x1b[90m',\n brightRed: '\\x1b[91m',\n brightGreen: '\\x1b[92m',\n brightYellow: '\\x1b[93m',\n brightBlue: '\\x1b[94m',\n brightMagenta: '\\x1b[95m',\n brightCyan: '\\x1b[96m',\n brightWhite: '\\x1b[97m',\n} as const;\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\n\nexport class LineEditor {\n private buffer: string = '';\n private cursorPos: number = 0;\n private terminal: TerminalAdapter;\n\n constructor(terminal: TerminalAdapter) {\n this.terminal = terminal;\n }\n\n get value(): string {\n return this.buffer;\n }\n\n get cursor(): number {\n return this.cursorPos;\n }\n\n clear(): void {\n this.buffer = '';\n this.cursorPos = 0;\n }\n\n setValue(value: string): void {\n this.buffer = value;\n this.cursorPos = value.length;\n }\n\n insert(char: string): void {\n this.buffer =\n this.buffer.slice(0, this.cursorPos) +\n char +\n this.buffer.slice(this.cursorPos);\n this.cursorPos++;\n }\n\n backspace(): boolean {\n if (this.cursorPos > 0) {\n this.buffer =\n this.buffer.slice(0, this.cursorPos - 1) +\n this.buffer.slice(this.cursorPos);\n this.cursorPos--;\n return true;\n }\n return false;\n }\n\n delete(): boolean {\n if (this.cursorPos < this.buffer.length) {\n this.buffer =\n this.buffer.slice(0, this.cursorPos) +\n this.buffer.slice(this.cursorPos + 1);\n return true;\n }\n return false;\n }\n\n moveLeft(): boolean {\n if (this.cursorPos > 0) {\n this.cursorPos--;\n this.terminal.write(TerminalAdapter.cursorBack());\n return true;\n }\n return false;\n }\n\n moveRight(): boolean {\n if (this.cursorPos < this.buffer.length) {\n this.cursorPos++;\n this.terminal.write(TerminalAdapter.cursorForward());\n return true;\n }\n return false;\n }\n\n moveToStart(): void {\n if (this.cursorPos > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(this.cursorPos));\n this.cursorPos = 0;\n }\n }\n\n moveToEnd(): void {\n if (this.cursorPos < this.buffer.length) {\n const distance = this.buffer.length - this.cursorPos;\n this.terminal.write(TerminalAdapter.cursorForward(distance));\n this.cursorPos = this.buffer.length;\n }\n }\n\n moveWordLeft(): void {\n if (this.cursorPos === 0) return;\n\n let newPos = this.cursorPos - 1;\n\n // Skip whitespace\n while (newPos > 0 && /\\s/.test(this.buffer[newPos])) {\n newPos--;\n }\n\n // Move to start of word\n while (newPos > 0 && !/\\s/.test(this.buffer[newPos - 1])) {\n newPos--;\n }\n\n const distance = this.cursorPos - newPos;\n if (distance > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(distance));\n this.cursorPos = newPos;\n }\n }\n\n moveWordRight(): void {\n if (this.cursorPos >= this.buffer.length) return;\n\n let newPos = this.cursorPos;\n\n // Move past current word\n while (newPos < this.buffer.length && !/\\s/.test(this.buffer[newPos])) {\n newPos++;\n }\n\n // Skip whitespace\n while (newPos < this.buffer.length && /\\s/.test(this.buffer[newPos])) {\n newPos++;\n }\n\n const distance = newPos - this.cursorPos;\n if (distance > 0) {\n this.terminal.write(TerminalAdapter.cursorForward(distance));\n this.cursorPos = newPos;\n }\n }\n\n clearLine(): void {\n this.buffer = '';\n this.cursorPos = 0;\n }\n\n deleteToEnd(): void {\n this.buffer = this.buffer.slice(0, this.cursorPos);\n }\n\n deleteToStart(): void {\n this.buffer = this.buffer.slice(this.cursorPos);\n this.cursorPos = 0;\n }\n\n deleteWord(): void {\n if (this.cursorPos === 0) return;\n\n let newPos = this.cursorPos - 1;\n\n // Skip whitespace\n while (newPos > 0 && /\\s/.test(this.buffer[newPos])) {\n newPos--;\n }\n\n // Move to start of word\n while (newPos > 0 && !/\\s/.test(this.buffer[newPos - 1])) {\n newPos--;\n }\n\n this.buffer = this.buffer.slice(0, newPos) + this.buffer.slice(this.cursorPos);\n this.cursorPos = newPos;\n }\n\n // Called by shell to render the line with prompt\n render(prompt: string): void {\n this.terminal.write(\n '\\r' +\n TerminalAdapter.clearToEndOfLine() +\n prompt +\n this.buffer\n );\n\n // Position cursor correctly\n const cursorOffset = this.buffer.length - this.cursorPos;\n if (cursorOffset > 0) {\n this.terminal.write(TerminalAdapter.cursorBack(cursorOffset));\n }\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { HistoryStorage } from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'reifydb-shell-history';\nconst MAX_HISTORY = 1000;\n\n/**\n * Default localStorage-based history storage\n */\nexport class LocalStorageHistoryStorage implements HistoryStorage {\n private key: string;\n\n constructor(key: string = DEFAULT_STORAGE_KEY) {\n this.key = key;\n }\n\n load(): string[] {\n try {\n const stored = localStorage.getItem(this.key);\n if (stored) {\n const parsed = JSON.parse(stored);\n if (Array.isArray(parsed)) {\n return parsed.filter((e): e is string => typeof e === 'string');\n }\n }\n } catch {\n // Ignore localStorage errors\n }\n return [];\n }\n\n save(entries: string[]): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(entries));\n } catch {\n // Ignore localStorage errors (quota exceeded, etc.)\n }\n }\n}\n\n/**\n * In-memory history storage (no persistence)\n */\nexport class MemoryHistoryStorage implements HistoryStorage {\n private entries: string[] = [];\n\n load(): string[] {\n return [...this.entries];\n }\n\n save(entries: string[]): void {\n this.entries = [...entries];\n }\n}\n\nexport class CommandHistory {\n private entries: string[] = [];\n private position: number = -1;\n private savedInput: string = '';\n private storage: HistoryStorage;\n\n constructor(storage?: HistoryStorage, historyKey?: string) {\n this.storage = storage ?? new LocalStorageHistoryStorage(historyKey);\n this.entries = this.storage.load();\n }\n\n add(command: string): void {\n const trimmed = command.trim();\n if (!trimmed) return;\n\n // Don't add duplicates at the end\n if (this.entries.length > 0 && this.entries[this.entries.length - 1] === trimmed) {\n this.reset();\n return;\n }\n\n this.entries.push(trimmed);\n\n // Limit size\n if (this.entries.length > MAX_HISTORY) {\n this.entries = this.entries.slice(-MAX_HISTORY);\n }\n\n this.storage.save(this.entries);\n this.reset();\n }\n\n previous(currentInput: string): string | null {\n if (this.entries.length === 0) return null;\n\n // Save current input when starting navigation\n if (this.position === -1) {\n this.savedInput = currentInput;\n this.position = this.entries.length;\n }\n\n if (this.position > 0) {\n this.position--;\n return this.entries[this.position];\n }\n\n return null;\n }\n\n next(): string | null {\n if (this.position === -1) return null;\n\n if (this.position < this.entries.length - 1) {\n this.position++;\n return this.entries[this.position];\n }\n\n if (this.position === this.entries.length - 1) {\n this.position = -1;\n return this.savedInput;\n }\n\n return null;\n }\n\n reset(): void {\n this.position = -1;\n this.savedInput = '';\n }\n\n getAll(): string[] {\n return [...this.entries];\n }\n\n clear(): void {\n this.entries = [];\n this.position = -1;\n this.savedInput = '';\n this.storage.save(this.entries);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nexport class MultilineBuffer {\n private lines: string[] = [];\n\n get isEmpty(): boolean {\n return this.lines.length === 0;\n }\n\n get content(): string {\n return this.lines.join(' ');\n }\n\n addLine(line: string): void {\n this.lines.push(line);\n }\n\n clear(): void {\n this.lines = [];\n }\n\n isComplete(): boolean {\n // A statement is complete when it ends with a semicolon\n const full = this.content.trim();\n return full.endsWith(';');\n }\n\n static isStatementComplete(input: string): boolean {\n const trimmed = input.trim();\n return trimmed.endsWith(';');\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\nimport type { DotCommandContext, DotCommandResult, DisplayMode } from '../types';\n\nconst C = TerminalAdapter.COLORS;\n\nexport async function handleDotCommand(\n input: string,\n context: DotCommandContext\n): Promise<DotCommandResult> {\n const parts = input.trim().split(/\\s+/);\n const command = parts[0].toLowerCase();\n const args = parts.slice(1);\n\n switch (command) {\n case '.help':\n showHelp(context.terminal);\n return { handled: true };\n\n case '.clear':\n context.terminal.write(TerminalAdapter.clearScreen());\n return { handled: true };\n\n case '.mode':\n handleMode(args, context);\n return { handled: true };\n\n case '.history':\n showHistory(context);\n return { handled: true };\n\n case '.tables':\n await showTables(context);\n return { handled: true };\n\n case '.schema':\n await showSchema(args, context);\n return { handled: true };\n\n case '.fullscreen':\n context.enterFullscreen();\n return { handled: true };\n\n case '.exit':\n if (context.isFullscreen) {\n context.exitFullscreen();\n }\n return { handled: true };\n\n default:\n if (command.startsWith('.')) {\n context.terminal.writeln(\n `${C.red}Unknown command: ${command}${C.reset}`\n );\n context.terminal.writeln(`Type ${C.cyan}.help${C.reset} for available commands.`);\n return { handled: true };\n }\n return { handled: false };\n }\n}\n\nfunction showHelp(terminal: TerminalAdapter): void {\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Available commands:${C.reset}`);\n terminal.writeln('');\n terminal.writeln(` ${C.green}.help${C.reset} Show this help message`);\n terminal.writeln(` ${C.green}.clear${C.reset} Clear the screen`);\n terminal.writeln(` ${C.green}.mode${C.reset} [mode] Set display mode (truncate|full)`);\n terminal.writeln(` ${C.green}.history${C.reset} Show command history`);\n terminal.writeln(` ${C.green}.tables${C.reset} List all tables`);\n terminal.writeln(` ${C.green}.schema${C.reset} [table] Show table schema`);\n terminal.writeln(` ${C.green}.fullscreen${C.reset} Enter fullscreen mode`);\n terminal.writeln(` ${C.green}.exit${C.reset} Exit fullscreen mode`);\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Keyboard shortcuts:${C.reset}`);\n terminal.writeln('');\n terminal.writeln(` ${C.yellow}Left/Right${C.reset} Move cursor`);\n terminal.writeln(` ${C.yellow}Ctrl+Left/Right${C.reset} Move by word`);\n terminal.writeln(` ${C.yellow}Home/End${C.reset} Start/end of line`);\n terminal.writeln(` ${C.yellow}Ctrl+A/E${C.reset} Start/end of line`);\n terminal.writeln(` ${C.yellow}Ctrl+U${C.reset} Clear line`);\n terminal.writeln(` ${C.yellow}Ctrl+W${C.reset} Delete word`);\n terminal.writeln(` ${C.yellow}Up/Down${C.reset} Navigate history`);\n terminal.writeln(` ${C.yellow}Ctrl+C${C.reset} Cancel input`);\n terminal.writeln('');\n terminal.writeln(`${C.dim}Statements must end with a semicolon (;)${C.reset}`);\n terminal.writeln('');\n}\n\nfunction handleMode(args: string[], context: DotCommandContext): void {\n const terminal = context.terminal;\n\n if (args.length === 0) {\n terminal.writeln(`Current display mode: ${C.cyan}${context.displayMode}${C.reset}`);\n return;\n }\n\n const mode = args[0].toLowerCase();\n if (mode === 'truncate' || mode === 'full') {\n context.setDisplayMode(mode as DisplayMode);\n terminal.writeln(`Display mode set to: ${C.cyan}${mode}${C.reset}`);\n } else {\n terminal.writeln(\n `${C.red}Unknown mode: ${mode}${C.reset}. Use 'truncate' or 'full'.`\n );\n }\n}\n\nfunction showHistory(context: DotCommandContext): void {\n const terminal = context.terminal;\n const entries = context.history.getAll();\n\n if (entries.length === 0) {\n terminal.writeln(`${C.dim}No command history${C.reset}`);\n return;\n }\n\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Command history:${C.reset}`);\n terminal.writeln('');\n\n // Show last 20 entries\n const toShow = entries.slice(-20);\n const startIdx = entries.length - toShow.length;\n\n toShow.forEach((entry, i) => {\n const num = String(startIdx + i + 1).padStart(4, ' ');\n terminal.writeln(`${C.dim}${num}${C.reset} ${entry}`);\n });\n\n if (entries.length > 20) {\n terminal.writeln('');\n terminal.writeln(`${C.dim}... and ${entries.length - 20} more entries${C.reset}`);\n }\n terminal.writeln('');\n}\n\nasync function showTables(context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getTables) {\n terminal.writeln(`${C.dim}.tables command not supported by this executor${C.reset}`);\n return;\n }\n\n const tables = await context.executor.getTables();\n\n if (tables.length === 0) {\n terminal.writeln(`${C.dim}No tables found${C.reset}`);\n return;\n }\n\n terminal.writeln('');\n terminal.writeln(`${C.bold}${C.cyan}Tables:${C.reset}`);\n terminal.writeln('');\n\n tables.forEach((table) => {\n terminal.writeln(` ${C.green}${table}${C.reset}`);\n });\n terminal.writeln('');\n}\n\nasync function showSchema(args: string[], context: DotCommandContext): Promise<void> {\n const terminal = context.terminal;\n\n if (!context.executor.getSchema) {\n terminal.writeln(`${C.dim}.schema command not supported by this executor${C.reset}`);\n return;\n }\n\n if (args.length === 0) {\n terminal.writeln(`${C.red}Usage: .schema <table_name>${C.reset}`);\n return;\n }\n\n const tableName = args[0];\n const schema = await context.executor.getSchema(tableName);\n\n if (schema) {\n terminal.writeln('');\n terminal.writeln(schema);\n terminal.writeln('');\n } else {\n terminal.writeln(`${C.red}Table not found: ${tableName}${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nexport interface TableColumn {\n name: string;\n width: number;\n}\n\nexport interface TableOptions {\n maxWidth?: number;\n truncate?: boolean;\n}\n\nexport class TableRenderer {\n private data: Record<string, unknown>[];\n private columns: TableColumn[];\n private maxWidth: number;\n private truncate: boolean;\n\n constructor(data: Record<string, unknown>[], options: TableOptions = {}) {\n this.data = data;\n this.maxWidth = options.maxWidth ?? 120;\n this.truncate = options.truncate ?? false;\n this.columns = this.calculateColumns();\n }\n\n private calculateColumns(): TableColumn[] {\n if (this.data.length === 0) return [];\n\n const columns: Map<string, number> = new Map();\n\n // Get all column names and calculate max widths\n for (const row of this.data) {\n for (const [key, value] of Object.entries(row)) {\n const valueStr = this.formatValue(value);\n const currentMax = columns.get(key) ?? key.length;\n columns.set(key, Math.max(currentMax, valueStr.length));\n }\n }\n\n return Array.from(columns.entries()).map(([name, width]) => ({\n name,\n width: Math.max(width, name.length),\n }));\n }\n\n private formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'undefined';\n }\n // Check if it's a core Value object (has type property and toString)\n if (value && typeof value === 'object' && 'type' in value && typeof (value as { toString(): string }).toString === 'function') {\n return (value as { toString(): string }).toString();\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n private truncateString(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n if (maxLen <= 3) return str.slice(0, maxLen);\n return str.slice(0, maxLen - 3) + '...';\n }\n\n render(): string[] {\n if (this.data.length === 0 || this.columns.length === 0) {\n return ['(no results)'];\n }\n\n const lines: string[] = [];\n let columnsToShow = this.columns;\n let widths = this.columns.map((c) => c.width);\n\n // Calculate how many columns fit\n if (this.truncate) {\n const result = this.fitColumns(this.maxWidth);\n columnsToShow = result.columns;\n widths = result.widths;\n }\n\n // Build separator line\n const separator =\n '+' + widths.map((w) => '-'.repeat(w + 2)).join('+') + '+';\n\n lines.push(separator);\n\n // Build header\n const headerCells = columnsToShow.map((col, i) =>\n this.padCenter(col.name, widths[i])\n );\n lines.push('| ' + headerCells.join(' | ') + ' |');\n lines.push(separator);\n\n // Build rows\n for (const row of this.data) {\n const cells = columnsToShow.map((col, i) => {\n const value = this.formatValue(row[col.name]);\n const truncated = this.truncate\n ? this.truncateString(value, widths[i])\n : value;\n return this.padRight(truncated, widths[i]);\n });\n lines.push('| ' + cells.join(' | ') + ' |');\n }\n\n lines.push(separator);\n\n return lines;\n }\n\n private fitColumns(maxWidth: number): {\n columns: TableColumn[];\n widths: number[];\n } {\n const columns: TableColumn[] = [];\n const widths: number[] = [];\n let currentWidth = 1; // Starting '|'\n\n for (const col of this.columns) {\n // Each column: ' content ' + '|' = 3 extra chars\n const colWidth = Math.min(col.width, 40); // Cap individual column width\n const totalColWidth = colWidth + 3;\n\n if (currentWidth + totalColWidth <= maxWidth) {\n columns.push(col);\n widths.push(colWidth);\n currentWidth += totalColWidth;\n } else {\n break;\n }\n }\n\n // If no columns fit, show at least the first one\n if (columns.length === 0 && this.columns.length > 0) {\n const firstCol = this.columns[0];\n const availableWidth = maxWidth - 4; // '| ' and ' |'\n columns.push(firstCol);\n widths.push(Math.max(availableWidth, 10));\n }\n\n return { columns, widths };\n }\n\n private padCenter(str: string, width: number): string {\n const padding = width - str.length;\n if (padding <= 0) return str.slice(0, width);\n const left = Math.floor(padding / 2);\n const right = padding - left;\n return ' '.repeat(left) + str + ' '.repeat(right);\n }\n\n private padRight(str: string, width: number): string {\n const padding = width - str.length;\n if (padding <= 0) return str.slice(0, width);\n return str + ' '.repeat(padding);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from '../terminal/adapter';\nimport { TableRenderer } from './table';\nimport type { ExecutionResult, DisplayMode } from '../types';\n\nconst C = TerminalAdapter.COLORS;\n\nexport class OutputFormatter {\n private terminal: TerminalAdapter;\n private displayMode: DisplayMode;\n\n constructor(terminal: TerminalAdapter, displayMode: DisplayMode = 'full') {\n this.terminal = terminal;\n this.displayMode = displayMode;\n }\n\n setDisplayMode(mode: DisplayMode): void {\n this.displayMode = mode;\n }\n\n formatResult(result: ExecutionResult): void {\n if (!result.success) {\n this.formatError(result.error ?? 'Unknown error', result.executionTime);\n return;\n }\n\n if (!result.data || result.data.length === 0) {\n this.terminal.writeln('');\n this.terminal.writeln(`${C.dim}Query executed successfully. No rows returned.${C.reset}`);\n this.formatExecutionTime(result.executionTime);\n return;\n }\n\n this.formatTable(result.data, result.executionTime);\n }\n\n private formatTable(data: Record<string, unknown>[], executionTime: number): void {\n const renderer = new TableRenderer(data, {\n maxWidth: this.displayMode === 'truncate' ? this.terminal.cols - 2 : undefined,\n truncate: this.displayMode === 'truncate',\n });\n\n const lines = renderer.render();\n this.terminal.writeln('');\n for (const line of lines) {\n this.terminal.writeln(line);\n }\n\n const rowCount = data.length;\n this.terminal.writeln('');\n this.terminal.write(\n `${C.green}${rowCount} row${rowCount !== 1 ? 's' : ''}${C.reset}`\n );\n this.formatExecutionTime(executionTime);\n }\n\n private formatError(error: string, executionTime: number): void {\n this.terminal.writeln('');\n for (const line of error.split('\\n')) {\n this.terminal.writeln(line);\n }\n this.formatExecutionTime(executionTime);\n }\n\n private formatExecutionTime(ms: number): void {\n this.terminal.writeln(` ${C.dim}(${ms}ms)${C.reset}`);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport { TerminalAdapter } from './terminal/adapter';\nimport { COLORS } from './terminal/theme';\nimport { LineEditor } from './input/line-editor';\nimport { CommandHistory } from './input/history';\nimport { MultilineBuffer } from './input/multiline';\nimport { handleDotCommand } from './commands/dot-commands';\nimport { OutputFormatter } from './output/formatter';\nimport type { ShellOptions, DisplayMode, Executor } from './types';\n\nconst C = COLORS;\n\n// Default prompts\nconst DEFAULT_PRIMARY_PROMPT = `${C.cyan}reifydb${C.reset}${C.brightBlack}>${C.reset} `;\nconst DEFAULT_CONTINUATION_PROMPT = `${C.brightBlack} ...${C.reset} `;\n\n// Prompt lengths without ANSI codes (for cursor positioning)\nconst DEFAULT_PRIMARY_PROMPT_LEN = 9; // \"reifydb> \"\nconst DEFAULT_CONTINUATION_PROMPT_LEN = 8; // \" ... \"\n\nexport class Shell {\n private terminal: TerminalAdapter;\n private lineEditor: LineEditor;\n private history: CommandHistory;\n private multiline: MultilineBuffer;\n private executor: Executor;\n private formatter: OutputFormatter;\n private displayMode: DisplayMode;\n private isExited: boolean = false;\n\n // Configurable options\n private primaryPrompt: string;\n private primaryPromptLen: number;\n private continuationPrompt: string;\n private continuationPromptLen: number;\n private welcomeMessage: string | string[] | (() => string[]) | undefined;\n private onExit: (() => void) | undefined;\n private onFullscreenChange: ((isFullscreen: boolean) => void) | undefined;\n\n constructor(container: HTMLElement, options: ShellOptions) {\n this.executor = options.executor;\n this.displayMode = options.displayMode ?? 'full';\n this.welcomeMessage = options.welcomeMessage;\n this.onExit = options.onExit;\n this.onFullscreenChange = options.onFullscreenChange;\n\n // Set up prompts\n this.primaryPrompt = options.prompt ?? DEFAULT_PRIMARY_PROMPT;\n this.primaryPromptLen = options.promptLength ?? DEFAULT_PRIMARY_PROMPT_LEN;\n this.continuationPrompt = options.continuationPrompt ?? DEFAULT_CONTINUATION_PROMPT;\n this.continuationPromptLen = options.continuationPromptLength ?? DEFAULT_CONTINUATION_PROMPT_LEN;\n\n // Initialize components\n this.terminal = new TerminalAdapter(container, options.theme);\n this.lineEditor = new LineEditor(this.terminal);\n this.history = new CommandHistory(options.historyStorage, options.historyKey);\n this.multiline = new MultilineBuffer();\n this.formatter = new OutputFormatter(this.terminal, this.displayMode);\n\n this.setupKeyHandler();\n }\n\n start(): void {\n this.showWelcomeBanner();\n this.showPrompt();\n this.terminal.focus();\n }\n\n dispose(): void {\n this.isExited = true;\n this.terminal.exitFullscreen();\n this.terminal.dispose();\n }\n\n get isFullscreen(): boolean {\n return this.terminal.isFullscreen;\n }\n\n enterFullscreen(): void {\n this.terminal.enterFullscreen();\n this.onFullscreenChange?.(true);\n }\n\n exitFullscreen(): void {\n this.terminal.exitFullscreen();\n this.onFullscreenChange?.(false);\n }\n\n private showWelcomeBanner(): void {\n if (this.welcomeMessage === undefined) {\n // Default welcome banner\n this.terminal.writeln('');\n this.terminal.writeln(`${C.bold}${C.cyan}ReifyDB Shell${C.reset}`);\n this.terminal.writeln('');\n this.terminal.writeln(`Type ${C.green}.help${C.reset} for available commands`);\n this.terminal.writeln(`Statements must end with a semicolon ${C.yellow};${C.reset}`);\n this.terminal.writeln('');\n return;\n }\n\n let lines: string[];\n if (typeof this.welcomeMessage === 'function') {\n lines = this.welcomeMessage();\n } else if (Array.isArray(this.welcomeMessage)) {\n lines = this.welcomeMessage;\n } else {\n lines = [this.welcomeMessage];\n }\n\n for (const line of lines) {\n this.terminal.writeln(line);\n }\n }\n\n private showPrompt(): void {\n const prompt = this.multiline.isEmpty ? this.primaryPrompt : this.continuationPrompt;\n this.terminal.write(prompt);\n }\n\n private getCurrentPromptLen(): number {\n return this.multiline.isEmpty ? this.primaryPromptLen : this.continuationPromptLen;\n }\n\n private setupKeyHandler(): void {\n this.terminal.onKey((key, event) => {\n if (this.isExited) return;\n this.handleKey(key, event);\n });\n }\n\n private handleKey(key: string, event: KeyboardEvent): void {\n const code = event.keyCode;\n\n // Handle Ctrl key combinations\n if (event.ctrlKey) {\n switch (event.key.toLowerCase()) {\n case 'a': // Ctrl+A - go to start\n event.preventDefault();\n this.lineEditor.moveToStart();\n return;\n\n case 'e': // Ctrl+E - go to end\n event.preventDefault();\n this.lineEditor.moveToEnd();\n return;\n\n case 'u': // Ctrl+U - clear line\n event.preventDefault();\n this.lineEditor.clearLine();\n this.redrawLine();\n return;\n\n case 'w': // Ctrl+W - delete word\n event.preventDefault();\n this.lineEditor.deleteWord();\n this.redrawLine();\n return;\n\n case 'c': // Ctrl+C - cancel\n event.preventDefault();\n this.terminal.writeln('^C');\n this.lineEditor.clear();\n this.multiline.clear();\n this.history.reset();\n this.showPrompt();\n return;\n\n case 'l': // Ctrl+L - clear screen\n event.preventDefault();\n this.clearScreen();\n return;\n }\n\n // Ctrl+Left/Right for word navigation\n if (code === 37) { // Left\n event.preventDefault();\n this.lineEditor.moveWordLeft();\n return;\n }\n if (code === 39) { // Right\n event.preventDefault();\n this.lineEditor.moveWordRight();\n return;\n }\n\n return;\n }\n\n // Handle special keys\n switch (code) {\n case 13: // Enter\n this.handleEnter();\n return;\n\n case 8: // Backspace\n if (this.lineEditor.backspace()) {\n this.redrawLine();\n }\n return;\n\n case 46: // Delete\n if (this.lineEditor.delete()) {\n this.redrawLine();\n }\n return;\n\n case 37: // Left arrow\n this.lineEditor.moveLeft();\n return;\n\n case 39: // Right arrow\n this.lineEditor.moveRight();\n return;\n\n case 38: // Up arrow\n this.navigateHistory('up');\n return;\n\n case 40: // Down arrow\n this.navigateHistory('down');\n return;\n\n case 36: // Home\n this.lineEditor.moveToStart();\n return;\n\n case 35: // End\n this.lineEditor.moveToEnd();\n return;\n\n case 9: // Tab - ignore for now\n return;\n\n case 27: // Escape - exit fullscreen\n if (this.terminal.isFullscreen) {\n this.exitFullscreen();\n }\n return;\n }\n\n // Regular character input\n if (key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n this.lineEditor.insert(key);\n this.redrawLine();\n }\n }\n\n private redrawLine(): void {\n const prompt = this.multiline.isEmpty ? this.primaryPrompt : this.continuationPrompt;\n this.lineEditor.render(prompt);\n }\n\n private navigateHistory(direction: 'up' | 'down'): void {\n let entry: string | null;\n\n if (direction === 'up') {\n entry = this.history.previous(this.lineEditor.value);\n } else {\n entry = this.history.next();\n }\n\n if (entry !== null) {\n this.lineEditor.setValue(entry);\n this.redrawLine();\n }\n }\n\n private async handleEnter(): Promise<void> {\n const line = this.lineEditor.value;\n this.terminal.writeln('');\n this.lineEditor.clear();\n\n // Handle dot commands (only on first line)\n if (this.multiline.isEmpty && line.trim().startsWith('.')) {\n this.history.add(line);\n const result = await handleDotCommand(line, {\n terminal: this.terminal,\n executor: this.executor,\n history: this.history,\n displayMode: this.displayMode,\n setDisplayMode: (mode) => {\n this.displayMode = mode;\n this.formatter.setDisplayMode(mode);\n },\n clearScreen: () => this.clearScreen(),\n isFullscreen: this.isFullscreen,\n enterFullscreen: () => this.enterFullscreen(),\n exitFullscreen: () => this.exitFullscreen(),\n });\n\n if (result.exit) {\n this.isExited = true;\n if (this.onExit) {\n this.onExit();\n }\n return;\n }\n\n this.showPrompt();\n return;\n }\n\n // Add line to multiline buffer\n this.multiline.addLine(line);\n\n // Check if statement is complete\n if (this.multiline.isComplete()) {\n const statement = this.multiline.content;\n this.multiline.clear();\n this.history.add(statement);\n this.history.reset();\n\n // Execute the statement\n const result = await this.executor.execute(statement);\n this.formatter.formatResult(result);\n }\n\n this.showPrompt();\n }\n\n private clearScreen(): void {\n this.terminal.write(TerminalAdapter.clearScreen());\n this.showPrompt();\n this.terminal.write(this.lineEditor.value);\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { Executor, ExecutionResult } from '../types';\n\n/**\n * Interface for WebAssembly database instances.\n * This matches the WasmDB interface from reifydb-wasm.\n */\nexport interface WasmDB {\n admin(rql: string): Promise<unknown> | unknown;\n}\n\n/**\n * Executor adapter for WebAssembly-based ReifyDB instances.\n */\nexport class WasmExecutor implements Executor {\n private db: WasmDB;\n\n constructor(db: WasmDB) {\n this.db = db;\n }\n\n async execute(statement: string): Promise<ExecutionResult> {\n const trimmed = statement.trim();\n\n // Remove trailing semicolon for execution\n const query = trimmed.endsWith(';')\n ? trimmed.slice(0, -1).trim()\n : trimmed;\n\n if (!query) {\n return {\n success: true,\n data: [],\n executionTime: 0,\n };\n }\n\n const startTime = performance.now();\n\n try {\n const results = await this.db.admin(query);\n const endTime = performance.now();\n\n return {\n success: true,\n data: Array.isArray(results) ? results : [],\n executionTime: Math.round(endTime - startTime),\n };\n } catch (error) {\n const endTime = performance.now();\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n executionTime: Math.round(endTime - startTime),\n };\n }\n }\n\n async getTables(): Promise<string[]> {\n try {\n // Query system catalog for tables\n const result = await this.db.admin('FROM system::tables MAP { namespace, name }');\n if (Array.isArray(result)) {\n return result.map((row: Record<string, unknown>) => {\n const ns = row.namespace as string;\n const name = row.name as string;\n return ns ? `${ns}::${name}` : name;\n });\n }\n return [];\n } catch {\n return [];\n }\n }\n\n async getSchema(tableName: string): Promise<string | null> {\n try {\n // Query system catalog for table schema\n const result = await this.db.admin(\n `FROM system::columns FILTER table = \"${tableName}\" MAP { name, type }`\n );\n if (Array.isArray(result) && result.length > 0) {\n const columns = result.map((row: Record<string, unknown>) =>\n ` ${row.name}: ${row.type}`\n ).join(',\\n');\n return `${tableName} {\\n${columns}\\n}`;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (c) 2025 ReifyDB\n\nimport type { Executor, ExecutionResult } from '../types';\n\n/**\n * Interface for WebSocket client.\n * This matches the WsClient interface from @reifydb/client.\n */\nexport interface WsClient {\n admin<const S extends readonly unknown[]>(\n statements: string | string[],\n params: unknown,\n schemas: S\n ): Promise<unknown[][]>;\n}\n\n/**\n * Executor adapter for WebSocket-based ReifyDB connections.\n */\nexport class WsExecutor implements Executor {\n private client: WsClient;\n\n constructor(client: WsClient) {\n this.client = client;\n }\n\n async execute(statement: string): Promise<ExecutionResult> {\n const trimmed = statement.trim();\n\n // Remove trailing semicolon for execution\n const query = trimmed.endsWith(';')\n ? trimmed.slice(0, -1).trim()\n : trimmed;\n\n if (!query) {\n return {\n success: true,\n data: [],\n executionTime: 0,\n };\n }\n\n const startTime = performance.now();\n\n try {\n // Execute via admin endpoint with no schema transformation\n const frames = await this.client.admin(query, null, []);\n const endTime = performance.now();\n\n // Get first frame results (admin typically returns single frame)\n const results = frames[0] ?? [];\n\n // Convert results to plain objects, keeping Value objects as-is\n const data = results.map((row: unknown) => {\n if (row && typeof row === 'object') {\n const plainRow: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row as Record<string, unknown>)) {\n plainRow[key] = value; // Keep Value objects as-is\n }\n return plainRow;\n }\n return row as Record<string, unknown>;\n });\n\n return {\n success: true,\n data,\n executionTime: Math.round(endTime - startTime),\n };\n } catch (error) {\n const endTime = performance.now();\n\n // Extract error message from ReifyError if present\n let errorMessage: string;\n if (error && typeof error === 'object' && 'diagnostic' in error) {\n const diagnostic = (error as { diagnostic: { message: string } }).diagnostic;\n errorMessage = diagnostic.message;\n } else if (error instanceof Error) {\n errorMessage = error.message;\n } else {\n errorMessage = String(error);\n }\n\n return {\n success: false,\n error: errorMessage,\n executionTime: Math.round(endTime - startTime),\n };\n }\n }\n\n async getTables(): Promise<string[]> {\n try {\n const frames = await this.client.admin(\n 'FROM system::tables MAP { namespace, name }',\n null,\n []\n );\n const results = frames[0] ?? [];\n\n return results.map((row: unknown) => {\n const r = row as Record<string, unknown>;\n const ns = this.extractValue(r.namespace) as string;\n const name = this.extractValue(r.name) as string;\n return ns ? `${ns}::${name}` : name;\n });\n } catch {\n return [];\n }\n }\n\n async getSchema(tableName: string): Promise<string | null> {\n try {\n const frames = await this.client.admin(\n `FROM system::columns FILTER table = \"${tableName}\" MAP { name, type }`,\n null,\n []\n );\n const results = frames[0] ?? [];\n\n if (results.length > 0) {\n const columns = results.map((row: unknown) => {\n const r = row as Record<string, unknown>;\n return ` ${this.extractValue(r.name)}: ${this.extractValue(r.type)}`;\n }).join(',\\n');\n return `${tableName} {\\n${columns}\\n}`;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private extractValue(value: unknown): unknown {\n if (value && typeof value === 'object' && typeof (value as { valueOf(): unknown }).valueOf === 'function') {\n return (value as { valueOf(): unknown }).valueOf();\n }\n return value;\n }\n}\n"],"mappings":"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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.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Interactive terminal shell for ReifyDB databases",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"@xterm/addon-fit": "^0.10.0",
|
|
20
20
|
"tsup": "^8.5.0",
|
|
21
21
|
"typescript": "^5.8.3",
|
|
22
|
-
"@reifydb/client": "0.
|
|
22
|
+
"@reifydb/client": "0.3.0"
|
|
23
23
|
},
|
|
24
24
|
"engines": {
|
|
25
25
|
"node": ">=16.0.0"
|