@dp-bohrium/widget-cli 0.1.0 → 0.3.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.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DP Technology
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,305 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "host-runtime-config.schema.json",
4
+ "description": "Host 为一次 Widget 运行签发并下发给 agent-widget 的运行时配置,不直接发给 Widget。",
5
+ "title": "Widget Host Runtime Config",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schemaVersion",
10
+ "hostApiVersion",
11
+ "configId",
12
+ "runId",
13
+ "mode",
14
+ "issuedAt",
15
+ "expiresAt",
16
+ "recheckAt",
17
+ "securityProfile",
18
+ "resourceBudget",
19
+ "runtime",
20
+ "network",
21
+ "bindings"
22
+ ],
23
+ "properties": {
24
+ "schemaVersion": { "const": 1 },
25
+ "hostApiVersion": { "const": 1 },
26
+ "configId": { "$ref": "#/$defs/Identifier" },
27
+ "hostId": { "$ref": "#/$defs/Identifier" },
28
+ "runId": { "$ref": "#/$defs/Identifier" },
29
+ "mode": { "$ref": "#/$defs/Mode" },
30
+ "issuedAt": { "$ref": "#/$defs/Timestamp" },
31
+ "expiresAt": { "$ref": "#/$defs/Timestamp" },
32
+ "recheckAt": { "$ref": "#/$defs/Timestamp" },
33
+ "securityProfile": { "const": "runtime-security-profile-v1" },
34
+ "resourceBudget": {
35
+ "$ref": "widget-runtime-contracts.schema.json#/$defs/ResourceBudget"
36
+ },
37
+ "runtime": { "$ref": "#/$defs/RuntimeAuthority" },
38
+ "network": { "$ref": "#/$defs/NetworkAuthority" },
39
+ "bindings": {
40
+ "type": "array",
41
+ "items": {
42
+ "oneOf": [
43
+ { "$ref": "#/$defs/LoadableBinding" },
44
+ { "$ref": "#/$defs/FallbackBinding" }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "$defs": {
50
+ "LoadableBinding": {
51
+ "description": "可加载绑定:状态为 loadable,携带冻结版本、摘要、Manifest、启动地址与能力授权。",
52
+ "title": "LoadableBinding",
53
+ "type": "object",
54
+ "additionalProperties": false,
55
+ "required": [
56
+ "status",
57
+ "bindingId",
58
+ "widgetId",
59
+ "widgetVersionId",
60
+ "digest",
61
+ "manifest",
62
+ "launch",
63
+ "grantedCapabilities"
64
+ ],
65
+ "properties": {
66
+ "status": { "const": "loadable" },
67
+ "bindingId": { "$ref": "#/$defs/Identifier" },
68
+ "widgetId": { "$ref": "#/$defs/Identifier" },
69
+ "widgetVersionId": { "$ref": "#/$defs/Identifier" },
70
+ "digest": { "$ref": "#/$defs/Digest" },
71
+ "trustClass": {
72
+ "description": "控制面确认的信任等级;作者不能自行声明。",
73
+ "enum": ["external", "first-party"]
74
+ },
75
+ "runtimeProfile": {
76
+ "description": "控制面选择的部署配置;不授予 Cookie 或 Token 读取权限。",
77
+ "enum": ["public-isolated", "first-party-private"]
78
+ },
79
+ "manifest": {
80
+ "$ref": "widget-manifest.schema.json"
81
+ },
82
+ "launch": { "$ref": "#/$defs/Launch" },
83
+ "grantedCapabilities": { "$ref": "#/$defs/GrantedCapabilities" },
84
+ "serviceAccess": { "$ref": "#/$defs/WidgetServiceAccess" },
85
+ "serviceAuthorization": { "$ref": "#/$defs/HostServiceAuthorization" }
86
+ }
87
+ },
88
+ "HostServiceAuthorization": {
89
+ "title": "HostServiceAuthorization",
90
+ "description": "Host-only evidence bound to the exact reviewed Widget bundle and current user grant.",
91
+ "oneOf": [
92
+ { "$ref": "#/$defs/HostServiceAuthorizationRequired" },
93
+ { "$ref": "#/$defs/HostServiceAuthorizationGranted" }
94
+ ]
95
+ },
96
+ "HostServiceAuthorizationRequired": {
97
+ "description": "需用户授权的 Host 服务证据:状态为 authorization-required。",
98
+ "title": "HostServiceAuthorizationRequired",
99
+ "type": "object",
100
+ "additionalProperties": false,
101
+ "required": [
102
+ "kind",
103
+ "policy",
104
+ "status",
105
+ "hostId",
106
+ "widgetVersionId",
107
+ "bundleDigest",
108
+ "reviewRevision",
109
+ "reviewedPermissions",
110
+ "grantedPermissions",
111
+ "expiresAt"
112
+ ],
113
+ "properties": {
114
+ "kind": { "const": "host-service-authorization" },
115
+ "policy": { "const": "host-user-data-v1" },
116
+ "status": { "const": "authorization-required" },
117
+ "hostId": { "$ref": "#/$defs/Identifier" },
118
+ "widgetVersionId": { "$ref": "#/$defs/Identifier" },
119
+ "bundleDigest": { "$ref": "#/$defs/Digest" },
120
+ "reviewRevision": { "$ref": "#/$defs/Identifier" },
121
+ "reviewedPermissions": {
122
+ "$ref": "widget-manifest.schema.json#/$defs/HostUserPermissions"
123
+ },
124
+ "grantedPermissions": {
125
+ "type": "array",
126
+ "maxItems": 0
127
+ },
128
+ "expiresAt": { "$ref": "#/$defs/Timestamp" }
129
+ }
130
+ },
131
+ "HostServiceAuthorizationGranted": {
132
+ "description": "已授予的 Host 服务证据:状态为 granted。",
133
+ "title": "HostServiceAuthorizationGranted",
134
+ "type": "object",
135
+ "additionalProperties": false,
136
+ "required": [
137
+ "kind",
138
+ "policy",
139
+ "status",
140
+ "hostId",
141
+ "widgetVersionId",
142
+ "bundleDigest",
143
+ "reviewRevision",
144
+ "grantRevision",
145
+ "reviewedPermissions",
146
+ "grantedPermissions",
147
+ "expiresAt"
148
+ ],
149
+ "properties": {
150
+ "kind": { "const": "host-service-authorization" },
151
+ "policy": { "const": "host-user-data-v1" },
152
+ "status": { "const": "granted" },
153
+ "hostId": { "$ref": "#/$defs/Identifier" },
154
+ "widgetVersionId": { "$ref": "#/$defs/Identifier" },
155
+ "bundleDigest": { "$ref": "#/$defs/Digest" },
156
+ "reviewRevision": { "$ref": "#/$defs/Identifier" },
157
+ "grantRevision": { "$ref": "#/$defs/Identifier" },
158
+ "reviewedPermissions": {
159
+ "$ref": "widget-manifest.schema.json#/$defs/HostUserPermissions"
160
+ },
161
+ "grantedPermissions": {
162
+ "$ref": "widget-manifest.schema.json#/$defs/HostUserPermissions"
163
+ },
164
+ "expiresAt": { "$ref": "#/$defs/Timestamp" }
165
+ }
166
+ },
167
+ "FallbackBinding": {
168
+ "description": "降级绑定:状态为 fallback,不含 Bundle 地址、摘要、Manifest 或能力授权。",
169
+ "title": "FallbackBinding",
170
+ "type": "object",
171
+ "additionalProperties": false,
172
+ "required": [
173
+ "status",
174
+ "bindingId",
175
+ "widgetId",
176
+ "widgetVersionId",
177
+ "contribution",
178
+ "reason"
179
+ ],
180
+ "properties": {
181
+ "status": { "const": "fallback" },
182
+ "bindingId": { "$ref": "#/$defs/Identifier" },
183
+ "widgetId": { "$ref": "#/$defs/Identifier" },
184
+ "widgetVersionId": { "$ref": "#/$defs/Identifier" },
185
+ "contribution": {
186
+ "$ref": "widget-manifest.schema.json#/$defs/WidgetContributionConfig"
187
+ },
188
+ "reason": { "$ref": "#/$defs/FallbackReason" }
189
+ }
190
+ },
191
+ "RuntimeAuthority": {
192
+ "description": "运行域授权:origin 与 catalogRevision。",
193
+ "title": "RuntimeAuthority",
194
+ "type": "object",
195
+ "additionalProperties": false,
196
+ "required": ["origin", "catalogRevision"],
197
+ "properties": {
198
+ "origin": { "$ref": "#/$defs/RuntimeOrigin" },
199
+ "catalogRevision": {
200
+ "type": "string",
201
+ "minLength": 1,
202
+ "maxLength": 128,
203
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
204
+ },
205
+ "profile": {
206
+ "enum": ["public-isolated", "first-party-private"]
207
+ }
208
+ }
209
+ },
210
+ "NetworkAuthority": {
211
+ "description": "网络授权:mode、policyVersion 与限制。",
212
+ "title": "NetworkAuthority",
213
+ "type": "object",
214
+ "additionalProperties": false,
215
+ "required": ["mode", "policyVersion", "limits"],
216
+ "properties": {
217
+ "mode": { "enum": ["runtime-consent", "unavailable"] },
218
+ "policyVersion": {
219
+ "type": "string",
220
+ "minLength": 1,
221
+ "maxLength": 128,
222
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
223
+ },
224
+ "limits": {
225
+ "$ref": "widget-runtime-contracts.schema.json#/$defs/WidgetNetworkLimits"
226
+ }
227
+ }
228
+ },
229
+ "GrantedCapabilities": {
230
+ "description": "已授予能力列表。",
231
+ "title": "GrantedCapabilities",
232
+ "type": "array",
233
+ "items": {
234
+ "$ref": "widget-runtime-contracts.schema.json#/$defs/GrantedCapability"
235
+ }
236
+ },
237
+ "Launch": {
238
+ "description": "一次性启动地址与有效期。",
239
+ "title": "Launch",
240
+ "type": "object",
241
+ "additionalProperties": false,
242
+ "required": ["url", "expiresAt"],
243
+ "properties": {
244
+ "url": { "type": "string", "pattern": "^https?://" },
245
+ "expiresAt": { "$ref": "#/$defs/Timestamp" }
246
+ }
247
+ },
248
+ "RuntimeOrigin": {
249
+ "description": "隔离域运行源地址。",
250
+ "title": "RuntimeOrigin",
251
+ "type": "string",
252
+ "maxLength": 253,
253
+ "pattern": "^(?:https://[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?(?::[0-9]{1,5})?|http://(?:localhost|127\\.0\\.0\\.1|\\[::1\\])(?::[0-9]{1,5})?)$"
254
+ },
255
+ "FallbackReason": {
256
+ "description": "降级原因枚举。",
257
+ "title": "FallbackReason",
258
+ "enum": [
259
+ "not-authorized",
260
+ "not-approved",
261
+ "delisted-for-new-use",
262
+ "revoked",
263
+ "host-api-unsupported",
264
+ "preview-not-allowed"
265
+ ]
266
+ },
267
+ "Digest": {
268
+ "description": "内容摘要;形如 sha256:<hex>。",
269
+ "title": "Digest",
270
+ "type": "string",
271
+ "pattern": "^sha256:[0-9a-f]{64}$"
272
+ },
273
+ "Identifier": {
274
+ "description": "不透明标识符。",
275
+ "title": "Identifier",
276
+ "type": "string",
277
+ "minLength": 1
278
+ },
279
+ "Mode": {
280
+ "description": "运行模式:preview 或 published。",
281
+ "title": "Mode",
282
+ "enum": ["preview", "published"]
283
+ },
284
+ "Timestamp": {
285
+ "description": "UTC 时间戳:YYYY-MM-DD + T + 非空格字符,以 Z 结尾。",
286
+ "title": "Timestamp",
287
+ "type": "string",
288
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T[^ ]+Z$"
289
+ },
290
+ "WidgetServiceAccess": {
291
+ "title": "WidgetServiceAccess",
292
+ "description": "绑定当前不可变版本与摘要的审核投影;服务端每次调用仍须复核撤销和用户权限。",
293
+ "type": "object",
294
+ "additionalProperties": false,
295
+ "required": ["approvalId", "revision", "appId", "policyVersion", "expiresAt"],
296
+ "properties": {
297
+ "approvalId": { "$ref": "#/$defs/Identifier" },
298
+ "revision": { "$ref": "#/$defs/Identifier" },
299
+ "appId": { "$ref": "#/$defs/Identifier" },
300
+ "policyVersion": { "$ref": "#/$defs/Identifier" },
301
+ "expiresAt": { "$ref": "#/$defs/Timestamp" }
302
+ }
303
+ }
304
+ }
305
+ }
@@ -0,0 +1,361 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "widget-manifest.schema.json",
4
+ "description": "打包阶段生成的宿主 Widget 清单;name / description 仅用于首次展示默认值,widgetConfig 为冻结运行配置。",
5
+ "title": "Widget Manifest",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["name", "widgetConfig"],
9
+ "properties": {
10
+ "name": { "type": "string", "minLength": 1, "maxLength": 128 },
11
+ "description": { "type": "string", "maxLength": 2000 },
12
+ "widgetConfig": { "$ref": "#/$defs/WidgetConfig" }
13
+ },
14
+ "$defs": {
15
+ "WidgetConfig": {
16
+ "description": "打包阶段生成的冻结 Widget 运行配置;字段由 CLI 从作者清单写入,作者不得再直接覆盖。",
17
+ "title": "WidgetConfig",
18
+ "type": "object",
19
+ "additionalProperties": false,
20
+ "required": [
21
+ "schemaVersion",
22
+ "hostApiVersion",
23
+ "widgetSdkVersion",
24
+ "entry",
25
+ "contribution",
26
+ "samples"
27
+ ],
28
+ "properties": {
29
+ "schemaVersion": { "const": 1 },
30
+ "hostApiVersion": { "const": 1 },
31
+ "widgetSdkVersion": { "$ref": "#/$defs/WidgetSdkVersion" },
32
+ "entry": { "$ref": "#/$defs/EntryPath" },
33
+ "contribution": { "$ref": "#/$defs/WidgetContributionConfig" },
34
+ "activationEvents": {
35
+ "description": "声明 Host 何时允许激活该 Widget;激活条件不授予事件读取能力。",
36
+ "$ref": "#/$defs/ActivationEvents"
37
+ },
38
+ "requestedCapabilities": {
39
+ "$ref": "#/$defs/RequestedCapabilities"
40
+ },
41
+ "requestedPermissions": { "$ref": "#/$defs/HostUserPermissions" },
42
+ "runtime": { "$ref": "#/$defs/RuntimeOptions" },
43
+ "samples": { "$ref": "#/$defs/Samples" }
44
+ }
45
+ },
46
+ "HostUserPermission": {
47
+ "description": "Widget 可申请读取的 Host 用户数据权限名:个人资料或邮箱。",
48
+ "title": "HostUserPermission",
49
+ "enum": ["host.user.profile.read", "host.user.email.read"]
50
+ },
51
+ "HostUserPermissions": {
52
+ "description": "Widget 申请的 Host 用户数据权限列表。",
53
+ "title": "HostUserPermissions",
54
+ "type": "array",
55
+ "minItems": 1,
56
+ "maxItems": 2,
57
+ "uniqueItems": true,
58
+ "items": { "$ref": "#/$defs/HostUserPermission" }
59
+ },
60
+ "RequestedCapabilities": {
61
+ "description": "Widget 申请的能力集合;声明仅表示申请,最终由 Host 按次授权。",
62
+ "title": "RequestedCapabilities",
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "properties": {
66
+ "files": { "$ref": "#/$defs/FilesCapabilityRequest" },
67
+ "events": { "$ref": "#/$defs/EventsCapabilityRequest" },
68
+ "tasks": { "$ref": "#/$defs/TasksCapabilityRequest" },
69
+ "state": { "$ref": "#/$defs/StateCapabilityRequest" },
70
+ "actions": { "$ref": "#/$defs/ActionsCapabilityRequest" },
71
+ "network": { "$ref": "#/$defs/NetworkCapabilityRequest" },
72
+ "presentation": {
73
+ "$ref": "#/$defs/RequestedPresentationCapability"
74
+ },
75
+ "region": {
76
+ "$ref": "#/$defs/RequestedRegionCapability"
77
+ }
78
+ }
79
+ },
80
+ "FilesCapabilityRequest": {
81
+ "description": "文件能力的独立申请开关;保存已有文件必须单独申请 files.write 并获得 Host 授权,可写范围由 Host grant 决定。",
82
+ "title": "FilesCapabilityRequest",
83
+ "type": "object",
84
+ "additionalProperties": false,
85
+ "properties": {
86
+ "list": { "type": "boolean" },
87
+ "metadata": { "type": "boolean" },
88
+ "read": { "type": "boolean" },
89
+ "download": { "type": "boolean" },
90
+ "write": { "type": "boolean" }
91
+ }
92
+ },
93
+ "EventsCapabilityRequest": {
94
+ "description": "事件读取能力的申请;topics 声明要读取的事件主题。",
95
+ "title": "EventsCapabilityRequest",
96
+ "type": "object",
97
+ "additionalProperties": false,
98
+ "required": ["topics"],
99
+ "properties": {
100
+ "topics": {
101
+ "type": "array",
102
+ "minItems": 1,
103
+ "maxItems": 32,
104
+ "uniqueItems": true,
105
+ "items": {
106
+ "type": "string",
107
+ "minLength": 1,
108
+ "maxLength": 128,
109
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]*$"
110
+ }
111
+ }
112
+ }
113
+ },
114
+ "TasksCapabilityRequest": {
115
+ "description": "任务发现与观察能力的申请;list / watch 至少显式申请一项,已申请项固定为 true。",
116
+ "title": "TasksCapabilityRequest",
117
+ "type": "object",
118
+ "additionalProperties": false,
119
+ "minProperties": 1,
120
+ "properties": {
121
+ "list": { "const": true },
122
+ "watch": { "const": true }
123
+ }
124
+ },
125
+ "StateCapabilityRequest": {
126
+ "description": "受限 UI 状态读写能力的申请;read / write 分别声明。",
127
+ "title": "StateCapabilityRequest",
128
+ "type": "object",
129
+ "additionalProperties": false,
130
+ "required": ["read", "write"],
131
+ "properties": {
132
+ "read": { "type": "boolean" },
133
+ "write": { "type": "boolean" }
134
+ }
135
+ },
136
+ "ActionsCapabilityRequest": {
137
+ "description": "Host 自定义动作调用能力的申请;names 声明可调用的动作名。",
138
+ "title": "ActionsCapabilityRequest",
139
+ "type": "object",
140
+ "additionalProperties": false,
141
+ "required": ["names"],
142
+ "properties": {
143
+ "names": {
144
+ "type": "array",
145
+ "minItems": 1,
146
+ "maxItems": 32,
147
+ "uniqueItems": true,
148
+ "items": {
149
+ "type": "string",
150
+ "minLength": 1,
151
+ "maxLength": 128,
152
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]*$"
153
+ }
154
+ }
155
+ }
156
+ },
157
+ "NetworkCapabilityRequest": {
158
+ "description": "Host 托管网络能力的申请;fetch 固定为 true,目标域名由 Host 运行时按请求授权。",
159
+ "title": "NetworkCapabilityRequest",
160
+ "type": "object",
161
+ "additionalProperties": false,
162
+ "required": ["fetch"],
163
+ "properties": {
164
+ "fetch": { "const": true }
165
+ }
166
+ },
167
+ "RequestedPresentationCapability": {
168
+ "description": "呈现能力的申请;surfaces 声明期望的呈现表面。",
169
+ "title": "RequestedPresentationCapability",
170
+ "type": "object",
171
+ "additionalProperties": false,
172
+ "required": ["surfaces"],
173
+ "properties": {
174
+ "surfaces": {
175
+ "type": "array",
176
+ "minItems": 1,
177
+ "maxItems": 2,
178
+ "uniqueItems": true,
179
+ "items": { "enum": ["floating", "overlay"] }
180
+ }
181
+ }
182
+ },
183
+ "RequestedRegionCapability": {
184
+ "description": "会话右侧区域替换能力的申请;当前仅支持 session.rightRail + replace。",
185
+ "title": "RequestedRegionCapability",
186
+ "type": "object",
187
+ "additionalProperties": false,
188
+ "required": ["regions", "mode"],
189
+ "properties": {
190
+ "regions": {
191
+ "type": "array",
192
+ "minItems": 1,
193
+ "maxItems": 1,
194
+ "uniqueItems": true,
195
+ "items": { "const": "session.rightRail" }
196
+ },
197
+ "mode": { "const": "replace" }
198
+ }
199
+ },
200
+ "WidgetSdkVersion": {
201
+ "description": "构建该 Widget 时使用的 SDK 精确 SemVer 版本,不接受范围。",
202
+ "title": "WidgetSdkVersion",
203
+ "type": "string",
204
+ "pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$"
205
+ },
206
+ "EntryPath": {
207
+ "description": "包内 ESM 入口路径;仅允许包内相对 POSIX 路径。",
208
+ "title": "EntryPath",
209
+ "type": "string",
210
+ "minLength": 1,
211
+ "maxLength": 256,
212
+ "pattern": "^(?!/)(?!.*\\.\\.)(?!.*\\\\)(?!.*://).+\\.m?js$"
213
+ },
214
+ "RuntimeOptions": {
215
+ "description": "运行时申请;worker 与 webAssembly 均为可选布尔开关。",
216
+ "title": "RuntimeOptions",
217
+ "type": "object",
218
+ "additionalProperties": false,
219
+ "properties": {
220
+ "worker": { "type": "boolean" },
221
+ "webAssembly": { "type": "boolean" }
222
+ }
223
+ },
224
+ "ActivationEvents": {
225
+ "title": "ActivationEvents",
226
+ "description": "Host 可用于启动 Widget 的公开激活信号。多个值表示任一信号命中即可激活;它们不授予 events.read 权限。工具名形式为 tool-call-<阶段>:<工具名>。",
227
+ "type": "array",
228
+ "minItems": 1,
229
+ "maxItems": 16,
230
+ "uniqueItems": true,
231
+ "items": { "$ref": "#/$defs/ActivationEvent" }
232
+ },
233
+ "ActivationEvent": {
234
+ "description": "公开 Widget 激活信号。高层 WidgetContext.events 使用事件 type;低层 events.read 的 topic 不填写在这里。",
235
+ "oneOf": [
236
+ {
237
+ "type": "string",
238
+ "enum": [
239
+ "session.start",
240
+ "turn-start",
241
+ "turn-end",
242
+ "step-start",
243
+ "step-end",
244
+ "tool-call-generating",
245
+ "tool-call-waiting",
246
+ "tool-call-running",
247
+ "tool-call-result",
248
+ "tool-call-error",
249
+ "workspace-file-changed",
250
+ "workspace-tree-refresh",
251
+ "workspace-file-opened",
252
+ "ui-tool-opened",
253
+ "ui-panel-focused",
254
+ "host-surface-changed"
255
+ ]
256
+ },
257
+ {
258
+ "type": "string",
259
+ "minLength": 1,
260
+ "maxLength": 128,
261
+ "pattern": "^tool-call-(?:generating|waiting|running|result|error):[A-Za-z0-9_.:-]+$"
262
+ }
263
+ ]
264
+ },
265
+ "Samples": {
266
+ "description": "同版本 RenderRequest 测试样例;至少一个,request 为相对 .json 路径。",
267
+ "title": "Samples",
268
+ "type": "array",
269
+ "minItems": 1,
270
+ "uniqueItems": true,
271
+ "items": {
272
+ "type": "object",
273
+ "additionalProperties": false,
274
+ "required": ["id", "title", "request"],
275
+ "properties": {
276
+ "id": {
277
+ "type": "string",
278
+ "minLength": 1,
279
+ "maxLength": 64,
280
+ "pattern": "^[A-Za-z0-9_-]+$"
281
+ },
282
+ "title": { "type": "string", "minLength": 1, "maxLength": 128 },
283
+ "request": {
284
+ "type": "string",
285
+ "minLength": 1,
286
+ "maxLength": 256,
287
+ "pattern": "^(?!/)(?!.*\\.\\.)(?!.*\\\\)(?!.*://).+\\.json$"
288
+ }
289
+ }
290
+ }
291
+ },
292
+ "WidgetContributionConfig": {
293
+ "description": "作者声明的扩展点配置:file-preview 声明扩展名集合,panel 绑定既有 Panel。",
294
+ "title": "WidgetContributionConfig",
295
+ "oneOf": [
296
+ {
297
+ "type": "object",
298
+ "additionalProperties": false,
299
+ "required": ["type", "extensions"],
300
+ "properties": {
301
+ "type": { "const": "file-preview" },
302
+ "extensions": {
303
+ "type": "array",
304
+ "minItems": 1,
305
+ "uniqueItems": true,
306
+ "items": {
307
+ "type": "string",
308
+ "minLength": 1,
309
+ "maxLength": 32,
310
+ "pattern": "^[a-z0-9][a-z0-9.-]*$"
311
+ }
312
+ }
313
+ }
314
+ },
315
+ { "$ref": "#/$defs/PanelContributionConfig" }
316
+ ]
317
+ },
318
+ "PanelContributionConfig": {
319
+ "title": "PanelContributionConfig",
320
+ "description": "绑定 Agent Widget 既有 Panel 的配置。",
321
+ "type": "object",
322
+ "additionalProperties": false,
323
+ "required": ["type", "id"],
324
+ "properties": {
325
+ "type": {
326
+ "description": "Panel 贡献类型。",
327
+ "const": "panel"
328
+ },
329
+ "id": {
330
+ "description": "Host 注册和查找 Panel 时使用的稳定类型标识。",
331
+ "type": "string",
332
+ "minLength": 1,
333
+ "maxLength": 128,
334
+ "pattern": "^[A-Za-z0-9_.:-]+$"
335
+ },
336
+ "placement": {
337
+ "oneOf": [
338
+ {
339
+ "type": "object",
340
+ "additionalProperties": false,
341
+ "required": ["kind"],
342
+ "properties": {
343
+ "kind": { "const": "panel" }
344
+ }
345
+ },
346
+ {
347
+ "type": "object",
348
+ "additionalProperties": false,
349
+ "required": ["kind", "region", "mode"],
350
+ "properties": {
351
+ "kind": { "const": "region" },
352
+ "region": { "const": "session.rightRail" },
353
+ "mode": { "const": "replace" }
354
+ }
355
+ }
356
+ ]
357
+ }
358
+ }
359
+ }
360
+ }
361
+ }