@cotal-ai/cli 0.68.0 → 0.70.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.
Files changed (114) hide show
  1. package/dist/commands/agents.d.ts.map +1 -1
  2. package/dist/commands/agents.js +2 -2
  3. package/dist/commands/agents.js.map +1 -1
  4. package/dist/commands/describe.d.ts.map +1 -1
  5. package/dist/commands/describe.js +2 -2
  6. package/dist/commands/describe.js.map +1 -1
  7. package/dist/commands/down.d.ts +0 -23
  8. package/dist/commands/down.d.ts.map +1 -1
  9. package/dist/commands/down.js +8 -217
  10. package/dist/commands/down.js.map +1 -1
  11. package/dist/commands/endpoints.d.ts.map +1 -1
  12. package/dist/commands/endpoints.js +4 -5
  13. package/dist/commands/endpoints.js.map +1 -1
  14. package/dist/commands/ext.d.ts.map +1 -1
  15. package/dist/commands/ext.js +4 -1
  16. package/dist/commands/ext.js.map +1 -1
  17. package/dist/commands/join.d.ts.map +1 -1
  18. package/dist/commands/join.js +3 -3
  19. package/dist/commands/join.js.map +1 -1
  20. package/dist/commands/meshes.d.ts.map +1 -1
  21. package/dist/commands/meshes.js +5 -3
  22. package/dist/commands/meshes.js.map +1 -1
  23. package/dist/commands/mint.d.ts.map +1 -1
  24. package/dist/commands/mint.js +8 -2
  25. package/dist/commands/mint.js.map +1 -1
  26. package/dist/commands/service.d.ts.map +1 -1
  27. package/dist/commands/service.js +30 -46
  28. package/dist/commands/service.js.map +1 -1
  29. package/dist/commands/setup.d.ts.map +1 -1
  30. package/dist/commands/setup.js +19 -6
  31. package/dist/commands/setup.js.map +1 -1
  32. package/dist/commands/spawn.d.ts.map +1 -1
  33. package/dist/commands/spawn.js +99 -65
  34. package/dist/commands/spawn.js.map +1 -1
  35. package/dist/commands/status.d.ts.map +1 -1
  36. package/dist/commands/status.js +40 -37
  37. package/dist/commands/status.js.map +1 -1
  38. package/dist/commands/sync.d.ts.map +1 -1
  39. package/dist/commands/sync.js +31 -25
  40. package/dist/commands/sync.js.map +1 -1
  41. package/dist/commands/up.d.ts +0 -2
  42. package/dist/commands/up.d.ts.map +1 -1
  43. package/dist/commands/up.js +139 -199
  44. package/dist/commands/up.js.map +1 -1
  45. package/dist/console/commands.d.ts.map +1 -1
  46. package/dist/console/commands.js +2 -3
  47. package/dist/console/commands.js.map +1 -1
  48. package/dist/console/ui/Detail.d.ts +1 -1
  49. package/dist/console/ui/Detail.d.ts.map +1 -1
  50. package/dist/console/ui/Detail.js +2 -2
  51. package/dist/console/ui/Detail.js.map +1 -1
  52. package/dist/console/ui/Dm.d.ts.map +1 -1
  53. package/dist/console/ui/Dm.js +7 -6
  54. package/dist/console/ui/Dm.js.map +1 -1
  55. package/dist/console/ui/Feed.d.ts.map +1 -1
  56. package/dist/console/ui/Feed.js +4 -3
  57. package/dist/console/ui/Feed.js.map +1 -1
  58. package/dist/console/ui/NeedsYou.d.ts +1 -1
  59. package/dist/console/ui/NeedsYou.d.ts.map +1 -1
  60. package/dist/console/ui/NeedsYou.js +3 -2
  61. package/dist/console/ui/NeedsYou.js.map +1 -1
  62. package/dist/console/ui/Roster.d.ts +1 -1
  63. package/dist/console/ui/Roster.d.ts.map +1 -1
  64. package/dist/console/ui/Roster.js +3 -2
  65. package/dist/console/ui/Roster.js.map +1 -1
  66. package/dist/console/ui/SpacePicker.d.ts +1 -1
  67. package/dist/console/ui/SpacePicker.d.ts.map +1 -1
  68. package/dist/console/ui/SpacePicker.js +1 -1
  69. package/dist/console/ui/SpacePicker.js.map +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +3 -9
  72. package/dist/index.js.map +1 -1
  73. package/dist/lib/control.d.ts +1 -13
  74. package/dist/lib/control.d.ts.map +1 -1
  75. package/dist/lib/control.js +6 -43
  76. package/dist/lib/control.js.map +1 -1
  77. package/dist/lib/delivery-proc.d.ts +11 -15
  78. package/dist/lib/delivery-proc.d.ts.map +1 -1
  79. package/dist/lib/delivery-proc.js +48 -30
  80. package/dist/lib/delivery-proc.js.map +1 -1
  81. package/dist/lib/local-process-stop.d.ts +29 -0
  82. package/dist/lib/local-process-stop.d.ts.map +1 -0
  83. package/dist/lib/local-process-stop.js +196 -0
  84. package/dist/lib/local-process-stop.js.map +1 -0
  85. package/dist/lib/manager-proc.d.ts +21 -19
  86. package/dist/lib/manager-proc.d.ts.map +1 -1
  87. package/dist/lib/manager-proc.js +63 -113
  88. package/dist/lib/manager-proc.js.map +1 -1
  89. package/dist/lib/manifest/ledger.js +1 -1
  90. package/dist/lib/manifest/live.d.ts.map +1 -1
  91. package/dist/lib/manifest/live.js +2 -4
  92. package/dist/lib/manifest/live.js.map +1 -1
  93. package/dist/lib/manifest/prepare.d.ts.map +1 -1
  94. package/dist/lib/manifest/prepare.js +2 -2
  95. package/dist/lib/manifest/prepare.js.map +1 -1
  96. package/dist/lib/self-exec.d.ts +1 -1
  97. package/dist/lib/self-exec.js +1 -1
  98. package/dist/lib/status.d.ts +14 -9
  99. package/dist/lib/status.d.ts.map +1 -1
  100. package/dist/lib/status.js +24 -45
  101. package/dist/lib/status.js.map +1 -1
  102. package/dist/lib/teardown-spare.js +3 -3
  103. package/dist/lib/teardown-spare.js.map +1 -1
  104. package/dist/render.d.ts +1 -1
  105. package/dist/render.d.ts.map +1 -1
  106. package/dist/render.js +2 -2
  107. package/dist/render.js.map +1 -1
  108. package/dist/ui.d.ts +9 -9
  109. package/dist/ui.d.ts.map +1 -1
  110. package/dist/ui.js +16 -18
  111. package/dist/ui.js.map +1 -1
  112. package/dist/view/mesh-view.js +1 -1
  113. package/dist/view/mesh-view.js.map +1 -1
  114. package/package.json +4 -4
@@ -0,0 +1,196 @@
1
+ /** Stopping one recorded local process: the stop `cotal down` runs for every component, and the
2
+ * one every manager and delivery teardown shares through `stopManager` and `stopDelivery`. */
3
+ import { closeSync, existsSync, linkSync, openSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4
+ import { randomBytes } from "node:crypto";
5
+ import { identityLegacyWarning, identityRefusal, identityUncertaintyRefusal, localProcessPath, parsePid, probeLiveness, readPidfile, readProcessCommand, removePidPair, stopReservationPath, verifyIdentityPin, } from "@cotal-ai/workspace";
6
+ import { c } from "../ui.js";
7
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
8
+ export function processRecorded(component, context) {
9
+ return existsSync(localProcessPath(component.pidFile, context)) || (component.artifacts ?? []).map((artifact) => localProcessPath(artifact, context)).some(existsSync);
10
+ }
11
+ /** Take a stop reservation at `marker` for this process, refusing while another live stop holds it.
12
+ * The caller removes `marker` when its stop is over. */
13
+ function reserveStop(name, marker) {
14
+ let markerFd;
15
+ for (;;) {
16
+ // ATOMIC publish (the pid-slot pattern): fill a private temp inode with our pid FIRST, then
17
+ // `link(2)` it as the marker - a no-overwrite atomic op. A contender therefore never observes an
18
+ // empty marker mid-publish; the old `openSync(marker,"wx")` then `writeFileSync` left exactly
19
+ // that window, and a reader in it saw owner=undefined and reclaimed a LIVE owner's reservation
20
+ // (mutual exclusion defeated). The published name and the held fd both keep the inode alive.
21
+ const temp = `${marker}.${process.pid}.${randomBytes(4).toString("hex")}`;
22
+ try {
23
+ markerFd = openSync(temp, "wx", 0o600);
24
+ writeFileSync(markerFd, String(process.pid));
25
+ linkSync(temp, marker); // EEXIST here = the marker is already held
26
+ rmSync(temp, { force: true });
27
+ break;
28
+ }
29
+ catch (e) {
30
+ if (markerFd !== undefined) {
31
+ closeSync(markerFd);
32
+ markerFd = undefined;
33
+ }
34
+ try {
35
+ rmSync(temp, { force: true });
36
+ }
37
+ catch { /* never created, or already gone */ }
38
+ if (e.code !== "EEXIST")
39
+ throw e;
40
+ let owner;
41
+ try {
42
+ owner = parsePid(readFileSync(marker, "utf8"));
43
+ }
44
+ catch (readErr) {
45
+ if (readErr.code === "ENOENT")
46
+ continue; // holder released between publish-refusal and read
47
+ throw readErr;
48
+ }
49
+ // The atomic publish above is what closes the race: a LIVE `down` holding the marker always
50
+ // wrote its own POSITIVE pid into it (no empty/partial window), so a live holder is always a
51
+ // valid pid that is alive/EPERM/unknown - and THOSE we never reclaim (that is the mutual
52
+ // exclusion). An UNATTRIBUTABLE marker (empty / 0 / negative / garbled) therefore cannot
53
+ // represent a live holder; it is a stale or crashed reservation, and reclaiming it is both safe
54
+ // and required so a crashed `down` never wedges the next one. So: reclaim an unattributable
55
+ // owner or a valid pid PROVEN dead (ESRCH); refuse only a valid pid that is alive or whose
56
+ // liveness we cannot confirm.
57
+ if (owner !== undefined && probeLiveness(owner) !== "dead")
58
+ throw new Error(`${name} is already being stopped by another process (pid ${owner})`);
59
+ rmSync(marker, { force: true });
60
+ }
61
+ }
62
+ closeSync(markerFd);
63
+ }
64
+ /** Stop one recorded process and await its actual exit before the next dependency is stopped. */
65
+ export async function stopLocalProcess(component, context, options = {}) {
66
+ const pidPath = localProcessPath(component.pidFile, context);
67
+ const found = processRecorded(component, context);
68
+ const rawPid = readPidfile(pidPath);
69
+ if (rawPid === undefined)
70
+ return found;
71
+ if (rawPid.startsWith("removing:")) {
72
+ const owner = parsePid(rawPid.slice("removing:".length));
73
+ throw new Error(owner && probeLiveness(owner) === "alive"
74
+ ? `${component.name} extension removal is in progress (pid ${owner})`
75
+ : `${component.name} has a stale extension-removal reservation at ${pidPath} - remove that file and retry`);
76
+ }
77
+ const pid = parsePid(rawPid);
78
+ const marker = stopReservationPath(pidPath);
79
+ reserveStop(component.name, marker);
80
+ let stopped = false;
81
+ let authorized = false;
82
+ try {
83
+ if (pid === undefined) {
84
+ // An EMPTY pidfile is a pre-protocol husk (no process behind it) and is safe to clear. Any
85
+ // OTHER unattributable content (garbled, fractional, out-of-range - anything `parsePid`
86
+ // rejects) may still front a LIVE process we cannot identify or signal; removing it would
87
+ // orphan that process while reporting a clean stop (the signer-orphan this slice must not do).
88
+ // Refuse loud and preserve it.
89
+ if (rawPid === "") {
90
+ console.log(c.dim(`${component.label} had an empty pidfile.`));
91
+ stopped = true; // husk cleared in `finally`
92
+ return true;
93
+ }
94
+ throw new Error(`${component.label} has an unattributable pidfile at ${pidPath} (${JSON.stringify(rawPid)}) - it may still front a running process; refusing to remove it or report a clean stop. Stop that process and remove the file manually.`);
95
+ }
96
+ // Attribution before the pin (#1528): it also catches a reused pid behind a legacy record, which
97
+ // the pin would let through to the signal. A command that cannot be read proves nothing.
98
+ if (component.isOwnCommand) {
99
+ const command = readProcessCommand(pid);
100
+ if (command.kind === "command" && !component.isOwnCommand(command.command)) {
101
+ console.error(`! recorded ${component.label} pid ${pid} is alive but is running \`${command.command}\`, which is not a ${component.label} - not signalling it; removing the stale record instead.`);
102
+ stopped = true;
103
+ return true;
104
+ }
105
+ }
106
+ // #969 OPEN-VERIFY-TERMINATE: identity before signal, the same rule the auth helper applies. This
107
+ // is the path every manager and delivery stop takes, and the one `cotal down` uses for the BROKER,
108
+ // the web dashboard and every extension component, so all of them share one identity rule.
109
+ const identity = verifyIdentityPin(pidPath);
110
+ if (identity.kind === "mismatch")
111
+ throw identityRefusal(component.label, pidPath, identity.record, identity.liveToken);
112
+ if (identity.kind === "legacy" && options.owns) {
113
+ // A readable command that is not this component's means the record outlived its process and
114
+ // the pid was reused. Signalling it would kill an unrelated process; the stale record goes.
115
+ const cmd = readProcessCommand(pid);
116
+ if (cmd.kind === "command" && !options.owns(cmd.command)) {
117
+ console.error(`! ${component.label} pid ${pid} is alive but is running \`${cmd.command}\`, which is not the ${component.label} - not signalling it; removing the stale record instead.`);
118
+ stopped = true;
119
+ return true;
120
+ }
121
+ }
122
+ if (identity.kind === "legacy")
123
+ console.error(identityLegacyWarning(component.label, pidPath));
124
+ else if (identity.kind !== "match" && identity.kind !== "gone")
125
+ throw identityUncertaintyRefusal(component.label, pidPath, identity);
126
+ // The beforeSignal hook authorizes an action against a LIVE exact process. A pinned record whose
127
+ // process is already ESRCH-gone needs no spare capability or destructive intent because no signal
128
+ // will be sent. Clear that stale record directly, preserving the hook's documented placement
129
+ // immediately before SIGTERM and avoiding a false "identity is not pinned" refusal on cleanup.
130
+ if (identity.kind === "gone") {
131
+ console.log(c.dim(`${component.label} (pid ${pid}) was not running.`));
132
+ stopped = true;
133
+ return true;
134
+ }
135
+ authorized = true;
136
+ options.beforeSignal?.({
137
+ target: identity.kind === "match" ? identity.record : { pid },
138
+ stopper: { pid: process.pid, marker },
139
+ });
140
+ try {
141
+ process.kill(pid, "SIGTERM");
142
+ }
143
+ catch (e) {
144
+ // ONLY an ESRCH proves the process is already gone (safe to clear). EPERM (exists, another
145
+ // user's) or any other errno (EIO, argument errors, unknown) means we could NOT confirm death
146
+ // - reporting it stopped and removing its record would orphan a live process. Fail loud, keep
147
+ // the record. A two-state "not alive => gone" is exactly the bug: `unknown` is not `dead`.
148
+ if (e.code === "ESRCH") {
149
+ console.log(c.dim(`${component.label} (pid ${pid}) was not running.`));
150
+ stopped = true;
151
+ return true;
152
+ }
153
+ throw new Error(`could not signal ${component.label} (pid ${pid}) (${e.code ?? "unknown error"}) - refusing to report it stopped or remove its record; stop it manually`);
154
+ }
155
+ // Wait for CONFIRMED death (ESRCH), escalating to SIGKILL; `unknown`/`alive` both keep us
156
+ // waiting, and if death is never confirmed the record is preserved (never deleted on a guess).
157
+ const graceDeadline = Date.now() + 15_000;
158
+ while (probeLiveness(pid) !== "dead" && Date.now() < graceDeadline)
159
+ await sleep(100);
160
+ if (probeLiveness(pid) !== "dead") {
161
+ try {
162
+ process.kill(pid, "SIGKILL");
163
+ }
164
+ catch { /* raced to exit */ }
165
+ const hardDeadline = Date.now() + 3_000;
166
+ while (probeLiveness(pid) !== "dead" && Date.now() < hardDeadline)
167
+ await sleep(100);
168
+ }
169
+ if (probeLiveness(pid) !== "dead")
170
+ throw new Error(`${component.label} (pid ${pid}) did not exit, or its death could not be confirmed; its pidfile was preserved`);
171
+ stopped = true;
172
+ console.log(c.green(`✓ stopped ${component.label} (pid ${pid})`));
173
+ return true;
174
+ }
175
+ finally {
176
+ // Remove the pidfile ONLY when we confirmed a clean stop: `stopped` is set exclusively on an
177
+ // ESRCH-proven death (already-gone, or a confirmed exit). Every other exit from the try above is
178
+ // a throw that must PRESERVE the record - an unattributable pidfile, a process we could not
179
+ // signal, or a death we could not confirm (`unknown`). The old `|| !isAlive(pid)` clause treated
180
+ // `unknown` as gone and deleted a live process's record; it is gone.
181
+ // The pin goes with the pidfile (#969), and only while the pidfile still names the stopped pid: a
182
+ // publish that committed a successor meanwhile is left whole (#1238).
183
+ try {
184
+ if (stopped)
185
+ removePidPair(pidPath, rawPid);
186
+ else if (authorized)
187
+ options.afterFailedSignal?.();
188
+ }
189
+ finally {
190
+ // A cleanup that throws still ends this stop: a reservation left behind refuses every other
191
+ // stop of this component for as long as this process lives.
192
+ rmSync(marker, { force: true });
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=local-process-stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-process-stop.js","sourceRoot":"","sources":["../../src/lib/local-process-stop.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export declare const managerLogDisplayPath: (space: string, root?: string) => st
16
16
  /** Exported so the delivery cutover preflight can NAME the pid it refused on: an error that says
17
17
  * "cannot be attributed" without saying which pid is not actionable. READ-resolving, so it also
18
18
  * names a pre-segmentation `manager.pid` when that is the record actually on disk. */
19
- export declare const MANAGER_PID_PATH: (space?: string) => string;
19
+ export declare const MANAGER_PID_PATH: (space?: string, root?: string) => string;
20
20
  /** The recorded manager's state. THREE-VALUED liveness plus absent, because collapsing it to a
21
21
  * boolean is what made this dangerous. Both collapses are silent and both are wrong:
22
22
  * `!== "dead"` -> an `unknown` reports UP forever; no retry clears it and nothing starts.
@@ -37,6 +37,8 @@ export interface ManagerRecord {
37
37
  state: ManagerRecordState;
38
38
  /** The recorded pid, when the file held one. */
39
39
  pid?: number;
40
+ /** The record's content, when it is not a pid (present on `unattributable`). */
41
+ content?: string;
40
42
  /** The live process's command line, when it was readable (present on `alive` and `foreign`). */
41
43
  command?: string;
42
44
  }
@@ -48,7 +50,7 @@ export interface ManagerRecord {
48
50
  * argument, and it is the same one the liveness probe makes: absence of evidence must fail toward
49
51
  * the old behaviour (trust the record), because the opposite error starts a second manager on top
50
52
  * of a live one. */
51
- export declare function managerRecordState(probe?: LivenessProbe, readCommand?: CommandReader, space?: string): ManagerRecord;
53
+ export declare function managerRecordState(probe?: LivenessProbe, readCommand?: CommandReader, space?: string, root?: string): ManagerRecord;
52
54
  /** {@link managerRecordState}'s verdict alone, for the callers that only branch on it. */
53
55
  export declare function managerLiveness(probe?: LivenessProbe, readCommand?: CommandReader, space?: string): ManagerRecordState;
54
56
  /** One line describing what was found behind the record, for a caller that has to explain itself. */
@@ -105,21 +107,21 @@ export declare function ensureManager(o?: ManagerStartOpts, probe?: LivenessProb
105
107
  * another user's process or by kernel policy, so the branch that handles it is otherwise unreachable
106
108
  * from a test. Production passes nothing. */
107
109
  export type SignalFn = (pid: number, signal: NodeJS.Signals) => void;
108
- /** What a stop actually achieved, because "void" let this function claim success it had not earned. */
109
- export type StopVerdict = "stopped" | "already-gone";
110
- /** Blocking sleep. DO NOT reintroduce this for death-waiting: it blocks the event loop, so a child
111
- * of this process is never reaped, remains a signalable zombie, and reads `alive` forever. That
112
- * turned `cotal up` + Ctrl-C into an exit-1 that left the broker running. Death-waits await. */
113
- /** Stop the detached (pty) manager if we started one, and remove its records ONLY once it is gone.
114
- *
115
- * THIS USED TO CATCH EVERY SIGNAL FAILURE AS "already gone" AND DELETE THE RECORDS ANYWAY. That was
116
- * survivable while `EPERM` was misread as dead, because the caller never got here: the cutover
117
- * preflight skipped a manager it thought was not running. Resolving `EPERM` to `alive` (the fix this
118
- * change exists for) makes the preflight recognise ANOTHER USER's live manager and call this, at
119
- * which point the old code sent a signal it was not permitted to send, swallowed the refusal, and
120
- * deleted the pidfile and marker of a process that was still running and still bound to Plane 3.
121
- * A correct fix upstream reaching a latent destructive bug downstream is the worst shape available,
122
- * so this refuses instead: records are removed only on proven death, never on a signal we could not
123
- * send or a death we could not confirm. Found by review, with a kernel seccomp proof. */
124
- export declare function stopManager(probe?: LivenessProbe, signal?: SignalFn | undefined, readCommand?: CommandReader, space?: string): Promise<StopVerdict>;
110
+ /** The manager as `cotal down` registers it: its pidfile, and the records that die with its process. */
111
+ export declare const MANAGER_PROCESS: {
112
+ kind: "local-process";
113
+ name: string;
114
+ label: string;
115
+ order: number;
116
+ pidFile: string;
117
+ artifacts: string[];
118
+ };
119
+ /** Stop the space's manager. This is the one manager stop: `cotal down`, every `cotal up` teardown and
120
+ * the delivery cutover preflight run it, so each holds the stop reservation, refuses a concurrent stop,
121
+ * and escalates a wedged manager to SIGKILL. A default stop signals only a manager that published the
122
+ * capability to spare its managed agents, and reports the agents it left; `withAgents` arms their reap
123
+ * instead. Throws, with the records kept, when the stop is refused or the death is not confirmed. */
124
+ export declare function stopManager(space?: string, { withAgents }?: {
125
+ withAgents?: boolean | undefined;
126
+ }): Promise<boolean>;
125
127
  //# sourceMappingURL=manager-proc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager-proc.d.ts","sourceRoot":"","sources":["../../src/lib/manager-proc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager-proc.d.ts","sourceRoot":"","sources":["../../src/lib/manager-proc.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,10 @@ import { DEFAULT_SERVER } from "@cotal-ai/core";
5
5
  import { selfArgv } from "./self-exec.js";
6
6
  import { resolveRuntimeSpace } from "./status.js";
7
7
  import { cotalRoot } from "./paths.js";
8
- import { canonicalLocalProcessPath, commandIsCotalSupervisor, localProcessPath, parsePid, probeLiveness, readPidfile, readProcessCommand, reclaimDeadPreUpgradeRecord, MANAGER_DELIVERY_AWARE_MARKER, MANAGER_LOGFILE, MANAGER_PIDFILE, identityLegacyWarning, identityRefusal, identityUncertaintyRefusal, parsePositiveIntegerFlag, removePidPair, verifyIdentityPin, writePidPair, } from "@cotal-ai/workspace";
8
+ import { assertManagerCanSpare, armManagerShutdownIntent, disarmManagerShutdownIntent, canonicalLocalProcessPath, commandIsCotalSupervisor, localProcessPath, parsePid, probeLiveness, readPidfile, readProcessCommand, reclaimDeadPreUpgradeRecord, MANAGER_DELIVERY_AWARE_MARKER, MANAGER_LOGFILE, MANAGER_PIDFILE, MANAGER_SHUTDOWN_INTENT, MANAGER_SPARE_CAPABILITY, parsePositiveIntegerFlag, verifyIdentityPin, writePidPair, } from "@cotal-ai/workspace";
9
+ import { c } from "../ui.js";
10
+ import { stopLocalProcess } from "./local-process-stop.js";
11
+ import { listManagerSeatsForSpare, printLegacyManagerSpareUncertainty, printSparedAgents } from "./teardown-spare.js";
9
12
  /** The `--max-sessions` value a live `cotal supervise` argv is actually serving.
10
13
  *
11
14
  * The manager reads that flag only at start. A refresh that records a different number while this
@@ -54,7 +57,7 @@ export const managerLogDisplayPath = (space, root = cotalRoot()) => relative(roo
54
57
  /** Exported so the delivery cutover preflight can NAME the pid it refused on: an error that says
55
58
  * "cannot be attributed" without saying which pid is not actionable. READ-resolving, so it also
56
59
  * names a pre-segmentation `manager.pid` when that is the record actually on disk. */
57
- export const MANAGER_PID_PATH = (space = folderSpace()) => localProcessPath(MANAGER_PIDFILE, ctx(space));
60
+ export const MANAGER_PID_PATH = (space = folderSpace(), root = cotalRoot()) => localProcessPath(MANAGER_PIDFILE, { root, space });
58
61
  const PID_PATH = MANAGER_PID_PATH;
59
62
  /** Sibling marker of `manager.pid`: written by THIS build's manager (which no longer hosts Plane-3 —
60
63
  * the server-side delivery daemon does). Its presence beside a live `manager.pid` proves the manager is
@@ -71,8 +74,8 @@ const DELIVERY_AWARE_MARKER = (space = folderSpace()) => localProcessPath(MANAGE
71
74
  * argument, and it is the same one the liveness probe makes: absence of evidence must fail toward
72
75
  * the old behaviour (trust the record), because the opposite error starts a second manager on top
73
76
  * of a live one. */
74
- export function managerRecordState(probe = probeLiveness, readCommand = readProcessCommand, space = folderSpace()) {
75
- const raw = readPidfile(PID_PATH(space));
77
+ export function managerRecordState(probe = probeLiveness, readCommand = readProcessCommand, space = folderSpace(), root = cotalRoot()) {
78
+ const raw = readPidfile(PID_PATH(space, root));
76
79
  if (!raw)
77
80
  return { state: "absent" }; // no record, or a pre-protocol husk: nothing is behind it
78
81
  const pid = parsePid(raw);
@@ -81,7 +84,7 @@ export function managerRecordState(probe = probeLiveness, readCommand = readProc
81
84
  // that record may front a live process nobody can identify. `absent` means no pidfile (or an
82
85
  // empty husk); corrupt content is its own state and every action path must refuse on it.
83
86
  if (pid === undefined)
84
- return { state: "unattributable" };
87
+ return { state: "unattributable", content: raw };
85
88
  const liveness = probe(pid);
86
89
  if (liveness !== "alive")
87
90
  return { state: liveness, pid };
@@ -221,11 +224,11 @@ export function assertManagerRecordReplaceable(probe = probeLiveness, readComman
221
224
  if (state === "foreign")
222
225
  console.error(`! ${describeManagerRecord(record)} - that is not a manager, so the record is stale (its process exited and the pid was reused). Replacing it.`);
223
226
  if (state === "unattributable")
224
- throw new Error(`the manager pidfile at ${p} holds content that is not a pid (${JSON.stringify(readFileSync(p, "utf8").trim())}).\n` +
227
+ throw new Error(`the manager pidfile at ${p} holds content that is not a pid (${JSON.stringify(record.content)}).\n` +
225
228
  `Refusing to start a manager over it: that record may front a live process nobody can identify, and overwriting it would orphan the process while reporting a healthy control plane.\n` +
226
229
  `NEXT: find and stop that process, then remove \`${p}\` by hand.`);
227
230
  if (state === "unknown")
228
- throw new Error(`the recorded manager pid (${readFileSync(p, "utf8").trim()}) cannot be attributed: the kernel answered neither "running" nor "no such process" (a seccomp filter or LSM policy does this inside some sandboxes).\n` +
231
+ throw new Error(`the recorded manager pid (${record.pid}) cannot be attributed: the kernel answered neither "running" nor "no such process" (a seccomp filter or LSM policy does this inside some sandboxes).\n` +
229
232
  `Refusing to start a manager over it: it may still be running and bound to the control plane.\n` +
230
233
  `NEXT: verify with \`ps -p <pid>\`. If it is gone, remove \`${p}\` and re-run.`);
231
234
  }
@@ -242,112 +245,59 @@ export function ensureManager(o = {}, probe = probeLiveness, readCommand = readP
242
245
  const pid = startManagerDetached(o);
243
246
  return { running: true, started: true, pid };
244
247
  }
245
- /** Blocking sleep. DO NOT reintroduce this for death-waiting: it blocks the event loop, so a child
246
- * of this process is never reaped, remains a signalable zombie, and reads `alive` forever. That
247
- * turned `cotal up` + Ctrl-C into an exit-1 that left the broker running. Death-waits await. */
248
- // (sleepSync removed: see above.)
249
- /** Stop the detached (pty) manager if we started one, and remove its records ONLY once it is gone.
250
- *
251
- * THIS USED TO CATCH EVERY SIGNAL FAILURE AS "already gone" AND DELETE THE RECORDS ANYWAY. That was
252
- * survivable while `EPERM` was misread as dead, because the caller never got here: the cutover
253
- * preflight skipped a manager it thought was not running. Resolving `EPERM` to `alive` (the fix this
254
- * change exists for) makes the preflight recognise ANOTHER USER's live manager and call this, at
255
- * which point the old code sent a signal it was not permitted to send, swallowed the refusal, and
256
- * deleted the pidfile and marker of a process that was still running and still bound to Plane 3.
257
- * A correct fix upstream reaching a latent destructive bug downstream is the worst shape available,
258
- * so this refuses instead: records are removed only on proven death, never on a signal we could not
259
- * send or a death we could not confirm. Found by review, with a kernel seccomp proof. */
260
- export async function stopManager(probe = probeLiveness, signal = undefined, readCommand = readProcessCommand, space = folderSpace()) {
261
- const send = signal ?? ((pid, sig) => process.kill(pid, sig));
262
- const p = PID_PATH(space);
263
- const marker = DELIVERY_AWARE_MARKER(space);
264
- const raw = readPidfile(p);
265
- if (raw === undefined) {
266
- rmSync(marker, { force: true }); // a marker with no pid records nothing
267
- return "already-gone";
268
- }
269
- // Records are cleared only on PROVEN death; the identity pin is removed with them so the next
270
- // start does not inherit a pin for a process that no longer exists (#969), unless a successor was
271
- // published meanwhile (#1238).
272
- const clear = () => {
273
- rmSync(marker, { force: true });
274
- removePidPair(p, raw);
275
- };
276
- const pid = parsePid(raw);
277
- if (pid === undefined) {
278
- // An EMPTY pidfile is a pre-protocol husk with nothing behind it, and clearing it is safe. ANY
279
- // OTHER unattributable content (garbled, fractional, out of range) may still front a LIVE
280
- // process we cannot identify or signal, so removing it would orphan that process while
281
- // reporting a clean stop. The contract at the top of pid.ts says such content is never a pid to
282
- // delete a record against; this is that rule at the destructive end, matching down.ts:298-311
283
- // and stopAuthService, which already refuse. My first version cleared it.
284
- if (raw === "") {
285
- clear();
286
- return "already-gone";
287
- }
288
- throw new Error(`the manager pidfile at ${p} is unattributable (${JSON.stringify(raw)}): it may still front a running process nobody can identify.\n` +
289
- `Refusing to remove it or report a clean stop; the delivery-aware marker is preserved with it.\n` +
290
- `NEXT: find and stop that process, then remove the file by hand.`);
291
- }
292
- const before = probe(pid);
293
- if (before === "dead") {
294
- clear();
295
- return "already-gone";
296
- }
297
- // A LIVE pid that is provably NOT a manager is never signalled. The record outlived its process
298
- // and the number was reused, so SIGTERM here would kill an unrelated process — the exact
299
- // destructive shape the rest of this function refuses on doubt, reached through certainty. The
300
- // record is removed because it is provably stale, and what was found is printed: an operator who
301
- // is told only "already gone" will not know their pidfile was pointing at a stranger.
302
- if (before === "alive") {
303
- const cmd = readCommand(pid);
304
- if (cmd.kind === "command" && !commandIsCotalSupervisor(cmd.command)) {
305
- console.error(`! recorded manager pid ${pid} is alive but is running \`${cmd.command}\`, which is not a manager - not signalling it; removing the stale record instead.`);
306
- clear();
307
- return "already-gone";
308
- }
309
- }
310
- if (before === "unknown")
311
- throw new Error(`refusing to stop manager pid ${pid}: its liveness cannot be determined (the kernel answered neither "running" nor "no such process"; a seccomp filter or LSM policy does this).\n` +
312
- `The pidfile and delivery-aware marker are LEFT IN PLACE: deleting them would orphan a process that may still be bound to the control plane.\n` +
313
- `NEXT: verify with \`ps -p ${pid}\`, then stop it yourself or remove \`${p}\` if it is gone.`);
314
- // #969 OPEN-VERIFY-TERMINATE: establish target identity BEFORE any signal. A pinned record whose
315
- // live process carries a DIFFERENT start means the pid was reused and fronts an unrelated process
316
- // (attribution above cannot catch a reused pid that happens to run a supervisor-shaped command);
317
- // a torn or unreadable pin cannot prove identity either. A legacy record warns and proceeds so an
318
- // upgraded CLI can stop a manager launched before pins existed. A MATCH is fully verified.
319
- const identity = verifyIdentityPin(p);
320
- if (identity.kind === "mismatch")
321
- throw identityRefusal("the manager", p, identity.record, identity.liveToken);
322
- if (identity.kind === "legacy")
323
- console.error(identityLegacyWarning("the manager", p));
324
- else if (identity.kind !== "match" && identity.kind !== "gone")
325
- throw identityUncertaintyRefusal("the manager", p, identity);
326
- try {
327
- send(pid, "SIGTERM");
328
- }
329
- catch (e) {
330
- const code = e.code;
331
- if (code === "ESRCH") {
332
- clear(); // died between the probe and the signal, which is an ordinary race and genuinely gone
333
- return "already-gone";
334
- }
335
- throw new Error(`refusing to stop manager pid ${pid}: the signal was rejected (${code ?? "unknown error"}).\n` +
336
- `EPERM here means the process belongs to another user, so it is running and NOT ours to stop. The pidfile and marker are LEFT IN PLACE.\n` +
337
- `NEXT: stop it as its owner, or remove \`${p}\` if you are certain it is gone.`);
248
+ /** The manager as `cotal down` registers it: its pidfile, and the records that die with its process. */
249
+ export const MANAGER_PROCESS = {
250
+ kind: "local-process",
251
+ name: "manager",
252
+ label: "manager",
253
+ order: 10,
254
+ pidFile: MANAGER_PIDFILE,
255
+ artifacts: [MANAGER_DELIVERY_AWARE_MARKER, MANAGER_SHUTDOWN_INTENT, MANAGER_SPARE_CAPABILITY],
256
+ };
257
+ /** Stop the space's manager. This is the one manager stop: `cotal down`, every `cotal up` teardown and
258
+ * the delivery cutover preflight run it, so each holds the stop reservation, refuses a concurrent stop,
259
+ * and escalates a wedged manager to SIGKILL. A default stop signals only a manager that published the
260
+ * capability to spare its managed agents, and reports the agents it left; `withAgents` arms their reap
261
+ * instead. Throws, with the records kept, when the stop is refused or the death is not confirmed. */
262
+ export async function stopManager(space = folderSpace(), { withAgents = false } = {}) {
263
+ const context = ctx(space);
264
+ let spared;
265
+ let spareSeats;
266
+ let legacyManagerSpareUnverified = false;
267
+ if (!withAgents && existsSync(PID_PATH(space))) {
268
+ const pin = verifyIdentityPin(PID_PATH(space));
269
+ if (pin.kind === "legacy")
270
+ legacyManagerSpareUnverified = true;
271
+ else if (pin.kind === "match")
272
+ spared = await listManagerSeatsForSpare(context);
338
273
  }
339
- // The signal was accepted, which is not the same as the process being gone. Prove it before
340
- // removing the record, bounded, because a record deleted while its process lives is the defect.
341
- // AWAIT, never a blocking sleep: this process spawned the manager, so the event loop must run
342
- // for it to be reaped. A blocked loop leaves a zombie that still answers kill(pid,0).
343
- for (let i = 0; i < 40 && probe(pid) === "alive"; i++)
344
- await new Promise((r) => setTimeout(r, 50));
345
- const after = probe(pid);
346
- if (after !== "dead")
347
- throw new Error(`manager pid ${pid} accepted SIGTERM but was still ${after === "alive" ? "running" : "unattributable"} after 2s.\n` +
348
- `The pidfile and marker are LEFT IN PLACE rather than recording a stop that did not happen.\n` +
349
- `NEXT: check \`ps -p ${pid}\` and stop it directly if it is wedged.`);
350
- clear();
351
- return "stopped";
274
+ const found = await stopLocalProcess(MANAGER_PROCESS, context, {
275
+ owns: commandIsCotalSupervisor,
276
+ beforeSignal: (attempt) => {
277
+ if (attempt.target.token === undefined) {
278
+ // Upgrade compatibility follows the shared identity contract: a live pre-pin record
279
+ // is signalled after the warning emitted by stopLocalProcess. A default stop cannot verify
280
+ // the newer spare capability. Destructive down uses the helper's reduced-guarantee
281
+ // pid + reservation-inode handoff. A present pin still takes the fully identity-bound
282
+ // paths below, and a mismatching pin was already refused before this hook.
283
+ if (!withAgents)
284
+ console.error(c.dim("could not verify that this legacy manager can spare its managed agents; signalling it for upgrade compatibility"));
285
+ }
286
+ if (withAgents)
287
+ armManagerShutdownIntent(context, attempt);
288
+ else if (attempt.target.token !== undefined)
289
+ spareSeats = assertManagerCanSpare(context, undefined, attempt.target);
290
+ },
291
+ // Disarmed by the attempt that armed it, inside its reservation: a stop refused the reservation
292
+ // never reaches this, so it cannot remove the intent of the stop that holds it.
293
+ afterFailedSignal: withAgents ? () => disarmManagerShutdownIntent(context) : undefined,
294
+ });
295
+ for (const artifact of MANAGER_PROCESS.artifacts)
296
+ rmSync(localProcessPath(artifact, context), { force: true });
297
+ if (legacyManagerSpareUnverified)
298
+ printLegacyManagerSpareUncertainty();
299
+ else if (spared)
300
+ printSparedAgents(spared, spareSeats);
301
+ return found;
352
302
  }
353
303
  //# sourceMappingURL=manager-proc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager-proc.js","sourceRoot":"","sources":["../../src/lib/manager-proc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager-proc.js","sourceRoot":"","sources":["../../src/lib/manager-proc.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@ const LedgerAgentSchema = z.strictObject({
28
28
  /** The manifest agent key (`agents:` name) — display + the stable key a re-apply matches a declared
29
29
  * agent against (the spawned name may collision-number, so it can't be that key). */
30
30
  requested: z.string().regex(TOKEN, "requested name must be a path-safe token ([A-Za-z0-9_-])"),
31
- /** The manager-reply SPAWNED name (collision-numbered, e.g. `socrates-2`) — what creds are filed
31
+ /** The manager-reply SPAWNED name (collision-numbered, e.g. `socrates_2`) — what creds are filed
32
32
  * under; the cred path derives from THIS, never the manifest key. */
33
33
  name: z.string().regex(TOKEN, "agent name must be a path-safe token ([A-Za-z0-9_-])"),
34
34
  /** The spawned agent's nkey id — the immutable identity `down -f` matches before stopping. */
@@ -1 +1 @@
1
- {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../../src/lib/manifest/live.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAmB,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGvH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;sFACkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;6BAEyB;IACzB,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/F;AAID;4EAC4E;AAC5E,wBAAsB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAuBzE;AAED;6DAC6D;AAC7D,wBAAsB,YAAY,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CASzE;AAED;;0FAE0F;AAC1F,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAY9F;AAED;;6FAE6F;AAC7F,wBAAsB,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO1F;AAED;;;;;;;iCAOiC;AACjC,wBAAsB,WAAW,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAY9H"}
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../../src/lib/manifest/live.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAqC,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGzI,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;sFACkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;6BAEyB;IACzB,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/F;AAID;4EAC4E;AAC5E,wBAAsB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAuBzE;AAED;6DAC6D;AAC7D,wBAAsB,YAAY,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CASzE;AAED;;0FAE0F;AAC1F,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAY9F;AAED;;6FAE6F;AAC7F,wBAAsB,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO1F;AAED;;;;;;;iCAOiC;AACjC,wBAAsB,WAAW,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAW9H"}