@stacknyu/pi-glitch-lab 0.0.0-stage → 0.5.1

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 (37) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +87 -2
  4. package/examples/glitchy-app/README.md +14 -0
  5. package/examples/glitchy-app/THIRD_PARTY_NOTICES.md +27 -0
  6. package/examples/glitchy-app/app.jsx +62 -0
  7. package/examples/glitchy-app/public/api/credits.json +1 -0
  8. package/examples/glitchy-app/public/api/me.json +1 -0
  9. package/examples/glitchy-app/public/api/messages.json +1 -0
  10. package/examples/glitchy-app/public/app.js +14749 -0
  11. package/examples/glitchy-app/public/index.html +2 -0
  12. package/examples/glitchy-app/serve.mjs +12 -0
  13. package/extensions/index.ts +157 -0
  14. package/package.json +53 -3
  15. package/scripts/affordance_scan.mjs +235 -0
  16. package/scripts/doctor.mjs +14 -0
  17. package/scripts/glitch/analyze.mjs +274 -0
  18. package/scripts/glitch_lab.mjs +519 -0
  19. package/scripts/interactions.mjs +172 -0
  20. package/scripts/journey_runner.mjs +260 -0
  21. package/scripts/lib.mjs +260 -0
  22. package/scripts/report.mjs +144 -0
  23. package/scripts/sensors/dom_observer.mjs +96 -0
  24. package/scripts/sensors/react_sensor.mjs +167 -0
  25. package/skills/ai-agentic-usability-testing/SKILL.md +68 -0
  26. package/skills/ai-agentic-usability-testing/assets/default-personas.md +96 -0
  27. package/skills/ai-agentic-usability-testing/assets/findings.example.json +56 -0
  28. package/skills/ai-agentic-usability-testing/assets/matrix.default.json +746 -0
  29. package/skills/ai-agentic-usability-testing/assets/matrix.partners.example.json +73 -0
  30. package/skills/ai-agentic-usability-testing/assets/matrix.web.example.json +32 -0
  31. package/skills/ai-agentic-usability-testing/assets/personas-template.md +45 -0
  32. package/skills/ai-agentic-usability-testing/references/latency-reliability.md +41 -0
  33. package/skills/ai-agentic-usability-testing/references/regression-pipeline.md +41 -0
  34. package/skills/ai-agentic-usability-testing/references/tenant-persona-matrix.md +61 -0
  35. package/skills/ai-agentic-usability-testing/references/visual-affordance-guide.md +97 -0
  36. package/skills/ai-agentic-usability-testing/references/visual-glitches.md +83 -0
  37. package/skills/glitch-hunt/SKILL.md +59 -0
@@ -0,0 +1,746 @@
1
+ {
2
+ "_readme": "Default matrix: 4 personas (5 variants) as DIRECT platform users, no partner. Copy to .ux/matrix.json, set platform.url and logins, then explore the app once and replace the placeholder labels in journeys (e.g. 'Chat', 'New chat', 'Save to notes', placeholder 'Ask') with the real ones seen on screen. mustNotSee lists are starting points: replace with real agent/widget names of other verticals.",
3
+ "platform": {
4
+ "name": "YOUR PLATFORM NAME",
5
+ "url": "https://staging.your-platform.com",
6
+ "login": {
7
+ "url": "/login",
8
+ "fields": {
9
+ "input[type=email]": "env:UX_EMAIL",
10
+ "input[type=password]": "env:UX_PASSWORD"
11
+ },
12
+ "submit": "button[type=submit]",
13
+ "waitFor": "/"
14
+ }
15
+ },
16
+ "unsafeWords": [
17
+ "delete",
18
+ "remove",
19
+ "pay",
20
+ "purchase",
21
+ "buy",
22
+ "upgrade",
23
+ "subscribe",
24
+ "invite",
25
+ "share",
26
+ "publish",
27
+ "send email",
28
+ "logout",
29
+ "log out",
30
+ "sign out",
31
+ "deactivate",
32
+ "reset"
33
+ ],
34
+ "mask": [
35
+ "time",
36
+ "[datetime]",
37
+ ".timestamp",
38
+ "[data-streaming]",
39
+ "[aria-busy=true]"
40
+ ],
41
+ "personas": {
42
+ "indian-germany-student": {
43
+ "name": "Arjun, 22",
44
+ "vertical": "education",
45
+ "viewport": "android",
46
+ "network": "fast3g",
47
+ "locale": "en-IN",
48
+ "timezone": "Asia/Kolkata",
49
+ "mustNotSee": [
50
+ "Tax agent",
51
+ "Tax audit",
52
+ "Stock",
53
+ "NIFTY",
54
+ "SENSEX",
55
+ "Portfolio",
56
+ "Trading",
57
+ "SAT",
58
+ "Common App",
59
+ "undefined",
60
+ "NaN",
61
+ "[object Object]",
62
+ "null",
63
+ "Something went wrong",
64
+ "Error:"
65
+ ]
66
+ },
67
+ "us-ivy-applicant": {
68
+ "name": "Emily, 17",
69
+ "vertical": "education",
70
+ "viewport": "iphone",
71
+ "network": "fast3g",
72
+ "locale": "en-US",
73
+ "timezone": "America/Chicago",
74
+ "mustNotSee": [
75
+ "Tax agent",
76
+ "Tax audit",
77
+ "Stock",
78
+ "NIFTY",
79
+ "SENSEX",
80
+ "Portfolio",
81
+ "Trading",
82
+ "APS certificate",
83
+ "uni-assist",
84
+ "Blocked account",
85
+ "₹",
86
+ "undefined",
87
+ "NaN",
88
+ "[object Object]",
89
+ "null",
90
+ "Something went wrong",
91
+ "Error:"
92
+ ]
93
+ },
94
+ "us-finance-analyst": {
95
+ "name": "Mark, 40",
96
+ "vertical": "finance",
97
+ "viewport": "desktop",
98
+ "network": "fast",
99
+ "locale": "en-US",
100
+ "timezone": "America/New_York",
101
+ "mustNotSee": [
102
+ "Admission",
103
+ "Scholarship",
104
+ "SOP",
105
+ "NIFTY",
106
+ "SENSEX",
107
+ "₹",
108
+ "undefined",
109
+ "NaN",
110
+ "[object Object]",
111
+ "null",
112
+ "Something went wrong",
113
+ "Error:"
114
+ ]
115
+ },
116
+ "indian-market-analyst-young": {
117
+ "name": "Rahul, 32",
118
+ "vertical": "markets",
119
+ "viewport": "android",
120
+ "network": "fast3g",
121
+ "locale": "en-IN",
122
+ "timezone": "Asia/Kolkata",
123
+ "mustNotSee": [
124
+ "Admission",
125
+ "Scholarship",
126
+ "IRS",
127
+ "Tax audit",
128
+ "CP2000",
129
+ "undefined",
130
+ "NaN",
131
+ "[object Object]",
132
+ "null",
133
+ "Something went wrong",
134
+ "Error:"
135
+ ]
136
+ },
137
+ "indian-market-analyst-senior": {
138
+ "name": "Suresh, 61",
139
+ "vertical": "markets",
140
+ "viewport": "laptop-zoom125",
141
+ "network": "fast3g",
142
+ "locale": "en-IN",
143
+ "timezone": "Asia/Kolkata",
144
+ "mustNotSee": [
145
+ "Admission",
146
+ "Scholarship",
147
+ "IRS",
148
+ "Tax audit",
149
+ "CP2000",
150
+ "undefined",
151
+ "NaN",
152
+ "[object Object]",
153
+ "null",
154
+ "Something went wrong",
155
+ "Error:"
156
+ ]
157
+ }
158
+ },
159
+ "cells": [
160
+ {
161
+ "persona": "indian-germany-student",
162
+ "screens": [
163
+ "/",
164
+ "/dashboard",
165
+ "/chat",
166
+ "/notes",
167
+ "/research"
168
+ ],
169
+ "journeys": [
170
+ "explore-dashboard",
171
+ "arjun-checklist",
172
+ "arjun-costs"
173
+ ],
174
+ "login": {
175
+ "url": "/login",
176
+ "fields": {
177
+ "input[type=email]": "env:UX_EMAIL_INDIAN_GERMANY_STUDENT",
178
+ "input[type=password]": "env:UX_PASSWORD_INDIAN_GERMANY_STUDENT"
179
+ },
180
+ "submit": "button[type=submit]",
181
+ "waitFor": "/"
182
+ }
183
+ },
184
+ {
185
+ "persona": "us-ivy-applicant",
186
+ "screens": [
187
+ "/",
188
+ "/dashboard",
189
+ "/chat",
190
+ "/notes",
191
+ "/research"
192
+ ],
193
+ "journeys": [
194
+ "explore-dashboard",
195
+ "emily-plan",
196
+ "emily-essay"
197
+ ],
198
+ "login": {
199
+ "url": "/login",
200
+ "fields": {
201
+ "input[type=email]": "env:UX_EMAIL_US_IVY_APPLICANT",
202
+ "input[type=password]": "env:UX_PASSWORD_US_IVY_APPLICANT"
203
+ },
204
+ "submit": "button[type=submit]",
205
+ "waitFor": "/"
206
+ }
207
+ },
208
+ {
209
+ "persona": "us-finance-analyst",
210
+ "screens": [
211
+ "/",
212
+ "/dashboard",
213
+ "/chat",
214
+ "/notes",
215
+ "/research"
216
+ ],
217
+ "journeys": [
218
+ "explore-dashboard",
219
+ "mark-audit",
220
+ "mark-quarterly"
221
+ ],
222
+ "login": {
223
+ "url": "/login",
224
+ "fields": {
225
+ "input[type=email]": "env:UX_EMAIL_US_FINANCE_ANALYST",
226
+ "input[type=password]": "env:UX_PASSWORD_US_FINANCE_ANALYST"
227
+ },
228
+ "submit": "button[type=submit]",
229
+ "waitFor": "/"
230
+ }
231
+ },
232
+ {
233
+ "persona": "indian-market-analyst-young",
234
+ "screens": [
235
+ "/",
236
+ "/dashboard",
237
+ "/chat",
238
+ "/notes",
239
+ "/research"
240
+ ],
241
+ "journeys": [
242
+ "explore-dashboard",
243
+ "rahul-outlook",
244
+ "rahul-sector-note"
245
+ ],
246
+ "login": {
247
+ "url": "/login",
248
+ "fields": {
249
+ "input[type=email]": "env:UX_EMAIL_INDIAN_MARKET_ANALYST_YOUNG",
250
+ "input[type=password]": "env:UX_PASSWORD_INDIAN_MARKET_ANALYST_YOUNG"
251
+ },
252
+ "submit": "button[type=submit]",
253
+ "waitFor": "/"
254
+ }
255
+ },
256
+ {
257
+ "persona": "indian-market-analyst-senior",
258
+ "screens": [
259
+ "/",
260
+ "/dashboard",
261
+ "/chat",
262
+ "/notes",
263
+ "/research"
264
+ ],
265
+ "journeys": [
266
+ "explore-dashboard",
267
+ "suresh-overview",
268
+ "suresh-find-notes"
269
+ ],
270
+ "login": {
271
+ "url": "/login",
272
+ "fields": {
273
+ "input[type=email]": "env:UX_EMAIL_INDIAN_MARKET_ANALYST_SENIOR",
274
+ "input[type=password]": "env:UX_PASSWORD_INDIAN_MARKET_ANALYST_SENIOR"
275
+ },
276
+ "submit": "button[type=submit]",
277
+ "waitFor": "/"
278
+ }
279
+ }
280
+ ],
281
+ "journeys": {
282
+ "explore-dashboard": {
283
+ "title": "First look: land, look around, open each main area",
284
+ "steps": [
285
+ {
286
+ "goto": "/"
287
+ },
288
+ {
289
+ "expectNoText": "{{persona.mustNotSee}}"
290
+ },
291
+ {
292
+ "screenshot": "landing"
293
+ },
294
+ {
295
+ "click": "Chat",
296
+ "optional": true
297
+ },
298
+ {
299
+ "click": "Notes",
300
+ "optional": true
301
+ },
302
+ {
303
+ "click": "Research",
304
+ "optional": true
305
+ },
306
+ {
307
+ "click": "Dashboard",
308
+ "optional": true
309
+ },
310
+ {
311
+ "screenshot": "back-to-dashboard"
312
+ }
313
+ ]
314
+ },
315
+ "arjun-checklist": {
316
+ "title": "Get the Germany MS checklist and save it",
317
+ "steps": [
318
+ {
319
+ "goto": "/"
320
+ },
321
+ {
322
+ "expectNoText": "{{persona.mustNotSee}}",
323
+ "note": "replaced at runtime by the persona's mustNotSee list"
324
+ },
325
+ {
326
+ "click": "Chat",
327
+ "note": "replace with the real label/icon name of the chat entry point"
328
+ },
329
+ {
330
+ "click": "New chat",
331
+ "optional": true
332
+ },
333
+ {
334
+ "fill": {
335
+ "placeholder": "Ask",
336
+ "value": "What all documents and exams do I need for MS in Computer Science in Germany? I am in final year B.Tech with 7.8 CGPA."
337
+ }
338
+ },
339
+ {
340
+ "press": "Enter"
341
+ },
342
+ {
343
+ "measureResponse": {
344
+ "selector": "[data-role=assistant], .assistant-message, [data-message-author=assistant]",
345
+ "timeout": 90000
346
+ },
347
+ "note": "replace selector with the real assistant-message container"
348
+ },
349
+ {
350
+ "click": "Save to notes",
351
+ "note": "replace with the real save/add-to-notes control"
352
+ },
353
+ {
354
+ "waitForText": "Saved",
355
+ "optional": true
356
+ },
357
+ {
358
+ "click": "Notes"
359
+ },
360
+ {
361
+ "screenshot": "notes-after-save"
362
+ }
363
+ ]
364
+ },
365
+ "arjun-costs": {
366
+ "title": "Total cost in rupees",
367
+ "steps": [
368
+ {
369
+ "goto": "/"
370
+ },
371
+ {
372
+ "expectNoText": "{{persona.mustNotSee}}",
373
+ "note": "replaced at runtime by the persona's mustNotSee list"
374
+ },
375
+ {
376
+ "click": "Chat",
377
+ "note": "replace with the real label/icon name of the chat entry point"
378
+ },
379
+ {
380
+ "click": "New chat",
381
+ "optional": true
382
+ },
383
+ {
384
+ "fill": {
385
+ "placeholder": "Ask",
386
+ "value": "How much money do I need in total for MS in Germany, in rupees? Include blocked account and insurance."
387
+ }
388
+ },
389
+ {
390
+ "press": "Enter"
391
+ },
392
+ {
393
+ "measureResponse": {
394
+ "selector": "[data-role=assistant], .assistant-message, [data-message-author=assistant]",
395
+ "timeout": 90000
396
+ },
397
+ "note": "replace selector with the real assistant-message container"
398
+ }
399
+ ]
400
+ },
401
+ "emily-plan": {
402
+ "title": "Junior-year plan for MIT, saved",
403
+ "steps": [
404
+ {
405
+ "goto": "/"
406
+ },
407
+ {
408
+ "expectNoText": "{{persona.mustNotSee}}",
409
+ "note": "replaced at runtime by the persona's mustNotSee list"
410
+ },
411
+ {
412
+ "click": "Chat",
413
+ "note": "replace with the real label/icon name of the chat entry point"
414
+ },
415
+ {
416
+ "click": "New chat",
417
+ "optional": true
418
+ },
419
+ {
420
+ "fill": {
421
+ "placeholder": "Ask",
422
+ "value": "What do I need to get into MIT? Like what should I be doing junior year? Make me a month by month plan."
423
+ }
424
+ },
425
+ {
426
+ "press": "Enter"
427
+ },
428
+ {
429
+ "measureResponse": {
430
+ "selector": "[data-role=assistant], .assistant-message, [data-message-author=assistant]",
431
+ "timeout": 90000
432
+ },
433
+ "note": "replace selector with the real assistant-message container"
434
+ },
435
+ {
436
+ "click": "Save to notes",
437
+ "note": "replace with the real save/add-to-notes control"
438
+ },
439
+ {
440
+ "waitForText": "Saved",
441
+ "optional": true
442
+ },
443
+ {
444
+ "click": "Notes"
445
+ },
446
+ {
447
+ "screenshot": "notes-after-save"
448
+ }
449
+ ]
450
+ },
451
+ "emily-essay": {
452
+ "title": "Essay brainstorm",
453
+ "steps": [
454
+ {
455
+ "goto": "/"
456
+ },
457
+ {
458
+ "expectNoText": "{{persona.mustNotSee}}",
459
+ "note": "replaced at runtime by the persona's mustNotSee list"
460
+ },
461
+ {
462
+ "click": "Chat",
463
+ "note": "replace with the real label/icon name of the chat entry point"
464
+ },
465
+ {
466
+ "click": "New chat",
467
+ "optional": true
468
+ },
469
+ {
470
+ "fill": {
471
+ "placeholder": "Ask",
472
+ "value": "Help me brainstorm my Common App essay. I do robotics and tutor middle schoolers."
473
+ }
474
+ },
475
+ {
476
+ "press": "Enter"
477
+ },
478
+ {
479
+ "measureResponse": {
480
+ "selector": "[data-role=assistant], .assistant-message, [data-message-author=assistant]",
481
+ "timeout": 90000
482
+ },
483
+ "note": "replace selector with the real assistant-message container"
484
+ },
485
+ {
486
+ "click": "Save to notes",
487
+ "note": "replace with the real save/add-to-notes control"
488
+ },
489
+ {
490
+ "waitForText": "Saved",
491
+ "optional": true
492
+ },
493
+ {
494
+ "click": "Notes"
495
+ },
496
+ {
497
+ "screenshot": "notes-after-save"
498
+ }
499
+ ]
500
+ },
501
+ "mark-audit": {
502
+ "title": "Audit preparation checklist",
503
+ "steps": [
504
+ {
505
+ "goto": "/"
506
+ },
507
+ {
508
+ "expectNoText": "{{persona.mustNotSee}}",
509
+ "note": "replaced at runtime by the persona's mustNotSee list"
510
+ },
511
+ {
512
+ "click": "Chat",
513
+ "note": "replace with the real label/icon name of the chat entry point"
514
+ },
515
+ {
516
+ "click": "New chat",
517
+ "optional": true
518
+ },
519
+ {
520
+ "fill": {
521
+ "placeholder": "Ask",
522
+ "value": "I got a CP2000 notice last year. What documentation should I prepare in case of an audit? I have W-2 income, 1099-NEC consulting and a rental property."
523
+ }
524
+ },
525
+ {
526
+ "press": "Enter"
527
+ },
528
+ {
529
+ "measureResponse": {
530
+ "selector": "[data-role=assistant], .assistant-message, [data-message-author=assistant]",
531
+ "timeout": 90000
532
+ },
533
+ "note": "replace selector with the real assistant-message container"
534
+ },
535
+ {
536
+ "click": "Save to notes",
537
+ "note": "replace with the real save/add-to-notes control"
538
+ },
539
+ {
540
+ "waitForText": "Saved",
541
+ "optional": true
542
+ },
543
+ {
544
+ "click": "Notes"
545
+ },
546
+ {
547
+ "screenshot": "notes-after-save"
548
+ }
549
+ ]
550
+ },
551
+ "mark-quarterly": {
552
+ "title": "Quarterly estimated tax plan",
553
+ "steps": [
554
+ {
555
+ "goto": "/"
556
+ },
557
+ {
558
+ "expectNoText": "{{persona.mustNotSee}}",
559
+ "note": "replaced at runtime by the persona's mustNotSee list"
560
+ },
561
+ {
562
+ "click": "Chat",
563
+ "note": "replace with the real label/icon name of the chat entry point"
564
+ },
565
+ {
566
+ "click": "New chat",
567
+ "optional": true
568
+ },
569
+ {
570
+ "fill": {
571
+ "placeholder": "Ask",
572
+ "value": "Help me plan quarterly estimated taxes for about $60k of consulting income this year. Put it in a table."
573
+ }
574
+ },
575
+ {
576
+ "press": "Enter"
577
+ },
578
+ {
579
+ "measureResponse": {
580
+ "selector": "[data-role=assistant], .assistant-message, [data-message-author=assistant]",
581
+ "timeout": 90000
582
+ },
583
+ "note": "replace selector with the real assistant-message container"
584
+ }
585
+ ]
586
+ },
587
+ "rahul-outlook": {
588
+ "title": "Weekly index outlook",
589
+ "steps": [
590
+ {
591
+ "goto": "/"
592
+ },
593
+ {
594
+ "expectNoText": "{{persona.mustNotSee}}",
595
+ "note": "replaced at runtime by the persona's mustNotSee list"
596
+ },
597
+ {
598
+ "click": "Chat",
599
+ "note": "replace with the real label/icon name of the chat entry point"
600
+ },
601
+ {
602
+ "click": "New chat",
603
+ "optional": true
604
+ },
605
+ {
606
+ "fill": {
607
+ "placeholder": "Ask",
608
+ "value": "NIFTY and Bank NIFTY outlook for the coming week? Key levels?"
609
+ }
610
+ },
611
+ {
612
+ "press": "Enter"
613
+ },
614
+ {
615
+ "measureResponse": {
616
+ "selector": "[data-role=assistant], .assistant-message, [data-message-author=assistant]",
617
+ "timeout": 90000
618
+ },
619
+ "note": "replace selector with the real assistant-message container"
620
+ }
621
+ ]
622
+ },
623
+ "rahul-sector-note": {
624
+ "title": "Sector view saved as note",
625
+ "steps": [
626
+ {
627
+ "goto": "/"
628
+ },
629
+ {
630
+ "expectNoText": "{{persona.mustNotSee}}",
631
+ "note": "replaced at runtime by the persona's mustNotSee list"
632
+ },
633
+ {
634
+ "click": "Chat",
635
+ "note": "replace with the real label/icon name of the chat entry point"
636
+ },
637
+ {
638
+ "click": "New chat",
639
+ "optional": true
640
+ },
641
+ {
642
+ "fill": {
643
+ "placeholder": "Ask",
644
+ "value": "Should I book profits in IT stocks or hold? Give reasons and save-worthy summary."
645
+ }
646
+ },
647
+ {
648
+ "press": "Enter"
649
+ },
650
+ {
651
+ "measureResponse": {
652
+ "selector": "[data-role=assistant], .assistant-message, [data-message-author=assistant]",
653
+ "timeout": 90000
654
+ },
655
+ "note": "replace selector with the real assistant-message container"
656
+ },
657
+ {
658
+ "click": "Save to notes",
659
+ "note": "replace with the real save/add-to-notes control"
660
+ },
661
+ {
662
+ "waitForText": "Saved",
663
+ "optional": true
664
+ },
665
+ {
666
+ "click": "Notes"
667
+ },
668
+ {
669
+ "screenshot": "notes-after-save"
670
+ }
671
+ ]
672
+ },
673
+ "suresh-overview": {
674
+ "title": "Market overview for the month",
675
+ "steps": [
676
+ {
677
+ "goto": "/"
678
+ },
679
+ {
680
+ "expectNoText": "{{persona.mustNotSee}}",
681
+ "note": "replaced at runtime by the persona's mustNotSee list"
682
+ },
683
+ {
684
+ "click": "Chat",
685
+ "note": "replace with the real label/icon name of the chat entry point"
686
+ },
687
+ {
688
+ "click": "New chat",
689
+ "optional": true
690
+ },
691
+ {
692
+ "fill": {
693
+ "placeholder": "Ask",
694
+ "value": "Give me an overview of the market today and what to watch this month."
695
+ }
696
+ },
697
+ {
698
+ "press": "Enter"
699
+ },
700
+ {
701
+ "measureResponse": {
702
+ "selector": "[data-role=assistant], .assistant-message, [data-message-author=assistant]",
703
+ "timeout": 90000
704
+ },
705
+ "note": "replace selector with the real assistant-message container"
706
+ },
707
+ {
708
+ "click": "Save to notes",
709
+ "note": "replace with the real save/add-to-notes control"
710
+ },
711
+ {
712
+ "waitForText": "Saved",
713
+ "optional": true
714
+ },
715
+ {
716
+ "click": "Notes"
717
+ },
718
+ {
719
+ "screenshot": "notes-after-save"
720
+ }
721
+ ]
722
+ },
723
+ "suresh-find-notes": {
724
+ "title": "Find previous notes and chats",
725
+ "steps": [
726
+ {
727
+ "goto": "/"
728
+ },
729
+ {
730
+ "click": "Notes"
731
+ },
732
+ {
733
+ "screenshot": "notes"
734
+ },
735
+ {
736
+ "click": "History",
737
+ "optional": true,
738
+ "note": "replace with where past chats live"
739
+ },
740
+ {
741
+ "screenshot": "history"
742
+ }
743
+ ]
744
+ }
745
+ }
746
+ }