crewly 1.20.303 → 1.20.304
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/config/skills/orchestrator/move-team/SKILL.md +53 -0
- package/config/skills/orchestrator/move-team/execute.sh +42 -0
- package/dist/backend/backend/src/constants.d.ts +69 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +69 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts +45 -0
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.js +214 -0
- package/dist/backend/backend/src/controllers/team-move/team-move.controller.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +22 -3
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +3 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +18 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +16 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +19 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +46 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +25 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +41 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts +122 -0
- package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-archive.js +202 -0
- package/dist/backend/backend/src/services/team-move/team-move-archive.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +59 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.js +133 -0
- package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts +102 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js +217 -0
- package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts +102 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.js +348 -0
- package/dist/backend/backend/src/services/team-move/team-move-crypto.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts +209 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.js +504 -0
- package/dist/backend/backend/src/services/team-move/team-move-driver.service.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +156 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js +462 -0
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts +157 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.js +298 -0
- package/dist/backend/backend/src/services/team-move/team-move-fs.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.d.ts +69 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.js +198 -0
- package/dist/backend/backend/src/services/team-move/team-move-git.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +121 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.js +462 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts +110 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.js +198 -0
- package/dist/backend/backend/src/services/team-move/team-move-journal.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts +71 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.js +102 -0
- package/dist/backend/backend/src/services/team-move/team-move-preflight.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts +29 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js +173 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts +50 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js +96 -0
- package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.d.ts +94 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.js +124 -0
- package/dist/backend/backend/src/services/team-move/team-move-select.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts +46 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.js +202 -0
- package/dist/backend/backend/src/services/team-move/team-move.fixture.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +269 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.js +44 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +69 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +69 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +18 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +16 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +19 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +46 -0
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +25 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +41 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/cli/src/commands/team-move.d.ts +68 -0
- package/dist/cli/cli/src/commands/team-move.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/team-move.js +155 -0
- package/dist/cli/cli/src/commands/team-move.js.map +1 -0
- package/dist/cli/cli/src/index.js +33 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud client of the team move: the REST calls of the shared contract
|
|
3
|
+
* (`<cloud>/api/cloud/team-moves`). The machine authenticates with the same
|
|
4
|
+
* account token it uses for every other Cloud call; Cloud answers an instance
|
|
5
|
+
* only about moves of its own account and machine.
|
|
6
|
+
*
|
|
7
|
+
* @module services/team-move/team-move-cloud.client
|
|
8
|
+
*/
|
|
9
|
+
import { createWriteStream } from 'node:fs';
|
|
10
|
+
import * as fs from 'node:fs/promises';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
import { Readable } from 'node:stream';
|
|
13
|
+
import { pipeline } from 'node:stream/promises';
|
|
14
|
+
import { TEAM_MOVE_CONSTANTS } from '../../constants.js';
|
|
15
|
+
const C = TEAM_MOVE_CONSTANTS;
|
|
16
|
+
/** An error answer from Cloud (or no answer at all). */
|
|
17
|
+
export class TeamMoveCloudError extends Error {
|
|
18
|
+
status;
|
|
19
|
+
code;
|
|
20
|
+
constructor(message, status, code) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.status = status;
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.name = 'TeamMoveCloudError';
|
|
25
|
+
}
|
|
26
|
+
/** Worth trying again: the network, a server error, rate limiting. */
|
|
27
|
+
get retryable() {
|
|
28
|
+
return this.status === 0 || this.status === 429 || this.status >= 500;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Client for the team-move endpoints. */
|
|
32
|
+
export class TeamMoveCloudClient {
|
|
33
|
+
options;
|
|
34
|
+
fetchImpl;
|
|
35
|
+
sleep;
|
|
36
|
+
retryBaseMs;
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.options = options;
|
|
39
|
+
this.fetchImpl = options.fetchImpl ?? ((input, init) => fetch(input, init));
|
|
40
|
+
this.sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
41
|
+
this.retryBaseMs = options.retryBaseMs ?? C.RETRY_BASE_MS;
|
|
42
|
+
}
|
|
43
|
+
/** Whether the machine is signed in to Cloud. */
|
|
44
|
+
isConnected() {
|
|
45
|
+
return !!this.options.session.getToken() && !!this.options.session.getCloudUrl();
|
|
46
|
+
}
|
|
47
|
+
url(suffix) {
|
|
48
|
+
const base = this.options.session.getCloudUrl();
|
|
49
|
+
if (!base)
|
|
50
|
+
throw new TeamMoveCloudError('Not signed in to Crewly Cloud', 401, 'not_logged_in');
|
|
51
|
+
return `${base.replace(/\/$/, '')}${C.CLOUD_PATH}${suffix}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* One authenticated request with a token refresh on 401 and retries on
|
|
55
|
+
* network and 5xx errors.
|
|
56
|
+
*/
|
|
57
|
+
async request(method, suffix, init = {}) {
|
|
58
|
+
const retries = init.retries ?? C.CHUNK_RETRIES;
|
|
59
|
+
let refreshed = false;
|
|
60
|
+
let lastError = new TeamMoveCloudError('request failed', 0);
|
|
61
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
62
|
+
if (attempt > 0)
|
|
63
|
+
await this.sleep(this.retryBaseMs * 2 ** (attempt - 1));
|
|
64
|
+
const token = this.options.session.getToken();
|
|
65
|
+
if (!token)
|
|
66
|
+
throw new TeamMoveCloudError('Not signed in to Crewly Cloud', 401, 'not_logged_in');
|
|
67
|
+
const instanceId = await this.options.getInstanceId();
|
|
68
|
+
let response;
|
|
69
|
+
try {
|
|
70
|
+
response = await this.fetchImpl(this.url(suffix), {
|
|
71
|
+
method,
|
|
72
|
+
headers: {
|
|
73
|
+
Authorization: `Bearer ${token}`,
|
|
74
|
+
'X-Crewly-Instance-Id': instanceId,
|
|
75
|
+
...(init.json !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
76
|
+
...(init.headers ?? {}),
|
|
77
|
+
},
|
|
78
|
+
body: init.json !== undefined ? JSON.stringify(init.json) : init.body,
|
|
79
|
+
signal: AbortSignal.timeout(C.REQUEST_TIMEOUT_MS),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
lastError = new TeamMoveCloudError(`Cloud unreachable: ${error instanceof Error ? error.message : String(error)}`, 0);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (response.status === 401 && !refreshed && this.options.session.tryRefreshToken) {
|
|
87
|
+
refreshed = true;
|
|
88
|
+
if (await this.options.session.tryRefreshToken().catch(() => false)) {
|
|
89
|
+
attempt--; // the retry with the fresh token is free
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (response.ok || response.status === 206)
|
|
94
|
+
return response;
|
|
95
|
+
lastError = await this.errorFrom(response);
|
|
96
|
+
if (!lastError.retryable)
|
|
97
|
+
throw lastError;
|
|
98
|
+
}
|
|
99
|
+
throw lastError;
|
|
100
|
+
}
|
|
101
|
+
async errorFrom(response) {
|
|
102
|
+
let message = `Cloud request failed (HTTP ${response.status})`;
|
|
103
|
+
if (response.status === 503)
|
|
104
|
+
message = 'Crewly Cloud has no storage for team moves yet (storage_unavailable); try again later';
|
|
105
|
+
let code;
|
|
106
|
+
try {
|
|
107
|
+
const body = (await response.json());
|
|
108
|
+
if (typeof body['error'] === 'string' && response.status !== 503)
|
|
109
|
+
message = body['error'];
|
|
110
|
+
if (typeof body['code'] === 'string')
|
|
111
|
+
code = body['code'];
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
/* non-JSON body */
|
|
115
|
+
}
|
|
116
|
+
return new TeamMoveCloudError(message, response.status, code);
|
|
117
|
+
}
|
|
118
|
+
/** Cloud wraps answers in `{success, data}`; accept both shapes. */
|
|
119
|
+
async data(response) {
|
|
120
|
+
const body = (await response.json().catch(() => ({})));
|
|
121
|
+
return (body['data'] !== undefined ? body['data'] : body);
|
|
122
|
+
}
|
|
123
|
+
/** The caller's moves, newest first. An instance sees what it has to do (`role`/`action`). */
|
|
124
|
+
async list() {
|
|
125
|
+
const instanceId = encodeURIComponent(await this.options.getInstanceId());
|
|
126
|
+
const data = await this.data(await this.request('GET', `?instanceId=${instanceId}`));
|
|
127
|
+
const list = Array.isArray(data) ? data : data?.['moves'];
|
|
128
|
+
return Array.isArray(list) ? list : [];
|
|
129
|
+
}
|
|
130
|
+
/** One move. */
|
|
131
|
+
async get(moveId) {
|
|
132
|
+
return this.data(await this.request('GET', `/${encodeURIComponent(moveId)}`));
|
|
133
|
+
}
|
|
134
|
+
/** Ask Cloud to start a move (the owner path, or an instance acting for the owner). */
|
|
135
|
+
async create(body) {
|
|
136
|
+
const data = await this.data(await this.request('POST', '', { json: body, retries: 1, headers: { 'X-Crewly-Acting-For': 'owner', 'X-Crewly-Acting-For-Role': 'owner' } }));
|
|
137
|
+
const moveId = typeof data['moveId'] === 'string' ? data['moveId'] : null;
|
|
138
|
+
if (!moveId)
|
|
139
|
+
throw new TeamMoveCloudError('Cloud did not return a move id', 502);
|
|
140
|
+
return { moveId };
|
|
141
|
+
}
|
|
142
|
+
/** Target: publish the per-move public key and preflight. */
|
|
143
|
+
async postTargetKey(moveId, body) {
|
|
144
|
+
await this.request('POST', `/${encodeURIComponent(moveId)}/target-key`, { json: body });
|
|
145
|
+
}
|
|
146
|
+
/** Source: announce the ciphertext. */
|
|
147
|
+
async packageInit(moveId, body) {
|
|
148
|
+
const data = await this.data(await this.request('POST', `/${encodeURIComponent(moveId)}/package/init`, { json: body }));
|
|
149
|
+
return {
|
|
150
|
+
uploadId: typeof data['uploadId'] === 'string' ? data['uploadId'] : '',
|
|
151
|
+
received: Array.isArray(data['received']) ? data['received'] : [],
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/** Source: upload one ciphertext chunk (0-based). */
|
|
155
|
+
async putChunk(moveId, n, chunk) {
|
|
156
|
+
await this.request('PUT', `/${encodeURIComponent(moveId)}/package/chunks/${n}`, {
|
|
157
|
+
body: new Uint8Array(chunk),
|
|
158
|
+
headers: { 'Content-Type': 'application/octet-stream' },
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/** Source: all chunks are up. */
|
|
162
|
+
async packageComplete(moveId) {
|
|
163
|
+
await this.request('POST', `/${encodeURIComponent(moveId)}/package/complete`, { json: {} });
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Target: download the ciphertext, resuming a partial file with `Range`.
|
|
167
|
+
*
|
|
168
|
+
* @param moveId - Move id
|
|
169
|
+
* @param dest - File to write (kept between attempts)
|
|
170
|
+
* @param totalSize - Expected size from the package metadata
|
|
171
|
+
* @returns Final size
|
|
172
|
+
*/
|
|
173
|
+
async downloadPackage(moveId, dest, totalSize) {
|
|
174
|
+
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
175
|
+
for (let pass = 0; pass < C.CHUNK_RETRIES + 1; pass++) {
|
|
176
|
+
const have = (await fs.stat(dest).catch(() => null))?.size ?? 0;
|
|
177
|
+
if (have === totalSize)
|
|
178
|
+
return have;
|
|
179
|
+
if (have > totalSize)
|
|
180
|
+
await fs.rm(dest, { force: true });
|
|
181
|
+
const from = have > totalSize ? 0 : have;
|
|
182
|
+
let response;
|
|
183
|
+
try {
|
|
184
|
+
response = await this.request('GET', `/${encodeURIComponent(moveId)}/package`, { headers: from > 0 ? { Range: `bytes=${from}-` } : {} });
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (pass >= C.CHUNK_RETRIES || !(error instanceof TeamMoveCloudError && error.retryable))
|
|
188
|
+
throw error;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (!response.body)
|
|
192
|
+
throw new TeamMoveCloudError('Cloud sent an empty package', 502);
|
|
193
|
+
// 200 to a Range request means "the whole thing": start over.
|
|
194
|
+
const append = response.status === 206 && from > 0;
|
|
195
|
+
try {
|
|
196
|
+
await pipeline(Readable.fromWeb(response.body), createWriteStream(dest, { flags: append ? 'a' : 'w', mode: 0o600 }));
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// A dropped connection leaves a partial file; the next pass continues from it.
|
|
200
|
+
await this.sleep(this.retryBaseMs);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const final = (await fs.stat(dest).catch(() => null))?.size ?? 0;
|
|
204
|
+
if (final !== totalSize)
|
|
205
|
+
throw new TeamMoveCloudError(`Package download incomplete (${final} of ${totalSize} bytes)`, 0);
|
|
206
|
+
return final;
|
|
207
|
+
}
|
|
208
|
+
/** Report a status. */
|
|
209
|
+
async postStatus(moveId, body) {
|
|
210
|
+
await this.request('POST', `/${encodeURIComponent(moveId)}/status`, { json: body });
|
|
211
|
+
}
|
|
212
|
+
/** Owner: roll the move back. */
|
|
213
|
+
async rollback(moveId) {
|
|
214
|
+
await this.request('POST', `/${encodeURIComponent(moveId)}/rollback`, { json: {}, retries: 1 });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=team-move-cloud.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-cloud.client.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-cloud.client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team move crypto — end-to-end encryption of the package stream.
|
|
3
|
+
*
|
|
4
|
+
* Only the two machines can read a package; Crewly Cloud stores ciphertext.
|
|
5
|
+
*
|
|
6
|
+
* - The TARGET makes an ephemeral X25519 key pair per move. The public key
|
|
7
|
+
* goes to Cloud, the private key never leaves the target's
|
|
8
|
+
* `~/.crewly/team-moves/<moveId>/`.
|
|
9
|
+
* - The SOURCE makes an ephemeral X25519 key pair per package, derives a
|
|
10
|
+
* shared secret with the target's public key and runs it through
|
|
11
|
+
* HKDF-SHA256 (random 32-byte salt, `info` binds the move id) to get a
|
|
12
|
+
* one-time AES-256 key.
|
|
13
|
+
* - The stream is cut into frames of `frameBytes` plaintext. Each frame is
|
|
14
|
+
* sealed with AES-256-GCM under its own nonce (frame counter). The
|
|
15
|
+
* authenticated data of every frame is the header (which carries the move
|
|
16
|
+
* id and the ephemeral public key), the frame counter and a "final" flag,
|
|
17
|
+
* so a frame cannot be moved, dropped, repeated or cut off at the end, and
|
|
18
|
+
* a package cannot be replayed into another move, without failing.
|
|
19
|
+
*
|
|
20
|
+
* Wire format:
|
|
21
|
+
*
|
|
22
|
+
* header : "CTMV" | version u8 | frameBytes u32 | ephemeralPublicKey[32]
|
|
23
|
+
* | salt[32] | moveIdLength u8 | moveId
|
|
24
|
+
* frame* : length u32 (ciphertext incl. 16-byte tag) | ciphertext
|
|
25
|
+
*
|
|
26
|
+
* The one-time key makes counter nonces safe: a (key, nonce) pair is never
|
|
27
|
+
* used twice. Both transforms are streaming — memory stays at one frame.
|
|
28
|
+
*
|
|
29
|
+
* @module services/team-move/team-move-crypto
|
|
30
|
+
*/
|
|
31
|
+
import { Transform } from 'node:stream';
|
|
32
|
+
/** An X25519 key pair for the target of a move. */
|
|
33
|
+
export interface TargetKeyPair {
|
|
34
|
+
/** Base64 of the raw 32-byte public key — what Cloud receives. */
|
|
35
|
+
publicKey: string;
|
|
36
|
+
/** Base64 of the PKCS8 DER private key — kept on the target only. */
|
|
37
|
+
privateKey: string;
|
|
38
|
+
}
|
|
39
|
+
/** Thrown when a package cannot be decrypted or has been altered. */
|
|
40
|
+
export declare class TeamMoveCryptoError extends Error {
|
|
41
|
+
constructor(message: string);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Make the target's ephemeral key pair for one move.
|
|
45
|
+
*
|
|
46
|
+
* @returns Base64 public (raw) and private (PKCS8) keys
|
|
47
|
+
*/
|
|
48
|
+
export declare function generateTargetKeyPair(): TargetKeyPair;
|
|
49
|
+
/**
|
|
50
|
+
* Whether a string is a base64 raw X25519 public key (as Cloud validates it).
|
|
51
|
+
*
|
|
52
|
+
* @param value - Candidate
|
|
53
|
+
* @returns True for 32 bytes of base64
|
|
54
|
+
*/
|
|
55
|
+
export declare function isPublicKeyString(value: unknown): value is string;
|
|
56
|
+
/** Options of {@link createEncryptStream}. */
|
|
57
|
+
export interface EncryptStreamOptions {
|
|
58
|
+
/** Base64 raw X25519 public key of the target. */
|
|
59
|
+
recipientPublicKey: string;
|
|
60
|
+
/** Move id, bound into the key and the header. */
|
|
61
|
+
moveId: string;
|
|
62
|
+
/** Plaintext bytes per frame (default {@link TEAM_MOVE_CONSTANTS.CRYPTO_FRAME_BYTES}). */
|
|
63
|
+
frameBytes?: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Transform that encrypts a byte stream for the target of a move.
|
|
67
|
+
*
|
|
68
|
+
* @param options - Recipient key, move id, frame size
|
|
69
|
+
* @returns A Transform (plaintext in, package out)
|
|
70
|
+
* @throws TeamMoveCryptoError for an invalid recipient key or move id
|
|
71
|
+
*/
|
|
72
|
+
export declare function createEncryptStream(options: EncryptStreamOptions): Transform;
|
|
73
|
+
/** Options of {@link createDecryptStream}. */
|
|
74
|
+
export interface DecryptStreamOptions {
|
|
75
|
+
/** Base64 PKCS8 private key of the target. */
|
|
76
|
+
privateKey: string;
|
|
77
|
+
/** The move id this package must belong to. */
|
|
78
|
+
moveId: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Transform that decrypts a package on the target. Fails with
|
|
82
|
+
* {@link TeamMoveCryptoError} on any altered, truncated, reordered or
|
|
83
|
+
* foreign-move package.
|
|
84
|
+
*
|
|
85
|
+
* @param options - Target private key and expected move id
|
|
86
|
+
* @returns A Transform (package in, plaintext out)
|
|
87
|
+
*/
|
|
88
|
+
export declare function createDecryptStream(options: DecryptStreamOptions): Transform;
|
|
89
|
+
/** A pass-through Transform that hashes and counts what flows through it. */
|
|
90
|
+
export interface HashTap extends Transform {
|
|
91
|
+
/** Finish and return the hex SHA-256 (call after the stream ended). */
|
|
92
|
+
digest(): string;
|
|
93
|
+
/** Bytes seen so far. */
|
|
94
|
+
readonly bytes: number;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Pass-through stream computing SHA-256 and size of its data.
|
|
98
|
+
*
|
|
99
|
+
* @returns The tap
|
|
100
|
+
*/
|
|
101
|
+
export declare function createHashTap(): HashTap;
|
|
102
|
+
//# sourceMappingURL=team-move-crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-move-crypto.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAcH,OAAO,EAAE,SAAS,EAA0B,MAAM,aAAa,CAAC;AAoBhE,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qEAAqE;AACrE,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,aAAa,CAMrD;AAwBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEjE;AA2CD,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAqE5E;AAED,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CA4F5E;AAED,6EAA6E;AAC7E,MAAM,WAAW,OAAQ,SAAQ,SAAS;IACxC,uEAAuE;IACvE,MAAM,IAAI,MAAM,CAAC;IACjB,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAavC"}
|