@cotal-ai/workspace 0.13.1 → 0.13.2

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.
@@ -0,0 +1,27 @@
1
+ export declare function extensionNpmMutationPath(): string;
2
+ export declare function claimGlobalNpmUpdateLock(root: string, opts?: {
3
+ waitMs?: number;
4
+ }): () => void;
5
+ export interface ExtensionMutationOptions {
6
+ readonly waitMs?: number;
7
+ readonly borrowUpdateParent?: number;
8
+ readonly label?: string;
9
+ readonly timeoutMessage?: (pid: number) => string;
10
+ }
11
+ /** Shared pass -> writer order for every extension-prefix reader that can rewrite peer links and
12
+ * every writer. An update child may borrow its live parent's pass, but always owns the writer. */
13
+ export declare function claimExtensionMutationLock(opts?: ExtensionMutationOptions): () => void;
14
+ export declare function claimExtensionUpdatePass(opts?: {
15
+ waitMs?: number;
16
+ }): () => void;
17
+ export declare function extensionUpdatePassOwnedBy(pid: number): boolean;
18
+ export interface ProcessMutation {
19
+ markLive(pid: number): void;
20
+ markAmbiguous(reason: string): void;
21
+ complete(status: number | null, signal: NodeJS.Signals | null, ambiguityReason: string): void;
22
+ clear(): void;
23
+ }
24
+ export declare function processExitIsAmbiguous(status: number | null, signal: NodeJS.Signals | null, intermediary: boolean): boolean;
25
+ export declare function beginExtensionNpmMutation(intermediary?: boolean): ProcessMutation;
26
+ export declare function beginGlobalUpdateChild(root: string, operation: "install" | "reconcile"): ProcessMutation;
27
+ //# sourceMappingURL=extension-mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-mutation.d.ts","sourceRoot":"","sources":["../src/extension-mutation.ts"],"names":[],"mappings":"AAUA,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAWD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,IAAI,CAgBjG;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD;AAED;kGACkG;AAClG,wBAAgB,0BAA0B,CAAC,IAAI,GAAE,wBAA6B,GAAG,MAAM,IAAI,CAyB1F;AAED,wBAAgB,wBAAwB,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,IAAI,CAanF;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG/D;AAOD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9F,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,EAC7B,YAAY,EAAE,OAAO,GACpB,OAAO,CAET;AAED,wBAAgB,yBAAyB,CAAC,YAAY,UAA+B,GAAG,eAAe,CAEtG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,WAAW,GAAG,eAAe,CAMxG"}
@@ -0,0 +1,229 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { acquireLock, inspectLock, processStartToken } from "./advisory-lock.js";
5
+ import { extensionMutationLockPath } from "./extensions.js";
6
+ function extensionUpdatePassLockPath() {
7
+ return `${extensionMutationLockPath()}.update`;
8
+ }
9
+ export function extensionNpmMutationPath() {
10
+ return `${extensionMutationLockPath()}.npm-child`;
11
+ }
12
+ function canonicalGlobalRoot(root) {
13
+ mkdirSync(root, { recursive: true });
14
+ return realpathSync(root);
15
+ }
16
+ function globalUpdateChildPath(root) {
17
+ return join(canonicalGlobalRoot(root), ".cotal-update-child");
18
+ }
19
+ export function claimGlobalNpmUpdateLock(root, opts = {}) {
20
+ const canonicalRoot = canonicalGlobalRoot(root);
21
+ const held = acquireLock(join(canonicalRoot, ".cotal-update.lock"), {
22
+ label: "a global cotal-ai update",
23
+ waitMs: opts.waitMs ?? 0,
24
+ onTimeout: (owner) => new Error(`another cotal-ai update is using npm global root ${canonicalRoot} (pid ${owner.pid}) - retry once it finishes`),
25
+ });
26
+ try {
27
+ assertNoProcessMutation(globalUpdateChildPath(canonicalRoot), "global cotal-ai update child");
28
+ return () => held.release();
29
+ }
30
+ catch (e) {
31
+ held.release();
32
+ throw e;
33
+ }
34
+ }
35
+ /** Shared pass -> writer order for every extension-prefix reader that can rewrite peer links and
36
+ * every writer. An update child may borrow its live parent's pass, but always owns the writer. */
37
+ export function claimExtensionMutationLock(opts = {}) {
38
+ const releasePass = opts.borrowUpdateParent === undefined
39
+ ? claimExtensionUpdatePass({ waitMs: opts.waitMs })
40
+ : (() => {
41
+ if (!extensionUpdatePassOwnedBy(opts.borrowUpdateParent))
42
+ throw new Error("the extension update parent no longer owns its pass lock");
43
+ assertNoProcessMutation(extensionNpmMutationPath(), "extension npm mutation");
44
+ return () => { };
45
+ })();
46
+ try {
47
+ const held = acquireLock(extensionMutationLockPath(), {
48
+ label: opts.label ?? "an extension mutation",
49
+ waitMs: opts.waitMs ?? 0,
50
+ onTimeout: (owner) => new Error(opts.timeoutMessage?.(owner.pid) ?? `another extension mutation is in progress (pid ${owner.pid}) - retry once it finishes`),
51
+ });
52
+ return () => {
53
+ held.release();
54
+ releasePass();
55
+ };
56
+ }
57
+ catch (e) {
58
+ releasePass();
59
+ throw e;
60
+ }
61
+ }
62
+ export function claimExtensionUpdatePass(opts = {}) {
63
+ const held = acquireLock(extensionUpdatePassLockPath(), {
64
+ label: "a `cotal update` extension pass",
65
+ waitMs: opts.waitMs ?? 0,
66
+ onTimeout: (owner) => new Error(`another extension update or mutation is in progress (pid ${owner.pid}) - retry once it finishes`),
67
+ });
68
+ try {
69
+ assertNoProcessMutation(extensionNpmMutationPath(), "extension npm mutation");
70
+ return () => held.release();
71
+ }
72
+ catch (e) {
73
+ held.release();
74
+ throw e;
75
+ }
76
+ }
77
+ export function extensionUpdatePassOwnedBy(pid) {
78
+ const found = inspectLock(extensionUpdatePassLockPath());
79
+ return found.state === "active" && found.owner.pid === pid;
80
+ }
81
+ export function processExitIsAmbiguous(status, signal, intermediary) {
82
+ return signal !== null || (intermediary && status !== 0);
83
+ }
84
+ export function beginExtensionNpmMutation(intermediary = process.platform === "win32") {
85
+ return beginProcessMutation(extensionNpmMutationPath(), "extension npm mutation", intermediary);
86
+ }
87
+ export function beginGlobalUpdateChild(root, operation) {
88
+ return beginProcessMutation(globalUpdateChildPath(root), `global ${operation}`, operation === "install" && process.platform === "win32");
89
+ }
90
+ /** Journal an actual mutating child across wrapper death. Pending closes spawn->PID publication;
91
+ * live tracks the child itself; ambiguous is operator-repaired and never auto-cleared. */
92
+ function beginProcessMutation(path, operation, intermediary) {
93
+ assertNoProcessMutation(path, operation);
94
+ const nonce = randomBytes(12).toString("hex");
95
+ const ownerStart = processStartToken(process.pid);
96
+ writeMarker(path, { phase: "pending", owner: process.pid, ownerStart, intermediary, nonce, operation });
97
+ return {
98
+ markLive(pid) {
99
+ if (!positiveInteger(pid))
100
+ throw new Error(`invalid ${operation} child pid ${pid}`);
101
+ const current = readMarker(path);
102
+ if (!current || current.nonce !== nonce)
103
+ throw new Error(`${operation} marker changed before the child PID was published`);
104
+ writeMarker(path, {
105
+ phase: "live",
106
+ owner: process.pid,
107
+ ownerStart,
108
+ pid,
109
+ start: processStartToken(pid),
110
+ intermediary,
111
+ nonce,
112
+ operation,
113
+ });
114
+ },
115
+ markAmbiguous(reason) {
116
+ const current = readMarker(path);
117
+ if (!current || current.nonce !== nonce)
118
+ throw new Error(`${operation} marker changed before ambiguity was recorded`);
119
+ writeMarker(path, { phase: "ambiguous", owner: process.pid, nonce, operation, reason });
120
+ },
121
+ complete(status, signal, ambiguityReason) {
122
+ if (processExitIsAmbiguous(status, signal, intermediary)) {
123
+ const current = readMarker(path);
124
+ if (!current || current.nonce !== nonce)
125
+ throw new Error(`${operation} marker changed before ambiguity was recorded`);
126
+ writeMarker(path, { phase: "ambiguous", owner: process.pid, nonce, operation, reason: ambiguityReason });
127
+ return;
128
+ }
129
+ removeMarker(path, nonce);
130
+ },
131
+ clear() {
132
+ removeMarker(path, nonce);
133
+ },
134
+ };
135
+ }
136
+ function assertNoProcessMutation(path, operation) {
137
+ const marker = readMarker(path);
138
+ if (!marker)
139
+ return;
140
+ if (marker.phase === "ambiguous") {
141
+ throw new Error(`${marker.operation ?? operation} ended ambiguously (${marker.reason}; ${path}) - if no descendant process is running, remove the marker and retry`);
142
+ }
143
+ if (marker.phase === "pending") {
144
+ if (sameProcessAlive(marker.owner, marker.ownerStart))
145
+ throw new Error(`${marker.operation ?? operation} is starting under pid ${marker.owner} - retry once it finishes`);
146
+ throw new Error(`${marker.operation ?? operation} may have been orphaned before publishing its child PID (${path}) - if no descendant process is running, remove the marker and retry`);
147
+ }
148
+ if (sameProcessAlive(marker.pid, marker.start))
149
+ throw new Error(`${marker.operation ?? operation} is still running (pid ${marker.pid}) - retry once it finishes`);
150
+ if (marker.intermediary) {
151
+ const ownerAlive = sameProcessAlive(marker.owner, marker.ownerStart);
152
+ throw new Error(ownerAlive
153
+ ? `${marker.operation ?? operation} intermediary exited while its wrapper is still classifying descendant state - retry once it finishes`
154
+ : `${marker.operation ?? operation} intermediary exited after its wrapper died; descendant completion is unproved (${path}) - if no descendant process is running, remove the marker and retry`);
155
+ }
156
+ removeMarker(path, marker.nonce);
157
+ }
158
+ function sameProcessAlive(pid, start) {
159
+ try {
160
+ process.kill(pid, 0);
161
+ }
162
+ catch (e) {
163
+ if (e.code === "ESRCH")
164
+ return false;
165
+ if (e.code !== "EPERM")
166
+ throw e;
167
+ }
168
+ if (start === undefined)
169
+ return true;
170
+ const now = processStartToken(pid);
171
+ return now === undefined || now === start;
172
+ }
173
+ function readMarker(path) {
174
+ if (!existsSync(path))
175
+ return undefined;
176
+ let parsed;
177
+ try {
178
+ parsed = JSON.parse(readFileSync(path, "utf8"));
179
+ }
180
+ catch (e) {
181
+ throw new Error(`process mutation marker is unreadable (${path}): ${e.message}`);
182
+ }
183
+ if (!validMarker(parsed))
184
+ throw new Error(`process mutation marker is invalid (${path}) - inspect running npm/cotal processes before removing it`);
185
+ return parsed;
186
+ }
187
+ function validMarker(value) {
188
+ if (!value || typeof value !== "object" || Array.isArray(value))
189
+ return false;
190
+ const marker = value;
191
+ if (!positiveInteger(marker.owner) || !validNonce(marker.nonce) || !optionalString(marker.operation))
192
+ return false;
193
+ if (marker.phase === "pending") {
194
+ return optionalString(marker.ownerStart) && typeof marker.intermediary === "boolean" &&
195
+ exactKeys(marker, ["phase", "owner", "ownerStart", "intermediary", "nonce", "operation"]);
196
+ }
197
+ if (marker.phase === "live") {
198
+ return positiveInteger(marker.pid) && optionalString(marker.ownerStart) && optionalString(marker.start) &&
199
+ typeof marker.intermediary === "boolean" &&
200
+ exactKeys(marker, ["phase", "owner", "ownerStart", "pid", "start", "intermediary", "nonce", "operation"]);
201
+ }
202
+ if (marker.phase === "ambiguous") {
203
+ return typeof marker.reason === "string" && marker.reason.length > 0 && exactKeys(marker, ["phase", "owner", "nonce", "operation", "reason"]);
204
+ }
205
+ return false;
206
+ }
207
+ function positiveInteger(value) {
208
+ return typeof value === "number" && Number.isInteger(value) && value > 0;
209
+ }
210
+ function optionalString(value) {
211
+ return value === undefined || (typeof value === "string" && value.length > 0);
212
+ }
213
+ function validNonce(value) {
214
+ return typeof value === "string" && /^[0-9a-f]{24}$/.test(value);
215
+ }
216
+ function exactKeys(record, allowed) {
217
+ return Object.keys(record).every((key) => allowed.includes(key));
218
+ }
219
+ function writeMarker(path, marker) {
220
+ const tmp = `${path}.${randomBytes(6).toString("hex")}.tmp`;
221
+ writeFileSync(tmp, `${JSON.stringify(marker)}\n`, { flag: "wx", mode: 0o600 });
222
+ renameSync(tmp, path);
223
+ }
224
+ function removeMarker(path, nonce) {
225
+ const marker = readMarker(path);
226
+ if (marker?.nonce === nonce)
227
+ rmSync(path, { force: true });
228
+ }
229
+ //# sourceMappingURL=extension-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-mutation.js","sourceRoot":"","sources":["../src/extension-mutation.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./advisory-lock.js";
2
+ export * from "./extension-mutation.js";
2
3
  export * from "./auth-paths.js";
3
4
  export * from "./agent-health.js";
4
5
  export * from "./bin-path.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./advisory-lock.js";
2
+ export * from "./extension-mutation.js";
2
3
  export * from "./auth-paths.js";
3
4
  export * from "./agent-health.js";
4
5
  export * from "./bin-path.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../src/materialize.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAOL,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AA8CzB;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/G;AAiDD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK7D;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAC3E,GAAG,EAAE,YAAY,EACjB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,CAAC,CAAC,CAeZ"}
1
+ {"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../src/materialize.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AA8CzB;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/G;AAiDD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK7D;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAC3E,GAAG,EAAE,YAAY,EACjB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,CAAC,CAAC,CAeZ"}
@@ -2,8 +2,8 @@ import { readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { pathToFileURL } from "node:url";
4
4
  import { registry } from "@cotal-ai/core";
5
- import { bindExtensionPeers, extensionPackageDir, extensionMutationLockPath, extensionProvides, installedExtensionVersion, loadExtensionsManifest, } from "./extensions.js";
6
- import { acquireLock } from "./advisory-lock.js";
5
+ import { bindExtensionPeers, extensionPackageDir, extensionProvides, installedExtensionVersion, loadExtensionsManifest, } from "./extensions.js";
6
+ import { claimExtensionMutationLock } from "./extension-mutation.js";
7
7
  /**
8
8
  * The generic manifest-materialize primitive: verify an installed package's version pin, resolve
9
9
  * its entry, and dynamic-`import()` it (which self-registers its extensions into the shared core
@@ -28,16 +28,16 @@ function enqueueLoad(load) {
28
28
  return run;
29
29
  }
30
30
  async function withExtensionLock(load) {
31
- const held = acquireLock(extensionMutationLockPath(), {
31
+ const release = claimExtensionMutationLock({
32
32
  label: "extension materialization",
33
33
  waitMs: 0,
34
- onTimeout: (owner) => new Error(`extension install/remove is in progress (pid ${owner.pid}) - retry after the active \`cotal ext\` command finishes`),
34
+ timeoutMessage: (pid) => `extension install/remove is in progress (pid ${pid}) - retry after the active \`cotal ext\` command finishes`,
35
35
  });
36
36
  try {
37
37
  await load();
38
38
  }
39
39
  finally {
40
- held.release();
40
+ release();
41
41
  }
42
42
  }
43
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"materialize.js","sourceRoot":"","sources":["../src/materialize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"materialize.js","sourceRoot":"","sources":["../src/materialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAqC,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,GAEvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;;;;;GAOG;AAEH,SAAS,aAAa,CAAC,GAAW,EAAE,GAAuB,EAAE,CAAU;IACrE,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC;QACnH,CAAC,CAAC,mIAAmI;QACrI,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,IAAI,KAAK,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,sBAAsB,OAAO,GAAG,aAAa,oCAAoC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;AACjJ,CAAC;AAED;uDACuD;AACvD,IAAI,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;AAEjD,SAAS,WAAW,CAAC,IAAyB;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,SAAS,GAAG,GAAG,CAAC,IAAI,CAClB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAyB;IACxD,MAAM,OAAO,GAAG,0BAA0B,CAAC;QACzC,KAAK,EAAE,2BAA2B;QAClC,MAAM,EAAE,CAAC;QACT,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gDAAgD,GAAG,2DAA2D;KACxI,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAuB,EAAE,UAAwB;IAC9F,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC3D,OAAO,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO;QAC3D,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAuB,EAAE,UAAwB;IACtE,sGAAsG;IACtG,wFAAwF;IACxF,mGAAmG;IACnG,iGAAiG;IACjG,+FAA+F;IAC/F,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC3D,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,MAAM,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,4CAA4C,mBAAmB,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC;IAChJ,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,aAAa,GAAG,OAAO,MAAM,oCAAoC,GAAG,CAAC,OAAO,2EAA2E,GAAG,CAAC,IAAI,IAAI,CACpK,CAAC;IACJ,CAAC;IACD,mGAAmG;IACnG,qGAAqG;IACrG,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAyC,CAAC;IACjH,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;IACpC,MAAM,GAAG,GAAI,IAAI,CAAC,OAA+C,EAAE,CAAC,GAAG,CAAC,CAAC;IACzE,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,KAAK,GAAG,GAAG,CAAC;SACpC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,GAA6B,CAAC;QACxC,KAAK,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC;IACzC,CAAC;SAAM,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;IAClE,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACH,sFAAsF;QACtF,+FAA+F;QAC/F,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,qDAAqD;IACzF,CAAC;IACD,8FAA8F;IAC9F,6FAA6F;IAC7F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CACb,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,kCAAkC,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,kCAAkC,GAAG,CAAC,IAAI,IAAI,CACnJ,CAAC;IACJ,CAAC;IACD,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC,UAAU;QACnD,KAAK,MAAM,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC;YAAE,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAAiB,EACjB,OAAiD,EAAE;IAEnD,MAAM,WAAW,CAAC,GAAG,EAAE,CACrB,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACjE,iBAAiB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAC1G,CAAC;QACF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,mCAAmC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,qDAAqD,CAClI,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC,CACH,CAAC;IACF,OAAO,QAAQ,CAAC,OAAO,CAAI,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC"}
@@ -9,6 +9,18 @@
9
9
  * must not import the CLI — it is pure data supplied to the generic materialize/hint path.
10
10
  */
11
11
  export declare const OFFICIAL_CONNECTORS: Readonly<Record<string, string>>;
12
+ /** A first-party extension the umbrella (`cotal-ai`) bundles and versions in lockstep: its npm package
13
+ * plus the repo-relative source dir the prepack copy and dev seeding resolve it from. This is the four
14
+ * connectors PLUS the web dashboard — every first-party piece the binary ships and the seed reconcile
15
+ * keeps at the binary's own version, so `npm i -g cotal-ai@X` carries them all at X with no separate
16
+ * fetch and no version skew. A third-party `cotal ext add`ed package is NOT here; it versions on its
17
+ * own line. web lives in `implementations/web` (the connectors under `extensions/`), hence the explicit
18
+ * source dir rather than a derived `extensions/<name>`. */
19
+ export interface SeededExtension {
20
+ readonly pkg: string;
21
+ readonly srcDir: string;
22
+ }
23
+ export declare const SEEDED_EXTENSIONS: Readonly<Record<string, SeededExtension>>;
12
24
  /** The default connector/agent type when `COTAL_DEFAULT_AGENT` is unset (David's locked decision). */
13
25
  export declare const DEFAULT_CONNECTOR = "claude";
14
26
  /** `cotal` is reserved: it is the binary's own name, so a connector must never claim it (there is no
@@ -1 +1 @@
1
- {"version":3,"file":"official-connectors.d.ts","sourceRoot":"","sources":["../src/official-connectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKhE,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C;kFACkF;AAClF,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAAc,CAAC;AAErE;mGACmG;AACnG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzD"}
1
+ {"version":3,"file":"official-connectors.d.ts","sourceRoot":"","sources":["../src/official-connectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKhE,CAAC;AAEF;;;;;;4DAM4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAKvE,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C;kFACkF;AAClF,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAAc,CAAC;AAErE;mGACmG;AACnG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzD"}
@@ -14,6 +14,10 @@ export const OFFICIAL_CONNECTORS = {
14
14
  hermes: "@cotal-ai/connector-hermes",
15
15
  pi: "@cotal-ai/pi",
16
16
  };
17
+ export const SEEDED_EXTENSIONS = {
18
+ ...Object.fromEntries(Object.entries(OFFICIAL_CONNECTORS).map(([name, pkg]) => [name, { pkg, srcDir: `extensions/${pkg.split("/")[1]}` }])),
19
+ web: { pkg: "@cotal-ai/web", srcDir: "implementations/web" },
20
+ };
17
21
  /** The default connector/agent type when `COTAL_DEFAULT_AGENT` is unset (David's locked decision). */
18
22
  export const DEFAULT_CONNECTOR = "claude";
19
23
  /** `cotal` is reserved: it is the binary's own name, so a connector must never claim it (there is no
@@ -1 +1 @@
1
- {"version":3,"file":"official-connectors.js","sourceRoot":"","sources":["../src/official-connectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACnE,MAAM,EAAE,iCAAiC;IACzC,QAAQ,EAAE,8BAA8B;IACxC,MAAM,EAAE,4BAA4B;IACpC,EAAE,EAAE,cAAc;CACnB,CAAC;AAEF,sGAAsG;AACtG,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAE1C;kFACkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAsB,CAAC,OAAO,CAAC,CAAC;AAErE;mGACmG;AACnG,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,GAAG;QACR,CAAC,CAAC,iBAAiB,IAAI,6CAA6C,GAAG,IAAI;QAC3E,CAAC,CAAC,iBAAiB,IAAI,qFAAqF,CAAC;AACjH,CAAC"}
1
+ {"version":3,"file":"official-connectors.js","sourceRoot":"","sources":["../src/official-connectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACnE,MAAM,EAAE,iCAAiC;IACzC,QAAQ,EAAE,8BAA8B;IACxC,MAAM,EAAE,4BAA4B;IACpC,EAAE,EAAE,cAAc;CACnB,CAAC;AAcF,MAAM,CAAC,MAAM,iBAAiB,GAA8C;IAC1E,GAAI,MAAM,CAAC,WAAW,CACpB,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CACjF;IACrC,GAAG,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,qBAAqB,EAAE;CAC7D,CAAC;AAEF,sGAAsG;AACtG,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAE1C;kFACkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAsB,CAAC,OAAO,CAAC,CAAC;AAErE;mGACmG;AACnG,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,GAAG;QACR,CAAC,CAAC,iBAAiB,IAAI,6CAA6C,GAAG,IAAI;QAC3E,CAAC,CAAC,iBAAiB,IAAI,qFAAqF,CAAC;AACjH,CAAC"}
package/dist/renewal.d.ts CHANGED
@@ -2,9 +2,10 @@ import { type Profile, type SecretStore } from "@cotal-ai/core";
2
2
  /**
3
3
  * D5 slice 5 class-2 standing renewal — the RENEWAL OWNER'S half, shared by the manager (the
4
4
  * resident owner in every mesh mode) and `cotal doctor auth --fix` (the operator repair). The
5
- * daemon's half is the explicit `reloadCreds` adoption op on the delivery-admin rail (plus the
6
- * passive 75% source re-read as backstop). Machine-local file work lives here in the workspace
7
- * layer: implementations never import each other.
5
+ * daemon's half is the explicit `reloadCreds` adoption op on the delivery-admin rail, plus each
6
+ * daemon's own 75% renewal timer (the delivery endpoint re-reads its source; the membership feed
7
+ * preflight-proves each candidate). Machine-local file work lives here in the workspace layer:
8
+ * implementations never import each other.
8
9
  */
9
10
  /** The canonical secret-store key of the delivery daemon's scoped cred — by the FS convention the
10
11
  * key IS the filename under `.cotal/`. The single source for every tier (the CLI writer, the
@@ -12,6 +13,10 @@ import { type Profile, type SecretStore } from "@cotal-ai/core";
12
13
  * the kind across two store entries with no compile error. Lives in workspace because the
13
14
  * key↔filename convention is the workspace layout's; implementations never import each other. */
14
15
  export declare const DELIVERY_CREDS_KEY = "delivery.creds";
16
+ /** The membership feed's data-account rw cred key — the same key↔filename discipline as
17
+ * {@link DELIVERY_CREDS_KEY}. Named (not a bare literal) so the renewal owner can map a remint
18
+ * result back to the daemon's `membership` component without a hand-copied string. */
19
+ export declare const MEMBERSHIP_RW_CREDS_KEY = "membership-rw.creds";
15
20
  /** The seed-less daemon creds files a renewal owner re-signs. The $SYS files
16
21
  * (membership-observer, connection-evictor) are deliberately ABSENT: they are rotation-renewed —
17
22
  * no persisted seed can re-sign them, by design. */
@@ -25,20 +30,24 @@ export interface RemintResult {
25
30
  ok: boolean;
26
31
  skipped?: "missing-file" | "no-auth";
27
32
  error?: string;
33
+ /** EPHEMERAL SHA-256 of the JUST-RE-SIGNED cred's USER JWT — the EXPECTED-generation token the
34
+ * renewal owner hands the daemon so an adoption reply can prove it adopted THIS generation, not
35
+ * merely re-read some file. Present only on `ok`. NEVER persisted: the caller strips it before
36
+ * writing the renewal record (a stable secret-derived token must not land on disk). */
37
+ fingerprint?: string;
28
38
  }
29
39
  /** Re-sign the daemon creds files for their EXISTING nkeys (a renewal must never swap a daemon's
30
40
  * identity — the daemon side pins it). Reads and writes through the secret-store seam; `store` is
31
41
  * the renewal owner's injection point, SYMMETRIC with the daemon's `runDelivery(args, store?)`.
32
42
  * The manager — the D5 standing-renewal owner, and a hosted-path caller (manager.ts calls this
33
- * unconditionally) — must pass the SAME store it gives the daemon, or a hosted composition
34
- * re-signs into one store while the daemon reads another and rides to expiry. Threading the store
35
- * through the manager's entry is its own slice; until it lands, hosted end-to-end renewal on an
36
- * injected store is NOT yet wired, and no store means the local workspace FS composition (keys =
37
- * the filenames under `.cotal/`). The store's ATOMIC put is load-bearing here, because the daemons
38
- * re-read these files LIVE (the delivery endpoint's 75% source backstop, the membership rw
39
- * reconnect getter) and the plain `writeSecretFile` this replaced could tear such a concurrent
40
- * re-read. Structured per-file results, never throws: a failed remint leaves the old cred running
41
- * toward its loud expiry and the caller records/reports the failure. */
43
+ * unconditionally) — passes the SAME store it gives the daemon (its `ManagerOptions.secretStore`),
44
+ * so a hosted composition re-signs into the store the daemon renews from, never a divergent one; no
45
+ * store means the local workspace FS composition (keys = the filenames under `.cotal/`). The store's
46
+ * ATOMIC put is load-bearing here, because the daemons re-read these values LIVE (the delivery
47
+ * endpoint's 75% source refresh, the membership feed's 75% renewal fetch) and the plain
48
+ * `writeSecretFile` this replaced could tear such a concurrent read. Structured per-file results,
49
+ * never throws: a failed remint leaves the old cred running toward its loud expiry and the caller
50
+ * records/reports the failure. */
42
51
  export declare function remintDaemonCreds(root: string, store?: SecretStore): Promise<RemintResult[]>;
43
52
  /** The renewal owner's audit record — what `cotal doctor auth` renders so "file re-signed" and
44
53
  * "daemon adopted" are distinguishable states, per the D5 panel gate. One file, overwritten per
@@ -1 +1 @@
1
- {"version":3,"file":"renewal.d.ts","sourceRoot":"","sources":["../src/renewal.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAIxB;;;;;;GAMG;AAEH;;;;kGAIkG;AAClG,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AAEnD;;qDAEqD;AACrD,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAGrF,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;yEAYyE;AACzE,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBlG;AAED;;uFAEuF;AACvF,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAE5E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAQzE"}
1
+ {"version":3,"file":"renewal.d.ts","sourceRoot":"","sources":["../src/renewal.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAIxB;;;;;;;GAOG;AAEH;;;;kGAIkG;AAClG,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AAEnD;;uFAEuF;AACvF,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D;;qDAEqD;AACrD,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAGrF,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;4FAGwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;mCAWmC;AACnC,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAoBlG;AAED;;uFAEuF;AACvF,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAM5E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAQzE"}
package/dist/renewal.js CHANGED
@@ -1,14 +1,15 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { identityFromCreds, mintCreds, writeSecretFile, } from "@cotal-ai/core";
3
+ import { credsFingerprint, identityFromCreds, mintCreds, writeSecretFile, } from "@cotal-ai/core";
4
4
  import { authDir, loadSpaceAuth } from "./auth-paths.js";
5
5
  import { workspaceSecretStore } from "./secret-store-fs.js";
6
6
  /**
7
7
  * D5 slice 5 class-2 standing renewal — the RENEWAL OWNER'S half, shared by the manager (the
8
8
  * resident owner in every mesh mode) and `cotal doctor auth --fix` (the operator repair). The
9
- * daemon's half is the explicit `reloadCreds` adoption op on the delivery-admin rail (plus the
10
- * passive 75% source re-read as backstop). Machine-local file work lives here in the workspace
11
- * layer: implementations never import each other.
9
+ * daemon's half is the explicit `reloadCreds` adoption op on the delivery-admin rail, plus each
10
+ * daemon's own 75% renewal timer (the delivery endpoint re-reads its source; the membership feed
11
+ * preflight-proves each candidate). Machine-local file work lives here in the workspace layer:
12
+ * implementations never import each other.
12
13
  */
13
14
  /** The canonical secret-store key of the delivery daemon's scoped cred — by the FS convention the
14
15
  * key IS the filename under `.cotal/`. The single source for every tier (the CLI writer, the
@@ -16,26 +17,29 @@ import { workspaceSecretStore } from "./secret-store-fs.js";
16
17
  * the kind across two store entries with no compile error. Lives in workspace because the
17
18
  * key↔filename convention is the workspace layout's; implementations never import each other. */
18
19
  export const DELIVERY_CREDS_KEY = "delivery.creds";
20
+ /** The membership feed's data-account rw cred key — the same key↔filename discipline as
21
+ * {@link DELIVERY_CREDS_KEY}. Named (not a bare literal) so the renewal owner can map a remint
22
+ * result back to the daemon's `membership` component without a hand-copied string. */
23
+ export const MEMBERSHIP_RW_CREDS_KEY = "membership-rw.creds";
19
24
  /** The seed-less daemon creds files a renewal owner re-signs. The $SYS files
20
25
  * (membership-observer, connection-evictor) are deliberately ABSENT: they are rotation-renewed —
21
26
  * no persisted seed can re-sign them, by design. */
22
27
  export const REMINTABLE_DAEMON_CREDS = [
23
28
  { file: DELIVERY_CREDS_KEY, profile: "delivery" },
24
- { file: "membership-rw.creds", profile: "membership-rw" },
29
+ { file: MEMBERSHIP_RW_CREDS_KEY, profile: "membership-rw" },
25
30
  ];
26
31
  /** Re-sign the daemon creds files for their EXISTING nkeys (a renewal must never swap a daemon's
27
32
  * identity — the daemon side pins it). Reads and writes through the secret-store seam; `store` is
28
33
  * the renewal owner's injection point, SYMMETRIC with the daemon's `runDelivery(args, store?)`.
29
34
  * The manager — the D5 standing-renewal owner, and a hosted-path caller (manager.ts calls this
30
- * unconditionally) — must pass the SAME store it gives the daemon, or a hosted composition
31
- * re-signs into one store while the daemon reads another and rides to expiry. Threading the store
32
- * through the manager's entry is its own slice; until it lands, hosted end-to-end renewal on an
33
- * injected store is NOT yet wired, and no store means the local workspace FS composition (keys =
34
- * the filenames under `.cotal/`). The store's ATOMIC put is load-bearing here, because the daemons
35
- * re-read these files LIVE (the delivery endpoint's 75% source backstop, the membership rw
36
- * reconnect getter) and the plain `writeSecretFile` this replaced could tear such a concurrent
37
- * re-read. Structured per-file results, never throws: a failed remint leaves the old cred running
38
- * toward its loud expiry and the caller records/reports the failure. */
35
+ * unconditionally) — passes the SAME store it gives the daemon (its `ManagerOptions.secretStore`),
36
+ * so a hosted composition re-signs into the store the daemon renews from, never a divergent one; no
37
+ * store means the local workspace FS composition (keys = the filenames under `.cotal/`). The store's
38
+ * ATOMIC put is load-bearing here, because the daemons re-read these values LIVE (the delivery
39
+ * endpoint's 75% source refresh, the membership feed's 75% renewal fetch) and the plain
40
+ * `writeSecretFile` this replaced could tear such a concurrent read. Structured per-file results,
41
+ * never throws: a failed remint leaves the old cred running toward its loud expiry and the caller
42
+ * records/reports the failure. */
39
43
  export async function remintDaemonCreds(root, store) {
40
44
  const auth = loadSpaceAuth(authDir(root));
41
45
  if (!auth)
@@ -49,8 +53,9 @@ export async function remintDaemonCreds(root, store) {
49
53
  results.push({ file, ok: false, skipped: "missing-file" });
50
54
  continue;
51
55
  }
52
- await s.put(file, await mintCreds(auth, identityFromCreds(current), profile));
53
- results.push({ file, ok: true });
56
+ const next = await mintCreds(auth, identityFromCreds(current), profile);
57
+ await s.put(file, next);
58
+ results.push({ file, ok: true, fingerprint: credsFingerprint(next) });
54
59
  }
55
60
  catch (e) {
56
61
  results.push({ file, ok: false, error: e.message });
@@ -62,7 +67,11 @@ export function renewalRecordPath(root) {
62
67
  return join(root, ".cotal", "renewal.json");
63
68
  }
64
69
  export function writeRenewalRecord(root, record) {
65
- writeSecretFile(renewalRecordPath(root), JSON.stringify(record, null, 2));
70
+ // REDACT the ephemeral generation token HERE, at the single persistence boundary, so no writer
71
+ // (the manager, `doctor auth --fix`, or any future caller) can leak the stable secret-derived
72
+ // fingerprint to `.cotal/renewal.json`. `JSON.stringify` then omits the `undefined` field.
73
+ const redacted = { ...record, results: record.results.map((r) => ({ ...r, fingerprint: undefined })) };
74
+ writeSecretFile(renewalRecordPath(root), JSON.stringify(redacted, null, 2));
66
75
  }
67
76
  export function readRenewalRecord(root) {
68
77
  const p = renewalRecordPath(root);
@@ -1 +1 @@
1
- {"version":3,"file":"renewal.js","sourceRoot":"","sources":["../src/renewal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renewal.js","sourceRoot":"","sources":["../src/renewal.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cotal-ai/workspace",
3
3
  "description": "Cotal machine-local workstation layer: the ~/.cotal mesh registry, target resolution, preflight, on-disk auth-path I/O, and the command-copy renderer — operator concerns over a local checkout, kept separate from the wire protocol in @cotal-ai/core.",
4
- "version": "0.13.1",
4
+ "version": "0.13.2",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -18,7 +18,7 @@
18
18
  }
19
19
  },
20
20
  "dependencies": {
21
- "@cotal-ai/core": "0.13.1"
21
+ "@cotal-ai/core": "0.13.2"
22
22
  },
23
23
  "files": [
24
24
  "dist"