@dxos/credentials 0.8.4-main.f5c0578 → 0.8.4-main.fcc0d83b33

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 (50) hide show
  1. package/dist/lib/{browser → neutral}/index.mjs +106 -366
  2. package/dist/lib/neutral/index.mjs.map +7 -0
  3. package/dist/lib/neutral/meta.json +1 -0
  4. package/dist/types/src/credentials/assertions.d.ts.map +1 -1
  5. package/dist/types/src/credentials/credential-factory.d.ts +4 -4
  6. package/dist/types/src/credentials/credential-factory.d.ts.map +1 -1
  7. package/dist/types/src/credentials/credential-generator.d.ts +3 -3
  8. package/dist/types/src/credentials/credential-generator.d.ts.map +1 -1
  9. package/dist/types/src/credentials/signing.d.ts.map +1 -1
  10. package/dist/types/src/credentials/verifier.d.ts.map +1 -1
  11. package/dist/types/src/did.d.ts.map +1 -1
  12. package/dist/types/src/graph/credential-graph.d.ts.map +1 -1
  13. package/dist/types/src/passcode.d.ts.map +1 -1
  14. package/dist/types/src/presentations/presentation.d.ts.map +1 -1
  15. package/dist/types/src/presentations/signing.d.ts.map +1 -1
  16. package/dist/types/src/presentations/verifier.d.ts.map +1 -1
  17. package/dist/types/src/processor/device-state-machine.d.ts +2 -2
  18. package/dist/types/src/processor/device-state-machine.d.ts.map +1 -1
  19. package/dist/types/src/processor/profile-state-machine.d.ts +2 -2
  20. package/dist/types/src/processor/profile-state-machine.d.ts.map +1 -1
  21. package/dist/types/src/seedphrase.d.ts.map +1 -1
  22. package/dist/types/src/state-machine/feed-state-machine.d.ts.map +1 -1
  23. package/dist/types/src/state-machine/invitation-state-machine.d.ts.map +1 -1
  24. package/dist/types/src/state-machine/member-state-machine.d.ts.map +1 -1
  25. package/dist/types/src/state-machine/space-state-machine.d.ts +7 -1
  26. package/dist/types/src/state-machine/space-state-machine.d.ts.map +1 -1
  27. package/dist/types/tsconfig.tsbuildinfo +1 -1
  28. package/docs/README.md +17 -17
  29. package/moon.yml +2 -1
  30. package/package.json +19 -23
  31. package/src/credentials/credential-factory.ts +4 -4
  32. package/src/credentials/credential-generator.ts +5 -0
  33. package/src/credentials/signing.ts +12 -0
  34. package/src/presentations/json-encoding.test.ts +0 -2
  35. package/src/presentations/presentation.ts +0 -1
  36. package/src/presentations/verifier.test.ts +0 -1
  37. package/src/presentations/verifier.ts +0 -1
  38. package/src/processor/device-state-machine.ts +2 -3
  39. package/src/processor/profile-state-machine.ts +2 -3
  40. package/src/state-machine/invitation-state-machine.test.ts +0 -1
  41. package/src/state-machine/member-state-machine.test.ts +0 -1
  42. package/src/state-machine/space-state-machine.test.ts +243 -2
  43. package/src/state-machine/space-state-machine.ts +20 -2
  44. package/vitest.config.ts +7 -6
  45. package/.swc/plugins/v7_linux_x86_64_13.0.0/c614d7475354583212fbd7669acbae95b9832c305bf51bdaabe2e6de05abb6bf +0 -0
  46. package/dist/lib/browser/index.mjs.map +0 -7
  47. package/dist/lib/browser/meta.json +0 -1
  48. package/dist/lib/node-esm/index.mjs +0 -1936
  49. package/dist/lib/node-esm/index.mjs.map +0 -7
  50. package/dist/lib/node-esm/meta.json +0 -1
@@ -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
@@ -641,12 +619,10 @@ import { Callback, ComplexMap as ComplexMap2 } from "@dxos/util";
641
619
  var __dxlog_file3 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-machine/feed-state-machine.ts";
642
620
  var FeedStateMachine = class {
643
621
  _spaceKey;
644
- _feeds;
645
- onFeedAdmitted;
622
+ _feeds = new ComplexMap2(PublicKey4.hash);
623
+ onFeedAdmitted = new Callback();
646
624
  constructor(_spaceKey) {
647
625
  this._spaceKey = _spaceKey;
648
- this._feeds = new ComplexMap2(PublicKey4.hash);
649
- this.onFeedAdmitted = new Callback();
650
626
  }
651
627
  get feeds() {
652
628
  return this._feeds;
@@ -659,24 +635,8 @@ var FeedStateMachine = class {
659
635
  */
660
636
  async process(credential, fromFeed) {
661
637
  const assertion = getCredentialAssertion(credential);
662
- invariant3(assertion["@type"] === "dxos.halo.credentials.AdmittedFeed", void 0, {
663
- F: __dxlog_file3,
664
- L: 47,
665
- S: this,
666
- A: [
667
- "assertion['@type'] === 'dxos.halo.credentials.AdmittedFeed'",
668
- ""
669
- ]
670
- });
671
- invariant3(assertion.spaceKey.equals(this._spaceKey), void 0, {
672
- F: __dxlog_file3,
673
- L: 48,
674
- S: this,
675
- A: [
676
- "assertion.spaceKey.equals(this._spaceKey)",
677
- ""
678
- ]
679
- });
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)", ""] });
680
640
  const info = {
681
641
  key: credential.subject.id,
682
642
  credential,
@@ -774,43 +734,36 @@ var CredentialGraph = class {
774
734
  /**
775
735
  * Local ids are used during traversals.
776
736
  */
777
- _vertexIdGenerator;
737
+ _vertexIdGenerator = 1;
778
738
  /**
779
739
  * All credentials without parent references are connected to the root.
780
740
  */
781
- _root;
741
+ _root = {
742
+ id: -1,
743
+ parents: [],
744
+ children: []
745
+ };
782
746
  /**
783
747
  * A credential which is not a parent of any other credential has the sentinel as a child.
784
748
  * Sentinel is a virtual merge-point of all credentials.
785
749
  */
786
- _sentinel;
750
+ _sentinel = {
751
+ id: -2,
752
+ parents: [],
753
+ children: []
754
+ };
787
755
  /**
788
756
  * Vertex references are used for fast credential inserts into the graph.
789
757
  */
790
- _vertexByCredentialId;
758
+ _vertexByCredentialId = new ComplexMap4(PublicKey6.hash);
791
759
  /**
792
760
  * The current state of the graph.
793
761
  */
794
- _subjectToVertex;
795
- _subjectToState;
796
- onSubjectStateChanged;
762
+ _subjectToVertex = new ComplexMap4(PublicKey6.hash);
763
+ _subjectToState = new ComplexMap4(PublicKey6.hash);
764
+ onSubjectStateChanged = new Callback3();
797
765
  constructor(_stateHandler) {
798
766
  this._stateHandler = _stateHandler;
799
- this._vertexIdGenerator = 1;
800
- this._root = {
801
- id: -1,
802
- parents: [],
803
- children: []
804
- };
805
- this._sentinel = {
806
- id: -2,
807
- parents: [],
808
- children: []
809
- };
810
- this._vertexByCredentialId = new ComplexMap4(PublicKey6.hash);
811
- this._subjectToVertex = new ComplexMap4(PublicKey6.hash);
812
- this._subjectToState = new ComplexMap4(PublicKey6.hash);
813
- this.onSubjectStateChanged = new Callback3();
814
767
  }
815
768
  getSubjectState(subjectId) {
816
769
  return this._subjectToState.get(subjectId);
@@ -846,12 +799,7 @@ var CredentialGraph = class {
846
799
  log.error("credential skipped because of the unknown parent", {
847
800
  credential,
848
801
  parentId
849
- }, {
850
- F: __dxlog_file4,
851
- L: 72,
852
- S: this,
853
- C: (f, a) => f(...a)
854
- });
802
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 70, S: this });
855
803
  continue;
856
804
  }
857
805
  parentVertex.children.push(newVertex);
@@ -868,29 +816,13 @@ var CredentialGraph = class {
868
816
  if (sentinelIdx >= 0) {
869
817
  vertex.children.splice(sentinelIdx, 1);
870
818
  const vertexInSentinelIdx = this._sentinel.parents.indexOf(vertex);
871
- invariant4(vertexInSentinelIdx >= 0, void 0, {
872
- F: __dxlog_file4,
873
- L: 90,
874
- S: this,
875
- A: [
876
- "vertexInSentinelIdx >= 0",
877
- ""
878
- ]
879
- });
819
+ invariant4(vertexInSentinelIdx >= 0, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 90, S: this, A: ["vertexInSentinelIdx >= 0", ""] });
880
820
  this._sentinel.parents.splice(vertexInSentinelIdx, 1);
881
821
  }
882
822
  }
883
823
  async _onVertexInserted(newVertex) {
884
824
  const { credential, assertion } = newVertex;
885
- invariant4(credential, void 0, {
886
- F: __dxlog_file4,
887
- L: 97,
888
- S: this,
889
- A: [
890
- "credential",
891
- ""
892
- ]
893
- });
825
+ invariant4(credential, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 96, S: this, A: ["credential", ""] });
894
826
  let changedSubjects = [];
895
827
  const isUpdateAppliedOnTopOfThePreviousState = this._sentinel.parents.length === 1;
896
828
  if (isUpdateAppliedOnTopOfThePreviousState) {
@@ -927,21 +859,11 @@ var CredentialGraph = class {
927
859
  const path = paths.pop();
928
860
  log("visit vertex", {
929
861
  id: path.head.id
930
- }, {
931
- F: __dxlog_file4,
932
- L: 132,
933
- S: this,
934
- C: (f, a) => f(...a)
935
- });
862
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 131, S: this });
936
863
  this._updatePathState(path);
937
864
  const convergedPaths = this._handleMergePoint(paths, pendingPaths, path);
938
865
  if (convergedPaths == null) {
939
- log("waiting for other paths", void 0, {
940
- F: __dxlog_file4,
941
- L: 136,
942
- S: this,
943
- C: (f, a) => f(...a)
944
- });
866
+ log("waiting for other paths", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 137, S: this });
945
867
  continue;
946
868
  }
947
869
  const mergeResult = this._mergePaths(convergedPaths);
@@ -965,12 +887,7 @@ var CredentialGraph = class {
965
887
  path: toChosenPath(p),
966
888
  head: p.head.id
967
889
  }))
968
- }, {
969
- F: __dxlog_file4,
970
- L: 155,
971
- S: this,
972
- C: (f, a) => f(...a)
973
- });
890
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 156, S: this });
974
891
  }
975
892
  return this._setCurrentState(lastPath);
976
893
  }
@@ -991,12 +908,7 @@ var CredentialGraph = class {
991
908
  path: toChosenPath(path),
992
909
  overrides: path?.stateOverrides?.mapValues((v) => this._stateHandler.toLogString(v.assertion))
993
910
  }))
994
- }), {
995
- F: __dxlog_file4,
996
- L: 175,
997
- S: this,
998
- C: (f, a) => f(...a)
999
- });
911
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 175, S: this });
1000
912
  const clearedPending = convergedPaths.filter((l) => !mergeResult.replay.includes(l));
1001
913
  pendingPaths.set(convergedPaths[0].head.id, clearedPending);
1002
914
  }
@@ -1008,12 +920,7 @@ var CredentialGraph = class {
1008
920
  return null;
1009
921
  }
1010
922
  if (path.head.id === this._sentinel.id && paths.length > 0) {
1011
- log("waiting for all the active paths to converge on the sentinel", void 0, {
1012
- F: __dxlog_file4,
1013
- L: 199,
1014
- S: this,
1015
- C: (f, a) => f(...a)
1016
- });
923
+ log("waiting for all the active paths to converge on the sentinel", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 194, S: this });
1017
924
  return null;
1018
925
  }
1019
926
  pendingPaths.delete(path.head.id);
@@ -1038,12 +945,7 @@ var CredentialGraph = class {
1038
945
  log("path state updated", () => ({
1039
946
  subject: updatedSubject,
1040
947
  newState: this._stateHandler.toLogString(path.head.assertion)
1041
- }), {
1042
- F: __dxlog_file4,
1043
- L: 223,
1044
- S: this,
1045
- C: (f, a) => f(...a)
1046
- });
948
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 217, S: this });
1047
949
  }
1048
950
  }
1049
951
  _forkTraversal(paths, path) {
@@ -1053,12 +955,7 @@ var CredentialGraph = class {
1053
955
  log("edge traversal", {
1054
956
  from: path.head.id,
1055
957
  to: choice.id
1056
- }, {
1057
- F: __dxlog_file4,
1058
- L: 234,
1059
- S: this,
1060
- C: (f, a) => f(...a)
1061
- });
958
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 227, S: this });
1062
959
  const fork = {
1063
960
  forkPoint: path,
1064
961
  chosenPath: {
@@ -1151,15 +1048,7 @@ var CredentialGraph = class {
1151
1048
  return path;
1152
1049
  }
1153
1050
  _mergePaths(convergedPaths) {
1154
- invariant4(convergedPaths.length >= 1, void 0, {
1155
- F: __dxlog_file4,
1156
- L: 324,
1157
- S: this,
1158
- A: [
1159
- "convergedPaths.length >= 1",
1160
- ""
1161
- ]
1162
- });
1051
+ invariant4(convergedPaths.length >= 1, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 320, S: this, A: ["convergedPaths.length >= 1", ""] });
1163
1052
  if (convergedPaths.length === 1) {
1164
1053
  return {
1165
1054
  type: "merged",
@@ -1171,22 +1060,9 @@ var CredentialGraph = class {
1171
1060
  forkPointId: forkPoint.head.id,
1172
1061
  pathCount: convergedPaths.length,
1173
1062
  forkPoints: convergedPaths.map((fp) => fp.forkPoint?.head.id)
1174
- }), {
1175
- F: __dxlog_file4,
1176
- L: 329,
1177
- S: this,
1178
- C: (f, a) => f(...a)
1179
- });
1063
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 328, S: this });
1180
1064
  const paths = convergedPaths.map((p) => this._moveUpToForkPoint(forkPoint, p));
1181
- invariant4(forkPoint, void 0, {
1182
- F: __dxlog_file4,
1183
- L: 335,
1184
- S: this,
1185
- A: [
1186
- "forkPoint",
1187
- ""
1188
- ]
1189
- });
1065
+ invariant4(forkPoint, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 334, S: this, A: ["forkPoint", ""] });
1190
1066
  const result = {
1191
1067
  forkPoint: forkPoint.forkPoint,
1192
1068
  chosenPath: {
@@ -1207,12 +1083,7 @@ var CredentialGraph = class {
1207
1083
  modified: path.forkChangedSubjects,
1208
1084
  forkIssuers: path.forkIssuers,
1209
1085
  state: path.state.mapValues((v) => this._stateHandler.toLogString(v.assertion))
1210
- }), {
1211
- F: __dxlog_file4,
1212
- L: 348,
1213
- S: this,
1214
- C: (f, a) => f(...a)
1215
- });
1086
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 350, S: this });
1216
1087
  path.forkIssuers.forEach((iss) => result.forkIssuers.add(iss));
1217
1088
  path.credentials.forEach((cred) => result.credentials.add(cred));
1218
1089
  result.chosenPath[forkPoint.head.id].push(...path.chosenPath[forkPoint.head.id] ?? []);
@@ -1232,12 +1103,7 @@ var CredentialGraph = class {
1232
1103
  log("set subject state", () => ({
1233
1104
  subject,
1234
1105
  state: this._stateHandler.toLogString(vertex.assertion)
1235
- }), {
1236
- F: __dxlog_file4,
1237
- L: 370,
1238
- S: this,
1239
- C: (f, a) => f(...a)
1240
- });
1106
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 372, S: this });
1241
1107
  const otherPaths = paths.filter((p) => p !== branch);
1242
1108
  this._stateHandler.getConflictingPaths(otherPaths, vertex).forEach(addReplayPath);
1243
1109
  }
@@ -1276,12 +1142,7 @@ var CredentialGraph = class {
1276
1142
  if (candidateVertex.id === mergePointId || currentVertex.id === mergePointId) {
1277
1143
  log("merge point chosen to break the tie", {
1278
1144
  mergePointId: existing.head.id
1279
- }, {
1280
- F: __dxlog_file4,
1281
- L: 408,
1282
- S: this,
1283
- C: (f, a) => f(...a)
1284
- });
1145
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 412, S: this });
1285
1146
  return mergePointId === candidateVertex.id;
1286
1147
  }
1287
1148
  const candidateCredential = candidateVertex.credential;
@@ -1290,12 +1151,7 @@ var CredentialGraph = class {
1290
1151
  log("one of the credentials was overridden in another branch", {
1291
1152
  current: currentVertex.id,
1292
1153
  candidate: candidateVertex.id
1293
- }, {
1294
- F: __dxlog_file4,
1295
- L: 415,
1296
- S: this,
1297
- C: (f, a) => f(...a)
1298
- });
1154
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 421, S: this });
1299
1155
  return candidate.credentials.has(currentCredential.id);
1300
1156
  }
1301
1157
  const winningCredential = this._stateHandler.tryPickWinningUpdate(existing, currentCredential, candidate, candidateCredential);
@@ -1308,20 +1164,10 @@ var CredentialGraph = class {
1308
1164
  existing.forkIssuers.size,
1309
1165
  candidate.forkIssuers.size
1310
1166
  ]
1311
- }, {
1312
- F: __dxlog_file4,
1313
- L: 432,
1314
- S: this,
1315
- C: (f, a) => f(...a)
1316
- });
1167
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 433, S: this });
1317
1168
  return candidate.forkIssuers.size > existing.forkIssuers.size;
1318
1169
  }
1319
- log("issuance date used to break the tie", void 0, {
1320
- F: __dxlog_file4,
1321
- L: 437,
1322
- S: this,
1323
- C: (f, a) => f(...a)
1324
- });
1170
+ log("issuance date used to break the tie", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 441, S: this });
1325
1171
  return candidateCredential.issuanceDate.getTime() > currentCredential.issuanceDate.getTime();
1326
1172
  }
1327
1173
  _createRootPath() {
@@ -1347,14 +1193,11 @@ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-mac
1347
1193
  var MemberStateMachine = class {
1348
1194
  _spaceKey;
1349
1195
  _ownerKey;
1350
- _memberProfiles;
1351
- _hashgraph;
1352
- onMemberRoleChanged;
1196
+ _memberProfiles = new ComplexMap5(PublicKey7.hash);
1197
+ _hashgraph = new CredentialGraph(this);
1198
+ onMemberRoleChanged = this._hashgraph.onSubjectStateChanged;
1353
1199
  constructor(_spaceKey) {
1354
1200
  this._spaceKey = _spaceKey;
1355
- this._memberProfiles = new ComplexMap5(PublicKey7.hash);
1356
- this._hashgraph = new CredentialGraph(this);
1357
- this.onMemberRoleChanged = this._hashgraph.onSubjectStateChanged;
1358
1201
  }
1359
1202
  get creator() {
1360
1203
  return this._ownerKey && this._hashgraph.getSubjectState(this._ownerKey);
@@ -1376,15 +1219,7 @@ var MemberStateMachine = class {
1376
1219
  const assertion = getCredentialAssertion(credential);
1377
1220
  switch (assertion["@type"]) {
1378
1221
  case "dxos.halo.credentials.SpaceMember": {
1379
- invariant5(assertion.spaceKey.equals(this._spaceKey), void 0, {
1380
- F: __dxlog_file5,
1381
- L: 66,
1382
- S: this,
1383
- A: [
1384
- "assertion.spaceKey.equals(this._spaceKey)",
1385
- ""
1386
- ]
1387
- });
1222
+ invariant5(assertion.spaceKey.equals(this._spaceKey), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 43, S: this, A: ["assertion.spaceKey.equals(this._spaceKey)", ""] });
1388
1223
  if (this._ownerKey == null && credential.issuer === this._spaceKey) {
1389
1224
  this._ownerKey = credential.subject.id;
1390
1225
  }
@@ -1401,12 +1236,7 @@ var MemberStateMachine = class {
1401
1236
  } else {
1402
1237
  log2.warn("Member not found", {
1403
1238
  id: credential.subject.id
1404
- }, {
1405
- F: __dxlog_file5,
1406
- L: 81,
1407
- S: this,
1408
- C: (f, a) => f(...a)
1409
- });
1239
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 59, S: this });
1410
1240
  }
1411
1241
  this._memberProfiles.set(credential.subject.id, assertion.profile);
1412
1242
  break;
@@ -1451,12 +1281,7 @@ var MemberStateMachine = class {
1451
1281
  const path1IssuerRole = this._getRole(scope1, update1.issuer);
1452
1282
  const path2IssuerRole = this._getRole(scope2, update2.issuer);
1453
1283
  if (path2IssuerRole === SpaceMember2.Role.OWNER !== (path1IssuerRole === SpaceMember2.Role.OWNER)) {
1454
- log2("owner decision used to break the tie", void 0, {
1455
- F: __dxlog_file5,
1456
- L: 139,
1457
- S: this,
1458
- C: (f, a) => f(...a)
1459
- });
1284
+ log2("owner decision used to break the tie", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 107, S: this });
1460
1285
  return path1IssuerRole === SpaceMember2.Role.OWNER ? update1 : update2;
1461
1286
  }
1462
1287
  return null;
@@ -1480,12 +1305,7 @@ var MemberStateMachine = class {
1480
1305
  headId: scope.head?.id,
1481
1306
  roleOverride: this.toLogString(override.assertion),
1482
1307
  realRole: this.toLogString(scope.state.get(memberId)?.assertion)
1483
- }), {
1484
- F: __dxlog_file5,
1485
- L: 162,
1486
- S: this,
1487
- C: (f, a) => f(...a)
1488
- });
1308
+ }), { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 127, S: this });
1489
1309
  return override.assertion.role;
1490
1310
  }
1491
1311
  }
@@ -1494,38 +1314,32 @@ var MemberStateMachine = class {
1494
1314
  };
1495
1315
 
1496
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";
1497
1318
  function _ts_decorate(decorators, target, key, desc) {
1498
1319
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1499
1320
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1500
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;
1501
1322
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1502
1323
  }
1503
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-machine/space-state-machine.ts";
1504
1324
  var SpaceStateMachine = class {
1505
1325
  _spaceKey;
1506
1326
  _members;
1507
1327
  _feeds;
1508
- _invitations;
1509
- _credentials;
1510
- _credentialsById;
1511
- _processedCredentials;
1328
+ _invitations = new InvitationStateMachine();
1329
+ _credentials = [];
1330
+ _credentialsById = new ComplexMap6(PublicKey8.hash);
1331
+ _processedCredentials = new ComplexSet3(PublicKey8.hash);
1512
1332
  _genesisCredential;
1513
- _credentialProcessors;
1514
- onCredentialProcessed;
1333
+ _tags = [];
1334
+ _membershipPolicy = MembershipPolicy2.INVITE;
1335
+ _credentialProcessors = [];
1336
+ onCredentialProcessed = new Callback4();
1515
1337
  onMemberRoleChanged;
1516
1338
  onFeedAdmitted;
1517
- onDelegatedInvitation;
1518
- onDelegatedInvitationRemoved;
1339
+ onDelegatedInvitation = this._invitations.onDelegatedInvitation;
1340
+ onDelegatedInvitationRemoved = this._invitations.onDelegatedInvitationRemoved;
1519
1341
  constructor(_spaceKey) {
1520
1342
  this._spaceKey = _spaceKey;
1521
- this._invitations = new InvitationStateMachine();
1522
- this._credentials = [];
1523
- this._credentialsById = new ComplexMap6(PublicKey8.hash);
1524
- this._processedCredentials = new ComplexSet3(PublicKey8.hash);
1525
- this._credentialProcessors = [];
1526
- this.onCredentialProcessed = new Callback4();
1527
- this.onDelegatedInvitation = this._invitations.onDelegatedInvitation;
1528
- this.onDelegatedInvitationRemoved = this._invitations.onDelegatedInvitationRemoved;
1529
1343
  this._members = new MemberStateMachine(this._spaceKey);
1530
1344
  this._feeds = new FeedStateMachine(this._spaceKey);
1531
1345
  this.onMemberRoleChanged = this._members.onMemberRoleChanged;
@@ -1552,6 +1366,12 @@ var SpaceStateMachine = class {
1552
1366
  get genesisCredential() {
1553
1367
  return this._genesisCredential;
1554
1368
  }
1369
+ get tags() {
1370
+ return this._tags;
1371
+ }
1372
+ get membershipPolicy() {
1373
+ return this._membershipPolicy;
1374
+ }
1555
1375
  get invitations() {
1556
1376
  return this._invitations.invitations;
1557
1377
  }
@@ -1591,12 +1411,7 @@ var SpaceStateMachine = class {
1591
1411
  if (!skipVerification) {
1592
1412
  const result = await verifyCredential(credential);
1593
1413
  if (result.kind !== "pass") {
1594
- log3.warn(`Invalid credential: ${result.errors.join(", ")}`, void 0, {
1595
- F: __dxlog_file6,
1596
- L: 162,
1597
- S: this,
1598
- C: (f, a) => f(...a)
1599
- });
1414
+ log3.warn(`Invalid credential: ${result.errors.join(", ")}`, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 116, S: this });
1600
1415
  return false;
1601
1416
  }
1602
1417
  }
@@ -1604,33 +1419,20 @@ var SpaceStateMachine = class {
1604
1419
  switch (assertion["@type"]) {
1605
1420
  case "dxos.halo.credentials.SpaceGenesis": {
1606
1421
  if (this._genesisCredential) {
1607
- log3.warn("Space already has a genesis credential.", void 0, {
1608
- F: __dxlog_file6,
1609
- L: 171,
1610
- S: this,
1611
- C: (f, a) => f(...a)
1612
- });
1422
+ log3.warn("Space already has a genesis credential.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 125, S: this });
1613
1423
  return false;
1614
1424
  }
1615
1425
  if (!credential.issuer.equals(this._spaceKey)) {
1616
- log3.warn("Space genesis credential must be issued by space.", void 0, {
1617
- F: __dxlog_file6,
1618
- L: 175,
1619
- S: this,
1620
- C: (f, a) => f(...a)
1621
- });
1426
+ log3.warn("Space genesis credential must be issued by space.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 129, S: this });
1622
1427
  return false;
1623
1428
  }
1624
1429
  if (!credential.subject.id.equals(this._spaceKey)) {
1625
- log3.warn("Space genesis credential must be issued to space.", void 0, {
1626
- F: __dxlog_file6,
1627
- L: 179,
1628
- S: this,
1629
- C: (f, a) => f(...a)
1630
- });
1430
+ log3.warn("Space genesis credential must be issued to space.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 133, S: this });
1631
1431
  return false;
1632
1432
  }
1633
1433
  this._genesisCredential = credential;
1434
+ this._tags = assertion.tags ?? [];
1435
+ this._membershipPolicy = assertion.membershipPolicy ?? MembershipPolicy2.INVITE;
1634
1436
  break;
1635
1437
  }
1636
1438
  case "dxos.halo.credentials.SpaceMember": {
@@ -1638,21 +1440,11 @@ var SpaceStateMachine = class {
1638
1440
  break;
1639
1441
  }
1640
1442
  if (!this._genesisCredential) {
1641
- log3.warn("Space must have a genesis credential before adding members.", void 0, {
1642
- F: __dxlog_file6,
1643
- L: 192,
1644
- S: this,
1645
- C: (f, a) => f(...a)
1646
- });
1443
+ log3.warn("Space must have a genesis credential before adding members.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 147, S: this });
1647
1444
  return false;
1648
1445
  }
1649
1446
  if (!this._canInviteNewMembers(credential.issuer)) {
1650
- log3.warn(`Space member is not authorized to invite new members: ${credential.issuer}`, void 0, {
1651
- F: __dxlog_file6,
1652
- L: 196,
1653
- S: this,
1654
- C: (f, a) => f(...a)
1655
- });
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 });
1656
1448
  return false;
1657
1449
  }
1658
1450
  await this._members.process(credential);
@@ -1661,12 +1453,7 @@ var SpaceStateMachine = class {
1661
1453
  }
1662
1454
  case "dxos.halo.credentials.MemberProfile": {
1663
1455
  if (!this._genesisCredential) {
1664
- log3.warn("Space must have a genesis credential before adding members.", void 0, {
1665
- F: __dxlog_file6,
1666
- L: 207,
1667
- S: this,
1668
- C: (f, a) => f(...a)
1669
- });
1456
+ log3.warn("Space must have a genesis credential before adding members.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 161, S: this });
1670
1457
  return false;
1671
1458
  }
1672
1459
  await this._members.process(credential);
@@ -1674,12 +1461,7 @@ var SpaceStateMachine = class {
1674
1461
  }
1675
1462
  case "dxos.halo.credentials.AdmittedFeed": {
1676
1463
  if (!this._genesisCredential) {
1677
- log3.warn("Space must have a genesis credential before admitting feeds.", void 0, {
1678
- F: __dxlog_file6,
1679
- L: 217,
1680
- S: this,
1681
- C: (f, a) => f(...a)
1682
- });
1464
+ log3.warn("Space must have a genesis credential before admitting feeds.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 170, S: this });
1683
1465
  return false;
1684
1466
  }
1685
1467
  await this._feeds.process(credential, sourceFeed);
@@ -1688,12 +1470,7 @@ var SpaceStateMachine = class {
1688
1470
  case "dxos.halo.invitations.CancelDelegatedInvitation":
1689
1471
  case "dxos.halo.invitations.DelegateSpaceInvitation": {
1690
1472
  if (!this._canInviteNewMembers(credential.issuer)) {
1691
- log3.warn(`Invalid invitation, space member is not authorized to invite new members: ${credential.issuer}`, void 0, {
1692
- F: __dxlog_file6,
1693
- L: 228,
1694
- S: this,
1695
- C: (f, a) => f(...a)
1696
- });
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 });
1697
1474
  return false;
1698
1475
  }
1699
1476
  await this._invitations.process(credential);
@@ -1724,6 +1501,9 @@ var SpaceStateMachine = class {
1724
1501
  return this._canInviteNewMembers(memberKey);
1725
1502
  }
1726
1503
  _canInviteNewMembers(key) {
1504
+ if (this._membershipPolicy === MembershipPolicy2.LOCKED) {
1505
+ return key.equals(this._spaceKey) && this._members.members.size === 0;
1506
+ }
1727
1507
  return key.equals(this._spaceKey) || this._members.getRole(key) === SpaceMember3.Role.ADMIN || this._members.getRole(key) === SpaceMember3.Role.OWNER;
1728
1508
  }
1729
1509
  };
@@ -1734,23 +1514,18 @@ var CredentialConsumer = class {
1734
1514
  processor;
1735
1515
  _onOpen;
1736
1516
  _onClose;
1737
- _ctx;
1517
+ _ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 229 });
1738
1518
  /**
1739
1519
  * @internal
1740
1520
  * Processor is ready to process live credentials.
1741
1521
  * NOTE: Setting this flag before all existing credentials are processed will cause them to be processed out of order.
1742
1522
  * Set externally.
1743
1523
  */
1744
- _isReadyForLiveCredentials;
1524
+ _isReadyForLiveCredentials = false;
1745
1525
  constructor(processor, _onOpen, _onClose) {
1746
1526
  this.processor = processor;
1747
1527
  this._onOpen = _onOpen;
1748
1528
  this._onClose = _onClose;
1749
- this._ctx = new Context(void 0, {
1750
- F: __dxlog_file6,
1751
- L: 273
1752
- });
1753
- this._isReadyForLiveCredentials = false;
1754
1529
  }
1755
1530
  /**
1756
1531
  * @internal
@@ -1782,25 +1557,18 @@ var __dxlog_file7 = "/__w/dxos/dxos/packages/core/halo/credentials/src/processor
1782
1557
  var DeviceStateMachine = class {
1783
1558
  _params;
1784
1559
  // TODO(burdon): Return values via getter.
1785
- authorizedDeviceKeys;
1786
- deviceChainReady;
1560
+ authorizedDeviceKeys = new ComplexMap7(PublicKey9.hash);
1561
+ deviceChainReady = new Trigger();
1787
1562
  deviceCredentialChain;
1788
1563
  constructor(_params) {
1789
1564
  this._params = _params;
1790
- this.authorizedDeviceKeys = new ComplexMap7(PublicKey9.hash);
1791
- this.deviceChainReady = new Trigger();
1792
1565
  }
1793
1566
  async processCredential(credential) {
1794
1567
  log4("processing credential...", {
1795
1568
  identityKey: this._params.identityKey,
1796
1569
  deviceKey: this._params.deviceKey,
1797
1570
  credential
1798
- }, {
1799
- F: __dxlog_file7,
1800
- L: 36,
1801
- S: this,
1802
- C: (f, a) => f(...a)
1803
- });
1571
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 22, S: this });
1804
1572
  if (isValidAuthorizedDeviceCredential(credential, this._params.identityKey, this._params.deviceKey)) {
1805
1573
  this.deviceCredentialChain = {
1806
1574
  credential
@@ -1815,35 +1583,17 @@ var DeviceStateMachine = class {
1815
1583
  localDeviceKey: this._params.deviceKey,
1816
1584
  deviceKey: assertion.deviceKey,
1817
1585
  size: this.authorizedDeviceKeys.size
1818
- }, {
1819
- F: __dxlog_file7,
1820
- L: 56,
1821
- S: this,
1822
- C: (f, a) => f(...a)
1823
- });
1586
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 41, S: this });
1824
1587
  this._params.onUpdate?.();
1825
1588
  break;
1826
1589
  }
1827
1590
  case "dxos.halo.credentials.DeviceProfile": {
1828
- invariant6(this.authorizedDeviceKeys.has(credential.subject.id), "Device not found.", {
1829
- F: __dxlog_file7,
1830
- L: 66,
1831
- S: this,
1832
- A: [
1833
- "this.authorizedDeviceKeys.has(credential.subject.id)",
1834
- "'Device not found.'"
1835
- ]
1836
- });
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.'"] });
1837
1592
  if (assertion && credential.subject.id.equals(this._params.deviceKey)) {
1838
1593
  log4.trace("dxos.halo.device", {
1839
1594
  deviceKey: credential.subject.id,
1840
1595
  profile: assertion.profile
1841
- }, {
1842
- F: __dxlog_file7,
1843
- L: 69,
1844
- S: this,
1845
- C: (f, a) => f(...a)
1846
- });
1596
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 53, S: this });
1847
1597
  }
1848
1598
  this.authorizedDeviceKeys.set(credential.subject.id, assertion.profile);
1849
1599
  this._params.onUpdate?.();
@@ -1871,24 +1621,14 @@ var ProfileStateMachine = class {
1871
1621
  log5.warn("Invalid profile credential", {
1872
1622
  expectedIdentity: this._params.identityKey,
1873
1623
  credential
1874
- }, {
1875
- F: __dxlog_file8,
1876
- L: 35,
1877
- S: this,
1878
- C: (f, a) => f(...a)
1879
- });
1624
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 21, S: this });
1880
1625
  return;
1881
1626
  }
1882
1627
  this.profile = assertion.profile;
1883
1628
  log5("updated profile", {
1884
1629
  identityKey: this._params.identityKey,
1885
1630
  profile: this.profile
1886
- }, {
1887
- F: __dxlog_file8,
1888
- L: 41,
1889
- S: this,
1890
- C: (f, a) => f(...a)
1891
- });
1631
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 29, S: this });
1892
1632
  this._params.onUpdate?.();
1893
1633
  break;
1894
1634
  }