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.
Files changed (135) hide show
  1. package/config/skills/orchestrator/move-team/SKILL.md +53 -0
  2. package/config/skills/orchestrator/move-team/execute.sh +42 -0
  3. package/dist/backend/backend/src/constants.d.ts +69 -0
  4. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  5. package/dist/backend/backend/src/constants.js +69 -0
  6. package/dist/backend/backend/src/constants.js.map +1 -1
  7. package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts +45 -0
  8. package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts.map +1 -0
  9. package/dist/backend/backend/src/controllers/team-move/team-move.controller.js +214 -0
  10. package/dist/backend/backend/src/controllers/team-move/team-move.controller.js.map +1 -0
  11. package/dist/backend/backend/src/index.d.ts.map +1 -1
  12. package/dist/backend/backend/src/index.js +22 -3
  13. package/dist/backend/backend/src/index.js.map +1 -1
  14. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  15. package/dist/backend/backend/src/routes/api.routes.js +3 -0
  16. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  17. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  18. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  19. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
  20. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  21. package/dist/backend/backend/src/services/core/storage.service.d.ts +18 -0
  22. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  23. package/dist/backend/backend/src/services/core/storage.service.js +16 -0
  24. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  25. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +19 -0
  26. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/decisions/decision.service.js +46 -0
  28. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  29. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
  31. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  32. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  33. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  34. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +25 -0
  35. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  36. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  37. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  38. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +41 -0
  39. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  40. package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts +122 -0
  41. package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts.map +1 -0
  42. package/dist/backend/backend/src/services/team-move/team-move-archive.js +202 -0
  43. package/dist/backend/backend/src/services/team-move/team-move-archive.js.map +1 -0
  44. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +59 -0
  45. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -0
  46. package/dist/backend/backend/src/services/team-move/team-move-chat.js +133 -0
  47. package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -0
  48. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts +102 -0
  49. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts.map +1 -0
  50. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js +217 -0
  51. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js.map +1 -0
  52. package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts +102 -0
  53. package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts.map +1 -0
  54. package/dist/backend/backend/src/services/team-move/team-move-crypto.js +348 -0
  55. package/dist/backend/backend/src/services/team-move/team-move-crypto.js.map +1 -0
  56. package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts +209 -0
  57. package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/team-move/team-move-driver.service.js +504 -0
  59. package/dist/backend/backend/src/services/team-move/team-move-driver.service.js.map +1 -0
  60. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +156 -0
  61. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -0
  62. package/dist/backend/backend/src/services/team-move/team-move-exporter.js +462 -0
  63. package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -0
  64. package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts +157 -0
  65. package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts.map +1 -0
  66. package/dist/backend/backend/src/services/team-move/team-move-fs.js +298 -0
  67. package/dist/backend/backend/src/services/team-move/team-move-fs.js.map +1 -0
  68. package/dist/backend/backend/src/services/team-move/team-move-git.d.ts +69 -0
  69. package/dist/backend/backend/src/services/team-move/team-move-git.d.ts.map +1 -0
  70. package/dist/backend/backend/src/services/team-move/team-move-git.js +198 -0
  71. package/dist/backend/backend/src/services/team-move/team-move-git.js.map +1 -0
  72. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +121 -0
  73. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -0
  74. package/dist/backend/backend/src/services/team-move/team-move-importer.js +462 -0
  75. package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -0
  76. package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts +110 -0
  77. package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts.map +1 -0
  78. package/dist/backend/backend/src/services/team-move/team-move-journal.js +198 -0
  79. package/dist/backend/backend/src/services/team-move/team-move-journal.js.map +1 -0
  80. package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts +71 -0
  81. package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/team-move/team-move-preflight.js +102 -0
  83. package/dist/backend/backend/src/services/team-move/team-move-preflight.js.map +1 -0
  84. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts +29 -0
  85. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -0
  86. package/dist/backend/backend/src/services/team-move/team-move-runtime.js +173 -0
  87. package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -0
  88. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts +50 -0
  89. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts.map +1 -0
  90. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js +96 -0
  91. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js.map +1 -0
  92. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts +94 -0
  93. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/team-move/team-move-select.js +124 -0
  95. package/dist/backend/backend/src/services/team-move/team-move-select.js.map +1 -0
  96. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts +46 -0
  97. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/team-move/team-move.fixture.js +202 -0
  99. package/dist/backend/backend/src/services/team-move/team-move.fixture.js.map +1 -0
  100. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +269 -0
  101. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/team-move/team-move.types.js +44 -0
  103. package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -0
  104. package/dist/backend/build-info.json +2 -2
  105. package/dist/cli/backend/src/constants.d.ts +69 -0
  106. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  107. package/dist/cli/backend/src/constants.js +69 -0
  108. package/dist/cli/backend/src/constants.js.map +1 -1
  109. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  110. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  111. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
  112. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  113. package/dist/cli/backend/src/services/core/storage.service.d.ts +18 -0
  114. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  115. package/dist/cli/backend/src/services/core/storage.service.js +16 -0
  116. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  117. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +19 -0
  118. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  119. package/dist/cli/backend/src/services/decisions/decision.service.js +46 -0
  120. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  121. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  122. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  123. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +25 -0
  124. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  125. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  126. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  127. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +41 -0
  128. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  129. package/dist/cli/cli/src/commands/team-move.d.ts +68 -0
  130. package/dist/cli/cli/src/commands/team-move.d.ts.map +1 -0
  131. package/dist/cli/cli/src/commands/team-move.js +155 -0
  132. package/dist/cli/cli/src/commands/team-move.js.map +1 -0
  133. package/dist/cli/cli/src/index.js +33 -0
  134. package/dist/cli/cli/src/index.js.map +1 -1
  135. package/package.json +1 -1
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Team move driver — the machine side of the Cloud protocol.
3
+ *
4
+ * Cloud tells a machine what to do with a `team_move` relay push
5
+ * (`{moveId, role, action}`); the push is only a hint, the driver fetches the
6
+ * move from Cloud and acts on what Cloud says. The same list is read at boot
7
+ * and every few minutes, so a machine that was offline when the push went out
8
+ * picks the move up when it returns. Every action is idempotent (journaled
9
+ * steps, resumable upload/download), so a repeated push or a restart in the
10
+ * middle is harmless.
11
+ *
12
+ * target prepare -> make the per-move key, preflight, publish the key
13
+ * source package -> collect, scan, encrypt, upload
14
+ * target import -> download, decrypt, import, start, report `imported`
15
+ * source stop_archive -> stop the team, archive it, report `source_stopped`
16
+ * either rollback -> source: restore + start (`source_restored`);
17
+ * target: stop + archive its copy (`target_stopped`).
18
+ * Also "abort and clean up" after a failure.
19
+ *
20
+ * Starting the driver advertises the `teamMove:1` capability to Cloud.
21
+ *
22
+ * @module services/team-move/team-move-driver.service
23
+ */
24
+ import * as fs from 'node:fs/promises';
25
+ import * as path from 'node:path';
26
+ import { TEAM_MOVE_CONSTANTS } from '../../constants.js';
27
+ import { LoggerService } from '../core/logger.service.js';
28
+ import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
29
+ import { TeamMoveCloudError } from './team-move-cloud.client.js';
30
+ import { generateTargetKeyPair, isPublicKeyString } from './team-move-crypto.js';
31
+ import { TeamMoveBlockedError, buildEncryptedPackage } from './team-move-exporter.js';
32
+ import { TeamMoveImportError } from './team-move-importer.js';
33
+ import { MoveJournal, isMoveId, moveDirFor } from './team-move-journal.js';
34
+ import { hasRoomFor } from './team-move-preflight.js';
35
+ import { TeamMoveSecretScanError } from './team-move-secret-scan.js';
36
+ const C = TEAM_MOVE_CONSTANTS;
37
+ /** Longest error text Cloud keeps. */
38
+ const MAX_ERROR_CHARS = 500;
39
+ /** How long the source waits for the team to go quiet before packaging. */
40
+ const IDLE_WAIT_MS = 10 * 60 * 1000;
41
+ /** How often the idle wait looks. */
42
+ const IDLE_POLL_MS = 15 * 1000;
43
+ let active = false;
44
+ let instance = null;
45
+ /**
46
+ * Install the process-wide driver (composition root).
47
+ *
48
+ * @param driver - The driver or null
49
+ */
50
+ export function setTeamMoveDriver(driver) {
51
+ instance = driver;
52
+ }
53
+ /**
54
+ * The process-wide driver, or null before boot wired it.
55
+ *
56
+ * @returns The driver or null
57
+ */
58
+ export function getTeamMoveDriver() {
59
+ return instance;
60
+ }
61
+ /**
62
+ * Whether the driver runs on this machine.
63
+ *
64
+ * @returns True once started
65
+ */
66
+ export function isTeamMoveDriverActive() {
67
+ return active;
68
+ }
69
+ /**
70
+ * Capabilities to advertise to Cloud (heartbeat).
71
+ *
72
+ * @returns `['teamMove:1']` while the driver runs, else `[]`
73
+ */
74
+ export function teamMoveCapabilities() {
75
+ return active ? [C.CAPABILITY] : [];
76
+ }
77
+ /** The driver. */
78
+ export class TeamMoveDriver {
79
+ deps;
80
+ logger;
81
+ home;
82
+ sleep;
83
+ now;
84
+ inFlight = new Map();
85
+ listener = (msg) => {
86
+ void this.handleRelay(msg);
87
+ };
88
+ pollTimer = null;
89
+ bootTimer = null;
90
+ started = false;
91
+ constructor(deps) {
92
+ this.deps = deps;
93
+ this.logger = deps.logger ?? LoggerService.getInstance().createComponentLogger('TeamMoveDriver');
94
+ this.home = deps.home ?? getCrewlyHomePath();
95
+ this.sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
96
+ this.now = deps.now ?? (() => new Date().toISOString());
97
+ }
98
+ /** Listen for pushes, resume pending moves, advertise the capability. Idempotent. */
99
+ start() {
100
+ if (this.started)
101
+ return;
102
+ this.started = true;
103
+ this.deps.source.on('message', this.listener);
104
+ active = true;
105
+ this.bootTimer = setTimeout(() => void this.poll(), C.BOOT_DELAY_MS);
106
+ this.pollTimer = setInterval(() => void this.poll(), C.POLL_INTERVAL_MS);
107
+ this.bootTimer.unref?.();
108
+ this.pollTimer.unref?.();
109
+ this.logger.info('Team move handler started');
110
+ }
111
+ /** Stop listening; the capability is no longer advertised. */
112
+ stop() {
113
+ if (!this.started)
114
+ return;
115
+ this.started = false;
116
+ this.deps.source.off('message', this.listener);
117
+ if (this.pollTimer)
118
+ clearInterval(this.pollTimer);
119
+ if (this.bootTimer)
120
+ clearTimeout(this.bootTimer);
121
+ this.pollTimer = null;
122
+ this.bootTimer = null;
123
+ active = false;
124
+ }
125
+ /**
126
+ * Handle one relay message. Anything but a well-formed `team_move` is ignored.
127
+ *
128
+ * @param msg - Relay message
129
+ * @returns True when it was a team move push that started work
130
+ */
131
+ async handleRelay(msg) {
132
+ if (msg?.type !== C.RELAY_MESSAGE_TYPE)
133
+ return false;
134
+ const data = parseRelayData(msg.payload);
135
+ if (!data) {
136
+ this.logger.warn('Ignored a malformed team_move relay message');
137
+ return false;
138
+ }
139
+ try {
140
+ // The push is a hint: Cloud's own record says what this machine has to do.
141
+ const view = await this.deps.cloud.get(data.moveId);
142
+ await this.dispatch(view, data);
143
+ return true;
144
+ }
145
+ catch (error) {
146
+ this.logger.warn('Could not act on a team_move push', { moveId: data.moveId, error: messageOf(error) });
147
+ return false;
148
+ }
149
+ }
150
+ /** Read this machine's pending moves from Cloud and act on each. */
151
+ async poll() {
152
+ if (!this.deps.cloud.isConnected())
153
+ return 0;
154
+ let views;
155
+ try {
156
+ views = await this.deps.cloud.list();
157
+ }
158
+ catch (error) {
159
+ this.logger.debug('Team move poll failed', { error: messageOf(error) });
160
+ return 0;
161
+ }
162
+ let started = 0;
163
+ for (const view of views) {
164
+ if (!view.role || !view.action || !isMoveId(view.moveId))
165
+ continue;
166
+ void this.dispatch(view, { moveId: view.moveId, role: view.role, action: view.action }).catch(() => undefined);
167
+ started += 1;
168
+ }
169
+ return started;
170
+ }
171
+ /** Run one action (one at a time per move and action). */
172
+ dispatch(view, hint) {
173
+ const role = view.role ?? hint.role;
174
+ const action = view.action ?? hint.action;
175
+ const key = `${view.moveId}:${role}:${action}`;
176
+ const running = this.inFlight.get(key);
177
+ if (running)
178
+ return running;
179
+ const task = this.execute(view, role, action)
180
+ .catch((error) => this.logger.error('Team move action failed', { moveId: view.moveId, role, action, error: messageOf(error) }))
181
+ .finally(() => this.inFlight.delete(key));
182
+ this.inFlight.set(key, task);
183
+ return task;
184
+ }
185
+ async execute(view, role, action) {
186
+ const journal = new MoveJournal(view.moveId, this.home, this.now);
187
+ await journal.writeState({ role, teamId: view.teamId, teamName: view.teamName, action, phase: 'running' });
188
+ try {
189
+ if (action === 'prepare' && role === 'target')
190
+ await this.prepare(view, journal);
191
+ else if (action === 'package' && role === 'source')
192
+ await this.packageAndUpload(view, journal);
193
+ else if (action === 'import' && role === 'target')
194
+ await this.importPackage(view, journal);
195
+ else if (action === 'stop_archive' && role === 'source')
196
+ await this.stopArchive(view);
197
+ else if (action === 'rollback')
198
+ await this.rollback(view, role);
199
+ else
200
+ this.logger.warn('Ignored a team move action that does not fit the role', { moveId: view.moveId, role, action });
201
+ await journal.writeState({ role, phase: 'done' });
202
+ }
203
+ catch (error) {
204
+ await journal.writeState({ role, phase: 'failed', error: messageOf(error) });
205
+ await this.reportFailure(view.moveId, error);
206
+ throw error;
207
+ }
208
+ }
209
+ // -------------------------------------------------------------------------
210
+ // target: prepare
211
+ // -------------------------------------------------------------------------
212
+ async prepare(view, journal) {
213
+ const keyFile = path.join(journal.dir, 'target-key.json');
214
+ let pair = await readKey(keyFile);
215
+ if (!pair) {
216
+ pair = generateTargetKeyPair();
217
+ await journal.ensure();
218
+ await fs.writeFile(keyFile, JSON.stringify(pair), { mode: 0o600 });
219
+ }
220
+ const preflight = await this.deps.preflight();
221
+ await this.deps.cloud.postTargetKey(view.moveId, { publicKey: pair.publicKey, preflight });
222
+ }
223
+ // -------------------------------------------------------------------------
224
+ // source: package + upload
225
+ // -------------------------------------------------------------------------
226
+ async packageAndUpload(view, journal) {
227
+ const fresh = await this.deps.cloud.get(view.moveId);
228
+ if (!isPublicKeyString(fresh.targetPublicKey))
229
+ throw new Error('Cloud has no public key of the target yet');
230
+ const targetKey = fresh.targetPublicKey;
231
+ const intent = await this.readIntent(view.moveId);
232
+ const stagingDir = path.join(journal.dir, 'package-staging');
233
+ const cipherFile = path.join(journal.dir, 'package.enc');
234
+ const built = await journal.run('export', async () => {
235
+ await this.waitForIdle(view.teamId);
236
+ await fs.rm(stagingDir, { recursive: true, force: true });
237
+ const result = await this.deps.exporter.export({
238
+ teamId: view.teamId,
239
+ moveId: view.moveId,
240
+ stagingDir,
241
+ allowDirty: intent.allowDirty,
242
+ skipFlagged: intent.skipFlagged,
243
+ });
244
+ const enc = await buildEncryptedPackage(stagingDir, cipherFile, targetKey, view.moveId);
245
+ await fs.rm(stagingDir, { recursive: true, force: true });
246
+ return { size: enc.size, sha256: enc.sha256, chunks: enc.chunks, summary: result.summary };
247
+ });
248
+ const init = await this.deps.cloud.packageInit(view.moveId, {
249
+ size: built.size,
250
+ sha256: built.sha256,
251
+ chunks: built.chunks,
252
+ manifest: built.summary,
253
+ });
254
+ const have = new Set(init.received);
255
+ const handle = await fs.open(cipherFile, 'r');
256
+ try {
257
+ for (let n = 0; n < built.chunks; n++) {
258
+ if (have.has(n))
259
+ continue;
260
+ const buf = Buffer.alloc(Math.min(C.TRANSFER_CHUNK_BYTES, built.size - n * C.TRANSFER_CHUNK_BYTES));
261
+ await handle.read(buf, 0, buf.length, n * C.TRANSFER_CHUNK_BYTES);
262
+ await this.deps.cloud.putChunk(view.moveId, n, buf);
263
+ }
264
+ }
265
+ finally {
266
+ await handle.close();
267
+ }
268
+ await this.deps.cloud.packageComplete(view.moveId);
269
+ await fs.rm(cipherFile, { force: true });
270
+ }
271
+ async waitForIdle(teamId) {
272
+ const deadline = Date.now() + IDLE_WAIT_MS;
273
+ while (Date.now() < deadline) {
274
+ if (await this.deps.isTeamIdle(teamId).catch(() => true))
275
+ return;
276
+ await this.sleep(IDLE_POLL_MS);
277
+ }
278
+ this.logger.warn('Team still busy after waiting; packaging anyway', { teamId });
279
+ }
280
+ // -------------------------------------------------------------------------
281
+ // target: import
282
+ // -------------------------------------------------------------------------
283
+ async importPackage(view, journal) {
284
+ const fresh = await this.deps.cloud.get(view.moveId);
285
+ const pkg = fresh.package;
286
+ if (!pkg?.size || !pkg.sha256)
287
+ throw new Error('Cloud has no package for this move');
288
+ const key = await readKey(path.join(journal.dir, 'target-key.json'));
289
+ if (!key)
290
+ throw new Error('This machine has no key for the move (prepare did not run here)');
291
+ const preflight = await this.deps.preflight();
292
+ const uncompressed = Number(pkg.manifest?.uncompressedBytes ?? 0);
293
+ if (preflight.freeDiskBytes > 0 && !hasRoomFor(preflight.freeDiskBytes, pkg.size, uncompressed)) {
294
+ throw new TeamMoveImportError('not enough free disk space to import the team', 'no_space');
295
+ }
296
+ const packageFile = path.join(journal.dir, 'package.enc');
297
+ if (!(await journal.isDone('download'))) {
298
+ await this.deps.cloud.postStatus(view.moveId, { status: 'importing' });
299
+ await this.deps.cloud.downloadPackage(view.moveId, packageFile, pkg.size);
300
+ }
301
+ const report = await this.deps.importer().run({ moveId: view.moveId, packageFile, privateKey: key.privateKey, expectedSha256: pkg.sha256 }, journal);
302
+ await this.deps.cloud.postStatus(view.moveId, { status: 'imported', report });
303
+ // The package is applied and its ciphertext deleted; the private key has done its job.
304
+ await fs.rm(path.join(journal.dir, 'target-key.json'), { force: true });
305
+ }
306
+ // -------------------------------------------------------------------------
307
+ // source: stop + archive; rollback
308
+ // -------------------------------------------------------------------------
309
+ async stopArchive(view) {
310
+ await this.deps.archiver.archive(view.moveId, view.teamId);
311
+ await this.deps.cloud.postStatus(view.moveId, { status: 'source_stopped' });
312
+ }
313
+ async rollback(view, role) {
314
+ if (role === 'source') {
315
+ // The source may never have heard of the move, or never archived: nothing to restore, just acknowledge.
316
+ await this.deps.archiver.restore(view.moveId);
317
+ await this.deps.cloud.postStatus(view.moveId, { status: 'source_restored' });
318
+ return;
319
+ }
320
+ // Target: stop and archive the copy it imported (if any), then acknowledge.
321
+ await this.deps.archiver.archive(view.moveId, view.teamId);
322
+ await this.deps.cloud.postStatus(view.moveId, { status: 'target_stopped' });
323
+ }
324
+ // -------------------------------------------------------------------------
325
+ // entry points for the dashboard / CLI / orchestrator
326
+ // -------------------------------------------------------------------------
327
+ /**
328
+ * Ask Cloud to move a team from this machine to another.
329
+ *
330
+ * @param input - Team, target machine, flags
331
+ * @returns The new move id
332
+ * @throws TeamMoveBlockedError when a repository holds unpushed work (unless allowed)
333
+ */
334
+ async startMove(input) {
335
+ const check = await this.deps.exporter.checkRepos(input.teamId);
336
+ if (check.blocking.length > 0 && !input.allowDirty)
337
+ throw new TeamMoveBlockedError(check.blocking);
338
+ const { instanceId } = await this.deps.identity();
339
+ const created = await this.deps.cloud.create({ teamId: input.teamId, sourceInstanceId: instanceId, targetInstanceId: input.targetInstanceId });
340
+ if (input.allowDirty || input.skipFlagged) {
341
+ const journal = new MoveJournal(created.moveId, this.home, this.now);
342
+ await journal.ensure();
343
+ await fs.writeFile(path.join(journal.dir, 'intent.json'), JSON.stringify({ allowDirty: !!input.allowDirty, skipFlagged: !!input.skipFlagged }));
344
+ }
345
+ return created;
346
+ }
347
+ /**
348
+ * What would stop a move of a team: repositories with unpushed or uncommitted work.
349
+ *
350
+ * @param teamId - Team id
351
+ * @returns Repo states and the blocking lines
352
+ */
353
+ async checkRepos(teamId) {
354
+ return this.deps.exporter.checkRepos(teamId);
355
+ }
356
+ /**
357
+ * Dry run: build the package here exactly as a move would, encrypt it with a
358
+ * throwaway key to measure it, and report. Nothing is sent anywhere.
359
+ *
360
+ * @param input - Team and a scratch directory
361
+ * @returns Manifest highlights and sizes
362
+ */
363
+ async preview(input) {
364
+ const moveId = `preview-${Date.now()}`;
365
+ const result = await this.deps.exporter.export({ ...input, moveId });
366
+ const throwaway = generateTargetKeyPair();
367
+ const enc = await buildEncryptedPackage(input.stagingDir, path.join(input.stagingDir, '..', `${path.basename(input.stagingDir)}.enc`), throwaway.publicKey, moveId);
368
+ await fs.rm(enc.file, { force: true });
369
+ const m = result.manifest;
370
+ return {
371
+ team: m.team.name,
372
+ members: m.team.members.length,
373
+ counts: m.counts,
374
+ files: m.files.length,
375
+ uncompressedBytes: m.totalBytes,
376
+ encryptedBytes: enc.size,
377
+ chunks: enc.chunks,
378
+ repos: m.repos.map((r) => ({ name: r.projectName, remote: r.remoteUrl, branch: r.branch, headSha: r.headSha, dirty: r.dirty, unpushed: r.unpushed, note: r.note })),
379
+ dirtyRepos: result.dirtyRepos,
380
+ projects: m.projects.map((p) => ({ name: p.name, files: p.files, bytes: p.bytes, skipped: p.skipped.length, skippedBytes: p.skipped.reduce((n, f) => n + f.bytes, 0) })),
381
+ requiredTools: m.requiredTools,
382
+ requiredRuntimes: m.requiredRuntimes,
383
+ requiredConnectors: m.requiredConnectors,
384
+ secretScan: m.secretScan,
385
+ cloudSummaryBytes: Buffer.byteLength(JSON.stringify(result.summary)),
386
+ notMoved: m.notMoved,
387
+ };
388
+ }
389
+ /**
390
+ * Moves known to Cloud plus what this machine remembers of each.
391
+ *
392
+ * @returns Moves, newest first
393
+ */
394
+ async listMoves() {
395
+ const views = this.deps.cloud.isConnected() ? await this.deps.cloud.list() : [];
396
+ const out = [];
397
+ for (const v of views) {
398
+ const state = isMoveId(v.moveId) ? await new MoveJournal(v.moveId, this.home).readState() : null;
399
+ out.push(state ? { ...v, local: { phase: state.phase, action: state.action, ...(state.error ? { error: state.error } : {}) } } : v);
400
+ }
401
+ return out;
402
+ }
403
+ /**
404
+ * One move with its local progress.
405
+ *
406
+ * @param moveId - Move id
407
+ * @returns Cloud's view plus the local journal
408
+ */
409
+ async getMove(moveId) {
410
+ const move = await this.deps.cloud.get(moveId);
411
+ const entries = isMoveId(moveId) ? await new MoveJournal(moveId, this.home).list() : [];
412
+ return { move, journal: entries.map((e) => ({ step: e.step, state: e.state, at: e.at })) };
413
+ }
414
+ /**
415
+ * Owner rollback.
416
+ *
417
+ * @param moveId - Move id
418
+ */
419
+ async rollbackMove(moveId) {
420
+ await this.deps.cloud.rollback(moveId);
421
+ void this.poll();
422
+ }
423
+ /**
424
+ * Housekeeping at boot and daily: purge expired archives.
425
+ *
426
+ * @returns Purged move ids
427
+ */
428
+ async housekeeping() {
429
+ return this.deps.archiver.purgeExpired();
430
+ }
431
+ // -------------------------------------------------------------------------
432
+ // helpers
433
+ // -------------------------------------------------------------------------
434
+ async readIntent(moveId) {
435
+ const raw = await fs.readFile(path.join(moveDirFor(moveId, this.home), 'intent.json'), 'utf8').catch(() => null);
436
+ if (!raw)
437
+ return {};
438
+ try {
439
+ return JSON.parse(raw);
440
+ }
441
+ catch {
442
+ return {};
443
+ }
444
+ }
445
+ /** Tell Cloud an action failed, with text the owner can act on. */
446
+ async reportFailure(moveId, error) {
447
+ // Network trouble is retried by the next poll, not reported as the move's failure.
448
+ if (error instanceof TeamMoveCloudError && error.retryable)
449
+ return;
450
+ const text = friendlyError(error).slice(0, MAX_ERROR_CHARS);
451
+ try {
452
+ await this.deps.cloud.postStatus(moveId, { status: 'failed', error: text });
453
+ }
454
+ catch (err) {
455
+ this.logger.warn('Could not report a team move failure', { moveId, error: messageOf(err) });
456
+ }
457
+ }
458
+ }
459
+ /**
460
+ * Turn an error into the sentence the owner sees.
461
+ *
462
+ * @param error - Thrown value
463
+ * @returns Message
464
+ */
465
+ export function friendlyError(error) {
466
+ if (error instanceof TeamMoveBlockedError || error instanceof TeamMoveSecretScanError || error instanceof TeamMoveImportError)
467
+ return error.message;
468
+ return messageOf(error);
469
+ }
470
+ function messageOf(error) {
471
+ return error instanceof Error ? error.message : String(error);
472
+ }
473
+ async function readKey(file) {
474
+ const raw = await fs.readFile(file, 'utf8').catch(() => null);
475
+ if (!raw)
476
+ return null;
477
+ try {
478
+ const parsed = JSON.parse(raw);
479
+ return parsed.publicKey && parsed.privateKey ? { publicKey: parsed.publicKey, privateKey: parsed.privateKey } : null;
480
+ }
481
+ catch {
482
+ return null;
483
+ }
484
+ }
485
+ /**
486
+ * Parse the data of a `team_move` push.
487
+ *
488
+ * @param payload - Relay payload
489
+ * @returns Parsed data, or null when malformed
490
+ */
491
+ export function parseRelayData(payload) {
492
+ const raw = (payload && typeof payload === 'object' ? (payload.data ?? payload) : null);
493
+ if (!raw)
494
+ return null;
495
+ const { moveId, role, action } = raw;
496
+ if (!isMoveId(moveId))
497
+ return null;
498
+ if (role !== 'source' && role !== 'target')
499
+ return null;
500
+ if (!['prepare', 'package', 'import', 'stop_archive', 'rollback'].includes(String(action)))
501
+ return null;
502
+ return { moveId, role, action: action };
503
+ }
504
+ //# sourceMappingURL=team-move-driver.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-driver.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-driver.service.ts"],"names":[],"mappings":"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"}