borgmcp-server 0.1.7 → 0.1.9

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 (70) hide show
  1. package/README.md +61 -46
  2. package/SECURITY.md +12 -1
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/dist/bootstrap.d.ts +8 -1
  5. package/dist/bootstrap.js +39 -6
  6. package/dist/bootstrap.js.map +1 -1
  7. package/dist/cli.d.ts +1 -0
  8. package/dist/cli.js +176 -1
  9. package/dist/cli.js.map +1 -1
  10. package/dist/coordination-api.js +10 -1
  11. package/dist/coordination-api.js.map +1 -1
  12. package/dist/credentials.d.ts +5 -1
  13. package/dist/credentials.js +35 -3
  14. package/dist/credentials.js.map +1 -1
  15. package/dist/debug-log.d.ts +2 -2
  16. package/dist/debug-log.js +2 -2
  17. package/dist/debug-log.js.map +1 -1
  18. package/dist/https-server.d.ts +5 -1
  19. package/dist/https-server.js +93 -27
  20. package/dist/https-server.js.map +1 -1
  21. package/dist/index.d.ts +14 -1
  22. package/dist/index.js +8 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/main.js +1 -0
  25. package/dist/main.js.map +1 -1
  26. package/dist/managed-service.d.ts +20 -0
  27. package/dist/managed-service.js +80 -0
  28. package/dist/managed-service.js.map +1 -0
  29. package/dist/migrations.js +23 -0
  30. package/dist/migrations.js.map +1 -1
  31. package/dist/portable-credential-store.d.ts +16 -0
  32. package/dist/portable-credential-store.js +305 -0
  33. package/dist/portable-credential-store.js.map +1 -0
  34. package/dist/registry-artifact.d.ts +11 -0
  35. package/dist/registry-artifact.js +99 -0
  36. package/dist/registry-artifact.js.map +1 -0
  37. package/dist/runtime-identity.d.ts +19 -0
  38. package/dist/runtime-identity.js +61 -0
  39. package/dist/runtime-identity.js.map +1 -0
  40. package/dist/runtime-lifecycle.d.ts +56 -0
  41. package/dist/runtime-lifecycle.js +486 -0
  42. package/dist/runtime-lifecycle.js.map +1 -0
  43. package/dist/runtime-operator.d.ts +24 -0
  44. package/dist/runtime-operator.js +95 -0
  45. package/dist/runtime-operator.js.map +1 -0
  46. package/dist/service.d.ts +53 -5
  47. package/dist/service.js +326 -15
  48. package/dist/service.js.map +1 -1
  49. package/dist/store.d.ts +16 -7
  50. package/dist/store.js +93 -83
  51. package/dist/store.js.map +1 -1
  52. package/npm-shrinkwrap.json +6 -6
  53. package/package.json +2 -2
  54. package/src/bootstrap.ts +46 -5
  55. package/src/cli.ts +171 -1
  56. package/src/coordination-api.ts +12 -0
  57. package/src/credentials.ts +36 -5
  58. package/src/debug-log.ts +4 -3
  59. package/src/https-server.ts +124 -27
  60. package/src/index.ts +46 -1
  61. package/src/main.ts +1 -0
  62. package/src/managed-service.ts +107 -0
  63. package/src/migrations.ts +23 -0
  64. package/src/portable-credential-store.ts +306 -0
  65. package/src/registry-artifact.ts +111 -0
  66. package/src/runtime-identity.ts +82 -0
  67. package/src/runtime-lifecycle.ts +567 -0
  68. package/src/runtime-operator.ts +124 -0
  69. package/src/service.ts +401 -20
  70. package/src/store.ts +100 -83
@@ -0,0 +1,16 @@
1
+ export interface PortableServerCredential {
2
+ readonly version: 2;
3
+ readonly origin: string;
4
+ readonly trustIdentity: string;
5
+ readonly credential: string;
6
+ readonly clientId: string;
7
+ readonly serverCapabilities: readonly ["create_cube"];
8
+ }
9
+ export interface PortableCredentialLockOptions {
10
+ readonly attempts?: number;
11
+ readonly waitMs?: number;
12
+ readonly onAcquired?: (lockPath: string) => Promise<void>;
13
+ }
14
+ export declare function portableCredentialAccount(origin: string, trustIdentity: string): string;
15
+ export declare function writePortableServerCredential(path: string, record: PortableServerCredential, lockOptions?: PortableCredentialLockOptions): Promise<void>;
16
+ export declare function readPortableServerCredential(path: string, origin: string, trustIdentity: string): Promise<PortableServerCredential>;
@@ -0,0 +1,305 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { link, lstat, mkdir, open, realpath, rename, unlink } from "node:fs/promises";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { isIP } from "node:net";
6
+ const credentialPattern = /^[A-Za-z0-9_-]{43}$/u;
7
+ const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;
8
+ const trustPattern = /^spki-sha256:[0-9a-f]{64}$/u;
9
+ const defaultLockAttempts = 500;
10
+ const defaultLockWaitMs = 10;
11
+ export function portableCredentialAccount(origin, trustIdentity) {
12
+ return `borg-server-credential:${createHash("sha256").update(origin).update("\0").update(trustIdentity).digest("hex")}`;
13
+ }
14
+ export async function writePortableServerCredential(path, record, lockOptions = {}) {
15
+ validateRecord(record);
16
+ const target = await credentialPath(path);
17
+ const canonicalRoot = dirname(target);
18
+ const lock = `${target}.lock`;
19
+ await withCredentialLock(lock, lockOptions, async () => {
20
+ const original = await readPrivateBytesIfPresent(target);
21
+ const document = parseDocument(original);
22
+ const account = portableCredentialAccount(record.origin, record.trustIdentity);
23
+ const next = {
24
+ version: 1,
25
+ accounts: { ...document.accounts, [account]: JSON.stringify(record) },
26
+ };
27
+ const temporary = join(canonicalRoot, `.credentials.json.${process.pid}.${Date.now()}.tmp`);
28
+ const handle = await open(temporary, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
29
+ try {
30
+ await handle.writeFile(`${JSON.stringify(next)}\n`, "utf8");
31
+ await handle.sync();
32
+ }
33
+ finally {
34
+ await handle.close();
35
+ }
36
+ try {
37
+ await assertPrivateFile(temporary);
38
+ const current = await readPrivateBytesIfPresent(target);
39
+ if (current === null ? original !== null : original === null || !current.equals(original)) {
40
+ throw new Error("Portable credential store changed during update.");
41
+ }
42
+ await rename(temporary, target);
43
+ }
44
+ catch (error) {
45
+ await unlink(temporary).catch(() => undefined);
46
+ throw error;
47
+ }
48
+ const directory = await open(canonicalRoot, constants.O_RDONLY);
49
+ try {
50
+ await directory.sync();
51
+ }
52
+ finally {
53
+ await directory.close();
54
+ }
55
+ await assertPrivateFile(target);
56
+ });
57
+ }
58
+ export async function readPortableServerCredential(path, origin, trustIdentity) {
59
+ const target = await credentialPath(path);
60
+ await assertPrivateFile(target);
61
+ const document = parseDocument(await readPrivateBytes(target));
62
+ const value = document.accounts[portableCredentialAccount(origin, trustIdentity)];
63
+ if (value === undefined)
64
+ throw new Error("Local owner credential is unavailable.");
65
+ const parsed = JSON.parse(value);
66
+ validateRecord(parsed);
67
+ if (parsed.origin !== origin || parsed.trustIdentity !== trustIdentity) {
68
+ throw new Error("Local owner credential binding is invalid.");
69
+ }
70
+ return Object.freeze(parsed);
71
+ }
72
+ async function credentialPath(path) {
73
+ if (path !== resolve(path))
74
+ throw new Error("Portable credential path is unsafe.");
75
+ const target = path;
76
+ const parent = dirname(target);
77
+ let parentMetadata;
78
+ try {
79
+ parentMetadata = await lstat(parent);
80
+ }
81
+ catch (error) {
82
+ if (error.code !== "ENOENT")
83
+ throw error;
84
+ await mkdir(parent, { mode: 0o700 }).catch((mkdirError) => {
85
+ if (mkdirError.code !== "EEXIST")
86
+ throw mkdirError;
87
+ });
88
+ parentMetadata = await lstat(parent);
89
+ }
90
+ if (!parentMetadata.isDirectory() || parentMetadata.isSymbolicLink() ||
91
+ (parentMetadata.mode & 0o022) !== 0 ||
92
+ (typeof process.getuid === "function" && parentMetadata.uid !== process.getuid()) ||
93
+ await realpath(parent) !== parent) {
94
+ throw new Error("Portable credential parent directory is unsafe.");
95
+ }
96
+ return target;
97
+ }
98
+ async function withCredentialLock(lockPath, options, operation) {
99
+ const attempts = options.attempts ?? defaultLockAttempts;
100
+ const waitMs = options.waitMs ?? defaultLockWaitMs;
101
+ if (!Number.isSafeInteger(attempts) || attempts < 1 || attempts > 10_000 ||
102
+ !Number.isSafeInteger(waitMs) || waitMs < 0 || waitMs > 1_000) {
103
+ throw new Error("Portable credential lock options are invalid.");
104
+ }
105
+ await credentialPath(lockPath.slice(0, -".lock".length));
106
+ const stage = `${lockPath}.${process.pid}.${randomBytes(6).toString("hex")}.acq`;
107
+ const payload = Buffer.from(JSON.stringify({
108
+ pid: process.pid,
109
+ startTime: new Date(Date.now() - Math.round(process.uptime() * 1_000)).toISOString(),
110
+ }));
111
+ const stageHandle = await open(stage, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
112
+ try {
113
+ try {
114
+ await stageHandle.writeFile(payload);
115
+ await stageHandle.sync();
116
+ }
117
+ finally {
118
+ await stageHandle.close();
119
+ }
120
+ }
121
+ catch (error) {
122
+ await unlink(stage).catch(() => undefined);
123
+ throw error;
124
+ }
125
+ let acquired = false;
126
+ try {
127
+ await assertPrivateFile(stage);
128
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
129
+ try {
130
+ await link(stage, lockPath);
131
+ acquired = true;
132
+ break;
133
+ }
134
+ catch (error) {
135
+ if (error.code !== "EEXIST")
136
+ throw error;
137
+ }
138
+ const state = await inspectContendedLock(lockPath);
139
+ if (state === "missing")
140
+ continue;
141
+ if (state === "stale")
142
+ throw new Error(`Borg credential lock is stale: ${lockPath}`);
143
+ if (waitMs > 0)
144
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
145
+ }
146
+ if (!acquired)
147
+ throw new Error("Borg seat store is busy");
148
+ await options.onAcquired?.(lockPath);
149
+ return await operation();
150
+ }
151
+ finally {
152
+ let releaseError;
153
+ if (acquired) {
154
+ try {
155
+ await unlink(lockPath);
156
+ }
157
+ catch (error) {
158
+ if (error.code !== "ENOENT")
159
+ releaseError = error;
160
+ }
161
+ }
162
+ await unlink(stage).catch(() => undefined);
163
+ if (releaseError !== undefined)
164
+ throw releaseError;
165
+ }
166
+ }
167
+ async function inspectContendedLock(lockPath) {
168
+ try {
169
+ await credentialPath(lockPath.slice(0, -".lock".length));
170
+ const before = await lstat(lockPath);
171
+ if (!before.isFile() || before.isSymbolicLink() || (before.mode & 0o777) !== 0o600 ||
172
+ (typeof process.getuid === "function" && before.uid !== process.getuid())) {
173
+ throw new Error("Portable credential lock is unsafe.");
174
+ }
175
+ const handle = await open(lockPath, constants.O_RDONLY | constants.O_NOFOLLOW);
176
+ let bytes;
177
+ try {
178
+ const opened = await handle.stat();
179
+ if (!opened.isFile() || opened.dev !== before.dev || opened.ino !== before.ino ||
180
+ opened.size !== before.size || opened.size > 4_096) {
181
+ throw new Error("Portable credential lock is unsafe.");
182
+ }
183
+ bytes = await handle.readFile();
184
+ const after = await handle.stat();
185
+ if (after.dev !== opened.dev || after.ino !== opened.ino || after.size !== opened.size) {
186
+ throw new Error("Portable credential lock is unsafe.");
187
+ }
188
+ }
189
+ finally {
190
+ await handle.close();
191
+ }
192
+ await credentialPath(lockPath.slice(0, -".lock".length));
193
+ let parsed;
194
+ try {
195
+ parsed = JSON.parse(bytes.toString("utf8"));
196
+ }
197
+ catch {
198
+ return "stale";
199
+ }
200
+ const pid = typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
201
+ ? parsed.pid
202
+ : undefined;
203
+ if (!Number.isSafeInteger(pid) || pid < 1)
204
+ return "stale";
205
+ try {
206
+ process.kill(pid, 0);
207
+ return "live";
208
+ }
209
+ catch (error) {
210
+ return error.code === "EPERM" ? "live" : "stale";
211
+ }
212
+ }
213
+ catch (error) {
214
+ if (error.code === "ENOENT")
215
+ return "missing";
216
+ throw error;
217
+ }
218
+ }
219
+ async function assertPrivateFile(path) {
220
+ const metadata = await lstat(path);
221
+ if (!metadata.isFile() || metadata.isSymbolicLink() || (metadata.mode & 0o777) !== 0o600 ||
222
+ metadata.nlink !== 1 ||
223
+ (typeof process.getuid === "function" && metadata.uid !== process.getuid())) {
224
+ throw new Error("Portable credential file is unsafe.");
225
+ }
226
+ if ((await realpath(dirname(path))) !== dirname(path) || await realpath(path) !== path) {
227
+ throw new Error("Portable credential file is unsafe.");
228
+ }
229
+ }
230
+ async function readPrivateBytes(path) {
231
+ const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
232
+ try {
233
+ const metadata = await handle.stat();
234
+ if (!metadata.isFile() || (metadata.mode & 0o777) !== 0o600 || metadata.nlink !== 1 ||
235
+ (typeof process.getuid === "function" && metadata.uid !== process.getuid()) ||
236
+ metadata.size > 1024 * 1024)
237
+ throw new Error("Portable credential file is unsafe.");
238
+ return await handle.readFile();
239
+ }
240
+ finally {
241
+ await handle.close();
242
+ }
243
+ }
244
+ async function readPrivateBytesIfPresent(path) {
245
+ try {
246
+ await assertPrivateFile(path);
247
+ return await readPrivateBytes(path);
248
+ }
249
+ catch (error) {
250
+ if (error.code === "ENOENT")
251
+ return null;
252
+ throw error;
253
+ }
254
+ }
255
+ function parseDocument(bytes) {
256
+ if (bytes === null)
257
+ return { version: 1, accounts: {} };
258
+ const parsed = JSON.parse(bytes.toString("utf8"));
259
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed) ||
260
+ parsed.version !== 1)
261
+ throw new Error("Portable credential store is invalid.");
262
+ const accounts = parsed.accounts;
263
+ if (typeof accounts !== "object" || accounts === null || Array.isArray(accounts)) {
264
+ throw new Error("Portable credential store is invalid.");
265
+ }
266
+ if (Object.keys(accounts).length > 1_024)
267
+ throw new Error("Portable credential store is invalid.");
268
+ for (const [key, value] of Object.entries(accounts)) {
269
+ if (!/^[A-Za-z0-9._:-]{1,256}$/u.test(key) || typeof value !== "string" || value.length > 65_536) {
270
+ throw new Error("Portable credential store is invalid.");
271
+ }
272
+ }
273
+ return { version: 1, accounts: accounts };
274
+ }
275
+ function validateRecord(value) {
276
+ if (typeof value !== "object" || value === null || Array.isArray(value))
277
+ throw new Error("Portable credential is invalid.");
278
+ const record = value;
279
+ if (Object.keys(record).sort().join(",") !== "clientId,credential,origin,serverCapabilities,trustIdentity,version" ||
280
+ record["version"] !== 2 || typeof record["origin"] !== "string" ||
281
+ !isCanonicalHttpsIpOrigin(record["origin"]) ||
282
+ typeof record["trustIdentity"] !== "string" || !trustPattern.test(record["trustIdentity"]) ||
283
+ typeof record["credential"] !== "string" || !credentialPattern.test(record["credential"]) ||
284
+ typeof record["clientId"] !== "string" || !uuidPattern.test(record["clientId"]) ||
285
+ !Array.isArray(record["serverCapabilities"]) || record["serverCapabilities"].length !== 1 ||
286
+ record["serverCapabilities"][0] !== "create_cube") {
287
+ throw new Error("Portable credential is invalid.");
288
+ }
289
+ }
290
+ function isCanonicalHttpsIpOrigin(value) {
291
+ try {
292
+ const url = new URL(value);
293
+ const host = url.hostname.startsWith("[") && url.hostname.endsWith("]")
294
+ ? url.hostname.slice(1, -1)
295
+ : url.hostname;
296
+ const port = Number(url.port);
297
+ return url.protocol === "https:" && isIP(host) !== 0 && Number.isInteger(port) && port >= 1 &&
298
+ port <= 65_535 && url.username === "" && url.password === "" && url.pathname === "/" &&
299
+ url.search === "" && url.hash === "" && url.origin === value;
300
+ }
301
+ catch {
302
+ return false;
303
+ }
304
+ }
305
+ //# sourceMappingURL=portable-credential-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-credential-store.js","sourceRoot":"","sources":["../src/portable-credential-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface RegistryRuntimeArtifact {
2
+ readonly tarballPath: string;
3
+ readonly version: string;
4
+ readonly integrity: string;
5
+ readonly sourceSha: string | null;
6
+ readonly cleanup: () => Promise<void>;
7
+ }
8
+ export interface RegistryArtifactSource {
9
+ readonly latest: (runtimeRoot: string, signal: AbortSignal) => Promise<RegistryRuntimeArtifact>;
10
+ }
11
+ export declare function createRegistryArtifactSource(request?: typeof fetch): RegistryArtifactSource;
@@ -0,0 +1,99 @@
1
+ import { lstat, mkdir, mkdtemp, realpath, rm, writeFile } from "node:fs/promises";
2
+ import { isAbsolute, join } from "node:path";
3
+ const registryOrigin = "https://registry.npmjs.org";
4
+ const exactVersion = /^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?$/u;
5
+ const integrityPattern = /^sha512-[A-Za-z0-9+/]{86}==$/u;
6
+ const sourceShaPattern = /^[0-9a-f]{40}$/u;
7
+ export function createRegistryArtifactSource(request = fetch) {
8
+ return {
9
+ async latest(runtimeRoot, signal) {
10
+ if (!isAbsolute(runtimeRoot))
11
+ throw new Error("Runtime root must be absolute.");
12
+ try {
13
+ const existing = await lstat(runtimeRoot);
14
+ if (!existing.isDirectory() || existing.isSymbolicLink()) {
15
+ throw new Error("Runtime root must be a private directory.");
16
+ }
17
+ }
18
+ catch (error) {
19
+ if (error.code !== "ENOENT")
20
+ throw error;
21
+ await mkdir(runtimeRoot, { recursive: true, mode: 0o700 });
22
+ }
23
+ const root = await realpath(runtimeRoot);
24
+ const rootMetadata = await lstat(root);
25
+ if ((rootMetadata.mode & 0o077) !== 0)
26
+ throw new Error("Runtime root must be a private directory.");
27
+ const temporary = await mkdtemp(join(root, ".download-"));
28
+ try {
29
+ const metadataResponse = await request(`${registryOrigin}/borgmcp-server/latest`, {
30
+ headers: { accept: "application/json" },
31
+ redirect: "error",
32
+ signal,
33
+ });
34
+ if (!metadataResponse.ok || metadataResponse.url !== `${registryOrigin}/borgmcp-server/latest`) {
35
+ throw new Error("Server artifact metadata verification failed.");
36
+ }
37
+ const metadataBytes = await readBounded(metadataResponse, 64 * 1024);
38
+ const metadata = JSON.parse(metadataBytes.toString("utf8"));
39
+ if (metadata.name !== "borgmcp-server" || typeof metadata.version !== "string" ||
40
+ !exactVersion.test(metadata.version) || typeof metadata.dist?.integrity !== "string" ||
41
+ !integrityPattern.test(metadata.dist.integrity)) {
42
+ throw new Error("Server artifact metadata verification failed.");
43
+ }
44
+ const canonicalTarball = `${registryOrigin}/borgmcp-server/-/borgmcp-server-${metadata.version}.tgz`;
45
+ if (metadata.dist.tarball !== canonicalTarball ||
46
+ (metadata.gitHead !== undefined &&
47
+ (typeof metadata.gitHead !== "string" || !sourceShaPattern.test(metadata.gitHead)))) {
48
+ throw new Error("Server artifact metadata verification failed.");
49
+ }
50
+ const artifactResponse = await request(canonicalTarball, { redirect: "error", signal });
51
+ if (!artifactResponse.ok || artifactResponse.url !== canonicalTarball) {
52
+ throw new Error("Server artifact download failed.");
53
+ }
54
+ const artifact = await readBounded(artifactResponse, 2 * 1024 * 1024);
55
+ const tarballPath = join(temporary, `borgmcp-server-${metadata.version}.tgz`);
56
+ await writeFile(tarballPath, artifact, { flag: "wx", mode: 0o600 });
57
+ return Object.freeze({
58
+ tarballPath,
59
+ version: metadata.version,
60
+ integrity: metadata.dist.integrity,
61
+ sourceSha: typeof metadata.gitHead === "string" ? metadata.gitHead : null,
62
+ cleanup: () => rm(temporary, { recursive: true, force: true }),
63
+ });
64
+ }
65
+ catch (error) {
66
+ await rm(temporary, { recursive: true, force: true });
67
+ throw error;
68
+ }
69
+ },
70
+ };
71
+ }
72
+ async function readBounded(response, limit) {
73
+ const declared = response.headers.get("content-length");
74
+ if (declared !== null && (!/^[0-9]+$/u.test(declared) || Number(declared) > limit)) {
75
+ throw new Error("Server artifact response exceeded its bound.");
76
+ }
77
+ if (response.body === null)
78
+ throw new Error("Server artifact response is empty.");
79
+ const reader = response.body.getReader();
80
+ const chunks = [];
81
+ let bytes = 0;
82
+ try {
83
+ while (true) {
84
+ const next = await reader.read();
85
+ if (next.done)
86
+ break;
87
+ bytes += next.value.byteLength;
88
+ if (bytes > limit)
89
+ throw new Error("Server artifact response exceeded its bound.");
90
+ chunks.push(Buffer.from(next.value));
91
+ }
92
+ }
93
+ finally {
94
+ await reader.cancel().catch(() => undefined);
95
+ reader.releaseLock();
96
+ }
97
+ return Buffer.concat(chunks, bytes);
98
+ }
99
+ //# sourceMappingURL=registry-artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-artifact.js","sourceRoot":"","sources":["../src/registry-artifact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare const SERVER_PACKAGE_VERSION = "0.1.9";
2
+ export declare const RUNTIME_INFO_PATH = "/api/runtime";
3
+ export interface RuntimeBuildIdentity {
4
+ readonly package_version: string;
5
+ readonly source_sha: string | null;
6
+ readonly artifact_integrity: string | null;
7
+ readonly protocol_version: string;
8
+ readonly started_at: string;
9
+ }
10
+ export interface RuntimeBuildIdentityInput {
11
+ readonly sourceSha?: string;
12
+ readonly artifactIntegrity?: string;
13
+ readonly startedAt?: Date;
14
+ }
15
+ export interface LoadRuntimeBuildIdentityInput extends RuntimeBuildIdentityInput {
16
+ readonly artifactDescriptorPath?: string;
17
+ }
18
+ export declare function createRuntimeBuildIdentity(input?: RuntimeBuildIdentityInput): RuntimeBuildIdentity;
19
+ export declare function loadRuntimeBuildIdentity(input?: LoadRuntimeBuildIdentityInput): Promise<RuntimeBuildIdentity>;
@@ -0,0 +1,61 @@
1
+ import { PROTOCOL_VERSION } from "borgmcp-shared/protocol";
2
+ import { lstat, readFile } from "node:fs/promises";
3
+ export const SERVER_PACKAGE_VERSION = "0.1.9";
4
+ export const RUNTIME_INFO_PATH = "/api/runtime";
5
+ const sourceShaPattern = /^[0-9a-f]{40}$/u;
6
+ const artifactIntegrityPattern = /^sha512-[A-Za-z0-9+/]{86}==$/u;
7
+ export function createRuntimeBuildIdentity(input = {}) {
8
+ const sourceSha = input.sourceSha;
9
+ const artifactIntegrity = input.artifactIntegrity;
10
+ if (sourceSha !== undefined && !sourceShaPattern.test(sourceSha)) {
11
+ throw new Error("Server source identity is invalid.");
12
+ }
13
+ if (artifactIntegrity !== undefined && !artifactIntegrityPattern.test(artifactIntegrity)) {
14
+ throw new Error("Server artifact identity is invalid.");
15
+ }
16
+ const startedAt = input.startedAt ?? new Date();
17
+ if (!Number.isFinite(startedAt.getTime()))
18
+ throw new Error("Server start time is invalid.");
19
+ return Object.freeze({
20
+ package_version: SERVER_PACKAGE_VERSION,
21
+ source_sha: sourceSha ?? null,
22
+ artifact_integrity: artifactIntegrity ?? null,
23
+ protocol_version: PROTOCOL_VERSION,
24
+ started_at: startedAt.toISOString(),
25
+ });
26
+ }
27
+ export async function loadRuntimeBuildIdentity(input = {}) {
28
+ if (input.artifactDescriptorPath === undefined)
29
+ return createRuntimeBuildIdentity(input);
30
+ let descriptor;
31
+ try {
32
+ const metadata = await lstat(input.artifactDescriptorPath);
33
+ if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > 4 * 1024) {
34
+ throw new Error("invalid descriptor");
35
+ }
36
+ descriptor = JSON.parse(await readFile(input.artifactDescriptorPath, "utf8"));
37
+ }
38
+ catch (error) {
39
+ if (error.code === "ENOENT")
40
+ return createRuntimeBuildIdentity(input);
41
+ throw new Error("Runtime artifact descriptor is invalid.");
42
+ }
43
+ if (descriptor.version !== SERVER_PACKAGE_VERSION ||
44
+ typeof descriptor.integrity !== "string" || !artifactIntegrityPattern.test(descriptor.integrity) ||
45
+ (descriptor.source_sha !== null &&
46
+ (typeof descriptor.source_sha !== "string" || !sourceShaPattern.test(descriptor.source_sha)))) {
47
+ throw new Error("Runtime artifact descriptor is invalid.");
48
+ }
49
+ if (input.artifactIntegrity !== undefined && input.artifactIntegrity !== descriptor.integrity) {
50
+ throw new Error("Runtime artifact identity conflicts with the activated artifact.");
51
+ }
52
+ if (input.sourceSha !== undefined && input.sourceSha !== descriptor.source_sha) {
53
+ throw new Error("Runtime source identity conflicts with the activated artifact.");
54
+ }
55
+ return createRuntimeBuildIdentity({
56
+ artifactIntegrity: descriptor.integrity,
57
+ ...(descriptor.source_sha === null ? {} : { sourceSha: descriptor.source_sha }),
58
+ ...(input.startedAt === undefined ? {} : { startedAt: input.startedAt }),
59
+ });
60
+ }
61
+ //# sourceMappingURL=runtime-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-identity.js","sourceRoot":"","sources":["../src/runtime-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { RuntimeBuildIdentity } from "./runtime-identity.js";
2
+ export interface VerifiedRuntimeArtifact {
3
+ readonly artifactDirectory: string;
4
+ readonly packageDirectory: string;
5
+ readonly version: string;
6
+ readonly integrity: string;
7
+ readonly sourceSha: string | null;
8
+ readonly treeSha256: string;
9
+ }
10
+ export interface RuntimeLifecycleDependencies {
11
+ readonly unpack: (archive: Buffer, stagingDirectory: string, signal: AbortSignal) => Promise<void>;
12
+ readonly restart: (signal: AbortSignal) => Promise<void>;
13
+ readonly stop: (signal: AbortSignal) => Promise<void>;
14
+ readonly probe: (signal: AbortSignal) => Promise<RuntimeBuildIdentity>;
15
+ }
16
+ export interface StageRuntimeArtifactInput {
17
+ readonly runtimeRoot: string;
18
+ readonly tarballPath: string;
19
+ readonly expectedIntegrity: string;
20
+ readonly expectedVersion: string;
21
+ readonly sourceSha?: string;
22
+ readonly timeoutMs: number;
23
+ }
24
+ export interface ActivateRuntimeArtifactInput {
25
+ readonly runtimeRoot: string;
26
+ readonly artifact: VerifiedRuntimeArtifact;
27
+ readonly timeoutMs: number;
28
+ }
29
+ export interface RuntimeLifecycle {
30
+ readonly stage: (input: StageRuntimeArtifactInput) => Promise<VerifiedRuntimeArtifact>;
31
+ readonly prepare: (input: Omit<ActivateRuntimeArtifactInput, "timeoutMs">) => Promise<VerifiedRuntimeArtifact>;
32
+ readonly activate: (input: ActivateRuntimeArtifactInput) => Promise<RuntimeBuildIdentity>;
33
+ }
34
+ export type RuntimeRecoveryState = "restored" | "stopped" | "failed";
35
+ export declare class RuntimeActivationError extends Error {
36
+ readonly recovery: RuntimeRecoveryState;
37
+ constructor(recovery: RuntimeRecoveryState);
38
+ }
39
+ export declare function createRuntimeLifecycle(dependencies: RuntimeLifecycleDependencies): RuntimeLifecycle;
40
+ export declare function inspectActiveRuntimeArtifact(runtimeRoot: string): Promise<VerifiedRuntimeArtifact | null>;
41
+ export interface RuntimeCommandResult {
42
+ readonly stdout: string;
43
+ readonly stderr: string;
44
+ }
45
+ export interface RuntimeCommandRunner {
46
+ (executable: string, args: readonly string[], options: {
47
+ readonly cwd?: string;
48
+ readonly signal: AbortSignal;
49
+ readonly stdin?: Buffer;
50
+ }): Promise<RuntimeCommandResult>;
51
+ }
52
+ export declare function createUnixNpmArtifactUnpacker(options?: {
53
+ readonly tarExecutable?: string;
54
+ readonly npmExecutable?: string;
55
+ readonly run?: RuntimeCommandRunner;
56
+ }): RuntimeLifecycleDependencies["unpack"];