@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,197 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { execSync } from "node:child_process";
4
+ import readline from "node:readline";
5
+ import { resolveToken } from "../auth.js";
6
+ import { bold, cyan, green, dim, red, yellow } from "../utils/ansi.js";
7
+ function generateEnvFile(flags, token) {
8
+ const lines = [
9
+ `UPSTASH_BOX_API_KEY=${token}`,
10
+ `AGENT_MODEL=${flags.agentModel ?? ""}`,
11
+ `AGENT_API_KEY=${flags.agentApiKey ?? ""}`,
12
+ `RUNTIME=${flags.runtime ?? "node"}`,
13
+ `GIT_TOKEN=${flags.gitToken ?? ""}`,
14
+ ];
15
+ return lines.join("\n") + "\n";
16
+ }
17
+ function generateMainTs(dir) {
18
+ return `import "dotenv/config";
19
+ import { Box } from "@upstash/box";
20
+
21
+ async function main() {
22
+ const config: Parameters<typeof Box.create>[0] = {
23
+ apiKey: process.env.UPSTASH_BOX_API_KEY!,
24
+ };
25
+
26
+ if (process.env.RUNTIME) {
27
+ config.runtime = process.env.RUNTIME;
28
+ }
29
+
30
+ if (process.env.AGENT_MODEL && process.env.AGENT_API_KEY) {
31
+ config.agent = {
32
+ model: process.env.AGENT_MODEL,
33
+ apiKey: process.env.AGENT_API_KEY,
34
+ };
35
+ }
36
+
37
+ if (process.env.GIT_TOKEN) {
38
+ config.git = { token: process.env.GIT_TOKEN };
39
+ }
40
+
41
+ console.log("Creating box...");
42
+ const box = await Box.create(config);
43
+ console.log(\`Box created: \${box.id}\`);
44
+
45
+ try {
46
+ // Write a file
47
+ console.log("\\nWriting hello.txt...");
48
+ await box.files.write({ path: "hello.txt", content: "Hello from Upstash Box!" });
49
+ console.log("File written.");
50
+
51
+ // Read it back
52
+ console.log("\\nReading hello.txt...");
53
+ const content = await box.files.read("hello.txt");
54
+ console.log(\`Content: \${content}\`);
55
+
56
+ // Execute a command
57
+ console.log("\\nRunning: ls -la");
58
+ const run = await box.exec("ls -la");
59
+ const output = await run.result();
60
+ console.log(output);
61
+
62
+ // List files
63
+ console.log("Listing files...");
64
+ const files = await box.files.list(".");
65
+ console.log(files.map((f: { name: string }) => f.name).join(" "));
66
+
67
+ // Agent demo (if configured)
68
+ if (process.env.AGENT_MODEL && process.env.AGENT_API_KEY) {
69
+ console.log("\\nRunning agent prompt...");
70
+ const stream = box.agent.stream({
71
+ prompt: "Create a file called demo.js that prints 'Hello World'",
72
+ });
73
+ for await (const chunk of stream) {
74
+ process.stdout.write(chunk);
75
+ }
76
+ console.log();
77
+ }
78
+
79
+ // Git demo (if configured)
80
+ if (process.env.GIT_TOKEN) {
81
+ console.log("\\nGit status:");
82
+ const gitRun = await box.exec("git status");
83
+ const gitOutput = await gitRun.result();
84
+ console.log(gitOutput);
85
+ }
86
+ } finally {
87
+ // Pause so you can check logs on the Upstash console
88
+ console.log("\\nPausing box...");
89
+ await box.pause();
90
+ console.log(\`Box \${box.id} paused. You can check your logs on the Upstash console.\`);
91
+ console.log(\`\\n\\x1b[2mTo reconnect to this box:\\x1b[22m\\n\\n \\x1b[36mcd ${dir} && npx @upstash/box-cli connect \${box.id}\\x1b[39m\\n\`);
92
+ }
93
+ }
94
+
95
+ main().catch(console.error);
96
+ `;
97
+ }
98
+ function generateReadme(dir) {
99
+ return `# Box Demo
100
+
101
+ A standalone demo project for the [@upstash/box](https://www.npmjs.com/package/@upstash/box) SDK.
102
+
103
+ ## Environment Variables
104
+
105
+ Configure these in the \`.env\` file:
106
+
107
+ | Variable | Description | Required |
108
+ | ---------------------- | ------------------------------------------------ | -------- |
109
+ | \`UPSTASH_BOX_API_KEY\` | Your Upstash Box API token | Yes |
110
+ | \`AGENT_MODEL\` | Agent model identifier (e.g. \`claude/sonnet_4_5\`) | No |
111
+ | \`AGENT_API_KEY\` | API key for the agent model | No |
112
+ | \`RUNTIME\` | Runtime environment (default: \`node\`) | No |
113
+ | \`GIT_TOKEN\` | GitHub personal access token | No |
114
+
115
+ ## What the demo does
116
+
117
+ 1. Creates a new box
118
+ 2. Writes a file and reads it back
119
+ 3. Executes a shell command (\`ls -la\`)
120
+ 4. Lists files in the box
121
+ 5. (If agent configured) Runs an agent prompt with streaming
122
+ 6. (If git configured) Shows git status
123
+ 7. Pauses the box so you can check logs on the Upstash console
124
+
125
+ ## Running
126
+
127
+ \`\`\`bash
128
+ cd ${dir}
129
+ npx tsx main.ts
130
+ \`\`\`
131
+ `;
132
+ }
133
+ function askQuestion(query) {
134
+ const rl = readline.createInterface({
135
+ input: process.stdin,
136
+ output: process.stdout,
137
+ });
138
+ return new Promise((resolve) => {
139
+ rl.question(query, (answer) => {
140
+ rl.close();
141
+ resolve(answer.trim().toLowerCase());
142
+ });
143
+ });
144
+ }
145
+ export async function initDemoCommand(flags) {
146
+ const token = resolveToken(flags.token);
147
+ if (flags.agentModel && !flags.agentApiKey) {
148
+ console.error(red("Error: --agent-api-key is required if --agent-model is set"));
149
+ process.exit(1);
150
+ }
151
+ const dir = flags.directory ?? "box-demo";
152
+ const absDir = path.resolve(dir);
153
+ if (fs.existsSync(absDir)) {
154
+ console.error(red(`Error: Directory "${dir}" already exists.`));
155
+ process.exit(1);
156
+ }
157
+ // Confirmation prompt
158
+ console.log(`\nThis command will:\n`);
159
+ console.log(` ${cyan("1.")} Create a directory ${bold(cyan(dir))}`);
160
+ console.log(` ${cyan("2.")} Install ${bold("@upstash/box")} and dependencies`);
161
+ console.log(` ${cyan("3.")} Prepare an example script to showcase Upstash Box\n`);
162
+ const confirm = await askQuestion(`Proceed? ${dim("(Y/n)")} `);
163
+ if (confirm !== "" && confirm !== "y" && confirm !== "yes") {
164
+ console.log(dim("Aborted."));
165
+ return;
166
+ }
167
+ fs.mkdirSync(absDir, { recursive: true });
168
+ console.log(`\nInitializing demo project in ${cyan(dir)}/...`);
169
+ execSync('npm init -y && npm pkg set type="module"', {
170
+ cwd: absDir,
171
+ stdio: "ignore",
172
+ });
173
+ console.log(`Installing dependencies...`);
174
+ execSync("npm install @upstash/box dotenv", { cwd: absDir, stdio: "ignore" });
175
+ execSync("npm install --save-dev @types/node", {
176
+ cwd: absDir,
177
+ stdio: "ignore",
178
+ });
179
+ fs.writeFileSync(path.join(absDir, ".env"), generateEnvFile(flags, token));
180
+ fs.writeFileSync(path.join(absDir, "main.ts"), generateMainTs(dir));
181
+ fs.writeFileSync(path.join(absDir, "README.md"), generateReadme(dir));
182
+ console.log(`\n${green("Demo project created in")} ${bold(cyan(dir))}/`);
183
+ console.log(` ${cyan(".env")} ${dim("—")} environment variables`);
184
+ console.log(` ${cyan("main.ts")} ${dim("—")} demo script`);
185
+ console.log(` ${cyan("README.md")} ${dim("—")} documentation\n`);
186
+ console.log(`See ${cyan("README.md")} for details on configuration and usage.\n`);
187
+ const answer = await askQuestion(`Run the demo now? ${dim("(Y/n)")} `);
188
+ if (answer === "" || answer === "y" || answer === "yes") {
189
+ console.log(yellow("\nRunning demo...\n"));
190
+ execSync("npx tsx main.ts", { cwd: absDir, stdio: "inherit" });
191
+ }
192
+ else {
193
+ console.log(`\nTo run later:\n ${cyan(`cd ${dir} && npx tsx main.ts`)}`);
194
+ }
195
+ }
196
+ export { generateEnvFile, generateMainTs, generateReadme };
197
+ //# sourceMappingURL=init-demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-demo.js","sourceRoot":"","sources":["../../src/commands/init-demo.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  interface ListFlags {
2
- token?: string;
2
+ token?: string;
3
3
  }
4
4
  export declare function listCommand(flags: ListFlags): Promise<void>;
5
5
  export {};
6
- //# sourceMappingURL=list.d.ts.map
6
+ //# sourceMappingURL=list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBjE"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBjE"}
@@ -1,19 +1,19 @@
1
1
  import { Box } from "@upstash/box";
2
2
  import { resolveToken } from "../auth.js";
3
3
  export async function listCommand(flags) {
4
- const apiKey = resolveToken(flags.token);
5
- const boxes = await Box.list({ apiKey });
6
- if (boxes.length === 0) {
7
- console.log("No boxes found.");
8
- return;
9
- }
10
- const headers = ["ID", "STATUS", "MODEL", "CREATED"];
11
- const rows = boxes.map((b) => [b.id, b.status, b.model ?? "", String(b.created_at)]);
12
- const colWidths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
13
- const formatRow = (row) => row.map((val, i) => val.padEnd(colWidths[i])).join(" ");
14
- console.log(formatRow(headers));
15
- for (const row of rows) {
16
- console.log(formatRow(row));
17
- }
4
+ const apiKey = resolveToken(flags.token);
5
+ const boxes = await Box.list({ apiKey });
6
+ if (boxes.length === 0) {
7
+ console.log("No boxes found.");
8
+ return;
9
+ }
10
+ const headers = ["ID", "STATUS", "MODEL", "CREATED"];
11
+ const rows = boxes.map((b) => [b.id, b.status, b.model ?? "", String(b.created_at)]);
12
+ const colWidths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
13
+ const formatRow = (row) => row.map((val, i) => val.padEnd(colWidths[i])).join(" ");
14
+ console.log(formatRow(headers));
15
+ for (const row of rows) {
16
+ console.log(formatRow(row));
17
+ }
18
18
  }
19
- //# sourceMappingURL=list.js.map
19
+ //# sourceMappingURL=list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAgB;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAErF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CACrD,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,GAAa,EAAE,EAAE,CAClC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAgB;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAErF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE9F,MAAM,SAAS,GAAG,CAAC,GAAa,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/F,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  import "dotenv/config";
3
- //# sourceMappingURL=index.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -6,45 +6,61 @@ import { connectCommand } from "./commands/connect.js";
6
6
  import { fromSnapshotCommand } from "./commands/from-snapshot.js";
7
7
  import { listCommand } from "./commands/list.js";
8
8
  import { getCommand } from "./commands/get.js";
9
+ import { initDemoCommand } from "./commands/init-demo.js";
10
+ import { completionCommand } from "./commands/completion.js";
9
11
  const program = new Command();
10
12
  program
11
- .name("box")
12
- .description("CLI for Upstash Box — REPL-first interface for AI coding agents")
13
- .version("0.1.0");
14
- program
15
- .command("create")
16
- .description("Create a new box and enter the REPL")
17
- .option("--token <token>", "Upstash Box API token")
18
- .option("--runtime <runtime>", "Runtime environment (node, python, golang, ruby, rust)")
19
- .option("--agent-model <model>", "Agent model identifier")
20
- .option("--agent-api-key <key>", "Agent API key (Anthropic or OpenAI)")
21
- .option("--git-token <token>", "GitHub personal access token")
22
- .option("--env <KEY=VAL>", "Environment variable (repeatable)", (val, prev) => [...prev, val], [])
23
- .action((opts) => createCommand(opts));
24
- program
25
- .command("connect [box-id]")
26
- .description("Connect to an existing box (or most recent) and enter the REPL")
27
- .option("--token <token>", "Upstash Box API token")
28
- .action((boxId, opts) => connectCommand(boxId, opts));
29
- program
30
- .command("from-snapshot <snapshot-id>")
31
- .description("Create a new box from a snapshot and enter the REPL")
32
- .option("--token <token>", "Upstash Box API token")
33
- .option("--runtime <runtime>", "Runtime environment")
34
- .option("--agent-model <model>", "Agent model identifier")
35
- .option("--agent-api-key <key>", "Agent API key")
36
- .option("--git-token <token>", "GitHub personal access token")
37
- .option("--env <KEY=VAL>", "Environment variable (repeatable)", (val, prev) => [...prev, val], [])
38
- .action((snapshotId, opts) => fromSnapshotCommand(snapshotId, opts));
39
- program
40
- .command("list")
41
- .description("List all boxes")
42
- .option("--token <token>", "Upstash Box API token")
43
- .action((opts) => listCommand(opts));
44
- program
45
- .command("get <box-id>")
46
- .description("Get details about a box")
47
- .option("--token <token>", "Upstash Box API token")
48
- .action((boxId, opts) => getCommand(boxId, opts));
13
+ .name("box")
14
+ .description("CLI for Upstash Box — REPL-first interface for AI coding agents")
15
+ .version("0.1.0");
16
+ program
17
+ .command("create")
18
+ .description("Create a new box and enter the REPL")
19
+ .option("--token <token>", "Upstash Box API token")
20
+ .option("--runtime <runtime>", "Runtime environment (node, python, golang, ruby, rust)")
21
+ .option("--agent-model <model>", "Agent model identifier")
22
+ .option("--agent-api-key <key>", "Agent API key (Anthropic or OpenAI)")
23
+ .option("--git-token <token>", "GitHub personal access token")
24
+ .option("--env <KEY=VAL>", "Environment variable (repeatable)", (val, prev) => [...prev, val], [])
25
+ .action((opts) => createCommand(opts));
26
+ program
27
+ .command("connect [box-id]")
28
+ .description("Connect to an existing box (or most recent) and enter the REPL")
29
+ .option("--token <token>", "Upstash Box API token")
30
+ .action((boxId, opts) => connectCommand(boxId, opts));
31
+ program
32
+ .command("from-snapshot <snapshot-id>")
33
+ .description("Create a new box from a snapshot and enter the REPL")
34
+ .option("--token <token>", "Upstash Box API token")
35
+ .option("--runtime <runtime>", "Runtime environment")
36
+ .option("--agent-model <model>", "Agent model identifier")
37
+ .option("--agent-api-key <key>", "Agent API key")
38
+ .option("--git-token <token>", "GitHub personal access token")
39
+ .option("--env <KEY=VAL>", "Environment variable (repeatable)", (val, prev) => [...prev, val], [])
40
+ .action((snapshotId, opts) => fromSnapshotCommand(snapshotId, opts));
41
+ program
42
+ .command("list")
43
+ .description("List all boxes")
44
+ .option("--token <token>", "Upstash Box API token")
45
+ .action((opts) => listCommand(opts));
46
+ program
47
+ .command("get <box-id>")
48
+ .description("Get details about a box")
49
+ .option("--token <token>", "Upstash Box API token")
50
+ .action((boxId, opts) => getCommand(boxId, opts));
51
+ program
52
+ .command("init-demo")
53
+ .description("Scaffold a standalone demo project for @upstash/box")
54
+ .option("--token <token>", "Upstash Box API token")
55
+ .option("--agent-model <model>", "Agent model identifier")
56
+ .option("--agent-api-key <key>", "Agent API key (required if --agent-model is set)")
57
+ .option("--runtime <runtime>", "Runtime environment", "node")
58
+ .option("--git-token <token>", "GitHub personal access token")
59
+ .option("--directory <dir>", "Output directory", "box-demo")
60
+ .action((opts) => initDemoCommand(opts));
61
+ program
62
+ .command("completion")
63
+ .description('Output shell completion script (eval "$(box completion)")')
64
+ .action(() => completionCommand());
49
65
  program.parse();
50
- //# sourceMappingURL=index.js.map
66
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,wDAAwD,CAAC;KACvF,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;KACzD,MAAM,CAAC,uBAAuB,EAAE,qCAAqC,CAAC;KACtE,MAAM,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;KAC7D,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,EAAc,CAAC;KAC/H,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAEzC,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAExD,OAAO;KACJ,OAAO,CAAC,6BAA6B,CAAC;KACtC,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;KACzD,MAAM,CAAC,uBAAuB,EAAE,eAAe,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;KAC7D,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,EAAc,CAAC;KAC/H,MAAM,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvE,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAEvC,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAEpD,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/output.d.ts CHANGED
@@ -6,4 +6,4 @@ export declare function formatJSON(data: unknown): string;
6
6
  * Format raw text for display.
7
7
  */
8
8
  export declare function formatRaw(text: string): string;
9
- //# sourceMappingURL=output.d.ts.map
9
+ //# sourceMappingURL=output.d.ts.map
package/dist/output.js CHANGED
@@ -2,12 +2,12 @@
2
2
  * Format data as JSON for display.
3
3
  */
4
4
  export function formatJSON(data) {
5
- return JSON.stringify(data, null, 2);
5
+ return JSON.stringify(data, null, 2);
6
6
  }
7
7
  /**
8
8
  * Format raw text for display.
9
9
  */
10
10
  export function formatRaw(text) {
11
- return text;
11
+ return text;
12
12
  }
13
- //# sourceMappingURL=output.js.map
13
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1,30 @@
1
+ import type { Box } from "@upstash/box";
2
+ export type REPLHooks = {
3
+ onLog: (message: string) => void;
4
+ onError: (message: string) => void;
5
+ onStream: (message: string) => void;
6
+ /** Loading indicator. Return a stop() function. */
7
+ onLoadingStart?: () => () => void;
8
+ /** Post-command suggestion (e.g. "try: /snapshot"). */
9
+ onSuggestion?: (text: string) => void;
10
+ /** Timing info after each command. */
11
+ onCommandComplete?: (command: string, durationMs: number) => void;
12
+ /** Unknown /command with fuzzy suggestions. Falls back to onError if absent. */
13
+ onCommandNotFound?: (typed: string, suggestions: string[]) => void;
14
+ };
15
+ /** All available command names (without / prefix). */
16
+ export declare const COMMAND_NAMES: string[];
17
+ /** Command descriptions for completer/preview. */
18
+ export declare const COMMAND_DESCRIPTIONS: Record<string, string>;
19
+ export declare class BoxREPLClient {
20
+ readonly box: Box;
21
+ readonly promptUser: (prompt: string) => Promise<string>;
22
+ private readonly hooks;
23
+ constructor({ box, promptUser, hooks, }: {
24
+ box: Box;
25
+ promptUser: (prompt: string) => Promise<string>;
26
+ hooks: REPLHooks;
27
+ });
28
+ startLoop(): Promise<void>;
29
+ }
30
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/repl/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAUxC,MAAM,MAAM,SAAS,GAAG;IAEtB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAIpC,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,MAAM,IAAI,CAAC;IAElC,uDAAuD;IACvD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEtC,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAElE,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACpE,CAAC;AAeF,sDAAsD;AACtD,eAAO,MAAM,aAAa,UAAwB,CAAC;AAEnD,kDAAkD;AAClD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQvD,CAAC;AAoBF,qBAAa,aAAa;IACxB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,EACV,GAAG,EACH,UAAU,EACV,KAAK,GACN,EAAE;QACD,GAAG,EAAE,GAAG,CAAC;QACT,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,EAAE,SAAS,CAAC;KAClB;IAMK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAuEjC"}
@@ -0,0 +1,128 @@
1
+ import { handleRun } from "./commands/run.js";
2
+ import { handleExec } from "./commands/exec.js";
3
+ import { handleFiles } from "./commands/files.js";
4
+ import { handleGit } from "./commands/git.js";
5
+ import { handleSnapshot } from "./commands/snapshot.js";
6
+ import { handlePause } from "./commands/pause.js";
7
+ import { handleDelete } from "./commands/delete.js";
8
+ import { fuzzyMatch } from "../utils/fuzzy.js";
9
+ const COMMANDS = {
10
+ run: handleRun,
11
+ exec: handleExec,
12
+ files: handleFiles,
13
+ git: handleGit,
14
+ snapshot: handleSnapshot,
15
+ pause: handlePause,
16
+ delete: handleDelete,
17
+ };
18
+ /** All available command names (without / prefix). */
19
+ export const COMMAND_NAMES = Object.keys(COMMANDS);
20
+ /** Command descriptions for completer/preview. */
21
+ export const COMMAND_DESCRIPTIONS = {
22
+ run: "Run the agent with a prompt",
23
+ exec: "Execute a shell command",
24
+ files: "File operations (read, write, list, upload, download)",
25
+ git: "Git operations (clone, diff, create-pr)",
26
+ snapshot: "Create a snapshot of the current box",
27
+ pause: "Pause the box and exit",
28
+ delete: "Delete the box and exit",
29
+ };
30
+ /** Context-aware suggestion after a command completes. */
31
+ function getSuggestion(cmdName) {
32
+ switch (cmdName) {
33
+ case "exec":
34
+ return "/files list .";
35
+ case "run":
36
+ return "/snapshot";
37
+ case "files":
38
+ return "/exec ls";
39
+ case "git":
40
+ return "/snapshot";
41
+ case "snapshot":
42
+ return "/pause";
43
+ default:
44
+ return undefined;
45
+ }
46
+ }
47
+ export class BoxREPLClient {
48
+ box;
49
+ promptUser;
50
+ hooks;
51
+ constructor({ box, promptUser, hooks, }) {
52
+ this.box = box;
53
+ this.promptUser = promptUser;
54
+ this.hooks = hooks;
55
+ }
56
+ async startLoop() {
57
+ const { hooks } = this;
58
+ hooks.onLog(`\nConnected to box ${this.box.id}`);
59
+ hooks.onLog(`Type a prompt to run the agent, or use commands: ${COMMAND_NAMES.map((c) => `/${c}`).join(", ")}, /exit\n`);
60
+ while (true) {
61
+ const input = await this.promptUser(`${this.box.id}> `);
62
+ const trimmed = input.trim();
63
+ if (!trimmed)
64
+ continue;
65
+ if (trimmed === "exit" || trimmed === "/exit") {
66
+ hooks.onLog("Goodbye.");
67
+ break;
68
+ }
69
+ // Commands require / prefix
70
+ if (trimmed.startsWith("/")) {
71
+ const withoutSlash = trimmed.slice(1);
72
+ const spaceIdx = withoutSlash.indexOf(" ");
73
+ const cmdName = spaceIdx === -1 ? withoutSlash : withoutSlash.slice(0, spaceIdx);
74
+ const args = spaceIdx === -1 ? "" : withoutSlash.slice(spaceIdx + 1).trim();
75
+ const handler = COMMANDS[cmdName];
76
+ if (handler) {
77
+ const start = Date.now();
78
+ const stopLoading = hooks.onLoadingStart?.();
79
+ try {
80
+ const shouldExit = await handler(this.box, args, hooks);
81
+ stopLoading?.();
82
+ const durationMs = Date.now() - start;
83
+ hooks.onCommandComplete?.(cmdName, durationMs);
84
+ const suggestion = getSuggestion(cmdName);
85
+ if (suggestion)
86
+ hooks.onSuggestion?.(suggestion);
87
+ if (shouldExit === true)
88
+ break;
89
+ }
90
+ catch (err) {
91
+ stopLoading?.();
92
+ hooks.onError(`Error: ${err instanceof Error ? err.message : err}`);
93
+ }
94
+ }
95
+ else {
96
+ // Unknown command — fuzzy match
97
+ const suggestions = fuzzyMatch(cmdName, COMMAND_NAMES);
98
+ if (hooks.onCommandNotFound) {
99
+ hooks.onCommandNotFound(cmdName, suggestions);
100
+ }
101
+ else {
102
+ const msg = suggestions.length > 0
103
+ ? `Unknown command: /${cmdName}. Did you mean: ${suggestions.map((s) => `/${s}`).join(", ")}?`
104
+ : `Unknown command: /${cmdName}. Available: ${COMMAND_NAMES.map((c) => `/${c}`).join(", ")}`;
105
+ hooks.onError(msg);
106
+ }
107
+ }
108
+ }
109
+ else {
110
+ // No / prefix — treat as agent prompt
111
+ const start = Date.now();
112
+ const stopLoading = hooks.onLoadingStart?.();
113
+ try {
114
+ await handleRun(this.box, trimmed, hooks);
115
+ stopLoading?.();
116
+ const durationMs = Date.now() - start;
117
+ hooks.onCommandComplete?.("run", durationMs);
118
+ hooks.onSuggestion?.("/snapshot");
119
+ }
120
+ catch (err) {
121
+ stopLoading?.();
122
+ hooks.onError(`Error: ${err instanceof Error ? err.message : err}`);
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/repl/client.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
+ * Delete the box. Returns true to signal the REPL to exit.
5
+ */
6
+ export declare function handleDelete(box: Box, _args: string, hooks: REPLHooks): Promise<boolean>;
7
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/delete.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,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAI9F"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Delete the box. Returns true to signal the REPL to exit.
3
+ */
4
+ export async function handleDelete(box, _args, hooks) {
5
+ await box.delete();
6
+ hooks.onLog(`Box ${box.id} deleted.`);
7
+ return true;
8
+ }
9
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/repl/commands/delete.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAQ,EAAE,KAAa,EAAE,KAAgB;IAC1E,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;IACtC,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
+ * Execute a shell command in the box.
5
+ */
6
+ export declare function handleExec(box: Box, command: string, hooks: REPLHooks): Promise<void>;
7
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/exec.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,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ3F"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Execute a shell command in the box.
3
+ */
4
+ export async function handleExec(box, command, hooks) {
5
+ if (!command) {
6
+ hooks.onLog("Usage: exec <command>");
7
+ return;
8
+ }
9
+ const run = await box.exec(command);
10
+ const result = await run.result();
11
+ if (result)
12
+ hooks.onLog(result);
13
+ }
14
+ //# sourceMappingURL=exec.js.map