@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.
Files changed (121) hide show
  1. package/README.md +29 -0
  2. package/dist/auth.d.ts +1 -1
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +7 -9
  5. package/dist/auth.js.map +1 -1
  6. package/dist/commands/completion.d.ts +2 -0
  7. package/dist/commands/completion.d.ts.map +1 -0
  8. package/dist/commands/completion.js +37 -0
  9. package/dist/commands/completion.js.map +1 -0
  10. package/dist/commands/connect.d.ts +3 -6
  11. package/dist/commands/connect.d.ts.map +1 -1
  12. package/dist/commands/connect.js +39 -16
  13. package/dist/commands/connect.js.map +1 -1
  14. package/dist/commands/create.d.ts +7 -7
  15. package/dist/commands/create.d.ts.map +1 -1
  16. package/dist/commands/create.js +27 -28
  17. package/dist/commands/create.js.map +1 -1
  18. package/dist/commands/from-snapshot.d.ts +8 -11
  19. package/dist/commands/from-snapshot.d.ts.map +1 -1
  20. package/dist/commands/from-snapshot.js +27 -28
  21. package/dist/commands/from-snapshot.js.map +1 -1
  22. package/dist/commands/get.d.ts +2 -2
  23. package/dist/commands/get.js +4 -4
  24. package/dist/commands/init-demo.d.ts +15 -0
  25. package/dist/commands/init-demo.d.ts.map +1 -0
  26. package/dist/commands/init-demo.js +197 -0
  27. package/dist/commands/init-demo.js.map +1 -0
  28. package/dist/commands/list.d.ts +2 -2
  29. package/dist/commands/list.d.ts.map +1 -1
  30. package/dist/commands/list.js +15 -15
  31. package/dist/commands/list.js.map +1 -1
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.js +55 -39
  34. package/dist/index.js.map +1 -1
  35. package/dist/output.d.ts +1 -1
  36. package/dist/output.js +3 -3
  37. package/dist/repl/client.d.ts +30 -0
  38. package/dist/repl/client.d.ts.map +1 -0
  39. package/dist/repl/client.js +128 -0
  40. package/dist/repl/client.js.map +1 -0
  41. package/dist/repl/commands/delete.d.ts +7 -0
  42. package/dist/repl/commands/delete.d.ts.map +1 -0
  43. package/dist/repl/commands/delete.js +9 -0
  44. package/dist/repl/commands/delete.js.map +1 -0
  45. package/dist/repl/commands/exec.d.ts +7 -0
  46. package/dist/repl/commands/exec.d.ts.map +1 -0
  47. package/dist/repl/commands/exec.js +14 -0
  48. package/dist/repl/commands/exec.js.map +1 -0
  49. package/dist/repl/commands/files.d.ts +7 -0
  50. package/dist/repl/commands/files.d.ts.map +1 -0
  51. package/dist/repl/commands/files.js +59 -0
  52. package/dist/repl/commands/files.js.map +1 -0
  53. package/dist/repl/commands/git.d.ts +7 -0
  54. package/dist/repl/commands/git.d.ts.map +1 -0
  55. package/dist/repl/commands/git.js +38 -0
  56. package/dist/repl/commands/git.js.map +1 -0
  57. package/dist/repl/commands/pause.d.ts +7 -0
  58. package/dist/repl/commands/pause.d.ts.map +1 -0
  59. package/dist/repl/commands/pause.js +9 -0
  60. package/dist/repl/commands/pause.js.map +1 -0
  61. package/dist/repl/commands/run.d.ts +7 -0
  62. package/dist/repl/commands/run.d.ts.map +1 -0
  63. package/dist/repl/commands/run.js +14 -0
  64. package/dist/repl/commands/run.js.map +1 -0
  65. package/dist/repl/commands/snapshot.d.ts +7 -0
  66. package/dist/repl/commands/snapshot.d.ts.map +1 -0
  67. package/dist/repl/commands/snapshot.js +9 -0
  68. package/dist/repl/commands/snapshot.js.map +1 -0
  69. package/dist/repl/spinner.d.ts +5 -0
  70. package/dist/repl/spinner.d.ts.map +1 -0
  71. package/dist/repl/spinner.js +39 -0
  72. package/dist/repl/spinner.js.map +1 -0
  73. package/dist/repl/terminal.d.ts +6 -0
  74. package/dist/repl/terminal.d.ts.map +1 -0
  75. package/dist/repl/terminal.js +141 -0
  76. package/dist/repl/terminal.js.map +1 -0
  77. package/dist/utils/ansi.d.ts +19 -0
  78. package/dist/utils/ansi.d.ts.map +1 -0
  79. package/dist/utils/ansi.js +24 -0
  80. package/dist/utils/ansi.js.map +1 -0
  81. package/dist/utils/fuzzy.d.ts +9 -0
  82. package/dist/utils/fuzzy.d.ts.map +1 -0
  83. package/dist/utils/fuzzy.js +30 -0
  84. package/dist/utils/fuzzy.js.map +1 -0
  85. package/dist/utils/interactive-select.d.ts +16 -0
  86. package/dist/utils/interactive-select.d.ts.map +1 -0
  87. package/dist/utils/interactive-select.js +75 -0
  88. package/dist/utils/interactive-select.js.map +1 -0
  89. package/package.json +12 -4
  90. package/dist/repl-commands/delete.d.ts +0 -6
  91. package/dist/repl-commands/delete.d.ts.map +0 -1
  92. package/dist/repl-commands/delete.js +0 -9
  93. package/dist/repl-commands/delete.js.map +0 -1
  94. package/dist/repl-commands/exec.d.ts +0 -6
  95. package/dist/repl-commands/exec.d.ts.map +0 -1
  96. package/dist/repl-commands/exec.js +0 -13
  97. package/dist/repl-commands/exec.js.map +0 -1
  98. package/dist/repl-commands/files.d.ts +0 -6
  99. package/dist/repl-commands/files.d.ts.map +0 -1
  100. package/dist/repl-commands/files.js +0 -59
  101. package/dist/repl-commands/files.js.map +0 -1
  102. package/dist/repl-commands/git.d.ts +0 -6
  103. package/dist/repl-commands/git.d.ts.map +0 -1
  104. package/dist/repl-commands/git.js +0 -38
  105. package/dist/repl-commands/git.js.map +0 -1
  106. package/dist/repl-commands/run.d.ts +0 -6
  107. package/dist/repl-commands/run.d.ts.map +0 -1
  108. package/dist/repl-commands/run.js +0 -14
  109. package/dist/repl-commands/run.js.map +0 -1
  110. package/dist/repl-commands/snapshot.d.ts +0 -6
  111. package/dist/repl-commands/snapshot.d.ts.map +0 -1
  112. package/dist/repl-commands/snapshot.js +0 -9
  113. package/dist/repl-commands/snapshot.js.map +0 -1
  114. package/dist/repl-commands/stop.d.ts +0 -6
  115. package/dist/repl-commands/stop.d.ts.map +0 -1
  116. package/dist/repl-commands/stop.js +0 -9
  117. package/dist/repl-commands/stop.js.map +0 -1
  118. package/dist/repl.d.ts +0 -6
  119. package/dist/repl.d.ts.map +0 -1
  120. package/dist/repl.js +0 -64
  121. 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,9 @@
1
+ /**
2
+ * Pause the box. Returns true to signal the REPL to exit.
3
+ */
4
+ export async function handlePause(box, _args, hooks) {
5
+ await box.pause();
6
+ hooks.onLog(`Box ${box.id} paused.`);
7
+ return true;
8
+ }
9
+ //# sourceMappingURL=pause.js.map
@@ -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,5 @@
1
+ /**
2
+ * Start a terminal spinner. Returns a stop() function.
3
+ */
4
+ export declare function startSpinner(): () => void;
5
+ //# sourceMappingURL=spinner.d.ts.map
@@ -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,6 @@
1
+ import type { Box } from "@upstash/box";
2
+ /**
3
+ * Start an interactive REPL session for the given box (CLI entry point).
4
+ */
5
+ export declare function startRepl(box: Box): Promise<void>;
6
+ //# sourceMappingURL=terminal.d.ts.map
@@ -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":"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"}
@@ -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"}