@cotal-ai/cli 0.11.6 → 0.13.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/dist/commands/backup.d.ts +13 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +443 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/channels.d.ts +10 -0
- package/dist/commands/channels.d.ts.map +1 -1
- package/dist/commands/channels.js.map +1 -1
- package/dist/commands/clean.d.ts +12 -2
- package/dist/commands/clean.d.ts.map +1 -1
- package/dist/commands/clean.js +174 -28
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/down-manifest.d.ts.map +1 -1
- package/dist/commands/down-manifest.js +83 -16
- package/dist/commands/down-manifest.js.map +1 -1
- package/dist/commands/down.d.ts +5 -0
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +367 -5
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/join.d.ts.map +1 -1
- package/dist/commands/join.js +46 -1
- package/dist/commands/join.js.map +1 -1
- package/dist/commands/mint.d.ts.map +1 -1
- package/dist/commands/mint.js +19 -5
- package/dist/commands/mint.js.map +1 -1
- package/dist/commands/spawn.d.ts +4 -0
- package/dist/commands/spawn.d.ts.map +1 -1
- package/dist/commands/spawn.js +81 -42
- package/dist/commands/spawn.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +3 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/up.d.ts +12 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +1149 -193
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/use.d.ts +3 -3
- package/dist/commands/use.d.ts.map +1 -1
- package/dist/commands/use.js +3 -3
- package/dist/commands/use.js.map +1 -1
- package/dist/console/app.js +1 -1
- package/dist/console/app.js.map +1 -1
- package/dist/console/ui/NeedsYou.js +1 -1
- package/dist/console/ui/NeedsYou.js.map +1 -1
- package/dist/console/ui/Tiles.d.ts +6 -3
- package/dist/console/ui/Tiles.d.ts.map +1 -1
- package/dist/console/ui/Tiles.js +6 -3
- package/dist/console/ui/Tiles.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/auth-proc.d.ts +21 -0
- package/dist/lib/auth-proc.d.ts.map +1 -1
- package/dist/lib/auth-proc.js +89 -15
- package/dist/lib/auth-proc.js.map +1 -1
- package/dist/lib/backup-artifact.d.ts +50 -0
- package/dist/lib/backup-artifact.d.ts.map +1 -0
- package/dist/lib/backup-artifact.js +290 -0
- package/dist/lib/backup-artifact.js.map +1 -0
- package/dist/lib/delivery-proc.d.ts +7 -2
- package/dist/lib/delivery-proc.d.ts.map +1 -1
- package/dist/lib/delivery-proc.js +29 -19
- package/dist/lib/delivery-proc.js.map +1 -1
- package/dist/lib/endpoint-cut.d.ts +5 -0
- package/dist/lib/endpoint-cut.d.ts.map +1 -0
- package/dist/lib/endpoint-cut.js +53 -0
- package/dist/lib/endpoint-cut.js.map +1 -0
- package/dist/lib/isolated-broker.d.ts +70 -0
- package/dist/lib/isolated-broker.d.ts.map +1 -0
- package/dist/lib/isolated-broker.js +436 -0
- package/dist/lib/isolated-broker.js.map +1 -0
- package/dist/lib/maintenance-files.d.ts +10 -0
- package/dist/lib/maintenance-files.d.ts.map +1 -0
- package/dist/lib/maintenance-files.js +60 -0
- package/dist/lib/maintenance-files.js.map +1 -0
- package/dist/lib/manager-proc.d.ts +4 -0
- package/dist/lib/manager-proc.d.ts.map +1 -1
- package/dist/lib/manager-proc.js +2 -0
- package/dist/lib/manager-proc.js.map +1 -1
- package/dist/lib/manifest/ledger.d.ts +4 -2
- package/dist/lib/manifest/ledger.d.ts.map +1 -1
- package/dist/lib/manifest/ledger.js +8 -10
- package/dist/lib/manifest/ledger.js.map +1 -1
- package/dist/lib/restore.d.ts +52 -0
- package/dist/lib/restore.d.ts.map +1 -0
- package/dist/lib/restore.js +801 -0
- package/dist/lib/restore.js.map +1 -0
- package/dist/view/mesh-view.d.ts +6 -1
- package/dist/view/mesh-view.d.ts.map +1 -1
- package/dist/view/mesh-view.js +8 -3
- package/dist/view/mesh-view.js.map +1 -1
- package/package.json +7 -4
package/dist/commands/down.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { closeSync, existsSync, openSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import {} from "@cotal-ai/core";
|
|
4
|
-
import { localProcessPath, removeMeshesByRoot, } from "@cotal-ai/workspace";
|
|
4
|
+
import { abortMaintenanceCut, acquireMaintenanceLock, beginMaintenanceCut, clearPreservationCommitIntent, clearPreservationPrepareIntent, completeMaintenanceCut, loadMeshes, localProcessPath, readMaintenanceJournal, readMaintenanceResumeDocument, readPreservationCommitIntent, readPreservationPrepareIntent, readStoreIdentity, recordPreservationManagerCommit, releaseMaintenanceLock, removeMeshesByRoot, sameStoreIdentity, writePreservationCommitIntent, writePreservationPrepareIntent, MAINTENANCE_RESUME_DOCUMENT_VERSION, writeMaintenanceResumeDocument, } from "@cotal-ai/workspace";
|
|
5
|
+
import { jetstreamManager } from "@nats-io/jetstream";
|
|
6
|
+
import { connect } from "@nats-io/transport-node";
|
|
7
|
+
import { CONTROL_ADMIN, DEV_OWNER, isReachable, LEASE_TTL_MS, MANAGER_LEASE_KEY, MANAGER_LEASE_TTL_MS, deliveryBucket, managerBucket, presenceBucket, parsePrincipalKey, principalKey, standaloneConnectOpts, } from "@cotal-ai/core";
|
|
5
8
|
import { extensionNames, localProcessSurface } from "../ext-loader.js";
|
|
6
9
|
import { c } from "../ui.js";
|
|
7
10
|
import { cotalRoot } from "../lib/paths.js";
|
|
8
11
|
import { resolveSpace } from "../lib/status.js";
|
|
9
12
|
import { downManifest } from "./down-manifest.js";
|
|
13
|
+
import { askManager, resolveControlTarget } from "../lib/control.js";
|
|
14
|
+
import { connectOrExit, userViewAuthOrExit } from "../lib/connect.js";
|
|
15
|
+
import { waitForEndpointUnreachable } from "../lib/endpoint-cut.js";
|
|
10
16
|
/** Complete selective component names without importing installed packages. */
|
|
11
17
|
export function downComplete(argv) {
|
|
12
18
|
if (argv.some((word) => word === "-f" || word === "--file" || word === "--run"))
|
|
@@ -24,6 +30,14 @@ export function downComplete(argv) {
|
|
|
24
30
|
export async function down(args) {
|
|
25
31
|
const values = args.values;
|
|
26
32
|
const requested = [...new Set(args.positionals)];
|
|
33
|
+
if (values["preserve-state"]) {
|
|
34
|
+
if (requested.length || values.file || values.run || values["dry-run"])
|
|
35
|
+
throw new Error("--preserve-state is bare-whole-stack only and cannot be combined with components, --file, --run, or --dry-run");
|
|
36
|
+
await preserveStateDown(values["store-dir"]);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (values["store-dir"])
|
|
40
|
+
throw new Error("--store-dir is only valid with down --preserve-state");
|
|
27
41
|
if ((values.file || values.run) && requested.length) {
|
|
28
42
|
throw new Error("component names cannot be combined with --file or --run");
|
|
29
43
|
}
|
|
@@ -67,7 +81,7 @@ export async function down(args) {
|
|
|
67
81
|
continue;
|
|
68
82
|
}
|
|
69
83
|
try {
|
|
70
|
-
await
|
|
84
|
+
await stopLocalProcess(component, context);
|
|
71
85
|
}
|
|
72
86
|
catch (e) {
|
|
73
87
|
allStopped = false;
|
|
@@ -109,10 +123,10 @@ export const isAlive = (pid) => {
|
|
|
109
123
|
return e.code === "EPERM";
|
|
110
124
|
}
|
|
111
125
|
};
|
|
112
|
-
function processRecorded(component, context) {
|
|
126
|
+
export function processRecorded(component, context) {
|
|
113
127
|
return existsSync(localProcessPath(component.pidFile, context)) || (component.artifacts ?? []).map((artifact) => localProcessPath(artifact, context)).some(existsSync);
|
|
114
128
|
}
|
|
115
|
-
function processAlive(component, context) {
|
|
129
|
+
export function processAlive(component, context) {
|
|
116
130
|
const pidPath = localProcessPath(component.pidFile, context);
|
|
117
131
|
if (!existsSync(pidPath))
|
|
118
132
|
return false;
|
|
@@ -120,7 +134,7 @@ function processAlive(component, context) {
|
|
|
120
134
|
return pid !== undefined && isAlive(pid);
|
|
121
135
|
}
|
|
122
136
|
/** Stop one recorded process and await its actual exit before the next dependency is stopped. */
|
|
123
|
-
async function
|
|
137
|
+
export async function stopLocalProcess(component, context) {
|
|
124
138
|
const pidPath = localProcessPath(component.pidFile, context);
|
|
125
139
|
const found = processRecorded(component, context);
|
|
126
140
|
if (!existsSync(pidPath))
|
|
@@ -207,6 +221,354 @@ async function stop(component, context) {
|
|
|
207
221
|
rmSync(marker, { force: true });
|
|
208
222
|
}
|
|
209
223
|
}
|
|
224
|
+
/** The principal keys of every retained agent in a preservation inventory — the dot-form ids that
|
|
225
|
+
* appear in the presence roster, so a caller can tell which retained agents are still live. */
|
|
226
|
+
function retainedPrincipalKeys(inventory) {
|
|
227
|
+
const agents = (inventory.agents ?? []);
|
|
228
|
+
return new Set(agents.map((agent) => {
|
|
229
|
+
if (agent.identity?.mode === "user" && agent.identity.owner && agent.identity.actor)
|
|
230
|
+
return principalKey(agent.identity.owner, agent.identity.actor).key;
|
|
231
|
+
if (agent.identity?.id)
|
|
232
|
+
return principalKey(DEV_OWNER, agent.identity.id).key;
|
|
233
|
+
return undefined;
|
|
234
|
+
}).filter((id) => Boolean(id)));
|
|
235
|
+
}
|
|
236
|
+
async function preserveStateDown(storeOverride) {
|
|
237
|
+
const root = cotalRoot();
|
|
238
|
+
const matching = loadMeshes().filter((mesh) => mesh.root === root);
|
|
239
|
+
if (matching.length !== 1)
|
|
240
|
+
throw new Error(`down --preserve-state requires exactly one recorded mesh for this root; found ${matching.length}`);
|
|
241
|
+
const mesh = matching[0];
|
|
242
|
+
const storeDir = storeOverride ? resolveStore(storeOverride) : join(root, ".cotal", "nats");
|
|
243
|
+
const lock = acquireMaintenanceLock(root);
|
|
244
|
+
try {
|
|
245
|
+
const all = localProcessSurface();
|
|
246
|
+
const context = { root, space: mesh.space };
|
|
247
|
+
const existing = readMaintenanceJournal(root);
|
|
248
|
+
if (existing && existing.state !== "cut-intent" && existing.state !== "cut-committed" && existing.state !== "ready")
|
|
249
|
+
throw new Error(`cannot preserve while maintenance state is ${existing.state}`);
|
|
250
|
+
if (existing && (existing.space !== mesh.space || existing.mode !== mesh.mode ||
|
|
251
|
+
!sameStoreIdentity(existing.source, readStoreIdentity(storeDir)) || existing.cut.launch.server !== mesh.server))
|
|
252
|
+
throw new Error(`preservation retry ${existing.cut.attemptId} does not match the current mesh launch`);
|
|
253
|
+
if (existing?.state === "ready") {
|
|
254
|
+
await waitForEndpointUnreachable(mesh.server);
|
|
255
|
+
console.log(c.dim(`state for "${mesh.space}" is already preserved and offline`));
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
let attemptId;
|
|
259
|
+
let resume;
|
|
260
|
+
// Set when recovery force-commits a cut whose manager died AFTER stopping children (commit-intent
|
|
261
|
+
// present): the shared commit block below is then skipped — the cut is already committed.
|
|
262
|
+
let managerCommitJournaled = false;
|
|
263
|
+
if (existing?.state === "cut-intent" || existing?.state === "cut-committed") {
|
|
264
|
+
attemptId = existing.cut.attemptId;
|
|
265
|
+
resume = existing.resume;
|
|
266
|
+
if (existing.state === "cut-intent") {
|
|
267
|
+
// A cut-intent retry must not depend on volatile manager memory: re-prepare the SAME
|
|
268
|
+
// attempt (idempotent on the fenced manager, a fresh fence on a restarted one) and prove
|
|
269
|
+
// the re-prepared inventory is byte-identical to the journaled resume document.
|
|
270
|
+
const manager = all.find((component) => component.name === "manager");
|
|
271
|
+
if (!manager)
|
|
272
|
+
throw new Error("local process registry has no manager descriptor");
|
|
273
|
+
if (!processAlive(manager, context)) {
|
|
274
|
+
const committing = readPreservationCommitIntent(root);
|
|
275
|
+
if (!committing || committing.attemptId !== attemptId) {
|
|
276
|
+
// No commit intent recorded: the child-stopping RPC was never invoked, so nothing was
|
|
277
|
+
// stopped with suppression. Safe to abandon instead of wedging.
|
|
278
|
+
abortMaintenanceCut(lock);
|
|
279
|
+
clearPreservationPrepareIntent(lock);
|
|
280
|
+
throw new Error(`preservation attempt ${attemptId} lost its manager before commit; the cut intent was aborted - heal the stack with \`cotal up\` if needed, then rerun \`cotal down --preserve-state\``);
|
|
281
|
+
}
|
|
282
|
+
// Commit intent is durable: the manager was asked to stop its children and may already have
|
|
283
|
+
// done so. Deleting the cut here would lose the retained inventory (this was the bug). While
|
|
284
|
+
// the broker outlives the manager in this window, confirm no retained principal is still live
|
|
285
|
+
// before finishing forward; if the broker is already gone we cannot check, but preserving the
|
|
286
|
+
// cut still beats deleting it. Then journal cut-committed and finish WITHOUT the dead manager.
|
|
287
|
+
if (await isReachable(mesh.server)) {
|
|
288
|
+
const retained = retainedPrincipalKeys(readMaintenanceResumeDocument(root, existing.resume).inventory);
|
|
289
|
+
if (retained.size) {
|
|
290
|
+
const stillLive = (await readPresenceWithoutConsumer(mesh.space, mesh.server))
|
|
291
|
+
.roster.filter((presence) => retained.has(presence.card.id)).map((presence) => presence.card.id);
|
|
292
|
+
if (stillLive.length)
|
|
293
|
+
throw new Error(`preservation attempt ${attemptId} lost its manager mid-commit and ${stillLive.length} retained principal(s) are still live (${stillLive.join(", ")}); the cut intent is PRESERVED for inspection - stop them, then rerun \`cotal down --preserve-state\``);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
recordPreservationManagerCommit(lock, { operation: "commitPreservation", attemptId, state: "preserved" });
|
|
297
|
+
clearPreservationCommitIntent(lock);
|
|
298
|
+
clearPreservationPrepareIntent(lock);
|
|
299
|
+
managerCommitJournaled = true;
|
|
300
|
+
}
|
|
301
|
+
if (!managerCommitJournaled) {
|
|
302
|
+
const retryTarget = await resolveControlTarget({ space: mesh.space, server: mesh.server }, "control-caller-admin");
|
|
303
|
+
// Plane-3 fence precedes the re-prepared inventory, exactly as on the fresh path.
|
|
304
|
+
const retryDelivery = all.find((component) => component.name === "delivery");
|
|
305
|
+
if (retryDelivery && processAlive(retryDelivery, context))
|
|
306
|
+
await stopLocalProcess(retryDelivery, context);
|
|
307
|
+
const reprepared = await askManager(retryTarget.space, retryTarget.server, "preparePreservation", { attemptId }, retryTarget.auth, CONTROL_ADMIN, 60_000);
|
|
308
|
+
const replan = reprepared.ok ? reprepared.data : undefined;
|
|
309
|
+
if (!replan?.inventory || (replan.failures?.length ?? 0) !== 0 || (replan.state !== "prepared" && replan.state !== "preserved"))
|
|
310
|
+
throw new Error(reprepared.error ?? "manager could not re-prepare the recorded preservation attempt");
|
|
311
|
+
try {
|
|
312
|
+
writeMaintenanceResumeDocument(lock, {
|
|
313
|
+
version: MAINTENANCE_RESUME_DOCUMENT_VERSION,
|
|
314
|
+
inventory: replan.inventory,
|
|
315
|
+
launch: { attemptId, space: mesh.space, server: mesh.server, storeDir, mode: mesh.mode },
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
catch (cause) {
|
|
319
|
+
// A restarted manager prepared a DIFFERENT inventory: the journaled cut no longer
|
|
320
|
+
// matches reality. Release its fence and abandon the stale intent; a rerun cuts fresh.
|
|
321
|
+
try {
|
|
322
|
+
await askManager(retryTarget.space, retryTarget.server, "abortPreservation", { attemptId }, retryTarget.auth, CONTROL_ADMIN, 30_000);
|
|
323
|
+
}
|
|
324
|
+
catch { /* best effort - the fence dies with the manager */ }
|
|
325
|
+
abortMaintenanceCut(lock);
|
|
326
|
+
clearPreservationPrepareIntent(lock);
|
|
327
|
+
throw new Error(`preservation attempt ${attemptId} no longer matches its manager's inventory (${cause.message}); the stale cut intent was aborted - rerun \`cotal down --preserve-state\``);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
// The attempt binding is durable BEFORE the manager is fenced: a crash between manager
|
|
334
|
+
// preparation and the cut-intent journal retries with the exact attempt the manager holds.
|
|
335
|
+
const intent = readPreservationPrepareIntent(root);
|
|
336
|
+
if (intent) {
|
|
337
|
+
if (intent.space !== mesh.space || intent.mode !== mesh.mode || intent.server !== mesh.server || intent.storeDir !== storeDir)
|
|
338
|
+
throw new Error(`preservation prepare intent ${intent.attemptId} does not match the current mesh launch; inspect .cotal/maintenance before retrying`);
|
|
339
|
+
attemptId = intent.attemptId;
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
attemptId = `preserve-${Date.now()}-${process.pid}`;
|
|
343
|
+
writePreservationPrepareIntent(lock, {
|
|
344
|
+
attemptId, space: mesh.space, mode: mesh.mode, server: mesh.server, storeDir,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
const target = await resolveControlTarget({ space: mesh.space, server: mesh.server }, "control-caller-admin");
|
|
348
|
+
// Fence Plane 3 BEFORE any inventory work: with the delivery daemon stopped, no durable
|
|
349
|
+
// join/leave can mutate MEMBERS at or after the moment the inventory is taken.
|
|
350
|
+
const delivery = all.find((component) => component.name === "delivery");
|
|
351
|
+
if (delivery && processAlive(delivery, context))
|
|
352
|
+
await stopLocalProcess(delivery, context);
|
|
353
|
+
const prepared = await askManager(target.space, target.server, "preparePreservation", { attemptId }, target.auth, CONTROL_ADMIN, 60_000);
|
|
354
|
+
if (!prepared.ok)
|
|
355
|
+
throw new Error(prepared.error ?? "manager preservation prepare failed");
|
|
356
|
+
const plan = prepared.data;
|
|
357
|
+
if (!plan?.inventory || (plan.failures?.length ?? 0) !== 0 || (plan.state !== "prepared" && plan.state !== "preserved"))
|
|
358
|
+
throw new Error("manager returned an invalid or incomplete preservation plan");
|
|
359
|
+
const retainedPrincipals = retainedPrincipalKeys(plan.inventory);
|
|
360
|
+
let observed = await readPresenceWithoutConsumer(mesh.space, mesh.server);
|
|
361
|
+
retainedPrincipals.add(observed.managerId);
|
|
362
|
+
let unmanaged = observed.roster.filter((presence) => !retainedPrincipals.has(presence.card.id));
|
|
363
|
+
if (unmanaged.length) {
|
|
364
|
+
await sleep(11_000); // Let stopped predecessor presence and manager leases expire before refusing.
|
|
365
|
+
observed = await readPresenceWithoutConsumer(mesh.space, mesh.server);
|
|
366
|
+
retainedPrincipals.add(observed.managerId);
|
|
367
|
+
unmanaged = observed.roster.filter((presence) => !retainedPrincipals.has(presence.card.id));
|
|
368
|
+
}
|
|
369
|
+
if (unmanaged.length)
|
|
370
|
+
throw new Error(`cannot preserve while unmanaged endpoints are live: ${unmanaged.map((presence) => `${presence.card.name} (${presence.card.id})`).join(", ")} (manager lease holder: ${observed.managerId})`);
|
|
371
|
+
resume = writeMaintenanceResumeDocument(lock, {
|
|
372
|
+
version: MAINTENANCE_RESUME_DOCUMENT_VERSION,
|
|
373
|
+
inventory: plan.inventory,
|
|
374
|
+
launch: {
|
|
375
|
+
attemptId,
|
|
376
|
+
space: mesh.space,
|
|
377
|
+
server: mesh.server,
|
|
378
|
+
storeDir,
|
|
379
|
+
mode: mesh.mode,
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
beginMaintenanceCut(lock, {
|
|
383
|
+
attemptId,
|
|
384
|
+
space: mesh.space,
|
|
385
|
+
mode: mesh.mode,
|
|
386
|
+
sourcePath: storeDir,
|
|
387
|
+
resume,
|
|
388
|
+
launch: { server: mesh.server, storeDir },
|
|
389
|
+
});
|
|
390
|
+
clearPreservationPrepareIntent(lock);
|
|
391
|
+
}
|
|
392
|
+
// Stop the children through the manager, then journal cut-committed. A commit-intent marker is
|
|
393
|
+
// written FIRST (the stop RPC is about to execute) and cleared once cut-committed is durable, so a
|
|
394
|
+
// crash in the gap leaves proof the stop may already have run — recovery finishes forward instead
|
|
395
|
+
// of deleting the cut. `managerCommitJournaled` means a dead-manager recovery already committed above.
|
|
396
|
+
if (existing?.state !== "cut-committed" && !managerCommitJournaled) {
|
|
397
|
+
const manager = all.find((component) => component.name === "manager");
|
|
398
|
+
if (!manager)
|
|
399
|
+
throw new Error("local process registry has no manager descriptor");
|
|
400
|
+
if (!processAlive(manager, context))
|
|
401
|
+
throw new Error("cannot complete preservation because the attempt-bound manager is not alive to prove every retained child stopped; recovery must preserve the cut-intent journal for inspection");
|
|
402
|
+
// Fault window: cut-intent journaled but the child-stopping RPC not yet invoked (no commit
|
|
403
|
+
// intent). A crash here is genuinely pre-commit — recovery MUST still abort, not finish forward.
|
|
404
|
+
if (process.env.COTAL_SMOKE_EXIT_AFTER_CUT_INTENT_BEFORE_COMMIT === "1")
|
|
405
|
+
process.exit(93);
|
|
406
|
+
writePreservationCommitIntent(lock, { attemptId });
|
|
407
|
+
const target = await resolveControlTarget({ space: mesh.space, server: mesh.server }, "control-caller-admin");
|
|
408
|
+
const commit = await askManager(target.space, target.server, "commitPreservation", { attemptId }, target.auth, CONTROL_ADMIN, 120_000);
|
|
409
|
+
if (!commit.ok)
|
|
410
|
+
throw new Error(commit.error ?? "manager preservation commit was incomplete");
|
|
411
|
+
const result = commit.data;
|
|
412
|
+
if (result?.state !== "preserved" || (result.failures?.length ?? 0) !== 0)
|
|
413
|
+
throw new Error("manager could not prove every retained child stopped");
|
|
414
|
+
// Fault window: the manager has COMMITTED (children stopped, preservation irreversible) but the
|
|
415
|
+
// coordinator has not yet journaled cut-committed. A crash here leaves the journal at cut-intent
|
|
416
|
+
// WITH the commit-intent marker set — the exact window recovery must not treat as pre-commit.
|
|
417
|
+
if (process.env.COTAL_SMOKE_EXIT_AFTER_MANAGER_STOP_BEFORE_JOURNAL === "1")
|
|
418
|
+
process.exit(92);
|
|
419
|
+
recordPreservationManagerCommit(lock, { operation: "commitPreservation", attemptId, state: "preserved" });
|
|
420
|
+
clearPreservationCommitIntent(lock);
|
|
421
|
+
if (process.env.COTAL_SMOKE_EXIT_AFTER_PRESERVATION_MANAGER_COMMIT === "1")
|
|
422
|
+
process.exit(90);
|
|
423
|
+
}
|
|
424
|
+
const rank = (component) => {
|
|
425
|
+
if (component.name === "delivery")
|
|
426
|
+
return 20;
|
|
427
|
+
if (component.name === "manager")
|
|
428
|
+
return 30;
|
|
429
|
+
if (component.name === "auth")
|
|
430
|
+
return 40;
|
|
431
|
+
if (component.stopLast)
|
|
432
|
+
return 100;
|
|
433
|
+
return 10;
|
|
434
|
+
};
|
|
435
|
+
const ranked = [...all].sort((a, b) => rank(a) - rank(b) || (a.order ?? 50) - (b.order ?? 50));
|
|
436
|
+
// The quiescence proof runs BETWEEN two stop phases. Everything it proves dead — the
|
|
437
|
+
// lease-holding daemons, delivery and manager — stops before it. The user-auth service holds no
|
|
438
|
+
// lease, so the proof does not cover it, and on a USER mesh the proof's own broker connect
|
|
439
|
+
// exchanges through that service: stop it first and the cut can no longer prove itself, ending
|
|
440
|
+
// at cut-committed with the broker still up. It stops after the proof, still before the broker.
|
|
441
|
+
const afterQuiescence = (component) => component.stopLast || component.name === "auth";
|
|
442
|
+
for (const component of ranked.filter((component) => !afterQuiescence(component)))
|
|
443
|
+
await stopLocalProcess(component, context);
|
|
444
|
+
// Wire-truth quiescence while the broker still answers: every control-plane daemon must be
|
|
445
|
+
// provably lease-dead, not merely pidfile-absent, before the broker stops and ready publishes.
|
|
446
|
+
// An already-unreachable broker is itself the proof - nothing can mutate broker-resident state
|
|
447
|
+
// through a dead endpoint, and the final unreachable check below re-verifies it.
|
|
448
|
+
if (await isReachable(mesh.server))
|
|
449
|
+
await assertControlPlaneQuiesced(mesh.space, mesh.server);
|
|
450
|
+
// rank() keeps auth (40) ahead of the broker (stopLast, 100) within this phase.
|
|
451
|
+
for (const component of ranked.filter(afterQuiescence))
|
|
452
|
+
await stopLocalProcess(component, context);
|
|
453
|
+
const stillRunning = all.filter((component) => processAlive(component, context));
|
|
454
|
+
if (stillRunning.length)
|
|
455
|
+
throw new Error(`preservation cut is partial; still running: ${stillRunning.map((component) => component.name).join(", ")}`);
|
|
456
|
+
await waitForEndpointUnreachable(mesh.server);
|
|
457
|
+
completeMaintenanceCut(lock, {
|
|
458
|
+
attemptId,
|
|
459
|
+
observedAt: new Date().toISOString(),
|
|
460
|
+
managerCommit: { operation: "commitPreservation", attemptId, state: "preserved" },
|
|
461
|
+
stopped: { manager: true, broker: true, localProcesses: true },
|
|
462
|
+
listener: { endpoint: mesh.server, unreachable: true },
|
|
463
|
+
});
|
|
464
|
+
console.log(c.green(`✓ preserved state for "${mesh.space}"`));
|
|
465
|
+
console.log(c.dim(` source: ${storeDir}`));
|
|
466
|
+
console.log(c.dim(` resume inventory: ${join(root, ".cotal", "maintenance", "v1", resume.file)}`));
|
|
467
|
+
console.log(c.dim(" stack remains stopped; create a backup or deliberately resume with `cotal up`"));
|
|
468
|
+
}
|
|
469
|
+
finally {
|
|
470
|
+
releaseMaintenanceLock(lock);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
function resolveStore(path) {
|
|
474
|
+
const resolved = path.startsWith("/") ? path : join(process.cwd(), path);
|
|
475
|
+
return resolved;
|
|
476
|
+
}
|
|
477
|
+
/** Direct Get one KV subject's last value without creating any consumer. `allowEmpty` treats a
|
|
478
|
+
* DEL/PURGE tombstone as absence instead of an error. */
|
|
479
|
+
async function directKvValue(nc, stream, subject, allowEmpty = false) {
|
|
480
|
+
const response = await nc.request(`$JS.API.STREAM.MSG.GET.${stream}`, JSON.stringify({ last_by_subj: subject }), { timeout: 5_000 });
|
|
481
|
+
const body = JSON.parse(new TextDecoder().decode(response.data));
|
|
482
|
+
if (body.error)
|
|
483
|
+
throw new Error(`maintenance inventory read failed: ${body.error.description ?? "JetStream error"}`);
|
|
484
|
+
if (!body.message?.data) {
|
|
485
|
+
const headers = body.message?.hdrs ? Buffer.from(body.message.hdrs, "base64").toString("utf8") : "";
|
|
486
|
+
if (allowEmpty && /^KV-Operation:\s*(?:DEL|PURGE)\s*$/im.test(headers))
|
|
487
|
+
return undefined;
|
|
488
|
+
throw new Error(`maintenance inventory is missing ${subject}`);
|
|
489
|
+
}
|
|
490
|
+
return JSON.parse(Buffer.from(body.message.data, "base64").toString("utf8"));
|
|
491
|
+
}
|
|
492
|
+
/** Wire-truth control-plane quiescence: a live manager/delivery daemon renews its lease
|
|
493
|
+
* continuously, so the cut publishes `ready` only once BOTH lease buckets hold no live value —
|
|
494
|
+
* a dead daemon's lease expires by TTL, a pidless live one keeps renewing and is refused here.
|
|
495
|
+
* Pidfiles are hints; leases are proof. */
|
|
496
|
+
async function assertControlPlaneQuiesced(space, server) {
|
|
497
|
+
const resolved = await connectOrExit({ space, server }, "deployer");
|
|
498
|
+
const user = resolved.bearer ? await userViewAuthOrExit(resolved, "deployer") : undefined;
|
|
499
|
+
const nc = await connect({
|
|
500
|
+
servers: server,
|
|
501
|
+
...standaloneConnectOpts(user ?? { creds: resolved.creds }),
|
|
502
|
+
maxReconnectAttempts: 0,
|
|
503
|
+
});
|
|
504
|
+
try {
|
|
505
|
+
const jsm = await jetstreamManager(nc);
|
|
506
|
+
const liveKeys = async (bucket) => {
|
|
507
|
+
let subjects;
|
|
508
|
+
try {
|
|
509
|
+
const info = await jsm.streams.info(`KV_${bucket}`, { subjects_filter: `$KV.${bucket}.>` });
|
|
510
|
+
subjects = Object.keys(info.state.subjects ?? {});
|
|
511
|
+
}
|
|
512
|
+
catch (error) {
|
|
513
|
+
if (/stream not found/i.test(error.message))
|
|
514
|
+
return [];
|
|
515
|
+
throw error;
|
|
516
|
+
}
|
|
517
|
+
const live = [];
|
|
518
|
+
for (const subject of subjects) {
|
|
519
|
+
if (await directKvValue(nc, `KV_${bucket}`, subject, true) !== undefined)
|
|
520
|
+
live.push(subject);
|
|
521
|
+
}
|
|
522
|
+
return live;
|
|
523
|
+
};
|
|
524
|
+
const deadline = Date.now() + Math.max(LEASE_TTL_MS, MANAGER_LEASE_TTL_MS) + 5_000;
|
|
525
|
+
for (;;) {
|
|
526
|
+
const deliveryLive = await liveKeys(deliveryBucket(space));
|
|
527
|
+
const managerLive = await liveKeys(managerBucket(space));
|
|
528
|
+
if (deliveryLive.length === 0 && managerLive.length === 0)
|
|
529
|
+
return;
|
|
530
|
+
if (Date.now() >= deadline)
|
|
531
|
+
throw new Error(`control-plane leases are still live past their TTL (delivery: ${deliveryLive.length}, manager: ${managerLive.length}); a pidless daemon may still be running - the cut refuses to publish ready`);
|
|
532
|
+
await sleep(500);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
finally {
|
|
536
|
+
await nc.drain().catch(() => { });
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
/** Read current KV subjects by Direct Get so the cut check leaves no ephemeral/native consumer. */
|
|
540
|
+
async function readPresenceWithoutConsumer(space, server) {
|
|
541
|
+
const resolved = await connectOrExit({ space, server }, "deployer");
|
|
542
|
+
const user = resolved.bearer ? await userViewAuthOrExit(resolved, "deployer") : undefined;
|
|
543
|
+
const nc = await connect({
|
|
544
|
+
servers: server,
|
|
545
|
+
...standaloneConnectOpts(user ?? { creds: resolved.creds }),
|
|
546
|
+
maxReconnectAttempts: 0,
|
|
547
|
+
});
|
|
548
|
+
try {
|
|
549
|
+
const directValue = async (stream, subject, allowEmpty = false) => directKvValue(nc, stream, subject, allowEmpty);
|
|
550
|
+
const bucket = presenceBucket(space);
|
|
551
|
+
const stream = `KV_${bucket}`;
|
|
552
|
+
const info = await (await jetstreamManager(nc)).streams.info(stream, { subjects_filter: `$KV.${bucket}.>` });
|
|
553
|
+
const roster = [];
|
|
554
|
+
for (const subject of Object.keys(info.state.subjects ?? {})) {
|
|
555
|
+
const presence = await directValue(stream, subject, true);
|
|
556
|
+
if (!presence)
|
|
557
|
+
continue; // A positively identified KV tombstone has no value bytes.
|
|
558
|
+
if (!presence.card?.id)
|
|
559
|
+
throw new Error(`presence record ${subject} is malformed`);
|
|
560
|
+
roster.push(presence);
|
|
561
|
+
}
|
|
562
|
+
const leaseBucket = managerBucket(space);
|
|
563
|
+
const lease = await directValue(`KV_${leaseBucket}`, `$KV.${leaseBucket}.${MANAGER_LEASE_KEY}`);
|
|
564
|
+
if (!lease?.holder)
|
|
565
|
+
throw new Error("manager lease has no authoritative holder principal");
|
|
566
|
+
return { roster, managerId: parsePrincipalKey(lease.holder) ? lease.holder : principalKey(DEV_OWNER, lease.holder).key };
|
|
567
|
+
}
|
|
568
|
+
finally {
|
|
569
|
+
await nc.drain().catch(() => { });
|
|
570
|
+
}
|
|
571
|
+
}
|
|
210
572
|
/** Compatibility inventory for `clean`; lifecycle commands use the registered descriptors above. */
|
|
211
573
|
export function pidfileTargets(space) {
|
|
212
574
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/commands/join.ts"],"names":[],"mappings":"AAGA,OAAO,EAeL,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AA4BxB,wBAAsB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+T1D"}
|
package/dist/commands/join.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { userInfo } from "node:os";
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
import * as readline from "node:readline";
|
|
4
|
-
import { CotalEndpoint, parseJoinLink, resolvePeer, AmbiguousPeerError, DEFAULT_SERVER, mintCreds, newIdentity, provisionAgent, } from "@cotal-ai/core";
|
|
4
|
+
import { CotalEndpoint, parseJoinLink, resolvePeer, AmbiguousPeerError, DEFAULT_SERVER, mintCreds, mintLifecycleUid, assertLifecycleToken, newIdentity, provisionAgent, } from "@cotal-ai/core";
|
|
5
5
|
import { resolveSpace } from "../lib/status.js";
|
|
6
6
|
import { reachableOrExit, refuseStaticCredsForKnownUserAuthOrExit, resolveTargetOrExit, preflightOrExit } from "../lib/connect.js";
|
|
7
7
|
import { c, statusBadge } from "../ui.js";
|
|
@@ -36,6 +36,42 @@ export async function join(args) {
|
|
|
36
36
|
creds: values.creds ? readFileSync(values.creds, "utf8") : undefined,
|
|
37
37
|
tls: values.tls ?? link?.tls ?? false,
|
|
38
38
|
};
|
|
39
|
+
// The join session's lifecycle UID (SPEC 13.1). The pairing input (--lifecycle-uid /
|
|
40
|
+
// COTAL_LIFECYCLE_UID) is scoped STRICTLY to an explicit --creds join: that credential's durable
|
|
41
|
+
// grants name exact lifecycle-keyed resources, so the uid minted alongside it is the only one the
|
|
42
|
+
// broker will bind, and it is REQUIRED (never invented). Every OTHER path leaves it undefined so
|
|
43
|
+
// the endpoint self-mints a fresh per-session identity at construction: an open/token/link/bare
|
|
44
|
+
// join must NOT inherit an ambient shell's COTAL_LIFECYCLE_UID (that would reuse another
|
|
45
|
+
// incarnation's uid). Auth-mode self-provision (below) mints its own.
|
|
46
|
+
const flagUid = values["lifecycle-uid"];
|
|
47
|
+
const envUid = process.env.COTAL_LIFECYCLE_UID?.trim() || undefined;
|
|
48
|
+
// An EXPLICIT --lifecycle-uid without --creds is a misuse (refuse loudly). An AMBIENT
|
|
49
|
+
// COTAL_LIFECYCLE_UID without --creds is just a shell leaking a spawned agent's env - silently
|
|
50
|
+
// IGNORE it (an open/token/link/bare join never inherits another incarnation's uid; it
|
|
51
|
+
// self-mints). Only WITH --creds is either read, as the launcher's pairing.
|
|
52
|
+
if (flagUid !== undefined && !values.creds) {
|
|
53
|
+
console.error(c.red(`✗ --lifecycle-uid applies only to an explicit `) +
|
|
54
|
+
c.bold("--creds") +
|
|
55
|
+
c.red(` join - an open/token/link/bare join self-mints a fresh per-session lifecycle. Drop the flag, or pass --creds.`));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
let lifecycleUid = values.creds ? (flagUid ?? envUid) : undefined;
|
|
59
|
+
if (lifecycleUid !== undefined) {
|
|
60
|
+
try {
|
|
61
|
+
assertLifecycleToken(lifecycleUid);
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
console.error(c.red(`✗ ${e.message}`));
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (values.creds && lifecycleUid === undefined) {
|
|
69
|
+
console.error(c.red(`✗ --creds is lifecycle-paired (SPEC 13.1): pass `) +
|
|
70
|
+
c.bold("--lifecycle-uid <uid>") +
|
|
71
|
+
c.red(` (or set COTAL_LIFECYCLE_UID) with the uid minted alongside this credential at provision time. `) +
|
|
72
|
+
c.red(`The credential's durable grants name exact lifecycle-keyed resources; a made-up uid would name durables it cannot bind.`));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
39
75
|
let space;
|
|
40
76
|
let server;
|
|
41
77
|
// An explicit connection (a join link, --token, or --creds) is taken at face value — that's the
|
|
@@ -71,6 +107,11 @@ export async function join(args) {
|
|
|
71
107
|
await preflightOrExit(target); // one sentence if the mesh is down / won't auth, + stale-prune
|
|
72
108
|
if (target.auth) {
|
|
73
109
|
const identity = newIdentity();
|
|
110
|
+
// One lifecycle per join session (SPEC 13.1): the provisioned dm/dlv footprint, the minted
|
|
111
|
+
// grants, and the endpoint's binds all carry this uid; the session's exit orphans only its own
|
|
112
|
+
// lifecycle-keyed names (self-retired by the open-mode inactive threshold on the broker side).
|
|
113
|
+
// A launcher-supplied uid (flag/env, resolved above) wins; the session mints only when bare.
|
|
114
|
+
lifecycleUid ??= mintLifecycleUid();
|
|
74
115
|
const prov = new CotalEndpoint({
|
|
75
116
|
space,
|
|
76
117
|
servers: server,
|
|
@@ -95,6 +136,7 @@ export async function join(args) {
|
|
|
95
136
|
allowPublish: [channel],
|
|
96
137
|
role: values.role,
|
|
97
138
|
durableMembership: false,
|
|
139
|
+
lifecycleUid,
|
|
98
140
|
});
|
|
99
141
|
await prov.stop();
|
|
100
142
|
}
|
|
@@ -111,6 +153,9 @@ export async function join(args) {
|
|
|
111
153
|
space,
|
|
112
154
|
servers: server,
|
|
113
155
|
...auth,
|
|
156
|
+
// Absent for a bare open/token join: the endpoint self-mints its per-session lifecycle at
|
|
157
|
+
// construction. Set for auth joins: self-provisioned above, or --creds-paired (never invented).
|
|
158
|
+
lifecycleUid,
|
|
114
159
|
channels: [channel],
|
|
115
160
|
card: {
|
|
116
161
|
name,
|