@upstash/box-cli 0.1.3 → 0.1.5
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/README.md +29 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +7 -9
- package/dist/auth.js.map +1 -1
- package/dist/commands/completion.d.ts +2 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +37 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/connect.d.ts +3 -6
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +39 -16
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/create.d.ts +7 -7
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +27 -28
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/from-snapshot.d.ts +8 -11
- package/dist/commands/from-snapshot.d.ts.map +1 -1
- package/dist/commands/from-snapshot.js +27 -28
- package/dist/commands/from-snapshot.js.map +1 -1
- package/dist/commands/get.d.ts +2 -2
- package/dist/commands/get.js +4 -4
- package/dist/commands/init-demo.d.ts +15 -0
- package/dist/commands/init-demo.d.ts.map +1 -0
- package/dist/commands/init-demo.js +197 -0
- package/dist/commands/init-demo.js.map +1 -0
- package/dist/commands/list.d.ts +2 -2
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +15 -15
- package/dist/commands/list.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +55 -39
- package/dist/index.js.map +1 -1
- package/dist/output.d.ts +1 -1
- package/dist/output.js +3 -3
- package/dist/repl/client.d.ts +30 -0
- package/dist/repl/client.d.ts.map +1 -0
- package/dist/repl/client.js +128 -0
- package/dist/repl/client.js.map +1 -0
- package/dist/repl/commands/delete.d.ts +7 -0
- package/dist/repl/commands/delete.d.ts.map +1 -0
- package/dist/repl/commands/delete.js +9 -0
- package/dist/repl/commands/delete.js.map +1 -0
- package/dist/repl/commands/exec.d.ts +7 -0
- package/dist/repl/commands/exec.d.ts.map +1 -0
- package/dist/repl/commands/exec.js +14 -0
- package/dist/repl/commands/exec.js.map +1 -0
- package/dist/repl/commands/files.d.ts +7 -0
- package/dist/repl/commands/files.d.ts.map +1 -0
- package/dist/repl/commands/files.js +59 -0
- package/dist/repl/commands/files.js.map +1 -0
- package/dist/repl/commands/git.d.ts +7 -0
- package/dist/repl/commands/git.d.ts.map +1 -0
- package/dist/repl/commands/git.js +38 -0
- package/dist/repl/commands/git.js.map +1 -0
- package/dist/repl/commands/pause.d.ts +7 -0
- package/dist/repl/commands/pause.d.ts.map +1 -0
- package/dist/repl/commands/pause.js +9 -0
- package/dist/repl/commands/pause.js.map +1 -0
- package/dist/repl/commands/run.d.ts +7 -0
- package/dist/repl/commands/run.d.ts.map +1 -0
- package/dist/repl/commands/run.js +14 -0
- package/dist/repl/commands/run.js.map +1 -0
- package/dist/repl/commands/snapshot.d.ts +7 -0
- package/dist/repl/commands/snapshot.d.ts.map +1 -0
- package/dist/repl/commands/snapshot.js +9 -0
- package/dist/repl/commands/snapshot.js.map +1 -0
- package/dist/repl/spinner.d.ts +5 -0
- package/dist/repl/spinner.d.ts.map +1 -0
- package/dist/repl/spinner.js +39 -0
- package/dist/repl/spinner.js.map +1 -0
- package/dist/repl/terminal.d.ts +6 -0
- package/dist/repl/terminal.d.ts.map +1 -0
- package/dist/repl/terminal.js +141 -0
- package/dist/repl/terminal.js.map +1 -0
- package/dist/utils/ansi.d.ts +19 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +24 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/fuzzy.d.ts +9 -0
- package/dist/utils/fuzzy.d.ts.map +1 -0
- package/dist/utils/fuzzy.js +30 -0
- package/dist/utils/fuzzy.js.map +1 -0
- package/dist/utils/interactive-select.d.ts +16 -0
- package/dist/utils/interactive-select.d.ts.map +1 -0
- package/dist/utils/interactive-select.js +75 -0
- package/dist/utils/interactive-select.js.map +1 -0
- package/package.json +12 -4
- package/dist/repl-commands/delete.d.ts +0 -6
- package/dist/repl-commands/delete.d.ts.map +0 -1
- package/dist/repl-commands/delete.js +0 -9
- package/dist/repl-commands/delete.js.map +0 -1
- package/dist/repl-commands/exec.d.ts +0 -6
- package/dist/repl-commands/exec.d.ts.map +0 -1
- package/dist/repl-commands/exec.js +0 -13
- package/dist/repl-commands/exec.js.map +0 -1
- package/dist/repl-commands/files.d.ts +0 -6
- package/dist/repl-commands/files.d.ts.map +0 -1
- package/dist/repl-commands/files.js +0 -59
- package/dist/repl-commands/files.js.map +0 -1
- package/dist/repl-commands/git.d.ts +0 -6
- package/dist/repl-commands/git.d.ts.map +0 -1
- package/dist/repl-commands/git.js +0 -38
- package/dist/repl-commands/git.js.map +0 -1
- package/dist/repl-commands/run.d.ts +0 -6
- package/dist/repl-commands/run.d.ts.map +0 -1
- package/dist/repl-commands/run.js +0 -14
- package/dist/repl-commands/run.js.map +0 -1
- package/dist/repl-commands/snapshot.d.ts +0 -6
- package/dist/repl-commands/snapshot.d.ts.map +0 -1
- package/dist/repl-commands/snapshot.js +0 -9
- package/dist/repl-commands/snapshot.js.map +0 -1
- package/dist/repl-commands/stop.d.ts +0 -6
- package/dist/repl-commands/stop.d.ts.map +0 -1
- package/dist/repl-commands/stop.js +0 -9
- package/dist/repl-commands/stop.js.map +0 -1
- package/dist/repl.d.ts +0 -6
- package/dist/repl.d.ts.map +0 -1
- package/dist/repl.js +0 -64
- package/dist/repl.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/repl/commands/exec.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAQ,EAAE,OAAe,EAAE,KAAgB;IAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IAClC,IAAI,MAAM;QAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Box } from "@upstash/box";
|
|
2
|
+
import type { REPLHooks } from "../client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handle file subcommands: read, write, list, upload, download.
|
|
5
|
+
*/
|
|
6
|
+
export declare function handleFiles(box: Box, args: string, hooks: REPLHooks): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDzF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle file subcommands: read, write, list, upload, download.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleFiles(box, args, hooks) {
|
|
5
|
+
const parts = args.split(/\s+/);
|
|
6
|
+
const sub = parts[0];
|
|
7
|
+
switch (sub) {
|
|
8
|
+
case "read": {
|
|
9
|
+
const path = parts[1];
|
|
10
|
+
if (!path) {
|
|
11
|
+
hooks.onLog("Usage: files read <path>");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const content = await box.files.read(path);
|
|
15
|
+
hooks.onLog(content);
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
case "write": {
|
|
19
|
+
const path = parts[1];
|
|
20
|
+
const content = parts.slice(2).join(" ");
|
|
21
|
+
if (!path || !content) {
|
|
22
|
+
hooks.onLog("Usage: files write <path> <content>");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
await box.files.write({ path, content });
|
|
26
|
+
hooks.onLog(`Written to ${path}`);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
case "list": {
|
|
30
|
+
const path = parts[1];
|
|
31
|
+
const files = await box.files.list(path);
|
|
32
|
+
for (const f of files) {
|
|
33
|
+
const indicator = f.is_dir ? "/" : "";
|
|
34
|
+
hooks.onLog(`${f.name}${indicator}\t${f.size}`);
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case "upload": {
|
|
39
|
+
const localPath = parts[1];
|
|
40
|
+
const destination = parts[2];
|
|
41
|
+
if (!localPath || !destination) {
|
|
42
|
+
hooks.onLog("Usage: files upload <local-path> <destination>");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
await box.files.upload([{ path: localPath, destination }]);
|
|
46
|
+
hooks.onLog(`Uploaded ${localPath} → ${destination}`);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case "download": {
|
|
50
|
+
const path = parts[1];
|
|
51
|
+
await box.files.download(path ? { path } : undefined);
|
|
52
|
+
hooks.onLog("Downloaded.");
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
default:
|
|
56
|
+
hooks.onLog("Usage: files <read|write|list|upload|download> [args...]");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/repl/commands/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Box } from "@upstash/box";
|
|
2
|
+
import type { REPLHooks } from "../client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handle git subcommands: clone, diff, create-pr.
|
|
5
|
+
*/
|
|
6
|
+
export declare function handleGit(box: Box, args: string, hooks: REPLHooks): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/git.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCvF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle git subcommands: clone, diff, create-pr.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleGit(box, args, hooks) {
|
|
5
|
+
const parts = args.split(/\s+/);
|
|
6
|
+
const sub = parts[0];
|
|
7
|
+
switch (sub) {
|
|
8
|
+
case "clone": {
|
|
9
|
+
const repo = parts[1];
|
|
10
|
+
const branch = parts[2];
|
|
11
|
+
if (!repo) {
|
|
12
|
+
hooks.onLog("Usage: git clone <repo> [branch]");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
await box.git.clone({ repo, branch });
|
|
16
|
+
hooks.onLog(`Cloned ${repo}`);
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
case "diff": {
|
|
20
|
+
const diff = await box.git.diff();
|
|
21
|
+
hooks.onLog(diff || "(no changes)");
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
case "create-pr": {
|
|
25
|
+
const title = parts.slice(1).join(" ");
|
|
26
|
+
if (!title) {
|
|
27
|
+
hooks.onLog("Usage: git create-pr <title>");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const pr = await box.git.createPR({ title });
|
|
31
|
+
hooks.onLog(`PR #${pr.number}: ${pr.url}`);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
default:
|
|
35
|
+
hooks.onLog("Usage: git <clone|diff|create-pr> [args...]");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/repl/commands/git.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,IAAY,EAAE,KAAgB;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAErB,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YACD,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAC9B,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAClC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC;YACpC,MAAM;QACR,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3C,MAAM;QACR,CAAC;QACD;YACE,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Box } from "@upstash/box";
|
|
2
|
+
import type { REPLHooks } from "../client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Pause the box. Returns true to signal the REPL to exit.
|
|
5
|
+
*/
|
|
6
|
+
export declare function handlePause(box: Box, _args: string, hooks: REPLHooks): Promise<boolean>;
|
|
7
|
+
//# sourceMappingURL=pause.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/pause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAI7F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pause.js","sourceRoot":"","sources":["../../../src/repl/commands/pause.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAQ,EAAE,KAAa,EAAE,KAAgB;IACzE,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAClB,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Box } from "@upstash/box";
|
|
2
|
+
import type { REPLHooks } from "../client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Run the agent with a prompt, streaming output via hooks.
|
|
5
|
+
*/
|
|
6
|
+
export declare function handleRun(box: Box, prompt: string, hooks: REPLHooks): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CASzF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run the agent with a prompt, streaming output via hooks.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleRun(box, prompt, hooks) {
|
|
5
|
+
if (!prompt) {
|
|
6
|
+
hooks.onLog("Usage: run <prompt>");
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
for await (const chunk of box.agent.stream({ prompt })) {
|
|
10
|
+
hooks.onStream(chunk);
|
|
11
|
+
}
|
|
12
|
+
hooks.onStream("\n");
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/repl/commands/run.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,MAAc,EAAE,KAAgB;IACxE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IACD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Box } from "@upstash/box";
|
|
2
|
+
import type { REPLHooks } from "../client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Create a snapshot of the current box state.
|
|
5
|
+
*/
|
|
6
|
+
export declare function handleSnapshot(box: Box, args: string, hooks: REPLHooks): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5F"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a snapshot of the current box state.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleSnapshot(box, args, hooks) {
|
|
5
|
+
const name = args.trim() || `snapshot-${Date.now()}`;
|
|
6
|
+
const snapshot = await box.snapshot({ name });
|
|
7
|
+
hooks.onLog(`Snapshot created: ${snapshot.id} (${snapshot.name})`);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/repl/commands/snapshot.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAQ,EAAE,IAAY,EAAE,KAAgB;IAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,KAAK,CAAC,qBAAqB,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/repl/spinner.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,IAAI,CAiBzC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { stdout } from "node:process";
|
|
2
|
+
import { cyan, dim, eraseLine } from "../utils/ansi.js";
|
|
3
|
+
const FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
4
|
+
const MESSAGES = [
|
|
5
|
+
"Thinking",
|
|
6
|
+
"Cooking",
|
|
7
|
+
"Checking",
|
|
8
|
+
"Working",
|
|
9
|
+
"Processing",
|
|
10
|
+
"Crunching",
|
|
11
|
+
"Computing",
|
|
12
|
+
"Brewing",
|
|
13
|
+
"Wiring",
|
|
14
|
+
"Loading",
|
|
15
|
+
];
|
|
16
|
+
function randomMessage() {
|
|
17
|
+
return MESSAGES[Math.floor(Math.random() * MESSAGES.length)];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Start a terminal spinner. Returns a stop() function.
|
|
21
|
+
*/
|
|
22
|
+
export function startSpinner() {
|
|
23
|
+
const message = randomMessage();
|
|
24
|
+
let frame = 0;
|
|
25
|
+
let stopped = false;
|
|
26
|
+
const timer = setInterval(() => {
|
|
27
|
+
const f = FRAMES[frame % FRAMES.length];
|
|
28
|
+
stdout.write(`\r${eraseLine}${cyan(f)} ${dim(message)}...`);
|
|
29
|
+
frame++;
|
|
30
|
+
}, 80);
|
|
31
|
+
return function stop() {
|
|
32
|
+
if (stopped)
|
|
33
|
+
return;
|
|
34
|
+
stopped = true;
|
|
35
|
+
clearInterval(timer);
|
|
36
|
+
stdout.write(`\r${eraseLine}`);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/repl/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAElE,MAAM,QAAQ,GAAG;IACf,UAAU;IACV,SAAS;IACT,UAAU;IACV,SAAS;IACT,YAAY;IACZ,WAAW;IACX,WAAW;IACX,SAAS;IACT,QAAQ;IACR,SAAS;CACV,CAAC;AAEF,SAAS,aAAa;IACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAE,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5D,KAAK,EAAE,CAAC;IACV,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,SAAS,IAAI;QAClB,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/repl/terminal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAgBxC;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAqJvD"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin, stdout } from "node:process";
|
|
3
|
+
import { BoxREPLClient, COMMAND_NAMES, COMMAND_DESCRIPTIONS } from "./client.js";
|
|
4
|
+
import { startSpinner } from "./spinner.js";
|
|
5
|
+
import { bold, cyan, dim, green, red, yellow, cursorSave, cursorRestore, eraseLine, eraseDown, } from "../utils/ansi.js";
|
|
6
|
+
/**
|
|
7
|
+
* Start an interactive REPL session for the given box (CLI entry point).
|
|
8
|
+
*/
|
|
9
|
+
export async function startRepl(box) {
|
|
10
|
+
const rl = createInterface({
|
|
11
|
+
input: stdin,
|
|
12
|
+
output: stdout,
|
|
13
|
+
completer: () => [[], ""],
|
|
14
|
+
});
|
|
15
|
+
const prompt = `${bold(cyan(box.id))}${dim(">")} `;
|
|
16
|
+
// --- Spinner tracking ---
|
|
17
|
+
let activeSpinnerStop = null;
|
|
18
|
+
function ensureSpinnerStopped() {
|
|
19
|
+
if (activeSpinnerStop) {
|
|
20
|
+
activeSpinnerStop();
|
|
21
|
+
activeSpinnerStop = null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// --- Command preview while typing ---
|
|
25
|
+
let previewLines = 0;
|
|
26
|
+
function clearPreview() {
|
|
27
|
+
if (previewLines > 0) {
|
|
28
|
+
stdout.write(cursorSave);
|
|
29
|
+
for (let i = 0; i < previewLines; i++) {
|
|
30
|
+
stdout.write("\n" + eraseLine);
|
|
31
|
+
}
|
|
32
|
+
stdout.write(eraseDown + cursorRestore);
|
|
33
|
+
previewLines = 0;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// --- Ghost suggestion in input ---
|
|
37
|
+
let nextSuggestion = "/exec ls";
|
|
38
|
+
let ghostText = null;
|
|
39
|
+
function showGhost(text) {
|
|
40
|
+
ghostText = text;
|
|
41
|
+
stdout.write(dim(text));
|
|
42
|
+
// Move cursor back to just after the prompt
|
|
43
|
+
stdout.write(`\x1b[${text.length}D`);
|
|
44
|
+
}
|
|
45
|
+
if (stdin.isTTY) {
|
|
46
|
+
stdin.on("keypress", (_str, key) => {
|
|
47
|
+
// Handle ghost text: Tab accepts, any other key dismisses
|
|
48
|
+
if (ghostText) {
|
|
49
|
+
if (key?.name === "tab") {
|
|
50
|
+
const text = ghostText;
|
|
51
|
+
ghostText = null;
|
|
52
|
+
rl.write(text);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
ghostText = null;
|
|
56
|
+
// Erase leftover ghost text after cursor
|
|
57
|
+
setImmediate(() => {
|
|
58
|
+
stdout.write(cursorSave + "\x1b[K" + cursorRestore);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Command preview logic (deferred so rl.line is up to date)
|
|
62
|
+
setImmediate(() => {
|
|
63
|
+
const line = rl.line ?? "";
|
|
64
|
+
clearPreview();
|
|
65
|
+
if (line.startsWith("/") && !line.includes(" ")) {
|
|
66
|
+
const partial = line.slice(1);
|
|
67
|
+
const matches = COMMAND_NAMES.filter((c) => c.startsWith(partial)).slice(0, 5);
|
|
68
|
+
if (matches.length > 0) {
|
|
69
|
+
const preview = matches
|
|
70
|
+
.map((c) => ` ${dim(`/${c}`)} ${dim("—")} ${dim(COMMAND_DESCRIPTIONS[c] ?? "")}`)
|
|
71
|
+
.join("\n");
|
|
72
|
+
stdout.write(cursorSave + "\n" + preview + cursorRestore);
|
|
73
|
+
previewLines = matches.length;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const client = new BoxREPLClient({
|
|
80
|
+
box,
|
|
81
|
+
promptUser: () => {
|
|
82
|
+
clearPreview();
|
|
83
|
+
const suggestion = nextSuggestion;
|
|
84
|
+
nextSuggestion = null;
|
|
85
|
+
const promise = rl.question(prompt).then((input) => {
|
|
86
|
+
// Rewrite the prompt line with the input in green
|
|
87
|
+
if (input.trim()) {
|
|
88
|
+
stdout.write(`\x1b[A\r${eraseLine}${prompt}${green(input)}\n`);
|
|
89
|
+
}
|
|
90
|
+
return input;
|
|
91
|
+
});
|
|
92
|
+
if (suggestion && stdin.isTTY) {
|
|
93
|
+
setImmediate(() => showGhost(suggestion));
|
|
94
|
+
}
|
|
95
|
+
return promise;
|
|
96
|
+
},
|
|
97
|
+
hooks: {
|
|
98
|
+
onLog: (message) => {
|
|
99
|
+
ensureSpinnerStopped();
|
|
100
|
+
clearPreview();
|
|
101
|
+
console.log(message);
|
|
102
|
+
},
|
|
103
|
+
onError: (message) => {
|
|
104
|
+
ensureSpinnerStopped();
|
|
105
|
+
clearPreview();
|
|
106
|
+
console.error(red(message));
|
|
107
|
+
},
|
|
108
|
+
onStream: (chunk) => {
|
|
109
|
+
ensureSpinnerStopped();
|
|
110
|
+
process.stdout.write(chunk);
|
|
111
|
+
},
|
|
112
|
+
onLoadingStart: () => {
|
|
113
|
+
stdout.write("\n");
|
|
114
|
+
const stop = startSpinner();
|
|
115
|
+
activeSpinnerStop = stop;
|
|
116
|
+
return stop;
|
|
117
|
+
},
|
|
118
|
+
onSuggestion: (text) => {
|
|
119
|
+
nextSuggestion = text;
|
|
120
|
+
},
|
|
121
|
+
onCommandComplete: (command, durationMs) => {
|
|
122
|
+
const seconds = (durationMs / 1000).toFixed(1);
|
|
123
|
+
console.log(dim(`\n /${command} completed in ${seconds}s\n`));
|
|
124
|
+
},
|
|
125
|
+
onCommandNotFound: (typed, suggestions) => {
|
|
126
|
+
console.error(red(`Unknown command: /${typed}`));
|
|
127
|
+
if (suggestions.length > 0) {
|
|
128
|
+
console.log(yellow(`Did you mean: ${suggestions.map((s) => `/${s}`).join(", ")}?`));
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
try {
|
|
134
|
+
await client.startLoop();
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
clearPreview();
|
|
138
|
+
rl.close();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/repl/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,KAAK,EACL,GAAG,EACH,MAAM,EACN,UAAU,EACV,aAAa,EACb,SAAS,EACT,SAAS,GACV,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ;IACtC,MAAM,EAAE,GAAG,eAAe,CAAC;QACzB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,GAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;KAC9C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IAEnD,2BAA2B;IAC3B,IAAI,iBAAiB,GAAwB,IAAI,CAAC;IAElD,SAAS,oBAAoB;QAC3B,IAAI,iBAAiB,EAAE,CAAC;YACtB,iBAAiB,EAAE,CAAC;YACpB,iBAAiB,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,SAAS,YAAY;QACnB,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;YACjC,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAC;YACxC,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,cAAc,GAAkB,UAAU,CAAC;IAC/C,IAAI,SAAS,GAAkB,IAAI,CAAC;IAEpC,SAAS,SAAS,CAAC,IAAY;QAC7B,SAAS,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACxB,4CAA4C;QAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,IAAY,EAAE,GAAsB,EAAE,EAAE;YAC5D,0DAA0D;YAC1D,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,GAAG,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,SAAS,CAAC;oBACvB,SAAS,GAAG,IAAI,CAAC;oBACjB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACf,OAAO;gBACT,CAAC;gBACD,SAAS,GAAG,IAAI,CAAC;gBACjB,yCAAyC;gBACzC,YAAY,CAAC,GAAG,EAAE;oBAChB,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACL,CAAC;YAED,4DAA4D;YAC5D,YAAY,CAAC,GAAG,EAAE;gBAChB,MAAM,IAAI,GAAI,EAAkC,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC5D,YAAY,EAAE,CAAC;gBAEf,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC9B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC/E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvB,MAAM,OAAO,GAAG,OAAO;6BACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;6BACjF,IAAI,CAAC,IAAI,CAAC,CAAC;wBACd,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,GAAG,OAAO,GAAG,aAAa,CAAC,CAAC;wBAC1D,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;oBAChC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;QAC/B,GAAG;QACH,UAAU,EAAE,GAAG,EAAE;YACf,YAAY,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,cAAc,CAAC;YAClC,cAAc,GAAG,IAAI,CAAC;YAEtB,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACjD,kDAAkD;gBAClD,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBACjB,MAAM,CAAC,KAAK,CAAC,WAAW,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjE,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,IAAI,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC9B,YAAY,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,EAAE;YACL,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;gBACjB,oBAAoB,EAAE,CAAC;gBACvB,YAAY,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;gBACnB,oBAAoB,EAAE,CAAC;gBACvB,YAAY,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClB,oBAAoB,EAAE,CAAC;gBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;YAED,cAAc,EAAE,GAAG,EAAE;gBACnB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnB,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;gBAC5B,iBAAiB,GAAG,IAAI,CAAC;gBACzB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;gBACrB,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YAED,iBAAiB,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE;gBACzC,MAAM,OAAO,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,OAAO,iBAAiB,OAAO,KAAK,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,iBAAiB,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;gBACxC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC,CAAC;gBACjD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;SACF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,YAAY,EAAE,CAAC;QACf,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const bold: (s: string) => string;
|
|
2
|
+
export declare const dim: (s: string) => string;
|
|
3
|
+
export declare const cyan: (s: string) => string;
|
|
4
|
+
export declare const green: (s: string) => string;
|
|
5
|
+
export declare const red: (s: string) => string;
|
|
6
|
+
export declare const yellow: (s: string) => string;
|
|
7
|
+
export declare const magenta: (s: string) => string;
|
|
8
|
+
export declare const gray: (s: string) => string;
|
|
9
|
+
export declare const cursorUp: (n?: number) => string;
|
|
10
|
+
export declare const cursorDown: (n?: number) => string;
|
|
11
|
+
export declare const cursorSave = "\u001B[s";
|
|
12
|
+
export declare const cursorRestore = "\u001B[u";
|
|
13
|
+
export declare const eraseLine = "\u001B[2K";
|
|
14
|
+
export declare const eraseDown = "\u001B[J";
|
|
15
|
+
export declare const cursorHide = "\u001B[?25l";
|
|
16
|
+
export declare const cursorShow = "\u001B[?25h";
|
|
17
|
+
/** Strip all ANSI escape sequences from a string. */
|
|
18
|
+
export declare function stripAnsi(s: string): string;
|
|
19
|
+
//# sourceMappingURL=ansi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi.d.ts","sourceRoot":"","sources":["../../src/utils/ansi.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,WAA0B,CAAC;AACzD,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,WAA0B,CAAC;AACxD,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,WAA2B,CAAC;AAC1D,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,WAA2B,CAAC;AAC3D,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,WAA2B,CAAC;AACzD,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,WAA2B,CAAC;AAC5D,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,WAA2B,CAAC;AAC7D,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,WAA2B,CAAC;AAG1D,eAAO,MAAM,QAAQ,GAAI,UAAK,WAAiB,CAAC;AAChD,eAAO,MAAM,UAAU,GAAI,UAAK,WAAiB,CAAC;AAClD,eAAO,MAAM,UAAU,aAAW,CAAC;AACnC,eAAO,MAAM,aAAa,aAAW,CAAC;AACtC,eAAO,MAAM,SAAS,cAAY,CAAC;AACnC,eAAO,MAAM,SAAS,aAAW,CAAC;AAClC,eAAO,MAAM,UAAU,gBAAc,CAAC;AACtC,eAAO,MAAM,UAAU,gBAAc,CAAC;AAEtC,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// ANSI escape helpers — thin wrappers, no dependencies.
|
|
2
|
+
export const bold = (s) => `\x1b[1m${s}\x1b[22m`;
|
|
3
|
+
export const dim = (s) => `\x1b[2m${s}\x1b[22m`;
|
|
4
|
+
export const cyan = (s) => `\x1b[36m${s}\x1b[39m`;
|
|
5
|
+
export const green = (s) => `\x1b[32m${s}\x1b[39m`;
|
|
6
|
+
export const red = (s) => `\x1b[31m${s}\x1b[39m`;
|
|
7
|
+
export const yellow = (s) => `\x1b[33m${s}\x1b[39m`;
|
|
8
|
+
export const magenta = (s) => `\x1b[35m${s}\x1b[39m`;
|
|
9
|
+
export const gray = (s) => `\x1b[90m${s}\x1b[39m`;
|
|
10
|
+
// Cursor helpers
|
|
11
|
+
export const cursorUp = (n = 1) => `\x1b[${n}A`;
|
|
12
|
+
export const cursorDown = (n = 1) => `\x1b[${n}B`;
|
|
13
|
+
export const cursorSave = "\x1b[s";
|
|
14
|
+
export const cursorRestore = "\x1b[u";
|
|
15
|
+
export const eraseLine = "\x1b[2K";
|
|
16
|
+
export const eraseDown = "\x1b[J";
|
|
17
|
+
export const cursorHide = "\x1b[?25l";
|
|
18
|
+
export const cursorShow = "\x1b[?25h";
|
|
19
|
+
/** Strip all ANSI escape sequences from a string. */
|
|
20
|
+
export function stripAnsi(s) {
|
|
21
|
+
// eslint-disable-next-line no-control-regex
|
|
22
|
+
return s.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "");
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ansi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi.js","sourceRoot":"","sources":["../../src/utils/ansi.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;AACzD,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;AACxD,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;AAC1D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;AAC3D,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;AACzD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;AAC7D,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;AAE1D,iBAAiB;AACjB,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;AAChD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC;AACnC,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;AACtC,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;AAEtC,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,4CAA4C;IAC5C,OAAO,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Levenshtein edit distance between two strings.
|
|
3
|
+
*/
|
|
4
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
5
|
+
/**
|
|
6
|
+
* Return candidates sorted by edit distance, filtered to maxDistance.
|
|
7
|
+
*/
|
|
8
|
+
export declare function fuzzyMatch(input: string, candidates: string[], maxDistance?: number): string[];
|
|
9
|
+
//# sourceMappingURL=fuzzy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuzzy.d.ts","sourceRoot":"","sources":["../../src/utils/fuzzy.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,WAAW,SAAI,GAAG,MAAM,EAAE,CAMzF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Levenshtein edit distance between two strings.
|
|
3
|
+
*/
|
|
4
|
+
export function levenshtein(a, b) {
|
|
5
|
+
const m = a.length;
|
|
6
|
+
const n = b.length;
|
|
7
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
8
|
+
for (let i = 0; i <= m; i++)
|
|
9
|
+
dp[i][0] = i;
|
|
10
|
+
for (let j = 0; j <= n; j++)
|
|
11
|
+
dp[0][j] = j;
|
|
12
|
+
for (let i = 1; i <= m; i++) {
|
|
13
|
+
for (let j = 1; j <= n; j++) {
|
|
14
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
15
|
+
dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return dp[m][n];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Return candidates sorted by edit distance, filtered to maxDistance.
|
|
22
|
+
*/
|
|
23
|
+
export function fuzzyMatch(input, candidates, maxDistance = 3) {
|
|
24
|
+
return candidates
|
|
25
|
+
.map((c) => ({ name: c, dist: levenshtein(input.toLowerCase(), c.toLowerCase()) }))
|
|
26
|
+
.filter((c) => c.dist <= maxDistance)
|
|
27
|
+
.sort((a, b) => a.dist - b.dist)
|
|
28
|
+
.map((c) => c.name);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=fuzzy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuzzy.js","sourceRoot":"","sources":["../../src/utils/fuzzy.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAa,CAAC,CAAC;IAE7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,UAAoB,EAAE,WAAW,GAAG,CAAC;IAC7E,OAAO,UAAU;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;SAClF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface SelectItem<T> {
|
|
2
|
+
label: string;
|
|
3
|
+
value: T;
|
|
4
|
+
description?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SelectOptions<T> {
|
|
7
|
+
items: SelectItem<T>[];
|
|
8
|
+
prompt: string;
|
|
9
|
+
pageSize?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Interactive arrow-key selector.
|
|
13
|
+
* Resolves with the selected value, or undefined if the user presses Escape.
|
|
14
|
+
*/
|
|
15
|
+
export declare function interactiveSelect<T>(opts: SelectOptions<T>): Promise<T | undefined>;
|
|
16
|
+
//# sourceMappingURL=interactive-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-select.d.ts","sourceRoot":"","sources":["../../src/utils/interactive-select.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CA+EnF"}
|