agent-comms 3.7.0 → 3.8.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/core/bridge-mesh.d.ts +4 -2
- package/dist/core/bridge-mesh.d.ts.map +1 -1
- package/dist/core/bridge-mesh.js +13 -4
- package/dist/core/bridge-mesh.js.map +1 -1
- package/dist/core/delegation-policy.d.ts +20 -0
- package/dist/core/delegation-policy.d.ts.map +1 -0
- package/dist/core/delegation-policy.js +10 -0
- package/dist/core/delegation-policy.js.map +1 -0
- package/dist/core/device-membership-verification.d.ts +28 -0
- package/dist/core/device-membership-verification.d.ts.map +1 -0
- package/dist/core/device-membership-verification.js +43 -0
- package/dist/core/device-membership-verification.js.map +1 -0
- package/dist/core/device-membership.d.ts +42 -0
- package/dist/core/device-membership.d.ts.map +1 -0
- package/dist/core/device-membership.js +53 -0
- package/dist/core/device-membership.js.map +1 -0
- package/dist/core/identity-store.d.ts +10 -0
- package/dist/core/identity-store.d.ts.map +1 -1
- package/dist/core/identity-store.js +44 -0
- package/dist/core/identity-store.js.map +1 -1
- package/dist/core/package-version.d.ts +6 -0
- package/dist/core/package-version.d.ts.map +1 -0
- package/dist/core/package-version.js +28 -0
- package/dist/core/package-version.js.map +1 -0
- package/dist/core/room-lifecycle.d.ts.map +1 -1
- package/dist/core/room-lifecycle.js +5 -4
- package/dist/core/room-lifecycle.js.map +1 -1
- package/dist/core/room-protocol.d.ts.map +1 -1
- package/dist/core/room-protocol.js +4 -3
- package/dist/core/room-protocol.js.map +1 -1
- package/dist/core/room-token-verification.d.ts +3 -0
- package/dist/core/room-token-verification.d.ts.map +1 -1
- package/dist/core/room-token-verification.js +4 -0
- package/dist/core/room-token-verification.js.map +1 -1
- package/dist/core/test/package-version.unit.test.d.ts +5 -0
- package/dist/core/test/package-version.unit.test.d.ts.map +1 -0
- package/dist/core/test/package-version.unit.test.js +30 -0
- package/dist/core/test/package-version.unit.test.js.map +1 -0
- package/dist/core/test/version-check.unit.test.d.ts +5 -0
- package/dist/core/test/version-check.unit.test.d.ts.map +1 -0
- package/dist/core/test/version-check.unit.test.js +176 -0
- package/dist/core/test/version-check.unit.test.js.map +1 -0
- package/dist/core/tool.d.ts +7 -1
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +34 -11
- package/dist/core/tool.js.map +1 -1
- package/dist/core/user-identity.d.ts +10 -0
- package/dist/core/user-identity.d.ts.map +1 -1
- package/dist/core/user-identity.js +60 -8
- package/dist/core/user-identity.js.map +1 -1
- package/dist/core/version-check.d.ts +36 -0
- package/dist/core/version-check.d.ts.map +1 -0
- package/dist/core/version-check.js +118 -0
- package/dist/core/version-check.js.map +1 -0
- package/dist/test/bridge-mesh-version-drift.test.d.ts +7 -0
- package/dist/test/bridge-mesh-version-drift.test.d.ts.map +1 -0
- package/dist/test/bridge-mesh-version-drift.test.js +98 -0
- package/dist/test/bridge-mesh-version-drift.test.js.map +1 -0
- package/dist/test/delegation-policy.test.d.ts +5 -0
- package/dist/test/delegation-policy.test.d.ts.map +1 -0
- package/dist/test/delegation-policy.test.js +52 -0
- package/dist/test/delegation-policy.test.js.map +1 -0
- package/dist/test/device-membership-verification.test.d.ts +2 -0
- package/dist/test/device-membership-verification.test.d.ts.map +1 -0
- package/dist/test/device-membership-verification.test.js +214 -0
- package/dist/test/device-membership-verification.test.js.map +1 -0
- package/dist/test/device-membership.test.d.ts +2 -0
- package/dist/test/device-membership.test.d.ts.map +1 -0
- package/dist/test/device-membership.test.js +201 -0
- package/dist/test/device-membership.test.js.map +1 -0
- package/dist/test/identity-store.test.js +76 -1
- package/dist/test/identity-store.test.js.map +1 -1
- package/dist/test/room-lifecycle.test.js +24 -1
- package/dist/test/room-lifecycle.test.js.map +1 -1
- package/dist/test/tool-version-reporting.test.d.ts +5 -0
- package/dist/test/tool-version-reporting.test.d.ts.map +1 -0
- package/dist/test/tool-version-reporting.test.js +67 -0
- package/dist/test/tool-version-reporting.test.js.map +1 -0
- package/dist/test/user-identity.test.js +54 -1
- package/dist/test/user-identity.test.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/ExaDev/agent-comms)
|
|
4
4
|
[](https://www.npmjs.com/package/agent-comms)
|
|
5
|
-
[](https://github.com/ExaDev/agent-comms/releases/tag/v3.8.0)
|
|
6
6
|
[](https://github.com/ExaDev/agent-comms/actions)
|
|
7
7
|
|
|
8
8
|
Cross-harness communication mesh for LLM agents: rooms, DMs, presence, and visibility over TCP with zero filesystem dependencies.
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* peerId is deviceIdToHex(identity.deviceId), not identity.fingerprint -- WireMeshTransport's own session bookkeeping is keyed by device-id, so MeshStore's own notion of "this peer's id" has to be the same value for the two to correlate. Every existing agent id changes the first time a bridge starts through this factory: there is no migration path, since the value is a hash of genuinely different bytes (device-id is SHA-256(raw public key); fingerprint is SHA-256(certificate DER)) -- a hard cutover, already established as correct when identity.ts first grew deviceId, not relitigated here.
|
|
5
5
|
*
|
|
6
6
|
* Split into a synchronous half (wireBridgeMesh) and an async half (attachMintingIdentity, wrapping toIdentityPort's WebCrypto import) because deriving the IdentityPort MeshStore mints room-membership grants against is unavoidably async, but not every bridge entry point can await one inline -- a plugin loader that calls its extension's default export synchronously (e.g. pi's own) cannot. createBridgeMeshSync exposes both halves for that case, deferring attachIdentity() to wherever the bridge's own lifecycle first has an async context (its own session-start hook), which is always well before the bridge does anything identity-dependent like createRoom. createBridgeMesh remains the convenient all-in-one for every bridge whose own entry point is already async.
|
|
7
|
+
*
|
|
8
|
+
* Also starts this bridge's own VersionDriftChecker (agent-comms#166) and wires its result into the CommsTool it builds, so every real bridge gets npm release-drift reporting on whoami/update for free from this one construction point, with no per-bridge wiring. fetchLatestVersion is exposed purely for tests -- every real caller omits it and gets VersionDriftChecker's own default (a real npm registry lookup); a test that would otherwise trigger real network I/O on every createBridgeMesh call injects a fake resolver instead.
|
|
7
9
|
*/
|
|
8
10
|
import { MeshStore } from "./mesh-store.js";
|
|
9
11
|
import { CommsTool } from "./tool.js";
|
|
@@ -17,6 +19,6 @@ export interface BridgeMeshSync extends BridgeMesh {
|
|
|
17
19
|
attachIdentity: () => Promise<void>;
|
|
18
20
|
}
|
|
19
21
|
/** The synchronous half of bridge construction: everything loadOrCreateIdentity's own synchronous key material makes possible. Use this directly only when the calling entry point cannot await inline (see this file's own header comment); every other caller should use createBridgeMesh below. */
|
|
20
|
-
export declare function createBridgeMeshSync(slot: Readonly<IdentitySlot>, coordinatorPort?: number, hubUrl?: string): BridgeMeshSync;
|
|
21
|
-
export declare function createBridgeMesh(slot: Readonly<IdentitySlot>, coordinatorPort?: number, hubUrl?: string): Promise<BridgeMesh>;
|
|
22
|
+
export declare function createBridgeMeshSync(slot: Readonly<IdentitySlot>, coordinatorPort?: number, hubUrl?: string, fetchLatestVersion?: () => Promise<string | undefined>): BridgeMeshSync;
|
|
23
|
+
export declare function createBridgeMesh(slot: Readonly<IdentitySlot>, coordinatorPort?: number, hubUrl?: string, fetchLatestVersion?: () => Promise<string | undefined>): Promise<BridgeMesh>;
|
|
22
24
|
//# sourceMappingURL=bridge-mesh.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-mesh.d.ts","sourceRoot":"","sources":["../../src/core/bridge-mesh.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"bridge-mesh.d.ts","sourceRoot":"","sources":["../../src/core/bridge-mesh.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,iSAAiS;IACjS,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,sSAAsS;AACtS,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,eAAe,CAAC,EAAE,MAAM,EACxB,MAAM,CAAC,EAAE,MAAM,EACf,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GACrD,cAAc,CAyChB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,eAAe,CAAC,EAAE,MAAM,EACxB,MAAM,CAAC,EAAE,MAAM,EACf,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GACrD,OAAO,CAAC,UAAU,CAAC,CASrB"}
|
package/dist/core/bridge-mesh.js
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* peerId is deviceIdToHex(identity.deviceId), not identity.fingerprint -- WireMeshTransport's own session bookkeeping is keyed by device-id, so MeshStore's own notion of "this peer's id" has to be the same value for the two to correlate. Every existing agent id changes the first time a bridge starts through this factory: there is no migration path, since the value is a hash of genuinely different bytes (device-id is SHA-256(raw public key); fingerprint is SHA-256(certificate DER)) -- a hard cutover, already established as correct when identity.ts first grew deviceId, not relitigated here.
|
|
5
5
|
*
|
|
6
6
|
* Split into a synchronous half (wireBridgeMesh) and an async half (attachMintingIdentity, wrapping toIdentityPort's WebCrypto import) because deriving the IdentityPort MeshStore mints room-membership grants against is unavoidably async, but not every bridge entry point can await one inline -- a plugin loader that calls its extension's default export synchronously (e.g. pi's own) cannot. createBridgeMeshSync exposes both halves for that case, deferring attachIdentity() to wherever the bridge's own lifecycle first has an async context (its own session-start hook), which is always well before the bridge does anything identity-dependent like createRoom. createBridgeMesh remains the convenient all-in-one for every bridge whose own entry point is already async.
|
|
7
|
+
*
|
|
8
|
+
* Also starts this bridge's own VersionDriftChecker (agent-comms#166) and wires its result into the CommsTool it builds, so every real bridge gets npm release-drift reporting on whoami/update for free from this one construction point, with no per-bridge wiring. fetchLatestVersion is exposed purely for tests -- every real caller omits it and gets VersionDriftChecker's own default (a real npm registry lookup); a test that would otherwise trigger real network I/O on every createBridgeMesh call injects a fake resolver instead.
|
|
7
9
|
*/
|
|
8
10
|
import { deviceIdToHex } from "wire-mesh-core/domain/device-id";
|
|
9
11
|
import { createSystemClock } from "wire-mesh-core/adapters/system-clock";
|
|
@@ -14,15 +16,22 @@ import { CommsTool } from "./tool.js";
|
|
|
14
16
|
import { WireMeshTransport } from "./wire-mesh-transport.js";
|
|
15
17
|
import { loadOrCreateIdentity, oplogDirFor } from "./identity-store.js";
|
|
16
18
|
import { toIdentityPort } from "./wire-mesh-identity.js";
|
|
19
|
+
import { VersionDriftChecker } from "./version-check.js";
|
|
20
|
+
import { getOwnPackageVersion } from "./package-version.js";
|
|
17
21
|
/** The synchronous half of bridge construction: everything loadOrCreateIdentity's own synchronous key material makes possible. Use this directly only when the calling entry point cannot await inline (see this file's own header comment); every other caller should use createBridgeMesh below. */
|
|
18
|
-
export function createBridgeMeshSync(slot, coordinatorPort, hubUrl) {
|
|
22
|
+
export function createBridgeMeshSync(slot, coordinatorPort, hubUrl, fetchLatestVersion) {
|
|
19
23
|
const identity = loadOrCreateIdentity(slot);
|
|
20
24
|
const store = new MeshStore(coordinatorPort, hubUrl);
|
|
21
25
|
store.peerId = deviceIdToHex(Uint8Array.from(identity.deviceId));
|
|
22
26
|
// One shared dataStorage instance for both the transport's own data-domain frame responder and the store's own durable-send mint path (P5, agent-comms#50) -- oplogDirFor(slot) needs only the slot, not the async identity below, so this can be constructed synchronously right here.
|
|
23
27
|
const dataStorage = createNodeFsStorage({ dir: oplogDirFor(slot) });
|
|
24
28
|
store.setTransport(new WireMeshTransport(store.events, identity, store.roomVerbHandlers, undefined, () => store.selfStatus, undefined, () => store.hostedRooms, dataStorage, () => store.selfAgentAdvert));
|
|
25
|
-
const
|
|
29
|
+
const versionChecker = new VersionDriftChecker({
|
|
30
|
+
currentVersion: getOwnPackageVersion(),
|
|
31
|
+
...(fetchLatestVersion !== undefined ? { fetchLatestVersion } : {}),
|
|
32
|
+
});
|
|
33
|
+
versionChecker.start();
|
|
34
|
+
const tool = new CommsTool(store, store.discovery, () => versionChecker.getNewerVersionIfAny());
|
|
26
35
|
const revocation = createRevocationView();
|
|
27
36
|
return {
|
|
28
37
|
store,
|
|
@@ -38,8 +47,8 @@ export function createBridgeMeshSync(slot, coordinatorPort, hubUrl) {
|
|
|
38
47
|
},
|
|
39
48
|
};
|
|
40
49
|
}
|
|
41
|
-
export async function createBridgeMesh(slot, coordinatorPort, hubUrl) {
|
|
42
|
-
const { store, tool, attachIdentity } = createBridgeMeshSync(slot, coordinatorPort, hubUrl);
|
|
50
|
+
export async function createBridgeMesh(slot, coordinatorPort, hubUrl, fetchLatestVersion) {
|
|
51
|
+
const { store, tool, attachIdentity } = createBridgeMeshSync(slot, coordinatorPort, hubUrl, fetchLatestVersion);
|
|
43
52
|
await attachIdentity();
|
|
44
53
|
return { store, tool };
|
|
45
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-mesh.js","sourceRoot":"","sources":["../../src/core/bridge-mesh.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"bridge-mesh.js","sourceRoot":"","sources":["../../src/core/bridge-mesh.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAY5D,sSAAsS;AACtS,MAAM,UAAU,oBAAoB,CAClC,IAA4B,EAC5B,eAAwB,EACxB,MAAe,EACf,kBAAsD;IAEtD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACrD,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,wRAAwR;IACxR,MAAM,WAAW,GAAG,mBAAmB,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,YAAY,CAChB,IAAI,iBAAiB,CACnB,KAAK,CAAC,MAAM,EACZ,QAAQ,EACR,KAAK,CAAC,gBAAgB,EACtB,SAAS,EACT,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EACtB,SAAS,EACT,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EACvB,WAAW,EACX,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAC5B,CACF,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,mBAAmB,CAAC;QAC7C,cAAc,EAAE,oBAAoB,EAAE;QACtC,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;IACH,cAAc,CAAC,KAAK,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,CACtD,cAAc,CAAC,oBAAoB,EAAE,CACtC,CAAC;IACF,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,OAAO;QACL,KAAK;QACL,IAAI;QACJ,cAAc,EAAE,KAAK,IAAI,EAAE;YACzB,KAAK,CAAC,WAAW,CAAC;gBAChB,QAAQ,EAAE,MAAM,cAAc,CAAC,QAAQ,CAAC;gBACxC,KAAK,EAAE,iBAAiB,EAAE;gBAC1B,IAAI;gBACJ,UAAU;gBACV,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAA4B,EAC5B,eAAwB,EACxB,MAAe,EACf,kBAAsD;IAEtD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,oBAAoB,CAC1D,IAAI,EACJ,eAAe,EACf,MAAM,EACN,kBAAkB,CACnB,CAAC;IACF,MAAM,cAAc,EAAE,CAAC;IACvB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Issuer-side delegation policy (agent-comms#163): deciding which capability verbs an issuer never lets a bearer redelegate, expressed entirely with wire-mesh-core's own shipped primitives. A capability on the policy's nonDelegable set is always minted with delegationsRemaining forced to 0 -- the grant is usable by its own bearer but cannot be passed further down the chain -- regardless of what the caller would otherwise request; mintCapabilityToken needs no change for this, since delegationsRemaining: 0 already means exactly "no further hops" (tokens-CpLDI5Fo.d.mts's own MintCapabilityTokenOptions.delegationsRemaining doc comment).
|
|
3
|
+
*
|
|
4
|
+
* Per-agent overrides are deliberately just a second, bearer-keyed nonDelegable set that entirely REPLACES the policy's own default for that one bearer, never merges with it. This needs no bookkeeping of its own: every bearer's grant is already its own independent mint (mintCapabilityToken places no bound tying separate bearers' root-level grants together), so narrowing one bearer's policy is simply supplying a different nonDelegable set to that bearer's own resolution -- there is no prior per-bearer state to merge into, and an override naming zero verbs makes every capability delegable for that one bearer without touching the default any other bearer still resolves against.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* One issuer's non-delegable policy: `nonDelegable` is the default set of capability verbs this issuer never lets any bearer redelegate; `perAgentOverrides` narrows that default per bearer (device-id hex), replacing it outright for that bearer's own resolution rather than merging with it.
|
|
8
|
+
*/
|
|
9
|
+
export interface DelegationPolicy {
|
|
10
|
+
readonly nonDelegable: ReadonlySet<string>;
|
|
11
|
+
readonly perAgentOverrides?: ReadonlyMap<string, ReadonlySet<string>>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolves the delegationsRemaining value to actually mint for bearer's grant of capability under policy, given whatever delegationsRemaining the caller would otherwise request. Returns 0 when capability is on the bearer's own effective nonDelegable set (its per-agent override when policy defines one for that bearer, otherwise policy's own default set) -- overriding requested outright, the same "issuer refuses to mint an invalid delegation rather than let the far end discover it later" posture mintCapabilityToken's own parent narrowing already applies. Returns requested unchanged for every other capability.
|
|
15
|
+
*
|
|
16
|
+
* Overloaded on requested's own definiteness rather than always returning `number | undefined`: a caller minting a root-level grant always passes a definite `number` (mintCapabilityToken's own `delegationsRemaining?: number` field is entirely absent, never present-as-undefined, under this codebase's exactOptionalPropertyTypes), so the result at those call sites is provably a `number` too -- proper return-type narrowing in place of a defensive `?? 0` the caller would otherwise need purely to satisfy the type checker.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveDelegationsRemaining(policy: Readonly<DelegationPolicy>, capability: string, bearer: string, requested: number): number;
|
|
19
|
+
export declare function resolveDelegationsRemaining(policy: Readonly<DelegationPolicy>, capability: string, bearer: string, requested: undefined): undefined;
|
|
20
|
+
//# sourceMappingURL=delegation-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-policy.d.ts","sourceRoot":"","sources":["../../src/core/delegation-policy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;CACvE;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC;AACV,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,GACnB,SAAS,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Issuer-side delegation policy (agent-comms#163): deciding which capability verbs an issuer never lets a bearer redelegate, expressed entirely with wire-mesh-core's own shipped primitives. A capability on the policy's nonDelegable set is always minted with delegationsRemaining forced to 0 -- the grant is usable by its own bearer but cannot be passed further down the chain -- regardless of what the caller would otherwise request; mintCapabilityToken needs no change for this, since delegationsRemaining: 0 already means exactly "no further hops" (tokens-CpLDI5Fo.d.mts's own MintCapabilityTokenOptions.delegationsRemaining doc comment).
|
|
3
|
+
*
|
|
4
|
+
* Per-agent overrides are deliberately just a second, bearer-keyed nonDelegable set that entirely REPLACES the policy's own default for that one bearer, never merges with it. This needs no bookkeeping of its own: every bearer's grant is already its own independent mint (mintCapabilityToken places no bound tying separate bearers' root-level grants together), so narrowing one bearer's policy is simply supplying a different nonDelegable set to that bearer's own resolution -- there is no prior per-bearer state to merge into, and an override naming zero verbs makes every capability delegable for that one bearer without touching the default any other bearer still resolves against.
|
|
5
|
+
*/
|
|
6
|
+
export function resolveDelegationsRemaining(policy, capability, bearer, requested) {
|
|
7
|
+
const effectiveNonDelegable = policy.perAgentOverrides?.get(bearer) ?? policy.nonDelegable;
|
|
8
|
+
return effectiveNonDelegable.has(capability) ? 0 : requested;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=delegation-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-policy.js","sourceRoot":"","sources":["../../src/core/delegation-policy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH,MAAM,UAAU,2BAA2B,CACzC,MAAkC,EAClC,UAAkB,EAClB,MAAc,EACd,SAA6B;IAE7B,MAAM,qBAAqB,GACzB,MAAM,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC;IAC/D,OAAO,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device-to-user membership (agent-comms#161): the token a bridge device holds proving the user principal (core/user-identity.ts) admitted it -- "this device speaks for me". Layered on verifyCapabilityToken exactly the way room-token-verification.ts layers core/room's own obligations on top of it: a token bearing the right capability, scoped to the right group, whose delegation chain actually roots at the claimed user principal, never merely one that happens to carry a superficially matching scope.path. Unlike a room, a device-membership token has only one acceptable chain root ever -- the user principal itself -- there is no room-style "owner-named vs DM" distinction to branch on.
|
|
3
|
+
*/
|
|
4
|
+
import { type TokenVerdictReason, type VerifyCapabilityTokenOptions } from "wire-mesh-core/domain/tokens";
|
|
5
|
+
import type { CapabilityToken, DeviceId, TokenClaims } from "wire-mesh-core/generated/protocol";
|
|
6
|
+
/** The one capability a device presents to prove the user principal admitted it -- mirrors room:member's own "one resource, one verb" shape, scoped to tokens.cddl's `group` kind (a person's, team's, or organisation's own set of owned devices) rather than `room`. Registered at wire-mesh's spec/registry/core-capabilities.md as `group:member`, scope kind `group`, domain `core/management`. */
|
|
7
|
+
export declare const DEVICE_MEMBER_CAPABILITY = "group:member";
|
|
8
|
+
/** A user principal's own group scope path: every device-membership token's scope.path, and the group every one of the principal's admission grants roots at. Just the principal's own device-id in hex -- tokens.cddl's `group` scope kind has no identifier of its own separate from the device-id of the key the group is rooted at. */
|
|
9
|
+
export declare function userGroupPath(userDeviceId: Readonly<DeviceId>): string;
|
|
10
|
+
export type DeviceMembershipVerdictReason = TokenVerdictReason | "wrong_capability" | "wrong_scope_kind" | "wrong_scope_path" | "wrong_chain_root";
|
|
11
|
+
export type DeviceMembershipVerdict = {
|
|
12
|
+
ok: true;
|
|
13
|
+
claims: TokenClaims;
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
reason: DeviceMembershipVerdictReason;
|
|
17
|
+
};
|
|
18
|
+
export interface VerifyDeviceMembershipOptions extends Omit<VerifyCapabilityTokenOptions, "expectedBearer"> {
|
|
19
|
+
/** The device actually authenticated on the arriving connection (or otherwise known out of band) -- never a relay-asserted or gossip-derived value. Mandatory here, unlike verifyCapabilityToken's own optional field for a caller presenting a token to authorise itself. */
|
|
20
|
+
expectedBearer: DeviceId;
|
|
21
|
+
/** The user principal this membership is claimed to belong to. Determines both the expected scope.path (userGroupPath) and the delegation chain's only acceptable root -- a device-membership token minted by anyone other than this principal must never verify, regardless of what its scope claims. */
|
|
22
|
+
userDeviceId: DeviceId;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Verifies a `group:member` capability token: the token is a well-formed, currently valid capability token (verifyCapabilityToken's own obligations -- signature, expiry, revocation, bearer match), it actually carries the `group:member` capability (a token minted for some other capability that happens to be scoped to this group path must not pass just because scope.kind/path line up), its scope is the claimed user principal's own group, and its delegation chain roots at that principal's own device-id -- never at the bearer itself or any other device, since only the user principal may admit a device to its own group.
|
|
26
|
+
*/
|
|
27
|
+
export declare function verifyDeviceMembership(token: CapabilityToken, options: Readonly<VerifyDeviceMembershipOptions>): Promise<DeviceMembershipVerdict>;
|
|
28
|
+
//# sourceMappingURL=device-membership-verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-membership-verification.d.ts","sourceRoot":"","sources":["../../src/core/device-membership-verification.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,4BAA4B,EAClC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,WAAW,EACZ,MAAM,mCAAmC,CAAC;AAE3C,wYAAwY;AACxY,eAAO,MAAM,wBAAwB,iBAAiB,CAAC;AAEvD,2UAA2U;AAC3U,wBAAgB,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM,CAEtE;AAED,MAAM,MAAM,6BAA6B,GACrC,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACjC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,6BAA6B,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,4BAA4B,EAC5B,gBAAgB,CACjB;IACC,8QAA8Q;IAC9Q,cAAc,EAAE,QAAQ,CAAC;IACzB,0SAA0S;IAC1S,YAAY,EAAE,QAAQ,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAC/C,OAAO,CAAC,uBAAuB,CAAC,CA6BlC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device-to-user membership (agent-comms#161): the token a bridge device holds proving the user principal (core/user-identity.ts) admitted it -- "this device speaks for me". Layered on verifyCapabilityToken exactly the way room-token-verification.ts layers core/room's own obligations on top of it: a token bearing the right capability, scoped to the right group, whose delegation chain actually roots at the claimed user principal, never merely one that happens to carry a superficially matching scope.path. Unlike a room, a device-membership token has only one acceptable chain root ever -- the user principal itself -- there is no room-style "owner-named vs DM" distinction to branch on.
|
|
3
|
+
*/
|
|
4
|
+
import { verifyCapabilityToken, } from "wire-mesh-core/domain/tokens";
|
|
5
|
+
import { deviceIdToHex } from "wire-mesh-core/domain/device-id";
|
|
6
|
+
/** The one capability a device presents to prove the user principal admitted it -- mirrors room:member's own "one resource, one verb" shape, scoped to tokens.cddl's `group` kind (a person's, team's, or organisation's own set of owned devices) rather than `room`. Registered at wire-mesh's spec/registry/core-capabilities.md as `group:member`, scope kind `group`, domain `core/management`. */
|
|
7
|
+
export const DEVICE_MEMBER_CAPABILITY = "group:member";
|
|
8
|
+
/** A user principal's own group scope path: every device-membership token's scope.path, and the group every one of the principal's admission grants roots at. Just the principal's own device-id in hex -- tokens.cddl's `group` scope kind has no identifier of its own separate from the device-id of the key the group is rooted at. */
|
|
9
|
+
export function userGroupPath(userDeviceId) {
|
|
10
|
+
return deviceIdToHex(userDeviceId);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Verifies a `group:member` capability token: the token is a well-formed, currently valid capability token (verifyCapabilityToken's own obligations -- signature, expiry, revocation, bearer match), it actually carries the `group:member` capability (a token minted for some other capability that happens to be scoped to this group path must not pass just because scope.kind/path line up), its scope is the claimed user principal's own group, and its delegation chain roots at that principal's own device-id -- never at the bearer itself or any other device, since only the user principal may admit a device to its own group.
|
|
14
|
+
*/
|
|
15
|
+
export async function verifyDeviceMembership(token, options) {
|
|
16
|
+
const verdict = await verifyCapabilityToken(token, {
|
|
17
|
+
identity: options.identity,
|
|
18
|
+
clock: options.clock,
|
|
19
|
+
revocation: options.revocation,
|
|
20
|
+
expectedBearer: options.expectedBearer,
|
|
21
|
+
...(options.extraPredicateResolvers !== undefined
|
|
22
|
+
? { extraPredicateResolvers: options.extraPredicateResolvers }
|
|
23
|
+
: {}),
|
|
24
|
+
});
|
|
25
|
+
if (!verdict.ok) {
|
|
26
|
+
return verdict;
|
|
27
|
+
}
|
|
28
|
+
if (verdict.claims.capability !== DEVICE_MEMBER_CAPABILITY) {
|
|
29
|
+
return { ok: false, reason: "wrong_capability" };
|
|
30
|
+
}
|
|
31
|
+
if (verdict.claims.scope.kind !== "group") {
|
|
32
|
+
return { ok: false, reason: "wrong_scope_kind" };
|
|
33
|
+
}
|
|
34
|
+
const expectedGroupPath = userGroupPath(options.userDeviceId);
|
|
35
|
+
if (verdict.claims.scope.path !== expectedGroupPath) {
|
|
36
|
+
return { ok: false, reason: "wrong_scope_path" };
|
|
37
|
+
}
|
|
38
|
+
if (deviceIdToHex(verdict.rootIssuer) !== expectedGroupPath) {
|
|
39
|
+
return { ok: false, reason: "wrong_chain_root" };
|
|
40
|
+
}
|
|
41
|
+
return { ok: true, claims: verdict.claims };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=device-membership-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-membership-verification.js","sourceRoot":"","sources":["../../src/core/device-membership-verification.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,qBAAqB,GAGtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAOhE,wYAAwY;AACxY,MAAM,CAAC,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAEvD,2UAA2U;AAC3U,MAAM,UAAU,aAAa,CAAC,YAAgC;IAC5D,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAuBD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAsB,EACtB,OAAgD;IAEhD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,KAAK,EAAE;QACjD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,GAAG,CAAC,OAAO,CAAC,uBAAuB,KAAK,SAAS;YAC/C,CAAC,CAAC,EAAE,uBAAuB,EAAE,OAAO,CAAC,uBAAuB,EAAE;YAC9D,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,KAAK,wBAAwB,EAAE,CAAC;QAC3D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACnD,CAAC;IACD,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,iBAAiB,EAAE,CAAC;QAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device-to-user membership admission and removal (agent-comms#161): mints and revokes a device's own group:member grant from the user principal, the same "ordinary mint and revoke" mechanism room-lifecycle.ts's own kickFromRoom already uses for room-membership exclusion, rooted at the principal (core/user-identity.ts) rather than a room owner. Orchestrates mintCapabilityToken/mintRevocationEntry together with the principal's own issued-grant bookkeeping (user-identity.ts) so a later removal can find the right token-id to revoke -- the same tight coupling room-lifecycle.ts's own admission methods already have with identity-store.ts's issuedGrants, just here as plain functions rather than class methods, since there is no MeshStore-equivalent orchestrator for device membership yet.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately does not touch the admitted device's own identity-store.ts slot (its saveGroupToken/loadGroupTokens/deleteGroupToken): whether an admission happens entirely locally (the same process holding both the principal's key and the device's own slot) or needs to reach a different bridge process is a routing question this module makes no assumption about, so persisting the granted token into the recipient's own slot -- and broadcasting a removal's revocation entry to the mesh -- is left to the caller, which has that context.
|
|
5
|
+
*/
|
|
6
|
+
import { type MintVerdict } from "wire-mesh-core/domain/tokens";
|
|
7
|
+
import type { RevocationView } from "wire-mesh-core/domain/revocation-view";
|
|
8
|
+
import type { IdentityPort } from "wire-mesh-core/ports/identity";
|
|
9
|
+
import type { Clock } from "wire-mesh-core/ports/clock";
|
|
10
|
+
import type { DeviceId, RevocationEntry } from "wire-mesh-core/generated/protocol";
|
|
11
|
+
import { type UserIdentityOptions } from "./user-identity.js";
|
|
12
|
+
export interface AdmitDeviceOptions {
|
|
13
|
+
/** The user principal's own identity -- signs the membership grant. */
|
|
14
|
+
userIdentity: IdentityPort;
|
|
15
|
+
/** Directory override for tests, forwarded to user-identity.ts's own issued-grant storage -- must resolve to the same user-identity.json userIdentity's own key material lives in. */
|
|
16
|
+
userIdentityOptions?: UserIdentityOptions;
|
|
17
|
+
clock: Clock;
|
|
18
|
+
tokenId: Uint8Array<ArrayBuffer>;
|
|
19
|
+
/** The device being admitted. */
|
|
20
|
+
deviceId: DeviceId;
|
|
21
|
+
expires: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Mints deviceId's own group:member grant from the user principal: a root-level, non-delegable token scoped to the principal's own group (userGroupPath). On success, records the grant's token-id under the principal's own issued-grant store so a later removeDevice call can find it to revoke -- an admission without this bookkeeping would leave removal permanently unable to find what to revoke, so this is not optional side-book-keeping, it is what makes revocation possible at all.
|
|
25
|
+
*/
|
|
26
|
+
export declare function admitDevice(options: Readonly<AdmitDeviceOptions>): Promise<MintVerdict>;
|
|
27
|
+
export interface RemoveDeviceOptions {
|
|
28
|
+
/** The user principal's own identity -- only the principal that issued a device's membership may revoke it. */
|
|
29
|
+
userIdentity: IdentityPort;
|
|
30
|
+
userIdentityOptions?: UserIdentityOptions;
|
|
31
|
+
clock: Clock;
|
|
32
|
+
/** Recorded locally immediately, so this principal's own future verifications see the removal without waiting on gossip -- mirrors room-lifecycle.ts's own revokeMemberGrant ordering (record before broadcast). */
|
|
33
|
+
revocation: RevocationView;
|
|
34
|
+
deviceId: DeviceId;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Revokes deviceId's own group:member grant for real, if this principal ever recorded admitting it: mints a revocation-entry for its token-id, records it in the given RevocationView immediately, and forgets the issued-grant record (a later re-admission mints and records a genuinely fresh one rather than leaving a stale entry alongside it). Silently returns undefined when no issued-grant record exists (a device that was never actually admitted, or a grant predating this bookkeeping) -- mirrors room-lifecycle.ts's own revokeMemberGrant, which does the same for a room member.
|
|
38
|
+
*
|
|
39
|
+
* Returns the minted entry so the caller can broadcast it to the mesh (this module has no MeshTransport dependency to do so itself, mirroring the module-level "no assumption about locality" boundary documented above) -- every other device that might hold this device's grant, including other devices of this same user, needs the entry to independently start refusing it.
|
|
40
|
+
*/
|
|
41
|
+
export declare function removeDevice(options: Readonly<RemoveDeviceOptions>): Promise<RevocationEntry | undefined>;
|
|
42
|
+
//# sourceMappingURL=device-membership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-membership.d.ts","sourceRoot":"","sources":["../../src/core/device-membership.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EAChB,MAAM,mCAAmC,CAAC;AAK3C,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAK5B,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,YAAY,EAAE,YAAY,CAAC;IAC3B,sLAAsL;IACtL,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACjC,iCAAiC;IACjC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACpC,OAAO,CAAC,WAAW,CAAC,CAsBtB;AAED,MAAM,WAAW,mBAAmB;IAClC,+GAA+G;IAC/G,YAAY,EAAE,YAAY,CAAC;IAC3B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,KAAK,EAAE,KAAK,CAAC;IACb,oNAAoN;IACpN,UAAU,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GACrC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAatC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device-to-user membership admission and removal (agent-comms#161): mints and revokes a device's own group:member grant from the user principal, the same "ordinary mint and revoke" mechanism room-lifecycle.ts's own kickFromRoom already uses for room-membership exclusion, rooted at the principal (core/user-identity.ts) rather than a room owner. Orchestrates mintCapabilityToken/mintRevocationEntry together with the principal's own issued-grant bookkeeping (user-identity.ts) so a later removal can find the right token-id to revoke -- the same tight coupling room-lifecycle.ts's own admission methods already have with identity-store.ts's issuedGrants, just here as plain functions rather than class methods, since there is no MeshStore-equivalent orchestrator for device membership yet.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately does not touch the admitted device's own identity-store.ts slot (its saveGroupToken/loadGroupTokens/deleteGroupToken): whether an admission happens entirely locally (the same process holding both the principal's key and the device's own slot) or needs to reach a different bridge process is a routing question this module makes no assumption about, so persisting the granted token into the recipient's own slot -- and broadcasting a removal's revocation entry to the mesh -- is left to the caller, which has that context.
|
|
5
|
+
*/
|
|
6
|
+
import { mintCapabilityToken, mintRevocationEntry, } from "wire-mesh-core/domain/tokens";
|
|
7
|
+
import { deviceIdToHex } from "wire-mesh-core/domain/device-id";
|
|
8
|
+
import { DEVICE_MEMBER_CAPABILITY, userGroupPath, } from "./device-membership-verification.js";
|
|
9
|
+
import { deleteIssuedDeviceGrant, loadIssuedDeviceGrant, saveIssuedDeviceGrant, } from "./user-identity.js";
|
|
10
|
+
/** delegationsRemaining for every device-membership grant -- deliberately non-delegable: a device that could re-mint membership for another device would let any admitted device silently admit others, defeating the point of the principal being the one place admission is decided (the same reasoning room-lifecycle.ts's own mintOwnerRootGrant already documents for a room owner's self-grant). */
|
|
11
|
+
const NOT_DELEGABLE = 0;
|
|
12
|
+
/**
|
|
13
|
+
* Mints deviceId's own group:member grant from the user principal: a root-level, non-delegable token scoped to the principal's own group (userGroupPath). On success, records the grant's token-id under the principal's own issued-grant store so a later removeDevice call can find it to revoke -- an admission without this bookkeeping would leave removal permanently unable to find what to revoke, so this is not optional side-book-keeping, it is what makes revocation possible at all.
|
|
14
|
+
*/
|
|
15
|
+
export async function admitDevice(options) {
|
|
16
|
+
const verdict = await mintCapabilityToken({
|
|
17
|
+
identity: options.userIdentity,
|
|
18
|
+
clock: options.clock,
|
|
19
|
+
tokenId: options.tokenId,
|
|
20
|
+
bearer: options.deviceId,
|
|
21
|
+
capability: DEVICE_MEMBER_CAPABILITY,
|
|
22
|
+
scope: {
|
|
23
|
+
kind: "group",
|
|
24
|
+
path: userGroupPath(options.userIdentity.deviceId),
|
|
25
|
+
},
|
|
26
|
+
expires: options.expires,
|
|
27
|
+
delegationsRemaining: NOT_DELEGABLE,
|
|
28
|
+
});
|
|
29
|
+
if (!verdict.ok)
|
|
30
|
+
return verdict;
|
|
31
|
+
saveIssuedDeviceGrant(options.userIdentityOptions, deviceIdToHex(options.deviceId), options.tokenId);
|
|
32
|
+
return verdict;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Revokes deviceId's own group:member grant for real, if this principal ever recorded admitting it: mints a revocation-entry for its token-id, records it in the given RevocationView immediately, and forgets the issued-grant record (a later re-admission mints and records a genuinely fresh one rather than leaving a stale entry alongside it). Silently returns undefined when no issued-grant record exists (a device that was never actually admitted, or a grant predating this bookkeeping) -- mirrors room-lifecycle.ts's own revokeMemberGrant, which does the same for a room member.
|
|
36
|
+
*
|
|
37
|
+
* Returns the minted entry so the caller can broadcast it to the mesh (this module has no MeshTransport dependency to do so itself, mirroring the module-level "no assumption about locality" boundary documented above) -- every other device that might hold this device's grant, including other devices of this same user, needs the entry to independently start refusing it.
|
|
38
|
+
*/
|
|
39
|
+
export async function removeDevice(options) {
|
|
40
|
+
const deviceHex = deviceIdToHex(options.deviceId);
|
|
41
|
+
const tokenId = loadIssuedDeviceGrant(options.userIdentityOptions, deviceHex);
|
|
42
|
+
if (tokenId === undefined)
|
|
43
|
+
return undefined;
|
|
44
|
+
const entry = await mintRevocationEntry({
|
|
45
|
+
identity: options.userIdentity,
|
|
46
|
+
tokenId,
|
|
47
|
+
revokedAt: options.clock.now(),
|
|
48
|
+
});
|
|
49
|
+
await options.revocation.record(entry, { identity: options.userIdentity });
|
|
50
|
+
deleteIssuedDeviceGrant(options.userIdentityOptions, deviceHex);
|
|
51
|
+
return entry;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=device-membership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-membership.js","sourceRoot":"","sources":["../../src/core/device-membership.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAEpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAQhE,OAAO,EACL,wBAAwB,EACxB,aAAa,GACd,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAE5B,0YAA0Y;AAC1Y,MAAM,aAAa,GAAG,CAAC,CAAC;AAcxB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAqC;IAErC,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACxC,QAAQ,EAAE,OAAO,CAAC,YAAY;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,QAAQ;QACxB,UAAU,EAAE,wBAAwB;QACpC,KAAK,EAAE;YACL,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC;SACnD;QACD,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,oBAAoB,EAAE,aAAa;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC;IAEhC,qBAAqB,CACnB,OAAO,CAAC,mBAAmB,EAC3B,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC/B,OAAO,CAAC,OAAO,CAChB,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAYD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAsC;IAEtC,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAC9E,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE5C,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC;QACtC,QAAQ,EAAE,OAAO,CAAC,YAAY;QAC9B,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;KAC/B,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3E,uBAAuB,CAAC,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -34,6 +34,16 @@ export declare function loadRoomTokens(slot: Readonly<IdentitySlot>): Record<str
|
|
|
34
34
|
export declare function saveRoomToken(slot: Readonly<IdentitySlot>, roomPath: string, token: CapabilityToken): void;
|
|
35
35
|
/** Removes the persisted token for one room path, if any. A no-op if none was saved for that path. */
|
|
36
36
|
export declare function deleteRoomToken(slot: Readonly<IdentitySlot>, roomPath: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Every group-membership capability token this device's own identity holds (agent-comms#161), keyed by group path. Empty if this slot has never saved one (or the identity file doesn't exist yet -- call loadOrCreateIdentity first). The device-membership counterpart of loadRoomTokens.
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadGroupTokens(slot: Readonly<IdentitySlot>): Record<string, CapabilityToken>;
|
|
41
|
+
/**
|
|
42
|
+
* Persists this device's own group:member token for the given group path, surviving a restart the same way the identity it was minted against does. Overwrites any token already saved for that group path; leaves every other group's token and the identity's own key material untouched. The device-membership counterpart of saveRoomToken.
|
|
43
|
+
*/
|
|
44
|
+
export declare function saveGroupToken(slot: Readonly<IdentitySlot>, groupPath: string, token: CapabilityToken): void;
|
|
45
|
+
/** Removes the persisted token for one group path, if any. A no-op if none was saved for that path. The device-membership counterpart of deleteRoomToken. */
|
|
46
|
+
export declare function deleteGroupToken(slot: Readonly<IdentitySlot>, groupPath: string): void;
|
|
37
47
|
/**
|
|
38
48
|
* The token-id this identity itself minted for the given member's room:member grant, or undefined if none is on record (the slot has never admitted this member, or the record predates this bookkeeping). A room owner consults this to revoke a specific member's own grant later -- a token-id, unlike the token itself, is never presented on the wire and so is never obtainable except from this identity's own memory of having minted it.
|
|
39
49
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-store.d.ts","sourceRoot":"","sources":["../../src/core/identity-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAQzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"identity-store.d.ts","sourceRoot":"","sources":["../../src/core/identity-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAQzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA2ID,4UAA4U;AAC5U,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,MAAM,CAIhE;AAuCD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC3B,YAAY,CAgBd;AAkDD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAKtE;AAuBD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CASjC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,eAAe,GACrB,IAAI,CAaN;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,QAAQ,EAAE,MAAM,GACf,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CASjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,GACrB,IAAI,CAaN;AAED,6JAA6J;AAC7J,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,SAAS,EAAE,MAAM,GAChB,IAAI,CAUN;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS,CAQrC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,UAAU,GAClB,IAAI,CAcN;AAED,4PAA4P;AAC5P,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,IAAI,CASN"}
|
|
@@ -55,6 +55,13 @@ function isStoredIdentity(value) {
|
|
|
55
55
|
if (!Object.values(issuedGrants).every((v) => typeof v === "string"))
|
|
56
56
|
return false;
|
|
57
57
|
}
|
|
58
|
+
if ("groupTokens" in value) {
|
|
59
|
+
const { groupTokens } = value;
|
|
60
|
+
if (typeof groupTokens !== "object" || groupTokens === null)
|
|
61
|
+
return false;
|
|
62
|
+
if (!Object.values(groupTokens).every(isSerializedCapabilityToken))
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
58
65
|
return true;
|
|
59
66
|
}
|
|
60
67
|
function serializeToken(token) {
|
|
@@ -269,6 +276,43 @@ export function deleteRoomToken(slot, roomPath) {
|
|
|
269
276
|
const roomTokens = Object.fromEntries(Object.entries(stored.roomTokens).filter(([storedRoomPath]) => storedRoomPath !== roomPath));
|
|
270
277
|
writeStoredIdentity(identityFile, { ...stored, roomTokens });
|
|
271
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* Every group-membership capability token this device's own identity holds (agent-comms#161), keyed by group path. Empty if this slot has never saved one (or the identity file doesn't exist yet -- call loadOrCreateIdentity first). The device-membership counterpart of loadRoomTokens.
|
|
281
|
+
*/
|
|
282
|
+
export function loadGroupTokens(slot) {
|
|
283
|
+
const { identityFile } = slotPaths(slot);
|
|
284
|
+
const stored = readStoredIdentity(identityFile);
|
|
285
|
+
const serialized = stored?.groupTokens ?? {};
|
|
286
|
+
const tokens = {};
|
|
287
|
+
for (const [groupPath, token] of Object.entries(serialized)) {
|
|
288
|
+
tokens[groupPath] = deserializeToken(token);
|
|
289
|
+
}
|
|
290
|
+
return tokens;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Persists this device's own group:member token for the given group path, surviving a restart the same way the identity it was minted against does. Overwrites any token already saved for that group path; leaves every other group's token and the identity's own key material untouched. The device-membership counterpart of saveRoomToken.
|
|
294
|
+
*/
|
|
295
|
+
export function saveGroupToken(slot, groupPath, token) {
|
|
296
|
+
const { identityFile } = slotPaths(slot);
|
|
297
|
+
const stored = readStoredIdentity(identityFile);
|
|
298
|
+
if (stored === undefined) {
|
|
299
|
+
throw new Error(`no identity persisted for this slot yet -- call loadOrCreateIdentity first (${identityFile})`);
|
|
300
|
+
}
|
|
301
|
+
const groupTokens = {
|
|
302
|
+
...stored.groupTokens,
|
|
303
|
+
[groupPath]: serializeToken(token),
|
|
304
|
+
};
|
|
305
|
+
writeStoredIdentity(identityFile, { ...stored, groupTokens });
|
|
306
|
+
}
|
|
307
|
+
/** Removes the persisted token for one group path, if any. A no-op if none was saved for that path. The device-membership counterpart of deleteRoomToken. */
|
|
308
|
+
export function deleteGroupToken(slot, groupPath) {
|
|
309
|
+
const { identityFile } = slotPaths(slot);
|
|
310
|
+
const stored = readStoredIdentity(identityFile);
|
|
311
|
+
if (stored?.groupTokens === undefined)
|
|
312
|
+
return;
|
|
313
|
+
const groupTokens = Object.fromEntries(Object.entries(stored.groupTokens).filter(([storedGroupPath]) => storedGroupPath !== groupPath));
|
|
314
|
+
writeStoredIdentity(identityFile, { ...stored, groupTokens });
|
|
315
|
+
}
|
|
272
316
|
function issuedGrantKey(roomPath, memberDeviceHex) {
|
|
273
317
|
return `${roomPath}::${memberDeviceHex}`;
|
|
274
318
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-store.js","sourceRoot":"","sources":["../../src/core/identity-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"identity-store.js","sourceRoot":"","sources":["../../src/core/identity-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This package's own version, read once from its own package.json and cached -- the single source of truth whoami/update output (see tool.ts) and the npm version-drift check (see version-check.ts) both read from, rather than each independently locating and parsing the file.
|
|
3
|
+
*/
|
|
4
|
+
/** This package's own version, read from the package.json two directories up from this file -- tsconfig's rootDir/outDir mirror src/dist at the same depth, so the relative path resolves identically whether this runs from source or from the compiled dist output. Cached after the first successful read. */
|
|
5
|
+
export declare function getOwnPackageVersion(): string;
|
|
6
|
+
//# sourceMappingURL=package-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version.d.ts","sourceRoot":"","sources":["../../src/core/package-version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,iTAAiT;AACjT,wBAAgB,oBAAoB,IAAI,MAAM,CAW7C"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This package's own version, read once from its own package.json and cached -- the single source of truth whoami/update output (see tool.ts) and the npm version-drift check (see version-check.ts) both read from, rather than each independently locating and parsing the file.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
function isVersionedPackageJson(value) {
|
|
9
|
+
if (typeof value !== "object" || value === null)
|
|
10
|
+
return false;
|
|
11
|
+
if (!("version" in value))
|
|
12
|
+
return false;
|
|
13
|
+
return typeof value.version === "string";
|
|
14
|
+
}
|
|
15
|
+
let cachedVersion;
|
|
16
|
+
/** This package's own version, read from the package.json two directories up from this file -- tsconfig's rootDir/outDir mirror src/dist at the same depth, so the relative path resolves identically whether this runs from source or from the compiled dist output. Cached after the first successful read. */
|
|
17
|
+
export function getOwnPackageVersion() {
|
|
18
|
+
if (cachedVersion !== undefined)
|
|
19
|
+
return cachedVersion;
|
|
20
|
+
const packageJsonPath = path.join(moduleDir, "..", "..", "package.json");
|
|
21
|
+
const parsed = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
22
|
+
if (!isVersionedPackageJson(parsed)) {
|
|
23
|
+
throw new Error(`package.json at ${packageJsonPath} has no "version" string`);
|
|
24
|
+
}
|
|
25
|
+
cachedVersion = parsed.version;
|
|
26
|
+
return cachedVersion;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=package-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../src/core/package-version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,SAAS,sBAAsB,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC;AAC3C,CAAC;AAED,IAAI,aAAiC,CAAC;AAEtC,iTAAiT;AACjT,MAAM,UAAU,oBAAoB;IAClC,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC;IACtD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACzE,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,mBAAmB,eAAe,0BAA0B,CAC7D,CAAC;IACJ,CAAC;IACD,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/room-lifecycle.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"room-lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/room-lifecycle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAMhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,KAAK,EACV,aAAa,EAEb,IAAI,EACJ,WAAW,EACX,QAAQ,EACT,MAAM,YAAY,CAAC;AAiBpB,mWAAmW;AACnW,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnC,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,iBAAiB,CAAC;IACzC,gBAAgB,EAAE,MAAM,aAAa,CAAC;IACtC,cAAc,EAAE,IAAI,CAClB,cAAc,EACZ,MAAM,GACN,gBAAgB,GAChB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,iBAAiB,CACpB,CAAC;CACH;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,iBAAiB;IAEpD;;OAEG;YACW,kBAAkB;IA4B1B,UAAU,CACd,IAAI,EAAE,QAAQ,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,QAAQ,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,GACD,OAAO,CAAC,IAAI,CAAC;IAoCV,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAK9C,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IA6BrD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,cAAc;IA6D5B;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4DzD;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BzD;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgF9D;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C/D;;OAEG;YACW,eAAe;IAoC7B;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAmEhB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAehB;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxE;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAoBhB;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BlE"}
|