bdy 1.16.11-master → 1.16.11-sbs-1

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 (48) hide show
  1. package/distTs/package.json +4 -3
  2. package/distTs/src/api/client.js +78 -2
  3. package/distTs/src/command/login.js +280 -0
  4. package/distTs/src/command/logout.js +15 -0
  5. package/distTs/src/command/package/download.js +259 -0
  6. package/distTs/src/command/package/publish.js +231 -0
  7. package/distTs/src/command/package.js +14 -0
  8. package/distTs/src/command/project/list.js +61 -0
  9. package/distTs/src/command/project/set.js +85 -0
  10. package/distTs/src/command/project.js +14 -0
  11. package/distTs/src/command/sandbox/command/kill.js +35 -0
  12. package/distTs/src/command/sandbox/command/list.js +54 -0
  13. package/distTs/src/command/sandbox/command/logs.js +133 -0
  14. package/distTs/src/command/sandbox/command/status.js +44 -0
  15. package/distTs/src/command/sandbox/command.js +18 -0
  16. package/distTs/src/command/sandbox/cp.js +123 -0
  17. package/distTs/src/command/sandbox/create.js +99 -0
  18. package/distTs/src/command/sandbox/destroy.js +35 -0
  19. package/distTs/src/command/sandbox/endpoint/add.js +91 -0
  20. package/distTs/src/command/sandbox/endpoint/delete.js +46 -0
  21. package/distTs/src/command/sandbox/endpoint/get.js +58 -0
  22. package/distTs/src/command/sandbox/endpoint/list.js +51 -0
  23. package/distTs/src/command/sandbox/endpoint/update.js +85 -0
  24. package/distTs/src/command/sandbox/endpoint.js +20 -0
  25. package/distTs/src/command/sandbox/exec.js +127 -0
  26. package/distTs/src/command/sandbox/get.js +51 -0
  27. package/distTs/src/command/sandbox/list.js +41 -0
  28. package/distTs/src/command/sandbox/restart.js +49 -0
  29. package/distTs/src/command/sandbox/snapshot/create.js +68 -0
  30. package/distTs/src/command/sandbox/snapshot/delete.js +42 -0
  31. package/distTs/src/command/sandbox/snapshot/get.js +54 -0
  32. package/distTs/src/command/sandbox/snapshot/list.js +48 -0
  33. package/distTs/src/command/sandbox/snapshot.js +18 -0
  34. package/distTs/src/command/sandbox/start.js +49 -0
  35. package/distTs/src/command/sandbox/status.js +35 -0
  36. package/distTs/src/command/sandbox/stop.js +49 -0
  37. package/distTs/src/command/sandbox.js +36 -0
  38. package/distTs/src/command/workspace/list.js +57 -0
  39. package/distTs/src/command/workspace/set.js +81 -0
  40. package/distTs/src/command/workspace.js +14 -0
  41. package/distTs/src/index.js +10 -0
  42. package/distTs/src/input.js +15 -4
  43. package/distTs/src/texts.js +155 -1
  44. package/distTs/src/tunnel/cfg.js +38 -0
  45. package/package.json +4 -3
  46. package/distTs/src/command/agent/standalone/kill.js +0 -22
  47. package/distTs/src/command/agent/standalone.js +0 -136
  48. package/distTs/src/command/vt/scrap.js +0 -193
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const texts_1 = require("../../texts");
8
+ const output_1 = __importDefault(require("../../output"));
9
+ const input_1 = __importDefault(require("../../input"));
10
+ const client_1 = __importDefault(require("../../api/client"));
11
+ const VALID_RUNTIMES = ['BASH', 'JAVASCRIPT', 'TYPESCRIPT', 'PYTHON'];
12
+ const commandSandboxExec = (0, utils_1.newCommand)('exec', texts_1.DESC_COMMAND_SANDBOX_EXEC);
13
+ commandSandboxExec.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
14
+ commandSandboxExec.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
15
+ commandSandboxExec.option('--region <region>', texts_1.OPTION_REST_API_REGION);
16
+ commandSandboxExec.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
17
+ commandSandboxExec.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
18
+ commandSandboxExec.option('--runtime <runtime>', texts_1.OPTION_SANDBOX_RUNTIME);
19
+ commandSandboxExec.option('-d, --detached', texts_1.OPTION_SANDBOX_DETACHED);
20
+ commandSandboxExec.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
21
+ commandSandboxExec.argument('<command>', texts_1.OPTION_SANDBOX_COMMAND);
22
+ commandSandboxExec.action(async (identifier, command, options) => {
23
+ const token = input_1.default.restApiToken(options.token);
24
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
25
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
26
+ const project = input_1.default.restApiProject(options.project);
27
+ const client = new client_1.default(baseUrl, token);
28
+ // Validate runtime if provided
29
+ const runtime = options.runtime?.toUpperCase() || 'BASH';
30
+ if (!VALID_RUNTIMES.includes(runtime)) {
31
+ output_1.default.exitError((0, texts_1.ERR_SANDBOX_INVALID_RUNTIME)(options.runtime));
32
+ }
33
+ // First list sandboxes to find by identifier
34
+ const result = await client.listSandboxes(workspace, project);
35
+ const sandboxes = result.sandboxes || [];
36
+ const found = sandboxes.find((s) => s.identifier === identifier);
37
+ if (!found) {
38
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
39
+ }
40
+ // Execute command
41
+ const body = {
42
+ command,
43
+ };
44
+ if (runtime !== 'BASH') {
45
+ body.runtime = runtime;
46
+ }
47
+ const cmdResult = await client.executeSandboxCommand(workspace, found.id, body);
48
+ const commandId = cmdResult.id;
49
+ // If detached, return immediately with command ID
50
+ if (options.detached) {
51
+ output_1.default.exitSuccess(`Command started in background: ${commandId}`);
52
+ }
53
+ // Stream logs in real-time
54
+ const logsUrl = await client.getSandboxCommandLogsUrl(workspace, found.id, commandId);
55
+ try {
56
+ const response = await fetch(logsUrl, {
57
+ method: 'GET',
58
+ headers: {
59
+ Accept: 'application/jsonl',
60
+ Authorization: `Bearer ${token}`,
61
+ },
62
+ });
63
+ if (response.ok && response.body) {
64
+ const reader = response.body.getReader();
65
+ const decoder = new TextDecoder();
66
+ let buffer = '';
67
+ while (true) {
68
+ const { done, value } = await reader.read();
69
+ if (done)
70
+ break;
71
+ buffer += decoder.decode(value, { stream: true });
72
+ const lines = buffer.split('\n');
73
+ buffer = lines.pop() || '';
74
+ for (const line of lines) {
75
+ if (!line.trim())
76
+ continue;
77
+ try {
78
+ const logEntry = JSON.parse(line);
79
+ const content = logEntry.data ?? logEntry.message ?? '';
80
+ if (content) {
81
+ if (logEntry.stream === 'stderr' || logEntry.type === 'STDERR') {
82
+ process.stderr.write(content + '\n');
83
+ }
84
+ else {
85
+ process.stdout.write(content + '\n');
86
+ }
87
+ }
88
+ }
89
+ catch {
90
+ process.stdout.write(line + '\n');
91
+ }
92
+ }
93
+ }
94
+ // Process remaining buffer
95
+ if (buffer.trim()) {
96
+ try {
97
+ const logEntry = JSON.parse(buffer);
98
+ const content = logEntry.data ?? logEntry.message ?? '';
99
+ if (content) {
100
+ process.stdout.write(content + '\n');
101
+ }
102
+ }
103
+ catch {
104
+ process.stdout.write(buffer + '\n');
105
+ }
106
+ }
107
+ }
108
+ }
109
+ catch {
110
+ // Streaming failed, fall back to polling
111
+ }
112
+ // Poll for command completion and get exit code
113
+ while (true) {
114
+ const cmd = await client.getSandboxCommand(workspace, found.id, commandId);
115
+ if (cmd.status === 'SUCCESSFUL' || cmd.status === 'FAILED') {
116
+ const exitCode = cmd.exit_code ?? (cmd.status === 'SUCCESSFUL' ? 0 : 1);
117
+ // Print summary
118
+ process.stdout.write('\n');
119
+ process.stdout.write('---\n');
120
+ process.stdout.write(`Command ID: ${commandId}\n`);
121
+ process.stdout.write(`Exit code: ${exitCode}\n`);
122
+ process.exit(exitCode);
123
+ }
124
+ await new Promise((resolve) => setTimeout(resolve, 1000));
125
+ }
126
+ });
127
+ exports.default = commandSandboxExec;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const texts_1 = require("../../texts");
8
+ const output_1 = __importDefault(require("../../output"));
9
+ const input_1 = __importDefault(require("../../input"));
10
+ const client_1 = __importDefault(require("../../api/client"));
11
+ const commandSandboxGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_SANDBOX_GET);
12
+ commandSandboxGet.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
13
+ commandSandboxGet.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
14
+ commandSandboxGet.option('--region <region>', texts_1.OPTION_REST_API_REGION);
15
+ commandSandboxGet.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
+ commandSandboxGet.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandSandboxGet.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
18
+ commandSandboxGet.action(async (identifier, options) => {
19
+ const token = input_1.default.restApiToken(options.token);
20
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
21
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
22
+ const project = input_1.default.restApiProject(options.project);
23
+ const client = new client_1.default(baseUrl, token);
24
+ // First list sandboxes to find by identifier
25
+ const result = await client.listSandboxes(workspace, project);
26
+ const sandboxes = result.sandboxes || [];
27
+ const found = sandboxes.find((s) => s.identifier === identifier);
28
+ if (!found) {
29
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
30
+ }
31
+ // Get full sandbox details
32
+ const sandbox = await client.getSandbox(workspace, found.id);
33
+ const data = [
34
+ ['Property', 'Value'],
35
+ ['ID', sandbox.id || '-'],
36
+ ['Identifier', sandbox.identifier || '-'],
37
+ ['Name', sandbox.name || '-'],
38
+ ['Status', sandbox.status || '-'],
39
+ ['Setup Status', sandbox.setup_status || '-'],
40
+ ['App Status', sandbox.app_status || '-'],
41
+ ['OS', sandbox.os || '-'],
42
+ ['Resources', sandbox.resources || '-'],
43
+ ['URL', sandbox.html_url || '-'],
44
+ ];
45
+ if (sandbox.endpoints && sandbox.endpoints.length > 0) {
46
+ data.push(['Endpoints', sandbox.endpoints.map((e) => `${e.name}: ${e.endpoint}`).join('\n')]);
47
+ }
48
+ output_1.default.table(data);
49
+ output_1.default.exitNormal();
50
+ });
51
+ exports.default = commandSandboxGet;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const texts_1 = require("../../texts");
8
+ const output_1 = __importDefault(require("../../output"));
9
+ const input_1 = __importDefault(require("../../input"));
10
+ const client_1 = __importDefault(require("../../api/client"));
11
+ const commandSandboxList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_SANDBOX_LIST);
12
+ commandSandboxList.alias('ls');
13
+ commandSandboxList.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
14
+ commandSandboxList.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
15
+ commandSandboxList.option('--region <region>', texts_1.OPTION_REST_API_REGION);
16
+ commandSandboxList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
17
+ commandSandboxList.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
18
+ commandSandboxList.action(async (options) => {
19
+ const token = input_1.default.restApiToken(options.token);
20
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
21
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
22
+ const project = input_1.default.restApiProject(options.project);
23
+ const client = new client_1.default(baseUrl, token);
24
+ const result = await client.listSandboxes(workspace, project);
25
+ const sandboxes = result.sandboxes || [];
26
+ if (sandboxes.length === 0) {
27
+ output_1.default.exitNormal('No sandboxes found');
28
+ }
29
+ const data = [['IDENTIFIER', 'NAME', 'STATUS', 'ID']];
30
+ for (const sandbox of sandboxes) {
31
+ data.push([
32
+ sandbox.identifier || '-',
33
+ sandbox.name || '-',
34
+ sandbox.status || '-',
35
+ sandbox.id || '-',
36
+ ]);
37
+ }
38
+ output_1.default.table(data);
39
+ output_1.default.exitNormal();
40
+ });
41
+ exports.default = commandSandboxList;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const texts_1 = require("../../texts");
8
+ const output_1 = __importDefault(require("../../output"));
9
+ const input_1 = __importDefault(require("../../input"));
10
+ const client_1 = __importDefault(require("../../api/client"));
11
+ const commandSandboxRestart = (0, utils_1.newCommand)('restart', texts_1.DESC_COMMAND_SANDBOX_RESTART);
12
+ commandSandboxRestart.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
13
+ commandSandboxRestart.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
14
+ commandSandboxRestart.option('--region <region>', texts_1.OPTION_REST_API_REGION);
15
+ commandSandboxRestart.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
+ commandSandboxRestart.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandSandboxRestart.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
18
+ commandSandboxRestart.action(async (identifier, options) => {
19
+ const token = input_1.default.restApiToken(options.token);
20
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
21
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
22
+ const project = input_1.default.restApiProject(options.project);
23
+ const client = new client_1.default(baseUrl, token);
24
+ // First list sandboxes to find by identifier
25
+ const result = await client.listSandboxes(workspace, project);
26
+ const sandboxes = result.sandboxes || [];
27
+ const found = sandboxes.find((s) => s.identifier === identifier);
28
+ if (!found) {
29
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
30
+ }
31
+ await client.restartSandbox(workspace, found.id);
32
+ // Wait for sandbox to be running
33
+ const startTime = Date.now();
34
+ const maxWaitMs = 60000;
35
+ while (true) {
36
+ const sandbox = await client.getSandbox(workspace, found.id);
37
+ if (sandbox.status === 'RUNNING' && (sandbox.setup_status === 'SUCCESS' || sandbox.setup_status === 'DONE')) {
38
+ output_1.default.exitSuccess((0, texts_1.TXT_SANDBOX_RESTARTED)(identifier));
39
+ }
40
+ if (sandbox.status === 'FAILED' || sandbox.setup_status === 'FAILED') {
41
+ output_1.default.exitError(texts_1.ERR_SANDBOX_START_TIMEOUT);
42
+ }
43
+ if (Date.now() - startTime > maxWaitMs) {
44
+ output_1.default.exitError(texts_1.ERR_SANDBOX_START_TIMEOUT);
45
+ }
46
+ await new Promise((resolve) => setTimeout(resolve, 1000));
47
+ }
48
+ });
49
+ exports.default = commandSandboxRestart;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../../utils");
7
+ const texts_1 = require("../../../texts");
8
+ const output_1 = __importDefault(require("../../../output"));
9
+ const input_1 = __importDefault(require("../../../input"));
10
+ const client_1 = __importDefault(require("../../../api/client"));
11
+ const human_id_1 = __importDefault(require("human-id"));
12
+ const commandSandboxSnapshotCreate = (0, utils_1.newCommand)('create', texts_1.DESC_COMMAND_SANDBOX_SNAPSHOT_CREATE);
13
+ commandSandboxSnapshotCreate.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
14
+ commandSandboxSnapshotCreate.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
15
+ commandSandboxSnapshotCreate.option('--region <region>', texts_1.OPTION_REST_API_REGION);
16
+ commandSandboxSnapshotCreate.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
17
+ commandSandboxSnapshotCreate.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
18
+ commandSandboxSnapshotCreate.option('-n, --name <name>', texts_1.OPTION_SANDBOX_SNAPSHOT_NAME);
19
+ commandSandboxSnapshotCreate.option('-d, --description <description>', texts_1.OPTION_SANDBOX_SNAPSHOT_DESCRIPTION);
20
+ commandSandboxSnapshotCreate.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
21
+ commandSandboxSnapshotCreate.action(async (identifier, options) => {
22
+ const token = input_1.default.restApiToken(options.token);
23
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
24
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
25
+ const project = input_1.default.restApiProject(options.project);
26
+ const client = new client_1.default(baseUrl, token);
27
+ // Find sandbox by identifier
28
+ const result = await client.listSandboxes(workspace, project);
29
+ const sandboxes = result.sandboxes || [];
30
+ const found = sandboxes.find((s) => s.identifier === identifier);
31
+ if (!found) {
32
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
33
+ }
34
+ const defaultName = 'snapshot-' + (0, human_id_1.default)({ separator: '-', capitalize: false });
35
+ const snapshotName = options.name || defaultName;
36
+ const body = {
37
+ name: snapshotName,
38
+ };
39
+ if (options.description) {
40
+ body.description = options.description;
41
+ }
42
+ output_1.default.normal(`Creating snapshot: ${snapshotName}`);
43
+ const snapshot = await client.createSandboxSnapshot(workspace, found.id, body);
44
+ const snapshotId = snapshot.id;
45
+ // If already ready, exit immediately
46
+ if (snapshot.status === 'CREATED') {
47
+ output_1.default.exitSuccess((0, texts_1.TXT_SANDBOX_SNAPSHOT_CREATED)(snapshotName));
48
+ }
49
+ // Wait for snapshot to be ready
50
+ output_1.default.normal(texts_1.TXT_SANDBOX_SNAPSHOT_WAITING);
51
+ // Poll until status is CREATED or FAILED (max 5 minutes)
52
+ const maxWaitMs = 5 * 60 * 1000;
53
+ const startTime = Date.now();
54
+ while (true) {
55
+ const snap = await client.getSandboxSnapshot(workspace, found.id, snapshotId);
56
+ if (snap.status === 'CREATED') {
57
+ output_1.default.exitSuccess((0, texts_1.TXT_SANDBOX_SNAPSHOT_CREATED)(snapshotName));
58
+ }
59
+ if (snap.status === 'FAILED') {
60
+ output_1.default.exitError(texts_1.ERR_SANDBOX_SNAPSHOT_FAILED);
61
+ }
62
+ if (Date.now() - startTime > maxWaitMs) {
63
+ output_1.default.exitError('Timeout waiting for snapshot creation');
64
+ }
65
+ await new Promise((resolve) => setTimeout(resolve, 2000));
66
+ }
67
+ });
68
+ exports.default = commandSandboxSnapshotCreate;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../../utils");
7
+ const texts_1 = require("../../../texts");
8
+ const output_1 = __importDefault(require("../../../output"));
9
+ const input_1 = __importDefault(require("../../../input"));
10
+ const client_1 = __importDefault(require("../../../api/client"));
11
+ const commandSandboxSnapshotDelete = (0, utils_1.newCommand)('delete', texts_1.DESC_COMMAND_SANDBOX_SNAPSHOT_DELETE);
12
+ commandSandboxSnapshotDelete.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
13
+ commandSandboxSnapshotDelete.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
14
+ commandSandboxSnapshotDelete.option('--region <region>', texts_1.OPTION_REST_API_REGION);
15
+ commandSandboxSnapshotDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
+ commandSandboxSnapshotDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandSandboxSnapshotDelete.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
18
+ commandSandboxSnapshotDelete.argument('<snapshot-name>', texts_1.OPTION_SANDBOX_SNAPSHOT_NAME_ARG);
19
+ commandSandboxSnapshotDelete.action(async (identifier, snapshotName, options) => {
20
+ const token = input_1.default.restApiToken(options.token);
21
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
22
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
23
+ const project = input_1.default.restApiProject(options.project);
24
+ const client = new client_1.default(baseUrl, token);
25
+ // Find sandbox by identifier
26
+ const result = await client.listSandboxes(workspace, project);
27
+ const sandboxes = result.sandboxes || [];
28
+ const found = sandboxes.find((s) => s.identifier === identifier);
29
+ if (!found) {
30
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
31
+ }
32
+ // Find snapshot by name
33
+ const snapshotsResult = await client.listSandboxSnapshots(workspace, found.id);
34
+ const snapshots = snapshotsResult.snapshots || [];
35
+ const foundSnapshot = snapshots.find((s) => s.name === snapshotName);
36
+ if (!foundSnapshot) {
37
+ output_1.default.exitError(texts_1.ERR_SANDBOX_SNAPSHOT_NOT_FOUND);
38
+ }
39
+ await client.deleteSandboxSnapshot(workspace, found.id, foundSnapshot.id);
40
+ output_1.default.exitSuccess((0, texts_1.TXT_SANDBOX_SNAPSHOT_DELETED)(snapshotName));
41
+ });
42
+ exports.default = commandSandboxSnapshotDelete;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../../utils");
7
+ const texts_1 = require("../../../texts");
8
+ const output_1 = __importDefault(require("../../../output"));
9
+ const input_1 = __importDefault(require("../../../input"));
10
+ const client_1 = __importDefault(require("../../../api/client"));
11
+ const commandSandboxSnapshotGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_SANDBOX_SNAPSHOT_GET);
12
+ commandSandboxSnapshotGet.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
13
+ commandSandboxSnapshotGet.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
14
+ commandSandboxSnapshotGet.option('--region <region>', texts_1.OPTION_REST_API_REGION);
15
+ commandSandboxSnapshotGet.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
+ commandSandboxSnapshotGet.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandSandboxSnapshotGet.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
18
+ commandSandboxSnapshotGet.argument('<snapshot-name>', texts_1.OPTION_SANDBOX_SNAPSHOT_NAME_ARG);
19
+ commandSandboxSnapshotGet.action(async (identifier, snapshotName, options) => {
20
+ const token = input_1.default.restApiToken(options.token);
21
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
22
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
23
+ const project = input_1.default.restApiProject(options.project);
24
+ const client = new client_1.default(baseUrl, token);
25
+ // Find sandbox by identifier
26
+ const result = await client.listSandboxes(workspace, project);
27
+ const sandboxes = result.sandboxes || [];
28
+ const found = sandboxes.find((s) => s.identifier === identifier);
29
+ if (!found) {
30
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
31
+ }
32
+ // Find snapshot by name
33
+ const snapshotsResult = await client.listSandboxSnapshots(workspace, found.id);
34
+ const snapshots = snapshotsResult.snapshots || [];
35
+ const foundSnapshot = snapshots.find((s) => s.name === snapshotName);
36
+ if (!foundSnapshot) {
37
+ output_1.default.exitError(texts_1.ERR_SANDBOX_SNAPSHOT_NOT_FOUND);
38
+ }
39
+ const snapshot = await client.getSandboxSnapshot(workspace, found.id, foundSnapshot.id);
40
+ const data = [
41
+ ['Property', 'Value'],
42
+ ['Name', snapshot.name || '-'],
43
+ ['Status', snapshot.status || '-'],
44
+ ['Description', snapshot.description || '-'],
45
+ ['Created', snapshot.create_date || '-'],
46
+ ['URL', snapshot.html_url || '-'],
47
+ ];
48
+ if (snapshot.creator) {
49
+ data.push(['Creator', snapshot.creator.name || snapshot.creator.email || '-']);
50
+ }
51
+ output_1.default.table(data);
52
+ output_1.default.exitNormal();
53
+ });
54
+ exports.default = commandSandboxSnapshotGet;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../../utils");
7
+ const texts_1 = require("../../../texts");
8
+ const output_1 = __importDefault(require("../../../output"));
9
+ const input_1 = __importDefault(require("../../../input"));
10
+ const client_1 = __importDefault(require("../../../api/client"));
11
+ const commandSandboxSnapshotList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_SANDBOX_SNAPSHOT_LIST);
12
+ commandSandboxSnapshotList.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
13
+ commandSandboxSnapshotList.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
14
+ commandSandboxSnapshotList.option('--region <region>', texts_1.OPTION_REST_API_REGION);
15
+ commandSandboxSnapshotList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
+ commandSandboxSnapshotList.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandSandboxSnapshotList.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
18
+ commandSandboxSnapshotList.action(async (identifier, options) => {
19
+ const token = input_1.default.restApiToken(options.token);
20
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
21
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
22
+ const project = input_1.default.restApiProject(options.project);
23
+ const client = new client_1.default(baseUrl, token);
24
+ // Find sandbox by identifier
25
+ const result = await client.listSandboxes(workspace, project);
26
+ const sandboxes = result.sandboxes || [];
27
+ const found = sandboxes.find((s) => s.identifier === identifier);
28
+ if (!found) {
29
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
30
+ }
31
+ const snapshotsResult = await client.listSandboxSnapshots(workspace, found.id);
32
+ const snapshots = snapshotsResult.snapshots || [];
33
+ if (snapshots.length === 0) {
34
+ output_1.default.normal('No snapshots found');
35
+ output_1.default.exitNormal();
36
+ }
37
+ const data = [['Name', 'Status', 'Created']];
38
+ for (const snapshot of snapshots) {
39
+ data.push([
40
+ snapshot.name || '-',
41
+ snapshot.status || '-',
42
+ snapshot.create_date || '-',
43
+ ]);
44
+ }
45
+ output_1.default.table(data);
46
+ output_1.default.exitNormal();
47
+ });
48
+ exports.default = commandSandboxSnapshotList;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const texts_1 = require("../../texts");
8
+ const list_1 = __importDefault(require("./snapshot/list"));
9
+ const create_1 = __importDefault(require("./snapshot/create"));
10
+ const get_1 = __importDefault(require("./snapshot/get"));
11
+ const delete_1 = __importDefault(require("./snapshot/delete"));
12
+ const commandSandboxSnapshot = (0, utils_1.newCommand)('snapshot', texts_1.DESC_COMMAND_SANDBOX_SNAPSHOT);
13
+ commandSandboxSnapshot.alias('snap');
14
+ commandSandboxSnapshot.addCommand(list_1.default);
15
+ commandSandboxSnapshot.addCommand(create_1.default);
16
+ commandSandboxSnapshot.addCommand(get_1.default);
17
+ commandSandboxSnapshot.addCommand(delete_1.default);
18
+ exports.default = commandSandboxSnapshot;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const texts_1 = require("../../texts");
8
+ const output_1 = __importDefault(require("../../output"));
9
+ const input_1 = __importDefault(require("../../input"));
10
+ const client_1 = __importDefault(require("../../api/client"));
11
+ const commandSandboxStart = (0, utils_1.newCommand)('start', texts_1.DESC_COMMAND_SANDBOX_START);
12
+ commandSandboxStart.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
13
+ commandSandboxStart.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
14
+ commandSandboxStart.option('--region <region>', texts_1.OPTION_REST_API_REGION);
15
+ commandSandboxStart.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
+ commandSandboxStart.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandSandboxStart.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
18
+ commandSandboxStart.action(async (identifier, options) => {
19
+ const token = input_1.default.restApiToken(options.token);
20
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
21
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
22
+ const project = input_1.default.restApiProject(options.project);
23
+ const client = new client_1.default(baseUrl, token);
24
+ // First list sandboxes to find by identifier
25
+ const result = await client.listSandboxes(workspace, project);
26
+ const sandboxes = result.sandboxes || [];
27
+ const found = sandboxes.find((s) => s.identifier === identifier);
28
+ if (!found) {
29
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
30
+ }
31
+ await client.startSandbox(workspace, found.id);
32
+ // Wait for sandbox to be running
33
+ const startTime = Date.now();
34
+ const maxWaitMs = 60000;
35
+ while (true) {
36
+ const sandbox = await client.getSandbox(workspace, found.id);
37
+ if (sandbox.status === 'RUNNING') {
38
+ output_1.default.exitSuccess((0, texts_1.TXT_SANDBOX_STARTED)(identifier));
39
+ }
40
+ if (sandbox.status === 'FAILED') {
41
+ output_1.default.exitError(texts_1.ERR_SANDBOX_START_TIMEOUT);
42
+ }
43
+ if (Date.now() - startTime > maxWaitMs) {
44
+ output_1.default.exitError(texts_1.ERR_SANDBOX_START_TIMEOUT);
45
+ }
46
+ await new Promise((resolve) => setTimeout(resolve, 1000));
47
+ }
48
+ });
49
+ exports.default = commandSandboxStart;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const texts_1 = require("../../texts");
8
+ const output_1 = __importDefault(require("../../output"));
9
+ const input_1 = __importDefault(require("../../input"));
10
+ const client_1 = __importDefault(require("../../api/client"));
11
+ const commandSandboxStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_SANDBOX_STATUS);
12
+ commandSandboxStatus.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
13
+ commandSandboxStatus.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
14
+ commandSandboxStatus.option('--region <region>', texts_1.OPTION_REST_API_REGION);
15
+ commandSandboxStatus.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
+ commandSandboxStatus.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandSandboxStatus.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
18
+ commandSandboxStatus.action(async (identifier, options) => {
19
+ const token = input_1.default.restApiToken(options.token);
20
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
21
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
22
+ const project = input_1.default.restApiProject(options.project);
23
+ const client = new client_1.default(baseUrl, token);
24
+ // First list sandboxes to find by identifier
25
+ const result = await client.listSandboxes(workspace, project);
26
+ const sandboxes = result.sandboxes || [];
27
+ const found = sandboxes.find((s) => s.identifier === identifier);
28
+ if (!found) {
29
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
30
+ }
31
+ // Get full sandbox details
32
+ const sandbox = await client.getSandbox(workspace, found.id);
33
+ output_1.default.exitNormal(sandbox.status || 'unknown');
34
+ });
35
+ exports.default = commandSandboxStatus;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const texts_1 = require("../../texts");
8
+ const output_1 = __importDefault(require("../../output"));
9
+ const input_1 = __importDefault(require("../../input"));
10
+ const client_1 = __importDefault(require("../../api/client"));
11
+ const commandSandboxStop = (0, utils_1.newCommand)('stop', texts_1.DESC_COMMAND_SANDBOX_STOP);
12
+ commandSandboxStop.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
13
+ commandSandboxStop.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
14
+ commandSandboxStop.option('--region <region>', texts_1.OPTION_REST_API_REGION);
15
+ commandSandboxStop.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
+ commandSandboxStop.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandSandboxStop.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
18
+ commandSandboxStop.action(async (identifier, options) => {
19
+ const token = input_1.default.restApiToken(options.token);
20
+ const baseUrl = input_1.default.restApiBaseUrl(options.api, options.region);
21
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
22
+ const project = input_1.default.restApiProject(options.project);
23
+ const client = new client_1.default(baseUrl, token);
24
+ // First list sandboxes to find by identifier
25
+ const result = await client.listSandboxes(workspace, project);
26
+ const sandboxes = result.sandboxes || [];
27
+ const found = sandboxes.find((s) => s.identifier === identifier);
28
+ if (!found) {
29
+ output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
30
+ }
31
+ await client.stopSandbox(workspace, found.id);
32
+ // Wait for sandbox to be stopped
33
+ const startTime = Date.now();
34
+ const maxWaitMs = 60000;
35
+ while (true) {
36
+ const sandbox = await client.getSandbox(workspace, found.id);
37
+ if (sandbox.status === 'STOPPED') {
38
+ output_1.default.exitSuccess((0, texts_1.TXT_SANDBOX_STOPPED)(identifier));
39
+ }
40
+ if (sandbox.status === 'FAILED') {
41
+ output_1.default.exitError(texts_1.ERR_SANDBOX_STOP_TIMEOUT);
42
+ }
43
+ if (Date.now() - startTime > maxWaitMs) {
44
+ output_1.default.exitError(texts_1.ERR_SANDBOX_STOP_TIMEOUT);
45
+ }
46
+ await new Promise((resolve) => setTimeout(resolve, 1000));
47
+ }
48
+ });
49
+ exports.default = commandSandboxStop;