@cotal-ai/cli 0.154.0 → 0.155.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/commands/agents.js +3 -3
  2. package/dist/commands/agents.js.map +1 -1
  3. package/dist/commands/space-registration.d.ts.map +1 -1
  4. package/dist/commands/space-registration.js +17 -6
  5. package/dist/commands/space-registration.js.map +1 -1
  6. package/dist/commands/space.d.ts +2 -0
  7. package/dist/commands/space.d.ts.map +1 -1
  8. package/dist/commands/space.js +5 -1
  9. package/dist/commands/space.js.map +1 -1
  10. package/dist/commands/spawn-preview.d.ts.map +1 -1
  11. package/dist/commands/spawn-preview.js +4 -8
  12. package/dist/commands/spawn-preview.js.map +1 -1
  13. package/dist/commands/stack-down.d.ts.map +1 -1
  14. package/dist/commands/stack-down.js +13 -8
  15. package/dist/commands/stack-down.js.map +1 -1
  16. package/dist/commands/stack-lost-records.d.ts +7 -0
  17. package/dist/commands/stack-lost-records.d.ts.map +1 -0
  18. package/dist/commands/stack-lost-records.js +143 -0
  19. package/dist/commands/stack-lost-records.js.map +1 -0
  20. package/dist/commands/stack-up.d.ts +3 -3
  21. package/dist/commands/stack-up.d.ts.map +1 -1
  22. package/dist/commands/stack-up.js +20 -12
  23. package/dist/commands/stack-up.js.map +1 -1
  24. package/dist/commands/status.d.ts +4 -0
  25. package/dist/commands/status.d.ts.map +1 -1
  26. package/dist/commands/status.js +89 -37
  27. package/dist/commands/status.js.map +1 -1
  28. package/dist/commands/sync.d.ts.map +1 -1
  29. package/dist/commands/sync.js +8 -6
  30. package/dist/commands/sync.js.map +1 -1
  31. package/dist/commands/team-boot-controller.d.ts.map +1 -1
  32. package/dist/commands/team-boot-controller.js +3 -1
  33. package/dist/commands/team-boot-controller.js.map +1 -1
  34. package/dist/commands/team-channel-remove.d.ts +2 -2
  35. package/dist/commands/team.d.ts.map +1 -1
  36. package/dist/commands/team.js +6 -2
  37. package/dist/commands/team.js.map +1 -1
  38. package/dist/commands/whoami.d.ts.map +1 -1
  39. package/dist/commands/whoami.js +7 -11
  40. package/dist/commands/whoami.js.map +1 -1
  41. package/dist/help.d.ts.map +1 -1
  42. package/dist/help.js +11 -2
  43. package/dist/help.js.map +1 -1
  44. package/dist/index.d.ts +1 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/lib/controller-resume.d.ts.map +1 -1
  49. package/dist/lib/controller-resume.js +2 -1
  50. package/dist/lib/controller-resume.js.map +1 -1
  51. package/dist/lib/persona-files.d.ts.map +1 -1
  52. package/dist/lib/persona-files.js +26 -11
  53. package/dist/lib/persona-files.js.map +1 -1
  54. package/dist/lib/restore.d.ts.map +1 -1
  55. package/dist/lib/restore.js +3 -1
  56. package/dist/lib/restore.js.map +1 -1
  57. package/dist/lib/self-exec.d.ts +2 -2
  58. package/dist/lib/self-exec.d.ts.map +1 -1
  59. package/dist/lib/self-exec.js +6 -3
  60. package/dist/lib/self-exec.js.map +1 -1
  61. package/dist/lib/service-presets.d.ts.map +1 -1
  62. package/dist/lib/service-presets.js +7 -1
  63. package/dist/lib/service-presets.js.map +1 -1
  64. package/dist/lib/service-systemd-files.d.ts +3 -0
  65. package/dist/lib/service-systemd-files.d.ts.map +1 -1
  66. package/dist/lib/service-systemd-files.js +23 -0
  67. package/dist/lib/service-systemd-files.js.map +1 -1
  68. package/dist/lib/stack-journal.d.ts +16 -0
  69. package/dist/lib/stack-journal.d.ts.map +1 -1
  70. package/dist/lib/stack-journal.js +39 -8
  71. package/dist/lib/stack-journal.js.map +1 -1
  72. package/dist/lib/store-identity.d.ts +15 -0
  73. package/dist/lib/store-identity.d.ts.map +1 -0
  74. package/dist/lib/store-identity.js +30 -0
  75. package/dist/lib/store-identity.js.map +1 -0
  76. package/package.json +4 -4
@@ -0,0 +1,143 @@
1
+ /** Explicit signal stop when a stack's launching home has lost all exact instance records.
2
+ * The root journal must retain its launch-time home, host and member creation pins. */
3
+ import { resolve } from "node:path";
4
+ import { CommandFailure, ConfirmationRequired, assertRecordIdentity, homeCotalDir, loadMeshes, presentationOf, probeLiveness, recordOperationSpace, releaseMaintenanceLock, stackHomeRemedy, writeResult } from "@cotal-ai/workspace";
5
+ import { serviceInstances, serviceInstanceStore } from "../lib/service-instances.js";
6
+ import { assertNoServiceUnitAttempts } from "../lib/service-process.js";
7
+ import { acquireStackOperationLock, newStackOperation, readStackJournal, recordedProcessesUnder, stackMaintenanceFence, stackOperationUnsettled, stackRecoveryHost, writeStackJournal } from "../lib/stack-journal.js";
8
+ const ORDER = ["manager", "delivery", "auth", "broker"];
9
+ const delay = (ms) => new Promise((done) => setTimeout(done, ms));
10
+ function unconfirmedLaunches(snapshot) {
11
+ const journal = snapshot.journal;
12
+ if (journal.operation.kind !== "up" || !stackOperationUnsettled(journal))
13
+ return [];
14
+ return journal.members.filter((row) => row.instanceId === null && (row.state === "planned" || row.state === "unknown"));
15
+ }
16
+ /** Missing launch evidence also includes a child whose instance ID never reached the root journal. */
17
+ export function stackRecordsLost(snapshot) {
18
+ const space = snapshot.journal.space, store = serviceInstanceStore(space);
19
+ return snapshot.journal.members.some((row) => row.instanceId !== null && store.read(row.instanceId) === undefined)
20
+ || (unconfirmedLaunches(snapshot).length > 0 && snapshot.journal.members.every((row) => serviceInstances(space, row.definition).length === 0));
21
+ }
22
+ function members(snapshot) {
23
+ const journal = snapshot.journal, target = { root: journal.root, space: journal.space };
24
+ const refuse = (message) => { throw new CommandFailure("refused", "TARGET_UNAVAILABLE", message, { target, remedy: stackHomeRemedy() }); };
25
+ if (process.platform !== "linux")
26
+ refuse("recovery from missing stack instance records requires Linux; no member was stopped");
27
+ if (!journal.recovery || journal.recovery.home !== resolve(homeCotalDir()) || journal.recovery.host !== stackRecoveryHost())
28
+ refuse("the stack's member records are missing here, and its journal does not pin this launching home, machine, boot and account; no member was stopped");
29
+ if (stackMaintenanceFence(journal.root, journal).fenced || !["up", "down"].includes(journal.operation.kind))
30
+ refuse("the stack retains a maintenance operation; missing-record recovery cannot decide it and no member was stopped");
31
+ if (journal.members.some((row) => row.replacement !== undefined))
32
+ refuse("the stack retains an unresolved replacement launch; no member was stopped");
33
+ if (unconfirmedLaunches(snapshot).length)
34
+ refuse("the stack retains an unconfirmed launch without an instance identity; restore the original instance records before stopping, and no member was stopped");
35
+ const rows = journal.members.filter((row) => row.instanceId !== null);
36
+ const store = serviceInstanceStore(journal.space);
37
+ if (rows.some((row) => store.read(row.instanceId) !== undefined))
38
+ refuse("only some stack instance records are missing; restore the complete records before stopping, and no member was stopped");
39
+ if (serviceInstances(journal.space).length)
40
+ refuse("other service instance records remain in this space; restore the complete records before stopping, and no member was stopped");
41
+ for (const row of rows)
42
+ assertNoServiceUnitAttempts(journal.space, row.definition);
43
+ if (rows.some((row) => row.process === undefined))
44
+ refuse("the stack journal lacks a complete set of member creation pins; no member was stopped");
45
+ if (loadMeshes().some((row) => row.space !== journal.space && row.server === journal.server))
46
+ refuse("another registered space uses this broker address; missing-record recovery stopped nothing");
47
+ const pids = new Set(rows.map((row) => row.process.pid));
48
+ if (recordedProcessesUnder(journal.root, [journal.space]).some((row) => row.pid === undefined || !pids.has(row.pid)))
49
+ refuse("another or unreadable process record remains under this root; missing-record recovery stopped nothing");
50
+ for (const row of rows) {
51
+ const verdict = assertRecordIdentity(row.process);
52
+ if (!["match", "gone", "mismatch"].includes(verdict.kind))
53
+ refuse(`the ${row.role} creation identity cannot be checked; no member was stopped`);
54
+ }
55
+ return rows.sort((a, b) => ORDER.indexOf(a.role) - ORDER.indexOf(b.role));
56
+ }
57
+ /** Recovery never recreates service authority or runs a native adapter with inferred records. */
58
+ export async function lostRecordsStackDown(root, values) {
59
+ if (["with-agents", "abandon-stop", "abandon-launch", "preserve-state"].some((flag) => values[flag] !== undefined))
60
+ throw new CommandFailure("refused", "USAGE_INVALID", "missing-record recovery takes only --space, --yes, --dry-run and presentation flags; no member was stopped");
61
+ const presentation = presentationOf(values);
62
+ const inspect = () => {
63
+ const snapshot = readStackJournal(root);
64
+ if (!snapshot)
65
+ throw new CommandFailure("refused", "CONFLICT", "the stack journal disappeared before recovery; nothing was inferred");
66
+ if (values.space !== undefined && values.space !== snapshot.journal.space)
67
+ throw new CommandFailure("refused", "CONFLICT", "--space is not this folder's stack; no member was stopped");
68
+ if (!stackRecordsLost(snapshot))
69
+ throw new CommandFailure("refused", "CONFLICT", "the stack instance records changed before recovery; run down again");
70
+ return { snapshot, rows: members(snapshot) };
71
+ };
72
+ const initial = inspect();
73
+ recordOperationSpace(initial.snapshot.journal.space);
74
+ const target = { root, space: initial.snapshot.journal.space };
75
+ const preview = initial.rows.map((row) => ({ role: row.role, instanceId: row.instanceId, pid: row.process.pid, process: assertRecordIdentity(row.process).kind === "match" ? "running" : "gone" }));
76
+ if (values["dry-run"] === true) {
77
+ writeResult(presentation, { command: "down", target, result: { kind: "missing-records-stack-stop-preview", members: preview, dryRun: true, signalled: false }, noOp: true }, () => ({ sections: [{ title: "Stack member records are missing", blocks: [
78
+ { kind: "table", columns: [{ key: "role", label: "Member" }, { key: "instanceId", label: "Full instance" }, { key: "pid", label: "Pid" }, { key: "process", label: "Process" }], rows: preview.map((row) => ({ ...row, instanceId: row.instanceId, pid: String(row.pid) })) },
79
+ { kind: "lines", lines: ["Nothing was stopped or written. down --yes sends SIGTERM to the journal's creation-pinned members, manager first and broker last. It does not restore the missing service records."] },
80
+ ] }] }));
81
+ return;
82
+ }
83
+ const journal = initial.snapshot.journal;
84
+ if (journal.operation.kind === "down" && journal.operation.phase === "completed" && initial.rows.every((row) => (row.state === "stopped" || row.state === "already-stopped") && ["gone", "mismatch"].includes(assertRecordIdentity(row.process).kind))) {
85
+ writeResult(presentation, { command: "down", target, result: { kind: "missing-records-stack-stop", members: journal.members, recordsRestored: false }, noOp: true }, () => ({ sections: [{ title: "Stack is already stopped", blocks: [{ kind: "lines", lines: ["Every creation-pinned member is gone. No signal was sent or record changed."] }] }] }));
86
+ return;
87
+ }
88
+ if (values.yes !== true)
89
+ throw new ConfirmationRequired("stopping a stack whose instance records are missing requires --yes", { target, remedy: "run `cotal down --dry-run` to inspect its pinned members, then `cotal down --yes`" });
90
+ const lock = acquireStackOperationLock(root, "down");
91
+ try {
92
+ let { snapshot, rows } = inspect();
93
+ const operation = newStackOperation("down");
94
+ const save = (phase, member) => {
95
+ snapshot = writeStackJournal(root, snapshot, { ...snapshot.journal, members: snapshot.journal.members.map((row) => row.role === member?.role ? member : row), operation: { ...operation, phase }, updatedAt: new Date().toISOString() });
96
+ };
97
+ save("applying");
98
+ for (const row of rows) {
99
+ // Never continue under records or broker-sharing scope that reappeared during an earlier stop.
100
+ const current = readStackJournal(root);
101
+ if (!current || current.sha256 !== snapshot.sha256)
102
+ throw new CommandFailure("unknown", "OPERATION_UNKNOWN", "the stack journal changed during recovery; later members were not stopped", { target });
103
+ try {
104
+ members(current);
105
+ }
106
+ catch {
107
+ save("unknown");
108
+ throw new CommandFailure("unknown", "OPERATION_UNKNOWN", "the recovery scope changed after the stop began; recorded member outcomes were kept and later members were not stopped", { target, remedy: "restore the missing records or inspect the stack journal before running down again" });
109
+ }
110
+ const pin = row.process, verdict = assertRecordIdentity(pin);
111
+ if (verdict.kind === "match") {
112
+ try {
113
+ process.kill(pin.pid, "SIGTERM");
114
+ }
115
+ catch (error) {
116
+ if (error.code !== "ESRCH") {
117
+ save("unknown");
118
+ throw new CommandFailure("unknown", "OPERATION_UNKNOWN", `the ${row.role} signal was not confirmed; later members were not stopped`, { target });
119
+ }
120
+ }
121
+ const deadline = Date.now() + (row.role === "manager" ? 90_000 : 30_000);
122
+ while (assertRecordIdentity(pin).kind === "match" && probeLiveness(pin.pid) !== "dead" && Date.now() < deadline)
123
+ await delay(100);
124
+ const after = assertRecordIdentity(pin);
125
+ if (after.kind !== "gone" && after.kind !== "mismatch") {
126
+ save("unknown");
127
+ throw new CommandFailure("unknown", "OPERATION_UNKNOWN", `the ${row.role} exit was not confirmed; later members were not stopped`, { target, remedy: "run `cotal down --yes` again once that member exits" });
128
+ }
129
+ }
130
+ else if (verdict.kind !== "gone" && verdict.kind !== "mismatch") {
131
+ save("unknown");
132
+ throw new CommandFailure("unknown", "OPERATION_UNKNOWN", `the ${row.role} identity could not be verified; it and later members were not stopped`, { target });
133
+ }
134
+ save("applying", { ...row, state: verdict.kind === "match" ? "stopped" : "already-stopped" });
135
+ }
136
+ save("completed");
137
+ writeResult(presentation, { command: "down", target, result: { kind: "missing-records-stack-stop", members: snapshot.journal.members, recordsRestored: false } }, () => ({ sections: [{ title: "Stack stopped from its journal pins", blocks: [{ kind: "lines", lines: ["Every recorded member exited. Missing home records were not recreated. Prepare this space again with space create before starting it."] }] }, { title: "Next", blocks: [{ kind: "commands", items: [{ command: `cotal space create ${target.space}`, description: "Prepare the space again here, then run cotal up" }] }] }] }));
138
+ }
139
+ finally {
140
+ releaseMaintenanceLock(lock);
141
+ }
142
+ }
143
+ //# sourceMappingURL=stack-lost-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-lost-records.js","sourceRoot":"","sources":["../../src/commands/stack-lost-records.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type BrokerTransport, type ParsedArgs } from "@cotal-ai/core";
2
- import { CommandFailure, presentationOf, type MaintenanceLock, type Report, type UserAuthInfo } from "@cotal-ai/workspace";
2
+ import { CommandFailure, presentationOf, type MaintenanceLock, type OutputWarning, type Report, type UserAuthInfo } from "@cotal-ai/workspace";
3
3
  import { type StackJournal, type StackMode, type StackSettlement } from "../lib/stack-journal.js";
4
4
  import { type NatsServer } from "../lib/nats-bin.js";
5
5
  import { type StoreTenant } from "../lib/store-dir.js";
@@ -192,8 +192,8 @@ export interface StackUpResult {
192
192
  path: string;
193
193
  tenants: StoreTenant[];
194
194
  };
195
- /** The recorded store this call's broker started on, when it was missing and so started empty. */
196
- storeMissing?: string;
195
+ /** Store loss observed before this call reused or started the broker. */
196
+ storeWarnings?: OutputWarning[];
197
197
  }
198
198
  /** A `--server` broker URL as `up` records and compares it: the scheme in lower case, with no bare
199
199
  * trailing `/`. Any other value comes back as given, for the address checks to refuse. */
@@ -1 +1 @@
1
- {"version":3,"file":"stack-up.d.ts","sourceRoot":"","sources":["../../src/commands/stack-up.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stack-up.d.ts","sourceRoot":"","sources":["../../src/commands/stack-up.ts"],"names":[],"mappings":"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"}
@@ -28,9 +28,10 @@ import { prepareKernelServiceStop, prepareProcessService, readServiceLog, remove
28
28
  import { listLedgerFiles } from "../lib/manifest/ledger.js";
29
29
  import { listAdditiveTeamAttempts, retainedAdditiveTeamAttempts } from "../lib/team-additive-attempt.js";
30
30
  import { freshTeamAttemptSettled, listFreshTeamAttempts, listFreshTeamSummaries } from "../lib/team-fresh.js";
31
- import { foreignLocalProcesses, newStackOperation, readStackJournal, runningStackRoles, serviceHeldRecords, settleRetainedStackStops, settleStackOperation, STACK_ADAPTER, STACK_DEFINITION, STACK_ROLES, stackDefinitionsAt, stackMaintenanceFence, stackNeverStarted, stackOperationUnsettled, stackRoleApplies, stackSettlementNotice, withSettledMembers, writeStackJournal } from "../lib/stack-journal.js";
31
+ import { foreignLocalProcesses, newStackOperation, readStackJournal, runningStackRoles, serviceHeldRecords, settleRetainedStackStops, settleStackOperation, STACK_ADAPTER, STACK_DEFINITION, STACK_ROLES, stackDefinitionsAt, stackMaintenanceFence, stackNeverStarted, stackRecoveryHost, stackOperationUnsettled, stackRoleApplies, stackSettlementNotice, withSettledMembers, writeStackJournal } from "../lib/stack-journal.js";
32
32
  import { natsServerLabel } from "../lib/nats-bin.js";
33
- import { missingStoreWarning, sharedStoreAtStart, sharedStoreWarning } from "../lib/store-dir.js";
33
+ import { sharedStoreAtStart, sharedStoreWarning } from "../lib/store-dir.js";
34
+ import { readStoreIdentity, stackStoreWarnings } from "../lib/store-identity.js";
34
35
  import { assertManagerLogin, assertUserStackTransport, confirmUserAuthEndpoints, preflightUserStack, provisionalUserAuth, userRegistrationIncomplete } from "./stack-user-auth.js";
35
36
  /** Pin a named store that must already exist as a real directory, refusing a missing path, a
36
37
  * non-directory and a symlink. The pin and its rechecks narrow the window in which another local
@@ -191,7 +192,7 @@ export function controllerStackApplies(root, space, values) {
191
192
  function stackPreflight(root, space, recorded, ownAttempt) {
192
193
  // Its members' own pidfiles would read as legacy processes under a Cotal home with no record of them.
193
194
  if (recorded && stackRunsUnderOtherHome(root, recorded))
194
- throw new CommandFailure("refused", "TARGET_UNAVAILABLE", "this root's controller stack runs under another Cotal home; this one holds no record of its members, so nothing was started, adopted or replaced", { target: { root, space, cotalHome: homeCotalDir() }, remedy: stackHomeRemedy() });
195
+ throw new CommandFailure("refused", "TARGET_UNAVAILABLE", "this root's controller stack has missing member records in this Cotal home; nothing was started, adopted or replaced", { target: { root, space, cotalHome: homeCotalDir() }, remedy: stackHomeRemedy() });
195
196
  const maintenance = recorded ? stackMaintenanceFence(root, recorded) : { fenced: readMaintenanceJournal(root) !== undefined };
196
197
  if (maintenance.fenced)
197
198
  throw new CommandFailure("refused", "LIFECYCLE_BLOCKED", "this root retains a maintenance or recovery attempt; the controller stack did not substitute an ordinary startup", { target: { root, space } });
@@ -334,7 +335,7 @@ export function keptOnUp(space, kept) {
334
335
  * persona that cannot be written, or saved services that cannot be listed, is a warning. */
335
336
  export async function stackUp(request, native) {
336
337
  const before = usableSelection();
337
- const { journal, changed, allReused, admittedRestore, settled, brokerExecutable, streamsRecreated, rotation, storeShared, storeMissing } = await startControllerStack(request, native);
338
+ const { journal, changed, allReused, admittedRestore, settled, brokerExecutable, streamsRecreated, rotation, storeShared, storeWarnings } = await startControllerStack(request, native);
338
339
  const { root, space, server, mode } = journal;
339
340
  const managed = journal.members.some((row) => row.role === "manager" && (row.state === "started" || row.state === "reused"));
340
341
  // The receipt says when the start selected its space, and when another space stays selected.
@@ -343,8 +344,7 @@ export async function stackUp(request, native) {
343
344
  const selected = current === space && before !== space;
344
345
  const written = [];
345
346
  const warnings = settled ? [{ code: "OPERATION_SETTLED", target: { root, space, operation: settled.operation.id }, message: stackSettlementNotice(settled) }] : [];
346
- if (storeMissing)
347
- warnings.push({ code: "STORE_MISSING", target: { root, space, storeDir: storeMissing }, message: missingStoreWarning(storeMissing) });
347
+ warnings.push(...storeWarnings ?? []);
348
348
  if (storeShared)
349
349
  warnings.push({ code: "STORE_SHARED", target: { root, space, storeDir: storeShared.path, otherSpaces: storeShared.tenants }, message: sharedStoreWarning(storeShared.path, storeShared.tenants) });
350
350
  // Damage the broker found while it restored its stored files is logged by now.
@@ -639,7 +639,7 @@ export async function startControllerStack(request, native) {
639
639
  // another space uses it; the recorded or default store starts, and the receipt warns.
640
640
  const storePath = brokerStore !== undefined ? resolve(brokerStore) : join(root, ".cotal", "nats");
641
641
  const storeTenants = sharedStoreAtStart(storePath, space, recordedBroker !== undefined || legacyStopped || request.storeDir === undefined);
642
- const storeMissing = recordedBroker !== undefined && !existsSync(storePath);
642
+ const storeWarnings = previous ? stackStoreWarnings(previous.journal, !brokerIsRunning()) : [];
643
643
  // An up stopped after its broker served and before it registered the space leaves a broker whose
644
644
  // stream setup and registration only that up's own preparation could finish, and trust is never
645
645
  // prepared again under a running broker. This start refuses before any write and names the stop.
@@ -693,8 +693,11 @@ export async function startControllerStack(request, native) {
693
693
  const roles = STACK_ROLES.filter((role) => stackRoleApplies(mode, role) && !(role === "manager" && request.noManager));
694
694
  // A replacement an earlier `up` journaled is resolved from its own record before it is carried over.
695
695
  const recordedMembers = current ? withSettledMembers(current.journal, undefined).members : [];
696
- const members = STACK_ROLES.map((role) => ({ role, definition: STACK_DEFINITION[role], instanceId: recordedMembers.find((row) => row.role === role)?.instanceId ?? null, state: roles.includes(role) ? "planned" : "not-attempted" }));
697
- let journal = { schemaVersion: 1, kind: "cotal-stack-controller", root, space, server, mode, ...(recordedBroker ? { broker: recordedBroker } : {}), members, operation: newStackOperation("up"), updatedAt: new Date().toISOString() };
696
+ const members = STACK_ROLES.map((role) => {
697
+ const recorded = recordedMembers.find((row) => row.role === role);
698
+ return { role, definition: STACK_DEFINITION[role], instanceId: recorded?.instanceId ?? null, process: roles.includes(role) ? undefined : recorded?.process, state: roles.includes(role) ? "planned" : "not-attempted" };
699
+ });
700
+ let journal = { schemaVersion: 1, kind: "cotal-stack-controller", root, space, server, mode, recovery: { home: resolve(homeCotalDir()), host: stackRecoveryHost() }, ...(recordedBroker ? { broker: recordedBroker } : {}), members, operation: newStackOperation("up"), updatedAt: new Date().toISOString() };
698
701
  // The whole scoped plan is durable before the first effect. A crash after this reads as unsettled
699
702
  // until the next whole-stack operation settles it from its members' evidence.
700
703
  let snapshot = writeStackJournal(root, current ?? recorded, journal);
@@ -726,7 +729,7 @@ export async function startControllerStack(request, native) {
726
729
  process.stderr.write(`Starting ${definition.name}; waiting up to ${Math.round(definition.record.value.readiness.timeoutMs / 1000)}s for its readiness check\n`);
727
730
  // A redefined member starts its replacement under the IDs the journal already names.
728
731
  const started = await startProcessService(definition, replacement ? { replacement: { instanceId: replacement.instanceId, launchRequestId: replacement.launchRequestId } } : current[0] ? { instance: current[0].name } : {});
729
- mark(role, { instanceId: started.instance.name, state: started.noOp ? "reused" : "started", replacement: undefined });
732
+ mark(role, { instanceId: started.instance.name, state: started.noOp ? "reused" : "started", replacement: undefined, process: started.instance.record.value.process });
730
733
  if (!started.noOp)
731
734
  changed.push(instanceProjection(started.instance));
732
735
  return started.instance;
@@ -802,7 +805,7 @@ export async function startControllerStack(request, native) {
802
805
  // The validated transport decision is recorded before the broker child starts, so its
803
806
  // listener-report check compares against the transport this configuration actually serves.
804
807
  native.commitTransport(root, prepared.transport, { authTimeout: prepared.authTimeout, maxPayload: prepared.maxPayload });
805
- journal = { ...journal, broker: { storeDir: resolve(prepared.storeDir), ...(brokerCap !== undefined ? { maxFileStore: brokerCap } : {}), ...(brokerHost ? { host: brokerHost } : {}), ...(brokerLogFile !== undefined ? { logFile: resolve(brokerLogFile) } : {}), ...(brokerLogfileSizeLimit !== undefined ? { logfileSizeLimit: brokerLogfileSizeLimit } : {}), ...(brokerLogfileMaxNum !== undefined ? { logfileMaxNum: brokerLogfileMaxNum } : {}) }, updatedAt: new Date().toISOString() };
808
+ journal = { ...journal, broker: { storeDir: resolve(prepared.storeDir), ...(recordedBroker?.storeIdentity ? { storeIdentity: recordedBroker.storeIdentity } : {}), ...(brokerCap !== undefined ? { maxFileStore: brokerCap } : {}), ...(brokerHost ? { host: brokerHost } : {}), ...(brokerLogFile !== undefined ? { logFile: resolve(brokerLogFile) } : {}), ...(brokerLogfileSizeLimit !== undefined ? { logfileSizeLimit: brokerLogfileSizeLimit } : {}), ...(brokerLogfileMaxNum !== undefined ? { logfileMaxNum: brokerLogfileMaxNum } : {}) }, updatedAt: new Date().toISOString() };
806
809
  snapshot = writeStackJournal(root, snapshot, journal);
807
810
  }
808
811
  // A running stack broker keeps its saved definition; a fresh one is defined from this preparation.
@@ -816,7 +819,12 @@ export async function startControllerStack(request, native) {
816
819
  const broker = ensureDefinition(space, "broker", adapterDefinition(space, STACK_ADAPTER.broker, brokerOptions, 30000), root, replace("broker"));
817
820
  if (storePin)
818
821
  recheckExistingStore(storePin, { root, space });
822
+ const storeIdentity = prepared ? readStoreIdentity(prepared.storeDir) : undefined;
819
823
  const brokerInstance = await start("broker", broker);
824
+ if (storeIdentity && journal.broker) {
825
+ journal = { ...journal, broker: { ...journal.broker, storeIdentity }, updatedAt: new Date().toISOString() };
826
+ snapshot = writeStackJournal(root, snapshot, journal);
827
+ }
820
828
  if (brokerLogFile !== undefined) {
821
829
  let fd;
822
830
  try {
@@ -1023,7 +1031,7 @@ export async function startControllerStack(request, native) {
1023
1031
  : "the user stack's other members were already running and were reused; the manager was not attempted because no signed-in, granted login exists. This is not whole-stack readiness", { target: detail, changed, native: { code: "AUTH_REQUIRED", outcome: "refused", detail: loginBlock.message }, ...(loginBlock.remedy ? { remedy: loginBlock.remedy } : {}) });
1024
1032
  }
1025
1033
  const allReused = journal.members.every((row) => row.state === "reused" || row.state === "not-attempted");
1026
- return { journal, changed, allReused, ...(storeTenants.length ? { storeShared: { path: storePath, tenants: storeTenants } } : {}), ...(storeMissing && !brokerReused ? { storeMissing: storePath } : {}), ...(launch ? { launch } : {}), ...(admittedRestore ? { admittedRestore } : {}), ...(settled ? { settled } : {}), ...(brokerExecutable ? { brokerExecutable } : {}), ...(streamsRecreated ? { streamsRecreated: true } : {}), ...(rotation ? { rotation } : {}) };
1034
+ return { journal, changed, allReused, ...(storeTenants.length ? { storeShared: { path: storePath, tenants: storeTenants } } : {}), ...(storeWarnings.length ? { storeWarnings } : {}), ...(launch ? { launch } : {}), ...(admittedRestore ? { admittedRestore } : {}), ...(settled ? { settled } : {}), ...(brokerExecutable ? { brokerExecutable } : {}), ...(streamsRecreated ? { streamsRecreated: true } : {}), ...(rotation ? { rotation } : {}) };
1027
1035
  }
1028
1036
  /** Stop a broker this call started, through its exact kernel stop, and read whether its log says it
1029
1037
  * ran out of open files. A stop that does not confirm returns nothing, so the caller reports the