@usenaive-sdk/cli 0.12.2 → 0.12.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 +22 -0
- package/dist/client.d.ts +26 -1
- package/dist/client.js +167 -5
- package/dist/client.js.map +1 -1
- package/dist/commands/aeo.js +13 -6
- package/dist/commands/aeo.js.map +1 -1
- package/dist/commands/auth.d.ts +30 -0
- package/dist/commands/auth.js +400 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/billing.js +9 -9
- package/dist/commands/billing.js.map +1 -1
- package/dist/commands/brain.d.ts +2 -0
- package/dist/commands/brain.js +509 -0
- package/dist/commands/brain.js.map +1 -0
- package/dist/commands/browser.js +28 -1
- package/dist/commands/browser.js.map +1 -1
- package/dist/commands/clone.d.ts +2 -0
- package/dist/commands/clone.js +199 -0
- package/dist/commands/clone.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +36 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/env.d.ts +3 -3
- package/dist/commands/env.js +68 -4
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/images.js +2 -2
- package/dist/commands/keys.js +26 -3
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/loops.d.ts +2 -0
- package/dist/commands/loops.js +260 -0
- package/dist/commands/loops.js.map +1 -0
- package/dist/commands/mobile.d.ts +2 -0
- package/dist/commands/mobile.js +341 -0
- package/dist/commands/mobile.js.map +1 -0
- package/dist/commands/payments.d.ts +2 -0
- package/dist/commands/payments.js +131 -0
- package/dist/commands/payments.js.map +1 -0
- package/dist/commands/phone.js +77 -2
- package/dist/commands/phone.js.map +1 -1
- package/dist/commands/register.js +4 -4
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/usage.js +4 -4
- package/dist/commands/video.js +94 -273
- package/dist/commands/video.js.map +1 -1
- package/dist/commands/voice.d.ts +2 -0
- package/dist/commands/voice.js +516 -0
- package/dist/commands/voice.js.map +1 -0
- package/dist/commands/wallet.d.ts +2 -0
- package/dist/commands/wallet.js +244 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.js +35 -6
- package/dist/config.js.map +1 -1
- package/dist/index.js +70 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/unknown-command.d.ts +17 -0
- package/dist/lib/unknown-command.js +19 -0
- package/dist/lib/unknown-command.js.map +1 -0
- package/dist/lib/version-check.d.ts +26 -0
- package/dist/lib/version-check.js +21 -0
- package/dist/lib/version-check.js.map +1 -0
- package/dist/output.d.ts +20 -5
- package/dist/output.js +150 -5
- package/dist/output.js.map +1 -1
- package/dist/prompt.d.ts +17 -0
- package/dist/prompt.js +70 -0
- package/dist/prompt.js.map +1 -0
- package/package.json +9 -4
- package/dist/commands/billing-client.d.ts +0 -2
- package/dist/commands/billing-client.js +0 -271
- package/dist/commands/billing-client.js.map +0 -1
- package/dist/commands/crm-app.d.ts +0 -2
- package/dist/commands/crm-app.js +0 -306
- package/dist/commands/crm-app.js.map +0 -1
- package/dist/commands/crm.d.ts +0 -2
- package/dist/commands/crm.js +0 -319
- package/dist/commands/crm.js.map +0 -1
- package/dist/commands/integrations.d.ts +0 -2
- package/dist/commands/integrations.js +0 -199
- package/dist/commands/integrations.js.map +0 -1
- package/dist/commands/operators.d.ts +0 -11
- package/dist/commands/operators.js +0 -120
- package/dist/commands/operators.js.map +0 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { apiRequest, handleApiError } from "../client.js";
|
|
3
|
+
import { agentOutput } from "../output.js";
|
|
4
|
+
export const loopsCmd = new Command("loops")
|
|
5
|
+
.description("Recurring agent runs — create, list, pause/resume, run now, and remove loops")
|
|
6
|
+
.addHelpText("after", `
|
|
7
|
+
Subcommands:
|
|
8
|
+
naive loops create --schedule <cron> --prompt <text> Create a recurring agent run
|
|
9
|
+
naive loops list List all loops
|
|
10
|
+
naive loops get <id> Show one loop
|
|
11
|
+
naive loops update <id> [--active|--no-active] ... Pause/resume or edit a loop
|
|
12
|
+
naive loops run <id> Fire a loop immediately
|
|
13
|
+
naive loops remove <id> Delete a loop (and its backing cron job)
|
|
14
|
+
|
|
15
|
+
Schedule format (cron expression):
|
|
16
|
+
"0 9 * * *" → every day at 9:00 AM UTC
|
|
17
|
+
"*/30 * * * *" → every 30 minutes
|
|
18
|
+
"0 0 * * 1" → every Monday at midnight UTC
|
|
19
|
+
|
|
20
|
+
A Loop is a first-class recurring agent run: a cron-source trigger subscription
|
|
21
|
+
bound to an agent. Creating one records the binding and creates the backing cron
|
|
22
|
+
job that executes it. Pausing/resuming (--no-active/--active) leaves the runtime
|
|
23
|
+
untouched.
|
|
24
|
+
|
|
25
|
+
Workflow:
|
|
26
|
+
1. naive loops create --schedule "0 9 * * *" --prompt "Summarize overnight email" --name "Morning triage"
|
|
27
|
+
2. naive loops list → see all loops
|
|
28
|
+
3. naive loops run <id> → test-fire immediately
|
|
29
|
+
4. naive loops update <id> --no-active → pause
|
|
30
|
+
5. naive loops remove <id> → delete permanently
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
$ naive loops create --schedule "0 9 * * 1" --prompt "Generate the weekly report" --name "Weekly Report"
|
|
34
|
+
$ naive loops list
|
|
35
|
+
$ naive loops run loop_01H...
|
|
36
|
+
$ naive loops update loop_01H... --no-active
|
|
37
|
+
$ naive loops remove loop_01H...
|
|
38
|
+
`);
|
|
39
|
+
loopsCmd
|
|
40
|
+
.command("list")
|
|
41
|
+
.description("List all loops — active and paused recurring agent runs")
|
|
42
|
+
.option("--user <id>", "Target a specific tenant user")
|
|
43
|
+
.addHelpText("after", `
|
|
44
|
+
Examples:
|
|
45
|
+
$ naive loops list
|
|
46
|
+
|
|
47
|
+
Returns loop details:
|
|
48
|
+
- id, name, schedule (cron expression), active
|
|
49
|
+
- target (prompt + optional profileName)
|
|
50
|
+
- cronJobId of the backing executor
|
|
51
|
+
`)
|
|
52
|
+
.action(async (opts) => {
|
|
53
|
+
const resp = await apiRequest("GET", "/v1/loops", undefined, { userId: opts.user });
|
|
54
|
+
handleApiError("loops.list", resp);
|
|
55
|
+
const data = resp.data;
|
|
56
|
+
const count = data.count ?? data.loops?.length ?? 0;
|
|
57
|
+
const active = data.loops?.filter((l) => l.active !== false) ?? [];
|
|
58
|
+
agentOutput({
|
|
59
|
+
action: "loops.list",
|
|
60
|
+
result: resp.data,
|
|
61
|
+
next_steps: [
|
|
62
|
+
...(count > 0
|
|
63
|
+
? [{ command: `naive loops get ${data.loops[0].id}`, description: "View details of the first loop" }]
|
|
64
|
+
: []),
|
|
65
|
+
{ command: 'naive loops create --schedule "<cron>" --prompt "<text>"', description: "Create a new loop" },
|
|
66
|
+
],
|
|
67
|
+
hints: [
|
|
68
|
+
`${count} loop${count !== 1 ? "s" : ""} total, ${active.length} active`,
|
|
69
|
+
],
|
|
70
|
+
related_commands: ["naive loops create", "naive loops get", "naive loops run"],
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
loopsCmd
|
|
74
|
+
.command("create")
|
|
75
|
+
.description("Create a recurring agent run that fires a prompt on a cron schedule")
|
|
76
|
+
.requiredOption("--schedule <cron>", "Cron expression (e.g. '0 9 * * *')")
|
|
77
|
+
.requiredOption("--prompt <text>", "Prompt to run each time the loop fires")
|
|
78
|
+
.option("--name <name>", "Human-readable name for the loop")
|
|
79
|
+
.option("--profile <name>", "Agent profile to run as (defaults to the CEO)")
|
|
80
|
+
.option("--user <id>", "Target a specific tenant user")
|
|
81
|
+
.addHelpText("after", `
|
|
82
|
+
Examples:
|
|
83
|
+
$ naive loops create --schedule "0 9 * * *" --prompt "Review overnight email and summarize what needs my attention"
|
|
84
|
+
$ naive loops create --schedule "*/30 * * * *" --prompt "Check social mentions" --profile support --name "Mentions watch"
|
|
85
|
+
|
|
86
|
+
What this does:
|
|
87
|
+
Records the loop binding and creates the backing cron job that executes it.
|
|
88
|
+
The response includes the loop and the cron_job_id of the backing executor
|
|
89
|
+
(null if no runtime is reachable yet — the binding still persists and can
|
|
90
|
+
be synced later).
|
|
91
|
+
`)
|
|
92
|
+
.action(async (opts) => {
|
|
93
|
+
const resp = await apiRequest("POST", "/v1/loops", {
|
|
94
|
+
schedule: opts.schedule,
|
|
95
|
+
prompt: opts.prompt,
|
|
96
|
+
...(opts.name && { name: opts.name }),
|
|
97
|
+
...(opts.profile && { profileName: opts.profile }),
|
|
98
|
+
}, { userId: opts.user });
|
|
99
|
+
handleApiError("loops.create", resp);
|
|
100
|
+
const data = resp.data;
|
|
101
|
+
const loop = data.loop ?? {};
|
|
102
|
+
const loopId = loop.id ?? "unknown";
|
|
103
|
+
agentOutput({
|
|
104
|
+
action: "loops.create",
|
|
105
|
+
result: resp.data,
|
|
106
|
+
next_steps: [
|
|
107
|
+
{ command: `naive loops run ${loopId}`, description: "Test-fire this loop immediately" },
|
|
108
|
+
{ command: "naive loops list", description: "View all loops" },
|
|
109
|
+
],
|
|
110
|
+
hints: [
|
|
111
|
+
`Loop created (id: ${loopId})`,
|
|
112
|
+
`Schedule: ${loop.schedule ?? opts.schedule}`,
|
|
113
|
+
...(loop.name ? [`Name: ${loop.name}`] : []),
|
|
114
|
+
data.cron_job_id
|
|
115
|
+
? `Backing cron job: ${data.cron_job_id}`
|
|
116
|
+
: "No runtime reachable yet — the binding persists and will sync later (cron_job_id: null)",
|
|
117
|
+
],
|
|
118
|
+
related_commands: ["naive loops list", "naive loops run", "naive loops update"],
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
loopsCmd
|
|
122
|
+
.command("get <id>")
|
|
123
|
+
.description("Show full details for a specific loop")
|
|
124
|
+
.option("--user <id>", "Target a specific tenant user")
|
|
125
|
+
.addHelpText("after", `
|
|
126
|
+
Examples:
|
|
127
|
+
$ naive loops get loop_01H...
|
|
128
|
+
|
|
129
|
+
Returns the loop's id, name, schedule, active flag, target (prompt + profile),
|
|
130
|
+
and the cronJobId of the backing executor.
|
|
131
|
+
`)
|
|
132
|
+
.action(async (id, opts) => {
|
|
133
|
+
const resp = await apiRequest("GET", `/v1/loops/${id}`, undefined, { userId: opts.user });
|
|
134
|
+
handleApiError("loops.get", resp);
|
|
135
|
+
const data = resp.data;
|
|
136
|
+
agentOutput({
|
|
137
|
+
action: "loops.get",
|
|
138
|
+
result: resp.data,
|
|
139
|
+
next_steps: [
|
|
140
|
+
{ command: `naive loops run ${id}`, description: "Fire this loop now" },
|
|
141
|
+
...(data.active === false
|
|
142
|
+
? [{ command: `naive loops update ${id} --active`, description: "Resume this loop" }]
|
|
143
|
+
: [{ command: `naive loops update ${id} --no-active`, description: "Pause this loop" }]),
|
|
144
|
+
{ command: "naive loops list", description: "View all loops" },
|
|
145
|
+
],
|
|
146
|
+
hints: [
|
|
147
|
+
`${data.name ?? data.id ?? id}: ${data.active === false ? "paused" : "active"}${data.schedule ? ` (${data.schedule})` : ""}`,
|
|
148
|
+
],
|
|
149
|
+
related_commands: ["naive loops list", "naive loops update", "naive loops run"],
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
loopsCmd
|
|
153
|
+
.command("update <id>")
|
|
154
|
+
.description("Update a loop — pause/resume, or edit its name, prompt, or profile")
|
|
155
|
+
.option("--name <name>", "New human-readable name")
|
|
156
|
+
.option("--active", "Resume the loop (fire on schedule)")
|
|
157
|
+
.option("--no-active", "Pause the loop (do not fire on schedule)")
|
|
158
|
+
.option("--prompt <text>", "New prompt to run each firing")
|
|
159
|
+
.option("--profile <name>", "New agent profile to run as")
|
|
160
|
+
.option("--user <id>", "Target a specific tenant user")
|
|
161
|
+
.addHelpText("after", `
|
|
162
|
+
Examples:
|
|
163
|
+
$ naive loops update loop_01H... --no-active # pause
|
|
164
|
+
$ naive loops update loop_01H... --active # resume
|
|
165
|
+
$ naive loops update loop_01H... --prompt "New instructions"
|
|
166
|
+
$ naive loops update loop_01H... --name "Renamed loop" --profile support
|
|
167
|
+
`)
|
|
168
|
+
.action(async (id, opts) => {
|
|
169
|
+
const body = {};
|
|
170
|
+
if (opts.name !== undefined)
|
|
171
|
+
body.name = opts.name;
|
|
172
|
+
if (opts.active !== undefined)
|
|
173
|
+
body.active = opts.active;
|
|
174
|
+
if (opts.prompt !== undefined)
|
|
175
|
+
body.prompt = opts.prompt;
|
|
176
|
+
if (opts.profile !== undefined)
|
|
177
|
+
body.profileName = opts.profile;
|
|
178
|
+
const resp = await apiRequest("PATCH", `/v1/loops/${id}`, body, { userId: opts.user });
|
|
179
|
+
handleApiError("loops.update", resp);
|
|
180
|
+
agentOutput({
|
|
181
|
+
action: "loops.update",
|
|
182
|
+
result: resp.data,
|
|
183
|
+
next_steps: [
|
|
184
|
+
{ command: `naive loops get ${id}`, description: "View the updated loop" },
|
|
185
|
+
{ command: "naive loops list", description: "View all loops" },
|
|
186
|
+
],
|
|
187
|
+
hints: [
|
|
188
|
+
`Loop ${id} updated`,
|
|
189
|
+
...(opts.active !== undefined ? [opts.active ? "Resumed — will fire on schedule" : "Paused — will not fire on schedule"] : []),
|
|
190
|
+
...(opts.name !== undefined ? [`Name → ${opts.name}`] : []),
|
|
191
|
+
...(opts.prompt !== undefined ? ["Prompt updated"] : []),
|
|
192
|
+
...(opts.profile !== undefined ? [`Profile → ${opts.profile}`] : []),
|
|
193
|
+
],
|
|
194
|
+
related_commands: ["naive loops get", "naive loops list"],
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
loopsCmd
|
|
198
|
+
.command("run <id>")
|
|
199
|
+
.description("Fire a loop immediately — the regular schedule is unaffected")
|
|
200
|
+
.option("--user <id>", "Target a specific tenant user")
|
|
201
|
+
.addHelpText("after", `
|
|
202
|
+
Examples:
|
|
203
|
+
$ naive loops run loop_01H...
|
|
204
|
+
|
|
205
|
+
Fires the loop's prompt right now, regardless of its schedule. Returns the
|
|
206
|
+
run_id of the triggered run (null if no runtime is reachable).
|
|
207
|
+
|
|
208
|
+
Cost: Same as a regular loop firing (credits based on work performed).
|
|
209
|
+
`)
|
|
210
|
+
.action(async (id, opts) => {
|
|
211
|
+
const resp = await apiRequest("POST", `/v1/loops/${id}/run`, undefined, { userId: opts.user });
|
|
212
|
+
handleApiError("loops.run", resp);
|
|
213
|
+
const data = resp.data;
|
|
214
|
+
agentOutput({
|
|
215
|
+
action: "loops.run",
|
|
216
|
+
result: resp.data,
|
|
217
|
+
next_steps: [
|
|
218
|
+
...(data.run_id
|
|
219
|
+
? [{ command: `naive ceo stream ${data.run_id}`, description: "Stream the triggered run" }]
|
|
220
|
+
: []),
|
|
221
|
+
{ command: "naive loops list", description: "View all loops" },
|
|
222
|
+
],
|
|
223
|
+
hints: [
|
|
224
|
+
data.run_id
|
|
225
|
+
? `Loop ${id} fired (run: ${data.run_id})`
|
|
226
|
+
: `Loop ${id} could not fire — no runtime reachable`,
|
|
227
|
+
"This does not affect the regular schedule",
|
|
228
|
+
],
|
|
229
|
+
related_commands: ["naive loops list", "naive ceo stream", "naive loops get"],
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
loopsCmd
|
|
233
|
+
.command("remove <id>")
|
|
234
|
+
.description("Permanently delete a loop and its backing cron job")
|
|
235
|
+
.option("--user <id>", "Target a specific tenant user")
|
|
236
|
+
.addHelpText("after", `
|
|
237
|
+
Examples:
|
|
238
|
+
$ naive loops remove loop_01H...
|
|
239
|
+
|
|
240
|
+
Deletes the loop binding and best-effort removes the backing cron job.
|
|
241
|
+
This cannot be undone.
|
|
242
|
+
`)
|
|
243
|
+
.action(async (id, opts) => {
|
|
244
|
+
const resp = await apiRequest("DELETE", `/v1/loops/${id}`, undefined, { userId: opts.user });
|
|
245
|
+
handleApiError("loops.remove", resp);
|
|
246
|
+
agentOutput({
|
|
247
|
+
action: "loops.remove",
|
|
248
|
+
result: resp.data,
|
|
249
|
+
next_steps: [
|
|
250
|
+
{ command: "naive loops list", description: "View remaining loops" },
|
|
251
|
+
{ command: 'naive loops create --schedule "<cron>" --prompt "<text>"', description: "Create a replacement loop" },
|
|
252
|
+
],
|
|
253
|
+
hints: [
|
|
254
|
+
`Loop ${id} deleted permanently`,
|
|
255
|
+
"The backing cron job is removed too",
|
|
256
|
+
],
|
|
257
|
+
related_commands: ["naive loops list", "naive loops create"],
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
//# sourceMappingURL=loops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loops.js","sourceRoot":"","sources":["../../src/commands/loops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { apiRequest, handleApiError, handlePendingApproval } from "../client.js";
|
|
3
|
+
import { agentOutput } from "../output.js";
|
|
4
|
+
export const mobileCmd = new Command("mobile")
|
|
5
|
+
.description("Mobile — provision, control & display cloud mobile emulators/devices via Mobilerun")
|
|
6
|
+
.addHelpText("after", `
|
|
7
|
+
Phones are billed PER MINUTE from your credits: the phone provisions
|
|
8
|
+
immediately and the meter runs until you terminate it (there is NO upstream
|
|
9
|
+
auto-stop — running out of credits auto-terminates the phone).
|
|
10
|
+
|
|
11
|
+
Subcommands:
|
|
12
|
+
naive mobile status Integration status + your phone count
|
|
13
|
+
naive mobile devices List your phones (alias: phones)
|
|
14
|
+
naive mobile provision Create a phone (alias: create-phone)
|
|
15
|
+
naive mobile device <id> Show a device's live details
|
|
16
|
+
naive mobile stream <id> Get the live stream URL/token (to display)
|
|
17
|
+
naive mobile reboot <id> Reboot a device
|
|
18
|
+
naive mobile reset <id> Reset a device to a fresh state
|
|
19
|
+
naive mobile terminate <id> Release a device (stops the per-minute meter)
|
|
20
|
+
naive mobile wait <id> [--timeout <secs>] Block until a device is ready
|
|
21
|
+
naive mobile proxy <id> Show the device's proxy attachment
|
|
22
|
+
naive mobile proxy-set <id> --host ... Attach a SOCKS5 proxy (residential IP)
|
|
23
|
+
naive mobile proxy-remove <id> Detach the proxy (back to datacenter IP)
|
|
24
|
+
naive mobile run "<task>" [--device <id>] Run an agent task on a device
|
|
25
|
+
naive mobile tasks List agent tasks
|
|
26
|
+
naive mobile task <id> Show a task's status/result
|
|
27
|
+
naive mobile stop <id> Cancel a running task
|
|
28
|
+
naive mobile screenshots <id> List a task's screenshots
|
|
29
|
+
naive mobile trajectory <id> Show a task's trajectory
|
|
30
|
+
naive mobile apps List apps in the Mobilerun library
|
|
31
|
+
naive mobile upload-app <name> Create a signed upload URL for an app
|
|
32
|
+
naive mobile search "<query>" Search the Mobilerun API catalog (wildcard)
|
|
33
|
+
naive mobile call <operationId> ... Call ANY Mobilerun operation (wildcard)
|
|
34
|
+
|
|
35
|
+
Governance:
|
|
36
|
+
Provisioning, reboot/reset/terminate, proxy changes, running/stopping tasks,
|
|
37
|
+
uploading apps, and mutating wildcard calls are SENSITIVE and may require
|
|
38
|
+
human approval depending on the Account Kit (status "pending_approval").
|
|
39
|
+
|
|
40
|
+
Examples:
|
|
41
|
+
$ naive mobile provision --country US
|
|
42
|
+
$ naive mobile run "Open Settings and enable dark mode" --device <id> --vision
|
|
43
|
+
$ naive mobile stream <id>
|
|
44
|
+
$ naive mobile terminate <id>
|
|
45
|
+
$ naive mobile call take-screenshot --path deviceId=<id>
|
|
46
|
+
`);
|
|
47
|
+
mobileCmd
|
|
48
|
+
.command("status", { isDefault: true })
|
|
49
|
+
.description("Show mobile integration status + your device count")
|
|
50
|
+
.action(async () => {
|
|
51
|
+
const resp = await apiRequest("GET", "/v1/mobile/status");
|
|
52
|
+
handleApiError("mobile.status", resp);
|
|
53
|
+
agentOutput({ action: "mobile.status", result: resp.data, next_steps: [] });
|
|
54
|
+
});
|
|
55
|
+
mobileCmd
|
|
56
|
+
.command("devices")
|
|
57
|
+
.alias("phones")
|
|
58
|
+
.description("List your phones (cloud mobile devices) with status")
|
|
59
|
+
.option("--state <state>", "Filter by state, e.g. ready")
|
|
60
|
+
.option("--type <type>", "Filter by device type")
|
|
61
|
+
.option("--country <country>", "Filter by country")
|
|
62
|
+
.action(async (opts) => {
|
|
63
|
+
const params = new URLSearchParams();
|
|
64
|
+
if (opts.state)
|
|
65
|
+
params.set("state", opts.state);
|
|
66
|
+
if (opts.type)
|
|
67
|
+
params.set("type", opts.type);
|
|
68
|
+
if (opts.country)
|
|
69
|
+
params.set("country", opts.country);
|
|
70
|
+
const qs = params.toString();
|
|
71
|
+
const resp = await apiRequest("GET", `/v1/mobile/devices${qs ? `?${qs}` : ""}`);
|
|
72
|
+
handleApiError("mobile.devices", resp);
|
|
73
|
+
agentOutput({ action: "mobile.devices", result: resp.data, next_steps: [] });
|
|
74
|
+
});
|
|
75
|
+
mobileCmd
|
|
76
|
+
.command("provision")
|
|
77
|
+
.alias("create-phone")
|
|
78
|
+
.description("Create a phone — provisions immediately, billed per minute from your credits")
|
|
79
|
+
.option("--type <type>", "Device type (default: dedicated_premium_device — the minute-billed cloud phone)")
|
|
80
|
+
.option("--country <country>", "Country code")
|
|
81
|
+
.option("--profile <id>", "Device profile id")
|
|
82
|
+
.option("--name <name>", "Phone name")
|
|
83
|
+
.action(async (opts) => {
|
|
84
|
+
const body = {
|
|
85
|
+
type: opts.type,
|
|
86
|
+
country: opts.country,
|
|
87
|
+
profile_id: opts.profile,
|
|
88
|
+
name: opts.name,
|
|
89
|
+
};
|
|
90
|
+
const resp = await apiRequest("POST", "/v1/mobile/devices", body);
|
|
91
|
+
if (handlePendingApproval("mobile.provision", resp))
|
|
92
|
+
return;
|
|
93
|
+
handleApiError("mobile.provision", resp);
|
|
94
|
+
const data = resp.data;
|
|
95
|
+
agentOutput({
|
|
96
|
+
action: "mobile.provision",
|
|
97
|
+
result: resp.data,
|
|
98
|
+
next_steps: data.phone?.device_id
|
|
99
|
+
? [
|
|
100
|
+
{ command: `naive mobile wait ${data.phone.device_id}`, description: "Block until the device is ready" },
|
|
101
|
+
{ command: `naive mobile terminate ${data.phone.device_id}`, description: "Terminate when done (stops the per-minute meter)" },
|
|
102
|
+
]
|
|
103
|
+
: [],
|
|
104
|
+
hints: [
|
|
105
|
+
`Billed ${data.credits_per_minute ?? "a few"} credits/min from your balance until terminated — running out of credits auto-terminates the phone.`,
|
|
106
|
+
],
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
mobileCmd
|
|
110
|
+
.command("device <id>")
|
|
111
|
+
.description("Show a device's live details")
|
|
112
|
+
.action(async (id) => {
|
|
113
|
+
const resp = await apiRequest("GET", `/v1/mobile/devices/${id}`);
|
|
114
|
+
handleApiError("mobile.device", resp);
|
|
115
|
+
agentOutput({ action: "mobile.device", result: resp.data, next_steps: [] });
|
|
116
|
+
});
|
|
117
|
+
mobileCmd
|
|
118
|
+
.command("stream <id>")
|
|
119
|
+
.description("Get the live stream URL + token (to display the device screen)")
|
|
120
|
+
.action(async (id) => {
|
|
121
|
+
const resp = await apiRequest("GET", `/v1/mobile/devices/${id}/stream`);
|
|
122
|
+
handleApiError("mobile.stream", resp);
|
|
123
|
+
agentOutput({ action: "mobile.stream", result: resp.data, next_steps: [] });
|
|
124
|
+
});
|
|
125
|
+
for (const verb of ["reboot", "reset"]) {
|
|
126
|
+
mobileCmd
|
|
127
|
+
.command(`${verb} <id>`)
|
|
128
|
+
.description(verb === "reboot" ? "Reboot a device" : "Reset a device to a fresh state")
|
|
129
|
+
.action(async (id) => {
|
|
130
|
+
const resp = await apiRequest("POST", `/v1/mobile/devices/${id}/${verb}`);
|
|
131
|
+
if (handlePendingApproval(`mobile.${verb}`, resp))
|
|
132
|
+
return;
|
|
133
|
+
handleApiError(`mobile.${verb}`, resp);
|
|
134
|
+
agentOutput({ action: `mobile.${verb}`, result: resp.data, next_steps: [] });
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
mobileCmd
|
|
138
|
+
.command("terminate <id>")
|
|
139
|
+
.description("Terminate (release) a device")
|
|
140
|
+
.action(async (id) => {
|
|
141
|
+
const resp = await apiRequest("DELETE", `/v1/mobile/devices/${id}`);
|
|
142
|
+
if (handlePendingApproval("mobile.terminate", resp))
|
|
143
|
+
return;
|
|
144
|
+
handleApiError("mobile.terminate", resp);
|
|
145
|
+
agentOutput({ action: "mobile.terminate", result: resp.data, next_steps: [] });
|
|
146
|
+
});
|
|
147
|
+
mobileCmd
|
|
148
|
+
.command("wait <id>")
|
|
149
|
+
.description("Block until a device is ready")
|
|
150
|
+
.option("--timeout <secs>", "Timeout in seconds")
|
|
151
|
+
.action(async (id, opts) => {
|
|
152
|
+
const body = opts.timeout ? { timeout_seconds: Number(opts.timeout) } : {};
|
|
153
|
+
const resp = await apiRequest("POST", `/v1/mobile/devices/${id}/wait`, body);
|
|
154
|
+
handleApiError("mobile.wait", resp);
|
|
155
|
+
agentOutput({ action: "mobile.wait", result: resp.data, next_steps: [] });
|
|
156
|
+
});
|
|
157
|
+
mobileCmd
|
|
158
|
+
.command("proxy <id>")
|
|
159
|
+
.description("Show a device's proxy attachment (devices default to a datacenter IP)")
|
|
160
|
+
.action(async (id) => {
|
|
161
|
+
const resp = await apiRequest("GET", `/v1/mobile/devices/${id}/proxy`);
|
|
162
|
+
handleApiError("mobile.proxy", resp);
|
|
163
|
+
agentOutput({ action: "mobile.proxy", result: resp.data, next_steps: [] });
|
|
164
|
+
});
|
|
165
|
+
mobileCmd
|
|
166
|
+
.command("proxy-set <id>")
|
|
167
|
+
.description("Attach a SOCKS5 proxy to a device (residential / country-specific IP)")
|
|
168
|
+
.requiredOption("--host <host>", "Proxy host")
|
|
169
|
+
.requiredOption("--port <port>", "Proxy port")
|
|
170
|
+
.option("--user <user>", "Proxy username")
|
|
171
|
+
.option("--password <password>", "Proxy password")
|
|
172
|
+
.option("--no-smart-ip", "Disable smart IP rotation handling")
|
|
173
|
+
.action(async (id, opts) => {
|
|
174
|
+
const resp = await apiRequest("POST", `/v1/mobile/devices/${id}/proxy`, {
|
|
175
|
+
host: opts.host,
|
|
176
|
+
port: Number(opts.port),
|
|
177
|
+
user: opts.user,
|
|
178
|
+
password: opts.password,
|
|
179
|
+
smart_ip: opts.smartIp,
|
|
180
|
+
});
|
|
181
|
+
if (handlePendingApproval("mobile.set_proxy", resp))
|
|
182
|
+
return;
|
|
183
|
+
handleApiError("mobile.set_proxy", resp);
|
|
184
|
+
agentOutput({ action: "mobile.set_proxy", result: resp.data, next_steps: [] });
|
|
185
|
+
});
|
|
186
|
+
mobileCmd
|
|
187
|
+
.command("proxy-remove <id>")
|
|
188
|
+
.description("Detach the proxy from a device (back to the datacenter IP)")
|
|
189
|
+
.action(async (id) => {
|
|
190
|
+
const resp = await apiRequest("DELETE", `/v1/mobile/devices/${id}/proxy`);
|
|
191
|
+
if (handlePendingApproval("mobile.remove_proxy", resp))
|
|
192
|
+
return;
|
|
193
|
+
handleApiError("mobile.remove_proxy", resp);
|
|
194
|
+
agentOutput({ action: "mobile.remove_proxy", result: resp.data, next_steps: [] });
|
|
195
|
+
});
|
|
196
|
+
mobileCmd
|
|
197
|
+
.command("run <task>")
|
|
198
|
+
.description("Run an agent task on one of your phones with a natural-language instruction")
|
|
199
|
+
.requiredOption("--device <id>", "Target phone (device) id — required")
|
|
200
|
+
.option("--model <model>", "LLM model id")
|
|
201
|
+
.option("--vision", "Enable vision (screenshots)")
|
|
202
|
+
.option("--reasoning", "Enable multi-step planning")
|
|
203
|
+
.option("--steps <n>", "Max execution steps")
|
|
204
|
+
.action(async (task, opts) => {
|
|
205
|
+
const body = {
|
|
206
|
+
task,
|
|
207
|
+
device_id: opts.device,
|
|
208
|
+
model: opts.model,
|
|
209
|
+
vision: opts.vision || undefined,
|
|
210
|
+
reasoning: opts.reasoning || undefined,
|
|
211
|
+
steps: opts.steps ? Number(opts.steps) : undefined,
|
|
212
|
+
};
|
|
213
|
+
const resp = await apiRequest("POST", "/v1/mobile/tasks", body);
|
|
214
|
+
if (handlePendingApproval("mobile.run", resp))
|
|
215
|
+
return;
|
|
216
|
+
handleApiError("mobile.run", resp);
|
|
217
|
+
agentOutput({ action: "mobile.run", result: resp.data, next_steps: [] });
|
|
218
|
+
});
|
|
219
|
+
mobileCmd
|
|
220
|
+
.command("tasks")
|
|
221
|
+
.description("List agent tasks")
|
|
222
|
+
.option("--device <id>", "Filter by device id")
|
|
223
|
+
.option("--status <status>", "Filter by status")
|
|
224
|
+
.action(async (opts) => {
|
|
225
|
+
const params = new URLSearchParams();
|
|
226
|
+
if (opts.device)
|
|
227
|
+
params.set("device_id", opts.device);
|
|
228
|
+
if (opts.status)
|
|
229
|
+
params.set("status", opts.status);
|
|
230
|
+
const qs = params.toString();
|
|
231
|
+
const resp = await apiRequest("GET", `/v1/mobile/tasks${qs ? `?${qs}` : ""}`);
|
|
232
|
+
handleApiError("mobile.tasks", resp);
|
|
233
|
+
agentOutput({ action: "mobile.tasks", result: resp.data, next_steps: [] });
|
|
234
|
+
});
|
|
235
|
+
mobileCmd
|
|
236
|
+
.command("task <id>")
|
|
237
|
+
.description("Show a task's status/result")
|
|
238
|
+
.action(async (id) => {
|
|
239
|
+
const resp = await apiRequest("GET", `/v1/mobile/tasks/${id}`);
|
|
240
|
+
handleApiError("mobile.task", resp);
|
|
241
|
+
agentOutput({ action: "mobile.task", result: resp.data, next_steps: [] });
|
|
242
|
+
});
|
|
243
|
+
mobileCmd
|
|
244
|
+
.command("stop <id>")
|
|
245
|
+
.description("Cancel a running task")
|
|
246
|
+
.action(async (id) => {
|
|
247
|
+
const resp = await apiRequest("POST", `/v1/mobile/tasks/${id}/stop`);
|
|
248
|
+
if (handlePendingApproval("mobile.stop", resp))
|
|
249
|
+
return;
|
|
250
|
+
handleApiError("mobile.stop", resp);
|
|
251
|
+
agentOutput({ action: "mobile.stop", result: resp.data, next_steps: [] });
|
|
252
|
+
});
|
|
253
|
+
mobileCmd
|
|
254
|
+
.command("screenshots <id>")
|
|
255
|
+
.description("List a task's screenshot URLs")
|
|
256
|
+
.action(async (id) => {
|
|
257
|
+
const resp = await apiRequest("GET", `/v1/mobile/tasks/${id}/screenshots`);
|
|
258
|
+
handleApiError("mobile.screenshots", resp);
|
|
259
|
+
agentOutput({ action: "mobile.screenshots", result: resp.data, next_steps: [] });
|
|
260
|
+
});
|
|
261
|
+
mobileCmd
|
|
262
|
+
.command("trajectory <id>")
|
|
263
|
+
.description("Show a task's step-by-step trajectory")
|
|
264
|
+
.action(async (id) => {
|
|
265
|
+
const resp = await apiRequest("GET", `/v1/mobile/tasks/${id}/trajectory`);
|
|
266
|
+
handleApiError("mobile.trajectory", resp);
|
|
267
|
+
agentOutput({ action: "mobile.trajectory", result: resp.data, next_steps: [] });
|
|
268
|
+
});
|
|
269
|
+
mobileCmd
|
|
270
|
+
.command("apps")
|
|
271
|
+
.description("List apps in the Mobilerun library")
|
|
272
|
+
.action(async () => {
|
|
273
|
+
const resp = await apiRequest("GET", "/v1/mobile/apps");
|
|
274
|
+
handleApiError("mobile.apps", resp);
|
|
275
|
+
agentOutput({ action: "mobile.apps", result: resp.data, next_steps: [] });
|
|
276
|
+
});
|
|
277
|
+
mobileCmd
|
|
278
|
+
.command("upload-app <name>")
|
|
279
|
+
.description("Create a signed upload URL to add an app (APK) to the library")
|
|
280
|
+
.option("--file <name>", "File name of the APK")
|
|
281
|
+
.action(async (name, opts) => {
|
|
282
|
+
const resp = await apiRequest("POST", "/v1/mobile/apps", { name, file_name: opts.file });
|
|
283
|
+
if (handlePendingApproval("mobile.upload_app", resp))
|
|
284
|
+
return;
|
|
285
|
+
handleApiError("mobile.upload_app", resp);
|
|
286
|
+
agentOutput({ action: "mobile.upload_app", result: resp.data, next_steps: [] });
|
|
287
|
+
});
|
|
288
|
+
mobileCmd
|
|
289
|
+
.command("search [query]")
|
|
290
|
+
.description("Search the Mobilerun API catalog (wildcard discovery)")
|
|
291
|
+
.option("--tag <tag>", "Filter by API group, e.g. Devices, Tasks, Tools")
|
|
292
|
+
.action(async (query, opts) => {
|
|
293
|
+
const params = new URLSearchParams();
|
|
294
|
+
if (query)
|
|
295
|
+
params.set("q", query);
|
|
296
|
+
if (opts.tag)
|
|
297
|
+
params.set("tag", opts.tag);
|
|
298
|
+
const qs = params.toString();
|
|
299
|
+
const resp = await apiRequest("GET", `/v1/mobile/methods${qs ? `?${qs}` : ""}`);
|
|
300
|
+
handleApiError("mobile.search", resp);
|
|
301
|
+
agentOutput({ action: "mobile.search", result: resp.data, next_steps: [] });
|
|
302
|
+
});
|
|
303
|
+
mobileCmd
|
|
304
|
+
.command("call <operationId>")
|
|
305
|
+
.description("Call ANY Mobilerun operation by operationId (wildcard)")
|
|
306
|
+
.option("--path <kv...>", "Path params KEY=VALUE (repeatable), e.g. deviceId=<id>")
|
|
307
|
+
.option("--query <kv...>", "Query params KEY=VALUE (repeatable)")
|
|
308
|
+
.option("--body <json>", "JSON request body")
|
|
309
|
+
.action(async (operationId, opts) => {
|
|
310
|
+
const parseKv = (entries) => {
|
|
311
|
+
const out = {};
|
|
312
|
+
for (const kv of entries ?? []) {
|
|
313
|
+
const i = String(kv).indexOf("=");
|
|
314
|
+
if (i > 0)
|
|
315
|
+
out[String(kv).slice(0, i)] = String(kv).slice(i + 1);
|
|
316
|
+
}
|
|
317
|
+
return out;
|
|
318
|
+
};
|
|
319
|
+
let body;
|
|
320
|
+
if (opts.body) {
|
|
321
|
+
try {
|
|
322
|
+
body = JSON.parse(opts.body);
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
handleApiError("mobile.call", { status: 400, data: { error: { code: "invalid_input", message: "--body must be valid JSON" } } });
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
const reqBody = {
|
|
330
|
+
operation_id: operationId,
|
|
331
|
+
path: parseKv(opts.path),
|
|
332
|
+
query: parseKv(opts.query),
|
|
333
|
+
...(body !== undefined ? { body } : {}),
|
|
334
|
+
};
|
|
335
|
+
const resp = await apiRequest("POST", "/v1/mobile/call", reqBody);
|
|
336
|
+
if (handlePendingApproval("mobile.call", resp))
|
|
337
|
+
return;
|
|
338
|
+
handleApiError("mobile.call", resp);
|
|
339
|
+
agentOutput({ action: "mobile.call", result: resp.data, next_steps: [] });
|
|
340
|
+
});
|
|
341
|
+
//# sourceMappingURL=mobile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile.js","sourceRoot":"","sources":["../../src/commands/mobile.ts"],"names":[],"mappings":"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"}
|