1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455 | {
"_": [
"The four modal overlays — sueta.app.sheets (Phase 5d), the last raw-HTML in",
"this repo. `cases` are the projections' inputs: a PeerInfo bag, room.cljs's",
"SelfIdentityInfo, and the two sheets that project from nothing. `derived`",
"are the states you can only REACH — each is `[from, event, to, effects]` and",
"the test replays it through the pure `step`, so no state in here is asserted",
"into existence. `stacks` names what is on screen, because the overlays are a",
"STACK: `identity+copy` is the real case (\"copy key\" with a refused",
"clipboard) and `empty` is the one that matters most — a dismissed overlay",
"renders to nothing at all, which is what makes it GONE rather than hidden.",
"",
"WHAT IS NOT IN THIS FILE, and could not be: an Ed25519 seed. `identity-",
"sheet` never reads `me.seed` and the manual-copy text is not in the copy",
"sheet's state either — both are written onto their field by a mount hook in",
"app/ui, so the fixture cannot carry a private key even by accident. The",
"43-character string in the import steps is zeroes, and is only ever measured",
"against a regex.",
"",
"`conflict-kept` is deliberately EQUAL to `identity`: choosing \"keep this",
"one\" must leave exactly the card you would have had with no suite conflict",
"at all, and the test asserts that identity rather than tolerating it.",
"",
"There is NO generator script, on purpose — see tiles-view.json's `_`.",
"",
"`peer-hostile` is a peer whose display name is markup (it comes off the",
"wire; app/chat clamps its LENGTH, not its content) and `identity-hostile` is",
"your own display name as markup, which reaches the rename field as a",
"`.value` rather than as HTML."
],
"cases": {
"ask": {
"kind": "askName",
"current": null
},
"ask-prefilled": {
"kind": "askName",
"current": "iulia"
},
"peer": {
"kind": "peer",
"peer": "12D3KooWA",
"p": {
"state": "direct",
"name": "ana",
"id": {
"pub": "PUBA",
"fp": {
"emoji": "🦊🌊🎈",
"hex": "a1b2 c3d4 e5f6"
}
}
},
"verdict": "nil"
},
"peer-verified": {
"kind": "peer",
"peer": "12D3KooWA",
"p": {
"state": "direct",
"name": "ana",
"id": {
"pub": "PUBA",
"fp": {
"emoji": "🦊🌊🎈",
"hex": "a1b2 c3d4 e5f6"
}
}
},
"verdict": "{:verified? true :key-changed? false}"
},
"peer-key-changed": {
"kind": "peer",
"peer": "12D3KooWA",
"p": {
"state": "direct",
"name": "ana",
"id": {
"pub": "PUBA",
"fp": {
"emoji": "🦊🌊🎈",
"hex": "a1b2 c3d4 e5f6"
}
}
},
"verdict": "{:verified? true :key-changed? true}"
},
"peer-anon": {
"kind": "peer",
"peer": "12D3KooWB",
"p": {
"state": "connecting"
},
"verdict": "nil"
},
"peer-hostile": {
"kind": "peer",
"peer": "12D3KooWA",
"p": {
"state": "direct",
"name": "<img src=x onerror=alert(1)>",
"id": {
"pub": "PUBA",
"fp": {
"emoji": "🦊🌊🎈",
"hex": "a1b2 c3d4 e5f6"
}
}
},
"verdict": "nil"
},
"identity": {
"kind": "identity",
"me": {
"fp": {
"emoji": "🐝🌙⭐",
"hex": "9f8e 7d6c 5b4a"
},
"pub": "PUBME",
"profile": {}
},
"name": "iulia"
},
"identity-hostile": {
"kind": "identity",
"me": {
"fp": {
"emoji": "🐝🌙⭐",
"hex": "9f8e 7d6c 5b4a"
},
"pub": "PUBME",
"profile": {}
},
"name": "<b>iulia</b>"
},
"identity-no-key": {
"kind": "identity",
"me": null,
"name": "iulia"
},
"identity-conflict": {
"kind": "identity",
"me": {
"fp": {
"emoji": "🐝🌙⭐",
"hex": "9f8e 7d6c 5b4a"
},
"pub": "PUBME",
"profile": {},
"conflict": {}
},
"name": "iulia"
},
"copy": {
"kind": "copy"
}
},
"derived": [
[
"identity-conflict",
"[:adopt]",
"conflict-armed",
"[[:disarm-after 4000 :adopt]]"
],
[
"identity-conflict",
"[:conf-fp \"🐢🌵🎩 “iulia elsewhere”\"]",
"conflict-fp",
"[]"
],
[
"identity-conflict",
"[:conf-failed]",
"conflict-failed",
"[]"
],
[
"identity-conflict",
"[:keep]",
"conflict-kept",
"[[:keep-local] [:toast \"keeping this identity for chat — the hub won't ask again\"]]"
],
[
"identity",
"[:reveal]",
"identity-revealed",
"[]"
],
[
"identity",
"[:rename \"bogdan\"]",
"identity-renamed",
"[[:rename \"bogdan\"] [:toast \"you're now “bogdan”\"]]"
],
[
"identity",
"[:import \"0000000000000000000000000000000000000000000\" false]",
"identity-import-armed",
"[[:disarm-after 4000 :import]]"
]
],
"states": {
"ask": "{:current \"\", :kind :ask-name}",
"ask-prefilled": "{:current \"iulia\", :kind :ask-name}",
"peer": "{:fp-emoji \"🦊🌊🎈\", :fp-hex \"a1b2 c3d4 e5f6\", :id? true, :key-changed? false, :kind :peer, :name \"ana\", :peer \"12D3KooWA\", :pub \"PUBA\", :verified? false}",
"peer-verified": "{:fp-emoji \"🦊🌊🎈\", :fp-hex \"a1b2 c3d4 e5f6\", :id? true, :key-changed? false, :kind :peer, :name \"ana\", :peer \"12D3KooWA\", :pub \"PUBA\", :verified? true}",
"peer-key-changed": "{:fp-emoji \"🦊🌊🎈\", :fp-hex \"a1b2 c3d4 e5f6\", :id? true, :key-changed? true, :kind :peer, :name \"ana\", :peer \"12D3KooWA\", :pub \"PUBA\", :verified? true}",
"peer-anon": "{:fp-emoji nil, :fp-hex nil, :id? false, :key-changed? false, :kind :peer, :name \"unknown\", :peer \"12D3KooWB\", :pub nil, :verified? false}",
"peer-hostile": "{:fp-emoji \"🦊🌊🎈\", :fp-hex \"a1b2 c3d4 e5f6\", :id? true, :key-changed? false, :kind :peer, :name \"<img src=x onerror=alert(1)>\", :peer \"12D3KooWA\", :pub \"PUBA\", :verified? false}",
"identity": "{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false}",
"identity-hostile": "{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"<b>iulia</b>\", :me? true, :reveal? false}",
"identity-no-key": "{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji nil, :fp-hex nil, :kind :identity, :me-name \"iulia\", :me? false, :reveal? false}",
"identity-conflict": "{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? true, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false}",
"copy": "{:kind :copy}",
"conflict-armed": "{:armed #{:adopt}, :conf-failed? false, :conf-fp nil, :conflict? true, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false}",
"conflict-fp": "{:armed #{}, :conf-failed? false, :conf-fp \"🐢🌵🎩 “iulia elsewhere”\", :conflict? true, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false}",
"conflict-failed": "{:armed #{}, :conf-failed? true, :conf-fp nil, :conflict? true, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false}",
"conflict-kept": "{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false}",
"identity-revealed": "{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? true}",
"identity-renamed": "{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"bogdan\", :me? true, :reveal? false}",
"identity-import-armed": "{:armed #{:import}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false}"
},
"stacks": {
"ask": [
"ask"
],
"ask-prefilled": [
"ask-prefilled"
],
"peer": [
"peer"
],
"peer-verified": [
"peer-verified"
],
"peer-key-changed": [
"peer-key-changed"
],
"peer-anon": [
"peer-anon"
],
"peer-hostile": [
"peer-hostile"
],
"identity": [
"identity"
],
"identity-hostile": [
"identity-hostile"
],
"identity-no-key": [
"identity-no-key"
],
"identity-conflict": [
"identity-conflict"
],
"copy": [
"copy"
],
"conflict-armed": [
"conflict-armed"
],
"conflict-fp": [
"conflict-fp"
],
"conflict-failed": [
"conflict-failed"
],
"conflict-kept": [
"conflict-kept"
],
"identity-revealed": [
"identity-revealed"
],
"identity-renamed": [
"identity-renamed"
],
"identity-import-armed": [
"identity-import-armed"
],
"empty": [],
"identity+copy": [
"identity",
"copy"
]
},
"hiccup": {
"ask": "([:div.overlay {:replicant/key \"ask-name\"} [:div.modal [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · no servers hold your words\"] [:input#name-in {:type \"text\", :maxlength \"32\", :value \"\", :placeholder \"your name\", :autocomplete \"nickname\", :enterkeyhint \"done\", :on {:keydown [:name-key]}, :replicant/on-mount [:focus-soon]}] [:button#name-ok.primary {:on {:click [:name-ok]}} \"join\"]]])",
"ask-prefilled": "([:div.overlay {:replicant/key \"ask-name\"} [:div.modal [:h2 \"sueta\"] [:p \"p2p · end-to-end encrypted · no servers hold your words\"] [:input#name-in {:type \"text\", :maxlength \"32\", :value \"iulia\", :placeholder \"your name\", :autocomplete \"nickname\", :enterkeyhint \"done\", :on {:keydown [:name-key]}, :replicant/on-mount [:focus-soon]}] [:button#name-ok.primary {:on {:click [:name-ok]}} \"join\"]]])",
"peer": "([:div.overlay {:replicant/key \"peer\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"ana\"] [:div.fp-emoji \"🦊🌊🎈\"] nil [:p.hint \"ask them to open their identity card and read their emoji aloud — if all four match, mark them verified\"] [:p.fp-hex \"a1b2 c3d4 e5f6\"] [:button#verify-btn.primary {:on {:click [:verify]}} \"mark as verified\"] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"peer-verified": "([:div.overlay {:replicant/key \"peer\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"ana\"] [:div.fp-emoji \"🦊🌊🎈\"] nil [:p.hint \"ask them to open their identity card and read their emoji aloud — if all four match, mark them verified\"] [:p.fp-hex \"a1b2 c3d4 e5f6\"] [:button#verify-btn.primary {:on {:click [:verify]}} \"✓ verified — tap to unverify\"] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"peer-key-changed": "([:div.overlay {:replicant/key \"peer\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"ana\"] [:div.fp-emoji \"🦊🌊🎈\"] [:p.warn \"⚠️ this name previously used a DIFFERENT key\"] [:p.hint \"ask them to open their identity card and read their emoji aloud — if all four match, mark them verified\"] [:p.fp-hex \"a1b2 c3d4 e5f6\"] [:button#verify-btn.primary {:on {:click [:verify]}} \"✓ verified — tap to unverify\"] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"peer-anon": "([:div.overlay {:replicant/key \"peer\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"unknown\"] nil nil nil nil nil [:p.hint \"no identity announced — their browser may not support it, or they run an old version\"] [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"peer-hostile": "([:div.overlay {:replicant/key \"peer\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"<img src=x onerror=alert(1)>\"] [:div.fp-emoji \"🦊🌊🎈\"] nil [:p.hint \"ask them to open their identity card and read their emoji aloud — if all four match, mark them verified\"] [:p.fp-hex \"a1b2 c3d4 e5f6\"] [:button#verify-btn.primary {:on {:click [:verify]}} \"mark as verified\"] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"identity": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] nil [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · iulia\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"identity-hostile": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] nil [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"<b>iulia</b>\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · <b>iulia</b>\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"identity-no-key": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] nil [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] nil nil nil nil nil nil [:p.hint \"this browser cannot create an identity (no Ed25519 support)\"] [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"identity-conflict": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] [:div.id-conflict [:p.warn \"⚠ your suite identity on ardegazu.ro is a different key\"] [:div#conf-fp.fp-emoji \"…\"] [:p.hint \"use it here to be the same person in every app — or keep this one for chat only.\"] [:div.id-row [:button#id-adopt.primary {:class nil, :on {:click [:adopt]}} \"use suite identity\"] [:button#id-keep.ghost {:on {:click [:keep]}} \"keep this one\"]]] [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · iulia\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"copy": "([:div.overlay {:replicant/key \"copy\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:p.hint \"copy it manually:\"] [:input.copy-out {:type \"text\", :readonly \"readonly\", :on {:focus [:select-copy]}, :replicant/on-mount [:fill-copy]}] [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"conflict-armed": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] [:div.id-conflict [:p.warn \"⚠ your suite identity on ardegazu.ro is a different key\"] [:div#conf-fp.fp-emoji \"…\"] [:p.hint \"use it here to be the same person in every app — or keep this one for chat only.\"] [:div.id-row [:button#id-adopt.primary {:class \"armed\", :on {:click [:adopt]}} \"switch? this room identity is abandoned unless its key is saved\"] [:button#id-keep.ghost {:on {:click [:keep]}} \"keep this one\"]]] [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · iulia\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"conflict-fp": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] [:div.id-conflict [:p.warn \"⚠ your suite identity on ardegazu.ro is a different key\"] [:div#conf-fp.fp-emoji \"🐢🌵🎩 “iulia elsewhere”\"] [:p.hint \"use it here to be the same person in every app — or keep this one for chat only.\"] [:div.id-row [:button#id-adopt.primary {:class nil, :on {:click [:adopt]}} \"use suite identity\"] [:button#id-keep.ghost {:on {:click [:keep]}} \"keep this one\"]]] [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · iulia\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"conflict-failed": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] [:div.id-conflict [:p.warn \"⚠ your suite identity on ardegazu.ro is a different key\"] nil [:p.hint \"use it here to be the same person in every app — or keep this one for chat only.\"] [:div.id-row [:button#id-adopt.primary {:class nil, :on {:click [:adopt]}} \"use suite identity\"] [:button#id-keep.ghost {:on {:click [:keep]}} \"keep this one\"]]] [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · iulia\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"conflict-kept": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] nil [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · iulia\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"identity-revealed": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] nil [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · iulia\"}] [:input {:type \"text\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"identity-renamed": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] nil [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"bogdan\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · bogdan\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"identity-import-armed": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] nil [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · iulia\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class \"armed\", :type \"submit\"} \"switch identity? tap again\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])",
"empty": "()",
"identity+copy": "([:div.overlay {:replicant/key \"identity\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:h2 \"your identity\"] nil [:form#id-rename.new-room-form {:on {:submit [:rename]}} [:input {:type \"text\", :maxlength \"32\", :autocomplete \"nickname\", :enterkeyhint \"done\", :placeholder \"display name\", :value \"iulia\"}] [:button.ghost {:type \"submit\"} \"rename\"]] [:div.fp-emoji \"🐝🌙⭐\"] [:p.hint \"others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.\"] [:p.fp-hex \"9f8e 7d6c 5b4a\"] [:form#id-save {:method \"dialog\", :on {:submit [:save]}} [:input {:type \"text\", :name \"username\", :autocomplete \"username\", :spellcheck \"false\", :value \"sueta · iulia\"}] [:input {:type \"password\", :name \"password\", :autocomplete \"new-password\", :replicant/on-mount [:fill-seed]}] [:button.primary {:type \"submit\"} \"💾 save in password app\"]] [:div.id-row [:button#id-copy.ghost {:on {:click [:copy-key]}} \"copy key\"] [:button#id-reveal.ghost {:on {:click [:reveal]}} \"reveal\"]] [:form#id-import {:method \"dialog\", :on {:submit [:import]}} [:input {:type \"password\", :name \"password\", :autocomplete \"current-password\", :placeholder \"paste identity key to switch…\"}] [:button.ghost {:class nil, :type \"submit\"} \"use this identity\"]] nil [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]] [:div.overlay {:replicant/key \"copy\", :on {:click [:overlay-click]}} [:div.modal.id-sheet [:p.hint \"copy it manually:\"] [:input.copy-out {:type \"text\", :readonly \"readonly\", :on {:focus [:select-copy]}, :replicant/on-mount [:fill-copy]}] [:button#sheet-close.ghost {:on {:click [:close]}} \"close\"]]])"
},
"html": {
"ask": "<div class=\"overlay\"><div class=\"modal\"><h2>sueta</h2><p>p2p · end-to-end encrypted · no servers hold your words</p><input placeholder=\"your name\" value type=\"text\" maxlength=\"32\" enterkeyhint=\"done\" id=\"name-in\" autocomplete=\"nickname\"><button id=\"name-ok\" class=\"primary\">join</button></div></div>",
"peer": "<div class=\"overlay\"><div class=\"modal id-sheet\"><h2>ana</h2><div class=\"fp-emoji\">🦊🌊🎈</div><p class=\"hint\">ask them to open their identity card and read their emoji aloud — if all four match, mark them verified</p><p class=\"fp-hex\">a1b2 c3d4 e5f6</p><button id=\"verify-btn\" class=\"primary\">mark as verified</button><button id=\"sheet-close\" class=\"ghost\">close</button></div></div>",
"peer-anon": "<div class=\"overlay\"><div class=\"modal id-sheet\"><h2>unknown</h2><p class=\"hint\">no identity announced — their browser may not support it, or they run an old version</p><button id=\"sheet-close\" class=\"ghost\">close</button></div></div>",
"peer-hostile": "<div class=\"overlay\"><div class=\"modal id-sheet\"><h2><img src=x onerror=alert(1)></h2><div class=\"fp-emoji\">🦊🌊🎈</div><p class=\"hint\">ask them to open their identity card and read their emoji aloud — if all four match, mark them verified</p><p class=\"fp-hex\">a1b2 c3d4 e5f6</p><button id=\"verify-btn\" class=\"primary\">mark as verified</button><button id=\"sheet-close\" class=\"ghost\">close</button></div></div>",
"identity": "<div class=\"overlay\"><div class=\"modal id-sheet\"><h2>your identity</h2><form id=\"id-rename\" class=\"new-room-form\"><input type=\"text\" maxlength=\"32\" autocomplete=\"nickname\" enterkeyhint=\"done\" placeholder=\"display name\" value=\"iulia\"><button type=\"submit\" class=\"ghost\">rename</button></form><div class=\"fp-emoji\">🐝🌙⭐</div><p class=\"hint\">others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.</p><p class=\"fp-hex\">9f8e 7d6c 5b4a</p><form method=\"dialog\" id=\"id-save\"><input type=\"text\" name=\"username\" autocomplete=\"username\" spellcheck=\"false\" value=\"sueta · iulia\"><input type=\"password\" name=\"password\" autocomplete=\"new-password\"><button type=\"submit\" class=\"primary\">💾 save in password app</button></form><div class=\"id-row\"><button id=\"id-copy\" class=\"ghost\">copy key</button><button id=\"id-reveal\" class=\"ghost\">reveal</button></div><form method=\"dialog\" id=\"id-import\"><input type=\"password\" name=\"password\" autocomplete=\"current-password\" placeholder=\"paste identity key to switch…\"><button type=\"submit\" class=\"ghost\">use this identity</button></form><button id=\"sheet-close\" class=\"ghost\">close</button></div></div>",
"identity-hostile": "<div class=\"overlay\"><div class=\"modal id-sheet\"><h2>your identity</h2><form id=\"id-rename\" class=\"new-room-form\"><input type=\"text\" maxlength=\"32\" autocomplete=\"nickname\" enterkeyhint=\"done\" placeholder=\"display name\" value=\"<b>iulia</b>\"><button type=\"submit\" class=\"ghost\">rename</button></form><div class=\"fp-emoji\">🐝🌙⭐</div><p class=\"hint\">others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.</p><p class=\"fp-hex\">9f8e 7d6c 5b4a</p><form method=\"dialog\" id=\"id-save\"><input type=\"text\" name=\"username\" autocomplete=\"username\" spellcheck=\"false\" value=\"sueta · <b>iulia</b>\"><input type=\"password\" name=\"password\" autocomplete=\"new-password\"><button type=\"submit\" class=\"primary\">💾 save in password app</button></form><div class=\"id-row\"><button id=\"id-copy\" class=\"ghost\">copy key</button><button id=\"id-reveal\" class=\"ghost\">reveal</button></div><form method=\"dialog\" id=\"id-import\"><input type=\"password\" name=\"password\" autocomplete=\"current-password\" placeholder=\"paste identity key to switch…\"><button type=\"submit\" class=\"ghost\">use this identity</button></form><button id=\"sheet-close\" class=\"ghost\">close</button></div></div>",
"identity-no-key": "<div class=\"overlay\"><div class=\"modal id-sheet\"><h2>your identity</h2><form id=\"id-rename\" class=\"new-room-form\"><input type=\"text\" maxlength=\"32\" autocomplete=\"nickname\" enterkeyhint=\"done\" placeholder=\"display name\" value=\"iulia\"><button type=\"submit\" class=\"ghost\">rename</button></form><p class=\"hint\">this browser cannot create an identity (no Ed25519 support)</p><button id=\"sheet-close\" class=\"ghost\">close</button></div></div>",
"identity-conflict": "<div class=\"overlay\"><div class=\"modal id-sheet\"><h2>your identity</h2><div class=\"id-conflict\"><p class=\"warn\">⚠ your suite identity on ardegazu.ro is a different key</p><div id=\"conf-fp\" class=\"fp-emoji\">…</div><p class=\"hint\">use it here to be the same person in every app — or keep this one for chat only.</p><div class=\"id-row\"><button id=\"id-adopt\" class=\"primary\">use suite identity</button><button id=\"id-keep\" class=\"ghost\">keep this one</button></div></div><form id=\"id-rename\" class=\"new-room-form\"><input type=\"text\" maxlength=\"32\" autocomplete=\"nickname\" enterkeyhint=\"done\" placeholder=\"display name\" value=\"iulia\"><button type=\"submit\" class=\"ghost\">rename</button></form><div class=\"fp-emoji\">🐝🌙⭐</div><p class=\"hint\">others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.</p><p class=\"fp-hex\">9f8e 7d6c 5b4a</p><form method=\"dialog\" id=\"id-save\"><input type=\"text\" name=\"username\" autocomplete=\"username\" spellcheck=\"false\" value=\"sueta · iulia\"><input type=\"password\" name=\"password\" autocomplete=\"new-password\"><button type=\"submit\" class=\"primary\">💾 save in password app</button></form><div class=\"id-row\"><button id=\"id-copy\" class=\"ghost\">copy key</button><button id=\"id-reveal\" class=\"ghost\">reveal</button></div><form method=\"dialog\" id=\"id-import\"><input type=\"password\" name=\"password\" autocomplete=\"current-password\" placeholder=\"paste identity key to switch…\"><button type=\"submit\" class=\"ghost\">use this identity</button></form><button id=\"sheet-close\" class=\"ghost\">close</button></div></div>",
"copy": "<div class=\"overlay\"><div class=\"modal id-sheet\"><p class=\"hint\">copy it manually:</p><input type=\"text\" readonly=\"readonly\" class=\"copy-out\"><button id=\"sheet-close\" class=\"ghost\">close</button></div></div>",
"empty": "",
"identity+copy": "<div class=\"overlay\"><div class=\"modal id-sheet\"><h2>your identity</h2><form id=\"id-rename\" class=\"new-room-form\"><input type=\"text\" maxlength=\"32\" autocomplete=\"nickname\" enterkeyhint=\"done\" placeholder=\"display name\" value=\"iulia\"><button type=\"submit\" class=\"ghost\">rename</button></form><div class=\"fp-emoji\">🐝🌙⭐</div><p class=\"hint\">others verify you by these four emoji. your identity is one secret key — save it in your password app to keep the same identity on any device (devices with the same identity also sync your room list). anyone holding the key gets both.</p><p class=\"fp-hex\">9f8e 7d6c 5b4a</p><form method=\"dialog\" id=\"id-save\"><input type=\"text\" name=\"username\" autocomplete=\"username\" spellcheck=\"false\" value=\"sueta · iulia\"><input type=\"password\" name=\"password\" autocomplete=\"new-password\"><button type=\"submit\" class=\"primary\">💾 save in password app</button></form><div class=\"id-row\"><button id=\"id-copy\" class=\"ghost\">copy key</button><button id=\"id-reveal\" class=\"ghost\">reveal</button></div><form method=\"dialog\" id=\"id-import\"><input type=\"password\" name=\"password\" autocomplete=\"current-password\" placeholder=\"paste identity key to switch…\"><button type=\"submit\" class=\"ghost\">use this identity</button></form><button id=\"sheet-close\" class=\"ghost\">close</button></div></div><div class=\"overlay\"><div class=\"modal id-sheet\"><p class=\"hint\">copy it manually:</p><input type=\"text\" readonly=\"readonly\" class=\"copy-out\"><button id=\"sheet-close\" class=\"ghost\">close</button></div></div>"
},
"steps": [
[
"ask",
"[:name-ok \" \"]",
"[{:current \"\", :kind :ask-name} [[:focus-name]]]"
],
[
"ask",
"[:name-ok \" ana \"]",
"[nil [[:name \"ana\"]]]"
],
[
"ask",
"[:close]",
"[nil []]"
],
[
"peer",
"[:verify]",
"[nil [[:verify \"PUBA\" \"ana\" true]]]"
],
[
"peer-verified",
"[:verify]",
"[nil [[:verify \"PUBA\" \"ana\" false]]]"
],
[
"peer-anon",
"[:close]",
"[nil []]"
],
[
"peer",
"[:disarm :adopt]",
"[{:fp-emoji \"🦊🌊🎈\", :fp-hex \"a1b2 c3d4 e5f6\", :id? true, :key-changed? false, :kind :peer, :name \"ana\", :peer \"12D3KooWA\", :pub \"PUBA\", :verified? false} []]"
],
[
"identity",
"[:reveal]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? true} []]"
],
[
"identity-revealed",
"[:reveal]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} []]"
],
[
"identity",
"[:rename \"bogdan\"]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"bogdan\", :me? true, :reveal? false} [[:rename \"bogdan\"] [:toast \"you're now “bogdan”\"]]]"
],
[
"identity",
"[:rename \"iulia\"]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} []]"
],
[
"identity",
"[:rename \" \"]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} []]"
],
[
"identity",
"[:copy-key]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} [[:copy-key]]]"
],
[
"identity",
"[:save]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} [[:save-credential]]]"
],
[
"identity",
"[:import \"0000000000000000000000000000000000000000000\" true]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} [[:toast \"that's already your identity\"]]]"
],
[
"identity",
"[:import \"short\" false]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} [[:toast \"that doesn't look like an identity key\"]]]"
],
[
"identity",
"[:import \"0000000000000000000000000000000000000000000\" false]",
"[{:armed #{:import}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} [[:disarm-after 4000 :import]]]"
],
[
"identity-import-armed",
"[:import \"0000000000000000000000000000000000000000000\" false]",
"[{:armed #{:import}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} [[:import \"0000000000000000000000000000000000000000000\"]]]"
],
[
"identity-conflict",
"[:adopt]",
"[{:armed #{:adopt}, :conf-failed? false, :conf-fp nil, :conflict? true, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} [[:disarm-after 4000 :adopt]]]"
],
[
"conflict-armed",
"[:adopt]",
"[{:armed #{:adopt}, :conf-failed? false, :conf-fp nil, :conflict? true, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} [[:adopt]]]"
],
[
"conflict-armed",
"[:disarm :adopt]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? true, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} []]"
],
[
"identity-conflict",
"[:keep]",
"[{:armed #{}, :conf-failed? false, :conf-fp nil, :conflict? false, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} [[:keep-local] [:toast \"keeping this identity for chat — the hub won't ask again\"]]]"
],
[
"identity-conflict",
"[:conf-fp \"🐢🌵🎩\"]",
"[{:armed #{}, :conf-failed? false, :conf-fp \"🐢🌵🎩\", :conflict? true, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} []]"
],
[
"identity-conflict",
"[:conf-failed]",
"[{:armed #{}, :conf-failed? true, :conf-fp nil, :conflict? true, :fp-emoji \"🐝🌙⭐\", :fp-hex \"9f8e 7d6c 5b4a\", :kind :identity, :me-name \"iulia\", :me? true, :reveal? false} []]"
],
[
"copy",
"[:close]",
"[nil []]"
],
[
"copy",
"[:nonsense]",
"[{:kind :copy} []]"
]
]
}
|