@underdogai/mesh-event-schemas 0.9.0 → 0.11.0

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 (65) hide show
  1. package/README.md +3 -0
  2. package/card.compact.schema.json +1019 -0
  3. package/card.schema.json +1918 -0
  4. package/dist/apppacks.d.ts +48 -0
  5. package/dist/apppacks.d.ts.map +1 -1
  6. package/dist/blocks.d.ts +34 -0
  7. package/dist/blocks.d.ts.map +1 -1
  8. package/dist/blocks.js +15 -0
  9. package/dist/blocks.js.map +1 -1
  10. package/dist/calendar.d.ts +466 -0
  11. package/dist/calendar.d.ts.map +1 -0
  12. package/dist/calendar.js +169 -0
  13. package/dist/calendar.js.map +1 -0
  14. package/dist/card-json-schema.d.ts +426 -0
  15. package/dist/card-json-schema.d.ts.map +1 -0
  16. package/dist/card-json-schema.js +467 -0
  17. package/dist/card-json-schema.js.map +1 -0
  18. package/dist/events.d.ts +457 -2
  19. package/dist/events.d.ts.map +1 -1
  20. package/dist/events.js +207 -3
  21. package/dist/events.js.map +1 -1
  22. package/dist/index.d.ts +5 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +5 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/namespace.d.ts +20 -0
  27. package/dist/namespace.d.ts.map +1 -1
  28. package/dist/namespace.js +20 -0
  29. package/dist/namespace.js.map +1 -1
  30. package/dist/power-levels.d.ts +85 -0
  31. package/dist/power-levels.d.ts.map +1 -0
  32. package/dist/power-levels.js +153 -0
  33. package/dist/power-levels.js.map +1 -0
  34. package/dist/profile.d.ts +26 -0
  35. package/dist/profile.d.ts.map +1 -0
  36. package/dist/profile.js +40 -0
  37. package/dist/profile.js.map +1 -0
  38. package/dist/registry.d.ts +5 -0
  39. package/dist/registry.d.ts.map +1 -1
  40. package/dist/registry.js +17 -2
  41. package/dist/registry.js.map +1 -1
  42. package/dist/room-agents.d.ts +271 -0
  43. package/dist/room-agents.d.ts.map +1 -0
  44. package/dist/room-agents.js +119 -0
  45. package/dist/room-agents.js.map +1 -0
  46. package/dist/surfaces.d.ts +265 -1
  47. package/dist/surfaces.d.ts.map +1 -1
  48. package/dist/surfaces.js +1 -1
  49. package/dist/templates.d.ts +40 -0
  50. package/dist/templates.d.ts.map +1 -1
  51. package/dist/templates.js +37 -0
  52. package/dist/templates.js.map +1 -1
  53. package/package.json +9 -4
  54. package/src/blocks.ts +15 -0
  55. package/src/calendar.ts +248 -0
  56. package/src/card-json-schema.ts +520 -0
  57. package/src/events.ts +234 -3
  58. package/src/index.ts +6 -0
  59. package/src/namespace.ts +21 -0
  60. package/src/power-levels.ts +183 -0
  61. package/src/profile.ts +42 -0
  62. package/src/registry.ts +18 -1
  63. package/src/room-agents.ts +100 -0
  64. package/src/surfaces.ts +1 -1
  65. package/src/templates.ts +64 -0
@@ -0,0 +1,1918 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://chatops.theunderdog.ai/schemas/card.schema.json",
4
+ "title": "Mesh 카드 (org.corp.ui)",
5
+ "description": "채팅 타임라인에 그려지는 대화형 카드. 블록(닫힌 집합)을 위에서 아래로 쌓는다. 임의 HTML·코드는 없다.",
6
+ "type": "object",
7
+ "properties": {
8
+ "v": {
9
+ "type": "integer",
10
+ "const": 1,
11
+ "default": 1
12
+ },
13
+ "card_id": {
14
+ "description": "카드 인스턴스 ID(영숫자·하이픈). 버튼 회신·편집이 이 값으로 카드를 가리킨다",
15
+ "type": "string",
16
+ "minLength": 1
17
+ },
18
+ "title": {
19
+ "description": "카드 제목 — 짧게",
20
+ "type": "string"
21
+ },
22
+ "blocks": {
23
+ "description": "위에서 아래로 그릴 블록. 요약을 먼저, 버튼(actions)은 맨 아래",
24
+ "type": "array",
25
+ "items": {
26
+ "$ref": "#/$defs/Block"
27
+ },
28
+ "default": []
29
+ },
30
+ "steps": {
31
+ "description": "여러 단계 폼(마법사). 단계마다 blocks, 마지막에 한 번 제출",
32
+ "type": "array",
33
+ "items": {
34
+ "type": "object",
35
+ "properties": {
36
+ "title": {
37
+ "type": "string"
38
+ },
39
+ "blocks": {
40
+ "type": "array",
41
+ "items": {
42
+ "$ref": "#/$defs/Block"
43
+ }
44
+ }
45
+ },
46
+ "required": [
47
+ "blocks"
48
+ ],
49
+ "additionalProperties": false
50
+ }
51
+ },
52
+ "fallback": {
53
+ "description": "카드를 못 그리는 클라이언트가 보는 평문 요약(필수)",
54
+ "type": "string"
55
+ },
56
+ "state": {
57
+ "type": "string",
58
+ "enum": [
59
+ "open",
60
+ "submitted",
61
+ "cancelled",
62
+ "expired"
63
+ ]
64
+ },
65
+ "request_event_id": {
66
+ "type": "string"
67
+ },
68
+ "context": {
69
+ "type": "object",
70
+ "properties": {
71
+ "agent": {
72
+ "type": "string"
73
+ },
74
+ "entity": {
75
+ "type": "object",
76
+ "properties": {
77
+ "type": {
78
+ "type": "string"
79
+ },
80
+ "id": {
81
+ "type": "string"
82
+ }
83
+ },
84
+ "required": [
85
+ "type",
86
+ "id"
87
+ ],
88
+ "additionalProperties": false
89
+ }
90
+ },
91
+ "additionalProperties": true
92
+ },
93
+ "expires_at": {
94
+ "description": "epoch ms. 지나면 입력이 잠긴다",
95
+ "type": "integer"
96
+ }
97
+ },
98
+ "required": [
99
+ "card_id",
100
+ "fallback"
101
+ ],
102
+ "additionalProperties": false,
103
+ "$defs": {
104
+ "Block": {
105
+ "anyOf": [
106
+ {
107
+ "$ref": "#/$defs/TextBlock"
108
+ },
109
+ {
110
+ "$ref": "#/$defs/HeadingBlock"
111
+ },
112
+ {
113
+ "$ref": "#/$defs/DividerBlock"
114
+ },
115
+ {
116
+ "$ref": "#/$defs/FieldsBlock"
117
+ },
118
+ {
119
+ "$ref": "#/$defs/ImageBlock"
120
+ },
121
+ {
122
+ "$ref": "#/$defs/ContextBlock"
123
+ },
124
+ {
125
+ "$ref": "#/$defs/BadgeBlock"
126
+ },
127
+ {
128
+ "$ref": "#/$defs/TableBlock"
129
+ },
130
+ {
131
+ "$ref": "#/$defs/ProgressBlock"
132
+ },
133
+ {
134
+ "$ref": "#/$defs/StepsBlock"
135
+ },
136
+ {
137
+ "$ref": "#/$defs/MetricBlock"
138
+ },
139
+ {
140
+ "$ref": "#/$defs/ChartBlock"
141
+ },
142
+ {
143
+ "$ref": "#/$defs/AvatarBlock"
144
+ },
145
+ {
146
+ "$ref": "#/$defs/AvatarGroupBlock"
147
+ },
148
+ {
149
+ "$ref": "#/$defs/GaugeBlock"
150
+ },
151
+ {
152
+ "$ref": "#/$defs/RatingBlock"
153
+ },
154
+ {
155
+ "$ref": "#/$defs/CalloutBlock"
156
+ },
157
+ {
158
+ "$ref": "#/$defs/EntityRefBlock"
159
+ },
160
+ {
161
+ "$ref": "#/$defs/KanbanBlock"
162
+ },
163
+ {
164
+ "$ref": "#/$defs/CountdownBlock"
165
+ },
166
+ {
167
+ "$ref": "#/$defs/ActivityBlock"
168
+ },
169
+ {
170
+ "$ref": "#/$defs/CodeBlock"
171
+ },
172
+ {
173
+ "$ref": "#/$defs/DiffBlock"
174
+ },
175
+ {
176
+ "$ref": "#/$defs/FileBlock"
177
+ },
178
+ {
179
+ "$ref": "#/$defs/CollapsibleBlock"
180
+ },
181
+ {
182
+ "$ref": "#/$defs/WidgetBlock"
183
+ },
184
+ {
185
+ "$ref": "#/$defs/InputBlock"
186
+ },
187
+ {
188
+ "$ref": "#/$defs/ToggleBlock"
189
+ },
190
+ {
191
+ "$ref": "#/$defs/SliderBlock"
192
+ },
193
+ {
194
+ "$ref": "#/$defs/RadioBlock"
195
+ },
196
+ {
197
+ "$ref": "#/$defs/SelectBlock"
198
+ },
199
+ {
200
+ "$ref": "#/$defs/CheckboxBlock"
201
+ },
202
+ {
203
+ "$ref": "#/$defs/LocationBlock"
204
+ },
205
+ {
206
+ "$ref": "#/$defs/ButtonBlock"
207
+ },
208
+ {
209
+ "$ref": "#/$defs/LinkButtonBlock"
210
+ },
211
+ {
212
+ "$ref": "#/$defs/ActionsBlock"
213
+ },
214
+ {
215
+ "$ref": "#/$defs/OverflowBlock"
216
+ }
217
+ ]
218
+ },
219
+ "TextBlock": {
220
+ "description": "문단. markdown:true 면 굵게·목록·링크·코드 등 안전한 마크다운",
221
+ "type": "object",
222
+ "properties": {
223
+ "type": {
224
+ "type": "string",
225
+ "const": "text"
226
+ },
227
+ "text": {
228
+ "type": "string"
229
+ },
230
+ "markdown": {
231
+ "description": "true 면 안전한 마크다운(굵게·목록·링크·코드·인용). 표는 table 블록",
232
+ "type": "boolean"
233
+ }
234
+ },
235
+ "required": [
236
+ "type",
237
+ "text"
238
+ ],
239
+ "additionalProperties": false
240
+ },
241
+ "HeadingBlock": {
242
+ "description": "소제목(level 1~3)",
243
+ "type": "object",
244
+ "properties": {
245
+ "type": {
246
+ "type": "string",
247
+ "const": "heading"
248
+ },
249
+ "text": {
250
+ "type": "string"
251
+ },
252
+ "level": {
253
+ "type": "integer",
254
+ "enum": [
255
+ 1,
256
+ 2,
257
+ 3
258
+ ]
259
+ }
260
+ },
261
+ "required": [
262
+ "type",
263
+ "text"
264
+ ],
265
+ "additionalProperties": false
266
+ },
267
+ "DividerBlock": {
268
+ "description": "가로 구분선",
269
+ "type": "object",
270
+ "properties": {
271
+ "type": {
272
+ "type": "string",
273
+ "const": "divider"
274
+ }
275
+ },
276
+ "required": [
277
+ "type"
278
+ ],
279
+ "additionalProperties": false
280
+ },
281
+ "FieldsBlock": {
282
+ "description": "라벨:값 목록. short:true 면 2열 그리드, long:true 면 문단 값",
283
+ "type": "object",
284
+ "properties": {
285
+ "type": {
286
+ "type": "string",
287
+ "const": "fields"
288
+ },
289
+ "items": {
290
+ "type": "array",
291
+ "items": {
292
+ "type": "object",
293
+ "properties": {
294
+ "label": {
295
+ "type": "string"
296
+ },
297
+ "value": {
298
+ "type": "string"
299
+ },
300
+ "short": {
301
+ "description": "true 면 2열 그리드에 좁게",
302
+ "type": "boolean"
303
+ },
304
+ "parts": {
305
+ "description": "값을 톤이 다른 조각으로(예: +214 −37). value 는 이어 붙인 평문 사본",
306
+ "type": "array",
307
+ "items": {
308
+ "type": "object",
309
+ "properties": {
310
+ "text": {
311
+ "type": "string"
312
+ },
313
+ "tone": {
314
+ "description": "색 톤",
315
+ "$ref": "#/$defs/Tone"
316
+ }
317
+ },
318
+ "required": [
319
+ "text"
320
+ ],
321
+ "additionalProperties": false
322
+ }
323
+ },
324
+ "ref": {
325
+ "$ref": "#/$defs/Ref"
326
+ },
327
+ "long": {
328
+ "description": "true 면 문단 값(전체폭)",
329
+ "type": "boolean"
330
+ }
331
+ },
332
+ "required": [
333
+ "label",
334
+ "value"
335
+ ],
336
+ "additionalProperties": false
337
+ }
338
+ },
339
+ "columns": {
340
+ "description": "열 수 강제(드물게). 생략이 기본(auto-fit)",
341
+ "enum": [
342
+ 2,
343
+ 3,
344
+ "auto"
345
+ ]
346
+ }
347
+ },
348
+ "required": [
349
+ "type",
350
+ "items"
351
+ ],
352
+ "additionalProperties": false
353
+ },
354
+ "Tone": {
355
+ "type": "string",
356
+ "enum": [
357
+ "neutral",
358
+ "success",
359
+ "warning",
360
+ "danger",
361
+ "info"
362
+ ]
363
+ },
364
+ "Ref": {
365
+ "anyOf": [
366
+ {
367
+ "type": "object",
368
+ "properties": {
369
+ "user": {
370
+ "type": "string",
371
+ "pattern": "^@[^:]+:.+"
372
+ }
373
+ },
374
+ "required": [
375
+ "user"
376
+ ],
377
+ "additionalProperties": false
378
+ },
379
+ {
380
+ "type": "object",
381
+ "properties": {
382
+ "entity": {
383
+ "type": "object",
384
+ "properties": {
385
+ "type": {
386
+ "type": "string",
387
+ "minLength": 1
388
+ },
389
+ "id": {
390
+ "type": "string",
391
+ "minLength": 1
392
+ }
393
+ },
394
+ "required": [
395
+ "type",
396
+ "id"
397
+ ],
398
+ "additionalProperties": false
399
+ },
400
+ "url": {
401
+ "type": "string"
402
+ }
403
+ },
404
+ "required": [
405
+ "entity"
406
+ ],
407
+ "additionalProperties": false
408
+ }
409
+ ]
410
+ },
411
+ "ImageBlock": {
412
+ "description": "본문 그림(https url 또는 mxc)",
413
+ "type": "object",
414
+ "properties": {
415
+ "type": {
416
+ "type": "string",
417
+ "const": "image"
418
+ },
419
+ "url": {
420
+ "description": "https URL",
421
+ "type": "string"
422
+ },
423
+ "mxc": {
424
+ "description": "mxc:// 미디어",
425
+ "type": "string"
426
+ },
427
+ "alt": {
428
+ "type": "string"
429
+ }
430
+ },
431
+ "required": [
432
+ "type"
433
+ ],
434
+ "additionalProperties": false
435
+ },
436
+ "ContextBlock": {
437
+ "description": "작은 보조 줄(문자열·아이콘 조각)",
438
+ "type": "object",
439
+ "properties": {
440
+ "type": {
441
+ "type": "string",
442
+ "const": "context"
443
+ },
444
+ "elements": {
445
+ "type": "array",
446
+ "items": {
447
+ "anyOf": [
448
+ {
449
+ "type": "string"
450
+ },
451
+ {
452
+ "type": "object",
453
+ "properties": {
454
+ "icon": {
455
+ "type": "string"
456
+ }
457
+ },
458
+ "required": [
459
+ "icon"
460
+ ],
461
+ "additionalProperties": false
462
+ },
463
+ {
464
+ "type": "object",
465
+ "properties": {
466
+ "mxc": {
467
+ "type": "string"
468
+ }
469
+ },
470
+ "required": [
471
+ "mxc"
472
+ ],
473
+ "additionalProperties": false
474
+ }
475
+ ]
476
+ }
477
+ }
478
+ },
479
+ "required": [
480
+ "type",
481
+ "elements"
482
+ ],
483
+ "additionalProperties": false
484
+ },
485
+ "BadgeBlock": {
486
+ "description": "상태 배지(tone 으로 색)",
487
+ "type": "object",
488
+ "properties": {
489
+ "type": {
490
+ "type": "string",
491
+ "const": "badge"
492
+ },
493
+ "text": {
494
+ "type": "string"
495
+ },
496
+ "tone": {
497
+ "description": "색 톤",
498
+ "$ref": "#/$defs/Tone"
499
+ }
500
+ },
501
+ "required": [
502
+ "type",
503
+ "text"
504
+ ],
505
+ "additionalProperties": false
506
+ },
507
+ "TableBlock": {
508
+ "description": "표 — columns 와 같은 길이의 문자열 rows",
509
+ "type": "object",
510
+ "properties": {
511
+ "type": {
512
+ "type": "string",
513
+ "const": "table"
514
+ },
515
+ "columns": {
516
+ "type": "array",
517
+ "items": {
518
+ "type": "string"
519
+ }
520
+ },
521
+ "rows": {
522
+ "type": "array",
523
+ "items": {
524
+ "type": "array",
525
+ "items": {
526
+ "type": "string"
527
+ }
528
+ }
529
+ }
530
+ },
531
+ "required": [
532
+ "type",
533
+ "columns",
534
+ "rows"
535
+ ],
536
+ "additionalProperties": false
537
+ },
538
+ "ProgressBlock": {
539
+ "description": "진행 막대(0~100 정수, 생략하면 불확정)",
540
+ "type": "object",
541
+ "properties": {
542
+ "type": {
543
+ "type": "string",
544
+ "const": "progress"
545
+ },
546
+ "value": {
547
+ "description": "0~100 정수. 생략하면 불확정",
548
+ "type": "integer",
549
+ "minimum": 0,
550
+ "maximum": 100
551
+ },
552
+ "label": {
553
+ "type": "string"
554
+ }
555
+ },
556
+ "required": [
557
+ "type"
558
+ ],
559
+ "additionalProperties": false
560
+ },
561
+ "StepsBlock": {
562
+ "description": "작업 단계 타임라인(done·active·todo·error)",
563
+ "type": "object",
564
+ "properties": {
565
+ "type": {
566
+ "type": "string",
567
+ "const": "steps"
568
+ },
569
+ "items": {
570
+ "type": "array",
571
+ "items": {
572
+ "type": "object",
573
+ "properties": {
574
+ "label": {
575
+ "type": "string"
576
+ },
577
+ "status": {
578
+ "type": "string",
579
+ "enum": [
580
+ "done",
581
+ "active",
582
+ "todo",
583
+ "error"
584
+ ]
585
+ },
586
+ "note": {
587
+ "type": "string"
588
+ }
589
+ },
590
+ "required": [
591
+ "label"
592
+ ],
593
+ "additionalProperties": false
594
+ }
595
+ }
596
+ },
597
+ "required": [
598
+ "type",
599
+ "items"
600
+ ],
601
+ "additionalProperties": false
602
+ },
603
+ "MetricBlock": {
604
+ "description": "KPI 하나 — 값·목표·증감",
605
+ "type": "object",
606
+ "properties": {
607
+ "type": {
608
+ "type": "string",
609
+ "const": "metric"
610
+ },
611
+ "label": {
612
+ "type": "string"
613
+ },
614
+ "value": {
615
+ "type": "string"
616
+ },
617
+ "target": {
618
+ "type": "string"
619
+ },
620
+ "delta": {
621
+ "type": "string"
622
+ },
623
+ "tone": {
624
+ "description": "색 톤",
625
+ "$ref": "#/$defs/Tone"
626
+ }
627
+ },
628
+ "required": [
629
+ "type",
630
+ "label",
631
+ "value"
632
+ ],
633
+ "additionalProperties": false
634
+ },
635
+ "ChartBlock": {
636
+ "description": "작은 차트(sparkline·bar·line·donut)",
637
+ "type": "object",
638
+ "properties": {
639
+ "type": {
640
+ "type": "string",
641
+ "const": "chart"
642
+ },
643
+ "variant": {
644
+ "type": "string",
645
+ "enum": [
646
+ "sparkline",
647
+ "bar",
648
+ "line",
649
+ "donut"
650
+ ]
651
+ },
652
+ "data": {
653
+ "description": "sparkline·line 은 순서대로 잇고, bar·donut 은 항목마다 막대·조각",
654
+ "type": "array",
655
+ "items": {
656
+ "type": "object",
657
+ "properties": {
658
+ "label": {
659
+ "type": "string"
660
+ },
661
+ "value": {
662
+ "type": "number"
663
+ },
664
+ "tone": {
665
+ "description": "색 톤",
666
+ "$ref": "#/$defs/Tone"
667
+ }
668
+ },
669
+ "required": [
670
+ "value"
671
+ ],
672
+ "additionalProperties": false
673
+ },
674
+ "minItems": 1
675
+ },
676
+ "caption": {
677
+ "type": "string"
678
+ },
679
+ "max": {
680
+ "type": "number",
681
+ "exclusiveMinimum": 0
682
+ },
683
+ "unit": {
684
+ "type": "string"
685
+ }
686
+ },
687
+ "required": [
688
+ "type",
689
+ "variant",
690
+ "data"
691
+ ],
692
+ "additionalProperties": false
693
+ },
694
+ "AvatarBlock": {
695
+ "description": "사람 한 명(얼굴·이름·상태점)",
696
+ "type": "object",
697
+ "properties": {
698
+ "type": {
699
+ "type": "string",
700
+ "const": "avatar"
701
+ },
702
+ "name": {
703
+ "description": "폼 값의 키 — 카드 안에서 고유",
704
+ "type": "string"
705
+ },
706
+ "initials": {
707
+ "type": "string"
708
+ },
709
+ "src": {
710
+ "type": "string"
711
+ },
712
+ "subtitle": {
713
+ "type": "string"
714
+ },
715
+ "ref": {
716
+ "$ref": "#/$defs/Ref"
717
+ },
718
+ "status": {
719
+ "type": "string",
720
+ "enum": [
721
+ "online",
722
+ "away",
723
+ "busy",
724
+ "offline"
725
+ ]
726
+ }
727
+ },
728
+ "required": [
729
+ "type",
730
+ "name"
731
+ ],
732
+ "additionalProperties": false
733
+ },
734
+ "AvatarGroupBlock": {
735
+ "description": "사람 여럿을 겹쳐 쌓기(+N)",
736
+ "type": "object",
737
+ "properties": {
738
+ "type": {
739
+ "type": "string",
740
+ "const": "avatarGroup"
741
+ },
742
+ "people": {
743
+ "type": "array",
744
+ "items": {
745
+ "type": "object",
746
+ "properties": {
747
+ "name": {
748
+ "description": "폼 값의 키 — 카드 안에서 고유",
749
+ "type": "string"
750
+ },
751
+ "initials": {
752
+ "type": "string"
753
+ },
754
+ "src": {
755
+ "type": "string"
756
+ }
757
+ },
758
+ "required": [
759
+ "name"
760
+ ],
761
+ "additionalProperties": false
762
+ },
763
+ "minItems": 1
764
+ },
765
+ "max": {
766
+ "type": "integer",
767
+ "exclusiveMinimum": 0
768
+ },
769
+ "label": {
770
+ "type": "string"
771
+ }
772
+ },
773
+ "required": [
774
+ "type",
775
+ "people"
776
+ ],
777
+ "additionalProperties": false
778
+ },
779
+ "GaugeBlock": {
780
+ "description": "반원 게이지(점수·리스크)",
781
+ "type": "object",
782
+ "properties": {
783
+ "type": {
784
+ "type": "string",
785
+ "const": "gauge"
786
+ },
787
+ "value": {
788
+ "type": "number"
789
+ },
790
+ "max": {
791
+ "type": "number"
792
+ },
793
+ "min": {
794
+ "type": "number"
795
+ },
796
+ "label": {
797
+ "type": "string"
798
+ },
799
+ "unit": {
800
+ "type": "string"
801
+ },
802
+ "tone": {
803
+ "description": "색 톤",
804
+ "$ref": "#/$defs/Tone"
805
+ }
806
+ },
807
+ "required": [
808
+ "type",
809
+ "value"
810
+ ],
811
+ "additionalProperties": false
812
+ },
813
+ "RatingBlock": {
814
+ "description": "별점(value/max)",
815
+ "type": "object",
816
+ "properties": {
817
+ "type": {
818
+ "type": "string",
819
+ "const": "rating"
820
+ },
821
+ "value": {
822
+ "type": "number",
823
+ "minimum": 0
824
+ },
825
+ "max": {
826
+ "type": "integer",
827
+ "exclusiveMinimum": 0
828
+ },
829
+ "label": {
830
+ "type": "string"
831
+ },
832
+ "symbol": {
833
+ "type": "string",
834
+ "enum": [
835
+ "star",
836
+ "dot"
837
+ ]
838
+ }
839
+ },
840
+ "required": [
841
+ "type",
842
+ "value"
843
+ ],
844
+ "additionalProperties": false
845
+ },
846
+ "CalloutBlock": {
847
+ "description": "톤 강조 상자(정보·경고·위험) — 제목 + 본문",
848
+ "type": "object",
849
+ "properties": {
850
+ "type": {
851
+ "type": "string",
852
+ "const": "callout"
853
+ },
854
+ "text": {
855
+ "type": "string"
856
+ },
857
+ "title": {
858
+ "type": "string"
859
+ },
860
+ "tone": {
861
+ "description": "색 톤",
862
+ "$ref": "#/$defs/Tone"
863
+ },
864
+ "icon": {
865
+ "type": "string"
866
+ }
867
+ },
868
+ "required": [
869
+ "type",
870
+ "text"
871
+ ],
872
+ "additionalProperties": false
873
+ },
874
+ "EntityRefBlock": {
875
+ "description": "엔티티(송장·리드·저장소…) 칩, url 이면 링크",
876
+ "type": "object",
877
+ "properties": {
878
+ "type": {
879
+ "type": "string",
880
+ "const": "entityRef"
881
+ },
882
+ "label": {
883
+ "type": "string"
884
+ },
885
+ "entity": {
886
+ "type": "string"
887
+ },
888
+ "url": {
889
+ "type": "string"
890
+ },
891
+ "tone": {
892
+ "description": "색 톤",
893
+ "$ref": "#/$defs/Tone"
894
+ }
895
+ },
896
+ "required": [
897
+ "type",
898
+ "label"
899
+ ],
900
+ "additionalProperties": false
901
+ },
902
+ "KanbanBlock": {
903
+ "description": "칸반 보드(표시 전용) — 컬럼별 카드",
904
+ "type": "object",
905
+ "properties": {
906
+ "type": {
907
+ "type": "string",
908
+ "const": "kanban"
909
+ },
910
+ "columns": {
911
+ "type": "array",
912
+ "items": {
913
+ "type": "object",
914
+ "properties": {
915
+ "id": {
916
+ "type": "string"
917
+ },
918
+ "title": {
919
+ "type": "string"
920
+ },
921
+ "tone": {
922
+ "description": "색 톤",
923
+ "$ref": "#/$defs/Tone"
924
+ },
925
+ "cards": {
926
+ "type": "array",
927
+ "items": {
928
+ "type": "object",
929
+ "properties": {
930
+ "id": {
931
+ "type": "string"
932
+ },
933
+ "title": {
934
+ "type": "string"
935
+ },
936
+ "tone": {
937
+ "description": "색 톤",
938
+ "$ref": "#/$defs/Tone"
939
+ },
940
+ "meta": {
941
+ "type": "array",
942
+ "items": {
943
+ "type": "string"
944
+ }
945
+ },
946
+ "badge": {
947
+ "type": "object",
948
+ "properties": {
949
+ "label": {
950
+ "type": "string"
951
+ },
952
+ "tone": {
953
+ "description": "색 톤",
954
+ "$ref": "#/$defs/Tone"
955
+ }
956
+ },
957
+ "required": [
958
+ "label"
959
+ ],
960
+ "additionalProperties": false
961
+ }
962
+ },
963
+ "required": [
964
+ "id",
965
+ "title"
966
+ ],
967
+ "additionalProperties": false
968
+ }
969
+ }
970
+ },
971
+ "required": [
972
+ "id",
973
+ "title",
974
+ "cards"
975
+ ],
976
+ "additionalProperties": false
977
+ },
978
+ "minItems": 1
979
+ },
980
+ "caption": {
981
+ "type": "string"
982
+ }
983
+ },
984
+ "required": [
985
+ "type",
986
+ "columns"
987
+ ],
988
+ "additionalProperties": false
989
+ },
990
+ "CountdownBlock": {
991
+ "description": "마감까지 남은 시간(라이브, target 은 ISO 8601)",
992
+ "type": "object",
993
+ "properties": {
994
+ "type": {
995
+ "type": "string",
996
+ "const": "countdown"
997
+ },
998
+ "target": {
999
+ "description": "ISO 8601 시각",
1000
+ "type": "string",
1001
+ "minLength": 1
1002
+ },
1003
+ "label": {
1004
+ "type": "string"
1005
+ },
1006
+ "tone": {
1007
+ "description": "색 톤",
1008
+ "$ref": "#/$defs/Tone"
1009
+ },
1010
+ "expiredText": {
1011
+ "type": "string"
1012
+ }
1013
+ },
1014
+ "required": [
1015
+ "type",
1016
+ "target"
1017
+ ],
1018
+ "additionalProperties": false
1019
+ },
1020
+ "ActivityBlock": {
1021
+ "description": "처리 이력(누가·무엇을·언제, 최신순)",
1022
+ "type": "object",
1023
+ "properties": {
1024
+ "type": {
1025
+ "type": "string",
1026
+ "const": "activity"
1027
+ },
1028
+ "label": {
1029
+ "type": "string"
1030
+ },
1031
+ "maxVisible": {
1032
+ "type": "integer",
1033
+ "exclusiveMinimum": 0
1034
+ },
1035
+ "items": {
1036
+ "type": "array",
1037
+ "items": {
1038
+ "type": "object",
1039
+ "properties": {
1040
+ "who": {
1041
+ "anyOf": [
1042
+ {
1043
+ "type": "string"
1044
+ },
1045
+ {
1046
+ "$ref": "#/$defs/Ref"
1047
+ }
1048
+ ]
1049
+ },
1050
+ "what": {
1051
+ "description": "무엇을 했나(인라인 마크다운)",
1052
+ "type": "string"
1053
+ },
1054
+ "at": {
1055
+ "description": "ISO 8601 시각",
1056
+ "type": "string",
1057
+ "minLength": 1
1058
+ },
1059
+ "tone": {
1060
+ "description": "색 톤",
1061
+ "$ref": "#/$defs/Tone"
1062
+ },
1063
+ "to": {
1064
+ "anyOf": [
1065
+ {
1066
+ "type": "string"
1067
+ },
1068
+ {
1069
+ "$ref": "#/$defs/Ref"
1070
+ }
1071
+ ]
1072
+ }
1073
+ },
1074
+ "required": [
1075
+ "who",
1076
+ "what",
1077
+ "at"
1078
+ ],
1079
+ "additionalProperties": false
1080
+ }
1081
+ }
1082
+ },
1083
+ "required": [
1084
+ "type",
1085
+ "items"
1086
+ ],
1087
+ "additionalProperties": false
1088
+ },
1089
+ "CodeBlock": {
1090
+ "description": "코드·JSON(읽기 전용)",
1091
+ "type": "object",
1092
+ "properties": {
1093
+ "type": {
1094
+ "type": "string",
1095
+ "const": "code"
1096
+ },
1097
+ "code": {
1098
+ "type": "string"
1099
+ },
1100
+ "language": {
1101
+ "type": "string"
1102
+ }
1103
+ },
1104
+ "required": [
1105
+ "type",
1106
+ "code"
1107
+ ],
1108
+ "additionalProperties": false
1109
+ },
1110
+ "DiffBlock": {
1111
+ "description": "unified diff 색칠 표시",
1112
+ "type": "object",
1113
+ "properties": {
1114
+ "type": {
1115
+ "type": "string",
1116
+ "const": "diff"
1117
+ },
1118
+ "filename": {
1119
+ "type": "string"
1120
+ },
1121
+ "patch": {
1122
+ "type": "string"
1123
+ },
1124
+ "additions": {
1125
+ "type": "integer",
1126
+ "minimum": 0
1127
+ },
1128
+ "deletions": {
1129
+ "type": "integer",
1130
+ "minimum": 0
1131
+ }
1132
+ },
1133
+ "required": [
1134
+ "type",
1135
+ "patch"
1136
+ ],
1137
+ "additionalProperties": false
1138
+ },
1139
+ "FileBlock": {
1140
+ "description": "첨부 파일 타일(이름·크기·다운로드)",
1141
+ "type": "object",
1142
+ "properties": {
1143
+ "type": {
1144
+ "type": "string",
1145
+ "const": "file"
1146
+ },
1147
+ "name": {
1148
+ "description": "폼 값의 키 — 카드 안에서 고유",
1149
+ "type": "string"
1150
+ },
1151
+ "size": {
1152
+ "type": "integer",
1153
+ "minimum": 0
1154
+ },
1155
+ "mime": {
1156
+ "type": "string"
1157
+ },
1158
+ "url": {
1159
+ "type": "string"
1160
+ },
1161
+ "mxc": {
1162
+ "type": "string"
1163
+ },
1164
+ "caption": {
1165
+ "type": "string"
1166
+ }
1167
+ },
1168
+ "required": [
1169
+ "type",
1170
+ "name"
1171
+ ],
1172
+ "additionalProperties": false
1173
+ },
1174
+ "CollapsibleBlock": {
1175
+ "description": "접기/펼치기 — 펼치면 중첩 blocks",
1176
+ "type": "object",
1177
+ "properties": {
1178
+ "type": {
1179
+ "type": "string",
1180
+ "const": "collapsible"
1181
+ },
1182
+ "title": {
1183
+ "type": "string"
1184
+ },
1185
+ "open": {
1186
+ "type": "boolean"
1187
+ },
1188
+ "tone": {
1189
+ "description": "색 톤",
1190
+ "$ref": "#/$defs/Tone"
1191
+ },
1192
+ "legacy_for": {
1193
+ "type": "string",
1194
+ "enum": [
1195
+ "activity"
1196
+ ]
1197
+ },
1198
+ "summary": {
1199
+ "description": "접힌 채로 보이는 한 줄",
1200
+ "type": "string"
1201
+ },
1202
+ "blocks": {
1203
+ "description": "펼치면 보이는 중첩 블록",
1204
+ "type": "array",
1205
+ "items": {
1206
+ "$ref": "#/$defs/Block"
1207
+ }
1208
+ }
1209
+ },
1210
+ "required": [
1211
+ "type",
1212
+ "title",
1213
+ "blocks"
1214
+ ],
1215
+ "additionalProperties": false
1216
+ },
1217
+ "WidgetBlock": {
1218
+ "description": "샌드박스 iframe(허용 출처만) — 블록으로 안 될 때의 최후 수단",
1219
+ "type": "object",
1220
+ "properties": {
1221
+ "type": {
1222
+ "type": "string",
1223
+ "const": "widget"
1224
+ },
1225
+ "url": {
1226
+ "description": "허용 출처 https URL(클라가 검증)",
1227
+ "type": "string"
1228
+ },
1229
+ "name": {
1230
+ "description": "폼 값의 키 — 카드 안에서 고유",
1231
+ "type": "string"
1232
+ },
1233
+ "widget_id": {
1234
+ "type": "string"
1235
+ },
1236
+ "capabilities": {
1237
+ "type": "array",
1238
+ "items": {
1239
+ "type": "string"
1240
+ }
1241
+ },
1242
+ "height": {
1243
+ "type": "integer",
1244
+ "exclusiveMinimum": 0
1245
+ },
1246
+ "width": {
1247
+ "type": "string",
1248
+ "enum": [
1249
+ "column",
1250
+ "wide",
1251
+ "full"
1252
+ ]
1253
+ }
1254
+ },
1255
+ "required": [
1256
+ "type",
1257
+ "url"
1258
+ ],
1259
+ "additionalProperties": false
1260
+ },
1261
+ "InputBlock": {
1262
+ "description": "입력칸(text·textarea·number·date·datetime·time·url·email·file), name 으로 값 수집",
1263
+ "type": "object",
1264
+ "properties": {
1265
+ "type": {
1266
+ "type": "string",
1267
+ "const": "input"
1268
+ },
1269
+ "name": {
1270
+ "description": "폼 값의 키 — 카드 안에서 고유",
1271
+ "type": "string",
1272
+ "minLength": 1
1273
+ },
1274
+ "input": {
1275
+ "type": "string",
1276
+ "enum": [
1277
+ "text",
1278
+ "textarea",
1279
+ "number",
1280
+ "date",
1281
+ "datetime",
1282
+ "time",
1283
+ "url",
1284
+ "email",
1285
+ "file"
1286
+ ]
1287
+ },
1288
+ "label": {
1289
+ "type": "string"
1290
+ },
1291
+ "placeholder": {
1292
+ "type": "string"
1293
+ },
1294
+ "required": {
1295
+ "description": "비우면 제출이 잠긴다(서버도 재검증)",
1296
+ "type": "boolean"
1297
+ },
1298
+ "value": {
1299
+ "type": "string"
1300
+ },
1301
+ "accept": {
1302
+ "type": "string"
1303
+ },
1304
+ "multiple": {
1305
+ "type": "boolean"
1306
+ },
1307
+ "min": {
1308
+ "description": "하한 — 날짜·시각은 그 형식, number 는 숫자 문자열, \"today\" 허용",
1309
+ "type": "string"
1310
+ },
1311
+ "max": {
1312
+ "description": "상한 — input.min 과 같은 형식",
1313
+ "type": "string"
1314
+ },
1315
+ "minLength": {
1316
+ "type": "integer",
1317
+ "minimum": 0
1318
+ },
1319
+ "maxLength": {
1320
+ "type": "integer",
1321
+ "exclusiveMinimum": 0
1322
+ },
1323
+ "pattern": {
1324
+ "description": "JS 정규식 소스(구분자·플래그 없이)",
1325
+ "type": "string"
1326
+ },
1327
+ "error": {
1328
+ "type": "string"
1329
+ }
1330
+ },
1331
+ "required": [
1332
+ "type",
1333
+ "name"
1334
+ ],
1335
+ "additionalProperties": false
1336
+ },
1337
+ "ToggleBlock": {
1338
+ "description": "on/off 스위치(불리언)",
1339
+ "type": "object",
1340
+ "properties": {
1341
+ "type": {
1342
+ "type": "string",
1343
+ "const": "toggle"
1344
+ },
1345
+ "name": {
1346
+ "description": "폼 값의 키 — 카드 안에서 고유",
1347
+ "type": "string",
1348
+ "minLength": 1
1349
+ },
1350
+ "label": {
1351
+ "type": "string"
1352
+ },
1353
+ "checked": {
1354
+ "type": "boolean"
1355
+ },
1356
+ "onText": {
1357
+ "type": "string"
1358
+ },
1359
+ "offText": {
1360
+ "type": "string"
1361
+ }
1362
+ },
1363
+ "required": [
1364
+ "type",
1365
+ "name",
1366
+ "label"
1367
+ ],
1368
+ "additionalProperties": false
1369
+ },
1370
+ "SliderBlock": {
1371
+ "description": "정수 범위 슬라이더",
1372
+ "type": "object",
1373
+ "properties": {
1374
+ "type": {
1375
+ "type": "string",
1376
+ "const": "slider"
1377
+ },
1378
+ "name": {
1379
+ "description": "폼 값의 키 — 카드 안에서 고유",
1380
+ "type": "string",
1381
+ "minLength": 1
1382
+ },
1383
+ "label": {
1384
+ "type": "string"
1385
+ },
1386
+ "min": {
1387
+ "type": "integer"
1388
+ },
1389
+ "max": {
1390
+ "type": "integer"
1391
+ },
1392
+ "step": {
1393
+ "type": "integer",
1394
+ "exclusiveMinimum": 0
1395
+ },
1396
+ "value": {
1397
+ "description": "정수",
1398
+ "type": "integer"
1399
+ },
1400
+ "unit": {
1401
+ "type": "string"
1402
+ }
1403
+ },
1404
+ "required": [
1405
+ "type",
1406
+ "name"
1407
+ ],
1408
+ "additionalProperties": false
1409
+ },
1410
+ "RadioBlock": {
1411
+ "description": "펼쳐진 단일 선택",
1412
+ "type": "object",
1413
+ "properties": {
1414
+ "type": {
1415
+ "type": "string",
1416
+ "const": "radio"
1417
+ },
1418
+ "name": {
1419
+ "description": "폼 값의 키 — 카드 안에서 고유",
1420
+ "type": "string",
1421
+ "minLength": 1
1422
+ },
1423
+ "label": {
1424
+ "type": "string"
1425
+ },
1426
+ "options": {
1427
+ "type": "array",
1428
+ "items": {
1429
+ "type": "object",
1430
+ "properties": {
1431
+ "value": {
1432
+ "type": "string"
1433
+ },
1434
+ "label": {
1435
+ "type": "string"
1436
+ },
1437
+ "hint": {
1438
+ "type": "string"
1439
+ }
1440
+ },
1441
+ "required": [
1442
+ "value",
1443
+ "label"
1444
+ ],
1445
+ "additionalProperties": false
1446
+ }
1447
+ },
1448
+ "value": {
1449
+ "type": "string"
1450
+ },
1451
+ "style": {
1452
+ "type": "string",
1453
+ "enum": [
1454
+ "cards",
1455
+ "segmented"
1456
+ ]
1457
+ },
1458
+ "required": {
1459
+ "description": "비우면 제출이 잠긴다(서버도 재검증)",
1460
+ "type": "boolean"
1461
+ },
1462
+ "error": {
1463
+ "type": "string"
1464
+ }
1465
+ },
1466
+ "required": [
1467
+ "type",
1468
+ "name",
1469
+ "options"
1470
+ ],
1471
+ "additionalProperties": false
1472
+ },
1473
+ "SelectBlock": {
1474
+ "description": "선택(단일·multi), 후보가 많으면 검색 목록",
1475
+ "type": "object",
1476
+ "properties": {
1477
+ "type": {
1478
+ "type": "string",
1479
+ "const": "select"
1480
+ },
1481
+ "name": {
1482
+ "description": "폼 값의 키 — 카드 안에서 고유",
1483
+ "type": "string",
1484
+ "minLength": 1
1485
+ },
1486
+ "label": {
1487
+ "type": "string"
1488
+ },
1489
+ "placeholder": {
1490
+ "type": "string"
1491
+ },
1492
+ "options": {
1493
+ "type": "array",
1494
+ "items": {
1495
+ "type": "object",
1496
+ "properties": {
1497
+ "value": {
1498
+ "type": "string"
1499
+ },
1500
+ "label": {
1501
+ "type": "string"
1502
+ },
1503
+ "hint": {
1504
+ "type": "string"
1505
+ },
1506
+ "ref": {
1507
+ "$ref": "#/$defs/Ref"
1508
+ }
1509
+ },
1510
+ "required": [
1511
+ "value",
1512
+ "label"
1513
+ ],
1514
+ "additionalProperties": false
1515
+ }
1516
+ },
1517
+ "value": {
1518
+ "type": "string"
1519
+ },
1520
+ "multi": {
1521
+ "description": "true 면 여러 개 선택",
1522
+ "type": "boolean"
1523
+ },
1524
+ "source": {
1525
+ "$ref": "#/$defs/SelectSource"
1526
+ },
1527
+ "style": {
1528
+ "type": "string",
1529
+ "enum": [
1530
+ "list",
1531
+ "segmented",
1532
+ "dropdown",
1533
+ "chips"
1534
+ ]
1535
+ },
1536
+ "searchable": {
1537
+ "type": "boolean"
1538
+ },
1539
+ "required": {
1540
+ "description": "비우면 제출이 잠긴다(서버도 재검증)",
1541
+ "type": "boolean"
1542
+ },
1543
+ "min": {
1544
+ "description": "multi 전용 — 고른 개수 하한",
1545
+ "type": "integer",
1546
+ "minimum": 0
1547
+ },
1548
+ "max": {
1549
+ "description": "multi 전용 — 고른 개수 상한",
1550
+ "type": "integer",
1551
+ "exclusiveMinimum": 0
1552
+ },
1553
+ "error": {
1554
+ "type": "string"
1555
+ }
1556
+ },
1557
+ "required": [
1558
+ "type",
1559
+ "name",
1560
+ "options"
1561
+ ],
1562
+ "additionalProperties": false
1563
+ },
1564
+ "SelectSource": {
1565
+ "anyOf": [
1566
+ {
1567
+ "type": "object",
1568
+ "properties": {
1569
+ "kind": {
1570
+ "type": "string",
1571
+ "const": "room"
1572
+ },
1573
+ "exclude_self": {
1574
+ "type": "boolean"
1575
+ },
1576
+ "exclude": {
1577
+ "type": "array",
1578
+ "items": {
1579
+ "type": "string"
1580
+ }
1581
+ },
1582
+ "include_bots": {
1583
+ "type": "boolean"
1584
+ }
1585
+ },
1586
+ "required": [
1587
+ "kind"
1588
+ ],
1589
+ "additionalProperties": false
1590
+ },
1591
+ {
1592
+ "type": "object",
1593
+ "properties": {
1594
+ "kind": {
1595
+ "type": "string",
1596
+ "const": "query"
1597
+ },
1598
+ "action_id": {
1599
+ "description": "누르면 이 값으로 봇에 회신된다 — 봇이 처리하는 id 만",
1600
+ "type": "string",
1601
+ "minLength": 1
1602
+ },
1603
+ "min_chars": {
1604
+ "type": "integer",
1605
+ "minimum": 0
1606
+ },
1607
+ "debounce_ms": {
1608
+ "type": "integer",
1609
+ "minimum": 0
1610
+ }
1611
+ },
1612
+ "required": [
1613
+ "kind",
1614
+ "action_id"
1615
+ ],
1616
+ "additionalProperties": false
1617
+ }
1618
+ ]
1619
+ },
1620
+ "CheckboxBlock": {
1621
+ "description": "체크박스(불리언)",
1622
+ "type": "object",
1623
+ "properties": {
1624
+ "type": {
1625
+ "type": "string",
1626
+ "const": "checkbox"
1627
+ },
1628
+ "name": {
1629
+ "description": "폼 값의 키 — 카드 안에서 고유",
1630
+ "type": "string",
1631
+ "minLength": 1
1632
+ },
1633
+ "label": {
1634
+ "type": "string"
1635
+ },
1636
+ "checked": {
1637
+ "type": "boolean"
1638
+ }
1639
+ },
1640
+ "required": [
1641
+ "type",
1642
+ "name",
1643
+ "label"
1644
+ ],
1645
+ "additionalProperties": false
1646
+ },
1647
+ "LocationBlock": {
1648
+ "description": "사용자가 주는 현재 위치(버튼 → 권한창)",
1649
+ "type": "object",
1650
+ "properties": {
1651
+ "type": {
1652
+ "type": "string",
1653
+ "const": "location"
1654
+ },
1655
+ "name": {
1656
+ "description": "폼 값의 키 — 카드 안에서 고유",
1657
+ "type": "string",
1658
+ "minLength": 1
1659
+ },
1660
+ "label": {
1661
+ "type": "string"
1662
+ },
1663
+ "purpose": {
1664
+ "type": "string"
1665
+ },
1666
+ "required": {
1667
+ "description": "비우면 제출이 잠긴다(서버도 재검증)",
1668
+ "type": "boolean"
1669
+ },
1670
+ "precise": {
1671
+ "type": "boolean"
1672
+ },
1673
+ "buttonText": {
1674
+ "type": "string"
1675
+ }
1676
+ },
1677
+ "required": [
1678
+ "type",
1679
+ "name"
1680
+ ],
1681
+ "additionalProperties": false
1682
+ },
1683
+ "ButtonBlock": {
1684
+ "description": "버튼 하나 — 누르면 action_id 로 봇에 회신(보통 actions 안에 둔다)",
1685
+ "type": "object",
1686
+ "properties": {
1687
+ "type": {
1688
+ "type": "string",
1689
+ "const": "button"
1690
+ },
1691
+ "action_id": {
1692
+ "description": "누르면 이 값으로 봇에 회신된다 — 봇이 처리하는 id 만",
1693
+ "type": "string",
1694
+ "minLength": 1
1695
+ },
1696
+ "text": {
1697
+ "type": "string"
1698
+ },
1699
+ "style": {
1700
+ "description": "primary 는 주 동작 하나에만, danger 는 파괴적 동작",
1701
+ "$ref": "#/$defs/ButtonStyle"
1702
+ },
1703
+ "value": {
1704
+ "description": "버튼 고유 페이로드 — 폼 값과 함께 회신",
1705
+ "type": "string"
1706
+ },
1707
+ "confirm": {
1708
+ "description": "누르기 전 확인 창",
1709
+ "$ref": "#/$defs/Confirm"
1710
+ },
1711
+ "disabled": {
1712
+ "type": "boolean"
1713
+ },
1714
+ "hidden_for": {
1715
+ "description": "이 MXID 들에게 감춤(UX 일 뿐 권한 아님)",
1716
+ "type": "array",
1717
+ "items": {
1718
+ "type": "string"
1719
+ }
1720
+ },
1721
+ "visible_for": {
1722
+ "description": "이 MXID 들에게만 보임(UX 일 뿐 권한 아님)",
1723
+ "type": "array",
1724
+ "items": {
1725
+ "type": "string"
1726
+ }
1727
+ },
1728
+ "disabled_reason": {
1729
+ "type": "string"
1730
+ },
1731
+ "priority": {
1732
+ "type": "string",
1733
+ "enum": [
1734
+ "primary",
1735
+ "secondary"
1736
+ ]
1737
+ }
1738
+ },
1739
+ "required": [
1740
+ "type",
1741
+ "action_id",
1742
+ "text"
1743
+ ],
1744
+ "additionalProperties": false
1745
+ },
1746
+ "ButtonStyle": {
1747
+ "type": "string",
1748
+ "enum": [
1749
+ "default",
1750
+ "primary",
1751
+ "danger"
1752
+ ]
1753
+ },
1754
+ "Confirm": {
1755
+ "type": "object",
1756
+ "properties": {
1757
+ "title": {
1758
+ "type": "string"
1759
+ },
1760
+ "text": {
1761
+ "type": "string"
1762
+ },
1763
+ "ok": {
1764
+ "type": "string"
1765
+ },
1766
+ "cancel": {
1767
+ "type": "string"
1768
+ }
1769
+ },
1770
+ "required": [
1771
+ "title",
1772
+ "text"
1773
+ ],
1774
+ "additionalProperties": false
1775
+ },
1776
+ "LinkButtonBlock": {
1777
+ "description": "https 로 이동만 하는 버튼(회신 없음)",
1778
+ "type": "object",
1779
+ "properties": {
1780
+ "type": {
1781
+ "type": "string",
1782
+ "const": "linkButton"
1783
+ },
1784
+ "text": {
1785
+ "type": "string"
1786
+ },
1787
+ "url": {
1788
+ "description": "이동할 https URL — 봇 회신 없음",
1789
+ "type": "string"
1790
+ },
1791
+ "style": {
1792
+ "$ref": "#/$defs/ButtonStyle"
1793
+ },
1794
+ "external": {
1795
+ "type": "boolean"
1796
+ },
1797
+ "priority": {
1798
+ "type": "string",
1799
+ "enum": [
1800
+ "primary",
1801
+ "secondary"
1802
+ ]
1803
+ }
1804
+ },
1805
+ "required": [
1806
+ "type",
1807
+ "text",
1808
+ "url"
1809
+ ],
1810
+ "additionalProperties": false
1811
+ },
1812
+ "ActionsBlock": {
1813
+ "description": "버튼 한 줄(button·linkButton·overflow) — 입력값과 함께 제출",
1814
+ "type": "object",
1815
+ "properties": {
1816
+ "type": {
1817
+ "type": "string",
1818
+ "const": "actions"
1819
+ },
1820
+ "elements": {
1821
+ "type": "array",
1822
+ "items": {
1823
+ "$ref": "#/$defs/ActionElement"
1824
+ }
1825
+ }
1826
+ },
1827
+ "required": [
1828
+ "type",
1829
+ "elements"
1830
+ ],
1831
+ "additionalProperties": false
1832
+ },
1833
+ "ActionElement": {
1834
+ "anyOf": [
1835
+ {
1836
+ "$ref": "#/$defs/ButtonBlock"
1837
+ },
1838
+ {
1839
+ "$ref": "#/$defs/LinkButtonBlock"
1840
+ },
1841
+ {
1842
+ "$ref": "#/$defs/OverflowBlock"
1843
+ }
1844
+ ]
1845
+ },
1846
+ "OverflowBlock": {
1847
+ "description": "⋯ 메뉴(부차 액션 묶음)",
1848
+ "type": "object",
1849
+ "properties": {
1850
+ "type": {
1851
+ "type": "string",
1852
+ "const": "overflow"
1853
+ },
1854
+ "label": {
1855
+ "type": "string"
1856
+ },
1857
+ "items": {
1858
+ "type": "array",
1859
+ "items": {
1860
+ "type": "object",
1861
+ "properties": {
1862
+ "action_id": {
1863
+ "description": "누르면 이 값으로 봇에 회신된다 — 봇이 처리하는 id 만",
1864
+ "type": "string",
1865
+ "minLength": 1
1866
+ },
1867
+ "text": {
1868
+ "type": "string"
1869
+ },
1870
+ "value": {
1871
+ "type": "string"
1872
+ },
1873
+ "tone": {
1874
+ "description": "색 톤",
1875
+ "$ref": "#/$defs/Tone"
1876
+ },
1877
+ "confirm": {
1878
+ "description": "누르기 전 확인 창",
1879
+ "$ref": "#/$defs/Confirm"
1880
+ },
1881
+ "disabled": {
1882
+ "type": "boolean"
1883
+ },
1884
+ "visible_for": {
1885
+ "description": "이 MXID 들에게만 보임(UX 일 뿐 권한 아님)",
1886
+ "type": "array",
1887
+ "items": {
1888
+ "type": "string"
1889
+ }
1890
+ },
1891
+ "hidden_for": {
1892
+ "description": "이 MXID 들에게 감춤(UX 일 뿐 권한 아님)",
1893
+ "type": "array",
1894
+ "items": {
1895
+ "type": "string"
1896
+ }
1897
+ },
1898
+ "disabled_reason": {
1899
+ "type": "string"
1900
+ }
1901
+ },
1902
+ "required": [
1903
+ "action_id",
1904
+ "text"
1905
+ ],
1906
+ "additionalProperties": false
1907
+ },
1908
+ "minItems": 1
1909
+ }
1910
+ },
1911
+ "required": [
1912
+ "type",
1913
+ "items"
1914
+ ],
1915
+ "additionalProperties": false
1916
+ }
1917
+ }
1918
+ }