borgmcp 2.0.11 → 2.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 (58) hide show
  1. package/README.md +11 -3
  2. package/dist/assimilate-cmd.d.ts +22 -4
  3. package/dist/assimilate-cmd.d.ts.map +1 -1
  4. package/dist/assimilate-cmd.js +109 -110
  5. package/dist/assimilate-cmd.js.map +1 -1
  6. package/dist/assimilate-deps.d.ts +7 -1
  7. package/dist/assimilate-deps.d.ts.map +1 -1
  8. package/dist/assimilate-deps.js +69 -25
  9. package/dist/assimilate-deps.js.map +1 -1
  10. package/dist/claude.d.ts +3 -1
  11. package/dist/claude.d.ts.map +1 -1
  12. package/dist/claude.js +26 -12
  13. package/dist/claude.js.map +1 -1
  14. package/dist/cli-help.d.ts +2 -0
  15. package/dist/cli-help.d.ts.map +1 -1
  16. package/dist/cli-help.js +25 -7
  17. package/dist/cli-help.js.map +1 -1
  18. package/dist/config.d.ts +7 -4
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +21 -4
  21. package/dist/config.js.map +1 -1
  22. package/dist/remote-client.js +1 -1
  23. package/dist/remote-client.js.map +1 -1
  24. package/dist/repository-cube-init.d.ts +72 -0
  25. package/dist/repository-cube-init.d.ts.map +1 -0
  26. package/dist/repository-cube-init.js +341 -0
  27. package/dist/repository-cube-init.js.map +1 -0
  28. package/dist/repository-identity.d.ts +29 -0
  29. package/dist/repository-identity.d.ts.map +1 -0
  30. package/dist/repository-identity.js +143 -0
  31. package/dist/repository-identity.js.map +1 -0
  32. package/dist/server-errors.d.ts +17 -0
  33. package/dist/server-errors.d.ts.map +1 -1
  34. package/dist/server-errors.js +32 -0
  35. package/dist/server-errors.js.map +1 -1
  36. package/dist/server-facade.d.ts +11 -1
  37. package/dist/server-facade.d.ts.map +1 -1
  38. package/dist/server-facade.js +33 -3
  39. package/dist/server-facade.js.map +1 -1
  40. package/dist/server-handshake.d.ts +38 -4
  41. package/dist/server-handshake.d.ts.map +1 -1
  42. package/dist/server-handshake.js +175 -13
  43. package/dist/server-handshake.js.map +1 -1
  44. package/docs/EXTRACTION_PROVENANCE.md +9 -7
  45. package/docs/LOCAL_SERVER.md +44 -9
  46. package/docs/RELEASING.md +21 -4
  47. package/package.json +2 -2
  48. package/src/assimilate-cmd.ts +179 -137
  49. package/src/assimilate-deps.ts +96 -24
  50. package/src/claude.ts +34 -14
  51. package/src/cli-help.ts +28 -7
  52. package/src/config.ts +30 -8
  53. package/src/remote-client.ts +1 -1
  54. package/src/repository-cube-init.ts +452 -0
  55. package/src/repository-identity.ts +199 -0
  56. package/src/server-errors.ts +41 -0
  57. package/src/server-facade.ts +47 -2
  58. package/src/server-handshake.ts +258 -14
@@ -0,0 +1,341 @@
1
+ import { NEW_CUBE_TEMPLATE_PRESENTATIONS, LEGACY_DEFAULT_TEMPLATE_LABEL, } from 'borgmcp-shared/templates';
2
+ import { shellEscape } from './shell-escape.js';
3
+ import { BorgServerError, CubeCreationConfirmationError, CubeCreationOutcomeUnknownError, } from './server-errors.js';
4
+ export class RepositoryAssociationSaveError extends Error {
5
+ constructor() {
6
+ super('repository association could not be saved');
7
+ this.name = 'RepositoryAssociationSaveError';
8
+ }
9
+ }
10
+ export class RepositoryAssociationConfirmationError extends Error {
11
+ constructor() {
12
+ super('The Borg server did not confirm the repository cube association.');
13
+ this.name = 'RepositoryAssociationConfirmationError';
14
+ }
15
+ }
16
+ export class PromptInterruptedError extends Error {
17
+ constructor() {
18
+ super('prompt interrupted');
19
+ this.name = 'PromptInterruptedError';
20
+ }
21
+ }
22
+ const NAME_ERROR = 'Use 1-120 letters, digits, spaces, dots, underscores, or hyphens, starting with a letter or digit.';
23
+ export function validRepositoryCubeName(value) {
24
+ return Buffer.byteLength(value, 'utf8') <= 120 && /^[A-Za-z0-9][A-Za-z0-9 ._-]*$/.test(value);
25
+ }
26
+ function presentation(template) {
27
+ if (template === 'default') {
28
+ return { name: template, label: LEGACY_DEFAULT_TEMPLATE_LABEL };
29
+ }
30
+ return NEW_CUBE_TEMPLATE_PRESENTATIONS.find((candidate) => candidate.name === template);
31
+ }
32
+ async function ask(deps, message, operation = 'creation') {
33
+ try {
34
+ return { value: await deps.prompt(message) };
35
+ }
36
+ catch (error) {
37
+ if (error instanceof PromptInterruptedError) {
38
+ deps.write(`\nCube ${operation} cancelled. No cube, repository binding, or drone was created.\n`);
39
+ return { stop: 130 };
40
+ }
41
+ deps.write(`Input ended before cube ${operation}. No cube, repository binding, or drone was created.\n`);
42
+ return { stop: 1 };
43
+ }
44
+ }
45
+ function renderResult(deps, input) {
46
+ const lines = [
47
+ input.adopted ? 'Existing cube associated with this repository.' : input.existing ? 'Cube already initialized.' : 'Cube created.',
48
+ ` Name: ${input.response.name}`,
49
+ ` Template: ${presentation(input.response.template).label}`,
50
+ ` Repository: ${input.root}`,
51
+ ` Server: ${input.serverOrigin}`,
52
+ ];
53
+ if (input.creationOptionsUnused) {
54
+ lines.push('Creation options were not used because this repository is already initialized.');
55
+ }
56
+ if (input.mode === 'cube-init') {
57
+ lines.push('No drone was created.', `Next: borg assimilate --host ${shellEscape(input.serverOrigin)}`);
58
+ }
59
+ else {
60
+ lines.push('Continuing with role and seat setup...');
61
+ }
62
+ deps.write(`${lines.join('\n')}\n`);
63
+ }
64
+ export async function initializeRepositoryCube(input, deps) {
65
+ const repository = await deps.getIdentity(input.context);
66
+ const association = await deps.getAssociation(repository);
67
+ const creationOptionsRequested = input.flags.cubeName !== undefined ||
68
+ input.flags.template !== undefined || input.flags.noTemplate === true || input.flags.yes === true;
69
+ const creationOptionsUnused = association !== null && creationOptionsRequested;
70
+ if (association) {
71
+ const cube = await deps.getCube(association.cubeId);
72
+ const response = {
73
+ result: 'resolved',
74
+ cube_id: association.cubeId,
75
+ name: cube.name,
76
+ working_repo_name: association.workingRepoName,
77
+ repository,
78
+ template: association.template,
79
+ human_seat_role_id: cube.roles.find((role) => role.is_human_seat)?.id ?? '',
80
+ default_worker_role_id: cube.roles.find((role) => role.is_default)?.id ?? '',
81
+ access: 'manage',
82
+ };
83
+ renderResult(deps, {
84
+ existing: true,
85
+ response,
86
+ root: input.context.root,
87
+ serverOrigin: input.serverOrigin,
88
+ mode: input.mode,
89
+ creationOptionsUnused,
90
+ });
91
+ return { kind: 'success', creation: { response, cube }, existing: true };
92
+ }
93
+ const saveResolvedAssociation = async (response, options) => {
94
+ if (response.repository.kind !== repository.kind ||
95
+ response.repository.value !== repository.value ||
96
+ response.working_repo_name !== input.context.derivedName) {
97
+ throw new RepositoryAssociationConfirmationError();
98
+ }
99
+ const cube = await deps.getCube(response.cube_id);
100
+ if (cube.id !== response.cube_id ||
101
+ cube.name !== response.name ||
102
+ !cube.roles.some((role) => role.id === response.human_seat_role_id) ||
103
+ !cube.roles.some((role) => role.id === response.default_worker_role_id)) {
104
+ throw new RepositoryAssociationConfirmationError();
105
+ }
106
+ try {
107
+ await deps.saveAssociation(repository, {
108
+ cubeId: response.cube_id,
109
+ name: response.name,
110
+ workingRepoName: response.working_repo_name,
111
+ template: response.template,
112
+ });
113
+ }
114
+ catch {
115
+ throw new RepositoryAssociationSaveError();
116
+ }
117
+ renderResult(deps, {
118
+ existing: true,
119
+ adopted: options.adopted,
120
+ response,
121
+ root: input.context.root,
122
+ serverOrigin: input.serverOrigin,
123
+ mode: input.mode,
124
+ creationOptionsUnused: options.creationOptionsUnused,
125
+ });
126
+ return { kind: 'success', creation: { response, cube }, existing: true };
127
+ };
128
+ const serverAssociation = await deps.resolveAssociation(repository, input.context.derivedName);
129
+ if (serverAssociation.result === 'resolved') {
130
+ return saveResolvedAssociation(serverAssociation, {
131
+ adopted: false,
132
+ creationOptionsUnused: creationOptionsRequested,
133
+ });
134
+ }
135
+ const proposedName = input.flags.cubeName?.trim() ?? input.context.derivedName;
136
+ if (!validRepositoryCubeName(proposedName)) {
137
+ deps.write(`${NAME_ERROR}\n`);
138
+ return { kind: 'stop', code: 1 };
139
+ }
140
+ const accessibleCubes = await deps.listCubes();
141
+ const adoptExactMatch = async (name) => {
142
+ const matches = accessibleCubes.filter((cube) => cube.name === name);
143
+ if (matches.length === 0)
144
+ return null;
145
+ if (matches.length > 1) {
146
+ deps.write(`More than one accessible cube is named '${name}'. No cube, repository binding, or drone was created. Ask the server operator for an unambiguous repository cube grant.\n`);
147
+ return { kind: 'stop', code: 1 };
148
+ }
149
+ if (!deps.isTTY() || input.flags.yes) {
150
+ deps.write('Adopting an existing cube requires interactive confirmation; --yes is not accepted here.\n' +
151
+ 'Rerun without --yes in an interactive terminal. No cube, repository binding, or drone was created.\n');
152
+ return { kind: 'stop', code: 1 };
153
+ }
154
+ deps.write(`Found an existing cube matching this repository:\n` +
155
+ ` cube: ${matches[0].name}\n` +
156
+ ` repository: ${input.context.root}\n` +
157
+ ` server: ${input.serverOrigin}\n`);
158
+ while (true) {
159
+ const answer = await ask(deps, 'Link this repository to that cube? [y/N]: ', 'adoption');
160
+ if ('stop' in answer)
161
+ return { kind: 'stop', code: answer.stop };
162
+ const confirmation = answer.value.trim().toLowerCase();
163
+ if (confirmation === 'y' || confirmation === 'yes')
164
+ break;
165
+ if (confirmation === '' || confirmation === 'n' || confirmation === 'no') {
166
+ deps.write('No cube, repository binding, or drone was created.\n');
167
+ return { kind: 'stop', code: 0 };
168
+ }
169
+ deps.write('Enter y or n.\n');
170
+ }
171
+ const associated = await deps.associateCube({
172
+ cubeId: matches[0].id,
173
+ workingRepoName: input.context.derivedName,
174
+ repository,
175
+ });
176
+ if (associated.cube_id !== matches[0].id) {
177
+ throw new RepositoryAssociationConfirmationError();
178
+ }
179
+ try {
180
+ const confirmed = await deps.resolveAssociation(repository, input.context.derivedName);
181
+ if (confirmed.result !== 'resolved' || confirmed.cube_id !== associated.cube_id) {
182
+ throw new RepositoryAssociationConfirmationError();
183
+ }
184
+ return await saveResolvedAssociation(confirmed, { adopted: true, creationOptionsUnused: creationOptionsRequested });
185
+ }
186
+ catch (error) {
187
+ if (error instanceof RepositoryAssociationSaveError)
188
+ throw error;
189
+ throw new RepositoryAssociationConfirmationError();
190
+ }
191
+ };
192
+ const proposedAdoption = await adoptExactMatch(proposedName);
193
+ if (proposedAdoption)
194
+ return proposedAdoption;
195
+ if (input.canCreate === false) {
196
+ deps.write(`This enrolled client cannot create a cube on ${input.serverOrigin}. Ask the server operator to grant access to a cube, then rerun borg assimilate --host ${shellEscape(input.serverOrigin)}.\n`);
197
+ return { kind: 'stop', code: 1 };
198
+ }
199
+ if (input.flags.noTemplate) {
200
+ deps.write('--no-template is not supported for repository cube creation. Use --template software-dev or --template starter.\n');
201
+ return { kind: 'stop', code: 1 };
202
+ }
203
+ if (input.flags.template !== undefined && input.flags.template !== 'software-dev' && input.flags.template !== 'starter') {
204
+ const safe = input.flags.template.replace(/[\u0000-\u001f\u007f]/g, '?').slice(0, 120);
205
+ deps.write(`Unknown template '${safe}'. Use software-dev or starter.\n`);
206
+ return { kind: 'stop', code: 1 };
207
+ }
208
+ if (!deps.isTTY() && !input.flags.yes && (!input.flags.cubeName || !input.flags.template)) {
209
+ deps.write('Non-interactive cube creation requires --cube-name <name> and --template software-dev|starter, or --yes to use repository defaults.\n');
210
+ return { kind: 'stop', code: 1 };
211
+ }
212
+ deps.write(`Create a cube for this repository\n` +
213
+ `Repository: ${input.context.root}\n` +
214
+ `Server: ${input.serverOrigin}\n`);
215
+ let name = input.flags.cubeName?.trim() ?? input.context.derivedName;
216
+ if (!input.flags.cubeName && deps.isTTY() && !input.flags.yes) {
217
+ while (true) {
218
+ const answer = await ask(deps, `Cube name [${input.context.derivedName}]: `);
219
+ if ('stop' in answer)
220
+ return { kind: 'stop', code: answer.stop };
221
+ name = answer.value.trim() || input.context.derivedName;
222
+ if (validRepositoryCubeName(name))
223
+ break;
224
+ deps.write(`${NAME_ERROR}\n`);
225
+ }
226
+ }
227
+ if (!validRepositoryCubeName(name)) {
228
+ deps.write(`${NAME_ERROR}\n`);
229
+ return { kind: 'stop', code: 1 };
230
+ }
231
+ if (name !== proposedName) {
232
+ const editedNameAdoption = await adoptExactMatch(name);
233
+ if (editedNameAdoption)
234
+ return editedNameAdoption;
235
+ }
236
+ let template = input.flags.template;
237
+ if (!template && deps.isTTY() && !input.flags.yes) {
238
+ let menu = 'Choose a template:\n';
239
+ for (let i = 0; i < NEW_CUBE_TEMPLATE_PRESENTATIONS.length; i += 1) {
240
+ const p = NEW_CUBE_TEMPLATE_PRESENTATIONS[i];
241
+ const suffix = i === 0 ? ' (recommended)' : '';
242
+ menu += ` ${i + 1}. ${p.label}${suffix}\n`;
243
+ menu += ` ${p.short_description}\n`;
244
+ }
245
+ deps.write(menu);
246
+ while (!template) {
247
+ const answer = await ask(deps, 'Template [1]: ');
248
+ if ('stop' in answer)
249
+ return { kind: 'stop', code: answer.stop };
250
+ const selected = answer.value.trim();
251
+ if (selected === '' || selected === '1')
252
+ template = 'software-dev';
253
+ else if (selected === '2')
254
+ template = 'starter';
255
+ else
256
+ deps.write('Choose 1 or 2.\n');
257
+ }
258
+ }
259
+ template ??= 'software-dev';
260
+ if (deps.isTTY() && !input.flags.yes) {
261
+ deps.write(`Create this cube?\n` +
262
+ ` Name: ${name}\n` +
263
+ ` Template: ${presentation(template).label}\n` +
264
+ ` Repository: ${input.context.root}\n` +
265
+ ` Server: ${input.serverOrigin}\n`);
266
+ let confirmed = false;
267
+ while (!confirmed) {
268
+ const answer = await ask(deps, 'Create cube? [Y/n]: ');
269
+ if ('stop' in answer)
270
+ return { kind: 'stop', code: answer.stop };
271
+ const confirmation = answer.value.trim().toLowerCase();
272
+ if (confirmation === '' || confirmation === 'y' || confirmation === 'yes') {
273
+ confirmed = true;
274
+ break;
275
+ }
276
+ if (confirmation === 'n' || confirmation === 'no') {
277
+ deps.write('Cube creation cancelled. No cube, repository binding, or drone was created.\n');
278
+ return { kind: 'stop', code: 0 };
279
+ }
280
+ deps.write('Enter y or n.\n');
281
+ }
282
+ }
283
+ deps.write('Creating cube...\n');
284
+ const workingRepoName = input.context.derivedName;
285
+ let creation;
286
+ try {
287
+ creation = await deps.createCube({ name, workingRepoName, repository, template });
288
+ }
289
+ catch (error) {
290
+ if (error instanceof BorgServerError ||
291
+ error instanceof CubeCreationConfirmationError ||
292
+ error instanceof CubeCreationOutcomeUnknownError) {
293
+ throw error;
294
+ }
295
+ throw new CubeCreationOutcomeUnknownError();
296
+ }
297
+ let confirmed;
298
+ try {
299
+ confirmed = await deps.resolveAssociation(repository, workingRepoName);
300
+ }
301
+ catch {
302
+ throw new CubeCreationConfirmationError('The server did not return authoritative repository association state.');
303
+ }
304
+ if (confirmed.result !== 'resolved' ||
305
+ confirmed.repository.kind !== repository.kind ||
306
+ confirmed.repository.value !== repository.value ||
307
+ confirmed.working_repo_name !== workingRepoName ||
308
+ confirmed.cube_id !== creation.response.cube_id ||
309
+ confirmed.name !== creation.response.name ||
310
+ creation.cube.id !== confirmed.cube_id ||
311
+ creation.cube.name !== confirmed.name ||
312
+ !creation.cube.roles.some((role) => role.id === confirmed.human_seat_role_id) ||
313
+ !creation.cube.roles.some((role) => role.id === confirmed.default_worker_role_id)) {
314
+ throw new CubeCreationConfirmationError('The server did not confirm the created cube through authoritative repository resolution.');
315
+ }
316
+ try {
317
+ await deps.saveAssociation(repository, {
318
+ cubeId: confirmed.cube_id,
319
+ name: confirmed.name,
320
+ workingRepoName: confirmed.working_repo_name,
321
+ template: confirmed.template,
322
+ });
323
+ }
324
+ catch {
325
+ throw new RepositoryAssociationSaveError();
326
+ }
327
+ renderResult(deps, {
328
+ existing: creation.response.result === 'resolved',
329
+ response: confirmed,
330
+ root: input.context.root,
331
+ serverOrigin: input.serverOrigin,
332
+ mode: input.mode,
333
+ creationOptionsUnused: false,
334
+ });
335
+ return {
336
+ kind: 'success',
337
+ creation: { response: confirmed, cube: creation.cube },
338
+ existing: creation.response.result === 'resolved',
339
+ };
340
+ }
341
+ //# sourceMappingURL=repository-cube-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-cube-init.js","sourceRoot":"","sources":["../src/repository-cube-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { CreateCubeRepository, CubeTemplate } from 'borgmcp-shared/protocol';
2
+ export interface GitRepositoryContext {
3
+ root: string;
4
+ commonDir: string;
5
+ derivedName: string;
6
+ publicRepository: Extract<CreateCubeRepository, {
7
+ kind: 'origin';
8
+ }> | null;
9
+ publicRepositoryName: string | null;
10
+ }
11
+ export interface RepositoryAssociation {
12
+ cubeId: string;
13
+ name: string;
14
+ workingRepoName: string;
15
+ template: CubeTemplate;
16
+ }
17
+ export interface RepositoryIdentityDeps {
18
+ runGit?: (cwd: string, args: string[]) => {
19
+ status: number | null;
20
+ stdout?: string | null;
21
+ };
22
+ canonicalPath?: (path: string) => Promise<string>;
23
+ root?: string;
24
+ }
25
+ export declare function resolveGitRepositoryContext(cwd: string, deps?: RepositoryIdentityDeps): Promise<GitRepositoryContext | null>;
26
+ export declare function getOrCreateRepositoryIdentity(context: GitRepositoryContext, deps?: RepositoryIdentityDeps): Promise<CreateCubeRepository>;
27
+ export declare function getRepositoryAssociation(trustIdentity: string, repository: CreateCubeRepository, deps?: RepositoryIdentityDeps): Promise<RepositoryAssociation | null>;
28
+ export declare function saveRepositoryAssociation(trustIdentity: string, repository: CreateCubeRepository, association: RepositoryAssociation, deps?: RepositoryIdentityDeps): Promise<void>;
29
+ //# sourceMappingURL=repository-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-identity.d.ts","sourceRoot":"","sources":["../src/repository-identity.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAalF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC,oBAAoB,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAC3E,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAQD,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC5F,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAYD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAyBtC;AA0ED,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,oBAAoB,EAC7B,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,oBAAoB,CAAC,CAa/B;AAMD,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,oBAAoB,EAChC,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAIvC;AAED,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,oBAAoB,EAChC,WAAW,EAAE,qBAAqB,EAClC,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -0,0 +1,143 @@
1
+ import { createHmac, randomBytes, randomUUID } from 'node:crypto';
2
+ import { spawnSync } from 'node:child_process';
3
+ import { basename, isAbsolute, join } from 'node:path';
4
+ import { realpath } from 'node:fs/promises';
5
+ import { canonicalizeWorkingRepoIdentity } from './working-repo.js';
6
+ import { normalizeCubeName } from './cube-name.js';
7
+ import { borgConfigRoot, ensurePrivateBorgConfigRoot } from './private-root.js';
8
+ import { atomicWrite0600, readStoreFile, withStoreLock } from './seat-store.js';
9
+ const STORE_VERSION = 1;
10
+ const SECRET_FILE = 'repository-identity.key';
11
+ const STATE_FILE = 'repository-identities.json';
12
+ const LOCK_FILE = 'repository-identities.lock';
13
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
14
+ const DISPLAY_NAME_RE = /^[A-Za-z0-9][A-Za-z0-9 ._-]*$/;
15
+ function defaultRunGit(cwd, args) {
16
+ const result = spawnSync('git', args, { cwd, encoding: 'utf8' });
17
+ return { status: result.status, stdout: result.stdout };
18
+ }
19
+ function output(result) {
20
+ const value = result.status === 0 ? result.stdout?.trim() : null;
21
+ return value || null;
22
+ }
23
+ export async function resolveGitRepositoryContext(cwd, deps = {}) {
24
+ const runGit = deps.runGit ?? defaultRunGit;
25
+ const canonicalPath = deps.canonicalPath ?? realpath;
26
+ const rootRaw = output(runGit(cwd, ['rev-parse', '--show-toplevel']));
27
+ if (!rootRaw || !isAbsolute(rootRaw))
28
+ return null;
29
+ const bare = output(runGit(cwd, ['rev-parse', '--is-bare-repository']));
30
+ if (bare === 'true')
31
+ throw new Error('BARE_REPOSITORY');
32
+ const commonRaw = output(runGit(cwd, ['rev-parse', '--path-format=absolute', '--git-common-dir']));
33
+ if (!commonRaw || !isAbsolute(commonRaw))
34
+ return null;
35
+ const root = await canonicalPath(rootRaw);
36
+ const commonDir = await canonicalPath(commonRaw);
37
+ const derivedName = normalizeCubeName(basename(root));
38
+ if (!derivedName)
39
+ return null;
40
+ const originRaw = output(runGit(root, ['config', '--get', 'remote.origin.url']));
41
+ const canonical = originRaw ? canonicalizeWorkingRepoIdentity(originRaw) : null;
42
+ return {
43
+ root,
44
+ commonDir,
45
+ derivedName,
46
+ publicRepository: canonical?.origin
47
+ ? { kind: 'origin', value: canonical.origin }
48
+ : null,
49
+ publicRepositoryName: canonical?.name ?? null,
50
+ };
51
+ }
52
+ function parseSecret(raw) {
53
+ if (raw === null)
54
+ return null;
55
+ if (!/^[a-f0-9]{64}$/.test(raw.trim())) {
56
+ throw new Error('Borg repository identity secret is malformed');
57
+ }
58
+ return Buffer.from(raw.trim(), 'hex');
59
+ }
60
+ function emptyState() {
61
+ return { version: STORE_VERSION, localIdentities: {}, associations: {} };
62
+ }
63
+ function parseState(raw) {
64
+ if (raw === null)
65
+ return emptyState();
66
+ const parsed = JSON.parse(raw);
67
+ if (parsed.version !== STORE_VERSION ||
68
+ !parsed.localIdentities || typeof parsed.localIdentities !== 'object' || Array.isArray(parsed.localIdentities) ||
69
+ !parsed.associations || typeof parsed.associations !== 'object' || Array.isArray(parsed.associations)) {
70
+ throw new Error('Borg repository identity store is malformed or unsupported');
71
+ }
72
+ for (const [key, value] of Object.entries(parsed.localIdentities)) {
73
+ if (!/^[a-f0-9]{64}$/.test(key) || typeof value !== 'string' || !UUID_RE.test(value)) {
74
+ throw new Error('Borg repository identity store is malformed or unsupported');
75
+ }
76
+ }
77
+ for (const [key, value] of Object.entries(parsed.associations)) {
78
+ if (!/^[a-f0-9]{64}$/.test(key) ||
79
+ !value || typeof value !== 'object' || Array.isArray(value) ||
80
+ typeof value.cubeId !== 'string' || !UUID_RE.test(value.cubeId) ||
81
+ typeof value.name !== 'string' || Buffer.byteLength(value.name, 'utf8') > 120 ||
82
+ !DISPLAY_NAME_RE.test(value.name) ||
83
+ typeof value.workingRepoName !== 'string' || Buffer.byteLength(value.workingRepoName, 'utf8') > 120 ||
84
+ !DISPLAY_NAME_RE.test(value.workingRepoName) ||
85
+ (value.template !== 'software-dev' && value.template !== 'starter' && value.template !== 'default')) {
86
+ throw new Error('Borg repository identity store is malformed or unsupported');
87
+ }
88
+ }
89
+ return parsed;
90
+ }
91
+ function digest(secret, purpose, value) {
92
+ return createHmac('sha256', secret).update(purpose).update('\0').update(value).digest('hex');
93
+ }
94
+ async function withIdentityState(operation, deps = {}) {
95
+ const root = deps.root ?? borgConfigRoot();
96
+ await ensurePrivateBorgConfigRoot(root);
97
+ const options = { secureRoot: root, rootMode: 'private' };
98
+ return withStoreLock(join(root, LOCK_FILE), async () => {
99
+ const secretPath = join(root, SECRET_FILE);
100
+ let secret = parseSecret(await readStoreFile(secretPath, options));
101
+ if (!secret) {
102
+ secret = randomBytes(32);
103
+ await atomicWrite0600(secretPath, `${secret.toString('hex')}\n`, options);
104
+ }
105
+ const statePath = join(root, STATE_FILE);
106
+ const state = parseState(await readStoreFile(statePath, options));
107
+ const outcome = await operation(secret, state);
108
+ if (outcome.changed) {
109
+ await atomicWrite0600(statePath, `${JSON.stringify(state, null, 2)}\n`, options);
110
+ }
111
+ return outcome.result;
112
+ }, options);
113
+ }
114
+ export async function getOrCreateRepositoryIdentity(context, deps = {}) {
115
+ if (context.publicRepository)
116
+ return context.publicRepository;
117
+ return withIdentityState(async (secret, state) => {
118
+ const key = digest(secret, 'git-common-dir', context.commonDir);
119
+ let value = state.localIdentities[key];
120
+ let changed = false;
121
+ if (!value) {
122
+ value = randomUUID();
123
+ state.localIdentities[key] = value;
124
+ changed = true;
125
+ }
126
+ return { result: { kind: 'local', value }, changed };
127
+ }, deps);
128
+ }
129
+ function associationBinding(secret, trustIdentity, repository) {
130
+ return digest(secret, 'association', `${trustIdentity}\0${repository.kind}\0${repository.value}`);
131
+ }
132
+ export async function getRepositoryAssociation(trustIdentity, repository, deps = {}) {
133
+ return withIdentityState(async (secret, state) => ({
134
+ result: state.associations[associationBinding(secret, trustIdentity, repository)] ?? null,
135
+ }), deps);
136
+ }
137
+ export async function saveRepositoryAssociation(trustIdentity, repository, association, deps = {}) {
138
+ await withIdentityState(async (secret, state) => {
139
+ state.associations[associationBinding(secret, trustIdentity, repository)] = association;
140
+ return { result: undefined, changed: true };
141
+ }, deps);
142
+ }
143
+ //# sourceMappingURL=repository-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-identity.js","sourceRoot":"","sources":["../src/repository-identity.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,23 @@ export declare class BorgServerUnreachableError extends Error {
46
46
  cause?: unknown;
47
47
  });
48
48
  }
49
+ export declare class CubeCreationOutcomeUnknownError extends Error {
50
+ constructor();
51
+ }
52
+ export declare class CubeCreationConfirmationError extends Error {
53
+ constructor(message?: string);
54
+ }
55
+ export type RepositoryAssociationFailure = 'repository-already-associated' | 'cube-already-associated' | 'access-denied' | 'invalid-cube';
56
+ export declare class RepositoryAssociationOperationError extends Error {
57
+ readonly failure: RepositoryAssociationFailure;
58
+ constructor(failure: RepositoryAssociationFailure);
59
+ }
60
+ export declare class RepositoryAssociationOutcomeUnknownError extends Error {
61
+ constructor();
62
+ }
63
+ export declare class RepositoryAssociationResolutionError extends Error {
64
+ constructor();
65
+ }
49
66
  /** Exact retired TTL-replacement state: two saved bearers and no safe implicit winner. */
50
67
  export declare class LegacySessionCredentialCollisionError extends Error {
51
68
  readonly origin: string;
@@ -1 +1 @@
1
- {"version":3,"file":"server-errors.d.ts","sourceRoot":"","sources":["../src/server-errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,qBAAqB,GACrB,qBAAqB,GACrB,oBAAoB,GACpB,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,CAAC;AAEtB,6EAA6E;AAC7E,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,IAAI,EAAE,mBAAmB;gBAAzB,IAAI,EAAE,mBAAmB,EACzC,OAAO,EAAE,MAAM;CAKlB;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,MAAM,EAAE,MAAM;aAEd,IAAI,CAAC,EAAE,SAAS;gBAFhB,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,SAAS,YAAA;CAKnC;AAED,qBAAa,wBAAyB,SAAQ,KAAK;aAE/B,SAAS,EAAE,MAAM;aACjB,QAAQ,EAAE,MAAM;aAChB,UAAU,EAAE,MAAM;gBAFlB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM;CAWrC;AAED,qBAAa,qCAAsC,SAAQ,KAAK;aAE5C,SAAS,EAAE,MAAM;aACjB,QAAQ,EAAE,MAAM;aAChB,UAAU,EAAE,MAAM;gBAFlB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM;CASrC;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAED,0FAA0F;AAC1F,qBAAa,qCAAsC,SAAQ,KAAK;aAClC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI3C;AACD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"server-errors.d.ts","sourceRoot":"","sources":["../src/server-errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,qBAAqB,GACrB,qBAAqB,GACrB,oBAAoB,GACpB,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,CAAC;AAEtB,6EAA6E;AAC7E,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,IAAI,EAAE,mBAAmB;gBAAzB,IAAI,EAAE,mBAAmB,EACzC,OAAO,EAAE,MAAM;CAKlB;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,MAAM,EAAE,MAAM;aAEd,IAAI,CAAC,EAAE,SAAS;gBAFhB,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,SAAS,YAAA;CAKnC;AAED,qBAAa,wBAAyB,SAAQ,KAAK;aAE/B,SAAS,EAAE,MAAM;aACjB,QAAQ,EAAE,MAAM;aAChB,UAAU,EAAE,MAAM;gBAFlB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM;CAWrC;AAED,qBAAa,qCAAsC,SAAQ,KAAK;aAE5C,SAAS,EAAE,MAAM;aACjB,QAAQ,EAAE,MAAM;aAChB,UAAU,EAAE,MAAM;gBAFlB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM;CASrC;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAED,qBAAa,+BAAgC,SAAQ,KAAK;;CAKzD;AAED,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,OAAO,SAAgE;CAIpF;AAED,MAAM,MAAM,4BAA4B,GACpC,+BAA+B,GAC/B,yBAAyB,GACzB,eAAe,GACf,cAAc,CAAC;AAEnB,qBAAa,mCAAoC,SAAQ,KAAK;aAChC,OAAO,EAAE,4BAA4B;gBAArC,OAAO,EAAE,4BAA4B;CAIlE;AAED,qBAAa,wCAAyC,SAAQ,KAAK;;CAKlE;AAED,qBAAa,oCAAqC,SAAQ,KAAK;;CAK9D;AAED,0FAA0F;AAC1F,qBAAa,qCAAsC,SAAQ,KAAK;aAClC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI3C;AACD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC"}
@@ -76,6 +76,38 @@ export class BorgServerUnreachableError extends Error {
76
76
  this.name = 'BorgServerUnreachableError';
77
77
  }
78
78
  }
79
+ export class CubeCreationOutcomeUnknownError extends Error {
80
+ constructor() {
81
+ super('Cube creation outcome is unknown.');
82
+ this.name = 'CubeCreationOutcomeUnknownError';
83
+ }
84
+ }
85
+ export class CubeCreationConfirmationError extends Error {
86
+ constructor(message = 'The Borg server returned conflicting repository cube state.') {
87
+ super(message);
88
+ this.name = 'CubeCreationConfirmationError';
89
+ }
90
+ }
91
+ export class RepositoryAssociationOperationError extends Error {
92
+ failure;
93
+ constructor(failure) {
94
+ super('Borg server rejected the repository cube association');
95
+ this.failure = failure;
96
+ this.name = 'RepositoryAssociationOperationError';
97
+ }
98
+ }
99
+ export class RepositoryAssociationOutcomeUnknownError extends Error {
100
+ constructor() {
101
+ super('Repository cube association outcome is unknown.');
102
+ this.name = 'RepositoryAssociationOutcomeUnknownError';
103
+ }
104
+ }
105
+ export class RepositoryAssociationResolutionError extends Error {
106
+ constructor() {
107
+ super('Repository cube association could not be resolved.');
108
+ this.name = 'RepositoryAssociationResolutionError';
109
+ }
110
+ }
79
111
  /** Exact retired TTL-replacement state: two saved bearers and no safe implicit winner. */
80
112
  export class LegacySessionCredentialCollisionError extends Error {
81
113
  origin;
@@ -1 +1 @@
1
- {"version":3,"file":"server-errors.js","sourceRoot":"","sources":["../src/server-errors.ts"],"names":[],"mappings":"AASA,6EAA6E;AAC7E,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAEtB;IADlB,YACkB,IAAyB,EACzC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAqB;QAIzC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAE1B;IAEA;IAHlB,YACkB,MAAc,EAC9B,OAAe,EACC,IAAgB;QAEhC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,WAAM,GAAN,MAAM,CAAQ;QAEd,SAAI,GAAJ,IAAI,CAAY;QAGhC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAE/B;IACA;IACA;IAHlB,YACkB,SAAiB,EACjB,QAAgB,EAChB,UAAkB;QAElC,KAAK,CACH,+CAA+C,SAAS,WAAW;YACnE,qEAAqE;YACrE,kFAAkF;YAClF,GAAG,UAAU,mDAAmD;YAChE,8EAA8E,CAC/E,CAAC;QAVc,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,eAAU,GAAV,UAAU,CAAQ;QASlC,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,qCAAsC,SAAQ,KAAK;IAE5C;IACA;IACA;IAHlB,YACkB,SAAiB,EACjB,QAAgB,EAChB,UAAkB;QAElC,KAAK,CACH,kDAAkD,QAAQ,8BAA8B;YACxF,uBAAuB,SAAS,KAAK,UAAU,2CAA2C;YAC1F,yBAAyB,CAC1B,CAAC;QARc,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,eAAU,GAAV,UAAU,CAAQ;QAOlC,IAAI,CAAC,IAAI,GAAG,uCAAuC,CAAC;IACtD,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACnD,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,0FAA0F;AAC1F,MAAM,OAAO,qCAAsC,SAAQ,KAAK;IAClC;IAA5B,YAA4B,MAAc;QACxC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAD3B,WAAM,GAAN,MAAM,CAAQ;QAExC,IAAI,CAAC,IAAI,GAAG,uCAAuC,CAAC;IACtD,CAAC;CACF"}
1
+ {"version":3,"file":"server-errors.js","sourceRoot":"","sources":["../src/server-errors.ts"],"names":[],"mappings":"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"}