@dxos/credentials 0.8.4-main.c85a9c8dae → 0.8.4-main.cb12b3f963

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/lib/neutral/index.mjs +75 -311
  2. package/dist/lib/neutral/index.mjs.map +3 -3
  3. package/dist/lib/neutral/meta.json +1 -1
  4. package/dist/types/src/credentials/assertions.d.ts.map +1 -1
  5. package/dist/types/src/credentials/credential-factory.d.ts.map +1 -1
  6. package/dist/types/src/credentials/credential-generator.d.ts +3 -3
  7. package/dist/types/src/credentials/credential-generator.d.ts.map +1 -1
  8. package/dist/types/src/credentials/signing.d.ts.map +1 -1
  9. package/dist/types/src/credentials/verifier.d.ts.map +1 -1
  10. package/dist/types/src/did.d.ts.map +1 -1
  11. package/dist/types/src/graph/credential-graph.d.ts.map +1 -1
  12. package/dist/types/src/passcode.d.ts.map +1 -1
  13. package/dist/types/src/presentations/presentation.d.ts.map +1 -1
  14. package/dist/types/src/presentations/signing.d.ts.map +1 -1
  15. package/dist/types/src/presentations/verifier.d.ts.map +1 -1
  16. package/dist/types/src/processor/device-state-machine.d.ts.map +1 -1
  17. package/dist/types/src/processor/profile-state-machine.d.ts.map +1 -1
  18. package/dist/types/src/seedphrase.d.ts.map +1 -1
  19. package/dist/types/src/state-machine/feed-state-machine.d.ts.map +1 -1
  20. package/dist/types/src/state-machine/invitation-state-machine.d.ts.map +1 -1
  21. package/dist/types/src/state-machine/member-state-machine.d.ts.map +1 -1
  22. package/dist/types/src/state-machine/space-state-machine.d.ts +7 -1
  23. package/dist/types/src/state-machine/space-state-machine.d.ts.map +1 -1
  24. package/dist/types/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +12 -15
  26. package/src/credentials/credential-generator.ts +5 -0
  27. package/src/credentials/signing.ts +12 -0
  28. package/src/presentations/json-encoding.test.ts +0 -2
  29. package/src/presentations/presentation.ts +0 -1
  30. package/src/presentations/verifier.test.ts +0 -1
  31. package/src/presentations/verifier.ts +0 -1
  32. package/src/processor/device-state-machine.ts +0 -1
  33. package/src/processor/profile-state-machine.ts +0 -1
  34. package/src/state-machine/invitation-state-machine.test.ts +0 -1
  35. package/src/state-machine/member-state-machine.test.ts +0 -1
  36. package/src/state-machine/space-state-machine.test.ts +243 -2
  37. package/src/state-machine/space-state-machine.ts +20 -2
  38. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
@@ -28,15 +28,7 @@ import { invariant } from "@dxos/invariant";
28
28
  var __dxlog_file = "/__w/dxos/dxos/packages/core/halo/credentials/src/seedphrase.ts";
29
29
  var generateSeedPhrase = () => generateMnemonic();
30
30
  var keyPairFromSeedPhrase = (seedPhrase) => {
31
- invariant(seedPhrase, void 0, {
32
- F: __dxlog_file,
33
- L: 20,
34
- S: void 0,
35
- A: [
36
- "seedPhrase",
37
- ""
38
- ]
39
- });
31
+ invariant(seedPhrase, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 13, S: void 0, A: ["seedPhrase", ""] });
40
32
  const seed = mnemonicToSeedSync(seedPhrase);
41
33
  return createKeyPair(seed);
42
34
  };
@@ -68,6 +60,14 @@ var getCredentialProofPayload = (credential) => {
68
60
  delete copy.parentCredentialIds;
69
61
  }
70
62
  delete copy.id;
63
+ const assertion = copy.subject?.assertion;
64
+ if (assertion) {
65
+ for (const key of Object.keys(assertion)) {
66
+ if (Array.isArray(assertion[key]) && assertion[key].length === 0) {
67
+ delete assertion[key];
68
+ }
69
+ }
70
+ }
71
71
  return Buffer.from(canonicalStringify(copy));
72
72
  };
73
73
  var canonicalStringify = (obj) => stableStringify(obj, {
@@ -228,35 +228,11 @@ var verifyChain = async (chain, authority, subject) => {
228
228
  // src/credentials/credential-factory.ts
229
229
  var __dxlog_file2 = "/__w/dxos/dxos/packages/core/halo/credentials/src/credentials/credential-factory.ts";
230
230
  var createCredential = async ({ signer, issuer, subject, assertion, signingKey, chain, nonce, parentCredentialIds }) => {
231
- invariant2(assertion["@type"], "Invalid assertion.", {
232
- F: __dxlog_file2,
233
- L: 48,
234
- S: void 0,
235
- A: [
236
- "assertion['@type']",
237
- "'Invalid assertion.'"
238
- ]
239
- });
240
- invariant2(!!signingKey === !!chain, "Chain must be provided if and only if the signing key differs from the issuer.", {
241
- F: __dxlog_file2,
242
- L: 49,
243
- S: void 0,
244
- A: [
245
- "!!signingKey === !!chain",
246
- "'Chain must be provided if and only if the signing key differs from the issuer.'"
247
- ]
248
- });
231
+ invariant2(assertion["@type"], "Invalid assertion.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 12, S: void 0, A: ["assertion['@type']", "'Invalid assertion.'"] });
232
+ invariant2(!!signingKey === !!chain, "Chain must be provided if and only if the signing key differs from the issuer.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 13, S: void 0, A: ["!!signingKey === !!chain", "'Chain must be provided if and only if the signing key differs from the issuer.'"] });
249
233
  if (chain) {
250
234
  const result = await verifyChain(chain, issuer, signingKey);
251
- invariant2(result.kind === "pass", "Invalid chain.", {
252
- F: __dxlog_file2,
253
- L: 52,
254
- S: void 0,
255
- A: [
256
- "result.kind === 'pass'",
257
- "'Invalid chain.'"
258
- ]
259
- });
235
+ invariant2(result.kind === "pass", "Invalid chain.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 16, S: void 0, A: ["result.kind === 'pass'", "'Invalid chain.'"] });
260
236
  }
261
237
  const credential = {
262
238
  issuer,
@@ -314,7 +290,7 @@ var createCredentialSignerWithChain = (signer, chain, signingKey) => ({
314
290
  });
315
291
 
316
292
  // src/credentials/credential-generator.ts
317
- import { AdmittedFeed, SpaceMember } from "@dxos/protocols/proto/dxos/halo/credentials";
293
+ import { AdmittedFeed, MembershipPolicy, SpaceMember } from "@dxos/protocols/proto/dxos/halo/credentials";
318
294
  import { Timeframe as Timeframe2 } from "@dxos/timeframe";
319
295
  var CredentialGenerator = class {
320
296
  _signer;
@@ -328,7 +304,7 @@ var CredentialGenerator = class {
328
304
  /**
329
305
  * Create genesis messages for new Space.
330
306
  */
331
- async createSpaceGenesis(spaceKey, controlKey, creatorProfile) {
307
+ async createSpaceGenesis(spaceKey, controlKey, creatorProfile, membershipPolicy = MembershipPolicy.INVITE) {
332
308
  return [
333
309
  await createCredential({
334
310
  signer: this._signer,
@@ -336,7 +312,8 @@ var CredentialGenerator = class {
336
312
  subject: spaceKey,
337
313
  assertion: {
338
314
  "@type": "dxos.halo.credentials.SpaceGenesis",
339
- spaceKey
315
+ spaceKey,
316
+ membershipPolicy
340
317
  }
341
318
  }),
342
319
  await createCredential({
@@ -463,7 +440,7 @@ var createDeviceAuthorization = async (signer, identityKey, deviceKey) => {
463
440
  credential
464
441
  }));
465
442
  };
466
- var createAdmissionCredentials = async (signer, identityKey, spaceKey, genesisFeedKey, role = SpaceMember.Role.ADMIN, membershipChainHeads = [], profile, invitationCredentialId) => {
443
+ var createAdmissionCredentials = async (signer, identityKey, spaceKey, genesisFeedKey, role = SpaceMember.Role.ADMIN, membershipChainHeads = [], profile, invitationCredentialId, tags) => {
467
444
  const credentials = await Promise.all([
468
445
  await signer.createCredential({
469
446
  subject: identityKey,
@@ -474,7 +451,8 @@ var createAdmissionCredentials = async (signer, identityKey, spaceKey, genesisFe
474
451
  role,
475
452
  profile,
476
453
  genesisFeedKey,
477
- invitationCredentialId
454
+ invitationCredentialId,
455
+ tags: tags ?? []
478
456
  }
479
457
  })
480
458
  ]);
@@ -631,7 +609,7 @@ import { runInContextAsync, synchronized } from "@dxos/async";
631
609
  import { Context } from "@dxos/context";
632
610
  import { PublicKey as PublicKey8 } from "@dxos/keys";
633
611
  import { log as log3 } from "@dxos/log";
634
- import { SpaceMember as SpaceMember3 } from "@dxos/protocols/proto/dxos/halo/credentials";
612
+ import { MembershipPolicy as MembershipPolicy2, SpaceMember as SpaceMember3 } from "@dxos/protocols/proto/dxos/halo/credentials";
635
613
  import { Callback as Callback4, ComplexMap as ComplexMap6, ComplexSet as ComplexSet3 } from "@dxos/util";
636
614
 
637
615
  // src/state-machine/feed-state-machine.ts
@@ -657,24 +635,8 @@ var FeedStateMachine = class {
657
635
  */
658
636
  async process(credential, fromFeed) {
659
637
  const assertion = getCredentialAssertion(credential);
660
- invariant3(assertion["@type"] === "dxos.halo.credentials.AdmittedFeed", void 0, {
661
- F: __dxlog_file3,
662
- L: 47,
663
- S: this,
664
- A: [
665
- "assertion['@type'] === 'dxos.halo.credentials.AdmittedFeed'",
666
- ""
667
- ]
668
- });
669
- invariant3(assertion.spaceKey.equals(this._spaceKey), void 0, {
670
- F: __dxlog_file3,
671
- L: 48,
672
- S: this,
673
- A: [
674
- "assertion.spaceKey.equals(this._spaceKey)",
675
- ""
676
- ]
677
- });
638
+ invariant3(assertion["@type"] === "dxos.halo.credentials.AdmittedFeed", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 28, S: this, A: ["assertion['@type'] === 'dxos.halo.credentials.AdmittedFeed'", ""] });
639
+ invariant3(assertion.spaceKey.equals(this._spaceKey), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 29, S: this, A: ["assertion.spaceKey.equals(this._spaceKey)", ""] });
678
640
  const info = {
679
641
  key: credential.subject.id,
680
642
  credential,
@@ -837,12 +799,7 @@ var CredentialGraph = class {
837
799
  log.error("credential skipped because of the unknown parent", {
838
800
  credential,
839
801
  parentId
840
- }, {
841
- F: __dxlog_file4,
842
- L: 72,
843
- S: this,
844
- C: (f, a) => f(...a)
845
- });
802
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 70, S: this });
846
803
  continue;
847
804
  }
848
805
  parentVertex.children.push(newVertex);
@@ -859,29 +816,13 @@ var CredentialGraph = class {
859
816
  if (sentinelIdx >= 0) {
860
817
  vertex.children.splice(sentinelIdx, 1);
861
818
  const vertexInSentinelIdx = this._sentinel.parents.indexOf(vertex);
862
- invariant4(vertexInSentinelIdx >= 0, void 0, {
863
- F: __dxlog_file4,
864
- L: 90,
865
- S: this,
866
- A: [
867
- "vertexInSentinelIdx >= 0",
868
- ""
869
- ]
870
- });
819
+ invariant4(vertexInSentinelIdx >= 0, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 90, S: this, A: ["vertexInSentinelIdx >= 0", ""] });
871
820
  this._sentinel.parents.splice(vertexInSentinelIdx, 1);
872
821
  }
873
822
  }
874
823
  async _onVertexInserted(newVertex) {
875
824
  const { credential, assertion } = newVertex;
876
- invariant4(credential, void 0, {
877
- F: __dxlog_file4,
878
- L: 97,
879
- S: this,
880
- A: [
881
- "credential",
882
- ""
883
- ]
884
- });
825
+ invariant4(credential, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 96, S: this, A: ["credential", ""] });
885
826
  let changedSubjects = [];
886
827
  const isUpdateAppliedOnTopOfThePreviousState = this._sentinel.parents.length === 1;
887
828
  if (isUpdateAppliedOnTopOfThePreviousState) {
@@ -918,21 +859,11 @@ var CredentialGraph = class {
918
859
  const path = paths.pop();
919
860
  log("visit vertex", {
920
861
  id: path.head.id
921
- }, {
922
- F: __dxlog_file4,
923
- L: 132,
924
- S: this,
925
- C: (f, a) => f(...a)
926
- });
862
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 131, S: this });
927
863
  this._updatePathState(path);
928
864
  const convergedPaths = this._handleMergePoint(paths, pendingPaths, path);
929
865
  if (convergedPaths == null) {
930
- log("waiting for other paths", void 0, {
931
- F: __dxlog_file4,
932
- L: 136,
933
- S: this,
934
- C: (f, a) => f(...a)
935
- });
866
+ log("waiting for other paths", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 137, S: this });
936
867
  continue;
937
868
  }
938
869
  const mergeResult = this._mergePaths(convergedPaths);
@@ -956,12 +887,7 @@ var CredentialGraph = class {
956
887
  path: toChosenPath(p),
957
888
  head: p.head.id
958
889
  }))
959
- }, {
960
- F: __dxlog_file4,
961
- L: 155,
962
- S: this,
963
- C: (f, a) => f(...a)
964
- });
890
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 156, S: this });
965
891
  }
966
892
  return this._setCurrentState(lastPath);
967
893
  }
@@ -982,12 +908,7 @@ var CredentialGraph = class {
982
908
  path: toChosenPath(path),
983
909
  overrides: path?.stateOverrides?.mapValues((v) => this._stateHandler.toLogString(v.assertion))
984
910
  }))
985
- }), {
986
- F: __dxlog_file4,
987
- L: 175,
988
- S: this,
989
- C: (f, a) => f(...a)
990
- });
911
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 175, S: this });
991
912
  const clearedPending = convergedPaths.filter((l) => !mergeResult.replay.includes(l));
992
913
  pendingPaths.set(convergedPaths[0].head.id, clearedPending);
993
914
  }
@@ -999,12 +920,7 @@ var CredentialGraph = class {
999
920
  return null;
1000
921
  }
1001
922
  if (path.head.id === this._sentinel.id && paths.length > 0) {
1002
- log("waiting for all the active paths to converge on the sentinel", void 0, {
1003
- F: __dxlog_file4,
1004
- L: 199,
1005
- S: this,
1006
- C: (f, a) => f(...a)
1007
- });
923
+ log("waiting for all the active paths to converge on the sentinel", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 194, S: this });
1008
924
  return null;
1009
925
  }
1010
926
  pendingPaths.delete(path.head.id);
@@ -1029,12 +945,7 @@ var CredentialGraph = class {
1029
945
  log("path state updated", () => ({
1030
946
  subject: updatedSubject,
1031
947
  newState: this._stateHandler.toLogString(path.head.assertion)
1032
- }), {
1033
- F: __dxlog_file4,
1034
- L: 223,
1035
- S: this,
1036
- C: (f, a) => f(...a)
1037
- });
948
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 217, S: this });
1038
949
  }
1039
950
  }
1040
951
  _forkTraversal(paths, path) {
@@ -1044,12 +955,7 @@ var CredentialGraph = class {
1044
955
  log("edge traversal", {
1045
956
  from: path.head.id,
1046
957
  to: choice.id
1047
- }, {
1048
- F: __dxlog_file4,
1049
- L: 234,
1050
- S: this,
1051
- C: (f, a) => f(...a)
1052
- });
958
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 227, S: this });
1053
959
  const fork = {
1054
960
  forkPoint: path,
1055
961
  chosenPath: {
@@ -1142,15 +1048,7 @@ var CredentialGraph = class {
1142
1048
  return path;
1143
1049
  }
1144
1050
  _mergePaths(convergedPaths) {
1145
- invariant4(convergedPaths.length >= 1, void 0, {
1146
- F: __dxlog_file4,
1147
- L: 324,
1148
- S: this,
1149
- A: [
1150
- "convergedPaths.length >= 1",
1151
- ""
1152
- ]
1153
- });
1051
+ invariant4(convergedPaths.length >= 1, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 320, S: this, A: ["convergedPaths.length >= 1", ""] });
1154
1052
  if (convergedPaths.length === 1) {
1155
1053
  return {
1156
1054
  type: "merged",
@@ -1162,22 +1060,9 @@ var CredentialGraph = class {
1162
1060
  forkPointId: forkPoint.head.id,
1163
1061
  pathCount: convergedPaths.length,
1164
1062
  forkPoints: convergedPaths.map((fp) => fp.forkPoint?.head.id)
1165
- }), {
1166
- F: __dxlog_file4,
1167
- L: 329,
1168
- S: this,
1169
- C: (f, a) => f(...a)
1170
- });
1063
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 328, S: this });
1171
1064
  const paths = convergedPaths.map((p) => this._moveUpToForkPoint(forkPoint, p));
1172
- invariant4(forkPoint, void 0, {
1173
- F: __dxlog_file4,
1174
- L: 335,
1175
- S: this,
1176
- A: [
1177
- "forkPoint",
1178
- ""
1179
- ]
1180
- });
1065
+ invariant4(forkPoint, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 334, S: this, A: ["forkPoint", ""] });
1181
1066
  const result = {
1182
1067
  forkPoint: forkPoint.forkPoint,
1183
1068
  chosenPath: {
@@ -1198,12 +1083,7 @@ var CredentialGraph = class {
1198
1083
  modified: path.forkChangedSubjects,
1199
1084
  forkIssuers: path.forkIssuers,
1200
1085
  state: path.state.mapValues((v) => this._stateHandler.toLogString(v.assertion))
1201
- }), {
1202
- F: __dxlog_file4,
1203
- L: 348,
1204
- S: this,
1205
- C: (f, a) => f(...a)
1206
- });
1086
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 350, S: this });
1207
1087
  path.forkIssuers.forEach((iss) => result.forkIssuers.add(iss));
1208
1088
  path.credentials.forEach((cred) => result.credentials.add(cred));
1209
1089
  result.chosenPath[forkPoint.head.id].push(...path.chosenPath[forkPoint.head.id] ?? []);
@@ -1223,12 +1103,7 @@ var CredentialGraph = class {
1223
1103
  log("set subject state", () => ({
1224
1104
  subject,
1225
1105
  state: this._stateHandler.toLogString(vertex.assertion)
1226
- }), {
1227
- F: __dxlog_file4,
1228
- L: 370,
1229
- S: this,
1230
- C: (f, a) => f(...a)
1231
- });
1106
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 372, S: this });
1232
1107
  const otherPaths = paths.filter((p) => p !== branch);
1233
1108
  this._stateHandler.getConflictingPaths(otherPaths, vertex).forEach(addReplayPath);
1234
1109
  }
@@ -1267,12 +1142,7 @@ var CredentialGraph = class {
1267
1142
  if (candidateVertex.id === mergePointId || currentVertex.id === mergePointId) {
1268
1143
  log("merge point chosen to break the tie", {
1269
1144
  mergePointId: existing.head.id
1270
- }, {
1271
- F: __dxlog_file4,
1272
- L: 408,
1273
- S: this,
1274
- C: (f, a) => f(...a)
1275
- });
1145
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 412, S: this });
1276
1146
  return mergePointId === candidateVertex.id;
1277
1147
  }
1278
1148
  const candidateCredential = candidateVertex.credential;
@@ -1281,12 +1151,7 @@ var CredentialGraph = class {
1281
1151
  log("one of the credentials was overridden in another branch", {
1282
1152
  current: currentVertex.id,
1283
1153
  candidate: candidateVertex.id
1284
- }, {
1285
- F: __dxlog_file4,
1286
- L: 415,
1287
- S: this,
1288
- C: (f, a) => f(...a)
1289
- });
1154
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 421, S: this });
1290
1155
  return candidate.credentials.has(currentCredential.id);
1291
1156
  }
1292
1157
  const winningCredential = this._stateHandler.tryPickWinningUpdate(existing, currentCredential, candidate, candidateCredential);
@@ -1299,20 +1164,10 @@ var CredentialGraph = class {
1299
1164
  existing.forkIssuers.size,
1300
1165
  candidate.forkIssuers.size
1301
1166
  ]
1302
- }, {
1303
- F: __dxlog_file4,
1304
- L: 432,
1305
- S: this,
1306
- C: (f, a) => f(...a)
1307
- });
1167
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 433, S: this });
1308
1168
  return candidate.forkIssuers.size > existing.forkIssuers.size;
1309
1169
  }
1310
- log("issuance date used to break the tie", void 0, {
1311
- F: __dxlog_file4,
1312
- L: 437,
1313
- S: this,
1314
- C: (f, a) => f(...a)
1315
- });
1170
+ log("issuance date used to break the tie", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 441, S: this });
1316
1171
  return candidateCredential.issuanceDate.getTime() > currentCredential.issuanceDate.getTime();
1317
1172
  }
1318
1173
  _createRootPath() {
@@ -1364,15 +1219,7 @@ var MemberStateMachine = class {
1364
1219
  const assertion = getCredentialAssertion(credential);
1365
1220
  switch (assertion["@type"]) {
1366
1221
  case "dxos.halo.credentials.SpaceMember": {
1367
- invariant5(assertion.spaceKey.equals(this._spaceKey), void 0, {
1368
- F: __dxlog_file5,
1369
- L: 66,
1370
- S: this,
1371
- A: [
1372
- "assertion.spaceKey.equals(this._spaceKey)",
1373
- ""
1374
- ]
1375
- });
1222
+ invariant5(assertion.spaceKey.equals(this._spaceKey), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 43, S: this, A: ["assertion.spaceKey.equals(this._spaceKey)", ""] });
1376
1223
  if (this._ownerKey == null && credential.issuer === this._spaceKey) {
1377
1224
  this._ownerKey = credential.subject.id;
1378
1225
  }
@@ -1389,12 +1236,7 @@ var MemberStateMachine = class {
1389
1236
  } else {
1390
1237
  log2.warn("Member not found", {
1391
1238
  id: credential.subject.id
1392
- }, {
1393
- F: __dxlog_file5,
1394
- L: 81,
1395
- S: this,
1396
- C: (f, a) => f(...a)
1397
- });
1239
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 59, S: this });
1398
1240
  }
1399
1241
  this._memberProfiles.set(credential.subject.id, assertion.profile);
1400
1242
  break;
@@ -1439,12 +1281,7 @@ var MemberStateMachine = class {
1439
1281
  const path1IssuerRole = this._getRole(scope1, update1.issuer);
1440
1282
  const path2IssuerRole = this._getRole(scope2, update2.issuer);
1441
1283
  if (path2IssuerRole === SpaceMember2.Role.OWNER !== (path1IssuerRole === SpaceMember2.Role.OWNER)) {
1442
- log2("owner decision used to break the tie", void 0, {
1443
- F: __dxlog_file5,
1444
- L: 139,
1445
- S: this,
1446
- C: (f, a) => f(...a)
1447
- });
1284
+ log2("owner decision used to break the tie", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 107, S: this });
1448
1285
  return path1IssuerRole === SpaceMember2.Role.OWNER ? update1 : update2;
1449
1286
  }
1450
1287
  return null;
@@ -1468,12 +1305,7 @@ var MemberStateMachine = class {
1468
1305
  headId: scope.head?.id,
1469
1306
  roleOverride: this.toLogString(override.assertion),
1470
1307
  realRole: this.toLogString(scope.state.get(memberId)?.assertion)
1471
- }), {
1472
- F: __dxlog_file5,
1473
- L: 162,
1474
- S: this,
1475
- C: (f, a) => f(...a)
1476
- });
1308
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 127, S: this });
1477
1309
  return override.assertion.role;
1478
1310
  }
1479
1311
  }
@@ -1482,13 +1314,13 @@ var MemberStateMachine = class {
1482
1314
  };
1483
1315
 
1484
1316
  // src/state-machine/space-state-machine.ts
1317
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-machine/space-state-machine.ts";
1485
1318
  function _ts_decorate(decorators, target, key, desc) {
1486
1319
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1487
1320
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1488
1321
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1489
1322
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1490
1323
  }
1491
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-machine/space-state-machine.ts";
1492
1324
  var SpaceStateMachine = class {
1493
1325
  _spaceKey;
1494
1326
  _members;
@@ -1498,6 +1330,8 @@ var SpaceStateMachine = class {
1498
1330
  _credentialsById = new ComplexMap6(PublicKey8.hash);
1499
1331
  _processedCredentials = new ComplexSet3(PublicKey8.hash);
1500
1332
  _genesisCredential;
1333
+ _tags = [];
1334
+ _membershipPolicy = MembershipPolicy2.INVITE;
1501
1335
  _credentialProcessors = [];
1502
1336
  onCredentialProcessed = new Callback4();
1503
1337
  onMemberRoleChanged;
@@ -1532,6 +1366,12 @@ var SpaceStateMachine = class {
1532
1366
  get genesisCredential() {
1533
1367
  return this._genesisCredential;
1534
1368
  }
1369
+ get tags() {
1370
+ return this._tags;
1371
+ }
1372
+ get membershipPolicy() {
1373
+ return this._membershipPolicy;
1374
+ }
1535
1375
  get invitations() {
1536
1376
  return this._invitations.invitations;
1537
1377
  }
@@ -1571,12 +1411,7 @@ var SpaceStateMachine = class {
1571
1411
  if (!skipVerification) {
1572
1412
  const result = await verifyCredential(credential);
1573
1413
  if (result.kind !== "pass") {
1574
- log3.warn(`Invalid credential: ${result.errors.join(", ")}`, void 0, {
1575
- F: __dxlog_file6,
1576
- L: 162,
1577
- S: this,
1578
- C: (f, a) => f(...a)
1579
- });
1414
+ log3.warn(`Invalid credential: ${result.errors.join(", ")}`, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 116, S: this });
1580
1415
  return false;
1581
1416
  }
1582
1417
  }
@@ -1584,33 +1419,20 @@ var SpaceStateMachine = class {
1584
1419
  switch (assertion["@type"]) {
1585
1420
  case "dxos.halo.credentials.SpaceGenesis": {
1586
1421
  if (this._genesisCredential) {
1587
- log3.warn("Space already has a genesis credential.", void 0, {
1588
- F: __dxlog_file6,
1589
- L: 171,
1590
- S: this,
1591
- C: (f, a) => f(...a)
1592
- });
1422
+ log3.warn("Space already has a genesis credential.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 125, S: this });
1593
1423
  return false;
1594
1424
  }
1595
1425
  if (!credential.issuer.equals(this._spaceKey)) {
1596
- log3.warn("Space genesis credential must be issued by space.", void 0, {
1597
- F: __dxlog_file6,
1598
- L: 175,
1599
- S: this,
1600
- C: (f, a) => f(...a)
1601
- });
1426
+ log3.warn("Space genesis credential must be issued by space.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 129, S: this });
1602
1427
  return false;
1603
1428
  }
1604
1429
  if (!credential.subject.id.equals(this._spaceKey)) {
1605
- log3.warn("Space genesis credential must be issued to space.", void 0, {
1606
- F: __dxlog_file6,
1607
- L: 179,
1608
- S: this,
1609
- C: (f, a) => f(...a)
1610
- });
1430
+ log3.warn("Space genesis credential must be issued to space.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 133, S: this });
1611
1431
  return false;
1612
1432
  }
1613
1433
  this._genesisCredential = credential;
1434
+ this._tags = assertion.tags ?? [];
1435
+ this._membershipPolicy = assertion.membershipPolicy ?? MembershipPolicy2.INVITE;
1614
1436
  break;
1615
1437
  }
1616
1438
  case "dxos.halo.credentials.SpaceMember": {
@@ -1618,21 +1440,11 @@ var SpaceStateMachine = class {
1618
1440
  break;
1619
1441
  }
1620
1442
  if (!this._genesisCredential) {
1621
- log3.warn("Space must have a genesis credential before adding members.", void 0, {
1622
- F: __dxlog_file6,
1623
- L: 192,
1624
- S: this,
1625
- C: (f, a) => f(...a)
1626
- });
1443
+ log3.warn("Space must have a genesis credential before adding members.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 147, S: this });
1627
1444
  return false;
1628
1445
  }
1629
1446
  if (!this._canInviteNewMembers(credential.issuer)) {
1630
- log3.warn(`Space member is not authorized to invite new members: ${credential.issuer}`, void 0, {
1631
- F: __dxlog_file6,
1632
- L: 196,
1633
- S: this,
1634
- C: (f, a) => f(...a)
1635
- });
1447
+ log3.warn(`Space member is not authorized to invite new members: ${credential.issuer}`, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 151, S: this });
1636
1448
  return false;
1637
1449
  }
1638
1450
  await this._members.process(credential);
@@ -1641,12 +1453,7 @@ var SpaceStateMachine = class {
1641
1453
  }
1642
1454
  case "dxos.halo.credentials.MemberProfile": {
1643
1455
  if (!this._genesisCredential) {
1644
- log3.warn("Space must have a genesis credential before adding members.", void 0, {
1645
- F: __dxlog_file6,
1646
- L: 207,
1647
- S: this,
1648
- C: (f, a) => f(...a)
1649
- });
1456
+ log3.warn("Space must have a genesis credential before adding members.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 161, S: this });
1650
1457
  return false;
1651
1458
  }
1652
1459
  await this._members.process(credential);
@@ -1654,12 +1461,7 @@ var SpaceStateMachine = class {
1654
1461
  }
1655
1462
  case "dxos.halo.credentials.AdmittedFeed": {
1656
1463
  if (!this._genesisCredential) {
1657
- log3.warn("Space must have a genesis credential before admitting feeds.", void 0, {
1658
- F: __dxlog_file6,
1659
- L: 217,
1660
- S: this,
1661
- C: (f, a) => f(...a)
1662
- });
1464
+ log3.warn("Space must have a genesis credential before admitting feeds.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 170, S: this });
1663
1465
  return false;
1664
1466
  }
1665
1467
  await this._feeds.process(credential, sourceFeed);
@@ -1668,12 +1470,7 @@ var SpaceStateMachine = class {
1668
1470
  case "dxos.halo.invitations.CancelDelegatedInvitation":
1669
1471
  case "dxos.halo.invitations.DelegateSpaceInvitation": {
1670
1472
  if (!this._canInviteNewMembers(credential.issuer)) {
1671
- log3.warn(`Invalid invitation, space member is not authorized to invite new members: ${credential.issuer}`, void 0, {
1672
- F: __dxlog_file6,
1673
- L: 228,
1674
- S: this,
1675
- C: (f, a) => f(...a)
1676
- });
1473
+ log3.warn(`Invalid invitation, space member is not authorized to invite new members: ${credential.issuer}`, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 181, S: this });
1677
1474
  return false;
1678
1475
  }
1679
1476
  await this._invitations.process(credential);
@@ -1704,6 +1501,9 @@ var SpaceStateMachine = class {
1704
1501
  return this._canInviteNewMembers(memberKey);
1705
1502
  }
1706
1503
  _canInviteNewMembers(key) {
1504
+ if (this._membershipPolicy === MembershipPolicy2.LOCKED) {
1505
+ return key.equals(this._spaceKey) && this._members.members.size === 0;
1506
+ }
1707
1507
  return key.equals(this._spaceKey) || this._members.getRole(key) === SpaceMember3.Role.ADMIN || this._members.getRole(key) === SpaceMember3.Role.OWNER;
1708
1508
  }
1709
1509
  };
@@ -1714,10 +1514,7 @@ var CredentialConsumer = class {
1714
1514
  processor;
1715
1515
  _onOpen;
1716
1516
  _onClose;
1717
- _ctx = new Context(void 0, {
1718
- F: __dxlog_file6,
1719
- L: 273
1720
- });
1517
+ _ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 229 });
1721
1518
  /**
1722
1519
  * @internal
1723
1520
  * Processor is ready to process live credentials.
@@ -1771,12 +1568,7 @@ var DeviceStateMachine = class {
1771
1568
  identityKey: this._params.identityKey,
1772
1569
  deviceKey: this._params.deviceKey,
1773
1570
  credential
1774
- }, {
1775
- F: __dxlog_file7,
1776
- L: 36,
1777
- S: this,
1778
- C: (f, a) => f(...a)
1779
- });
1571
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 22, S: this });
1780
1572
  if (isValidAuthorizedDeviceCredential(credential, this._params.identityKey, this._params.deviceKey)) {
1781
1573
  this.deviceCredentialChain = {
1782
1574
  credential
@@ -1791,35 +1583,17 @@ var DeviceStateMachine = class {
1791
1583
  localDeviceKey: this._params.deviceKey,
1792
1584
  deviceKey: assertion.deviceKey,
1793
1585
  size: this.authorizedDeviceKeys.size
1794
- }, {
1795
- F: __dxlog_file7,
1796
- L: 56,
1797
- S: this,
1798
- C: (f, a) => f(...a)
1799
- });
1586
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 41, S: this });
1800
1587
  this._params.onUpdate?.();
1801
1588
  break;
1802
1589
  }
1803
1590
  case "dxos.halo.credentials.DeviceProfile": {
1804
- invariant6(this.authorizedDeviceKeys.has(credential.subject.id), "Device not found.", {
1805
- F: __dxlog_file7,
1806
- L: 66,
1807
- S: this,
1808
- A: [
1809
- "this.authorizedDeviceKeys.has(credential.subject.id)",
1810
- "'Device not found.'"
1811
- ]
1812
- });
1591
+ invariant6(this.authorizedDeviceKeys.has(credential.subject.id), "Device not found.", { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 51, S: this, A: ["this.authorizedDeviceKeys.has(credential.subject.id)", "'Device not found.'"] });
1813
1592
  if (assertion && credential.subject.id.equals(this._params.deviceKey)) {
1814
1593
  log4.trace("dxos.halo.device", {
1815
1594
  deviceKey: credential.subject.id,
1816
1595
  profile: assertion.profile
1817
- }, {
1818
- F: __dxlog_file7,
1819
- L: 69,
1820
- S: this,
1821
- C: (f, a) => f(...a)
1822
- });
1596
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 53, S: this });
1823
1597
  }
1824
1598
  this.authorizedDeviceKeys.set(credential.subject.id, assertion.profile);
1825
1599
  this._params.onUpdate?.();
@@ -1847,24 +1621,14 @@ var ProfileStateMachine = class {
1847
1621
  log5.warn("Invalid profile credential", {
1848
1622
  expectedIdentity: this._params.identityKey,
1849
1623
  credential
1850
- }, {
1851
- F: __dxlog_file8,
1852
- L: 35,
1853
- S: this,
1854
- C: (f, a) => f(...a)
1855
- });
1624
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 21, S: this });
1856
1625
  return;
1857
1626
  }
1858
1627
  this.profile = assertion.profile;
1859
1628
  log5("updated profile", {
1860
1629
  identityKey: this._params.identityKey,
1861
1630
  profile: this.profile
1862
- }, {
1863
- F: __dxlog_file8,
1864
- L: 41,
1865
- S: this,
1866
- C: (f, a) => f(...a)
1867
- });
1631
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 29, S: this });
1868
1632
  this._params.onUpdate?.();
1869
1633
  break;
1870
1634
  }