borgmcp-server 0.1.1 → 0.1.4

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 (48) hide show
  1. package/README.md +69 -22
  2. package/dist/cli.js +62 -11
  3. package/dist/cli.js.map +1 -1
  4. package/dist/coordination-api.d.ts +2 -1
  5. package/dist/coordination-api.js +232 -18
  6. package/dist/coordination-api.js.map +1 -1
  7. package/dist/credentials.d.ts +10 -2
  8. package/dist/credentials.js +44 -6
  9. package/dist/credentials.js.map +1 -1
  10. package/dist/debug-log.d.ts +77 -0
  11. package/dist/debug-log.js +125 -0
  12. package/dist/debug-log.js.map +1 -0
  13. package/dist/https-server.d.ts +3 -0
  14. package/dist/https-server.js +80 -4
  15. package/dist/https-server.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/migrations.d.ts +4 -0
  18. package/dist/migrations.js +71 -0
  19. package/dist/migrations.js.map +1 -1
  20. package/dist/operator-error.d.ts +2 -1
  21. package/dist/operator-error.js +23 -5
  22. package/dist/operator-error.js.map +1 -1
  23. package/dist/role-section.d.ts +14 -0
  24. package/dist/role-section.js +87 -0
  25. package/dist/role-section.js.map +1 -0
  26. package/dist/service.d.ts +10 -3
  27. package/dist/service.js +218 -15
  28. package/dist/service.js.map +1 -1
  29. package/dist/start-options.d.ts +5 -1
  30. package/dist/start-options.js +17 -3
  31. package/dist/start-options.js.map +1 -1
  32. package/dist/store.d.ts +65 -1
  33. package/dist/store.js +398 -26
  34. package/dist/store.js.map +1 -1
  35. package/npm-shrinkwrap.json +2 -2
  36. package/package.json +1 -1
  37. package/src/cli.ts +61 -11
  38. package/src/coordination-api.ts +236 -14
  39. package/src/credentials.ts +71 -5
  40. package/src/debug-log.ts +165 -0
  41. package/src/https-server.ts +75 -2
  42. package/src/index.ts +1 -1
  43. package/src/migrations.ts +74 -0
  44. package/src/operator-error.ts +40 -6
  45. package/src/role-section.ts +108 -0
  46. package/src/service.ts +239 -18
  47. package/src/start-options.ts +21 -4
  48. package/src/store.ts +462 -28
@@ -1,4 +1,10 @@
1
1
  import { createHash } from "node:crypto";
2
+ export class MigrationCompatibilityError extends Error {
3
+ constructor() {
4
+ super("Database migrations do not exactly match this server version.");
5
+ this.name = "MigrationCompatibilityError";
6
+ }
7
+ }
2
8
  export const STORE_MIGRATIONS = Object.freeze([
3
9
  {
4
10
  version: 1,
@@ -295,6 +301,46 @@ export const STORE_MIGRATIONS = Object.freeze([
295
301
  ON seat_attach_bindings (drone_id, client_id, cube_id);
296
302
  `,
297
303
  },
304
+ {
305
+ version: 7,
306
+ name: "role_management_foundation",
307
+ sql: `
308
+ ALTER TABLE roles ADD COLUMN is_mandatory INTEGER NOT NULL DEFAULT 0
309
+ CHECK (is_mandatory IN (0, 1));
310
+ ALTER TABLE roles ADD COLUMN can_broadcast INTEGER NOT NULL DEFAULT 0
311
+ CHECK (can_broadcast IN (0, 1));
312
+ ALTER TABLE roles ADD COLUMN receives_all_direct INTEGER NOT NULL DEFAULT 0
313
+ CHECK (receives_all_direct IN (0, 1));
314
+
315
+ CREATE UNIQUE INDEX roles_one_default_per_cube_idx
316
+ ON roles (cube_id) WHERE is_default = 1;
317
+ `,
318
+ },
319
+ {
320
+ version: 8,
321
+ name: "cube_scoped_invitations",
322
+ sql: `
323
+ ALTER TABLE enrollment_invitations ADD COLUMN cube_id TEXT;
324
+ ALTER TABLE enrollment_invitations ADD COLUMN access TEXT
325
+ CHECK (access IS NULL OR access IN ('read', 'write', 'manage'));
326
+
327
+ CREATE TRIGGER enrollment_invitations_scope_insert
328
+ BEFORE INSERT ON enrollment_invitations
329
+ WHEN (NEW.cube_id IS NULL) <> (NEW.access IS NULL)
330
+ OR (NEW.cube_id IS NOT NULL AND NEW.purpose <> 'client')
331
+ BEGIN
332
+ SELECT RAISE(ABORT, 'invalid invitation cube scope');
333
+ END;
334
+
335
+ CREATE TRIGGER enrollment_invitations_scope_update
336
+ BEFORE UPDATE OF cube_id, access, purpose ON enrollment_invitations
337
+ WHEN (NEW.cube_id IS NULL) <> (NEW.access IS NULL)
338
+ OR (NEW.cube_id IS NOT NULL AND NEW.purpose <> 'client')
339
+ BEGIN
340
+ SELECT RAISE(ABORT, 'invalid invitation cube scope');
341
+ END;
342
+ `,
343
+ },
298
344
  ]);
299
345
  export function applyMigrations(database, migrations = STORE_MIGRATIONS) {
300
346
  validateMigrationOrder(migrations);
@@ -339,6 +385,31 @@ export function applyMigrations(database, migrations = STORE_MIGRATIONS) {
339
385
  }
340
386
  }
341
387
  }
388
+ export function assertMigrationsCurrent(database, migrations = STORE_MIGRATIONS) {
389
+ validateMigrationOrder(migrations);
390
+ let rows;
391
+ try {
392
+ rows = database.prepare("SELECT version, name, checksum FROM schema_migrations ORDER BY version").all();
393
+ }
394
+ catch {
395
+ throw new MigrationCompatibilityError();
396
+ }
397
+ if (rows.length !== migrations.length)
398
+ throw new MigrationCompatibilityError();
399
+ for (let index = 0; index < migrations.length; index += 1) {
400
+ let applied;
401
+ try {
402
+ applied = appliedMigrationRow(rows[index]);
403
+ }
404
+ catch {
405
+ throw new MigrationCompatibilityError();
406
+ }
407
+ const expected = migrations[index];
408
+ if (applied.version !== expected.version || applied.name !== expected.name ||
409
+ applied.checksum !== checksum(expected))
410
+ throw new MigrationCompatibilityError();
411
+ }
412
+ }
342
413
  function validateMigrationOrder(migrations) {
343
414
  migrations.forEach((migration, index) => {
344
415
  if (migration.version !== index + 1 || migration.name.length === 0 || migration.sql.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
- export type OperatorErrorCode = "START_LAN_DUPLICATE" | "START_HOST_DUPLICATE" | "START_PORT_DUPLICATE" | "START_HOST_MISSING" | "START_PORT_MISSING" | "START_PORT_INVALID" | "START_OPTION_UNKNOWN" | "BIND_PORT_INVALID" | "BIND_HOST_INVALID" | "BIND_WILDCARD" | "BIND_PUBLIC" | "BIND_LAN_CONSENT" | "SERVER_FILES_MISSING" | "DATA_PATH_SYMLINK" | "LAN_CA_KEY_ONLINE" | "RUNTIME_ACTIVE" | "RUNTIME_LOCK_UNSAFE" | "RUNTIME_LOCK_INVALID" | "RUNTIME_LOCK_STALE" | "ACTIVITY_LIMIT_INVALID" | "DATABASE_LIMIT_INVALID" | "DISK_RESERVE_INVALID" | "CLIENT_NOT_FOUND" | "GRANT_NOT_FOUND" | "RECOVERY_INVALID";
1
+ export type OperatorErrorCode = "START_LAN_DUPLICATE" | "START_HOST_DUPLICATE" | "START_PORT_DUPLICATE" | "START_HOST_MISSING" | "START_PORT_MISSING" | "START_PORT_INVALID" | "START_LOG_LEVEL_DUPLICATE" | "START_LOG_LEVEL_MISSING" | "START_LOG_LEVEL_INVALID" | "START_OPTION_UNKNOWN" | "BIND_PORT_INVALID" | "BIND_HOST_INVALID" | "BIND_WILDCARD" | "BIND_PUBLIC" | "BIND_LAN_CONSENT" | "SERVER_FILES_MISSING" | "DATA_PATH_SYMLINK" | "INSTALLATION_EXISTS" | "LAN_CA_KEY_ONLINE" | "RUNTIME_ACTIVE" | "RUNTIME_LOCK_UNSAFE" | "RUNTIME_LOCK_INVALID" | "RUNTIME_LOCK_STALE" | "ACTIVITY_LIMIT_INVALID" | "DATABASE_LIMIT_INVALID" | "DISK_RESERVE_INVALID" | "CLIENT_NOT_FOUND" | "GRANT_NOT_FOUND" | "RECOVERY_INVALID" | "INVITATION_BUSY" | "INVITATION_CONTENTION" | "INVITATION_SCHEMA_MISMATCH" | "INVITATION_CUBE_NOT_FOUND" | "INVITATION_CUBE_SELECTOR_INVALID" | "INVITATION_CUBE_AMBIGUOUS";
2
2
  export declare const operatorErrors: Readonly<Record<OperatorErrorCode, Error>>;
3
3
  export declare function operatorPublicMessage(error: unknown): string | null;
4
+ export declare function invitationCubeAmbiguousError(candidateIds: readonly string[]): Error;
@@ -5,6 +5,9 @@ const publicMessages = Object.freeze({
5
5
  START_HOST_MISSING: "Provide an IP address after --host.",
6
6
  START_PORT_MISSING: "Provide a port number after --port.",
7
7
  START_PORT_INVALID: "Provide --port as an integer from 0 to 65535.",
8
+ START_LOG_LEVEL_DUPLICATE: "Provide --log-level only once.",
9
+ START_LOG_LEVEL_MISSING: "Provide debug after --log-level.",
10
+ START_LOG_LEVEL_INVALID: "Use --log-level debug or omit the option.",
8
11
  START_OPTION_UNKNOWN: "Use only documented start options; run borg-mcp-server help.",
9
12
  BIND_PORT_INVALID: "Configure the listen port as an integer from 0 to 65535.",
10
13
  BIND_HOST_INVALID: "Configure --host as an explicit IP address.",
@@ -13,8 +16,9 @@ const publicMessages = Object.freeze({
13
16
  BIND_LAN_CONSENT: "Add --lan to consent to this private-LAN start.",
14
17
  SERVER_FILES_MISSING: "Configure BORG_SERVER_DATA_DIR or the required TLS file variables.",
15
18
  DATA_PATH_SYMLINK: "Choose a BORG_SERVER_DATA_DIR path that contains no symbolic links.",
19
+ INSTALLATION_EXISTS: "An installation already exists in BORG_SERVER_DATA_DIR. To destroy and recreate it, stop the server and run borg-mcp-server setup --reinitialize.",
16
20
  LAN_CA_KEY_ONLINE: "Move ca.key out of the runtime data directory before private-LAN startup.",
17
- RUNTIME_ACTIVE: "Stop the server before running offline client administration.",
21
+ RUNTIME_ACTIVE: "Stop the server before running setup or offline administration.",
18
22
  RUNTIME_LOCK_UNSAFE: "Ensure runtime.lock is a private regular file before retrying.",
19
23
  RUNTIME_LOCK_INVALID: "Confirm the server is stopped, then remove the invalid runtime.lock.",
20
24
  RUNTIME_LOCK_STALE: "Confirm the recorded server process is stopped, then remove runtime.lock.",
@@ -24,26 +28,34 @@ const publicMessages = Object.freeze({
24
28
  CLIENT_NOT_FOUND: "Provide an existing active client ID.",
25
29
  GRANT_NOT_FOUND: "Provide an existing client cube grant.",
26
30
  RECOVERY_INVALID: "Provide the active recovery credential through the private prompt.",
31
+ INVITATION_BUSY: "Confirm no invitation or offline administration command is running, then remove invitation-mint.lock.",
32
+ INVITATION_CONTENTION: "Retry invitation minting after the current server database write completes.",
33
+ INVITATION_SCHEMA_MISMATCH: "Invitation minting is unavailable while a server with an incompatible schema is running. Stop the server and rerun this command, or use the CLI version that matches the running server.",
34
+ INVITATION_CUBE_NOT_FOUND: "Provide an existing cube name or full cube ID.",
35
+ INVITATION_CUBE_SELECTOR_INVALID: "Provide a full canonical cube UUID or an exact case-sensitive cube name.",
36
+ INVITATION_CUBE_AMBIGUOUS: "Cube name is ambiguous. Rerun with the full cube ID.",
27
37
  });
28
38
  const operatorErrorCodes = new WeakMap();
39
+ const operatorErrorMessages = new WeakMap();
29
40
  const operatorErrorCapability = Object.freeze({});
30
41
  class OperatorError extends Error {
31
42
  #operatorCode;
32
- constructor(capability, code) {
33
- super(Object.hasOwn(publicMessages, code) ? publicMessages[code] : "Operator error rejected.");
43
+ constructor(capability, code, publicMessage) {
44
+ super(publicMessage ?? (Object.hasOwn(publicMessages, code) ? publicMessages[code] : "Operator error rejected."));
34
45
  if (capability !== operatorErrorCapability || !Object.hasOwn(publicMessages, code)) {
35
46
  throw new Error("Operator error construction is unavailable.");
36
47
  }
37
48
  this.name = "OperatorError";
38
49
  this.#operatorCode = code;
39
50
  operatorErrorCodes.set(this, code);
51
+ operatorErrorMessages.set(this, this.message);
40
52
  Object.freeze(this);
41
53
  }
42
54
  get code() {
43
55
  return this.#operatorCode;
44
56
  }
45
57
  get publicMessage() {
46
- return publicMessages[this.#operatorCode];
58
+ return operatorErrorMessages.get(this) ?? publicMessages[this.#operatorCode];
47
59
  }
48
60
  }
49
61
  export const operatorErrors = Object.freeze(Object.fromEntries(Object.keys(publicMessages).map((code) => [
@@ -58,6 +70,12 @@ export function operatorPublicMessage(error) {
58
70
  return null;
59
71
  if (Object.getPrototypeOf(error) !== OperatorError.prototype || !Object.isFrozen(error))
60
72
  return null;
61
- return publicMessages[code];
73
+ return operatorErrorMessages.get(error) ?? publicMessages[code];
74
+ }
75
+ export function invitationCubeAmbiguousError(candidateIds) {
76
+ if (candidateIds.length < 2 || candidateIds.some((id) => !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u.test(id))) {
77
+ throw new Error("Ambiguous cube candidates must contain canonical cube IDs.");
78
+ }
79
+ return new OperatorError(operatorErrorCapability, "INVITATION_CUBE_AMBIGUOUS", `Cube name is ambiguous. Rerun with the full cube ID. Candidate cube IDs: ${candidateIds.join(", ")}`);
62
80
  }
63
81
  //# sourceMappingURL=operator-error.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"operator-error.js","sourceRoot":"","sources":["../src/operator-error.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator-error.js","sourceRoot":"","sources":["../src/operator-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type RoleSectionPatchOp = {
2
+ readonly action: "replace";
3
+ readonly heading: string;
4
+ readonly body: string;
5
+ } | {
6
+ readonly action: "insert";
7
+ readonly heading: string;
8
+ readonly body: string;
9
+ readonly after?: string | null;
10
+ } | {
11
+ readonly action: "delete";
12
+ readonly heading: string;
13
+ };
14
+ export declare function patchRoleSectionText(text: string, operation: RoleSectionPatchOp): string;
@@ -0,0 +1,87 @@
1
+ export function patchRoleSectionText(text, operation) {
2
+ validateHeading(operation.heading);
3
+ const sections = parseSections(text);
4
+ const target = normalizedHeading(operation.heading);
5
+ const index = sections.findIndex((section) => section.heading !== null && normalizedHeading(section.heading) === target);
6
+ if (operation.action === "replace") {
7
+ if (index === -1)
8
+ throw new Error("Role section not found.");
9
+ sections[index] = renderedSection(operation.heading, operation.body);
10
+ return serializeSections(sections);
11
+ }
12
+ if (operation.action === "delete") {
13
+ if (index === -1)
14
+ throw new Error("Role section not found.");
15
+ sections.splice(index, 1);
16
+ return serializeSections(sections);
17
+ }
18
+ if (index !== -1)
19
+ throw new Error("Role section already exists.");
20
+ const section = renderedSection(operation.heading, operation.body);
21
+ if (operation.after == null) {
22
+ ensureTrailingNewline(sections, sections.length - 1);
23
+ sections.push(section);
24
+ return serializeSections(sections);
25
+ }
26
+ validateHeading(operation.after);
27
+ const after = normalizedHeading(operation.after);
28
+ const afterIndex = sections.findIndex((candidate) => candidate.heading !== null && normalizedHeading(candidate.heading) === after);
29
+ if (afterIndex === -1)
30
+ throw new Error("Role section insertion point does not exist.");
31
+ ensureTrailingNewline(sections, afterIndex);
32
+ sections.splice(afterIndex + 1, 0, section);
33
+ return serializeSections(sections);
34
+ }
35
+ function parseSections(text) {
36
+ const sections = [];
37
+ const lines = text.split("\n");
38
+ let heading = null;
39
+ let body = "";
40
+ for (let index = 0; index < lines.length; index += 1) {
41
+ const line = lines[index];
42
+ const sourceLine = index < lines.length - 1 ? `${line}\n` : line;
43
+ if (isLabelLine(line)) {
44
+ sections.push({ heading, body });
45
+ heading = line.slice(0, -1).trim();
46
+ body = sourceLine;
47
+ }
48
+ else {
49
+ body += sourceLine;
50
+ }
51
+ }
52
+ sections.push({ heading, body });
53
+ return sections;
54
+ }
55
+ function isLabelLine(line) {
56
+ if (/^\s/u.test(line) || !line.endsWith(":"))
57
+ return false;
58
+ const label = line.slice(0, -1);
59
+ return label.length > 0 && label.length <= 60 && !label.includes(":") &&
60
+ !/^[*\-#>`]/u.test(label);
61
+ }
62
+ function renderedSection(heading, body) {
63
+ const normalizedBody = body === "" || body.endsWith("\n") ? body : `${body}\n`;
64
+ return {
65
+ heading: heading.trim(),
66
+ body: `${heading.trim()}:\n${normalizedBody}`,
67
+ };
68
+ }
69
+ function ensureTrailingNewline(sections, index) {
70
+ const section = sections[index];
71
+ if (section !== undefined && section.body !== "" && !section.body.endsWith("\n")) {
72
+ sections[index] = { ...section, body: `${section.body}\n` };
73
+ }
74
+ }
75
+ function serializeSections(sections) {
76
+ return sections.map((section) => section.body).join("");
77
+ }
78
+ function normalizedHeading(heading) {
79
+ return heading.trim().toLowerCase();
80
+ }
81
+ function validateHeading(heading) {
82
+ if (typeof heading !== "string" || /[\r\n]/u.test(heading) ||
83
+ !isLabelLine(`${heading.trim()}:`)) {
84
+ throw new TypeError("Role section heading is invalid.");
85
+ }
86
+ }
87
+ //# sourceMappingURL=role-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-section.js","sourceRoot":"","sources":["../src/role-section.ts"],"names":[],"mappings":"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"}
package/dist/service.d.ts CHANGED
@@ -1,17 +1,21 @@
1
1
  import { type BootstrapResult } from "./bootstrap.js";
2
+ import { type CubeInvitationResult } from "./credentials.js";
2
3
  import { type HttpsServerOptions, type RunningServer } from "./https-server.js";
3
4
  import { openStore, type StorageLimits } from "./store.js";
4
5
  import type { CubeAccess } from "./store.js";
5
6
  export interface ServerService {
6
7
  readonly start: (args: readonly string[]) => Promise<void>;
7
- readonly setup?: () => Promise<BootstrapResult>;
8
+ readonly setup?: (options: SetupOptions) => Promise<BootstrapResult>;
8
9
  readonly rotateClient?: (clientId: string) => Promise<string>;
9
10
  readonly revokeClient?: (clientId: string) => Promise<void>;
10
11
  readonly grantClient?: (clientId: string, cubeId: string, access: CubeAccess) => Promise<void>;
11
12
  readonly ungrantClient?: (clientId: string, cubeId: string) => Promise<void>;
12
- readonly createClientInvitation?: (recoveryCredential: string) => Promise<string>;
13
+ readonly createClientInvitation?: (recoveryCredential: string, cubeSelector?: string, access?: CubeAccess) => Promise<string | CubeInvitationResult>;
13
14
  readonly replaceOwnerInvitation?: (recoveryCredential: string) => Promise<string>;
14
15
  }
16
+ export interface SetupOptions {
17
+ readonly reinitialize: boolean;
18
+ }
15
19
  export interface ServerEnvironment {
16
20
  readonly BORG_SERVER_TLS_KEY_FILE?: string;
17
21
  readonly BORG_SERVER_TLS_CERT_FILE?: string;
@@ -29,6 +33,7 @@ interface ServiceDependencies {
29
33
  readonly startServer: (options: HttpsServerOptions) => Promise<RunningServer>;
30
34
  readonly onStarted: (origin: string) => void;
31
35
  readonly waitForShutdown: (server: RunningServer, signal?: AbortSignal) => Promise<void>;
36
+ readonly debugOutput?: (line: string) => void;
32
37
  readonly installShutdownHandlers?: () => {
33
38
  readonly signal: AbortSignal;
34
39
  readonly dispose: () => void;
@@ -48,12 +53,14 @@ export declare function assertLanCaKeyOffline(runtimeDataDirectory: string): Pro
48
53
  export declare function selectServerEnvironment(environment: NodeJS.ProcessEnv): ServerEnvironment;
49
54
  export declare function resolveStorageLimits(environment: ServerEnvironment): StorageLimits;
50
55
  export declare const nodeServerService: ServerService;
56
+ export declare function setupNodeServerInstallation(setupDataDirectory: string, bindHost: string, options: SetupOptions): Promise<BootstrapResult>;
51
57
  export declare function createOfflineCredentialService(offlineDataDirectory: string): Pick<Required<ServerService>, "rotateClient" | "revokeClient" | "grantClient" | "ungrantClient" | "createClientInvitation" | "replaceOwnerInvitation">;
52
58
  interface RuntimeLock {
53
59
  readonly release: () => Promise<void>;
54
60
  }
55
61
  export declare function isFatalTeardownError(error: unknown): boolean;
56
- export declare function acquireRuntimeLock(runtimeDataDirectory: string): Promise<RuntimeLock>;
62
+ export declare function acquireRuntimeLock(runtimeDataDirectory: string, purpose?: "server" | "exclusive-admin"): Promise<RuntimeLock>;
63
+ export declare function acquireInvitationMintLock(runtimeDataDirectory: string): Promise<RuntimeLock>;
57
64
  export declare function installProcessShutdownHandlers(): {
58
65
  readonly signal: AbortSignal;
59
66
  readonly dispose: () => void;