@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,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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"}
|
package/dist/commands/list.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/commands/list.js
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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,
|
|
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
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
program
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
program
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
program
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
program
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
program
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
CHANGED
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
|
-
|
|
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
|
-
|
|
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 @@
|
|
|
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
|