@sentropic/llm-mesh 0.32.2 → 0.32.3
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/account-transports.d.ts +4 -2
- package/dist/account-transports.d.ts.map +1 -1
- package/dist/account-transports.js +10 -0
- package/dist/account-transports.js.map +1 -1
- package/dist/enrollment/agy-cli-import.d.ts +32 -0
- package/dist/enrollment/agy-cli-import.d.ts.map +1 -0
- package/dist/enrollment/agy-cli-import.js +61 -0
- package/dist/enrollment/agy-cli-import.js.map +1 -0
- package/dist/enrollment/cli-seat-import.d.ts +39 -0
- package/dist/enrollment/cli-seat-import.d.ts.map +1 -0
- package/dist/enrollment/cli-seat-import.js +111 -0
- package/dist/enrollment/cli-seat-import.js.map +1 -0
- package/dist/enrollment/index.d.ts +4 -0
- package/dist/enrollment/index.d.ts.map +1 -1
- package/dist/enrollment/index.js +2 -1
- package/dist/enrollment/index.js.map +1 -1
- package/dist/external-seat-marker.d.ts +21 -0
- package/dist/external-seat-marker.d.ts.map +1 -0
- package/dist/external-seat-marker.js +39 -0
- package/dist/external-seat-marker.js.map +1 -0
- package/dist/node/cli-seat-store-reader.d.ts +29 -0
- package/dist/node/cli-seat-store-reader.d.ts.map +1 -0
- package/dist/node/cli-seat-store-reader.js +75 -0
- package/dist/node/cli-seat-store-reader.js.map +1 -0
- package/dist/node/index.d.ts +6 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +3 -0
- package/dist/node/index.js.map +1 -1
- package/dist/node/seat-sidecar-file-backend.d.ts +24 -0
- package/dist/node/seat-sidecar-file-backend.d.ts.map +1 -0
- package/dist/node/seat-sidecar-file-backend.js +79 -0
- package/dist/node/seat-sidecar-file-backend.js.map +1 -0
- package/dist/service/external-seat-authority.d.ts +16 -0
- package/dist/service/external-seat-authority.d.ts.map +1 -0
- package/dist/service/external-seat-authority.js +45 -0
- package/dist/service/external-seat-authority.js.map +1 -0
- package/dist/service/facade.d.ts +9 -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 +18 -0
- package/dist/service/local-account-transport-service.d.ts.map +1 -1
- package/dist/service/local-account-transport-service.js +130 -2
- package/dist/service/local-account-transport-service.js.map +1 -1
- package/package.json +1 -1
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,EACrB,OAAO,EACP,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,EACrB,OAAO,EACP,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACxF,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClH,YAAY,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC"}
|
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export { SEAT_AGY_APPLICATION_TUPLE, SEAT_BUNDLE_MAX_BYTES, SEAT_BUNDLE_SCHEMA_VERSION, SEAT_PACKAGE_PROVIDER_ID, classifyTransition, createReceipt, isIdempotentReimport, isStaleGeneration, resolveEffectiveAuthority, validateSeatBundle, } from '../enrollment/seat-bundle.js';
|
|
2
|
+
export { inspectSeatStoreRecord, SeatStoreReadError } from './cli-seat-store-reader.js';
|
|
3
|
+
export { SEAT_SIDECAR_MAX_BYTES, SeatSidecarFileBackend, parseSeatSidecar } from './seat-sidecar-file-backend.js';
|
|
4
|
+
export { SEAT_EXTERNAL_AUTHORITY_KEY, isDeviceFlowSeatAccount, isExternalSeatAccount, isExternalSeatUnavailable, markExternalSeatAuthority, readExternalSeatAuthority, } from '../service/external-seat-authority.js';
|
|
2
5
|
export { EncryptedFileKeyring } from './keyring/encrypted-file-keyring.js';
|
|
3
6
|
export { EnvKeyring } from './keyring/env-keyring.js';
|
|
4
7
|
export { InMemoryKeyring } from './keyring/in-memory-keyring.js';
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAExF,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElH,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SeatCli } from '../enrollment/seat-bundle.js';
|
|
2
|
+
import { type SeatRecordSelector, type SeatStoreBackend, type SeatStoreRecordDescriptor } from './cli-seat-store-reader.js';
|
|
3
|
+
/** Documented sidecar format: categories only, never credential material. */
|
|
4
|
+
export interface SeatSidecar {
|
|
5
|
+
cli: SeatCli;
|
|
6
|
+
profileLabel: string;
|
|
7
|
+
schemaVersion: string;
|
|
8
|
+
credentialClass: 'renewable' | 'static-key' | 'access-only';
|
|
9
|
+
refreshCapable: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const SEAT_SIDECAR_MAX_BYTES = 4096;
|
|
12
|
+
type Categories = Omit<SeatStoreRecordDescriptor, 'cli' | 'profileLabel' | 'backend'>;
|
|
13
|
+
/** Parse and validate sidecar categories; throws SeatStoreReadError without echoing content. */
|
|
14
|
+
export declare function parseSeatSidecar(raw: string): Categories;
|
|
15
|
+
/** File backend over one explicit owner-provided sidecar path. */
|
|
16
|
+
export declare class SeatSidecarFileBackend implements SeatStoreBackend {
|
|
17
|
+
readonly cli: SeatCli;
|
|
18
|
+
readonly backend: "file";
|
|
19
|
+
private readonly sidecarPath;
|
|
20
|
+
constructor(cli: SeatCli, sidecarPath: string);
|
|
21
|
+
readSelectedRecord(selector: SeatRecordSelector): Promise<Categories | null>;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=seat-sidecar-file-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-sidecar-file-backend.d.ts","sourceRoot":"","sources":["../../src/node/seat-sidecar-file-backend.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAEpC,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,WAAW,GAAG,YAAY,GAAG,aAAa,CAAC;IAC5D,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAK3C,KAAK,UAAU,GAAG,IAAI,CAAC,yBAAyB,EAAE,KAAK,GAAG,cAAc,GAAG,SAAS,CAAC,CAAC;AAEtF,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CA6BxD;AAED,kEAAkE;AAClE,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,OAAO,SAAmB;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM;IAMvC,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAmBnF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// @sentropic/llm-mesh/node/seat-sidecar-file-backend.ts
|
|
2
|
+
//
|
|
3
|
+
// L1 owner helper backend: reads an explicitly provided JSON sidecar file
|
|
4
|
+
// the owner exported for dry-run format inspection. No home probing, no
|
|
5
|
+
// default paths, no keyring or environment reads. Only allowlisted,
|
|
6
|
+
// bounded categories are returned; anything else is refused or unverified.
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { SeatStoreReadError, } from './cli-seat-store-reader.js';
|
|
9
|
+
export const SEAT_SIDECAR_MAX_BYTES = 4096;
|
|
10
|
+
// Schema versions are machine labels, not free text: no spaces, quotes,
|
|
11
|
+
// or control characters that could smuggle content through the category.
|
|
12
|
+
const SCHEMA_VERSION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
13
|
+
/** Parse and validate sidecar categories; throws SeatStoreReadError without echoing content. */
|
|
14
|
+
export function parseSeatSidecar(raw) {
|
|
15
|
+
if (new TextEncoder().encode(raw).length > SEAT_SIDECAR_MAX_BYTES) {
|
|
16
|
+
throw new SeatStoreReadError('sidecar exceeds the bounded size');
|
|
17
|
+
}
|
|
18
|
+
let parsed;
|
|
19
|
+
try {
|
|
20
|
+
parsed = JSON.parse(raw);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new SeatStoreReadError('sidecar is not JSON');
|
|
24
|
+
}
|
|
25
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
26
|
+
throw new SeatStoreReadError('sidecar has no category record');
|
|
27
|
+
}
|
|
28
|
+
const record = parsed;
|
|
29
|
+
const rawSchemaVersion = record['schemaVersion'];
|
|
30
|
+
const schemaVersion = typeof rawSchemaVersion === 'string' && SCHEMA_VERSION_PATTERN.test(rawSchemaVersion)
|
|
31
|
+
? rawSchemaVersion
|
|
32
|
+
: null;
|
|
33
|
+
const credentialClass = record['credentialClass'];
|
|
34
|
+
const refreshCapable = record['refreshCapable'];
|
|
35
|
+
if (!schemaVersion)
|
|
36
|
+
throw new SeatStoreReadError('sidecar has no bounded schema version');
|
|
37
|
+
if (credentialClass !== 'renewable' && credentialClass !== 'static-key' && credentialClass !== 'access-only') {
|
|
38
|
+
throw new SeatStoreReadError('sidecar has no known credential class');
|
|
39
|
+
}
|
|
40
|
+
if (typeof refreshCapable !== 'boolean') {
|
|
41
|
+
throw new SeatStoreReadError('sidecar has no refresh capability flag');
|
|
42
|
+
}
|
|
43
|
+
return { schemaVersion, credentialClass, refreshCapable, supported: true };
|
|
44
|
+
}
|
|
45
|
+
/** File backend over one explicit owner-provided sidecar path. */
|
|
46
|
+
export class SeatSidecarFileBackend {
|
|
47
|
+
cli;
|
|
48
|
+
backend = 'file';
|
|
49
|
+
sidecarPath;
|
|
50
|
+
constructor(cli, sidecarPath) {
|
|
51
|
+
if (!sidecarPath)
|
|
52
|
+
throw new SeatStoreReadError('an explicit sidecar path is required');
|
|
53
|
+
this.cli = cli;
|
|
54
|
+
this.sidecarPath = sidecarPath;
|
|
55
|
+
}
|
|
56
|
+
async readSelectedRecord(selector) {
|
|
57
|
+
let raw;
|
|
58
|
+
try {
|
|
59
|
+
raw = await readFile(this.sidecarPath, 'utf8');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
if (new TextEncoder().encode(raw).length > SEAT_SIDECAR_MAX_BYTES) {
|
|
65
|
+
throw new SeatStoreReadError('sidecar exceeds the bounded size');
|
|
66
|
+
}
|
|
67
|
+
let sidecar;
|
|
68
|
+
try {
|
|
69
|
+
sidecar = JSON.parse(raw);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw new SeatStoreReadError('sidecar is not JSON');
|
|
73
|
+
}
|
|
74
|
+
if (sidecar.cli !== selector.cli || sidecar.profileLabel !== selector.profileLabel)
|
|
75
|
+
return null;
|
|
76
|
+
return parseSeatSidecar(raw);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=seat-sidecar-file-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-sidecar-file-backend.js","sourceRoot":"","sources":["../../src/node/seat-sidecar-file-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type AccountTransportAccount } from '../account-transports.js';
|
|
2
|
+
export { isExternalSeatAccount, markExternalSeatAuthority, readExternalSeatAuthority, SEAT_EXTERNAL_AUTHORITY_KEY, type SeatExternalAuthority, } from '../external-seat-marker.js';
|
|
3
|
+
type AccountLike = Pick<AccountTransportAccount, 'accountId' | 'metadata'>;
|
|
4
|
+
/** True for a Muse device-flow grant, which owns no CLI-store refresh. */
|
|
5
|
+
export declare function isDeviceFlowSeatAccount(account: AccountLike): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* True when an externally held seat must not be served: missing, empty, or
|
|
8
|
+
* unparseable expiry counts as unavailable, exactly like an elapsed one.
|
|
9
|
+
* Unknown expiry is not infinite validity.
|
|
10
|
+
*/
|
|
11
|
+
export declare function isExternalSeatUnavailable(account: Pick<AccountTransportAccount, 'expiresAt'>, nowMs: number): boolean;
|
|
12
|
+
/** Refuse a renewal attempt for an externally held seat. */
|
|
13
|
+
export declare function throwExternalSeatUnavailable(account: AccountLike): never;
|
|
14
|
+
/** Refuse a renewal attempt for a device-flow Muse seat. */
|
|
15
|
+
export declare function throwDeviceFlowSeatUnavailable(account: AccountLike): never;
|
|
16
|
+
//# sourceMappingURL=external-seat-authority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-seat-authority.d.ts","sourceRoot":"","sources":["../../src/service/external-seat-authority.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,4BAA4B,CAAC;AAGpC,KAAK,WAAW,GAAG,IAAI,CAAC,uBAAuB,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;AAK3E,0EAA0E;AAC1E,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAGrE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,WAAW,CAAC,EACnD,KAAK,EAAE,MAAM,GACZ,OAAO,CAKT;AAED,4DAA4D;AAC5D,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,WAAW,GAAG,KAAK,CAOxE;AAED,4DAA4D;AAC5D,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,WAAW,GAAG,KAAK,CAK1E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// @sentropic/llm-mesh/service/external-seat-authority.ts
|
|
2
|
+
//
|
|
3
|
+
// L1 external refresh policy for centrally custodied CI seats. An account
|
|
4
|
+
// carrying the trusted import marker is maintained by the custodian only:
|
|
5
|
+
// the mesh never renews it. On expiry or 401 it becomes `access-unavailable`
|
|
6
|
+
// and waits for the next imported projection. The marker never erases the
|
|
7
|
+
// owner claim and a missing refresh token alone is not authority.
|
|
8
|
+
//
|
|
9
|
+
// Device-flow Muse seats are routed the same way: their grant must never be
|
|
10
|
+
// refreshed by re-reading the CLI login store, which may hold another login.
|
|
11
|
+
import { AccountTransportAcquireError, } from '../account-transports.js';
|
|
12
|
+
// The marker key, record, and predicates live in the leaf module so the
|
|
13
|
+
// base transport layer can classify outcomes without importing services.
|
|
14
|
+
export { isExternalSeatAccount, markExternalSeatAuthority, readExternalSeatAuthority, SEAT_EXTERNAL_AUTHORITY_KEY, } from '../external-seat-marker.js';
|
|
15
|
+
import { readExternalSeatAuthority } from '../external-seat-marker.js';
|
|
16
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
17
|
+
/** True for a Muse device-flow grant, which owns no CLI-store refresh. */
|
|
18
|
+
export function isDeviceFlowSeatAccount(account) {
|
|
19
|
+
const metadata = account.metadata;
|
|
20
|
+
return isRecord(metadata) && metadata['auth_type'] === 'device-flow';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* True when an externally held seat must not be served: missing, empty, or
|
|
24
|
+
* unparseable expiry counts as unavailable, exactly like an elapsed one.
|
|
25
|
+
* Unknown expiry is not infinite validity.
|
|
26
|
+
*/
|
|
27
|
+
export function isExternalSeatUnavailable(account, nowMs) {
|
|
28
|
+
if (!account.expiresAt)
|
|
29
|
+
return true;
|
|
30
|
+
const expiresAtMs = new Date(account.expiresAt).getTime();
|
|
31
|
+
if (!Number.isFinite(expiresAtMs))
|
|
32
|
+
return true;
|
|
33
|
+
return expiresAtMs <= nowMs;
|
|
34
|
+
}
|
|
35
|
+
/** Refuse a renewal attempt for an externally held seat. */
|
|
36
|
+
export function throwExternalSeatUnavailable(account) {
|
|
37
|
+
const authority = readExternalSeatAuthority(account.metadata);
|
|
38
|
+
const seatRef = authority?.seatRef ?? account.accountId;
|
|
39
|
+
throw new AccountTransportAcquireError(`Seat ${seatRef} is access-unavailable; awaiting the next imported projection`, 'access-unavailable');
|
|
40
|
+
}
|
|
41
|
+
/** Refuse a renewal attempt for a device-flow Muse seat. */
|
|
42
|
+
export function throwDeviceFlowSeatUnavailable(account) {
|
|
43
|
+
throw new AccountTransportAcquireError(`Seat ${account.accountId} is access-unavailable; device grants never refresh from the CLI store`, 'access-unavailable');
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=external-seat-authority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-seat-authority.js","sourceRoot":"","sources":["../../src/service/external-seat-authority.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,6EAA6E;AAC7E,0EAA0E;AAC1E,kEAAkE;AAClE,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAE7E,OAAO,EACL,4BAA4B,GAE7B,MAAM,0BAA0B,CAAC;AAElC,wEAAwE;AACxE,yEAAyE;AACzE,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,GAE5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAIvE,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,0EAA0E;AAC1E,MAAM,UAAU,uBAAuB,CAAC,OAAoB;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAA+C,CAAC;IACzE,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,KAAK,aAAa,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAmD,EACnD,KAAa;IAEb,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,WAAW,IAAI,KAAK,CAAC;AAC9B,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,4BAA4B,CAAC,OAAoB;IAC/D,MAAM,SAAS,GAAG,yBAAyB,CAAC,OAAO,CAAC,QAA+C,CAAC,CAAC;IACrG,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;IACxD,MAAM,IAAI,4BAA4B,CACpC,QAAQ,OAAO,+DAA+D,EAC9E,oBAAoB,CACrB,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,8BAA8B,CAAC,OAAoB;IACjE,MAAM,IAAI,4BAA4B,CACpC,QAAQ,OAAO,CAAC,SAAS,wEAAwE,EACjG,oBAAoB,CACrB,CAAC;AACJ,CAAC"}
|
package/dist/service/facade.d.ts
CHANGED
|
@@ -85,6 +85,15 @@ export interface LlmMeshFacade {
|
|
|
85
85
|
completeMuseImport(enrollmentId: string, code: string, ownerScopeRef: string): Promise<EnrollmentCompletion>;
|
|
86
86
|
completeMuseDirectImport(apiKey: string, ownerScopeRef: string): Promise<EnrollmentCompletion>;
|
|
87
87
|
completeMuseDeviceImport(enrollmentId: string, ownerScopeRef: string, maxAttempts?: number): Promise<EnrollmentCompletion>;
|
|
88
|
+
importSeatBundle(input: {
|
|
89
|
+
bundle: unknown;
|
|
90
|
+
ownerScope: string;
|
|
91
|
+
}): Promise<{
|
|
92
|
+
accountId: string;
|
|
93
|
+
seatRef: string;
|
|
94
|
+
generation: number;
|
|
95
|
+
idempotent: boolean;
|
|
96
|
+
}>;
|
|
88
97
|
cancel(enrollmentId: string): Promise<void>;
|
|
89
98
|
acquire(input: AccountTransportAcquireInput): Promise<AccountTransportAcquisition>;
|
|
90
99
|
release(acquisition: AccountTransportAcquisition): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../src/service/facade.ts"],"names":[],"mappings":"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
|
|
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
|
@@ -55,6 +55,9 @@ export function createLlmMeshFacade(options) {
|
|
|
55
55
|
async completeMuseDeviceImport(enrollmentId, ownerScopeRef, maxAttempts) {
|
|
56
56
|
return service.completeMuseDeviceImport(enrollmentId, ownerScopeRef, maxAttempts);
|
|
57
57
|
},
|
|
58
|
+
async importSeatBundle(input) {
|
|
59
|
+
return service.importSeatBundle(input);
|
|
60
|
+
},
|
|
58
61
|
async cancel(enrollmentId) {
|
|
59
62
|
return service.cancel(enrollmentId);
|
|
60
63
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/service/facade.ts"],"names":[],"mappings":"AAYA,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;
|
|
1
|
+
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/service/facade.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,24 @@ export declare class LocalAccountTransportService {
|
|
|
31
31
|
completeMuseImport(enrollmentId: string, code: string, ownerScopeRef: string): Promise<EnrollmentCompletion>;
|
|
32
32
|
completeMuseDirectImport(apiKey: string, ownerScopeRef: string): Promise<EnrollmentCompletion>;
|
|
33
33
|
completeMuseDeviceImport(enrollmentId: string, ownerScopeRef: string, maxAttempts?: number): Promise<EnrollmentCompletion>;
|
|
34
|
+
/**
|
|
35
|
+
* L1 trusted seat-bundle entry: the single mesh path from a custodian
|
|
36
|
+
* consumer projection to a registered, externally marked account. It
|
|
37
|
+
* validates the projection (consumer authority, owner binding, usable
|
|
38
|
+
* access material, required provider expiry), applies the stored
|
|
39
|
+
* lineage transition (idempotent N, refused stale N-1 and new epochs),
|
|
40
|
+
* and persists through the canonical register/persist path so restart
|
|
41
|
+
* restores the same externally marked account. No second registry.
|
|
42
|
+
*/
|
|
43
|
+
importSeatBundle(input: {
|
|
44
|
+
bundle: unknown;
|
|
45
|
+
ownerScope: string;
|
|
46
|
+
}): Promise<{
|
|
47
|
+
accountId: string;
|
|
48
|
+
seatRef: string;
|
|
49
|
+
generation: number;
|
|
50
|
+
idempotent: boolean;
|
|
51
|
+
}>;
|
|
34
52
|
private hasClaudeGrant;
|
|
35
53
|
private persistClaudeCompletion;
|
|
36
54
|
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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"}
|
|
@@ -2,6 +2,8 @@ import { AccountTransportAcquireError, InMemoryAccountTransportCoordinator, } fr
|
|
|
2
2
|
import { MUSE_DIRECT_BILLING_TYPE } from '../enrollment/muse.js';
|
|
3
3
|
import { ClaudeRefreshPreparationError } from '../enrollment/claude-code.js';
|
|
4
4
|
import { listModelProfilesByProvider } from '../catalog.js';
|
|
5
|
+
import { isDeviceFlowSeatAccount, isExternalSeatAccount, isExternalSeatUnavailable, markExternalSeatAuthority, readExternalSeatAuthority, throwExternalSeatUnavailable, } from './external-seat-authority.js';
|
|
6
|
+
import { classifyTransition, validateSeatBundle, } from '../enrollment/seat-bundle.js';
|
|
5
7
|
// Cloud Code does not currently return a per-account model inventory during
|
|
6
8
|
// enrollment. Advertise only the model proven executable by the live transport
|
|
7
9
|
// contract; explicit account.modelIds may override this after provider evidence.
|
|
@@ -362,6 +364,110 @@ export class LocalAccountTransportService {
|
|
|
362
364
|
}, account);
|
|
363
365
|
return { accountId: credential.accountId, label };
|
|
364
366
|
}
|
|
367
|
+
/**
|
|
368
|
+
* L1 trusted seat-bundle entry: the single mesh path from a custodian
|
|
369
|
+
* consumer projection to a registered, externally marked account. It
|
|
370
|
+
* validates the projection (consumer authority, owner binding, usable
|
|
371
|
+
* access material, required provider expiry), applies the stored
|
|
372
|
+
* lineage transition (idempotent N, refused stale N-1 and new epochs),
|
|
373
|
+
* and persists through the canonical register/persist path so restart
|
|
374
|
+
* restores the same externally marked account. No second registry.
|
|
375
|
+
*/
|
|
376
|
+
async importSeatBundle(input) {
|
|
377
|
+
const owner = this.requireOwnerScope(input.ownerScope);
|
|
378
|
+
await this.restorePersistedAccounts();
|
|
379
|
+
const validated = validateSeatBundle(input.bundle, { ownerScope: owner, trustedAuthority: 'consumer' });
|
|
380
|
+
if (!validated.ok) {
|
|
381
|
+
throw new Error(`Seat bundle refused: ${validated.code}; ${validated.detail}`);
|
|
382
|
+
}
|
|
383
|
+
const bundle = validated.bundle;
|
|
384
|
+
if (bundle.credentialClass !== 'access-only' && bundle.credentialClass !== 'static-key') {
|
|
385
|
+
throw new Error('Seat bundle must be access-only; the custodian holds every refresh grant');
|
|
386
|
+
}
|
|
387
|
+
if (bundle.lifecycle.refreshAuthority !== 'none') {
|
|
388
|
+
throw new Error('Seat bundle must not carry refresh authority into the mesh');
|
|
389
|
+
}
|
|
390
|
+
const meshUse = bundle.meshUse;
|
|
391
|
+
if ((meshUse.kind !== 'access' && meshUse.kind !== 'static-key') || !meshUse.accessRef) {
|
|
392
|
+
throw new Error('Seat bundle carries no usable access reference');
|
|
393
|
+
}
|
|
394
|
+
if (!bundle.lifecycle.providerExpiry) {
|
|
395
|
+
throw new Error('Seat bundle requires providerExpiry; unknown expiry is not infinite validity');
|
|
396
|
+
}
|
|
397
|
+
const pair = {
|
|
398
|
+
agy: ['gemini', 'cloud-code'],
|
|
399
|
+
codex: ['openai', 'codex'],
|
|
400
|
+
vibe: ['mistral', 'mistral-vibe'],
|
|
401
|
+
muse: ['muse', 'muse'],
|
|
402
|
+
claude: ['anthropic', 'claude-code'],
|
|
403
|
+
};
|
|
404
|
+
const [targetProviderId, transportProviderId] = pair[bundle.identity.cli];
|
|
405
|
+
const seatRef = bundle.identity.seatRef;
|
|
406
|
+
const accountId = `seat-${bundle.identity.cli}-${seatRef}`;
|
|
407
|
+
const incoming = {
|
|
408
|
+
epoch: bundle.lifecycle.epoch,
|
|
409
|
+
generation: bundle.lifecycle.generation,
|
|
410
|
+
operationId: bundle.lifecycle.operationId,
|
|
411
|
+
};
|
|
412
|
+
const held = this.accountsMap.get(accountId);
|
|
413
|
+
const heldAuthority = held
|
|
414
|
+
? readExternalSeatAuthority(held.metadata)
|
|
415
|
+
: null;
|
|
416
|
+
if (held && heldAuthority && heldAuthority.seatRef === seatRef) {
|
|
417
|
+
// The held account's owner wins: another owner scope presenting the
|
|
418
|
+
// same seatRef never takes the account over, even at a higher
|
|
419
|
+
// generation. Only the holding owner may advance its lineage.
|
|
420
|
+
if (heldAuthority.ownerScope !== owner) {
|
|
421
|
+
throw new Error('Seat bundle refused: held seat is owned by another owner scope');
|
|
422
|
+
}
|
|
423
|
+
const transition = classifyTransition({ epoch: heldAuthority.epoch, generation: heldAuthority.generation, operationId: heldAuthority.operationId }, incoming);
|
|
424
|
+
if (transition === 'idempotent') {
|
|
425
|
+
return { accountId, seatRef, generation: incoming.generation, idempotent: true };
|
|
426
|
+
}
|
|
427
|
+
// A forward transition falls through to registration below, which
|
|
428
|
+
// overwrites the same stable account (no duplicate registry).
|
|
429
|
+
if (transition === 'stale') {
|
|
430
|
+
throw new Error(`stale-generation: incoming N-${incoming.generation} is older than current`);
|
|
431
|
+
}
|
|
432
|
+
if (transition === 'conflict') {
|
|
433
|
+
throw new Error('conflicting reimport: same generation with a different lineage');
|
|
434
|
+
}
|
|
435
|
+
if (transition !== 'forward') {
|
|
436
|
+
throw new Error('epoch-replacement-required: a new epoch needs the controlled replacement operation');
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
const now = new Date().toISOString();
|
|
440
|
+
const account = {
|
|
441
|
+
accountId,
|
|
442
|
+
ownerScopeRef: owner,
|
|
443
|
+
accountLabel: `Seat ${bundle.identity.cli} (${seatRef})`,
|
|
444
|
+
targetProviderId,
|
|
445
|
+
transportProviderId,
|
|
446
|
+
accessToken: meshUse.accessRef,
|
|
447
|
+
expiresAt: bundle.lifecycle.providerExpiry ?? undefined,
|
|
448
|
+
status: 'active',
|
|
449
|
+
enrollmentCompletedAt: now,
|
|
450
|
+
metadata: markExternalSeatAuthority({ productAccountSource: bundle.identity.packageProviderId }, { seatRef, ownerScope: owner, ...incoming }),
|
|
451
|
+
};
|
|
452
|
+
this.registerAccount(account, bundle.identity.credentialFormatVersion);
|
|
453
|
+
await this.persistCredential({
|
|
454
|
+
accountId,
|
|
455
|
+
accountLabel: account.accountLabel ?? accountId,
|
|
456
|
+
providerId: transportProviderId,
|
|
457
|
+
status: 'active',
|
|
458
|
+
createdAt: now,
|
|
459
|
+
updatedAt: now,
|
|
460
|
+
}, {
|
|
461
|
+
accountId,
|
|
462
|
+
accessToken: meshUse.accessRef,
|
|
463
|
+
// Unknown provider expiry is stored as '': Date.parse('') is NaN,
|
|
464
|
+
// so every finite-date check fails closed. External seats never
|
|
465
|
+
// refresh here; availability is gated by isExternalSeatUnavailable.
|
|
466
|
+
expiresAt: bundle.lifecycle.providerExpiry ?? '',
|
|
467
|
+
authClientConfigVersion: bundle.identity.credentialFormatVersion,
|
|
468
|
+
}, account);
|
|
469
|
+
return { accountId, seatRef, generation: incoming.generation, idempotent: false };
|
|
470
|
+
}
|
|
365
471
|
async hasClaudeGrant(credential, ownerScopeRef) {
|
|
366
472
|
const index = await this.keyring.getSecret(LocalAccountTransportService.accountIndexKey);
|
|
367
473
|
for (const accountId of this.parseAccountIndex(index)) {
|
|
@@ -543,9 +649,20 @@ export class LocalAccountTransportService {
|
|
|
543
649
|
const account = this.accountsMap.get(acquisition.material.accountId ?? '');
|
|
544
650
|
const nowMs = typeof input.now === 'number' ? input.now : Date.now();
|
|
545
651
|
// Check if access token is expired
|
|
652
|
+
// L1 external policy: custodied seats never refresh here and never
|
|
653
|
+
// serve on unknown expiry. Expired or dateless access becomes
|
|
654
|
+
// access-unavailable; valid access is returned directly with the owner
|
|
655
|
+
// claim and policy retained. Mesh-managed device-flow seats fall
|
|
656
|
+
// through to refreshToken(), which dispatches them to the muse-code
|
|
657
|
+
// device provider.
|
|
658
|
+
const externallyManaged = !!account && isExternalSeatAccount(account);
|
|
659
|
+
if (account && externallyManaged && isExternalSeatUnavailable(account, nowMs)) {
|
|
660
|
+
await acquisition.release?.();
|
|
661
|
+
throwExternalSeatUnavailable(account);
|
|
662
|
+
}
|
|
546
663
|
if (account && account.expiresAt) {
|
|
547
664
|
const expiresAtMs = new Date(account.expiresAt).getTime();
|
|
548
|
-
if (expiresAtMs <= nowMs || this.refreshInFlight.has(account.accountId)) {
|
|
665
|
+
if (!externallyManaged && (expiresAtMs <= nowMs || this.refreshInFlight.has(account.accountId))) {
|
|
549
666
|
try {
|
|
550
667
|
const version = this.credentialVersions.get(account.accountId) ?? 'v1.0.0';
|
|
551
668
|
const refreshed = await this.refreshToken({
|
|
@@ -750,6 +867,11 @@ export class LocalAccountTransportService {
|
|
|
750
867
|
// Handled internally by EnrollmentProvider.complete()
|
|
751
868
|
}
|
|
752
869
|
async refreshToken(input) {
|
|
870
|
+
// L1 external policy: custodied seats never renew here; refuse before the
|
|
871
|
+
// single-flight map so no state mutates and no provider is called.
|
|
872
|
+
const held = this.accountsMap.get(input.accountId);
|
|
873
|
+
if (held && isExternalSeatAccount(held))
|
|
874
|
+
throwExternalSeatUnavailable(held);
|
|
753
875
|
// P0-5: Single-flight refresh map to prevent parallel refresh races
|
|
754
876
|
if (this.refreshInFlight.has(input.accountId)) {
|
|
755
877
|
return this.refreshInFlight.get(input.accountId);
|
|
@@ -758,7 +880,13 @@ export class LocalAccountTransportService {
|
|
|
758
880
|
const account = this.accountsMap.get(input.accountId);
|
|
759
881
|
let requestMayHaveBeenSent = false;
|
|
760
882
|
try {
|
|
761
|
-
|
|
883
|
+
// L1 (a): a mesh-managed device-flow Muse grant refreshes through
|
|
884
|
+
// the muse-code device provider with its stored refresh token,
|
|
885
|
+
// never by re-reading the CLI store (which may hold another login).
|
|
886
|
+
// Externally custodied seats were refused above.
|
|
887
|
+
const providerId = account && isDeviceFlowSeatAccount(account)
|
|
888
|
+
? 'muse-code'
|
|
889
|
+
: (account?.transportProviderId ?? 'cloud-code');
|
|
762
890
|
const provider = this.providers.get(providerId);
|
|
763
891
|
if (!provider) {
|
|
764
892
|
throw new Error(`No provider registered for refresh: ${providerId}`);
|