@arcaneorion/dsh-teaching-board 0.4.1 → 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.
- package/README.md +35 -4
- package/cordis.patch.yml +6 -2
- package/package.json +5 -3
- package/skills/stage-panel/SKILL.md +107 -0
- package/skills/stage-panel/references/diagram-selection.md +80 -0
- package/skills/stage-panel/references/html-patterns.md +93 -0
- package/skills/stage-panel/references/visual-style.md +43 -0
- package/skills/stage-panel/submode/code/SKILL.md +17 -0
- package/skills/stage-panel/submode/code/examples/go-hello-channel.json +36 -0
- package/skills/stage-panel/submode/code/examples/go-http-api-basics.json +58 -0
- package/skills/stage-panel/submode/code/examples/py-agent-loop.json +79 -0
- package/skills/stage-panel/submode/code/examples/py-ai-parameters-intro.json +65 -0
- package/skills/stage-panel/submode/code/examples/py-fizzbuzz-intro.json +74 -0
- package/skills/stage-panel/submode/code/examples/py-training-loop.json +114 -0
- package/skills/stage-panel/submode/code/examples/rs-move-basics.json +118 -0
- package/skills/stage-panel/submode/code/references/host-toolchains.md +61 -0
- package/skills/stage-panel/submode/code/schemas/lesson.schema.json +225 -0
- package/skills/stage-panel/submode/code/templates/lab.html +561 -0
- package/skills/stage-panel/submode/game-study/SKILL.md +16 -0
- package/skills/stage-panel/submode/game-study/examples/hft-microstructure.json +60 -0
- package/skills/stage-panel/submode/game-study/examples/securities-law.json +57 -0
- package/skills/stage-panel/submode/game-study/schemas/quest.schema.json +95 -0
- package/skills/stage-panel/submode/game-study/templates/quiz.html +516 -0
- package/skills/stage-panel/submode/learn/SKILL.md +16 -0
- package/skills/stage-panel/submode/learn/examples/epsilon-delta.json +140 -0
- package/skills/stage-panel/submode/learn/examples/template-showcase.json +147 -0
- package/skills/stage-panel/submode/learn/schemas/lesson.schema.json +184 -0
- package/skills/stage-panel/submode/learn/templates/lesson.html +782 -0
- package/skills/stage-panel/submode/ml/SKILL.md +9 -0
- package/skills/stage-panel/submode/ml/examples/gd.json +7 -0
- package/skills/stage-panel/submode/ml/templates/gd.html +217 -0
- package/skills/stage-panel/submode/quant/SKILL.md +9 -0
- package/skills/stage-panel/submode/quant/references/export_backtest_data.py +192 -0
- package/skills/stage-panel/submode/quant/templates/dashboard.html +381 -0
- package/src/client.js +177 -15
- package/src/index.js +11 -0
- package/src/skills.js +88 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"id": "epsilon-delta",
|
|
4
|
+
"title": "epsilon-delta 极限证明",
|
|
5
|
+
"subtitle": "从具体线性函数开始,把误差控制写成可检查的结构",
|
|
6
|
+
"stage": "概念入口 + 主动回忆",
|
|
7
|
+
"summary": "epsilon-delta 证明的核心不是背模板,而是把目标误差 |f(x)-L| < epsilon 反推成对 |x-a| 的约束。",
|
|
8
|
+
"objectives": [
|
|
9
|
+
"说清楚 epsilon 和 delta 各自控制什么",
|
|
10
|
+
"把 |3x-1-5| < epsilon 化成 |x-2| < epsilon/3",
|
|
11
|
+
"解释为什么选 delta = epsilon/3 足够"
|
|
12
|
+
],
|
|
13
|
+
"concepts": [
|
|
14
|
+
{
|
|
15
|
+
"term": "epsilon",
|
|
16
|
+
"definition": "目标误差上界。证明者要保证函数值和极限值的距离小于它。",
|
|
17
|
+
"back": "把 epsilon 想成对方给出的验收标准:无论它多小,证明都要能找到一个输入范围,让函数值误差落进这个标准里。",
|
|
18
|
+
"note": "它由对方任意给出,不能由证明者挑。"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"term": "delta",
|
|
22
|
+
"definition": "输入距离上界。证明者根据 epsilon 选择它,用来限制 x 离 a 足够近。",
|
|
23
|
+
"back": "delta 是证明者能控制的旋钮。在线性例子里,把目标误差反推成 |x-a| 的上界,就能直接读出 delta。",
|
|
24
|
+
"note": "delta 的任务是让目标误差自动成立。"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"term": "误差反推",
|
|
28
|
+
"definition": "从 |f(x)-L| 的表达式出发,找出它和 |x-a| 的关系。",
|
|
29
|
+
"back": "反推不是倒着证明结论,而是寻找一个足够强的输入条件。找到以后,正式证明仍然从 0 < |x-a| < delta 推回目标误差。",
|
|
30
|
+
"note": "线性函数里通常可以直接提出常数倍。"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"structure": {
|
|
34
|
+
"nodes": [
|
|
35
|
+
{
|
|
36
|
+
"id": "abs",
|
|
37
|
+
"label": "绝对值距离",
|
|
38
|
+
"kind": "prerequisite",
|
|
39
|
+
"detail": "|x-a| 表示 x 到 a 的距离"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "input",
|
|
43
|
+
"label": "输入约束",
|
|
44
|
+
"kind": "current",
|
|
45
|
+
"detail": "0 < |x-a| < delta"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "target",
|
|
49
|
+
"label": "目标误差",
|
|
50
|
+
"kind": "current",
|
|
51
|
+
"detail": "|f(x)-L| < epsilon"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "next",
|
|
55
|
+
"label": "局部有界控制",
|
|
56
|
+
"kind": "next",
|
|
57
|
+
"detail": "二次函数等非线性例子需要额外控制局部范围"
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"edges": [
|
|
61
|
+
{
|
|
62
|
+
"from": "abs",
|
|
63
|
+
"to": "input",
|
|
64
|
+
"label": "定义距离"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"from": "input",
|
|
68
|
+
"to": "target",
|
|
69
|
+
"label": "delta 让目标成立"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"from": "target",
|
|
73
|
+
"to": "next",
|
|
74
|
+
"label": "非线性时需要多一步"
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"examples": [
|
|
79
|
+
{
|
|
80
|
+
"title": "线性例子",
|
|
81
|
+
"type": "worked",
|
|
82
|
+
"body": "证明 lim(x -> 2)(3x - 1) = 5。因为 |(3x-1)-5| = |3x-6| = 3|x-2|,所以只要让 |x-2| < epsilon/3,就能推出目标误差小于 epsilon。"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"title": "常见误区",
|
|
86
|
+
"type": "nonexample",
|
|
87
|
+
"body": "不要先假设 |3x-1-5| < epsilon 再推出 delta。证明方向应该是:先限制 |x-2|,再推出目标误差。"
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"questions": [
|
|
91
|
+
{
|
|
92
|
+
"id": "q1",
|
|
93
|
+
"type": "short",
|
|
94
|
+
"prompt": "用一句话说明 epsilon 和 delta 的分工。",
|
|
95
|
+
"hint": "谁是目标,谁是手段?"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"id": "q2",
|
|
99
|
+
"type": "choice",
|
|
100
|
+
"prompt": "证明 lim(x -> 2)(3x - 1) = 5 时,下面哪个 delta 选择一定足够?",
|
|
101
|
+
"options": [
|
|
102
|
+
{
|
|
103
|
+
"id": "a",
|
|
104
|
+
"label": "delta = epsilon / 3"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id": "b",
|
|
108
|
+
"label": "delta = 3epsilon"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "c",
|
|
112
|
+
"label": "delta = epsilon + 2"
|
|
113
|
+
}
|
|
114
|
+
],
|
|
115
|
+
"hint": "把目标误差写成 3|x-2|。"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"id": "q3",
|
|
119
|
+
"type": "explain",
|
|
120
|
+
"prompt": "为什么证明里不能直接把 |3x-1-5| < epsilon 当作已知?"
|
|
121
|
+
}
|
|
122
|
+
],
|
|
123
|
+
"next": [
|
|
124
|
+
{
|
|
125
|
+
"id": "same-pattern",
|
|
126
|
+
"label": "同型线性题",
|
|
127
|
+
"description": "换一个一次函数,检查能否独立反推 delta。"
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"id": "quadratic",
|
|
131
|
+
"label": "进入二次函数",
|
|
132
|
+
"description": "学习 min(1, epsilon/C) 里的局部范围控制。"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"id": "definition",
|
|
136
|
+
"label": "回到正式定义",
|
|
137
|
+
"description": "把具体证明嵌回教材中的 epsilon-delta 定义。"
|
|
138
|
+
}
|
|
139
|
+
]
|
|
140
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"id": "template-showcase",
|
|
4
|
+
"title": "Learn 模板通用预览",
|
|
5
|
+
"subtitle": "展示概念卡、结构图、例子、练习和下一步选择如何组合,而不是绑定某个具体学科",
|
|
6
|
+
"stage": "模板展示",
|
|
7
|
+
"summary": "这个面板用于预览 learn 模板的通用信息结构:左侧放学习目标和可翻面的概念卡,右侧放关系图、例子、主动回忆题和可点击的下一步。",
|
|
8
|
+
"objectives": [
|
|
9
|
+
"快速看出本模板适合承载哪些学习信息",
|
|
10
|
+
"点击概念卡查看背面补充信息",
|
|
11
|
+
"通过结构图理解内容之间的关系",
|
|
12
|
+
"用下一步卡片表达后续学习方向"
|
|
13
|
+
],
|
|
14
|
+
"concepts": [
|
|
15
|
+
{
|
|
16
|
+
"term": "核心概念",
|
|
17
|
+
"definition": "放置当前主题最关键的定义、直觉或判断标准。",
|
|
18
|
+
"back": "背面适合补充边界条件、常见误解、记忆钩子或一个更贴近日常语言的解释。",
|
|
19
|
+
"note": "适合短定义,不适合塞长段落。"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"term": "关键关系",
|
|
23
|
+
"definition": "说明几个概念之间如何连接,例如依赖、因果、转换或约束。",
|
|
24
|
+
"back": "如果关系本身比概念更重要,应优先在结构图里表达,再用概念卡解释节点含义。",
|
|
25
|
+
"note": "关系可以是流程、推导链、调用链或协议时序。"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"term": "学习动作",
|
|
29
|
+
"definition": "让用户做一个低成本动作,例如解释、选择、排序、标注或写出卡点。",
|
|
30
|
+
"back": "交互不应该为了热闹而存在;只有当它能帮助 CLI 判断下一步教学时,才需要回传。",
|
|
31
|
+
"note": "纯展示也是有效面板。"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"structure": {
|
|
35
|
+
"diagram": " [前提 P1] ──┐\n ├── 推出 ──> [结论 C]\n [前提 P2] ──┘\n ▲\n │ 支持\n [证据 E]\n\n [反例 X] ──反驳/限制──> [结论 C]\n\n [边界 B] ──限定适用范围──> [结论 C]",
|
|
36
|
+
"nodes": [
|
|
37
|
+
{
|
|
38
|
+
"id": "context",
|
|
39
|
+
"label": "背景入口",
|
|
40
|
+
"kind": "prerequisite",
|
|
41
|
+
"detail": "用户已经知道或刚刚建立的前置语境"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "concept",
|
|
45
|
+
"label": "当前主题",
|
|
46
|
+
"kind": "current",
|
|
47
|
+
"detail": "本轮解释真正要讲清楚的对象"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "activity",
|
|
51
|
+
"label": "学习动作",
|
|
52
|
+
"kind": "support",
|
|
53
|
+
"detail": "题目、标注、排序、推导或对比"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "signal",
|
|
57
|
+
"label": "用户信号",
|
|
58
|
+
"kind": "warning",
|
|
59
|
+
"detail": "答案、信心、卡点或下一步偏好"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "next",
|
|
63
|
+
"label": "后续路径",
|
|
64
|
+
"kind": "next",
|
|
65
|
+
"detail": "CLI 根据用户信号决定继续讲、换例子或进入练习"
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"edges": [
|
|
69
|
+
{
|
|
70
|
+
"from": "context",
|
|
71
|
+
"to": "concept",
|
|
72
|
+
"label": "铺垫"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"from": "concept",
|
|
76
|
+
"to": "activity",
|
|
77
|
+
"label": "转成练习"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"from": "activity",
|
|
81
|
+
"to": "signal",
|
|
82
|
+
"label": "暴露理解"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"from": "signal",
|
|
86
|
+
"to": "next",
|
|
87
|
+
"label": "决定走向"
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
"examples": [
|
|
92
|
+
{
|
|
93
|
+
"title": "适合的内容",
|
|
94
|
+
"type": "example",
|
|
95
|
+
"body": "概念解释、API 行为、代码执行路径、协议流程、证明结构、调试排查和方案对比,都可以使用这套结构做可视化学习面板。"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"title": "不适合硬套",
|
|
99
|
+
"type": "counterexample",
|
|
100
|
+
"body": "如果内容需要代码沙盒、密集图谱、长表格、时间轴或自由画布,就应该生成自定义 HTML panel,而不是硬套这个 lesson 模板。"
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
"questions": [
|
|
104
|
+
{
|
|
105
|
+
"id": "fit",
|
|
106
|
+
"type": "choice",
|
|
107
|
+
"prompt": "这个学习内容更适合哪种展示方式?",
|
|
108
|
+
"options": [
|
|
109
|
+
{
|
|
110
|
+
"id": "concept",
|
|
111
|
+
"label": "概念卡 + 关系图"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"id": "timeline",
|
|
115
|
+
"label": "时间线 / 时序图"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"id": "custom",
|
|
119
|
+
"label": "完全自定义 panel"
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"hint": "先看内容的认知结构,而不是先选模板。"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id": "missing",
|
|
126
|
+
"type": "short",
|
|
127
|
+
"prompt": "这个模板还缺哪一种学习交互?"
|
|
128
|
+
}
|
|
129
|
+
],
|
|
130
|
+
"next": [
|
|
131
|
+
{
|
|
132
|
+
"id": "custom-panel",
|
|
133
|
+
"label": "改成自定义 panel",
|
|
134
|
+
"description": "当内容不适合 lesson 结构时,直接生成专用 HTML。"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"id": "more-blocks",
|
|
138
|
+
"label": "增加内容块",
|
|
139
|
+
"description": "加入推导链、代码路径、时间线、对比矩阵等 block。"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"id": "simplify",
|
|
143
|
+
"label": "压缩模板",
|
|
144
|
+
"description": "减少默认栏目,只保留本轮学习真正需要的信息。"
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://localweb.dev/schemas/learn.lesson.schema.json",
|
|
4
|
+
"title": "LocalWeb Learn Lesson",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": true,
|
|
7
|
+
"required": ["title"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema_version": {
|
|
10
|
+
"type": "integer",
|
|
11
|
+
"const": 1
|
|
12
|
+
},
|
|
13
|
+
"id": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"pattern": "^[A-Za-z0-9_-]+$"
|
|
16
|
+
},
|
|
17
|
+
"title": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"minLength": 1
|
|
20
|
+
},
|
|
21
|
+
"subtitle": {
|
|
22
|
+
"type": "string"
|
|
23
|
+
},
|
|
24
|
+
"stage": {
|
|
25
|
+
"type": "string"
|
|
26
|
+
},
|
|
27
|
+
"summary": {
|
|
28
|
+
"type": "string"
|
|
29
|
+
},
|
|
30
|
+
"objectives": {
|
|
31
|
+
"type": "array",
|
|
32
|
+
"items": {
|
|
33
|
+
"type": "string"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"concepts": {
|
|
37
|
+
"type": "array",
|
|
38
|
+
"items": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"required": ["term", "definition"],
|
|
41
|
+
"additionalProperties": true,
|
|
42
|
+
"properties": {
|
|
43
|
+
"term": {
|
|
44
|
+
"type": "string"
|
|
45
|
+
},
|
|
46
|
+
"definition": {
|
|
47
|
+
"type": "string"
|
|
48
|
+
},
|
|
49
|
+
"note": {
|
|
50
|
+
"type": "string"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"structure": {
|
|
56
|
+
"type": "object",
|
|
57
|
+
"additionalProperties": true,
|
|
58
|
+
"properties": {
|
|
59
|
+
"nodes": {
|
|
60
|
+
"type": "array",
|
|
61
|
+
"items": {
|
|
62
|
+
"type": "object",
|
|
63
|
+
"required": ["id", "label"],
|
|
64
|
+
"additionalProperties": true,
|
|
65
|
+
"properties": {
|
|
66
|
+
"id": {
|
|
67
|
+
"type": "string"
|
|
68
|
+
},
|
|
69
|
+
"label": {
|
|
70
|
+
"type": "string"
|
|
71
|
+
},
|
|
72
|
+
"kind": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"enum": ["prerequisite", "current", "next", "support", "warning"]
|
|
75
|
+
},
|
|
76
|
+
"detail": {
|
|
77
|
+
"type": "string"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"edges": {
|
|
83
|
+
"type": "array",
|
|
84
|
+
"items": {
|
|
85
|
+
"type": "object",
|
|
86
|
+
"required": ["from", "to"],
|
|
87
|
+
"additionalProperties": true,
|
|
88
|
+
"properties": {
|
|
89
|
+
"from": {
|
|
90
|
+
"type": "string"
|
|
91
|
+
},
|
|
92
|
+
"to": {
|
|
93
|
+
"type": "string"
|
|
94
|
+
},
|
|
95
|
+
"label": {
|
|
96
|
+
"type": "string"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"examples": {
|
|
104
|
+
"type": "array",
|
|
105
|
+
"items": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"required": ["title", "body"],
|
|
108
|
+
"additionalProperties": true,
|
|
109
|
+
"properties": {
|
|
110
|
+
"title": {
|
|
111
|
+
"type": "string"
|
|
112
|
+
},
|
|
113
|
+
"body": {
|
|
114
|
+
"type": "string"
|
|
115
|
+
},
|
|
116
|
+
"type": {
|
|
117
|
+
"type": "string",
|
|
118
|
+
"enum": ["example", "nonexample", "counterexample", "worked"]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"questions": {
|
|
124
|
+
"type": "array",
|
|
125
|
+
"items": {
|
|
126
|
+
"type": "object",
|
|
127
|
+
"required": ["id", "prompt"],
|
|
128
|
+
"additionalProperties": true,
|
|
129
|
+
"properties": {
|
|
130
|
+
"id": {
|
|
131
|
+
"type": "string",
|
|
132
|
+
"pattern": "^[A-Za-z0-9_-]+$"
|
|
133
|
+
},
|
|
134
|
+
"type": {
|
|
135
|
+
"type": "string",
|
|
136
|
+
"enum": ["short", "explain", "choice"]
|
|
137
|
+
},
|
|
138
|
+
"prompt": {
|
|
139
|
+
"type": "string"
|
|
140
|
+
},
|
|
141
|
+
"hint": {
|
|
142
|
+
"type": "string"
|
|
143
|
+
},
|
|
144
|
+
"options": {
|
|
145
|
+
"type": "array",
|
|
146
|
+
"items": {
|
|
147
|
+
"type": "object",
|
|
148
|
+
"required": ["id", "label"],
|
|
149
|
+
"additionalProperties": true,
|
|
150
|
+
"properties": {
|
|
151
|
+
"id": {
|
|
152
|
+
"type": "string"
|
|
153
|
+
},
|
|
154
|
+
"label": {
|
|
155
|
+
"type": "string"
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
"next": {
|
|
164
|
+
"type": "array",
|
|
165
|
+
"items": {
|
|
166
|
+
"type": "object",
|
|
167
|
+
"required": ["id", "label"],
|
|
168
|
+
"additionalProperties": true,
|
|
169
|
+
"properties": {
|
|
170
|
+
"id": {
|
|
171
|
+
"type": "string"
|
|
172
|
+
},
|
|
173
|
+
"label": {
|
|
174
|
+
"type": "string"
|
|
175
|
+
},
|
|
176
|
+
"description": {
|
|
177
|
+
"type": "string"
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|