@my-life-buddies/cli 0.2.0 → 0.4.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.
- package/README.md +70 -53
- package/dist/bin/core.js +936 -447
- package/dist/bin/core.js.map +4 -4
- package/dist/bin/preview.js +147 -12
- package/dist/bin/preview.js.map +3 -3
- package/dist/web/app.css +8 -0
- package/dist/web/app.js +7 -2
- package/dist/web/index.html +11 -3
- package/dist/web/widget-delivery.js +28 -0
- package/dist/web/widgets.css +31 -0
- package/dist/web/widgets.js +127 -0
- package/package.json +3 -3
- package/resources/README.md +3 -1
- package/resources/agent-template/package-lock.json +4 -4
- package/resources/agent-template/package.json +1 -1
- package/resources/buddy-creator/INSTALL.md +2 -2
- package/resources/buddy-creator/PATCHES.md +21 -1
- package/resources/buddy-creator/SKILL.md +16 -6
- package/resources/buddy-creator/agents/openai.yaml +1 -1
- package/resources/buddy-creator/assets/preview/index.html +2 -0
- package/resources/buddy-creator/assets/preview/widgets.css +1 -0
- package/resources/buddy-creator/assets/preview/widgets.js +168 -0
- package/resources/buddy-creator/assets/widget-reference/conversation.png +0 -0
- package/resources/buddy-creator/assets/widget-reference/expanded.png +0 -0
- package/resources/buddy-creator/assets/widget-v2/app.js +62 -0
- package/resources/buddy-creator/assets/widget-v2/style.css +1 -0
- package/resources/buddy-creator/assets/widget-v3/app.js +65 -0
- package/resources/buddy-creator/assets/widget-v3/style.css +103 -0
- package/resources/buddy-creator/assets/widget-v4/app.js +66 -0
- package/resources/buddy-creator/assets/widget-v4/style.css +187 -0
- package/resources/buddy-creator/references/artifact-schema.md +2 -0
- package/resources/buddy-creator/references/host-guide.md +12 -6
- package/resources/buddy-creator/references/recovery.md +6 -3
- package/resources/buddy-creator/references/service.md +2 -0
- package/resources/buddy-creator/references/widgets-protocol.md +83 -0
- package/resources/buddy-creator/references/widgets.md +99 -0
- package/resources/buddy-creator/scripts/buddy_core.py +75 -13
- package/resources/buddy-creator/scripts/completion.py +64 -8
- package/resources/buddy-creator/scripts/preview.py +46 -6
- package/resources/buddy-creator/scripts/widget_render.py +66 -0
- package/resources/buddy-creator/scripts/widget_render_v1.py +176 -0
- package/resources/buddy-creator/scripts/widget_render_v2.py +98 -0
- package/resources/buddy-creator/scripts/widget_render_v3.py +86 -0
- package/resources/buddy-creator/scripts/widget_render_v4.py +121 -0
- package/resources/buddy-creator/scripts/widgets.py +227 -0
- package/resources/buddy-creator/version.json +1 -1
- package/resources/buddy-creator.manifest.json +121 -26
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"""Small read-only H5 designs, independently versioned after the four Booklets."""
|
|
2
|
+
import copy
|
|
3
|
+
import math
|
|
4
|
+
import re
|
|
5
|
+
|
|
6
|
+
import buddy_core as core
|
|
7
|
+
|
|
8
|
+
KINDS = {'widget-catalog', 'widget-prototype', 'widget-acceptance'}
|
|
9
|
+
CATALOG = 'widget.catalog'
|
|
10
|
+
INTERACTIONS = {'tabs', 'filter', 'collapse', 'detail'}
|
|
11
|
+
STATES = ('initial', 'partial', 'updated')
|
|
12
|
+
REVIEW_CHECKS = ('booklet-fit', 'reading-order', 'chat-consistency', 'conversation-update', 'read-only')
|
|
13
|
+
PHASES = [('booklets', '四册完成'), ('catalog', '清单确认'), ('prototype', '原型确认'), ('acceptance', '设计验收'), ('complete', '交付')]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def enabled(state):
|
|
17
|
+
return state.get('widgetDesignVersion') == 1
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def books_ready(state):
|
|
21
|
+
return all(core.book_confirmed(state, s) for s in core.catalog()['stages'])
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def booklet_revision(state):
|
|
25
|
+
return core.digest({k: state['artifacts'].get(k, {}).get('hash') for s in core.catalog()['stages'] for k in core.book_ids(s)})
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def items(state):
|
|
29
|
+
return state['artifacts'].get(CATALOG, {}).get('data', {}).get('widgets', [])
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def item_hash(item):
|
|
33
|
+
return core.digest(item)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def object_id(key, kind='prototype'):
|
|
37
|
+
return 'widget.' + key + '.' + kind
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def schema(value, required, optional=()):
|
|
41
|
+
core.require(isinstance(value, dict) and set(required) <= set(value) and not set(value) - set(required) - set(optional),
|
|
42
|
+
'WIDGET_SCHEMA', '小挂件字段不完整或含未支持字段。', {'required': list(required), 'optional': list(optional)})
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def strings(value, keys):
|
|
46
|
+
core.require(core.filled(value, keys), 'WIDGET_SCHEMA', '小挂件说明必须为非空文本。', {'fields': list(keys)})
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def validate(state, artifact):
|
|
50
|
+
core.require(enabled(state) and books_ready(state), 'WIDGET_STAGE', '先确认四册,再进入小挂件设计;旧作品须由开发者明确要求追加。')
|
|
51
|
+
core.require(artifact['stage'] == 'interaction' and artifact['kind'] in KINDS, 'WIDGET_SCHEMA', '小挂件使用独立 interaction 阶段。')
|
|
52
|
+
data, kind = artifact['data'], artifact['kind']
|
|
53
|
+
if kind == 'widget-catalog':
|
|
54
|
+
core.require(artifact['id'] == CATALOG, 'WIDGET_SCHEMA', '小挂件清单 ID 为 widget.catalog。')
|
|
55
|
+
schema(data, ('widgets',), ('noWidgetsReason',))
|
|
56
|
+
core.require(isinstance(data['widgets'], list), 'WIDGET_SCHEMA', 'widgets 必须是数组。')
|
|
57
|
+
core.require(data['widgets'] or core.text(data.get('noWidgetsReason')), 'WIDGET_EMPTY_REASON', '不使用小挂件也需说明依据,并展示给开发者明确确认。')
|
|
58
|
+
seen = set()
|
|
59
|
+
for item in data['widgets']:
|
|
60
|
+
fields = ('id', 'name', 'purpose', 'bookletRefs', 'creationTrigger', 'initialContent', 'updateRules', 'instancePolicy', 'conversationSummary', 'fields', 'readInteractions')
|
|
61
|
+
schema(item, fields)
|
|
62
|
+
strings(item, ('id', 'name', 'purpose', 'creationTrigger', 'initialContent', 'updateRules', 'instancePolicy', 'conversationSummary'))
|
|
63
|
+
core.require(re.fullmatch(r'[a-z][a-z0-9-]{0,39}', item['id']) and item['id'] not in seen, 'WIDGET_ID', '清单使用不重复的英文小写 ID,最长 40 位。')
|
|
64
|
+
seen.add(item['id'])
|
|
65
|
+
core.require(isinstance(item['readInteractions'], list) and len(set(item['readInteractions'])) == len(item['readInteractions']) and set(item['readInteractions']) <= INTERACTIONS,
|
|
66
|
+
'WIDGET_READ_ONLY', '小挂件只允许预设筛选、切换、折叠和只读详情;所有编辑、输入和业务动作通过对话完成。')
|
|
67
|
+
core.require(isinstance(item['fields'], list) and item['fields'], 'WIDGET_FIELDS', '说明对话逐步补充的展示字段。')
|
|
68
|
+
field_ids = set()
|
|
69
|
+
for field in item['fields']:
|
|
70
|
+
schema(field, ('key', 'label', 'source', 'emptyText'))
|
|
71
|
+
strings(field, ('key', 'label', 'source', 'emptyText'))
|
|
72
|
+
core.require(field['key'] not in field_ids, 'WIDGET_FIELDS', '字段 key 不能重复。')
|
|
73
|
+
field_ids.add(field['key'])
|
|
74
|
+
refs = item['bookletRefs']
|
|
75
|
+
core.require(isinstance(refs, list) and refs, 'WIDGET_BASIS', '每个小挂件需要绑定实际使用的 Booklet 章节版本。')
|
|
76
|
+
for ref in refs:
|
|
77
|
+
core.verify_ref(state, ref)
|
|
78
|
+
core.require(ref.get('type') == 'artifact' and state['artifacts'][ref['id']]['kind'] == 'chapter' and core.confirmed(state, ref['id']), 'WIDGET_BASIS', '依据必须为已确认的当前章节。')
|
|
79
|
+
# An empty list must still have an explicit Booklet basis.
|
|
80
|
+
core.require(any(r.get('type') == 'artifact' and state['artifacts'][r['id']]['kind'] == 'chapter' for r in artifact['dependencies']), 'WIDGET_BASIS', '清单需要引用已确认 Booklet。')
|
|
81
|
+
else:
|
|
82
|
+
core.require(core.confirmed(state, CATALOG) and not blockers(state, state['artifacts'][CATALOG]), 'WIDGET_CATALOG_UNCONFIRMED', '先展示并确认当前小挂件清单。')
|
|
83
|
+
key = data.get('widgetId')
|
|
84
|
+
item = next((i for i in items(state) if i['id'] == key), None)
|
|
85
|
+
core.require(item and data.get('itemHash') == item_hash(item), 'WIDGET_ITEM_STALE', '设计必须引用当前已确认清单中这一项的 itemHash。')
|
|
86
|
+
expected = object_id(key, 'prototype' if kind == 'widget-prototype' else 'acceptance')
|
|
87
|
+
core.require(artifact['id'] == expected, 'WIDGET_ID', '小挂件产物 ID 与清单项不一致。')
|
|
88
|
+
core.require(all(r in artifact['dependencies'] for r in item['bookletRefs']), 'WIDGET_BASIS', '保留该清单项实际使用的章节依赖。')
|
|
89
|
+
core.require(not any(r.get('id') == CATALOG for r in artifact['dependencies']), 'WIDGET_DEPENDENCY', '原型按 itemHash 绑定单项,不依赖整张清单,避免无关修改使全部原型失效。')
|
|
90
|
+
if kind == 'widget-prototype':
|
|
91
|
+
schema(data, ('widgetId', 'itemHash', 'rendererVersion', 'design', 'states'))
|
|
92
|
+
core.require(type(data['rendererVersion']) is int and data['rendererVersion'] in (1, 2, 3, 4), 'WIDGET_RENDERER_VERSION', '新原型使用模板版本 4,早期版本保留原样读取;视觉升级必须生成并确认新版本。')
|
|
93
|
+
visual = data['rendererVersion'] in (2, 3, 4)
|
|
94
|
+
design = data['design']
|
|
95
|
+
schema(design, ('accent', 'layout', 'titleSize', 'screenWidth', 'screenHeight') + (('icon', 'conversationTitle') if visual else ()))
|
|
96
|
+
layouts = ('list', 'cards', 'timeline', 'ledger', 'checklist') if visual else ('list', 'cards', 'timeline')
|
|
97
|
+
if data['rendererVersion'] == 4:
|
|
98
|
+
layouts += ('changes',)
|
|
99
|
+
core.require(isinstance(design['accent'], str) and re.fullmatch(r'#[0-9a-fA-F]{6}', design['accent']) and design['layout'] in layouts, 'WIDGET_STYLE', '样式使用六位十六进制强调色及支持的只读布局。')
|
|
100
|
+
if visual:
|
|
101
|
+
from widget_render_v2 import ICONS
|
|
102
|
+
strings(design, ('icon', 'conversationTitle'))
|
|
103
|
+
core.require(design['icon'] in ICONS, 'WIDGET_STYLE', '图标使用随包固定图标名称。')
|
|
104
|
+
core.require(type(design['titleSize']) is int and 16 <= design['titleSize'] <= 20 and type(design['screenWidth']) is int and 320 <= design['screenWidth'] <= 500 and type(design['screenHeight']) is int and 568 <= design['screenHeight'] <= 1100, 'WIDGET_SIZE', '标题建议 16 Medium,最大 20;画布用手机逻辑尺寸,正文固定 16 Regular。')
|
|
105
|
+
core.require(isinstance(data['states'], list) and [s.get('id') for s in data['states'] if isinstance(s, dict)] == list(STATES), 'WIDGET_STATES', '按 initial、partial、updated 提供首次生成、逐步补充、对话更新三态。')
|
|
106
|
+
for sample in data['states']:
|
|
107
|
+
schema(sample, ('id', 'label', 'userMessage', 'buddyMessage', 'summary', 'sections') + (('overview',) if visual else ()))
|
|
108
|
+
strings(sample, ('label', 'userMessage', 'buddyMessage', 'summary'))
|
|
109
|
+
if visual:
|
|
110
|
+
overview = sample['overview']
|
|
111
|
+
schema(overview, ('eyebrow', 'title', 'subtitle', 'metrics'), ('progress',))
|
|
112
|
+
strings(overview, ('eyebrow', 'title', 'subtitle'))
|
|
113
|
+
core.require(isinstance(overview['metrics'], list) and len(overview['metrics']) <= 3, 'WIDGET_CONTENT', '概览最多显示三个有依据的指标。')
|
|
114
|
+
for metric in overview['metrics']:
|
|
115
|
+
schema(metric, ('label', 'value'))
|
|
116
|
+
strings(metric, ('label', 'value'))
|
|
117
|
+
if 'progress' in overview:
|
|
118
|
+
p = overview['progress']
|
|
119
|
+
schema(p, ('value', 'max', 'label'))
|
|
120
|
+
strings(p, ('label',))
|
|
121
|
+
core.require(all(type(p[k]) in (int, float) and math.isfinite(p[k]) for k in ('value', 'max')) and p['max'] > 0 and 0 <= p['value'] <= p['max'], 'WIDGET_CONTENT', '进度只能展示有依据、有限且在范围内的数值。')
|
|
122
|
+
core.require(isinstance(sample['sections'], list) and sample['sections'], 'WIDGET_CONTENT', '每个状态需要实际内容或明确的缺项提示。')
|
|
123
|
+
section_ids = set()
|
|
124
|
+
for section in sample['sections']:
|
|
125
|
+
schema(section, ('id', 'title', 'rows'))
|
|
126
|
+
strings(section, ('id', 'title'))
|
|
127
|
+
core.require(section['id'] not in section_ids, 'WIDGET_CONTENT', '分组 ID 不能重复。')
|
|
128
|
+
section_ids.add(section['id'])
|
|
129
|
+
core.require(isinstance(section['rows'], list) and section['rows'], 'WIDGET_CONTENT', '分组需要阅读内容。')
|
|
130
|
+
for row in section['rows']:
|
|
131
|
+
optional = ('detail', 'caption', 'status', 'icon') if visual else ('detail',)
|
|
132
|
+
if data['rendererVersion'] == 4:
|
|
133
|
+
optional += ('change',)
|
|
134
|
+
schema(row, ('label', 'value'), optional)
|
|
135
|
+
strings(row, ('label', 'value'))
|
|
136
|
+
core.require('detail' not in row or core.text(row['detail']) and 'detail' in item['readInteractions'], 'WIDGET_READ_ONLY', '只读详情须在清单中约定。')
|
|
137
|
+
if visual:
|
|
138
|
+
for key in ('caption', 'icon'):
|
|
139
|
+
if key in row:
|
|
140
|
+
strings(row, (key,))
|
|
141
|
+
core.require('icon' not in row or row['icon'] in ICONS, 'WIDGET_STYLE', '图标使用随包固定图标名称。')
|
|
142
|
+
if 'status' in row:
|
|
143
|
+
schema(row['status'], ('label', 'tone'))
|
|
144
|
+
strings(row['status'], ('label', 'tone'))
|
|
145
|
+
core.require(row['status']['tone'] in ('neutral', 'pending', 'positive', 'changed'), 'WIDGET_STYLE', '状态色仅表达中性、待补、已确认或变化,不承载业务动作。')
|
|
146
|
+
if 'change' in row:
|
|
147
|
+
core.require(design['layout'] == 'changes' and row.get('status', {}).get('tone') in ('pending', 'changed'), 'WIDGET_CHANGE', '前后对比只用于 changes 布局,并明确为待确认建议或已生效变化。')
|
|
148
|
+
schema(row['change'], ('before', 'after'))
|
|
149
|
+
strings(row['change'], ('before', 'after'))
|
|
150
|
+
else:
|
|
151
|
+
schema(data, ('widgetId', 'itemHash', 'prototypeHash', 'reviews'))
|
|
152
|
+
prototype = state['artifacts'].get(object_id(key))
|
|
153
|
+
core.require(prototype and core.confirmed(state, prototype['id']) and not blockers(state, prototype) and data['prototypeHash'] == prototype['hash'], 'WIDGET_PROTOTYPE_UNCONFIRMED', '先确认当前原型,再提交该版本的设计验收。')
|
|
154
|
+
core.require({'type': 'artifact', 'id': prototype['id'], 'hash': prototype['hash']} in artifact['dependencies'], 'WIDGET_DEPENDENCY', '验收必须绑定原型确切版本。')
|
|
155
|
+
reviews = data['reviews']
|
|
156
|
+
schema(reviews, REVIEW_CHECKS)
|
|
157
|
+
strings(reviews, REVIEW_CHECKS)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def blockers(state, artifact):
|
|
161
|
+
result = {}
|
|
162
|
+
if artifact.get('unresolved'):
|
|
163
|
+
result['unresolved'] = artifact['unresolved']
|
|
164
|
+
if not books_ready(state):
|
|
165
|
+
result['booklets'] = '四册当前版本尚未全部确认'
|
|
166
|
+
for ref in artifact.get('dependencies', []):
|
|
167
|
+
if ref.get('type') == 'artifact':
|
|
168
|
+
current = state['artifacts'].get(ref['id'], {})
|
|
169
|
+
if current.get('hash') != ref['hash'] or not core.confirmed(state, ref['id']):
|
|
170
|
+
result.setdefault('dependencies', []).append(ref['id'])
|
|
171
|
+
if artifact['kind'] == 'widget-catalog':
|
|
172
|
+
for item in artifact['data']['widgets']:
|
|
173
|
+
for ref in item['bookletRefs']:
|
|
174
|
+
if state['artifacts'].get(ref['id'], {}).get('hash') != ref['hash'] or not core.confirmed(state, ref['id']):
|
|
175
|
+
result.setdefault('items', []).append(item['id'])
|
|
176
|
+
else:
|
|
177
|
+
item = next((i for i in items(state) if i['id'] == artifact['data']['widgetId']), None)
|
|
178
|
+
if not core.confirmed(state, CATALOG) or blockers(state, state['artifacts'][CATALOG]):
|
|
179
|
+
result['catalog'] = '当前清单待确认'
|
|
180
|
+
if not item or item_hash(item) != artifact['data']['itemHash']:
|
|
181
|
+
result['item'] = '清单项已变更或移除'
|
|
182
|
+
return result
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def valid_confirmation(state, key):
|
|
186
|
+
artifact = state['artifacts'].get(key)
|
|
187
|
+
return bool(artifact and core.confirmed(state, key) and not blockers(state, artifact))
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def phase(state):
|
|
191
|
+
if not enabled(state):
|
|
192
|
+
return 'legacy'
|
|
193
|
+
if not books_ready(state):
|
|
194
|
+
return 'booklets'
|
|
195
|
+
if not valid_confirmation(state, CATALOG):
|
|
196
|
+
return 'catalog'
|
|
197
|
+
if any(not valid_confirmation(state, object_id(i['id'])) for i in items(state)):
|
|
198
|
+
return 'prototype'
|
|
199
|
+
if any(not valid_confirmation(state, object_id(i['id'], 'acceptance')) for i in items(state)):
|
|
200
|
+
return 'acceptance'
|
|
201
|
+
return 'complete'
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def ready(state):
|
|
205
|
+
return not enabled(state) or phase(state) == 'complete'
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def projection(state, workspace=None):
|
|
209
|
+
from widget_render import asset_status
|
|
210
|
+
current = phase(state)
|
|
211
|
+
design_items = []
|
|
212
|
+
for item in items(state):
|
|
213
|
+
key = object_id(item['id'])
|
|
214
|
+
prototype = state['artifacts'].get(key)
|
|
215
|
+
acceptance = state['artifacts'].get(object_id(item['id'], 'acceptance'))
|
|
216
|
+
checks = asset_status(workspace, prototype) if workspace and prototype else {'pass': False, 'message': '原型尚未生成'}
|
|
217
|
+
design_items.append({**copy.deepcopy(item), 'itemHash': item_hash(item),
|
|
218
|
+
'prototype': copy.deepcopy(prototype), 'prototypeConfirmed': valid_confirmation(state, key),
|
|
219
|
+
'acceptance': copy.deepcopy(acceptance), 'accepted': valid_confirmation(state, object_id(item['id'], 'acceptance')),
|
|
220
|
+
'blockers': blockers(state, prototype) if prototype else {}, 'automaticCheck': checks})
|
|
221
|
+
next_step = {'legacy': '旧作品沿用原交付流程;开发者明确要求后可追加小挂件设计。', 'booklets': '先完成并确认四册,已有内容可随时阅读。',
|
|
222
|
+
'catalog': '根据四册提出小挂件清单,在主对话确认、补充或明确不需要。', 'prototype': '查看每项的对话卡片、展开页及三种数据状态,在主对话确认或调整。',
|
|
223
|
+
'acceptance': '检查阅读体验、只读边界和对话更新关系,在主对话确认当前版本的设计验收。', 'complete': '设计确认已完成,检查交付文件后继续开发。'}[current]
|
|
224
|
+
return {'enabled': enabled(state), 'phase': current, 'steps': [{'id': key, 'label': label} for key, label in PHASES],
|
|
225
|
+
'bookletRevision': booklet_revision(state), 'nextStep': next_step, 'catalog': copy.deepcopy(state['artifacts'].get(CATALOG)),
|
|
226
|
+
'catalogConfirmed': valid_confirmation(state, CATALOG), 'items': design_items,
|
|
227
|
+
'reviewChecks': list(REVIEW_CHECKS), 'spec': {'widthInset': 32, 'heightRatio': .65, 'titleRecommended': 16, 'titleMax': 20, 'bodySize': 16, 'readOnly': True}}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"repository": "https://github.com/my-life-buddies/Buddy-Creator-Skill",
|
|
3
3
|
"revision": "f642ddd59e1c30a5d4d3a2e9f6a6811f61ce1f2f",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.4.0",
|
|
5
5
|
"files": [
|
|
6
6
|
{
|
|
7
7
|
"path": "INSTALL.md",
|
|
8
8
|
"bytes": 2735,
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "440a8c800561492ae8780c825e74169d7f3f3664fe6d31359474debee75809e7"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"path": "PATCHES.md",
|
|
13
|
-
"bytes":
|
|
14
|
-
"sha256": "
|
|
13
|
+
"bytes": 5651,
|
|
14
|
+
"sha256": "38e4b493bfe8143f6258320033e1627ef007da15853dcffd6ed3873689e3e3f6"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"path": "SKILL.md",
|
|
18
|
-
"bytes":
|
|
19
|
-
"sha256": "
|
|
18
|
+
"bytes": 13255,
|
|
19
|
+
"sha256": "a47176823222dd9b3825ba65c774f009a0d245be008652b34e1456d2aba3d210"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"path": "THIRD_PARTY_NOTICES.md",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"path": "agents/openai.yaml",
|
|
28
|
-
"bytes":
|
|
29
|
-
"sha256": "
|
|
28
|
+
"bytes": 242,
|
|
29
|
+
"sha256": "173cb021d6b04d1c6dac5c5dbbb5ddcec95304384d22db0945e86bf78f1ac67a"
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"path": "assets/licenses/bail.txt",
|
|
@@ -565,8 +565,8 @@
|
|
|
565
565
|
},
|
|
566
566
|
{
|
|
567
567
|
"path": "assets/preview/index.html",
|
|
568
|
-
"bytes":
|
|
569
|
-
"sha256": "
|
|
568
|
+
"bytes": 727,
|
|
569
|
+
"sha256": "07749df50d266b57d1b59a983460aeb0371728a0eef337fb1caf4ec648880b58"
|
|
570
570
|
},
|
|
571
571
|
{
|
|
572
572
|
"path": "assets/preview/reader.css",
|
|
@@ -578,10 +578,60 @@
|
|
|
578
578
|
"bytes": 5702,
|
|
579
579
|
"sha256": "bc2c456e423c93610efbb0bf517efa21b0d5d50ef1a3dc52985fbdd11d481e75"
|
|
580
580
|
},
|
|
581
|
+
{
|
|
582
|
+
"path": "assets/preview/widgets.css",
|
|
583
|
+
"bytes": 4916,
|
|
584
|
+
"sha256": "72cb13b737b1ac35c35c36d9ee3f21a89969e61ffcf37dbbc29d4aeb2a9677ed"
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
"path": "assets/preview/widgets.js",
|
|
588
|
+
"bytes": 12626,
|
|
589
|
+
"sha256": "2c1cd87f096bdc9fbe635f4e5857ae298ea99323b2b24af1e81a230c0af25b2d"
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"path": "assets/widget-reference/conversation.png",
|
|
593
|
+
"bytes": 53607,
|
|
594
|
+
"sha256": "774d06c26fd4e969f391e76e02044cd2271cb2d8b1d20742ffd99140ef72c6cd"
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"path": "assets/widget-reference/expanded.png",
|
|
598
|
+
"bytes": 57120,
|
|
599
|
+
"sha256": "719c3e2f3dfdad3a322b0a3f069b42c913a46677970d255c8fefd2c36b2d58ed"
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
"path": "assets/widget-v2/app.js",
|
|
603
|
+
"bytes": 2836,
|
|
604
|
+
"sha256": "3cf78470cf997dccf3f106605912bf7690478e81a218d653718adfb7c3fb3d2a"
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
"path": "assets/widget-v2/style.css",
|
|
608
|
+
"bytes": 11417,
|
|
609
|
+
"sha256": "27f0776272b81d0b2ab84f31fe0f3a6cbeb1c3fa21e7f0ecfb8fcac83e6c2742"
|
|
610
|
+
},
|
|
611
|
+
{
|
|
612
|
+
"path": "assets/widget-v3/app.js",
|
|
613
|
+
"bytes": 3033,
|
|
614
|
+
"sha256": "93ae236d7eb46850772e5e73e6304b6725e77346627cd873575090c1faf9ab5e"
|
|
615
|
+
},
|
|
616
|
+
{
|
|
617
|
+
"path": "assets/widget-v3/style.css",
|
|
618
|
+
"bytes": 9645,
|
|
619
|
+
"sha256": "335dd053a595858b7ec9a649451fd4e9a3c638f20512f395536be9675a9b0c17"
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
"path": "assets/widget-v4/app.js",
|
|
623
|
+
"bytes": 3135,
|
|
624
|
+
"sha256": "809a09e229b31064035b42bcb626aecd0a002981ef2125c0cfb5daaa4a7d78d5"
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"path": "assets/widget-v4/style.css",
|
|
628
|
+
"bytes": 16200,
|
|
629
|
+
"sha256": "c6f3859dcdf6d7c5292207906d808a04e1617d65d9f24a343492c55765b46248"
|
|
630
|
+
},
|
|
581
631
|
{
|
|
582
632
|
"path": "references/artifact-schema.md",
|
|
583
|
-
"bytes":
|
|
584
|
-
"sha256": "
|
|
633
|
+
"bytes": 8126,
|
|
634
|
+
"sha256": "48bb389ad148789fb14464ebdb5cc2273af1cd5eb166538f60ee73acb3582aaa"
|
|
585
635
|
},
|
|
586
636
|
{
|
|
587
637
|
"path": "references/catalog.json",
|
|
@@ -600,8 +650,8 @@
|
|
|
600
650
|
},
|
|
601
651
|
{
|
|
602
652
|
"path": "references/host-guide.md",
|
|
603
|
-
"bytes":
|
|
604
|
-
"sha256": "
|
|
653
|
+
"bytes": 25816,
|
|
654
|
+
"sha256": "4b888162872e8820528951a67dcb016b032856fd4278dbbd2f44838c388f78a9"
|
|
605
655
|
},
|
|
606
656
|
{
|
|
607
657
|
"path": "references/interview.md",
|
|
@@ -630,13 +680,23 @@
|
|
|
630
680
|
},
|
|
631
681
|
{
|
|
632
682
|
"path": "references/recovery.md",
|
|
633
|
-
"bytes":
|
|
634
|
-
"sha256": "
|
|
683
|
+
"bytes": 6049,
|
|
684
|
+
"sha256": "4aa31bb0e6533f593f1740e7e2761934367357c189f3ed78fc6b0ae6a4764243"
|
|
635
685
|
},
|
|
636
686
|
{
|
|
637
687
|
"path": "references/service.md",
|
|
638
|
-
"bytes":
|
|
639
|
-
"sha256": "
|
|
688
|
+
"bytes": 10703,
|
|
689
|
+
"sha256": "081ac381d7fde5bc96f2f68fb8d87c249810d972b13981be0e1e667bcf7c956f"
|
|
690
|
+
},
|
|
691
|
+
{
|
|
692
|
+
"path": "references/widgets-protocol.md",
|
|
693
|
+
"bytes": 8656,
|
|
694
|
+
"sha256": "ee8393b6ac41c3828127494e748c91cfb292c9519d9a58ec7c9250b11a486839"
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
"path": "references/widgets.md",
|
|
698
|
+
"bytes": 11232,
|
|
699
|
+
"sha256": "49164858f873baecdfeedba78e88270a60a682aeb292abb9c6f30e2f3d4ff3e3"
|
|
640
700
|
},
|
|
641
701
|
{
|
|
642
702
|
"path": "scripts/buddy.py",
|
|
@@ -650,13 +710,13 @@
|
|
|
650
710
|
},
|
|
651
711
|
{
|
|
652
712
|
"path": "scripts/buddy_core.py",
|
|
653
|
-
"bytes":
|
|
654
|
-
"sha256": "
|
|
713
|
+
"bytes": 59692,
|
|
714
|
+
"sha256": "227a90ccf31cf69cee87656d393da9e7bd59f80c05bbfcfddd317ea75a4daf2c"
|
|
655
715
|
},
|
|
656
716
|
{
|
|
657
717
|
"path": "scripts/completion.py",
|
|
658
|
-
"bytes":
|
|
659
|
-
"sha256": "
|
|
718
|
+
"bytes": 18267,
|
|
719
|
+
"sha256": "3f3f2f8b3b9976cde7b184c238b0c65086c69df51f7eb5bed2a860014a69d598"
|
|
660
720
|
},
|
|
661
721
|
{
|
|
662
722
|
"path": "scripts/interview.py",
|
|
@@ -665,8 +725,8 @@
|
|
|
665
725
|
},
|
|
666
726
|
{
|
|
667
727
|
"path": "scripts/preview.py",
|
|
668
|
-
"bytes":
|
|
669
|
-
"sha256": "
|
|
728
|
+
"bytes": 32719,
|
|
729
|
+
"sha256": "6970dd21d5f567e685f51639e0749c0c1aa03d3b8a08ef2fb8ce328e12e06b35"
|
|
670
730
|
},
|
|
671
731
|
{
|
|
672
732
|
"path": "scripts/preview_panel.py",
|
|
@@ -678,10 +738,40 @@
|
|
|
678
738
|
"bytes": 13115,
|
|
679
739
|
"sha256": "e0f52e74d0a5928a461a0950ab20726a0674b25b1dbc500be23e2cc970130d3b"
|
|
680
740
|
},
|
|
741
|
+
{
|
|
742
|
+
"path": "scripts/widget_render.py",
|
|
743
|
+
"bytes": 3251,
|
|
744
|
+
"sha256": "cf588c2b877fbacec7093bb6a58ff856e980ffb56a3b458a2c5823531cc40862"
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
"path": "scripts/widget_render_v1.py",
|
|
748
|
+
"bytes": 15529,
|
|
749
|
+
"sha256": "c860efb8a88418b318b3e12777a6a2b101f8318db2864453ebd42a931e33b302"
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"path": "scripts/widget_render_v2.py",
|
|
753
|
+
"bytes": 9123,
|
|
754
|
+
"sha256": "ca15c3f07f7fe5a1628a8e70133786cffc5ae6e12851880adaaf156ee030a258"
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
"path": "scripts/widget_render_v3.py",
|
|
758
|
+
"bytes": 7042,
|
|
759
|
+
"sha256": "969876ffc25280520e315ee6c902b4a4f847fe07daa5fd3ddb1066474a31db23"
|
|
760
|
+
},
|
|
761
|
+
{
|
|
762
|
+
"path": "scripts/widget_render_v4.py",
|
|
763
|
+
"bytes": 9275,
|
|
764
|
+
"sha256": "127322e1a14dc8d5867834de69b674d32b7e2cc8d21f26ca3f521bb9d6fead45"
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
"path": "scripts/widgets.py",
|
|
768
|
+
"bytes": 16293,
|
|
769
|
+
"sha256": "46db6819e9aa41bbdb7f25f63b5f129f7d66bd1ebc7a67435679bfda99ee3cc1"
|
|
770
|
+
},
|
|
681
771
|
{
|
|
682
772
|
"path": "version.json",
|
|
683
773
|
"bytes": 178,
|
|
684
|
-
"sha256": "
|
|
774
|
+
"sha256": "fe1448604464e4e21743d934da2b440c0fa23781565cf15b92419c5bad4ddb8a"
|
|
685
775
|
}
|
|
686
776
|
],
|
|
687
777
|
"localPatches": [
|
|
@@ -690,7 +780,12 @@
|
|
|
690
780
|
"interaction-reliability",
|
|
691
781
|
"developer-platform-brand",
|
|
692
782
|
"booklet-reading-experience",
|
|
693
|
-
"preview-panel-reopen"
|
|
783
|
+
"preview-panel-reopen",
|
|
784
|
+
"small-widget-design",
|
|
785
|
+
"small-widget-visuals",
|
|
786
|
+
"small-widget-quiet-blue",
|
|
787
|
+
"small-widget-distinct-layouts",
|
|
788
|
+
"development-after-design-acceptance"
|
|
694
789
|
],
|
|
695
790
|
"upstreamVersion": "1.3.0"
|
|
696
791
|
}
|