@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.
- package/dist/extension-mutation.d.ts +27 -0
- package/dist/extension-mutation.d.ts.map +1 -0
- package/dist/extension-mutation.js +229 -0
- package/dist/extension-mutation.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/materialize.d.ts.map +1 -1
- package/dist/materialize.js +5 -5
- package/dist/materialize.js.map +1 -1
- package/dist/official-connectors.d.ts +12 -0
- package/dist/official-connectors.d.ts.map +1 -1
- package/dist/official-connectors.js +4 -0
- package/dist/official-connectors.js.map +1 -1
- package/dist/renewal.d.ts +21 -12
- package/dist/renewal.d.ts.map +1 -1
- package/dist/renewal.js +26 -17
- package/dist/renewal.js.map +1 -1
- package/package.json +2 -2
|
@@ -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
package/dist/index.d.ts.map
CHANGED
|
@@ -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
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,
|
|
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"}
|
package/dist/materialize.js
CHANGED
|
@@ -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,
|
|
6
|
-
import {
|
|
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
|
|
31
|
+
const release = claimExtensionMutationLock({
|
|
32
32
|
label: "extension materialization",
|
|
33
33
|
waitMs: 0,
|
|
34
|
-
|
|
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
|
-
|
|
40
|
+
release();
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
/**
|
package/dist/materialize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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) —
|
|
34
|
-
* re-signs into
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
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
|
package/dist/renewal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renewal.d.ts","sourceRoot":"","sources":["../src/renewal.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
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
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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:
|
|
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) —
|
|
31
|
-
* re-signs into
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
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
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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);
|
package/dist/renewal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renewal.js","sourceRoot":"","sources":["../src/renewal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,eAAe,GAGhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D
|
|
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.
|
|
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.
|
|
21
|
+
"@cotal-ai/core": "0.13.2"
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
24
|
"dist"
|