@sentropic/llm-mesh 0.32.3 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/enrollment/index.d.ts +4 -0
- package/dist/enrollment/index.d.ts.map +1 -1
- package/dist/enrollment/index.js +2 -0
- package/dist/enrollment/index.js.map +1 -1
- package/dist/enrollment/seat-onboarding-projections.d.ts +44 -0
- package/dist/enrollment/seat-onboarding-projections.d.ts.map +1 -0
- package/dist/enrollment/seat-onboarding-projections.js +113 -0
- package/dist/enrollment/seat-onboarding-projections.js.map +1 -0
- package/dist/enrollment/seat-onboarding.d.ts +161 -0
- package/dist/enrollment/seat-onboarding.d.ts.map +1 -0
- package/dist/enrollment/seat-onboarding.js +698 -0
- package/dist/enrollment/seat-onboarding.js.map +1 -0
- package/dist/node/index.d.ts +9 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +5 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/keyring/encrypted-file-keyring.d.ts +6 -0
- package/dist/node/keyring/encrypted-file-keyring.d.ts.map +1 -1
- package/dist/node/keyring/encrypted-file-keyring.js +51 -9
- package/dist/node/keyring/encrypted-file-keyring.js.map +1 -1
- package/dist/node/seat-onboarding-capture.d.ts +47 -0
- package/dist/node/seat-onboarding-capture.d.ts.map +1 -0
- package/dist/node/seat-onboarding-capture.js +164 -0
- package/dist/node/seat-onboarding-capture.js.map +1 -0
- package/dist/node/seat-onboarding-cell-compose.d.ts +25 -0
- package/dist/node/seat-onboarding-cell-compose.d.ts.map +1 -0
- package/dist/node/seat-onboarding-cell-compose.js +117 -0
- package/dist/node/seat-onboarding-cell-compose.js.map +1 -0
- package/dist/node/seat-onboarding-erase.d.ts +8 -0
- package/dist/node/seat-onboarding-erase.d.ts.map +1 -0
- package/dist/node/seat-onboarding-erase.js +31 -0
- package/dist/node/seat-onboarding-erase.js.map +1 -0
- package/dist/node/seat-onboarding-materialize.d.ts +6 -0
- package/dist/node/seat-onboarding-materialize.d.ts.map +1 -0
- package/dist/node/seat-onboarding-materialize.js +11 -0
- package/dist/node/seat-onboarding-materialize.js.map +1 -0
- package/dist/node/seat-onboarding-record.d.ts +11 -0
- package/dist/node/seat-onboarding-record.d.ts.map +1 -0
- package/dist/node/seat-onboarding-record.js +86 -0
- package/dist/node/seat-onboarding-record.js.map +1 -0
- package/dist/node/seat-onboarding-stage1.d.ts +11 -0
- package/dist/node/seat-onboarding-stage1.d.ts.map +1 -0
- package/dist/node/seat-onboarding-stage1.js +121 -0
- package/dist/node/seat-onboarding-stage1.js.map +1 -0
- package/dist/node/seat-onboarding-stage2.d.ts +10 -0
- package/dist/node/seat-onboarding-stage2.d.ts.map +1 -0
- package/dist/node/seat-onboarding-stage2.js +110 -0
- package/dist/node/seat-onboarding-stage2.js.map +1 -0
- package/dist/node/seat-onboarding-types.d.ts +106 -0
- package/dist/node/seat-onboarding-types.d.ts.map +1 -0
- package/dist/node/seat-onboarding-types.js +6 -0
- package/dist/node/seat-onboarding-types.js.map +1 -0
- package/dist/node/seat-stage-write.d.ts +25 -0
- package/dist/node/seat-stage-write.d.ts.map +1 -0
- package/dist/node/seat-stage-write.js +93 -0
- package/dist/node/seat-stage-write.js.map +1 -0
- package/dist/service/facade.d.ts +10 -0
- package/dist/service/facade.d.ts.map +1 -1
- package/dist/service/facade.js +3 -0
- package/dist/service/facade.js.map +1 -1
- package/dist/service/local-account-transport-service.d.ts +39 -0
- package/dist/service/local-account-transport-service.d.ts.map +1 -1
- package/dist/service/local-account-transport-service.js +158 -0
- package/dist/service/local-account-transport-service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { SeatBundleV1, SeatCli, SeatLineageTuple } from '../enrollment/seat-bundle.js';
|
|
2
|
+
import type { SeatLaunchGate, SeatOnboardingDestKey, SeatOnboardingFormat, SeatOnboardingStatus, SeatOnboardingV1 } from '../enrollment/seat-onboarding.js';
|
|
3
|
+
import type { StageCode } from './seat-stage-write.js';
|
|
4
|
+
export interface SeatStageInputSeat {
|
|
5
|
+
envelope: unknown;
|
|
6
|
+
seatDir: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SeatStageInput {
|
|
9
|
+
seats: readonly SeatStageInputSeat[];
|
|
10
|
+
ownerScope: string;
|
|
11
|
+
expectedNativeCliVersions: Partial<Record<SeatCli, string>>;
|
|
12
|
+
}
|
|
13
|
+
export interface SeatStageReceiptOnboarding {
|
|
14
|
+
files: Array<{
|
|
15
|
+
destKey: SeatOnboardingDestKey;
|
|
16
|
+
format: SeatOnboardingFormat;
|
|
17
|
+
sha256: string;
|
|
18
|
+
byteLength: number;
|
|
19
|
+
}>;
|
|
20
|
+
nativeCliVersion: string;
|
|
21
|
+
capturedAt: string;
|
|
22
|
+
lineage: SeatLineageTuple;
|
|
23
|
+
reboundFrom?: SeatLineageTuple;
|
|
24
|
+
}
|
|
25
|
+
export interface SeatStageReceiptEntry {
|
|
26
|
+
seatRef: string;
|
|
27
|
+
cli: SeatCli;
|
|
28
|
+
authFiles: string[];
|
|
29
|
+
seatRecordSha256: string;
|
|
30
|
+
onboardingStatus: SeatOnboardingStatus;
|
|
31
|
+
launchGate: SeatLaunchGate;
|
|
32
|
+
onboarding: SeatStageReceiptOnboarding | null;
|
|
33
|
+
}
|
|
34
|
+
export interface SeatStageReceipt {
|
|
35
|
+
seats: SeatStageReceiptEntry[];
|
|
36
|
+
}
|
|
37
|
+
export type SeatStageResult = {
|
|
38
|
+
ok: true;
|
|
39
|
+
receipt: SeatStageReceipt;
|
|
40
|
+
} | {
|
|
41
|
+
ok: false;
|
|
42
|
+
code: StageCode;
|
|
43
|
+
detail: string;
|
|
44
|
+
};
|
|
45
|
+
export interface SeatCellConfigDirs {
|
|
46
|
+
claudeConfigDir: string;
|
|
47
|
+
codexHome: string;
|
|
48
|
+
xdgConfigHome: string;
|
|
49
|
+
}
|
|
50
|
+
export interface SeatCodexMcpServer {
|
|
51
|
+
name: string;
|
|
52
|
+
command: string;
|
|
53
|
+
args: readonly string[];
|
|
54
|
+
defaultToolsApprovalMode?: 'approve';
|
|
55
|
+
}
|
|
56
|
+
export interface SeatCellInput {
|
|
57
|
+
seatDir: string;
|
|
58
|
+
cellHome: string;
|
|
59
|
+
workspaceDir: string;
|
|
60
|
+
configDirs: SeatCellConfigDirs;
|
|
61
|
+
expectedNativeCliVersion: string;
|
|
62
|
+
ownerScope: string;
|
|
63
|
+
claudeMcpConfig?: Record<string, unknown>;
|
|
64
|
+
codexMcpServers?: readonly SeatCodexMcpServer[];
|
|
65
|
+
}
|
|
66
|
+
export type SeatCellFileClass = 'auth' | 'onboarding' | 'synthesized' | 'composed';
|
|
67
|
+
export interface SeatCellReceiptFile {
|
|
68
|
+
cellRelPath: string;
|
|
69
|
+
class: SeatCellFileClass;
|
|
70
|
+
sha256: string;
|
|
71
|
+
byteLength: number;
|
|
72
|
+
}
|
|
73
|
+
export interface SeatCellReceipt {
|
|
74
|
+
files: SeatCellReceiptFile[];
|
|
75
|
+
}
|
|
76
|
+
export type SeatCellResult = {
|
|
77
|
+
ok: true;
|
|
78
|
+
receipt: SeatCellReceipt;
|
|
79
|
+
} | {
|
|
80
|
+
ok: false;
|
|
81
|
+
code: StageCode;
|
|
82
|
+
detail: string;
|
|
83
|
+
};
|
|
84
|
+
export type SeatEraseResult = {
|
|
85
|
+
ok: true;
|
|
86
|
+
survivingPaths: string[];
|
|
87
|
+
} | {
|
|
88
|
+
ok: false;
|
|
89
|
+
code: StageCode;
|
|
90
|
+
detail: string;
|
|
91
|
+
};
|
|
92
|
+
/** One planned exclusive write, staged before any byte is written. */
|
|
93
|
+
export interface PlannedWrite {
|
|
94
|
+
path: string;
|
|
95
|
+
bytes: Uint8Array;
|
|
96
|
+
cls: SeatCellFileClass;
|
|
97
|
+
}
|
|
98
|
+
/** Re-validated stage-1 seat record (stage 2 reads it, never trusts it). */
|
|
99
|
+
export interface SeatRecordView {
|
|
100
|
+
bundle: SeatBundleV1;
|
|
101
|
+
onboarding: SeatOnboardingV1 | null;
|
|
102
|
+
onboardingStatus: SeatOnboardingStatus;
|
|
103
|
+
launchGate: SeatLaunchGate;
|
|
104
|
+
authFiles: string[];
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=seat-onboarding-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-onboarding-types.d.ts","sourceRoot":"","sources":["../../src/node/seat-onboarding-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-onboarding-types.js","sourceRoot":"","sources":["../../src/node/seat-onboarding-types.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,0EAA0E;AAC1E,yEAAyE;AACzE,sCAAsC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SeatValidationCode } from '../enrollment/seat-bundle.js';
|
|
2
|
+
import { type SeatOnboardingCode } from '../enrollment/seat-onboarding.js';
|
|
3
|
+
export declare const SEAT_RECORD_REL_PATH: string;
|
|
4
|
+
export declare const DIR_MODE = 448;
|
|
5
|
+
export type StageCode = SeatOnboardingCode | SeatValidationCode;
|
|
6
|
+
export declare function fail(code: StageCode, detail: string): never;
|
|
7
|
+
export declare const asResult: (error: unknown) => {
|
|
8
|
+
ok: false;
|
|
9
|
+
code: StageCode;
|
|
10
|
+
detail: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const isRecord: (value: unknown) => value is Record<string, unknown>;
|
|
13
|
+
export declare const utf8: (text: string) => Uint8Array;
|
|
14
|
+
export declare const sha256Hex: (bytes: Uint8Array) => string;
|
|
15
|
+
export declare const decodeBase64: (value: string) => Uint8Array;
|
|
16
|
+
export declare const withinRoot: (root: string, path: string) => boolean;
|
|
17
|
+
/** Walk every existing ancestor of `path` and refuse any symlink in the chain. */
|
|
18
|
+
export declare function assertCleanAncestors(path: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Single-writer exclusive write: the resolved path must stay inside one of
|
|
21
|
+
* `roots`, no component of the chain may be a symlink, the target must not
|
|
22
|
+
* pre-exist, parents are created 0700 and the file 0600 with `wx`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function writeExclusive(roots: readonly string[], absPath: string, bytes: Uint8Array): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=seat-stage-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-stage-write.d.ts","sourceRoot":"","sources":["../../src/node/seat-stage-write.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEhG,eAAO,MAAM,oBAAoB,QAAiD,CAAC;AAEnF,eAAO,MAAM,QAAQ,MAAQ,CAAC;AAG9B,MAAM,MAAM,SAAS,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAWhE,wBAAgB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAE3D;AAED,eAAO,MAAM,QAAQ,UAAW,OAAO,KAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAIrF,CAAC;AAEF,eAAO,MAAM,QAAQ,UAAW,OAAO,qCAC+B,CAAC;AAEvE,eAAO,MAAM,IAAI,SAAU,MAAM,KAAG,UAA4C,CAAC;AAEjF,eAAO,MAAM,SAAS,UAAW,UAAU,KAAG,MAA0D,CAAC;AAEzG,eAAO,MAAM,YAAY,UAAW,MAAM,KAAG,UAA0D,CAAC;AAExG,eAAO,MAAM,UAAU,SAAU,MAAM,QAAQ,MAAM,KAAG,OAGvD,CAAC;AAEF,kFAAkF;AAClF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBhH"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Shared fail-closed write primitives for the seat materialization stages.
|
|
3
|
+
// Internal module: not exported from the package entry points.
|
|
4
|
+
import { chmod, lstat, mkdir, writeFile } from 'node:fs/promises';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
7
|
+
import { SeatOnboardingError } from '../enrollment/seat-onboarding.js';
|
|
8
|
+
export const SEAT_RECORD_REL_PATH = join('.sentropic-seat', 'seat-record.v1.json');
|
|
9
|
+
export const DIR_MODE = 0o700;
|
|
10
|
+
const FILE_MODE = 0o600;
|
|
11
|
+
class StageRefusal extends Error {
|
|
12
|
+
code;
|
|
13
|
+
constructor(code, detail) {
|
|
14
|
+
super(detail);
|
|
15
|
+
this.name = 'StageRefusal';
|
|
16
|
+
this.code = code;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function fail(code, detail) {
|
|
20
|
+
throw new StageRefusal(code, detail);
|
|
21
|
+
}
|
|
22
|
+
export const asResult = (error) => {
|
|
23
|
+
if (error instanceof StageRefusal)
|
|
24
|
+
return { ok: false, code: error.code, detail: error.message };
|
|
25
|
+
if (error instanceof SeatOnboardingError)
|
|
26
|
+
return { ok: false, code: error.code, detail: error.message };
|
|
27
|
+
throw error;
|
|
28
|
+
};
|
|
29
|
+
export const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
30
|
+
export const utf8 = (text) => new TextEncoder().encode(text);
|
|
31
|
+
export const sha256Hex = (bytes) => createHash('sha256').update(bytes).digest('hex');
|
|
32
|
+
export const decodeBase64 = (value) => new Uint8Array(Buffer.from(value, 'base64'));
|
|
33
|
+
export const withinRoot = (root, path) => {
|
|
34
|
+
const rel = relative(resolve(root), resolve(path));
|
|
35
|
+
return rel === '' || (rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));
|
|
36
|
+
};
|
|
37
|
+
/** Walk every existing ancestor of `path` and refuse any symlink in the chain. */
|
|
38
|
+
export async function assertCleanAncestors(path) {
|
|
39
|
+
let current = resolve(path);
|
|
40
|
+
for (;;) {
|
|
41
|
+
let st;
|
|
42
|
+
try {
|
|
43
|
+
st = await lstat(current);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
const parent = dirname(current);
|
|
47
|
+
if (parent === current)
|
|
48
|
+
return;
|
|
49
|
+
current = parent;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (st.isSymbolicLink())
|
|
53
|
+
fail('onboarding-shape-unverified', `symlinked ancestor: ${current}`);
|
|
54
|
+
const parent = dirname(current);
|
|
55
|
+
if (parent === current)
|
|
56
|
+
return;
|
|
57
|
+
current = parent;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Single-writer exclusive write: the resolved path must stay inside one of
|
|
62
|
+
* `roots`, no component of the chain may be a symlink, the target must not
|
|
63
|
+
* pre-exist, parents are created 0700 and the file 0600 with `wx`.
|
|
64
|
+
*/
|
|
65
|
+
export async function writeExclusive(roots, absPath, bytes) {
|
|
66
|
+
const resolved = resolve(absPath);
|
|
67
|
+
const root = roots.find((r) => withinRoot(r, resolved));
|
|
68
|
+
if (!root)
|
|
69
|
+
fail('onboarding-shape-unverified', `path escapes the stage root: ${absPath}`);
|
|
70
|
+
const rel = relative(resolve(root), resolved);
|
|
71
|
+
const parts = rel.split(sep);
|
|
72
|
+
let current = resolve(root);
|
|
73
|
+
for (let i = 0; i < parts.length; i += 1) {
|
|
74
|
+
current = join(current, parts[i]);
|
|
75
|
+
let st;
|
|
76
|
+
try {
|
|
77
|
+
st = await lstat(current);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
break; // this component and everything below it do not exist yet
|
|
81
|
+
}
|
|
82
|
+
if (st.isSymbolicLink())
|
|
83
|
+
fail('onboarding-shape-unverified', `symlink in path: ${current}`);
|
|
84
|
+
if (i === parts.length - 1)
|
|
85
|
+
fail('onboarding-shape-unverified', `pre-existing target: ${current}`);
|
|
86
|
+
if (!st.isDirectory())
|
|
87
|
+
fail('onboarding-shape-unverified', `non-directory in path: ${current}`);
|
|
88
|
+
}
|
|
89
|
+
await mkdir(dirname(resolved), { recursive: true, mode: DIR_MODE });
|
|
90
|
+
await writeFile(resolved, bytes, { flag: 'wx', mode: FILE_MODE });
|
|
91
|
+
await chmod(resolved, FILE_MODE);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=seat-stage-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-stage-write.js","sourceRoot":"","sources":["../../src/node/seat-stage-write.ts"],"names":[],"mappings":"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"}
|
package/dist/service/facade.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { AccountTransportAcquireInput, AccountTransportAcquisition } from '../account-transports.js';
|
|
2
2
|
import type { AccountTransportProviderId } from '../auth.js';
|
|
3
3
|
import type { AccountPublic, EnrollmentCompletion, EnrollmentSession, StartEnrollmentInput } from '../enrollment/contracts.js';
|
|
4
|
+
import type { SeatBundleV1 } from '../enrollment/seat-bundle.js';
|
|
5
|
+
import type { SeatOnboardingV1 } from '../enrollment/seat-onboarding.js';
|
|
4
6
|
import type { LlmMesh } from '../mesh.js';
|
|
5
7
|
import { type InMemoryRoutePlannerOptions } from '../route-planner.js';
|
|
6
8
|
import type { RoutePlanner } from '../routing-contracts.js';
|
|
@@ -88,12 +90,20 @@ export interface LlmMeshFacade {
|
|
|
88
90
|
importSeatBundle(input: {
|
|
89
91
|
bundle: unknown;
|
|
90
92
|
ownerScope: string;
|
|
93
|
+
onboarding?: unknown;
|
|
91
94
|
}): Promise<{
|
|
92
95
|
accountId: string;
|
|
93
96
|
seatRef: string;
|
|
94
97
|
generation: number;
|
|
95
98
|
idempotent: boolean;
|
|
96
99
|
}>;
|
|
100
|
+
exportSeatBundle(input: {
|
|
101
|
+
accountId: string;
|
|
102
|
+
ownerScope: string;
|
|
103
|
+
}): Promise<{
|
|
104
|
+
bundle: SeatBundleV1;
|
|
105
|
+
onboarding: SeatOnboardingV1 | null;
|
|
106
|
+
}>;
|
|
97
107
|
cancel(enrollmentId: string): Promise<void>;
|
|
98
108
|
acquire(input: AccountTransportAcquireInput): Promise<AccountTransportAcquisition>;
|
|
99
109
|
release(acquisition: AccountTransportAcquisition): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../src/service/facade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EAEpB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../src/service/facade.ts"],"names":[],"mappings":"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"}
|
package/dist/service/facade.js
CHANGED
|
@@ -58,6 +58,9 @@ export function createLlmMeshFacade(options) {
|
|
|
58
58
|
async importSeatBundle(input) {
|
|
59
59
|
return service.importSeatBundle(input);
|
|
60
60
|
},
|
|
61
|
+
async exportSeatBundle(input) {
|
|
62
|
+
return service.exportSeatBundle(input);
|
|
63
|
+
},
|
|
61
64
|
async cancel(enrollmentId) {
|
|
62
65
|
return service.cancel(enrollmentId);
|
|
63
66
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/service/facade.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/service/facade.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAEpF,OAAO,EACL,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAgJ7B,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,OAAO,GACX,OAAO,CAAC,OAAO;QACf,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,IAAI,GAAG,CAA6B;QACpD;YACE,YAAY;YACZ,IAAI,2BAA2B,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;SAC5E;QACD,CAAC,OAAO,EAAE,IAAI,uBAAuB,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAClF,CAAC,aAAa,EAAE,IAAI,4BAA4B,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7F,CAAC,MAAM,EAAE,IAAI,sBAAsB,EAAE,CAAC;QACtC,CAAC,WAAW,EAAE,IAAI,0BAA0B,EAAE,CAAC;QAC/C,CAAC,cAAc,EAAE,IAAI,6BAA6B,EAAE,CAAC;KACtD,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,4BAA4B,CAC9C,OAAO,EACP,SAAS,EACT,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,0BAA0B,CACnC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,wBAAwB,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa;YAC9D,OAAO,OAAO,CAAC,wBAAwB,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,CAAC,8BAA8B,CAAC,cAAc,EAAE,aAAa;YAChE,OAAO,OAAO,CAAC,8BAA8B,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAC/E,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK;YAC5B,OAAO,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,YAAY;YAChC,OAAO,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,YAAY;YAClC,OAAO,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,kBAAkB,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa;YACxD,OAAO,OAAO,CAAC,kBAAkB,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,CAAC,wBAAwB,CAAC,MAAM,EAAE,aAAa;YAClD,OAAO,OAAO,CAAC,wBAAwB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,wBAAwB,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW;YACrE,OAAO,OAAO,CAAC,wBAAwB,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QACpF,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,KAAK;YAC1B,OAAO,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,KAAK;YAC1B,OAAO,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,YAAY;YACvB,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACtC,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,KAAK;YACtB,OAAO,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK;YAClC,OAAO,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK;YACjB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,WAAW;YACvB,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC;QACD,UAAU,CAAC,UAAU;YACnB,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;gBAChC,OAAO,IAAI,wBAAwB,EAAE,CAAC;YACxC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,eAAe,UAAU,wBAAwB,CAAC,CAAC;QACrE,CAAC;QACD,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,EAAE;YAC3C,OAAO,IAAI,oBAAoB,CAAC;gBAC9B,GAAG,YAAY;gBACf,SAAS,EAAE,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC;aACjD,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -2,7 +2,26 @@ import { type AccountTransportAccount, type AccountTransportAcquireInput, type A
|
|
|
2
2
|
import type { AccountPublic, EnrollmentCompletion, EnrollmentProvider, EnrollmentSession, StartEnrollmentInput } from '../enrollment/contracts.js';
|
|
3
3
|
import type { ConfigResolver, KeyringAdapter } from './facade.js';
|
|
4
4
|
import type { LlmMesh } from '../mesh.js';
|
|
5
|
+
import { type SeatBundleV1 } from '../enrollment/seat-bundle.js';
|
|
6
|
+
import { type SeatOnboardingV1 } from '../enrollment/seat-onboarding.js';
|
|
5
7
|
import type { AccountDirectoryPort } from '../routing-contracts.js';
|
|
8
|
+
export type SeatExportUnavailableReason = 'not-a-seat' | 'record-missing' | 'lineage-mismatch' | 'owner-mismatch' | 'record-invalid';
|
|
9
|
+
/** Typed refusal for exportSeatBundle; the code is `seat-export-unavailable:<reason>`. */
|
|
10
|
+
export declare class SeatExportUnavailableError extends Error {
|
|
11
|
+
readonly code: string;
|
|
12
|
+
constructor(reason: SeatExportUnavailableReason, detail: string);
|
|
13
|
+
}
|
|
14
|
+
/** Versioned seat record persisted beside the envelope/public pair (design §6 item 1). */
|
|
15
|
+
export interface StoredSeatRecord {
|
|
16
|
+
version: 1;
|
|
17
|
+
bundle: SeatBundleV1;
|
|
18
|
+
onboarding: SeatOnboardingV1 | null;
|
|
19
|
+
storedAt: string;
|
|
20
|
+
}
|
|
21
|
+
export interface SeatExport {
|
|
22
|
+
bundle: SeatBundleV1;
|
|
23
|
+
onboarding: SeatOnboardingV1 | null;
|
|
24
|
+
}
|
|
6
25
|
export declare class LocalAccountTransportService {
|
|
7
26
|
private readonly keyring;
|
|
8
27
|
private readonly providers;
|
|
@@ -43,12 +62,32 @@ export declare class LocalAccountTransportService {
|
|
|
43
62
|
importSeatBundle(input: {
|
|
44
63
|
bundle: unknown;
|
|
45
64
|
ownerScope: string;
|
|
65
|
+
onboarding?: unknown;
|
|
46
66
|
}): Promise<{
|
|
47
67
|
accountId: string;
|
|
48
68
|
seatRef: string;
|
|
49
69
|
generation: number;
|
|
50
70
|
idempotent: boolean;
|
|
51
71
|
}>;
|
|
72
|
+
/**
|
|
73
|
+
* L5 facade export beside importSeatBundle. Trusted in-process use only.
|
|
74
|
+
* Refuses with a typed `seat-export-unavailable:<reason>` unless the
|
|
75
|
+
* account carries the external seat marker and a seat record whose
|
|
76
|
+
* lineage equals the current marker tuple. On success the stored bundle
|
|
77
|
+
* and block are re-validated (consumer authority, refresh-material scan,
|
|
78
|
+
* block binding) and returned verbatim from the record — no synthesized
|
|
79
|
+
* field, no refresh material, no native files, ever.
|
|
80
|
+
*/
|
|
81
|
+
exportSeatBundle(input: {
|
|
82
|
+
accountId: string;
|
|
83
|
+
ownerScope: string;
|
|
84
|
+
}): Promise<SeatExport>;
|
|
85
|
+
/** §3.4 binding of an onboarding block against its bundle; null when bound. */
|
|
86
|
+
private onboardingBindingError;
|
|
87
|
+
private seatRecordKey;
|
|
88
|
+
private writeSeatRecord;
|
|
89
|
+
private readSeatRecord;
|
|
90
|
+
private backfillSeatRecordIfMissing;
|
|
52
91
|
private hasClaudeGrant;
|
|
53
92
|
private persistClaudeCompletion;
|
|
54
93
|
cancel(enrollmentId: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-account-transport-service.d.ts","sourceRoot":"","sources":["../../src/service/local-account-transport-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,aAAa,EAGb,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EAGjB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"local-account-transport-service.d.ts","sourceRoot":"","sources":["../../src/service/local-account-transport-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,16 @@ import { ClaudeRefreshPreparationError } from '../enrollment/claude-code.js';
|
|
|
4
4
|
import { listModelProfilesByProvider } from '../catalog.js';
|
|
5
5
|
import { isDeviceFlowSeatAccount, isExternalSeatAccount, isExternalSeatUnavailable, markExternalSeatAuthority, readExternalSeatAuthority, throwExternalSeatUnavailable, } from './external-seat-authority.js';
|
|
6
6
|
import { classifyTransition, validateSeatBundle, } from '../enrollment/seat-bundle.js';
|
|
7
|
+
import { validateSeatOnboarding, } from '../enrollment/seat-onboarding.js';
|
|
8
|
+
/** Typed refusal for exportSeatBundle; the code is `seat-export-unavailable:<reason>`. */
|
|
9
|
+
export class SeatExportUnavailableError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
constructor(reason, detail) {
|
|
12
|
+
super(`seat-export-unavailable:${reason}; ${detail}`);
|
|
13
|
+
this.name = 'SeatExportUnavailableError';
|
|
14
|
+
this.code = `seat-export-unavailable:${reason}`;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
7
17
|
// Cloud Code does not currently return a per-account model inventory during
|
|
8
18
|
// enrollment. Advertise only the model proven executable by the live transport
|
|
9
19
|
// contract; explicit account.modelIds may override this after provider evidence.
|
|
@@ -394,6 +404,21 @@ export class LocalAccountTransportService {
|
|
|
394
404
|
if (!bundle.lifecycle.providerExpiry) {
|
|
395
405
|
throw new Error('Seat bundle requires providerExpiry; unknown expiry is not infinite validity');
|
|
396
406
|
}
|
|
407
|
+
// L5: an optional onboarding block is validated and bound against the
|
|
408
|
+
// bundle before any registration; a refusal rejects the whole import
|
|
409
|
+
// with no account persisted.
|
|
410
|
+
let onboarding = null;
|
|
411
|
+
if (input.onboarding !== undefined) {
|
|
412
|
+
const blockResult = validateSeatOnboarding(input.onboarding);
|
|
413
|
+
if (!blockResult.ok) {
|
|
414
|
+
throw new Error(`Seat onboarding refused: ${blockResult.code}; ${blockResult.detail}`);
|
|
415
|
+
}
|
|
416
|
+
const bindingError = this.onboardingBindingError(blockResult.block, bundle);
|
|
417
|
+
if (bindingError) {
|
|
418
|
+
throw new Error(`Seat onboarding refused: onboarding-lineage-mismatch; ${bindingError}`);
|
|
419
|
+
}
|
|
420
|
+
onboarding = blockResult.block;
|
|
421
|
+
}
|
|
397
422
|
const pair = {
|
|
398
423
|
agy: ['gemini', 'cloud-code'],
|
|
399
424
|
codex: ['openai', 'codex'],
|
|
@@ -422,6 +447,9 @@ export class LocalAccountTransportService {
|
|
|
422
447
|
}
|
|
423
448
|
const transition = classifyTransition({ epoch: heldAuthority.epoch, generation: heldAuthority.generation, operationId: heldAuthority.operationId }, incoming);
|
|
424
449
|
if (transition === 'idempotent') {
|
|
450
|
+
// L5: an idempotent reimport of the same tuple backfills a missing
|
|
451
|
+
// seat record (pre-L5 imports gain export by re-presenting the bundle).
|
|
452
|
+
await this.backfillSeatRecordIfMissing(accountId, bundle, onboarding);
|
|
425
453
|
return { accountId, seatRef, generation: incoming.generation, idempotent: true };
|
|
426
454
|
}
|
|
427
455
|
// A forward transition falls through to registration below, which
|
|
@@ -466,8 +494,135 @@ export class LocalAccountTransportService {
|
|
|
466
494
|
expiresAt: bundle.lifecycle.providerExpiry ?? '',
|
|
467
495
|
authClientConfigVersion: bundle.identity.credentialFormatVersion,
|
|
468
496
|
}, account);
|
|
497
|
+
// L5: persist the versioned seat record with the validated values
|
|
498
|
+
// verbatim; a forward transition overwrites the N values with N+1.
|
|
499
|
+
await this.writeSeatRecord(accountId, bundle, onboarding);
|
|
469
500
|
return { accountId, seatRef, generation: incoming.generation, idempotent: false };
|
|
470
501
|
}
|
|
502
|
+
/**
|
|
503
|
+
* L5 facade export beside importSeatBundle. Trusted in-process use only.
|
|
504
|
+
* Refuses with a typed `seat-export-unavailable:<reason>` unless the
|
|
505
|
+
* account carries the external seat marker and a seat record whose
|
|
506
|
+
* lineage equals the current marker tuple. On success the stored bundle
|
|
507
|
+
* and block are re-validated (consumer authority, refresh-material scan,
|
|
508
|
+
* block binding) and returned verbatim from the record — no synthesized
|
|
509
|
+
* field, no refresh material, no native files, ever.
|
|
510
|
+
*/
|
|
511
|
+
async exportSeatBundle(input) {
|
|
512
|
+
const owner = this.requireOwnerScope(input.ownerScope);
|
|
513
|
+
await this.restorePersistedAccounts();
|
|
514
|
+
const held = this.accountsMap.get(input.accountId);
|
|
515
|
+
const marker = held
|
|
516
|
+
? readExternalSeatAuthority(held.metadata)
|
|
517
|
+
: null;
|
|
518
|
+
if (!held || !marker || marker.seatRef === 'unknown') {
|
|
519
|
+
throw new SeatExportUnavailableError('not-a-seat', `account '${input.accountId}' carries no external seat marker`);
|
|
520
|
+
}
|
|
521
|
+
if (marker.ownerScope !== owner) {
|
|
522
|
+
throw new SeatExportUnavailableError('owner-mismatch', 'the held seat is owned by another owner scope');
|
|
523
|
+
}
|
|
524
|
+
const record = await this.readSeatRecord(input.accountId);
|
|
525
|
+
if (!record) {
|
|
526
|
+
throw new SeatExportUnavailableError('record-missing', 'no stored seat record; re-present the same bundle to backfill');
|
|
527
|
+
}
|
|
528
|
+
const revalidated = validateSeatBundle(record.bundle, { ownerScope: owner, trustedAuthority: 'consumer' });
|
|
529
|
+
if (!revalidated.ok) {
|
|
530
|
+
throw new SeatExportUnavailableError('record-invalid', `stored bundle refused: ${revalidated.code}; ${revalidated.detail}`);
|
|
531
|
+
}
|
|
532
|
+
const stored = revalidated.bundle;
|
|
533
|
+
if (stored.credentialClass !== 'access-only' && stored.credentialClass !== 'static-key') {
|
|
534
|
+
throw new SeatExportUnavailableError('record-invalid', 'stored bundle must be access-only or static-key');
|
|
535
|
+
}
|
|
536
|
+
if (stored.lifecycle.refreshAuthority !== 'none') {
|
|
537
|
+
throw new SeatExportUnavailableError('record-invalid', 'stored bundle must not carry refresh authority');
|
|
538
|
+
}
|
|
539
|
+
if ((stored.meshUse.kind !== 'access' && stored.meshUse.kind !== 'static-key') || !stored.meshUse.accessRef) {
|
|
540
|
+
throw new SeatExportUnavailableError('record-invalid', 'stored bundle carries no usable access reference');
|
|
541
|
+
}
|
|
542
|
+
if (!stored.lifecycle.providerExpiry) {
|
|
543
|
+
throw new SeatExportUnavailableError('record-invalid', 'stored bundle requires providerExpiry');
|
|
544
|
+
}
|
|
545
|
+
const lineageMatches = stored.identity.seatRef === marker.seatRef
|
|
546
|
+
&& stored.lifecycle.epoch === marker.epoch
|
|
547
|
+
&& stored.lifecycle.generation === marker.generation
|
|
548
|
+
&& stored.lifecycle.operationId === marker.operationId;
|
|
549
|
+
if (!lineageMatches) {
|
|
550
|
+
throw new SeatExportUnavailableError('lineage-mismatch', 'stored record lineage does not equal the held marker tuple');
|
|
551
|
+
}
|
|
552
|
+
if (record.onboarding !== null) {
|
|
553
|
+
const blockResult = validateSeatOnboarding(record.onboarding);
|
|
554
|
+
if (!blockResult.ok) {
|
|
555
|
+
throw new SeatExportUnavailableError('record-invalid', `stored block refused: ${blockResult.code}; ${blockResult.detail}`);
|
|
556
|
+
}
|
|
557
|
+
const bindingError = this.onboardingBindingError(blockResult.block, stored);
|
|
558
|
+
if (bindingError) {
|
|
559
|
+
throw new SeatExportUnavailableError('record-invalid', `stored block misbound: ${bindingError}`);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
return { bundle: record.bundle, onboarding: record.onboarding };
|
|
563
|
+
}
|
|
564
|
+
/** §3.4 binding of an onboarding block against its bundle; null when bound. */
|
|
565
|
+
onboardingBindingError(block, bundle) {
|
|
566
|
+
if (block.cli !== bundle.identity.cli)
|
|
567
|
+
return 'block cli does not match the bundle';
|
|
568
|
+
if (block.seatRef !== bundle.identity.seatRef)
|
|
569
|
+
return 'block seatRef does not match the bundle';
|
|
570
|
+
if (block.accountBinding !== bundle.provenance.accountBinding) {
|
|
571
|
+
return 'block accountBinding does not match the bundle';
|
|
572
|
+
}
|
|
573
|
+
if (block.consent.ownerScope !== bundle.identity.ownerScope) {
|
|
574
|
+
return 'block consent ownerScope does not match the bundle';
|
|
575
|
+
}
|
|
576
|
+
const lifecycle = bundle.lifecycle;
|
|
577
|
+
if (block.lineage.epoch !== lifecycle.epoch
|
|
578
|
+
|| block.lineage.generation !== lifecycle.generation
|
|
579
|
+
|| block.lineage.operationId !== lifecycle.operationId) {
|
|
580
|
+
return 'block lineage does not match the bundle lifecycle';
|
|
581
|
+
}
|
|
582
|
+
if (block.nativeCliVersion !== bundle.identity.nativeCliVersion) {
|
|
583
|
+
return 'bundle nativeCliVersion must equal the block version';
|
|
584
|
+
}
|
|
585
|
+
return null;
|
|
586
|
+
}
|
|
587
|
+
seatRecordKey(accountId) {
|
|
588
|
+
return `sentropic-llm-mesh:${accountId}:seat-record`;
|
|
589
|
+
}
|
|
590
|
+
async writeSeatRecord(accountId, bundle, onboarding) {
|
|
591
|
+
const record = {
|
|
592
|
+
version: 1,
|
|
593
|
+
bundle,
|
|
594
|
+
onboarding,
|
|
595
|
+
storedAt: new Date().toISOString(),
|
|
596
|
+
};
|
|
597
|
+
await this.keyring.setSecret(this.seatRecordKey(accountId), JSON.stringify(record));
|
|
598
|
+
}
|
|
599
|
+
async readSeatRecord(accountId) {
|
|
600
|
+
const raw = await this.keyring.getSecret(this.seatRecordKey(accountId));
|
|
601
|
+
if (!raw)
|
|
602
|
+
return null;
|
|
603
|
+
try {
|
|
604
|
+
const record = JSON.parse(raw);
|
|
605
|
+
if (record.version !== 1 || !record.bundle || typeof record.storedAt !== 'string')
|
|
606
|
+
return null;
|
|
607
|
+
if (record.onboarding !== null && record.onboarding !== undefined && typeof record.onboarding !== 'object') {
|
|
608
|
+
return null;
|
|
609
|
+
}
|
|
610
|
+
return {
|
|
611
|
+
version: 1,
|
|
612
|
+
bundle: record.bundle,
|
|
613
|
+
onboarding: record.onboarding ?? null,
|
|
614
|
+
storedAt: record.storedAt,
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
catch {
|
|
618
|
+
return null;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
async backfillSeatRecordIfMissing(accountId, bundle, onboarding) {
|
|
622
|
+
if (await this.readSeatRecord(accountId))
|
|
623
|
+
return;
|
|
624
|
+
await this.writeSeatRecord(accountId, bundle, onboarding);
|
|
625
|
+
}
|
|
471
626
|
async hasClaudeGrant(credential, ownerScopeRef) {
|
|
472
627
|
const index = await this.keyring.getSecret(LocalAccountTransportService.accountIndexKey);
|
|
473
628
|
for (const accountId of this.parseAccountIndex(index)) {
|
|
@@ -535,6 +690,7 @@ export class LocalAccountTransportService {
|
|
|
535
690
|
accountId: id, ownerScopeRef, removedAt: this.nextRemovalTimestamp() })).catch(() => { });
|
|
536
691
|
await this.keyring.deleteSecret(`sentropic-llm-mesh:${id}:public`).catch(() => { });
|
|
537
692
|
await this.keyring.deleteSecret(`sentropic-llm-mesh:${id}:envelope`).catch(() => { });
|
|
693
|
+
await this.keyring.deleteSecret(this.seatRecordKey(id)).catch(() => { });
|
|
538
694
|
this.coordinator.removeAccount(id);
|
|
539
695
|
this.accountsMap.delete(id);
|
|
540
696
|
this.credentialVersions.delete(id);
|
|
@@ -613,6 +769,7 @@ export class LocalAccountTransportService {
|
|
|
613
769
|
this.accountRemovalBarrierRefs.delete(accountId);
|
|
614
770
|
await this.keyring.deleteSecret(`sentropic-llm-mesh:${accountId}:envelope`);
|
|
615
771
|
await this.keyring.deleteSecret(`sentropic-llm-mesh:${accountId}:public`);
|
|
772
|
+
await this.keyring.deleteSecret(this.seatRecordKey(accountId));
|
|
616
773
|
return { accountId, removed: true };
|
|
617
774
|
}
|
|
618
775
|
// ── Account Registration for Coordinator ──────────────────────────────
|
|
@@ -1161,6 +1318,7 @@ export class LocalAccountTransportService {
|
|
|
1161
1318
|
if (!current || current.removalBarrierRef === attemptedBarrierRef) {
|
|
1162
1319
|
await this.keyring.deleteSecret(`sentropic-llm-mesh:${accountId}:envelope`);
|
|
1163
1320
|
await this.keyring.deleteSecret(`sentropic-llm-mesh:${accountId}:public`);
|
|
1321
|
+
await this.keyring.deleteSecret(this.seatRecordKey(accountId));
|
|
1164
1322
|
}
|
|
1165
1323
|
}
|
|
1166
1324
|
async readPublicRecord(accountId) {
|