@ibgib/core-gib 0.1.55 → 0.1.58

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 (134) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/keystone/keystone-config-builder.d.mts +12 -1
  3. package/dist/keystone/keystone-config-builder.d.mts.map +1 -1
  4. package/dist/keystone/keystone-config-builder.mjs +58 -4
  5. package/dist/keystone/keystone-config-builder.mjs.map +1 -1
  6. package/dist/keystone/keystone-constants.d.mts +40 -5
  7. package/dist/keystone/keystone-constants.d.mts.map +1 -1
  8. package/dist/keystone/keystone-constants.mjs +39 -5
  9. package/dist/keystone/keystone-constants.mjs.map +1 -1
  10. package/dist/keystone/keystone-helpers.d.mts +11 -1
  11. package/dist/keystone/keystone-helpers.d.mts.map +1 -1
  12. package/dist/keystone/keystone-helpers.mjs +37 -1
  13. package/dist/keystone/keystone-helpers.mjs.map +1 -1
  14. package/dist/keystone/keystone-policy-types.d.mts +23 -0
  15. package/dist/keystone/keystone-policy-types.d.mts.map +1 -0
  16. package/dist/keystone/keystone-policy-types.mjs +2 -0
  17. package/dist/keystone/keystone-policy-types.mjs.map +1 -0
  18. package/dist/sync/graft-info/graft-info-helpers.respec.mjs +8 -8
  19. package/dist/sync/graft-info/graft-info-helpers.respec.mjs.map +1 -1
  20. package/dist/sync/sync-conflict-adv-multitimelines.respec.mjs +22 -22
  21. package/dist/sync/sync-conflict-adv-multitimelines.respec.mjs.map +1 -1
  22. package/dist/sync/sync-conflict-basic-divergence.respec.mjs +3 -3
  23. package/dist/sync/sync-conflict-basic-divergence.respec.mjs.map +1 -1
  24. package/dist/sync/sync-conflict-basic-multitimelines.respec.mjs +6 -6
  25. package/dist/sync/sync-conflict-basic-multitimelines.respec.mjs.map +1 -1
  26. package/dist/sync/sync-conflict-text-merge.respec.mjs +26 -26
  27. package/dist/sync/sync-conflict-text-merge.respec.mjs.map +1 -1
  28. package/dist/sync/sync-helpers.d.mts +19 -0
  29. package/dist/sync/sync-helpers.d.mts.map +1 -1
  30. package/dist/sync/sync-helpers.mjs +51 -1
  31. package/dist/sync/sync-helpers.mjs.map +1 -1
  32. package/dist/sync/sync-innerspace-constants.respec.mjs +2 -2
  33. package/dist/sync/sync-innerspace-constants.respec.mjs.map +1 -1
  34. package/dist/sync/sync-innerspace-deep-updates.respec.mjs +2 -2
  35. package/dist/sync/sync-innerspace-deep-updates.respec.mjs.map +1 -1
  36. package/dist/sync/sync-innerspace-dest-ahead.respec.mjs +4 -4
  37. package/dist/sync/sync-innerspace-dest-ahead.respec.mjs.map +1 -1
  38. package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs +2 -2
  39. package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs.map +1 -1
  40. package/dist/sync/sync-innerspace-partial-update.respec.mjs +3 -3
  41. package/dist/sync/sync-innerspace-partial-update.respec.mjs.map +1 -1
  42. package/dist/sync/sync-innerspace.respec.mjs +4 -4
  43. package/dist/sync/sync-innerspace.respec.mjs.map +1 -1
  44. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.d.mts +5 -0
  45. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.d.mts.map +1 -1
  46. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs +18 -0
  47. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs.map +1 -1
  48. package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.d.mts +5 -0
  49. package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.d.mts.map +1 -1
  50. package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mjs +21 -3
  51. package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mjs.map +1 -1
  52. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts +12 -0
  53. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts.map +1 -1
  54. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs +34 -0
  55. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs.map +1 -1
  56. package/dist/sync/sync-peer/sync-peer-types.d.mts +69 -1
  57. package/dist/sync/sync-peer/sync-peer-types.d.mts.map +1 -1
  58. package/dist/sync/sync-peer/sync-peer-v1.d.mts +30 -0
  59. package/dist/sync/sync-peer/sync-peer-v1.d.mts.map +1 -1
  60. package/dist/sync/sync-peer/sync-peer-v1.mjs +88 -1
  61. package/dist/sync/sync-peer/sync-peer-v1.mjs.map +1 -1
  62. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts +30 -0
  63. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts.map +1 -0
  64. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs +2 -0
  65. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs.map +1 -0
  66. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts +66 -0
  67. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts.map +1 -0
  68. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs +280 -0
  69. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs.map +1 -0
  70. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts +85 -0
  71. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts.map +1 -0
  72. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs +332 -0
  73. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs.map +1 -0
  74. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts +29 -0
  75. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts.map +1 -0
  76. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs +2 -0
  77. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs.map +1 -0
  78. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts +42 -0
  79. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts.map +1 -0
  80. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs +282 -0
  81. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs.map +1 -0
  82. package/dist/sync/sync-saga-coordinator.d.mts +35 -1
  83. package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
  84. package/dist/sync/sync-saga-coordinator.mjs +62 -1
  85. package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
  86. package/dist/sync/sync-withid.connect.respec.d.mts +12 -0
  87. package/dist/sync/sync-withid.connect.respec.d.mts.map +1 -0
  88. package/dist/sync/sync-withid.connect.respec.mjs +205 -0
  89. package/dist/sync/sync-withid.connect.respec.mjs.map +1 -0
  90. package/dist/sync/sync-withid.establish.respec.d.mts +19 -0
  91. package/dist/sync/sync-withid.establish.respec.d.mts.map +1 -0
  92. package/dist/sync/sync-withid.establish.respec.mjs +322 -0
  93. package/dist/sync/sync-withid.establish.respec.mjs.map +1 -0
  94. package/package.json +1 -1
  95. package/src/keystone/keystone-config-builder.mts +73 -4
  96. package/src/keystone/keystone-constants.mts +42 -6
  97. package/src/keystone/keystone-helpers.mts +44 -2
  98. package/src/keystone/keystone-policy-types.mts +25 -0
  99. package/src/keystone/keystone-policy.schema.json +51 -0
  100. package/src/keystone/keystone-service-v1.mts +3 -3
  101. package/src/sync/README.md +1 -104
  102. package/src/sync/docs/architecture.md +28 -8
  103. package/src/sync/docs/security.md +380 -0
  104. package/src/sync/graft-info/graft-info-helpers.respec.mts +7 -7
  105. package/src/sync/sync-conflict-adv-multitimelines.respec.mts +21 -21
  106. package/src/sync/sync-conflict-basic-divergence.respec.mts +2 -2
  107. package/src/sync/sync-conflict-basic-multitimelines.respec.mts +5 -5
  108. package/src/sync/sync-conflict-text-merge.respec.mts +25 -25
  109. package/src/sync/sync-helpers.mts +51 -1
  110. package/src/sync/sync-innerspace-constants.respec.mts +1 -1
  111. package/src/sync/sync-innerspace-deep-updates.respec.mts +1 -1
  112. package/src/sync/sync-innerspace-dest-ahead.respec.mts +3 -3
  113. package/src/sync/sync-innerspace-multiple-timelines.respec.mts +1 -1
  114. package/src/sync/sync-innerspace-partial-update.respec.mts +2 -2
  115. package/src/sync/sync-innerspace.respec.mts +3 -3
  116. package/src/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mts +20 -0
  117. package/src/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mts +23 -3
  118. package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mts +38 -1
  119. package/src/sync/sync-peer/sync-peer-types.mts +70 -1
  120. package/src/sync/sync-peer/sync-peer-v1.mts +94 -1
  121. package/src/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mts +36 -0
  122. package/src/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mts +337 -0
  123. package/src/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mts +388 -0
  124. package/src/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mts +35 -0
  125. package/src/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mts +321 -0
  126. package/src/sync/sync-saga-coordinator.mts +84 -0
  127. package/src/sync/sync-withid.connect.respec.mts +243 -0
  128. package/src/sync/sync-withid.establish.respec.mts +361 -0
  129. package/src/sync/unused-identity-backup.mts.md +1 -1
  130. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts +0 -2
  131. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts.map +0 -1
  132. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs +0 -310
  133. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs.map +0 -1
  134. package/src/sync/sync-innerspace-dest-ahead-withid.respec.mts +0 -364
@@ -0,0 +1,322 @@
1
+ /**
2
+ * @module sync-withid.establish.respec
3
+ *
4
+ * Phase 1 — `establishSessionIdentity` (Pre-Connect)
5
+ *
6
+ * Goal: Get `I^Itjp` onto the domain provider, generate `S^Stjp` locally,
7
+ * evolve `I → I1` with a `sync` claim targeting `S^Stjp`, and post both
8
+ * `I1` and `S` to the provider. Verify both keystones are in the appropriate
9
+ * durable spaces at the right times.
10
+ *
11
+ * `senderCoordinator.sync(...)` IS called — we are not mocking. We expect it
12
+ * may throw at first. We examine side-effects (keystone presence in durable
13
+ * spaces) rather than end-to-end correctness. As phases succeed and sync no
14
+ * longer throws, assertions will be adjusted accordingly.
15
+ *
16
+ * @see libs/core-gib/src/sync/docs/security.md — Implementation Plan, Phase 1A
17
+ */
18
+ import { respecfully, iReckon, ifWe } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
19
+ const maam = `[${import.meta.url}]`, sir = maam;
20
+ import { clone, delay, extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
21
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
22
+ import { GLOBAL_LOG_A_LOT } from '../core-constants.mjs';
23
+ import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
24
+ import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
25
+ import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
26
+ import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
27
+ import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
28
+ import { SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs';
29
+ import { KeystoneService_V1 } from '../keystone/keystone-service-v1.mjs';
30
+ import { KEYSTONE_VERB_SYNC, POOL_ID_SYNC, POOL_ID_CONNECT, KEYSTONE_VERB_CONNECT, } from '../keystone/keystone-constants.mjs';
31
+ import { createStandardPoolConfig } from '../keystone/keystone-config-builder.mjs';
32
+ import { KeystoneReplenishStrategy } from '../keystone/keystone-types.mjs';
33
+ import { SyncConflictStrategy } from './sync-constants.mjs';
34
+ import { getIdentity_throwIfUndefined } from '../keystone/keystone-helpers.mjs';
35
+ import { Factory_V1 } from '@ibgib/ts-gib/dist/V1/factory.mjs';
36
+ import { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';
37
+ import { fork } from '@ibgib/ts-gib/dist/V1/transforms/fork.mjs';
38
+ const logalot = GLOBAL_LOG_A_LOT;
39
+ const lc = sir;
40
+ // ---------------------------------------------------------------------------
41
+ // Test-only identity constants
42
+ // ---------------------------------------------------------------------------
43
+ /**
44
+ * Plaintext secret for the senderIdentity keystone (I).
45
+ * Test-only — never use plaintext secrets in production.
46
+ */
47
+ const SENDER_SECRET = 'test-sender-secret-phase1';
48
+ // ---------------------------------------------------------------------------
49
+ // Session keystone pool configs
50
+ // ---------------------------------------------------------------------------
51
+ /**
52
+ * `connect` pool — used once during `peer.connect()` transport handshake.
53
+ * Small pool; fully consumed in one handshake.
54
+ */
55
+ const SESSION_CONNECT_POOL_CONFIG = createStandardPoolConfig({
56
+ id: POOL_ID_CONNECT,
57
+ salt: 'session-connect-salt-phase1',
58
+ verbs: [KEYSTONE_VERB_CONNECT],
59
+ // Small size: fully consumed in a single connect handshake
60
+ size: 10,
61
+ sequential: 1,
62
+ random: 1,
63
+ targetBinding: 2,
64
+ replenishStrategy: KeystoneReplenishStrategy.deleteAll,
65
+ });
66
+ /**
67
+ * `sync` pool — used per outgoing context frame (Init, Delta, Commit).
68
+ * Replenishes via topUp to stay active throughout the saga.
69
+ */
70
+ const SESSION_SYNC_POOL_CONFIG = createStandardPoolConfig({
71
+ id: POOL_ID_SYNC,
72
+ salt: 'session-sync-salt-phase1',
73
+ verbs: [KEYSTONE_VERB_SYNC],
74
+ size: 200,
75
+ sequential: 1,
76
+ random: 1,
77
+ targetBinding: 2,
78
+ replenishStrategy: KeystoneReplenishStrategy.topUp,
79
+ });
80
+ // ---------------------------------------------------------------------------
81
+ // Top-level senderIdentity (I) pool config
82
+ // ---------------------------------------------------------------------------
83
+ /**
84
+ * The senderIdentity needs a `sync` pool so it can evolve itself (I → I1)
85
+ * with a claim targeting the session keystone genesis (S^Stjp).
86
+ */
87
+ const SENDER_IDENTITY_SYNC_POOL_CONFIG = createStandardPoolConfig({
88
+ id: POOL_ID_SYNC,
89
+ salt: 'senderidentitysyncsaltphase1', // dashes not allowed in regex
90
+ verbs: [KEYSTONE_VERB_SYNC],
91
+ size: 200,
92
+ sequential: 1,
93
+ random: 1,
94
+ targetBinding: 2,
95
+ replenishStrategy: KeystoneReplenishStrategy.topUp,
96
+ });
97
+ // ---------------------------------------------------------------------------
98
+ // Main test suite
99
+ // ---------------------------------------------------------------------------
100
+ await respecfully(sir, `Test Phase 1: establishSessionIdentity`, async () => {
101
+ // #region Init/Setup
102
+ const metaspace = new Metaspace_Innerspace(undefined);
103
+ await metaspace.initialize({
104
+ getFnAlert: () => async ({ title, msg }) => { console.log(`[Alert] ${title}: ${msg}`); },
105
+ getFnPrompt: () => async ({ title, msg }) => { console.log(`[Prompt] ${title}: ${msg}`); return ''; },
106
+ getFnPromptPassword: () => async (title, msg) => { console.log(`[PromptPwd] ${title}: ${msg}`); return null; },
107
+ });
108
+ while (!metaspace.initialized) {
109
+ await delay(10);
110
+ }
111
+ const defaultLocalUserSpace = await metaspace.getLocalUserSpace({ lock: false });
112
+ await defaultLocalUserSpace.initialized;
113
+ /** Sender's durable space — where the sender originates ibgibs. */
114
+ const sourceSpace = new InnerSpace_V1({
115
+ ...DEFAULT_INNER_SPACE_DATA_V1,
116
+ name: 'source',
117
+ uuid: 'source_uuid',
118
+ description: 'sender durable space',
119
+ });
120
+ await sourceSpace.initialized;
121
+ /** Receiver's durable space — the domain provider in the innerspace simulation. */
122
+ const destSpace = new InnerSpace_V1({
123
+ ...DEFAULT_INNER_SPACE_DATA_V1,
124
+ name: 'dest',
125
+ uuid: 'dest_uuid',
126
+ description: 'receiver (domain provider) durable space',
127
+ });
128
+ await destSpace.initialized;
129
+ const senderCoordinator = new SyncSagaCoordinator();
130
+ const receiverCoordinator = new SyncSagaCoordinator();
131
+ async function newTestIbGib_stone({ ib = 'test', data }) {
132
+ const stone = await Factory_V1.stone({
133
+ parentPrimitiveIb: ib.split(' ').at(0) ?? 'test',
134
+ ib,
135
+ data,
136
+ uuid: true,
137
+ });
138
+ return stone;
139
+ }
140
+ async function newTestIbGib({ ib = 'test' }) {
141
+ let resFork = await fork({
142
+ src: ROOT,
143
+ destIb: ib,
144
+ tjp: { timestamp: true, uuid: true },
145
+ dna: true,
146
+ nCounter: true,
147
+ });
148
+ return resFork;
149
+ }
150
+ async function newTestPeer() {
151
+ const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
152
+ await peer.initialized;
153
+ await peer.initializeOpts({
154
+ sagaId: '', // coordinator will override this via setOptionalOpts before establishSessionIdentity
155
+ localMetaspace: metaspace,
156
+ localSpace: sourceSpace,
157
+ receiverSpace: destSpace,
158
+ receiverCoordinator,
159
+ receiverMetaspace: metaspace,
160
+ });
161
+ return peer;
162
+ }
163
+ // KeystoneService_V1 is stateless — new it inline wherever needed.
164
+ const keystoneSvc = new KeystoneService_V1();
165
+ // #endregion Init/Setup
166
+ /**
167
+ * senderIdentity (I): Alice's long-lived Domain Keystone.
168
+ * Created fresh for this test with a `sync` pool so it can evolve (I → I1).
169
+ */
170
+ let senderIdentity;
171
+ // #region Step 1: Prepare identity
172
+ // Create senderIdentity genesis (I^Itjp) in sourceSpace
173
+ senderIdentity = await keystoneSvc.genesis({
174
+ masterSecret: SENDER_SECRET,
175
+ configs: [SENDER_IDENTITY_SYNC_POOL_CONFIG],
176
+ metaspace,
177
+ space: sourceSpace,
178
+ });
179
+ if (logalot) {
180
+ console.log(`${lc} senderIdentity genesis addr: ${getIbGibAddr({ ibGib: senderIdentity })}`);
181
+ }
182
+ // post the senderIdentity to receiver (like "create account")
183
+ await metaspace.put({ ibGib: senderIdentity, space: destSpace });
184
+ await metaspace.registerNewIbGib({ ibGib: senderIdentity, space: destSpace });
185
+ // #endregion Step 1: Prepare identity
186
+ // at this point, we have mimicked a user who already has an identity via a
187
+ // create account button.
188
+ // #region Step 2: Execute
189
+ let xStone;
190
+ let xStoneAddr;
191
+ try {
192
+ if (logalot) {
193
+ console.log(`${lc}[Step 2] starting... (I: 1aa5643dd8d46fcdd87d48b8be550826)`);
194
+ }
195
+ // setup/call sync
196
+ // Sync call — sync itself is responsible for establishSessionIdentity
197
+ // internally.
198
+ /**
199
+ * doesn't really matter intrinsically for this test, but we need a
200
+ * domain ibgib to sync
201
+ */
202
+ xStone = await newTestIbGib_stone({ ib: 'test' });
203
+ xStoneAddr = getIbGibAddr({ ibGib: xStone });
204
+ await metaspace.put({ ibGib: xStone, space: sourceSpace });
205
+ await metaspace.registerNewIbGib({ ibGib: xStone, space: sourceSpace });
206
+ const syncSaga = await senderCoordinator.sync({
207
+ domainIbGibs: [xStone],
208
+ senderIdentity,
209
+ fnSenderSecret: async () => { return SENDER_SECRET; },
210
+ peer: await newTestPeer(),
211
+ localSpace: sourceSpace,
212
+ metaspace,
213
+ conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
214
+ });
215
+ await syncSaga.done;
216
+ }
217
+ catch (error) {
218
+ // error is fine/expected right now. later perhaps we will throw, or
219
+ // perhaps we always just swallow any exceptions since this is close to
220
+ // a unit test
221
+ console.error(`${lc} ${extractErrorMsg(error)}`);
222
+ }
223
+ finally {
224
+ if (logalot) {
225
+ console.log(`${lc}[Step 2] complete.`);
226
+ }
227
+ }
228
+ // #endregion Step 2: Execute
229
+ // #region Step 3: Check states
230
+ // check state of sender/receiver spaces WRT sender identity, new sender
231
+ // identity, and session identity.
232
+ // get newSenderIdentity address via metaspace.getLatestAddr
233
+ // Resolve the latest senderIdentity frame (I1) from the sender's space.
234
+ // After sync, the coordinator should have evolved I → I1 and stored it.
235
+ let newSenderIdentityAddr;
236
+ /**
237
+ * The session keystone addr should be embedded in I1's proof claim target.
238
+ */
239
+ let newSenderIdentity;
240
+ await ifWe(sir, 'newSenderIdentity created and stored in source space', async () => {
241
+ newSenderIdentityAddr = await metaspace.getLatestAddr({
242
+ ibGib: senderIdentity,
243
+ space: sourceSpace,
244
+ });
245
+ if (!newSenderIdentityAddr) {
246
+ throw new Error(`newSenderIdentity not found in space (${sourceSpace.ib}). this should have been evolved and stored during sync (E: a5a798bf8ba467cbc87595dcc2b36726)`);
247
+ }
248
+ newSenderIdentity = await getIdentity_throwIfUndefined({
249
+ addr: newSenderIdentityAddr,
250
+ metaspace,
251
+ space: sourceSpace,
252
+ });
253
+ // todo: add iReckon statements for expectations like claim verb, claim target, etc., of newSenderIdentity
254
+ iReckon(sir, newSenderIdentity).asTo('newSenderIdentity is truthy').isGonnaBeTruthy();
255
+ const syncProof = newSenderIdentity?.data?.proofs?.find(p => p.claim?.verb === KEYSTONE_VERB_SYNC);
256
+ iReckon(sir, syncProof).asTo('I1 has a sync-verb proof/claim').isGonnaBeTruthy();
257
+ iReckon(sir, syncProof?.claim?.target).asTo('sync claim has a target (S^Stjp)').isGonnaBeTruthy();
258
+ });
259
+ if (!newSenderIdentity) {
260
+ throw new Error(`(UNEXPECTED) newSenderIdentity falsy? should have thrown before this if falsy. (E: 7a3d92e6160409de149eaf6802365126)`);
261
+ }
262
+ const sessionIdentityTjpAddr = newSenderIdentity.data.proofs
263
+ .find(p => p.claim.verb === KEYSTONE_VERB_SYNC)?.claim.target;
264
+ if (!sessionIdentityTjpAddr) {
265
+ throw new Error(`(UNEXPECTED) sessionIdentityTjpAddr falsy? (E: c53583b07a78837de84a59388b6ff826)`);
266
+ }
267
+ let sessionIdentity;
268
+ await ifWe(sir, 'creates sessionIdentity genesis (S) locally — exists in sourceSpace', async () => {
269
+ sessionIdentity = await getIdentity_throwIfUndefined({
270
+ addr: sessionIdentityTjpAddr,
271
+ metaspace,
272
+ space: sourceSpace,
273
+ });
274
+ iReckon(sir, sessionIdentity).asTo('sessionIdentity is truthy').isGonnaBeTruthy();
275
+ });
276
+ if (!sessionIdentity) {
277
+ throw new Error(`(UNEXPECTED) sessionIdentity falsy? (E: e1fa06009df535f3c848e6ca8b0bd326)`);
278
+ }
279
+ await ifWe(sir, 'Session identity S has expected state', async () => {
280
+ // #region sanity/compile
281
+ if (!sessionIdentity) {
282
+ throw new Error(`(UNEXPECTED) sessionIdentity falsy? (E: dd229f4e44489a54488768157a393926)`);
283
+ }
284
+ if (!sessionIdentity.data) {
285
+ throw new Error(`(UNEXPECTED) sessionIdentity.data falsy? (E: 56f10c9f9c18c6147ea19281dcbaf826)`);
286
+ }
287
+ // #endregion sanity/compile
288
+ // Verify S has both pool ids: connect and sync
289
+ const sPools = sessionIdentity.data.challengePools;
290
+ iReckon(sir, sPools).asTo('S has challengePools').isGonnaBeTruthy();
291
+ const hasConnectPool = sPools?.some(p => p.id === POOL_ID_CONNECT);
292
+ const hasSyncPool = sPools?.some(p => p.id === POOL_ID_SYNC);
293
+ iReckon(sir, hasConnectPool).asTo('S has connect pool').isGonnaBeTrue();
294
+ iReckon(sir, hasSyncPool).asTo('S has sync pool').isGonnaBeTrue();
295
+ const sProofs = sessionIdentity.data.proofs;
296
+ iReckon(sir, sProofs).asTo('S has proofs array').isGonnaBeTruthy();
297
+ iReckon(sir, sProofs.length === 0).asTo('S has 0 proofs on genesis').isGonnaBeTrue();
298
+ // Verify S is bound to target domain (xStone) via frameDetails
299
+ const targetAddrs = sessionIdentity.data.frameDetails?.targetAddrs;
300
+ iReckon(sir, targetAddrs).asTo('S has targetAddrs array in frameDetails').isGonnaBeTruthy();
301
+ iReckon(sir, targetAddrs?.includes(xStoneAddr)).asTo('S targetAddrs contains the domain being synced (xStoneAddr)').isGonnaBeTrue();
302
+ });
303
+ await ifWe(sir, 'I, I1 and S all exist in destSpace (receiver)', async () => {
304
+ // todo: use getIdentity_throwIfUndefined for all three identities but in destSpace
305
+ const senderIdentityAddr = getIbGibAddr({ ibGib: senderIdentity });
306
+ await getIdentity_throwIfUndefined({
307
+ addr: senderIdentityAddr,
308
+ metaspace,
309
+ space: destSpace
310
+ });
311
+ iReckon(sir, true).asTo('I (original) exists in destSpace').isGonnaBeTrue();
312
+ if (!newSenderIdentityAddr) {
313
+ throw new Error(`newSenderIdentity not found in space (${sourceSpace.ib}). this should have been evolved and stored during sync (E: b626885071885b38d87853189f25c826)`);
314
+ }
315
+ await getIdentity_throwIfUndefined({ addr: newSenderIdentityAddr, metaspace, space: destSpace });
316
+ iReckon(sir, true).asTo('I1 (evolved) exists in destSpace').isGonnaBeTrue();
317
+ await getIdentity_throwIfUndefined({ addr: sessionIdentityTjpAddr, metaspace, space: destSpace });
318
+ iReckon(sir, true).asTo('S (sessionIdentity) exists in destSpace').isGonnaBeTrue();
319
+ });
320
+ // #endregion Step 3: Check states
321
+ });
322
+ //# sourceMappingURL=sync-withid.establish.respec.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-withid.establish.respec.mjs","sourceRoot":"","sources":["../../src/sync/sync-withid.establish.respec.mts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibgib/core-gib",
3
- "version": "0.1.55",
3
+ "version": "0.1.58",
4
4
  "description": "ibgib core functionality, including base architecture for witnesses, spaces, apps, robbots, etc., as well as shared utility functions. Node v19+ needed for heavily-used isomorphic webcrypto hashing consumed in both node and browsers.",
5
5
  "funding": {
6
6
  "type": "individual",
@@ -5,7 +5,10 @@ import {
5
5
  KeystonePoolConfig, KeystonePoolConfig_HashV1, KeystonePoolBehavior,
6
6
  KeystoneReplenishStrategy, KeystonePoolConfigBase, KeystoneChallengeType,
7
7
  } from './keystone-types.mjs';
8
- import { POOL_ID_REVOKE, KEYSTONE_VERB_REVOKE, KEYSTONE_CONFIG_DEFAULT_SIZE, KEYSTONE_CONFIG_DEFAULT_BINDING, KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY, KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL, KEYSTONE_CONFIG_DEFAULT_RANDOM, KEYSTONE_CONFIG_DEFAULT_SIZE_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_RANDOM_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_BINDING_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY_HIGHSECURITY, KeystoneVerb, KEYSTONE_CONFIG_DEFAULT_HASH_ALGORITHM, KEYSTONE_CONFIG_DEFAULT_HASH_ROUNDS, KEYSTONE_CONFIG_DEFAULT_HASH_ALGORITHM_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_HASH_ROUNDS_HIGHSECURITY } from './keystone-constants.mjs';
8
+ import { POOL_ID_REVOKE, KEYSTONE_VERB_REVOKE, KEYSTONE_CONFIG_DEFAULT_SIZE, KEYSTONE_CONFIG_DEFAULT_BINDING, KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY, KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL, KEYSTONE_CONFIG_DEFAULT_RANDOM, KEYSTONE_CONFIG_DEFAULT_SIZE_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_RANDOM_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_BINDING_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY_HIGHSECURITY, KeystoneVerb, KEYSTONE_CONFIG_DEFAULT_HASH_ALGORITHM, KEYSTONE_CONFIG_DEFAULT_HASH_ROUNDS, KEYSTONE_CONFIG_DEFAULT_HASH_ALGORITHM_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_HASH_ROUNDS_HIGHSECURITY, POOL_ID_SYNC, POOL_ID_CONNECT, POOL_ID_MANAGE } from './keystone-constants.mjs';
9
+ import { KeystoneBehaviorProfileTemplate, KeystonePoolTemplate } from './keystone-policy-types.mjs';
10
+
11
+ export { KeystoneBehaviorProfileTemplate, KeystonePoolTemplate };
9
12
 
10
13
  const logalot = GLOBAL_LOG_A_LOT;
11
14
 
@@ -308,14 +311,80 @@ export function createHighSecurityPoolConfig(opts: KeystoneConfigFactoryOptions_
308
311
  export function createManagePoolConfig(opts: KeystoneConfigFactoryOptions_Standard): KeystonePoolConfig {
309
312
  return createHighSecurityPoolConfig({
310
313
  ...opts,
311
- verbs: [KeystoneVerb.MANAGE],
314
+ id: opts.id ?? POOL_ID_MANAGE,
315
+ verbs: opts.verbs ?? [KeystoneVerb.MANAGE],
312
316
  });
313
317
  }
314
318
 
315
319
  export function createRevocationPoolConfig(opts: KeystoneConfigFactoryOptions_Standard): KeystonePoolConfig {
316
320
  return createHighSecurityPoolConfig({
317
321
  ...opts,
318
- verbs: [KeystoneVerb.REVOKE],
319
- replenishStrategy: KeystoneReplenishStrategy.deleteAll,
322
+ id: opts.id ?? POOL_ID_REVOKE,
323
+ verbs: opts.verbs ?? [KeystoneVerb.REVOKE],
324
+ replenishStrategy: opts.replenishStrategy ?? KeystoneReplenishStrategy.deleteAll,
320
325
  });
321
326
  }
327
+
328
+ export function createSyncPoolConfig(opts: KeystoneConfigFactoryOptions_Standard): KeystonePoolConfig {
329
+ return createStandardPoolConfig({
330
+ ...opts,
331
+ id: opts.id ?? POOL_ID_SYNC,
332
+ verbs: opts.verbs ?? [KeystoneVerb.SYNC],
333
+ });
334
+ }
335
+
336
+ export function createConnectPoolConfig(opts: KeystoneConfigFactoryOptions_Standard): KeystonePoolConfig {
337
+ return createStandardPoolConfig({
338
+ ...opts,
339
+ id: opts.id ?? POOL_ID_CONNECT,
340
+ verbs: opts.verbs ?? [KeystoneVerb.CONNECT],
341
+ replenishStrategy: opts.replenishStrategy ?? KeystoneReplenishStrategy.deleteAll,
342
+ });
343
+ }
344
+
345
+ /**
346
+ * Builds a KeystonePoolConfig from a JSON-sourced KeystonePoolTemplate.
347
+ */
348
+ export function createPoolConfigFromJson({
349
+ template,
350
+ behaviorProfiles,
351
+ salt
352
+ }: {
353
+ template: KeystonePoolTemplate;
354
+ behaviorProfiles?: Record<string, KeystoneBehaviorProfileTemplate>;
355
+ salt: string;
356
+ }): KeystonePoolConfig {
357
+ let behavior: KeystoneBehaviorProfileTemplate | undefined;
358
+ if (template.behaviorProfile && behaviorProfiles) {
359
+ behavior = behaviorProfiles[template.behaviorProfile];
360
+ }
361
+ if (!behavior) {
362
+ behavior = template.behaviorInline;
363
+ }
364
+ if (!behavior) {
365
+ behavior = {
366
+ size: KEYSTONE_CONFIG_DEFAULT_SIZE,
367
+ replenish: KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY,
368
+ selectSequentially: KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL,
369
+ selectRandomly: KEYSTONE_CONFIG_DEFAULT_RANDOM,
370
+ targetBindingChars: KEYSTONE_CONFIG_DEFAULT_BINDING
371
+ };
372
+ }
373
+
374
+ return KeystoneConfig.hash()
375
+ .withId(template.id)
376
+ .withSalt(salt)
377
+ .withSize(behavior.size)
378
+ .withHybrid({
379
+ seqCount: behavior.selectSequentially,
380
+ randCount: behavior.selectRandomly,
381
+ })
382
+ .withTargetBinding(behavior.targetBindingChars)
383
+ .withReplenishStrategy(behavior.replenish)
384
+ .withHash({
385
+ algo: template.algo,
386
+ rounds: template.rounds
387
+ })
388
+ .forVerbs(template.allowedVerbs)
389
+ .build();
390
+ }
@@ -3,16 +3,12 @@ import { KeystoneReplenishStrategy } from "./keystone-types.mjs";
3
3
 
4
4
  export const KEYSTONE_ATOM = "keystone";
5
5
  export const KEYSTONE_POOL_ID_REGEXP = /^\w[\w\-.]*$/;
6
- /**
7
- * arbitrary 64 limit? only letters characters good
8
- */
9
- export const KEYSTONE_SALT_REGEXP = /^[a-zA-Z0-9]{1,64}$/;
6
+ export const KEYSTONE_SALT_REGEXP = /^[a-zA-Z0-9\-_]{1,64}$/;
10
7
  /**
11
8
  * arbitrary right now. don't want an easy DoS. this may still be too high.
12
9
  */
13
10
  export const KEYSTONE_HASH_MAX_ROUNDS = 1_000;
14
11
 
15
- // #region KeystoneVerb enum
16
12
  /**
17
13
  * @see {@link KeystoneVerb.REVOKE}
18
14
  */
@@ -25,10 +21,28 @@ export const KEYSTONE_VERB_MANAGE = "manage";
25
21
  * @see {@link KeystoneVerb.SIGN}
26
22
  */
27
23
  export const KEYSTONE_VERB_SIGN = "sign";
24
+ /**
25
+ * Used when a senderIdentity keystone authorizes a session keystone for a sync
26
+ * operation. The senderIdentity is evolved with a claim whose verb is `sync`,
27
+ * pointing to the session keystone genesis address.
28
+ *
29
+ * @see {@link KeystoneVerb.SYNC}
30
+ */
31
+ export const KEYSTONE_VERB_SYNC = "sync";
32
+ /**
33
+ * Used by the session keystone's `connect` pool to authorize the transport
34
+ * connect (e.g. WebSocket challenge/response). Consumed exactly once per
35
+ * sync session during `peer.connect()`.
36
+ *
37
+ * @see {@link KeystoneVerb.CONNECT}
38
+ */
39
+ export const KEYSTONE_VERB_CONNECT = "connect";
28
40
  export type KeystoneVerb =
29
41
  | typeof KEYSTONE_VERB_REVOKE
30
42
  | typeof KEYSTONE_VERB_MANAGE
31
- | typeof KEYSTONE_VERB_SIGN;
43
+ | typeof KEYSTONE_VERB_SIGN
44
+ | typeof KEYSTONE_VERB_SYNC
45
+ | typeof KEYSTONE_VERB_CONNECT;
32
46
 
33
47
  /**
34
48
  * Verbs that describe actions that can be authorized by a Keystone.
@@ -55,6 +69,16 @@ export const KeystoneVerb = {
55
69
  * This is the least of all privileges that can actually evolve a keystone.
56
70
  */
57
71
  SIGN: KEYSTONE_VERB_SIGN,
72
+ /**
73
+ * Used when a senderIdentity keystone authorizes a session keystone.
74
+ * The senderIdentity is evolved with a `sync` claim targeting S^Stjp.
75
+ */
76
+ SYNC: KEYSTONE_VERB_SYNC,
77
+ /**
78
+ * Used by the session keystone's `connect` pool for the transport
79
+ * connect (proof-of-possession). Consumed once per session.
80
+ */
81
+ CONNECT: KEYSTONE_VERB_CONNECT,
58
82
  } satisfies { [key: string]: KeystoneVerb };
59
83
  export const KEYSTONE_VERB_VALID_VALUES = Object.values(KeystoneVerb);
60
84
  export function isKeystoneVerb(value: string): value is KeystoneVerb {
@@ -70,6 +94,18 @@ export const POOL_ID_REVOKE = KEYSTONE_VERB_REVOKE;
70
94
  export const POOL_ID_MANAGE = KEYSTONE_VERB_MANAGE;
71
95
  export const POOL_ID_DEFAULT = "default";
72
96
  export const POOL_ID_DELEGATE = "delegate";
97
+ /**
98
+ * Pool ID for the session keystone's transport connect pool.
99
+ * Paired with {@link KEYSTONE_VERB_CONNECT}. Consumed once per sync session
100
+ * during `peer.connect()`.
101
+ */
102
+ export const POOL_ID_CONNECT = KEYSTONE_VERB_CONNECT;
103
+ /**
104
+ * Pool ID for the session keystone's per-turn signing pool.
105
+ * Paired with {@link KEYSTONE_VERB_SYNC}. Consumed once per outgoing sync
106
+ * context frame (Init, Delta, Commit, etc.).
107
+ */
108
+ export const POOL_ID_SYNC = KEYSTONE_VERB_SYNC;
73
109
  /**
74
110
  * **THESE SHOULD ONLY BE USED IN TEMPORARY/SESSION KEYSTONES.**
75
111
  * _this is because a receiver could intercept the stone, DoS participants and
@@ -1,6 +1,6 @@
1
1
  import { extractErrorMsg, hash, HashAlgorithm, pretty } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
2
2
  import { GIB } from "@ibgib/ts-gib/dist/V1/constants.mjs";
3
- import { Ib, TransformResult } from "@ibgib/ts-gib/dist/types.mjs";
3
+ import { Ib, IbGibAddr, TransformResult } from "@ibgib/ts-gib/dist/types.mjs";
4
4
  import { getIbAndGib, getIbGibAddr } from "@ibgib/ts-gib/dist/helper.mjs";
5
5
  import { validateIbGibIntrinsically } from "@ibgib/ts-gib/dist/V1/validate-helper.mjs";
6
6
  import { mut8 } from "@ibgib/ts-gib/dist/V1/transforms/mut8.mjs";
@@ -543,7 +543,7 @@ export async function validateChallengePool_typeHashRevealV1({ pool }: {
543
543
 
544
544
  const { algo, rounds, salt, } = pool.config as KeystonePoolConfig_HashV1;
545
545
 
546
- const validAlgos: HashAlgorithm[] = [HashAlgorithm.sha_256];
546
+ const validAlgos: HashAlgorithm[] = [HashAlgorithm.sha_256, HashAlgorithm.sha_512];
547
547
  if (algo) {
548
548
  if (!validAlgos.includes(algo)) {
549
549
  errors.push(`${lc} invalid hash algorithm (${algo}). Must be one of ${validAlgos}. (E: a22399ca3a68e63ffcc7507699be5826)`);
@@ -1116,3 +1116,45 @@ export async function validateKeystoneGraph({
1116
1116
  }
1117
1117
  }
1118
1118
 
1119
+ export async function getIdentity({
1120
+ addr,
1121
+ metaspace,
1122
+ space,
1123
+ }: {
1124
+ addr: IbGibAddr,
1125
+ metaspace: MetaspaceService,
1126
+ space: IbGibSpaceAny,
1127
+ }): Promise<KeystoneIbGib_V1 | undefined> {
1128
+ const lc = `[${getIdentity.name}]`;
1129
+ try {
1130
+ if (logalot) { console.log(`${lc} starting... (I: 7f1dac53ff4691cb08cd267bf75f4326)`); }
1131
+ const resGet = await metaspace.get({ addr, space });
1132
+ const identityIbGib = resGet.ibGibs?.at(0) as KeystoneIbGib_V1;
1133
+ if (identityIbGib) {
1134
+ if (!identityIbGib.data) { throw new Error(`(UNEXPECTED) identityIbGib.data falsy? (E: d2f188232cd3bafb873b89e3a25a4826)`); }
1135
+ // should actually be a `isKeystone` guard, but hey...
1136
+ if (!identityIbGib.ib.startsWith(KEYSTONE_ATOM)) {
1137
+ throw new Error(`invalid. does not start with ${KEYSTONE_ATOM} (E: 4523f8647cc139f8c49597fb86329426)`);
1138
+ }
1139
+ }
1140
+ return identityIbGib;
1141
+ } catch (error) {
1142
+ console.error(`${lc} ${extractErrorMsg(error)}`);
1143
+ throw error;
1144
+ } finally {
1145
+ if (logalot) { console.log(`${lc} complete.`); }
1146
+ }
1147
+ }
1148
+ export async function getIdentity_throwIfUndefined({
1149
+ addr,
1150
+ metaspace,
1151
+ space,
1152
+ }: {
1153
+ addr: IbGibAddr,
1154
+ metaspace: MetaspaceService,
1155
+ space: IbGibSpaceAny,
1156
+ }): Promise<KeystoneIbGib_V1> {
1157
+ const identityIbGib = await getIdentity({ metaspace, addr, space });
1158
+ if (!identityIbGib) { throw new Error(`addr (${addr}) not found in space: ${space.ib} (E: 7533682e805819cc78bdb0d8960be826)`); }
1159
+ return identityIbGib;
1160
+ }
@@ -0,0 +1,25 @@
1
+ import { HashAlgorithm } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
2
+ import { KeystoneReplenishStrategy, KeystoneChallengeType } from "./keystone-types.mjs";
3
+
4
+ export interface KeystoneBehaviorProfileTemplate {
5
+ size: number;
6
+ replenish: KeystoneReplenishStrategy;
7
+ selectSequentially: number;
8
+ selectRandomly: number;
9
+ targetBindingChars: number;
10
+ }
11
+
12
+ export interface KeystonePoolTemplate {
13
+ id: string;
14
+ allowedVerbs: string[];
15
+ behaviorProfile?: string; // Reference to a behavior profile key
16
+ behaviorInline?: KeystoneBehaviorProfileTemplate; // Or specify behavior inline
17
+ algo: HashAlgorithm;
18
+ rounds: number;
19
+ type?: KeystoneChallengeType;
20
+ }
21
+
22
+ export interface KeystonePolicyConfigTemplate {
23
+ behaviorProfiles?: Record<string, KeystoneBehaviorProfileTemplate>;
24
+ pools: Record<string, KeystonePoolTemplate>;
25
+ }