@upstash/box-cli 0.1.10 → 0.1.13
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 +25 -20
- package/dist/agent-key.d.ts +10 -0
- package/dist/agent-key.d.ts.map +1 -0
- package/dist/agent-key.js +18 -0
- package/dist/agent-key.js.map +1 -0
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +13 -5
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/create-wizard.d.ts +3 -0
- package/dist/commands/create-wizard.d.ts.map +1 -0
- package/dist/commands/create-wizard.js +170 -0
- package/dist/commands/create-wizard.js.map +1 -0
- package/dist/commands/create.d.ts +2 -3
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +18 -6
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/from-snapshot.d.ts +1 -1
- package/dist/commands/from-snapshot.d.ts.map +1 -1
- package/dist/commands/from-snapshot.js +3 -6
- package/dist/commands/from-snapshot.js.map +1 -1
- package/dist/commands/init-demo.d.ts +1 -1
- package/dist/commands/init-demo.d.ts.map +1 -1
- package/dist/commands/init-demo.js +8 -10
- package/dist/commands/init-demo.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +18 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/repl/client.d.ts +8 -3
- package/dist/repl/client.d.ts.map +1 -1
- package/dist/repl/client.js +30 -11
- package/dist/repl/client.js.map +1 -1
- package/dist/repl/commands/code.d.ts +12 -0
- package/dist/repl/commands/code.d.ts.map +1 -0
- package/dist/repl/commands/code.js +45 -0
- package/dist/repl/commands/code.js.map +1 -0
- package/dist/repl/commands/command.d.ts +7 -0
- package/dist/repl/commands/command.d.ts.map +1 -0
- package/dist/repl/commands/command.js +14 -0
- package/dist/repl/commands/command.js.map +1 -0
- package/dist/repl/commands/run.d.ts +9 -1
- package/dist/repl/commands/run.d.ts.map +1 -1
- package/dist/repl/commands/run.js +67 -0
- package/dist/repl/commands/run.js.map +1 -1
- package/dist/repl/terminal.d.ts +2 -1
- package/dist/repl/terminal.d.ts.map +1 -1
- package/dist/repl/terminal.js +123 -14
- package/dist/repl/terminal.js.map +1 -1
- package/dist/repl/types.d.ts +26 -1
- package/dist/repl/types.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/repl/terminal.js
CHANGED
|
@@ -3,26 +3,42 @@ import { createInterface } from "node:readline/promises";
|
|
|
3
3
|
import { stdin, stdout } from "node:process";
|
|
4
4
|
import { BoxREPLClient } from "./client.js";
|
|
5
5
|
import { startSpinner } from "./spinner.js";
|
|
6
|
-
import { bold, cyan, dim, green, red, yellow, cursorUp,
|
|
6
|
+
import { bold, cyan, dim, green, red, yellow, cursorUp, eraseDown, stripAnsi, } from "../utils/ansi.js";
|
|
7
7
|
/**
|
|
8
8
|
* Start an interactive REPL session for the given box (CLI entry point).
|
|
9
9
|
*/
|
|
10
|
-
export async function startRepl(box) {
|
|
10
|
+
export async function startRepl(box, options) {
|
|
11
11
|
const rl = createInterface({
|
|
12
12
|
input: stdin,
|
|
13
13
|
output: stdout,
|
|
14
14
|
completer: () => [[], ""],
|
|
15
15
|
});
|
|
16
16
|
const prompt = `${bold(cyan(box.id))}${dim(">")} `;
|
|
17
|
-
const client = new BoxREPLClient(box);
|
|
17
|
+
const client = new BoxREPLClient(box, options);
|
|
18
18
|
// --- Spinner tracking ---
|
|
19
19
|
let activeSpinnerStop = null;
|
|
20
|
+
let inCommand = false;
|
|
21
|
+
// --- Todo checklist tracking ---
|
|
22
|
+
let todoLines = 0;
|
|
23
|
+
// --- Stream newline tracking ---
|
|
24
|
+
let needsNewline = false;
|
|
20
25
|
function ensureSpinnerStopped() {
|
|
21
26
|
if (activeSpinnerStop) {
|
|
22
27
|
activeSpinnerStop();
|
|
23
28
|
activeSpinnerStop = null;
|
|
24
29
|
}
|
|
25
30
|
}
|
|
31
|
+
function ensureNewline() {
|
|
32
|
+
if (needsNewline) {
|
|
33
|
+
stdout.write("\n");
|
|
34
|
+
needsNewline = false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function restartSpinnerIfInCommand() {
|
|
38
|
+
if (inCommand) {
|
|
39
|
+
activeSpinnerStop = startSpinner();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
26
42
|
// --- Command preview while typing ---
|
|
27
43
|
let previewLines = 0;
|
|
28
44
|
const promptVisualLen = stripAnsi(prompt).length;
|
|
@@ -42,7 +58,7 @@ export async function startRepl(box) {
|
|
|
42
58
|
}
|
|
43
59
|
}
|
|
44
60
|
// --- Ghost suggestion in input ---
|
|
45
|
-
let nextSuggestion = "/
|
|
61
|
+
let nextSuggestion = "/command ls";
|
|
46
62
|
let ghostText = null;
|
|
47
63
|
function showGhost(text) {
|
|
48
64
|
ghostText = text;
|
|
@@ -50,11 +66,16 @@ export async function startRepl(box) {
|
|
|
50
66
|
// Move cursor back to just after the prompt
|
|
51
67
|
stdout.write(`\x1b[${text.length}D`);
|
|
52
68
|
}
|
|
69
|
+
// --- Multi-line input tracking ---
|
|
70
|
+
let isMetaReturn = false;
|
|
53
71
|
if (stdin.isTTY) {
|
|
54
72
|
// Must run before readline's handler so the cursor is still on the input line
|
|
55
73
|
stdin.prependListener("keypress", (_str, key) => {
|
|
56
74
|
if (key?.name === "return") {
|
|
57
75
|
clearPreview();
|
|
76
|
+
if (key.meta || key.shift) {
|
|
77
|
+
isMetaReturn = true;
|
|
78
|
+
}
|
|
58
79
|
}
|
|
59
80
|
});
|
|
60
81
|
stdin.on("keypress", (_str, key) => {
|
|
@@ -79,7 +100,7 @@ export async function startRepl(box) {
|
|
|
79
100
|
clearPreview();
|
|
80
101
|
if (line.startsWith("/") && !line.includes(" ")) {
|
|
81
102
|
const partial = line.slice(1);
|
|
82
|
-
const matches =
|
|
103
|
+
const matches = client.suggestCommands(partial).slice(0, 5);
|
|
83
104
|
if (matches.length > 0) {
|
|
84
105
|
const preview = matches
|
|
85
106
|
.map((c) => ` ${dim(`/${c.name}`)} ${dim("—")} ${dim(c.description)}`)
|
|
@@ -96,24 +117,82 @@ export async function startRepl(box) {
|
|
|
96
117
|
function processEvent(event) {
|
|
97
118
|
switch (event.type) {
|
|
98
119
|
case "command:start":
|
|
120
|
+
inCommand = true;
|
|
99
121
|
stdout.write("\n");
|
|
100
122
|
activeSpinnerStop = startSpinner();
|
|
101
123
|
break;
|
|
102
124
|
case "log":
|
|
103
125
|
ensureSpinnerStopped();
|
|
126
|
+
ensureNewline();
|
|
104
127
|
clearPreview();
|
|
105
128
|
console.log(event.message);
|
|
129
|
+
needsNewline = false;
|
|
130
|
+
todoLines = 0;
|
|
131
|
+
restartSpinnerIfInCommand();
|
|
106
132
|
break;
|
|
107
133
|
case "error":
|
|
108
134
|
ensureSpinnerStopped();
|
|
135
|
+
ensureNewline();
|
|
109
136
|
clearPreview();
|
|
110
137
|
console.error(red(event.message));
|
|
138
|
+
needsNewline = false;
|
|
139
|
+
todoLines = 0;
|
|
140
|
+
restartSpinnerIfInCommand();
|
|
111
141
|
break;
|
|
112
142
|
case "stream":
|
|
113
143
|
ensureSpinnerStopped();
|
|
114
144
|
process.stdout.write(event.text);
|
|
145
|
+
needsNewline = !event.text.endsWith("\n");
|
|
146
|
+
todoLines = 0;
|
|
147
|
+
break;
|
|
148
|
+
case "tool": {
|
|
149
|
+
ensureSpinnerStopped();
|
|
150
|
+
ensureNewline();
|
|
151
|
+
const { name, summary, detail } = event.tool;
|
|
152
|
+
if (name === "Bash") {
|
|
153
|
+
let line = dim(" ⚡ ") + yellow(name) + dim(": " + summary);
|
|
154
|
+
if (detail) {
|
|
155
|
+
line += dim("\n $ " + detail);
|
|
156
|
+
}
|
|
157
|
+
console.log(line);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
console.log(dim(" ⚡ ") + yellow(name) + dim("(" + summary + ")"));
|
|
161
|
+
}
|
|
162
|
+
needsNewline = false;
|
|
163
|
+
todoLines = 0;
|
|
164
|
+
restartSpinnerIfInCommand();
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
case "todo": {
|
|
168
|
+
ensureSpinnerStopped();
|
|
169
|
+
ensureNewline();
|
|
170
|
+
if (todoLines > 0) {
|
|
171
|
+
stdout.write(cursorUp(todoLines) + eraseDown);
|
|
172
|
+
}
|
|
173
|
+
for (const item of event.todos) {
|
|
174
|
+
if (item.status === "completed") {
|
|
175
|
+
console.log(green(" ✔") + " " + item.content);
|
|
176
|
+
}
|
|
177
|
+
else if (item.status === "in_progress") {
|
|
178
|
+
console.log(cyan(" ◼") + " " + item.content);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.log(dim(" ◻ " + item.content));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
stdout.write("\n"); // bottom margin
|
|
185
|
+
todoLines = event.todos.length + 1; // items + bottom margin
|
|
186
|
+
needsNewline = false;
|
|
187
|
+
restartSpinnerIfInCommand();
|
|
115
188
|
break;
|
|
189
|
+
}
|
|
116
190
|
case "command:complete": {
|
|
191
|
+
inCommand = false;
|
|
192
|
+
ensureSpinnerStopped();
|
|
193
|
+
ensureNewline();
|
|
194
|
+
todoLines = 0;
|
|
195
|
+
needsNewline = false;
|
|
117
196
|
const seconds = (event.durationMs / 1000).toFixed(1);
|
|
118
197
|
console.log(dim(`\n /${event.command} completed in ${seconds}s\n`));
|
|
119
198
|
break;
|
|
@@ -122,11 +201,15 @@ export async function startRepl(box) {
|
|
|
122
201
|
nextSuggestion = event.text;
|
|
123
202
|
break;
|
|
124
203
|
case "command:not-found":
|
|
204
|
+
ensureNewline();
|
|
125
205
|
console.error(yellow(`\nUnknown command: /${event.typed}`));
|
|
126
206
|
if (event.suggestions.length > 0) {
|
|
127
207
|
console.log(yellow(`Did you mean: ${event.suggestions.map((s) => `/${s}`).join(", ")}?\n`));
|
|
128
208
|
}
|
|
129
209
|
break;
|
|
210
|
+
case "clear":
|
|
211
|
+
stdout.write("\x1b[2J\x1b[H");
|
|
212
|
+
break;
|
|
130
213
|
case "open-url": {
|
|
131
214
|
const openCmd = process.platform === "darwin"
|
|
132
215
|
? "open"
|
|
@@ -142,22 +225,45 @@ export async function startRepl(box) {
|
|
|
142
225
|
return false;
|
|
143
226
|
}
|
|
144
227
|
// --- Welcome message ---
|
|
145
|
-
const allCommands =
|
|
228
|
+
const allCommands = client.suggestCommands("");
|
|
146
229
|
console.log(`\nConnected to box ${box.id}`);
|
|
147
|
-
console.log(`Type a prompt to run the agent, or use commands: ${allCommands.map((c) => `/${c.name}`).join(", ")}
|
|
230
|
+
console.log(`Type a prompt to run the agent, or use commands: ${allCommands.map((c) => `/${c.name}`).join(", ")}\n`);
|
|
148
231
|
// --- Main REPL loop ---
|
|
232
|
+
const continuationPrompt = " ".repeat(promptVisualLen);
|
|
149
233
|
try {
|
|
150
234
|
while (true) {
|
|
151
235
|
clearPreview();
|
|
152
236
|
const suggestion = nextSuggestion;
|
|
153
237
|
nextSuggestion = null;
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
238
|
+
// Collect input (supports multi-line via alt+enter / shift+enter)
|
|
239
|
+
const inputLines = [];
|
|
240
|
+
isMetaReturn = false;
|
|
241
|
+
const firstLine = await rl.question(prompt);
|
|
242
|
+
inputLines.push(firstLine);
|
|
243
|
+
if (isMetaReturn && stdin.isTTY) {
|
|
244
|
+
while (true) {
|
|
245
|
+
isMetaReturn = false;
|
|
246
|
+
const nextLine = await rl.question(continuationPrompt);
|
|
247
|
+
inputLines.push(nextLine);
|
|
248
|
+
if (!isMetaReturn)
|
|
249
|
+
break;
|
|
158
250
|
}
|
|
159
|
-
|
|
160
|
-
|
|
251
|
+
}
|
|
252
|
+
const answer = inputLines.join("\n");
|
|
253
|
+
// Rewrite all input lines in green
|
|
254
|
+
if (answer.trim()) {
|
|
255
|
+
const termWidth = stdout.columns || 80;
|
|
256
|
+
let totalVisualRows = 0;
|
|
257
|
+
for (const line of inputLines) {
|
|
258
|
+
const totalChars = promptVisualLen + line.length;
|
|
259
|
+
totalVisualRows += Math.ceil(totalChars / termWidth) || 1;
|
|
260
|
+
}
|
|
261
|
+
stdout.write(cursorUp(totalVisualRows) + "\r" + eraseDown);
|
|
262
|
+
for (let i = 0; i < inputLines.length; i++) {
|
|
263
|
+
const p = i === 0 ? prompt : continuationPrompt;
|
|
264
|
+
stdout.write(p + green(inputLines[i]) + "\n");
|
|
265
|
+
}
|
|
266
|
+
}
|
|
161
267
|
if (suggestion && stdin.isTTY) {
|
|
162
268
|
setImmediate(() => showGhost(suggestion));
|
|
163
269
|
}
|
|
@@ -171,9 +277,12 @@ export async function startRepl(box) {
|
|
|
171
277
|
}
|
|
172
278
|
}
|
|
173
279
|
catch (err) {
|
|
174
|
-
ensureSpinnerStopped();
|
|
175
280
|
console.error(red(`Error: ${err instanceof Error ? err.message : err}`));
|
|
176
281
|
}
|
|
282
|
+
// Always clean up after event processing — handles cases where the
|
|
283
|
+
// generator ends without a command:complete (e.g. after an error event).
|
|
284
|
+
inCommand = false;
|
|
285
|
+
ensureSpinnerStopped();
|
|
177
286
|
if (shouldExit)
|
|
178
287
|
break;
|
|
179
288
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/repl/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/repl/terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/repl/types.d.ts
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
import type { Box } from "@upstash/box";
|
|
2
|
-
export type BoxREPLCommandName = "run" | "
|
|
2
|
+
export type BoxREPLCommandName = "run" | "command" | "code" | "files" | "git" | "snapshot" | "pause" | "delete" | "console" | "clear" | "help" | "exit";
|
|
3
|
+
/** Known tool names from the agent stream */
|
|
4
|
+
export type AgentToolName = "Bash" | "Read" | "Edit" | "Write" | "Grep" | "Glob" | "TodoWrite" | "EnterPlanMode";
|
|
5
|
+
/** A single todo item from a TodoWrite tool call */
|
|
6
|
+
export interface TodoItem {
|
|
7
|
+
content: string;
|
|
8
|
+
status: "pending" | "in_progress" | "completed";
|
|
9
|
+
activeForm?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Summary of a tool invocation for display */
|
|
12
|
+
export interface ToolCallSummary {
|
|
13
|
+
/** Tool name, typed for known tools with fallback */
|
|
14
|
+
name: AgentToolName | (string & {});
|
|
15
|
+
/** Human-readable one-liner derived from the tool's key input */
|
|
16
|
+
summary: string;
|
|
17
|
+
/** Optional secondary detail (e.g. the raw command for Bash) */
|
|
18
|
+
detail?: string;
|
|
19
|
+
}
|
|
3
20
|
export type BoxREPLEvent = {
|
|
4
21
|
type: "log";
|
|
5
22
|
message: string;
|
|
@@ -9,6 +26,12 @@ export type BoxREPLEvent = {
|
|
|
9
26
|
} | {
|
|
10
27
|
type: "stream";
|
|
11
28
|
text: string;
|
|
29
|
+
} | {
|
|
30
|
+
type: "tool";
|
|
31
|
+
tool: ToolCallSummary;
|
|
32
|
+
} | {
|
|
33
|
+
type: "todo";
|
|
34
|
+
todos: TodoItem[];
|
|
12
35
|
} | {
|
|
13
36
|
type: "command:start";
|
|
14
37
|
command: BoxREPLCommandName;
|
|
@@ -24,6 +47,8 @@ export type BoxREPLEvent = {
|
|
|
24
47
|
} | {
|
|
25
48
|
type: "suggestion";
|
|
26
49
|
text: string;
|
|
50
|
+
} | {
|
|
51
|
+
type: "clear";
|
|
27
52
|
} | {
|
|
28
53
|
type: "open-url";
|
|
29
54
|
url: string;
|
package/dist/repl/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/repl/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,MAAM,kBAAkB,GAC1B,KAAK,GACL,MAAM,GACN,OAAO,GACP,KAAK,GACL,UAAU,GACV,OAAO,GACP,QAAQ,GACR,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/repl/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,MAAM,kBAAkB,GAC1B,KAAK,GACL,SAAS,GACT,MAAM,GACN,OAAO,GACP,KAAK,GACL,UAAU,GACV,OAAO,GACP,QAAQ,GACR,SAAS,GACT,OAAO,GACP,MAAM,GACN,MAAM,CAAC;AAEX,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,MAAM,GACN,WAAW,GACX,eAAe,CAAC;AAEpB,oDAAoD;AACpD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,IAAI,EAAE,aAAa,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACpC,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;CAAE,GAC/E;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,cAAc,CAAC,YAAY,CAAC,CAAC;AAE7F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,qBAAqB,CAAC;CAChC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@upstash/box-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"description": "CLI for Upstash Box — REPL-first interface for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"commander": "^13.0.0",
|
|
27
27
|
"dotenv": "^17.3.1",
|
|
28
|
-
"@upstash/box": "0.1.
|
|
28
|
+
"@upstash/box": "0.1.10"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^20.10.0",
|