@elaraai/e3-cloud-cli 0.0.0-stage → 1.0.89-alpha.0
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/LICENSE.md +54 -0
- package/README.md +433 -2
- package/dist/src/app-source.d.ts +16 -0
- package/dist/src/app-source.d.ts.map +1 -0
- package/dist/src/app-source.js +112 -0
- package/dist/src/app-source.js.map +1 -0
- package/dist/src/cli.d.ts +7 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +472 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/app.d.ts +28 -0
- package/dist/src/commands/app.d.ts.map +1 -0
- package/dist/src/commands/app.js +286 -0
- package/dist/src/commands/app.js.map +1 -0
- package/dist/src/commands/compute.d.ts +16 -0
- package/dist/src/commands/compute.d.ts.map +1 -0
- package/dist/src/commands/compute.js +110 -0
- package/dist/src/commands/compute.js.map +1 -0
- package/dist/src/commands/feedback.d.ts +27 -0
- package/dist/src/commands/feedback.d.ts.map +1 -0
- package/dist/src/commands/feedback.js +197 -0
- package/dist/src/commands/feedback.js.map +1 -0
- package/dist/src/commands/records.d.ts +42 -0
- package/dist/src/commands/records.d.ts.map +1 -0
- package/dist/src/commands/records.js +301 -0
- package/dist/src/commands/records.js.map +1 -0
- package/dist/src/commands/release.d.ts +39 -0
- package/dist/src/commands/release.d.ts.map +1 -0
- package/dist/src/commands/release.js +219 -0
- package/dist/src/commands/release.js.map +1 -0
- package/dist/src/commands/role.d.ts +24 -0
- package/dist/src/commands/role.d.ts.map +1 -0
- package/dist/src/commands/role.js +94 -0
- package/dist/src/commands/role.js.map +1 -0
- package/dist/src/commands/schedule.d.ts +18 -0
- package/dist/src/commands/schedule.d.ts.map +1 -0
- package/dist/src/commands/schedule.js +128 -0
- package/dist/src/commands/schedule.js.map +1 -0
- package/dist/src/commands/secrets.d.ts +15 -0
- package/dist/src/commands/secrets.d.ts.map +1 -0
- package/dist/src/commands/secrets.js +82 -0
- package/dist/src/commands/secrets.js.map +1 -0
- package/dist/src/commands/staging.d.ts +36 -0
- package/dist/src/commands/staging.d.ts.map +1 -0
- package/dist/src/commands/staging.js +98 -0
- package/dist/src/commands/staging.js.map +1 -0
- package/dist/src/commands/timeout.d.ts +16 -0
- package/dist/src/commands/timeout.d.ts.map +1 -0
- package/dist/src/commands/timeout.js +124 -0
- package/dist/src/commands/timeout.js.map +1 -0
- package/dist/src/commands/user-settings.d.ts +15 -0
- package/dist/src/commands/user-settings.d.ts.map +1 -0
- package/dist/src/commands/user-settings.js +74 -0
- package/dist/src/commands/user-settings.js.map +1 -0
- package/dist/src/commands/user.d.ts +26 -0
- package/dist/src/commands/user.d.ts.map +1 -0
- package/dist/src/commands/user.js +206 -0
- package/dist/src/commands/user.js.map +1 -0
- package/dist/src/commands/whoami.d.ts +6 -0
- package/dist/src/commands/whoami.d.ts.map +1 -0
- package/dist/src/commands/whoami.js +38 -0
- package/dist/src/commands/whoami.js.map +1 -0
- package/dist/src/credentials.d.ts +100 -0
- package/dist/src/credentials.d.ts.map +1 -0
- package/dist/src/credentials.js +164 -0
- package/dist/src/credentials.js.map +1 -0
- package/dist/src/utils.d.ts +38 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +73 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +32 -3
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Feedback commands — list, show, close, reopen, enable, disable.
|
|
7
|
+
*
|
|
8
|
+
* Users send notes about a part of a workspace's pages (`FB-<number>`, per
|
|
9
|
+
* workspace). These commands read and handle them: `list` the workspace's
|
|
10
|
+
* notes of a status with their counts (owners and admins), or `--mine`, the
|
|
11
|
+
* caller's own; `show` one note whole with its context, and save its
|
|
12
|
+
* screenshot; `close` and `reopen` one (owners and admins); and `enable` and
|
|
13
|
+
* `disable` the workspace's feedback (owners and admins).
|
|
14
|
+
*/
|
|
15
|
+
import { writeFileSync } from 'node:fs';
|
|
16
|
+
import { ApiError, closeFeedback, feedbackId, feedbackScreenshotUrl, getFeedback, listFeedback, listMyFeedback, putFeedbackSettings, reopenFeedback, } from '@elaraai/e3-cloud-client';
|
|
17
|
+
import { getValidToken } from '../credentials.js';
|
|
18
|
+
import { parseWorkspaceUrl, formatError, exitError } from '../utils.js';
|
|
19
|
+
/** An error, in words: an API error's code and the server's message. */
|
|
20
|
+
function describe(err) {
|
|
21
|
+
if (err instanceof ApiError)
|
|
22
|
+
return typeof err.details === 'string' ? `${err.code}: ${err.details}` : err.code;
|
|
23
|
+
return formatError(err);
|
|
24
|
+
}
|
|
25
|
+
/** A note's number, from `12` or `FB-12`. */
|
|
26
|
+
function numberOf(text) {
|
|
27
|
+
const match = /^(?:FB-)?([1-9][0-9]*)$/i.exec(text.trim());
|
|
28
|
+
if (match === null)
|
|
29
|
+
exitError(`'${text}' names no note: give its number, e.g. 12 or FB-12`);
|
|
30
|
+
return Number(match[1]);
|
|
31
|
+
}
|
|
32
|
+
/** A status option, checked. */
|
|
33
|
+
function statusOf(text) {
|
|
34
|
+
if (text === undefined)
|
|
35
|
+
return undefined;
|
|
36
|
+
if (text !== 'open' && text !== 'closed')
|
|
37
|
+
exitError(`--status is open or closed, not '${text}'`);
|
|
38
|
+
return text;
|
|
39
|
+
}
|
|
40
|
+
/** A page size option, checked. */
|
|
41
|
+
function limitOf(text) {
|
|
42
|
+
if (text === undefined)
|
|
43
|
+
return undefined;
|
|
44
|
+
const limit = Number(text);
|
|
45
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 50)
|
|
46
|
+
exitError(`--limit is a whole number from 1 to 50, not '${text}'`);
|
|
47
|
+
return limit;
|
|
48
|
+
}
|
|
49
|
+
/** A moment, as a terminal shows it. */
|
|
50
|
+
function when(at) {
|
|
51
|
+
return at.toISOString().replace('T', ' ').slice(0, 16);
|
|
52
|
+
}
|
|
53
|
+
/** Text on one line, cut to a width. */
|
|
54
|
+
function line(text, width) {
|
|
55
|
+
const one = text.replace(/\s+/g, ' ').trim();
|
|
56
|
+
return one.length <= width ? one : `${one.slice(0, width - 1)}…`;
|
|
57
|
+
}
|
|
58
|
+
/** Who sent a note. */
|
|
59
|
+
function senderOf(note) {
|
|
60
|
+
return note.sender.email.type === 'some' ? note.sender.email.value : note.sender.sub;
|
|
61
|
+
}
|
|
62
|
+
export const feedbackCommand = {
|
|
63
|
+
/** e3-cloud feedback list <workspaceUrl> [--status] [--limit] [--cursor] [--mine] */
|
|
64
|
+
async list(url, options) {
|
|
65
|
+
try {
|
|
66
|
+
const { baseUrl, repo, workspace } = parseWorkspaceUrl(url);
|
|
67
|
+
const token = await getValidToken(baseUrl);
|
|
68
|
+
const status = statusOf(options.status) ?? 'open';
|
|
69
|
+
const page = {
|
|
70
|
+
status,
|
|
71
|
+
...(limitOf(options.limit) !== undefined && { limit: limitOf(options.limit) }),
|
|
72
|
+
...(options.cursor !== undefined && { cursor: options.cursor }),
|
|
73
|
+
};
|
|
74
|
+
if (options.mine === true) {
|
|
75
|
+
const mine = await listMyFeedback(baseUrl, repo, workspace, { token }, page);
|
|
76
|
+
if (mine.notes.length === 0)
|
|
77
|
+
console.log(`You have no ${status} feedback in ${workspace}.`);
|
|
78
|
+
for (const note of mine.notes) {
|
|
79
|
+
console.log(`${feedbackId(note.number).padEnd(8)} ${when(note.createdAt)} ${line(note.part, 30).padEnd(30)} ${line(note.note, 60)}`);
|
|
80
|
+
}
|
|
81
|
+
if (mine.next.type === 'some')
|
|
82
|
+
console.log(`More: --cursor ${mine.next.value}`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const list = await listFeedback(baseUrl, repo, workspace, { token }, page);
|
|
86
|
+
console.log(`${workspace}: ${list.counts.open} open, ${list.counts.closed} closed`);
|
|
87
|
+
if (list.notes.length === 0)
|
|
88
|
+
console.log(`No ${status} feedback.`);
|
|
89
|
+
for (const note of list.notes) {
|
|
90
|
+
console.log([
|
|
91
|
+
feedbackId(note.number).padEnd(8),
|
|
92
|
+
when(note.createdAt),
|
|
93
|
+
line(senderOf(note), 24).padEnd(24),
|
|
94
|
+
line(note.part.label, 24).padEnd(24),
|
|
95
|
+
line(note.page.route, 32).padEnd(32),
|
|
96
|
+
line(note.note, 50),
|
|
97
|
+
].join(' '));
|
|
98
|
+
}
|
|
99
|
+
if (list.next.type === 'some')
|
|
100
|
+
console.log(`More: --cursor ${list.next.value}`);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
exitError(describe(err));
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
/** e3-cloud feedback show <workspaceUrl> <number> [--status] [--screenshot <file>] */
|
|
107
|
+
async show(url, number, options) {
|
|
108
|
+
try {
|
|
109
|
+
const { baseUrl, repo, workspace } = parseWorkspaceUrl(url);
|
|
110
|
+
const token = await getValidToken(baseUrl);
|
|
111
|
+
const status = statusOf(options.status);
|
|
112
|
+
const note = await getFeedback(baseUrl, repo, workspace, numberOf(number), { token }, status === undefined ? {} : { status });
|
|
113
|
+
const rows = [
|
|
114
|
+
['Feedback', `${feedbackId(note.number)} (${note.status.type})`],
|
|
115
|
+
['Sent', `${note.createdAt.toISOString()} by ${senderOf(note)}${note.sender.name.type === 'some' ? ` (${note.sender.name.value})` : ''}`],
|
|
116
|
+
['URL', note.page.url],
|
|
117
|
+
['Page', `${note.page.route} — ${note.page.title}`],
|
|
118
|
+
['Part', `${note.part.label} (${note.part.scope.type}; ${note.part.kind.type} ${note.part.kind.value})`],
|
|
119
|
+
['Path', note.part.path],
|
|
120
|
+
['Text', line(note.part.text, 200)],
|
|
121
|
+
['Task', note.data.task.type === 'some' ? note.data.task.value : '—'],
|
|
122
|
+
...[...note.data.datasets].map(([path, hash]) => ['Dataset', `${path} = ${hash}`]),
|
|
123
|
+
['Viewport', `${note.page.viewportWidth}×${note.page.viewportHeight} @${note.page.devicePixelRatio}x, ${note.page.theme}`],
|
|
124
|
+
['Version', note.page.version],
|
|
125
|
+
['Screenshot', note.screenshot.type === 'stored'
|
|
126
|
+
? `${note.screenshot.value.mediaType}, ${note.screenshot.value.width}×${note.screenshot.value.height}, ${note.screenshot.value.size} bytes`
|
|
127
|
+
: `none: ${note.screenshot.value}`],
|
|
128
|
+
];
|
|
129
|
+
for (const [label, value] of rows)
|
|
130
|
+
console.log(`${label.padEnd(11)} ${value}`);
|
|
131
|
+
console.log('');
|
|
132
|
+
console.log(note.note);
|
|
133
|
+
if (options.screenshot !== undefined) {
|
|
134
|
+
if (note.screenshot.type !== 'stored')
|
|
135
|
+
exitError(`${feedbackId(note.number)} was sent without a screenshot.`);
|
|
136
|
+
const download = await feedbackScreenshotUrl(baseUrl, repo, workspace, note.number, { token }, { status: note.status.type });
|
|
137
|
+
const response = await fetch(download);
|
|
138
|
+
if (!response.ok)
|
|
139
|
+
exitError(`The screenshot could not be read: HTTP ${response.status}`);
|
|
140
|
+
writeFileSync(options.screenshot, new Uint8Array(await response.arrayBuffer()));
|
|
141
|
+
console.log(`\nSaved the screenshot to ${options.screenshot}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
exitError(describe(err));
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
/** e3-cloud feedback close <workspaceUrl> <number> */
|
|
149
|
+
async close(url, number) {
|
|
150
|
+
try {
|
|
151
|
+
const { baseUrl, repo, workspace } = parseWorkspaceUrl(url);
|
|
152
|
+
const token = await getValidToken(baseUrl);
|
|
153
|
+
const note = await closeFeedback(baseUrl, repo, workspace, numberOf(number), { token });
|
|
154
|
+
console.log(`${feedbackId(note.number)} is closed`);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
exitError(describe(err));
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
/** e3-cloud feedback reopen <workspaceUrl> <number> */
|
|
161
|
+
async reopen(url, number) {
|
|
162
|
+
try {
|
|
163
|
+
const { baseUrl, repo, workspace } = parseWorkspaceUrl(url);
|
|
164
|
+
const token = await getValidToken(baseUrl);
|
|
165
|
+
const note = await reopenFeedback(baseUrl, repo, workspace, numberOf(number), { token });
|
|
166
|
+
console.log(`${feedbackId(note.number)} is open`);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
exitError(describe(err));
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
/** e3-cloud feedback enable <workspaceUrl> */
|
|
173
|
+
async enable(url) {
|
|
174
|
+
try {
|
|
175
|
+
const { baseUrl, repo, workspace } = parseWorkspaceUrl(url);
|
|
176
|
+
const token = await getValidToken(baseUrl);
|
|
177
|
+
await putFeedbackSettings(baseUrl, repo, workspace, true, { token });
|
|
178
|
+
console.log(`Feedback is on in ${workspace}: its pages show the Feedback button`);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
exitError(describe(err));
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
/** e3-cloud feedback disable <workspaceUrl> */
|
|
185
|
+
async disable(url) {
|
|
186
|
+
try {
|
|
187
|
+
const { baseUrl, repo, workspace } = parseWorkspaceUrl(url);
|
|
188
|
+
const token = await getValidToken(baseUrl);
|
|
189
|
+
await putFeedbackSettings(baseUrl, repo, workspace, false, { token });
|
|
190
|
+
console.log(`Feedback is off in ${workspace}: its notes are kept`);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
exitError(describe(err));
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
export declare const recordsCommand: {
|
|
6
|
+
/** e3-cloud records list <repoUrl> <workspace> */
|
|
7
|
+
list(url: string, workspace: string): Promise<void>;
|
|
8
|
+
/** e3-cloud records history <repoUrl> <workspace> <record> [--limit n] [--before cursor] */
|
|
9
|
+
history(url: string, workspace: string, record: string, options: {
|
|
10
|
+
limit?: string;
|
|
11
|
+
before?: string;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
/** e3-cloud records show <repoUrl> <workspace> <record> <commit> [-o file] */
|
|
14
|
+
show(url: string, workspace: string, record: string, commit: string, options: {
|
|
15
|
+
output?: string;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
/** e3-cloud records rollback <repoUrl> <workspace> <record> <commit> [--expect-head h] [--yes] */
|
|
18
|
+
rollback(url: string, workspace: string, record: string, commit: string, options: {
|
|
19
|
+
expectHead?: string;
|
|
20
|
+
yes?: boolean;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
/** e3-cloud records backup <repoUrl> <workspace> <record> [--note text] */
|
|
23
|
+
backup(url: string, workspace: string, record: string, options: {
|
|
24
|
+
note?: string;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
/** e3-cloud records backups <repoUrl> <workspace> <record> */
|
|
27
|
+
backups(url: string, workspace: string, record: string): Promise<void>;
|
|
28
|
+
/** e3-cloud records restore <repoUrl> <workspace> <record> <backupId> [--expect-head h] [--yes] */
|
|
29
|
+
restore(url: string, workspace: string, record: string, id: string, options: {
|
|
30
|
+
expectHead?: string;
|
|
31
|
+
yes?: boolean;
|
|
32
|
+
}): Promise<void>;
|
|
33
|
+
/** e3-cloud records backup-pull <repoUrl> <workspace> <record> <backupId> -o <file> */
|
|
34
|
+
backupPull(url: string, workspace: string, record: string, id: string, options: {
|
|
35
|
+
output: string;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
/** e3-cloud records backup-rm <repoUrl> <workspace> <record> <backupId> [--yes] */
|
|
38
|
+
backupRm(url: string, workspace: string, record: string, id: string, options: {
|
|
39
|
+
yes?: boolean;
|
|
40
|
+
}): Promise<void>;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=records.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../../src/commands/records.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiIH,eAAO,MAAM,cAAc;IACzB,kDAAkD;cAClC,MAAM,aAAa,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBzD,4FAA4F;iBACzE,MAAM,aAAa,MAAM,UAAU,MAAM,WAAW;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B1H,8EAA8E;cAC9D,MAAM,aAAa,MAAM,UAAU,MAAM,UAAU,MAAM,WAAW;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvH,kGAAkG;kBAC9E,MAAM,aAAa,MAAM,UAAU,MAAM,UAAU,MAAM,WAAW;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9I,2EAA2E;gBACzD,MAAM,aAAa,MAAM,UAAU,MAAM,WAAW;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAavG,8DAA8D;iBAC3C,MAAM,aAAa,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB5E,mGAAmG;iBAChF,MAAM,aAAa,MAAM,UAAU,MAAM,MAAM,MAAM,WAAW;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzI,uFAAuF;oBACjE,MAAM,aAAa,MAAM,UAAU,MAAM,MAAM,MAAM,WAAW;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxH,mFAAmF;kBAC/D,MAAM,aAAa,MAAM,UAAU,MAAM,MAAM,MAAM,WAAW;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CActH,CAAC"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Records commands — history, show, rollback, backup management.
|
|
7
|
+
*
|
|
8
|
+
* Operates the cloud's system-of-record surface: the durable audit index
|
|
9
|
+
* (survives `$compact` + GC), the record's value at a commit, `$rollback`/
|
|
10
|
+
* `$restore` commits, and backups — rows naming states, which the platform
|
|
11
|
+
* keeps while the backup exists, and whose values download by segments.
|
|
12
|
+
* Mutating commands send the `X-E3-Client: cli` channel tag so audit entries
|
|
13
|
+
* show where the action came from. Rollback/restore ask for confirmation
|
|
14
|
+
* unless `--yes`.
|
|
15
|
+
*
|
|
16
|
+
* Base mutations remain on the e3 CLI (`e3 mutate` / `e3 history` /
|
|
17
|
+
* `e3 compact`); these commands add the operator layer on top.
|
|
18
|
+
*/
|
|
19
|
+
import { createWriteStream, writeFileSync } from 'node:fs';
|
|
20
|
+
import { once } from 'node:events';
|
|
21
|
+
import { decodeBeast2, encodeEastFor, some, none, variant } from '@elaraai/east';
|
|
22
|
+
import { listRecordInfos, recordAudit, recordStateAt, recordStatePage, recordValueChunks, rollbackRecord, listRecordBackups, createRecordBackup, restoreRecordBackup, recordBackupStream, deleteRecordBackup, } from '@elaraai/e3-cloud-client';
|
|
23
|
+
import { getValidToken } from '../credentials.js';
|
|
24
|
+
import { parseRepoUrl, formatError, exitError, confirm } from '../utils.js';
|
|
25
|
+
const SOURCE = 'cli';
|
|
26
|
+
/** Rows `show` prints of a record too large to print whole. */
|
|
27
|
+
const SHOW_ROWS = 100;
|
|
28
|
+
/** Render a MutationResult outcome for the terminal; exits non-zero unless committed. */
|
|
29
|
+
function reportOutcome(action, result) {
|
|
30
|
+
const outcome = result.outcome;
|
|
31
|
+
switch (outcome.type) {
|
|
32
|
+
case 'committed':
|
|
33
|
+
console.log(`${action}: committed ${outcome.value.commitHash.slice(0, 12)} (state ${outcome.value.stateHash.slice(0, 12)})`);
|
|
34
|
+
return;
|
|
35
|
+
case 'invalid':
|
|
36
|
+
exitError(`${action} refused: ${outcome.value.message}`);
|
|
37
|
+
break;
|
|
38
|
+
case 'conflict':
|
|
39
|
+
exitError(outcome.value.detail.type === 'some'
|
|
40
|
+
? `${action} conflicted: ${outcome.value.detail.value}`
|
|
41
|
+
: `${action} lost a concurrent-write race (${outcome.value.attempts} attempts) — retry.`);
|
|
42
|
+
break;
|
|
43
|
+
case 'failed':
|
|
44
|
+
exitError(`${action} failed (exit ${outcome.value.exitCode}): ${outcome.value.stderr}`);
|
|
45
|
+
break;
|
|
46
|
+
case 'timed_out':
|
|
47
|
+
exitError(`${action} timed out after ${outcome.value.ms} ms: ${outcome.value.stderr}`);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Writes a value's chunks to a file, and says how many bytes it wrote. */
|
|
52
|
+
async function writeChunks(file, chunks) {
|
|
53
|
+
const out = createWriteStream(file);
|
|
54
|
+
let bytes = 0;
|
|
55
|
+
try {
|
|
56
|
+
for await (const chunk of chunks) {
|
|
57
|
+
bytes += chunk.length;
|
|
58
|
+
if (!out.write(chunk))
|
|
59
|
+
await once(out, 'drain');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
out.end();
|
|
64
|
+
await once(out, 'close');
|
|
65
|
+
}
|
|
66
|
+
return bytes;
|
|
67
|
+
}
|
|
68
|
+
/** Prints a beast2 value as East. */
|
|
69
|
+
function printValue(bytes) {
|
|
70
|
+
const { type, value } = decodeBeast2(bytes);
|
|
71
|
+
process.stdout.write(Buffer.from(encodeEastFor(type)(value)));
|
|
72
|
+
process.stdout.write('\n');
|
|
73
|
+
}
|
|
74
|
+
/** Resolve a commit hash or unique prefix (≥6 hex chars) against the
|
|
75
|
+
* record's audit index, so hashes can be pasted straight from `history`
|
|
76
|
+
* output (which shows 12-char prefixes). */
|
|
77
|
+
async function resolveCommitHash(baseUrl, repo, workspace, record, hashOrPrefix, token) {
|
|
78
|
+
if (/^[a-f0-9]{64}$/.test(hashOrPrefix))
|
|
79
|
+
return hashOrPrefix;
|
|
80
|
+
if (!/^[a-f0-9]{6,63}$/.test(hashOrPrefix)) {
|
|
81
|
+
exitError(`'${hashOrPrefix}' is not a commit hash or prefix (need ≥6 hex characters).`);
|
|
82
|
+
}
|
|
83
|
+
const matches = new Set();
|
|
84
|
+
let before;
|
|
85
|
+
for (let page = 0; page < 10; page++) {
|
|
86
|
+
const result = await recordAudit(baseUrl, repo, workspace, record, { token }, {
|
|
87
|
+
limit: 200,
|
|
88
|
+
...(before !== undefined ? { before } : {}),
|
|
89
|
+
});
|
|
90
|
+
for (const entry of result.entries) {
|
|
91
|
+
if (entry.commitHash.startsWith(hashOrPrefix))
|
|
92
|
+
matches.add(entry.commitHash);
|
|
93
|
+
}
|
|
94
|
+
if (result.nextBefore.type !== 'some')
|
|
95
|
+
break;
|
|
96
|
+
before = result.nextBefore.value;
|
|
97
|
+
}
|
|
98
|
+
const resolved = [...matches];
|
|
99
|
+
if (resolved.length === 1)
|
|
100
|
+
return resolved[0];
|
|
101
|
+
if (resolved.length === 0) {
|
|
102
|
+
exitError(`No commit matching '${hashOrPrefix}' in the most recent 2000 audit entries — pass the full 64-character hash.`);
|
|
103
|
+
}
|
|
104
|
+
exitError(`Commit prefix '${hashOrPrefix}' is ambiguous (${resolved.length} matches) — use more characters.`);
|
|
105
|
+
}
|
|
106
|
+
function fmtWhen(at) {
|
|
107
|
+
return at.toISOString().replace('T', ' ').replace(/\.\d+Z$/, 'Z');
|
|
108
|
+
}
|
|
109
|
+
export const recordsCommand = {
|
|
110
|
+
/** e3-cloud records list <repoUrl> <workspace> */
|
|
111
|
+
async list(url, workspace) {
|
|
112
|
+
try {
|
|
113
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
114
|
+
const token = await getValidToken(baseUrl);
|
|
115
|
+
const records = await listRecordInfos(baseUrl, repo, workspace, { token });
|
|
116
|
+
if (records.length === 0) {
|
|
117
|
+
console.log('No records in this workspace.');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
for (const record of records) {
|
|
121
|
+
if (record.head.type === 'some') {
|
|
122
|
+
const head = record.head.value;
|
|
123
|
+
console.log(`${record.name} head ${head.commitHash.slice(0, 12)} (${head.mutation} by ${head.actor} at ${fmtWhen(head.at)}) backups ${record.backupCount}${record.moreBackups ? '+' : ''}`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.log(`${record.name} (no state) backups ${record.backupCount}${record.moreBackups ? '+' : ''}`);
|
|
127
|
+
}
|
|
128
|
+
console.log(` mutations: ${record.mutations.join(', ') || '(none)'}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
exitError(formatError(err));
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
/** e3-cloud records history <repoUrl> <workspace> <record> [--limit n] [--before cursor] */
|
|
136
|
+
async history(url, workspace, record, options) {
|
|
137
|
+
try {
|
|
138
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
139
|
+
const token = await getValidToken(baseUrl);
|
|
140
|
+
const limit = options.limit !== undefined ? Number(options.limit) : undefined;
|
|
141
|
+
const page = await recordAudit(baseUrl, repo, workspace, record, { token }, {
|
|
142
|
+
...(limit !== undefined && Number.isFinite(limit) ? { limit } : {}),
|
|
143
|
+
...(options.before !== undefined ? { before: options.before } : {}),
|
|
144
|
+
});
|
|
145
|
+
if (page.entries.length === 0) {
|
|
146
|
+
console.log('No audit entries.');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
for (const entry of page.entries) {
|
|
150
|
+
const source = entry.source.type === 'some' ? entry.source.value : 'api';
|
|
151
|
+
const gone = entry.stateAvailable ? '' : ' [state reclaimed — restore from a backup]';
|
|
152
|
+
console.log(`${fmtWhen(entry.at)} ${entry.commitHash.slice(0, 12)} ${entry.mutation} ${entry.actor} (${source})${gone}`);
|
|
153
|
+
}
|
|
154
|
+
if (page.nextBefore.type === 'some') {
|
|
155
|
+
console.log(`\nMore: --before '${page.nextBefore.value}'`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
exitError(formatError(err));
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
/** e3-cloud records show <repoUrl> <workspace> <record> <commit> [-o file] */
|
|
163
|
+
async show(url, workspace, record, commit, options) {
|
|
164
|
+
try {
|
|
165
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
166
|
+
const token = await getValidToken(baseUrl);
|
|
167
|
+
const commitHash = await resolveCommitHash(baseUrl, repo, workspace, record, commit, token);
|
|
168
|
+
const state = await recordStateAt(baseUrl, repo, workspace, record, commitHash, { token });
|
|
169
|
+
if (options.output !== undefined) {
|
|
170
|
+
// A value too large to answer whole downloads by its segments
|
|
171
|
+
let bytes;
|
|
172
|
+
if (state.kind === 'value') {
|
|
173
|
+
writeFileSync(options.output, state.data);
|
|
174
|
+
bytes = state.data.byteLength;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
bytes = await writeChunks(options.output, await recordValueChunks(baseUrl, repo, variant('manifest', state.manifest), { token }));
|
|
178
|
+
}
|
|
179
|
+
console.log(`Wrote ${bytes} bytes (beast2) to ${options.output}`);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (state.kind === 'value') {
|
|
183
|
+
printValue(state.data);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const page = await recordStatePage(baseUrl, repo, workspace, record, commitHash, { offset: 0, limit: SHOW_ROWS }, { token });
|
|
187
|
+
printValue(page.data);
|
|
188
|
+
console.error(`(the first ${page.count} of ${state.rows} rows; -o <file> writes the whole value)`);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
exitError(formatError(err));
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
/** e3-cloud records rollback <repoUrl> <workspace> <record> <commit> [--expect-head h] [--yes] */
|
|
195
|
+
async rollback(url, workspace, record, commit, options) {
|
|
196
|
+
try {
|
|
197
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
198
|
+
const token = await getValidToken(baseUrl);
|
|
199
|
+
const commitHash = await resolveCommitHash(baseUrl, repo, workspace, record, commit, token);
|
|
200
|
+
if (!options.yes) {
|
|
201
|
+
const ok = await confirm(`Roll '${record}' back to ${commitHash.slice(0, 12)}? History is preserved (a $rollback commit is appended) and downstream tasks re-run.`);
|
|
202
|
+
if (!ok)
|
|
203
|
+
exitError('Aborted.');
|
|
204
|
+
}
|
|
205
|
+
const result = await rollbackRecord(baseUrl, repo, workspace, record, {
|
|
206
|
+
targetCommitHash: commitHash,
|
|
207
|
+
expectedHead: options.expectHead !== undefined ? some(options.expectHead) : none,
|
|
208
|
+
}, { token }, SOURCE);
|
|
209
|
+
reportOutcome('Rollback', result);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
exitError(formatError(err));
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
/** e3-cloud records backup <repoUrl> <workspace> <record> [--note text] */
|
|
216
|
+
async backup(url, workspace, record, options) {
|
|
217
|
+
try {
|
|
218
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
219
|
+
const token = await getValidToken(baseUrl);
|
|
220
|
+
const info = await createRecordBackup(baseUrl, repo, workspace, record, {
|
|
221
|
+
...(options.note !== undefined ? { note: options.note } : {}),
|
|
222
|
+
}, { token }, SOURCE);
|
|
223
|
+
console.log(`Backup ${info.id} created (head ${info.commitHash.slice(0, 12)}, state ${info.stateHash.slice(0, 12)})`);
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
exitError(formatError(err));
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
/** e3-cloud records backups <repoUrl> <workspace> <record> */
|
|
230
|
+
async backups(url, workspace, record) {
|
|
231
|
+
try {
|
|
232
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
233
|
+
const token = await getValidToken(baseUrl);
|
|
234
|
+
const backups = await listRecordBackups(baseUrl, repo, workspace, record, { token });
|
|
235
|
+
if (backups.length === 0) {
|
|
236
|
+
console.log('No backups.');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
for (const backup of backups) {
|
|
240
|
+
const note = backup.note.type === 'some' ? ` "${backup.note.value}"` : '';
|
|
241
|
+
const auto = backup.auto ? ' [auto]' : '';
|
|
242
|
+
const migrations = backup.migrations.length > 0 ? ` migrations ${backup.migrations.join(', ')}` : '';
|
|
243
|
+
console.log(`${backup.id} head ${backup.commitHash.slice(0, 12)}${migrations} by ${backup.actor}${auto}${note}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
exitError(formatError(err));
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
/** e3-cloud records restore <repoUrl> <workspace> <record> <backupId> [--expect-head h] [--yes] */
|
|
251
|
+
async restore(url, workspace, record, id, options) {
|
|
252
|
+
try {
|
|
253
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
254
|
+
const token = await getValidToken(baseUrl);
|
|
255
|
+
if (!options.yes) {
|
|
256
|
+
const ok = await confirm(`Restore '${record}' from backup ${id}? A $restore commit is appended (history preserved) and downstream tasks re-run.`);
|
|
257
|
+
if (!ok)
|
|
258
|
+
exitError('Aborted.');
|
|
259
|
+
}
|
|
260
|
+
const result = await restoreRecordBackup(baseUrl, repo, workspace, record, id, {
|
|
261
|
+
expectedHead: options.expectHead !== undefined ? some(options.expectHead) : none,
|
|
262
|
+
}, { token }, SOURCE);
|
|
263
|
+
reportOutcome('Restore', result);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
exitError(formatError(err));
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
/** e3-cloud records backup-pull <repoUrl> <workspace> <record> <backupId> -o <file> */
|
|
270
|
+
async backupPull(url, workspace, record, id, options) {
|
|
271
|
+
try {
|
|
272
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
273
|
+
const token = await getValidToken(baseUrl);
|
|
274
|
+
// The record's value, downloaded by segments: a plain beast2 value file
|
|
275
|
+
const { chunks } = await recordBackupStream(baseUrl, repo, workspace, record, id, { token });
|
|
276
|
+
const bytes = await writeChunks(options.output, chunks);
|
|
277
|
+
console.log(`Wrote ${bytes} bytes (beast2) to ${options.output}`);
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
exitError(formatError(err));
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
/** e3-cloud records backup-rm <repoUrl> <workspace> <record> <backupId> [--yes] */
|
|
284
|
+
async backupRm(url, workspace, record, id, options) {
|
|
285
|
+
try {
|
|
286
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
287
|
+
const token = await getValidToken(baseUrl);
|
|
288
|
+
if (!options.yes) {
|
|
289
|
+
const ok = await confirm(`Delete backup ${id} of '${record}'? This cannot be undone.`);
|
|
290
|
+
if (!ok)
|
|
291
|
+
exitError('Aborted.');
|
|
292
|
+
}
|
|
293
|
+
await deleteRecordBackup(baseUrl, repo, workspace, record, id, { token });
|
|
294
|
+
console.log(`Deleted backup ${id}`);
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
exitError(formatError(err));
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
//# sourceMappingURL=records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/commands/records.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Releases:
|
|
7
|
+
*
|
|
8
|
+
* - `e3-cloud release <repo-url> <from> <to> [--plan] [--carry <path...>] [--remove-apps]`
|
|
9
|
+
* - `e3-cloud rollback <repo-url> <workspace> [<history-id>] [--plan]`
|
|
10
|
+
* - `e3-cloud history <repo-url> <workspace> [--limit <n>]`
|
|
11
|
+
*
|
|
12
|
+
* A release and a rollback print their plan first, always; `--plan` stops
|
|
13
|
+
* there. One that deploys its package waits for its deploy job. A workspace
|
|
14
|
+
* is released to only by its staging (`e3-cloud staging`);
|
|
15
|
+
* the plan names any change an admin forced onto it since its last release,
|
|
16
|
+
* which the release undoes.
|
|
17
|
+
*/
|
|
18
|
+
import { type ReleasePlan, type WorkspaceHistoryEntry } from '@elaraai/e3-cloud-client';
|
|
19
|
+
/** What a plan does, a line for each part. */
|
|
20
|
+
export declare function planLines(plan: ReleasePlan): string[];
|
|
21
|
+
/** What an entry of a workspace's history did, in a few words. */
|
|
22
|
+
export declare function entryKindWords(kind: WorkspaceHistoryEntry['kind']): string;
|
|
23
|
+
export declare const releaseCommand: {
|
|
24
|
+
/** e3-cloud release <repoUrl> <from> <to> [--plan] [--carry <path...>] [--remove-apps] */
|
|
25
|
+
release(url: string, from: string, to: string, options: {
|
|
26
|
+
plan?: boolean;
|
|
27
|
+
carry?: string[];
|
|
28
|
+
removeApps?: boolean;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
/** e3-cloud rollback <repoUrl> <workspace> [historyId] [--plan] */
|
|
31
|
+
rollback(url: string, workspace: string, id: string | undefined, options: {
|
|
32
|
+
plan?: boolean;
|
|
33
|
+
}): Promise<void>;
|
|
34
|
+
/** e3-cloud history <repoUrl> <workspace> [--limit <n>] */
|
|
35
|
+
history(url: string, workspace: string, options: {
|
|
36
|
+
limit?: string;
|
|
37
|
+
}): Promise<void>;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/commands/release.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;GAYG;AAEH,OAAO,EAML,KAAK,WAAW,EAEhB,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAoBlC,8CAA8C;AAC9C,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CA0DrD;AAoDD,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,GAAG,MAAM,CAW1E;AAWD,eAAO,MAAM,cAAc;IACzB,0FAA0F;iBACvE,MAAM,QAAQ,MAAM,MAAM,MAAM,WAAW;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxI,mEAAmE;kBAC/C,MAAM,aAAa,MAAM,MAAM,MAAM,GAAG,SAAS,WAAW;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlH,2DAA2D;iBACxC,MAAM,aAAa,MAAM,WAAW;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAiB1F,CAAC"}
|