borgmcp-server 0.1.1

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 (71) hide show
  1. package/LICENSE +105 -0
  2. package/NOTICE +8 -0
  3. package/README.md +119 -0
  4. package/SECURITY.md +38 -0
  5. package/THIRD_PARTY_NOTICES.md +35 -0
  6. package/dist/bootstrap.d.ts +18 -0
  7. package/dist/bootstrap.js +104 -0
  8. package/dist/bootstrap.js.map +1 -0
  9. package/dist/cli.d.ts +7 -0
  10. package/dist/cli.js +96 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/coordination-api.d.ts +25 -0
  13. package/dist/coordination-api.js +457 -0
  14. package/dist/coordination-api.js.map +1 -0
  15. package/dist/credentials.d.ts +58 -0
  16. package/dist/credentials.js +244 -0
  17. package/dist/credentials.js.map +1 -0
  18. package/dist/enrollment.d.ts +17 -0
  19. package/dist/enrollment.js +122 -0
  20. package/dist/enrollment.js.map +1 -0
  21. package/dist/https-server.d.ts +94 -0
  22. package/dist/https-server.js +814 -0
  23. package/dist/https-server.js.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.js +2 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/main.d.ts +3 -0
  28. package/dist/main.js +67 -0
  29. package/dist/main.js.map +1 -0
  30. package/dist/migrations.d.ts +8 -0
  31. package/dist/migrations.js +366 -0
  32. package/dist/migrations.js.map +1 -0
  33. package/dist/network-policy.d.ts +13 -0
  34. package/dist/network-policy.js +49 -0
  35. package/dist/network-policy.js.map +1 -0
  36. package/dist/operator-error.d.ts +3 -0
  37. package/dist/operator-error.js +63 -0
  38. package/dist/operator-error.js.map +1 -0
  39. package/dist/principal.d.ts +32 -0
  40. package/dist/principal.js +64 -0
  41. package/dist/principal.js.map +1 -0
  42. package/dist/protocol-draft.d.ts +2 -0
  43. package/dist/protocol-draft.js +31 -0
  44. package/dist/protocol-draft.js.map +1 -0
  45. package/dist/service.d.ts +61 -0
  46. package/dist/service.js +455 -0
  47. package/dist/service.js.map +1 -0
  48. package/dist/start-options.d.ts +2 -0
  49. package/dist/start-options.js +46 -0
  50. package/dist/start-options.js.map +1 -0
  51. package/dist/store.d.ts +327 -0
  52. package/dist/store.js +1729 -0
  53. package/dist/store.js.map +1 -0
  54. package/npm-shrinkwrap.json +1942 -0
  55. package/package.json +60 -0
  56. package/src/bootstrap.ts +127 -0
  57. package/src/cli.ts +102 -0
  58. package/src/coordination-api.ts +508 -0
  59. package/src/credentials.ts +319 -0
  60. package/src/enrollment.ts +156 -0
  61. package/src/https-server.ts +962 -0
  62. package/src/index.ts +3 -0
  63. package/src/main.ts +73 -0
  64. package/src/migrations.ts +394 -0
  65. package/src/network-policy.ts +65 -0
  66. package/src/operator-error.ts +97 -0
  67. package/src/principal.ts +106 -0
  68. package/src/protocol-draft.ts +32 -0
  69. package/src/service.ts +525 -0
  70. package/src/start-options.ts +46 -0
  71. package/src/store.ts +2316 -0
@@ -0,0 +1,327 @@
1
+ import { type Principal } from "./principal.js";
2
+ export type CubeAccess = "read" | "write" | "manage";
3
+ export interface CubeRecord {
4
+ readonly id: string;
5
+ readonly ownerId: string;
6
+ readonly name: string;
7
+ readonly directive: string;
8
+ readonly createdAt: string;
9
+ readonly updatedAt: string;
10
+ }
11
+ export interface ActivityRecord {
12
+ readonly id: string;
13
+ readonly cubeId: string;
14
+ readonly droneId: string | null;
15
+ readonly actorKind: Principal["kind"];
16
+ readonly actorId: string;
17
+ readonly message: string;
18
+ readonly createdAt: string;
19
+ }
20
+ export interface LogCursor {
21
+ readonly id: string;
22
+ readonly created_at: string;
23
+ }
24
+ export interface EnrichedActivityRecord {
25
+ readonly id: string;
26
+ readonly cube_id: string;
27
+ readonly drone_id: string | null;
28
+ readonly message: string;
29
+ readonly visibility: "broadcast" | "direct";
30
+ readonly created_at: string;
31
+ readonly drone_label: string | null;
32
+ readonly role_name: string | null;
33
+ readonly recipient_drone_ids: string[];
34
+ }
35
+ export interface ClaimRecord {
36
+ readonly log_entry_id: string;
37
+ readonly claimant_drone_id: string;
38
+ readonly claimant_label: string | null;
39
+ readonly claimant_role: string | null;
40
+ readonly claimed_at: string;
41
+ readonly stale: false;
42
+ }
43
+ export interface ActivityPage {
44
+ readonly entries: EnrichedActivityRecord[];
45
+ readonly cursor: LogCursor | null;
46
+ readonly behind_by: number;
47
+ readonly has_more: boolean;
48
+ readonly claims: ClaimRecord[];
49
+ }
50
+ export interface DecisionRecord {
51
+ readonly id: string;
52
+ readonly cube_id: string;
53
+ readonly topic: string;
54
+ readonly decision: string;
55
+ readonly rationale: string | null;
56
+ readonly ratified_by: string | null;
57
+ readonly status: "active" | "superseded" | "removed";
58
+ readonly supersedes: string | null;
59
+ readonly created_at: string;
60
+ }
61
+ export interface RoleRecord {
62
+ readonly id: string;
63
+ readonly cube_id: string;
64
+ readonly name: string;
65
+ readonly short_description: string;
66
+ readonly is_default: boolean;
67
+ readonly is_human_seat: boolean;
68
+ readonly role_class: "queen" | "worker";
69
+ readonly created_at: string;
70
+ }
71
+ export interface DroneRecord {
72
+ readonly id: string;
73
+ readonly cube_id: string;
74
+ readonly role_id: string;
75
+ readonly label: string;
76
+ readonly last_seen: string;
77
+ readonly hostname: string | null;
78
+ readonly created_at: string;
79
+ }
80
+ export interface StoreDiagnostics {
81
+ readonly journalMode: string;
82
+ readonly foreignKeys: boolean;
83
+ readonly schemaVersions: number[];
84
+ }
85
+ export interface OpenStoreOptions {
86
+ readonly path: string;
87
+ readonly clock?: () => Date;
88
+ readonly storageLimits?: StorageLimits;
89
+ readonly capacityProbe?: () => StorageCapacity;
90
+ readonly cubeLimits?: CubeLimits;
91
+ readonly mutationHook?: (phase: string) => void;
92
+ }
93
+ export interface CubeLimits {
94
+ readonly maxCubesPerClient: number;
95
+ readonly maxCubesTotal: number;
96
+ }
97
+ export declare const DEFAULT_CUBE_LIMITS: CubeLimits;
98
+ export interface StorageLimits {
99
+ readonly maxActivityEntriesPerCube: number;
100
+ readonly maxDatabaseBytes: number;
101
+ readonly minFreeDiskBytes: number;
102
+ }
103
+ export interface StorageCapacity {
104
+ readonly databaseBytes: number;
105
+ readonly freeDiskBytes: number;
106
+ }
107
+ export declare const DEFAULT_STORAGE_LIMITS: StorageLimits;
108
+ export interface StoreRuntime {
109
+ readonly forPrincipal: (principal: Principal) => ScopedStore;
110
+ readonly maintenance: MaintenanceStore;
111
+ readonly credentials: CredentialStore;
112
+ readonly diagnostics: () => StoreDiagnostics;
113
+ readonly close: () => void;
114
+ }
115
+ export interface DigestPair {
116
+ readonly lookup: Buffer;
117
+ readonly verifier: Buffer;
118
+ }
119
+ export interface StoredSecretDigest extends DigestPair {
120
+ readonly id: string;
121
+ readonly expiresAt?: string;
122
+ readonly consumedAt?: string | null;
123
+ readonly clientId?: string;
124
+ readonly revokedAt?: string | null;
125
+ }
126
+ export interface StoredInvitationDigest extends StoredSecretDigest {
127
+ readonly purpose: "owner" | "client";
128
+ readonly ownerEpoch: number | null;
129
+ }
130
+ export interface EnrollmentClaimResult {
131
+ readonly purpose: "owner" | "client";
132
+ readonly clientId: string;
133
+ readonly serverCapabilities: readonly [] | readonly ["create_cube"];
134
+ }
135
+ export interface StoredDroneSessionDigest extends StoredSecretDigest {
136
+ readonly sessionId: string;
137
+ readonly clientId: string;
138
+ readonly cubeId: string;
139
+ readonly droneId: string;
140
+ readonly expiresAt: string;
141
+ }
142
+ export interface CredentialStore {
143
+ readonly createRecoveryCredential: (id: string, digest: DigestPair) => void;
144
+ readonly findRecoveryCredential: (lookup: Buffer) => StoredSecretDigest | null;
145
+ readonly createInvitation: (input: {
146
+ readonly id: string;
147
+ readonly digest: DigestPair;
148
+ readonly expiresAt: string;
149
+ readonly purpose: "owner" | "client";
150
+ }) => void;
151
+ readonly findInvitation: (lookup: Buffer) => StoredInvitationDigest | null;
152
+ readonly claimInvitation: (input: {
153
+ readonly invitationId: string;
154
+ readonly clientId: string;
155
+ readonly requestedClientName: string | null;
156
+ readonly retryKey: string;
157
+ readonly credentialId: string;
158
+ readonly credentialDigest: DigestPair;
159
+ }) => EnrollmentClaimResult | null;
160
+ readonly findClientCredential: (lookup: Buffer) => StoredSecretDigest | null;
161
+ readonly clientExists: (clientId: string) => boolean;
162
+ readonly clientIsActive: (clientId: string) => boolean;
163
+ readonly findDroneSessionCredential: (lookup: Buffer) => StoredDroneSessionDigest | null;
164
+ readonly rotateClientCredential: (input: {
165
+ readonly clientId: string;
166
+ readonly credentialId: string;
167
+ readonly credentialDigest: DigestPair;
168
+ }) => boolean;
169
+ readonly revokeClientCredentials: (clientId: string) => void;
170
+ }
171
+ export interface ScopedStore {
172
+ readonly createCube: (input: CreateCubeInput) => CreateCubeRecord;
173
+ readonly listCubes: () => CubeRecord[];
174
+ readonly getCube: (cubeId: string) => CubeRecord | null;
175
+ readonly updateDirective: (cubeId: string, directive: string) => void;
176
+ readonly appendActivity: (cubeId: string, message: string) => ActivityRecord;
177
+ readonly readActivity: (cubeId: string, limit: number) => ActivityRecord[];
178
+ readonly listRoles: (cubeId: string) => RoleRecord[];
179
+ readonly listDrones: (cubeId: string) => DroneRecord[];
180
+ readonly appendLog: (cubeId: string, input: {
181
+ readonly message: string;
182
+ readonly visibility?: "broadcast" | "direct";
183
+ readonly recipientDroneIds?: readonly string[];
184
+ }) => EnrichedActivityRecord;
185
+ readonly readLog: (cubeId: string, cursor: LogCursor | null, limit: number) => ActivityPage;
186
+ readonly acknowledge: (cubeId: string, entryId: string, kind: "ack" | "claim") => void;
187
+ readonly recordDecision: (cubeId: string, input: {
188
+ readonly topic: string;
189
+ readonly decision: string;
190
+ readonly rationale?: string;
191
+ }) => DecisionRecord;
192
+ readonly listDecisions: (cubeId: string) => DecisionRecord[];
193
+ readonly subscribeActivity: (cubeId: string, listener: (entry: EnrichedActivityRecord) => void) => (() => void);
194
+ readonly attachSeat: (input: SeatAttachInput) => SeatAttachRecord;
195
+ }
196
+ export interface CreateCubeInput {
197
+ readonly retryKey: string;
198
+ readonly name: string;
199
+ readonly template: "default";
200
+ }
201
+ export interface CreateCubeRecord {
202
+ readonly cubeId: string;
203
+ readonly humanSeatRoleId: string;
204
+ readonly defaultWorkerRoleId: string;
205
+ readonly access: "manage";
206
+ }
207
+ export interface SeatAttachInput {
208
+ readonly cubeId: string;
209
+ readonly roleId: string;
210
+ readonly retryKey: string;
211
+ readonly priorDroneId?: string;
212
+ readonly droneId: string;
213
+ readonly sessionId: string;
214
+ readonly credentialId: string;
215
+ readonly credentialDigest: DigestPair;
216
+ readonly expiresAt: string;
217
+ }
218
+ export interface SeatAttachRecord {
219
+ readonly cube: {
220
+ readonly id: string;
221
+ readonly name: string;
222
+ };
223
+ readonly role: {
224
+ readonly id: string;
225
+ readonly name: string;
226
+ readonly role_class: "queen" | "worker";
227
+ readonly is_human_seat: boolean;
228
+ };
229
+ readonly drone: {
230
+ readonly id: string;
231
+ readonly label: string;
232
+ };
233
+ readonly sessionId: string;
234
+ readonly expiresAt: string;
235
+ readonly generation: number;
236
+ readonly reattached: boolean;
237
+ readonly revokedSessionIds: readonly string[];
238
+ }
239
+ export interface MaintenanceStore {
240
+ readonly createClient: (input: {
241
+ readonly id: string;
242
+ readonly name: string;
243
+ }) => void;
244
+ readonly createCube: (input: {
245
+ readonly id: string;
246
+ readonly ownerId?: string;
247
+ readonly name: string;
248
+ readonly directive: string;
249
+ }) => void;
250
+ readonly grantClientCube: (input: {
251
+ readonly clientId: string;
252
+ readonly cubeId: string;
253
+ readonly access: CubeAccess;
254
+ }) => void;
255
+ readonly removeClientCubeGrant: (clientId: string, cubeId: string) => boolean;
256
+ readonly grantCreateCubeCapability: (clientId: string) => void;
257
+ readonly resetAuthorityState: () => void;
258
+ readonly observeAuthorityState: () => {
259
+ readonly enrolled_clients: number;
260
+ readonly enrollment_claims: number;
261
+ readonly cubes: number;
262
+ readonly roles: number;
263
+ readonly grants: number;
264
+ readonly server_capabilities: number;
265
+ readonly cube_create_bindings: number;
266
+ };
267
+ readonly inspectCreatedCube: (clientId: string, record: CreateCubeRecord) => {
268
+ readonly cube_exists: boolean;
269
+ readonly creator_has_grant: boolean;
270
+ readonly grant_count: number;
271
+ readonly role_count: number;
272
+ readonly human_seat_role_matches: boolean;
273
+ readonly default_worker_role_matches: boolean;
274
+ };
275
+ readonly inspectEnrollmentPrincipal: (clientId: string) => {
276
+ readonly active_credential_bindings: number;
277
+ };
278
+ readonly createRole: (input: {
279
+ readonly id: string;
280
+ readonly cubeId: string;
281
+ readonly name: string;
282
+ readonly roleClass?: "queen" | "worker";
283
+ readonly isHumanSeat?: boolean;
284
+ }) => void;
285
+ readonly createDrone: (input: {
286
+ readonly id: string;
287
+ readonly cubeId: string;
288
+ readonly roleId: string;
289
+ readonly clientId: string;
290
+ readonly label: string;
291
+ }) => void;
292
+ readonly createDroneSession: (input: {
293
+ readonly id: string;
294
+ readonly clientId: string;
295
+ readonly cubeId: string;
296
+ readonly droneId: string;
297
+ readonly expiresAt: string;
298
+ }) => void;
299
+ readonly revokeClient: (clientId: string) => void;
300
+ readonly revokeDroneSession: (sessionId: string) => void;
301
+ readonly expireActivityCursor: (cubeId: string, cursor: LogCursor) => void;
302
+ }
303
+ export declare class ScopedStoreError extends Error {
304
+ readonly code = "NOT_FOUND";
305
+ constructor();
306
+ }
307
+ export declare class CursorExpiredError extends Error {
308
+ readonly code = "CURSOR_EXPIRED";
309
+ constructor();
310
+ }
311
+ export declare class AttachConflictError extends Error {
312
+ readonly code = "ATTACH_CONFLICT";
313
+ constructor();
314
+ }
315
+ export declare class StorageCapacityError extends Error {
316
+ readonly code = "CAPACITY_EXCEEDED";
317
+ constructor();
318
+ }
319
+ export declare class AccessDeniedError extends Error {
320
+ readonly code = "ACCESS_DENIED";
321
+ constructor();
322
+ }
323
+ export declare class CreateCubeConflictError extends Error {
324
+ readonly code = "INVALID_INPUT";
325
+ constructor();
326
+ }
327
+ export declare function openStore(options: OpenStoreOptions): Promise<StoreRuntime>;