@clowder-ai/plugin-contract 0.1.0-beta.2 → 0.1.0-beta.20

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 (183) hide show
  1. package/dist/codegen/generate-contract.d.ts +10 -0
  2. package/dist/codegen/generate-contract.d.ts.map +1 -1
  3. package/dist/codegen/generate-contract.js +201 -19
  4. package/dist/codegen/generate-contract.js.map +1 -1
  5. package/dist/conformance/fixtures.d.ts +11 -0
  6. package/dist/conformance/fixtures.d.ts.map +1 -0
  7. package/dist/conformance/fixtures.js +9 -0
  8. package/dist/conformance/fixtures.js.map +1 -0
  9. package/dist/conformance/index.d.ts +4 -0
  10. package/dist/conformance/index.d.ts.map +1 -1
  11. package/dist/conformance/index.js +3 -0
  12. package/dist/conformance/index.js.map +1 -1
  13. package/dist/conformance/messaging-behavior-fixture.d.ts +12 -0
  14. package/dist/conformance/messaging-behavior-fixture.d.ts.map +1 -0
  15. package/dist/conformance/messaging-behavior-fixture.js +30 -0
  16. package/dist/conformance/messaging-behavior-fixture.js.map +1 -0
  17. package/dist/conformance/runner.d.ts.map +1 -1
  18. package/dist/conformance/runner.js +22 -2
  19. package/dist/conformance/runner.js.map +1 -1
  20. package/dist/conformance/stdio-harness/child-process-harness.d.ts +65 -0
  21. package/dist/conformance/stdio-harness/child-process-harness.d.ts.map +1 -0
  22. package/dist/conformance/stdio-harness/child-process-harness.js +296 -0
  23. package/dist/conformance/stdio-harness/child-process-harness.js.map +1 -0
  24. package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts +26 -0
  25. package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts.map +1 -0
  26. package/dist/conformance/stdio-harness/dual-transport-oracle.js +32 -0
  27. package/dist/conformance/stdio-harness/dual-transport-oracle.js.map +1 -0
  28. package/dist/conformance/stdio-harness/harness-process-spawn.d.ts +27 -0
  29. package/dist/conformance/stdio-harness/harness-process-spawn.d.ts.map +1 -0
  30. package/dist/conformance/stdio-harness/harness-process-spawn.js +43 -0
  31. package/dist/conformance/stdio-harness/harness-process-spawn.js.map +1 -0
  32. package/dist/conformance/stdio-harness/index.d.ts +5 -0
  33. package/dist/conformance/stdio-harness/index.d.ts.map +1 -0
  34. package/dist/conformance/stdio-harness/index.js +4 -0
  35. package/dist/conformance/stdio-harness/index.js.map +1 -0
  36. package/dist/conformance/stdio-harness/ndjson-frame.d.ts +31 -0
  37. package/dist/conformance/stdio-harness/ndjson-frame.d.ts.map +1 -0
  38. package/dist/conformance/stdio-harness/ndjson-frame.js +125 -0
  39. package/dist/conformance/stdio-harness/ndjson-frame.js.map +1 -0
  40. package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts +15 -0
  41. package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts.map +1 -0
  42. package/dist/conformance/stdio-harness/node-process-tree-runtime.js +78 -0
  43. package/dist/conformance/stdio-harness/node-process-tree-runtime.js.map +1 -0
  44. package/dist/conformance/stdio-harness/process-tree-controller.d.ts +51 -0
  45. package/dist/conformance/stdio-harness/process-tree-controller.d.ts.map +1 -0
  46. package/dist/conformance/stdio-harness/process-tree-controller.js +162 -0
  47. package/dist/conformance/stdio-harness/process-tree-controller.js.map +1 -0
  48. package/dist/conformance/stdio-harness/windows-sentinel.d.ts +15 -0
  49. package/dist/conformance/stdio-harness/windows-sentinel.d.ts.map +1 -0
  50. package/dist/conformance/stdio-harness/windows-sentinel.js +160 -0
  51. package/dist/conformance/stdio-harness/windows-sentinel.js.map +1 -0
  52. package/dist/conformance/stdio-harness/wire-shape.d.ts +18 -0
  53. package/dist/conformance/stdio-harness/wire-shape.d.ts.map +1 -0
  54. package/dist/conformance/stdio-harness/wire-shape.js +2 -0
  55. package/dist/conformance/stdio-harness/wire-shape.js.map +1 -0
  56. package/dist/docx-materialization.d.ts +8 -0
  57. package/dist/docx-materialization.d.ts.map +1 -0
  58. package/dist/docx-materialization.js +19 -0
  59. package/dist/docx-materialization.js.map +1 -0
  60. package/dist/generated/contract.generated.d.ts +957 -12
  61. package/dist/generated/contract.generated.d.ts.map +1 -1
  62. package/dist/generated/contract.generated.js +9 -1
  63. package/dist/generated/contract.generated.js.map +1 -1
  64. package/dist/index.d.ts +3 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +5 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/validation/catalog.d.ts +21 -0
  69. package/dist/validation/catalog.d.ts.map +1 -0
  70. package/dist/validation/catalog.js +140 -0
  71. package/dist/validation/catalog.js.map +1 -0
  72. package/dist/validation/companion-bridge.d.ts +6 -0
  73. package/dist/validation/companion-bridge.d.ts.map +1 -0
  74. package/dist/validation/companion-bridge.js +57 -0
  75. package/dist/validation/companion-bridge.js.map +1 -0
  76. package/dist/validation/docx-materialization.d.ts +6 -0
  77. package/dist/validation/docx-materialization.d.ts.map +1 -0
  78. package/dist/validation/docx-materialization.js +36 -0
  79. package/dist/validation/docx-materialization.js.map +1 -0
  80. package/dist/validation/index.d.ts +6 -0
  81. package/dist/validation/index.d.ts.map +1 -1
  82. package/dist/validation/index.js +6 -0
  83. package/dist/validation/index.js.map +1 -1
  84. package/dist/validation/manifest.d.ts +23 -0
  85. package/dist/validation/manifest.d.ts.map +1 -0
  86. package/dist/validation/manifest.js +160 -0
  87. package/dist/validation/manifest.js.map +1 -0
  88. package/dist/validation/messaging-semantic.d.ts.map +1 -1
  89. package/dist/validation/messaging-semantic.js +49 -0
  90. package/dist/validation/messaging-semantic.js.map +1 -1
  91. package/dist/validation/messaging-wire.d.ts +38 -0
  92. package/dist/validation/messaging-wire.d.ts.map +1 -0
  93. package/dist/validation/messaging-wire.js +164 -0
  94. package/dist/validation/messaging-wire.js.map +1 -0
  95. package/dist/validation/signals.d.ts +26 -0
  96. package/dist/validation/signals.d.ts.map +1 -0
  97. package/dist/validation/signals.js +206 -0
  98. package/dist/validation/signals.js.map +1 -0
  99. package/dist/wire/constants.d.ts +36 -0
  100. package/dist/wire/constants.d.ts.map +1 -0
  101. package/dist/wire/constants.js +36 -0
  102. package/dist/wire/constants.js.map +1 -0
  103. package/dist/wire/disposition-fixtures.d.ts +118 -0
  104. package/dist/wire/disposition-fixtures.d.ts.map +1 -0
  105. package/dist/wire/disposition-fixtures.js +1881 -0
  106. package/dist/wire/disposition-fixtures.js.map +1 -0
  107. package/dist/wire/disposition.d.ts +102 -0
  108. package/dist/wire/disposition.d.ts.map +1 -0
  109. package/dist/wire/disposition.js +217 -0
  110. package/dist/wire/disposition.js.map +1 -0
  111. package/dist/wire/envelope.d.ts +253 -0
  112. package/dist/wire/envelope.d.ts.map +1 -0
  113. package/dist/wire/envelope.js +19 -0
  114. package/dist/wire/envelope.js.map +1 -0
  115. package/dist/wire/errors.d.ts +222 -0
  116. package/dist/wire/errors.d.ts.map +1 -0
  117. package/dist/wire/errors.js +153 -0
  118. package/dist/wire/errors.js.map +1 -0
  119. package/dist/wire/grants.d.ts +57 -0
  120. package/dist/wire/grants.d.ts.map +1 -0
  121. package/dist/wire/grants.js +59 -0
  122. package/dist/wire/grants.js.map +1 -0
  123. package/dist/wire/handshake-byte-bounds.d.ts +69 -0
  124. package/dist/wire/handshake-byte-bounds.d.ts.map +1 -0
  125. package/dist/wire/handshake-byte-bounds.js +173 -0
  126. package/dist/wire/handshake-byte-bounds.js.map +1 -0
  127. package/dist/wire/handshake.d.ts +146 -0
  128. package/dist/wire/handshake.d.ts.map +1 -0
  129. package/dist/wire/handshake.js +189 -0
  130. package/dist/wire/handshake.js.map +1 -0
  131. package/dist/wire/index.d.ts +37 -0
  132. package/dist/wire/index.d.ts.map +1 -0
  133. package/dist/wire/index.js +61 -0
  134. package/dist/wire/index.js.map +1 -0
  135. package/dist/wire/lifecycle-byte-bounds.d.ts +55 -0
  136. package/dist/wire/lifecycle-byte-bounds.d.ts.map +1 -0
  137. package/dist/wire/lifecycle-byte-bounds.js +209 -0
  138. package/dist/wire/lifecycle-byte-bounds.js.map +1 -0
  139. package/dist/wire/messaging-byte-bounds.d.ts +61 -0
  140. package/dist/wire/messaging-byte-bounds.d.ts.map +1 -0
  141. package/dist/wire/messaging-byte-bounds.js +459 -0
  142. package/dist/wire/messaging-byte-bounds.js.map +1 -0
  143. package/dist/wire/registry.d.ts +294 -0
  144. package/dist/wire/registry.d.ts.map +1 -0
  145. package/dist/wire/registry.js +256 -0
  146. package/dist/wire/registry.js.map +1 -0
  147. package/dist/wire/request-id.d.ts +34 -0
  148. package/dist/wire/request-id.d.ts.map +1 -0
  149. package/dist/wire/request-id.js +40 -0
  150. package/dist/wire/request-id.js.map +1 -0
  151. package/dist/wire/row-shapes.d.ts +217 -0
  152. package/dist/wire/row-shapes.d.ts.map +1 -0
  153. package/dist/wire/row-shapes.js +75 -0
  154. package/dist/wire/row-shapes.js.map +1 -0
  155. package/dist/wire/signal-byte-bounds.d.ts +97 -0
  156. package/dist/wire/signal-byte-bounds.d.ts.map +1 -0
  157. package/dist/wire/signal-byte-bounds.js +229 -0
  158. package/dist/wire/signal-byte-bounds.js.map +1 -0
  159. package/dist/wire/wire-uint53.d.ts +26 -0
  160. package/dist/wire/wire-uint53.d.ts.map +1 -0
  161. package/dist/wire/wire-uint53.js +32 -0
  162. package/dist/wire/wire-uint53.js.map +1 -0
  163. package/fixtures/behavior/messaging/adversarial-invariants.json +85 -0
  164. package/fixtures/manifest/invalid/duplicate-signal-type.json +33 -0
  165. package/fixtures/manifest/invalid/icon-package-escape.json +22 -0
  166. package/fixtures/manifest/valid/localized-product-metadata.json +27 -0
  167. package/fixtures/messaging/valid/subscription-delivery.json +1 -1
  168. package/fixtures/signals/invalid/destination-injection.json +15 -0
  169. package/fixtures/signals/invalid/dynamic-schema-url.json +10 -0
  170. package/fixtures/signals/invalid/forbidden-raw-privacy.json +10 -0
  171. package/fixtures/signals/invalid/non-utc-occurred-at.json +12 -0
  172. package/fixtures/signals/valid/feishu-meeting-artifact.json +18 -0
  173. package/fixtures/signals/valid/remote-service-declaration.json +10 -0
  174. package/package.json +19 -6
  175. package/src/schemas/behavior-fixture.schema.json +262 -2
  176. package/src/schemas/catalog.schema.json +91 -0
  177. package/src/schemas/companion-bridge.schema.json +937 -0
  178. package/src/schemas/docx-materialization.schema.json +302 -0
  179. package/src/schemas/manifest.schema.json +490 -4
  180. package/src/schemas/messaging.schema.json +209 -32
  181. package/src/schemas/physical-limb.schema.json +319 -0
  182. package/src/schemas/plugin-metadata.schema.json +62 -0
  183. package/src/schemas/signal.schema.json +129 -0
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://clowder-ai.dev/schemas/manifest/v0.1",
4
4
  "title": "Clowder AI Plugin Manifest (v0.1)",
5
- "description": "Machine-readable truth source for plugin manifest (§3.4/§3.5). v0.1 covers core manifest + features + data classification. Signals/events (C-2) and schedule/state (C-3) are schema deltas in future contract versions.",
5
+ "description": "Machine-readable truth source for the static plugin.yaml access protocol (§3.4/§3.5). beta.16 adds the Host-governed desktop-window contribution. Window, media and conversation authorities remain separate Host runtime decisions; the signed broker wire is unchanged.",
6
6
  "x-clowder-capability-layers": {
7
7
  "L0": ["plugin.config.read", "plugin.state.get", "plugin.state.set"],
8
8
  "L1": ["messaging.send", "schedule.register", "events.publish", "messaging.appendElements"],
@@ -100,6 +100,476 @@
100
100
  "additionalProperties": false
101
101
  },
102
102
 
103
+ "ContributionReference": {
104
+ "type": "object",
105
+ "properties": {
106
+ "type": {
107
+ "type": "string",
108
+ "enum": ["identity", "schedule", "tool", "mcp", "skill", "limb", "webhook", "message-subscription", "service", "connector", "ui", "content-editor-provider", "desktop-window"]
109
+ },
110
+ "id": { "type": "string", "minLength": 1 }
111
+ },
112
+ "required": ["type", "id"],
113
+ "additionalProperties": false
114
+ },
115
+
116
+ "PackageRelativePath": {
117
+ "type": "string",
118
+ "minLength": 1,
119
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*(/[A-Za-z0-9][A-Za-z0-9._-]*)*$"
120
+ },
121
+
122
+ "ConfigurationOption": {
123
+ "type": "object",
124
+ "properties": {
125
+ "value": { "type": "string", "minLength": 1 },
126
+ "label": { "type": "string", "minLength": 1 },
127
+ "hint": { "type": "string" },
128
+ "docsUrl": { "type": "string", "format": "uri" }
129
+ },
130
+ "required": ["value", "label"],
131
+ "additionalProperties": false
132
+ },
133
+
134
+ "ConfigurationField": {
135
+ "type": "object",
136
+ "properties": {
137
+ "key": { "type": "string", "minLength": 1, "pattern": "^[A-Za-z][A-Za-z0-9._-]*$" },
138
+ "label": { "type": "string", "minLength": 1 },
139
+ "description": { "type": "string" },
140
+ "kind": { "type": "string", "enum": ["string", "secret", "select", "boolean", "number", "url"] },
141
+ "required": { "type": "boolean" },
142
+ "default": { "type": ["string", "number", "boolean"] },
143
+ "options": {
144
+ "type": "array",
145
+ "items": { "$ref": "#/$defs/ConfigurationOption" },
146
+ "minItems": 1
147
+ }
148
+ },
149
+ "required": ["key", "label", "kind", "required"],
150
+ "additionalProperties": false,
151
+ "allOf": [
152
+ {
153
+ "if": { "properties": { "kind": { "const": "select" } }, "required": ["kind"] },
154
+ "then": { "required": ["options"] },
155
+ "else": { "properties": { "options": false } }
156
+ },
157
+ {
158
+ "if": { "properties": { "kind": { "const": "secret" } }, "required": ["kind"] },
159
+ "then": { "properties": { "default": false } }
160
+ },
161
+ {
162
+ "if": { "properties": { "kind": { "const": "boolean" } }, "required": ["kind"] },
163
+ "then": { "properties": { "default": { "type": "boolean" } } }
164
+ },
165
+ {
166
+ "if": { "properties": { "kind": { "const": "number" } }, "required": ["kind"] },
167
+ "then": { "properties": { "default": { "type": "number" } } }
168
+ },
169
+ {
170
+ "if": { "properties": { "kind": { "enum": ["string", "select"] } }, "required": ["kind"] },
171
+ "then": { "properties": { "default": { "type": "string" } } }
172
+ },
173
+ {
174
+ "if": { "properties": { "kind": { "const": "url" } }, "required": ["kind"] },
175
+ "then": { "properties": { "default": { "type": "string", "format": "uri" } } }
176
+ }
177
+ ]
178
+ },
179
+
180
+ "EnvironmentBinding": {
181
+ "oneOf": [
182
+ {
183
+ "type": "object",
184
+ "properties": {
185
+ "source": { "const": "config" },
186
+ "key": { "type": "string", "minLength": 1 }
187
+ },
188
+ "required": ["source", "key"],
189
+ "additionalProperties": false
190
+ },
191
+ {
192
+ "type": "object",
193
+ "properties": {
194
+ "source": { "const": "secret" },
195
+ "key": { "type": "string", "minLength": 1 }
196
+ },
197
+ "required": ["source", "key"],
198
+ "additionalProperties": false
199
+ }
200
+ ]
201
+ },
202
+
203
+ "ContributionRuntime": {
204
+ "type": "object",
205
+ "properties": {
206
+ "transport": { "type": "string", "enum": ["stdio", "ipc"] },
207
+ "entrypoint": { "$ref": "#/$defs/PackageRelativePath" },
208
+ "args": { "type": "array", "items": { "type": "string" } }
209
+ },
210
+ "required": ["transport", "entrypoint"],
211
+ "additionalProperties": false
212
+ },
213
+
214
+ "CallbackAction": {
215
+ "type": "object",
216
+ "properties": {
217
+ "method": { "type": "string", "minLength": 1 },
218
+ "params": { "type": "object", "additionalProperties": true }
219
+ },
220
+ "required": ["method"],
221
+ "additionalProperties": false
222
+ },
223
+
224
+ "IdentityContribution": {
225
+ "type": "object",
226
+ "properties": {
227
+ "type": { "const": "identity" },
228
+ "id": { "type": "string", "minLength": 1 },
229
+ "displayName": { "type": "string", "minLength": 1 },
230
+ "icon": { "type": "string" },
231
+ "color": { "type": "string" }
232
+ },
233
+ "required": ["type", "id", "displayName"],
234
+ "additionalProperties": false
235
+ },
236
+
237
+ "ScheduleContribution": {
238
+ "type": "object",
239
+ "properties": {
240
+ "type": { "const": "schedule" },
241
+ "id": { "type": "string", "minLength": 1 },
242
+ "schedule": {
243
+ "oneOf": [
244
+ {
245
+ "type": "object",
246
+ "properties": { "kind": { "const": "interval" }, "everyMs": { "type": "integer", "minimum": 1000 } },
247
+ "required": ["kind", "everyMs"],
248
+ "additionalProperties": false
249
+ },
250
+ {
251
+ "type": "object",
252
+ "properties": { "kind": { "const": "cron" }, "expression": { "type": "string", "minLength": 1 } },
253
+ "required": ["kind", "expression"],
254
+ "additionalProperties": false
255
+ }
256
+ ]
257
+ },
258
+ "action": { "$ref": "#/$defs/CallbackAction" },
259
+ "policy": {
260
+ "type": "object",
261
+ "properties": {
262
+ "overlap": { "const": "skip" },
263
+ "timeoutMs": { "type": "integer", "minimum": 1000, "maximum": 86400000 }
264
+ },
265
+ "required": ["overlap", "timeoutMs"],
266
+ "additionalProperties": false
267
+ }
268
+ },
269
+ "required": ["type", "id", "schedule", "action", "policy"],
270
+ "additionalProperties": false
271
+ },
272
+
273
+ "DirectToolContribution": {
274
+ "type": "object",
275
+ "properties": {
276
+ "type": { "const": "tool" },
277
+ "id": { "type": "string", "minLength": 1 },
278
+ "name": { "type": "string", "minLength": 1 },
279
+ "description": { "type": "string" },
280
+ "inputSchema": { "type": "object", "additionalProperties": true },
281
+ "action": { "$ref": "#/$defs/CallbackAction" }
282
+ },
283
+ "required": ["type", "id", "name", "inputSchema", "action"],
284
+ "additionalProperties": false
285
+ },
286
+
287
+ "McpContribution": {
288
+ "type": "object",
289
+ "properties": {
290
+ "type": { "const": "mcp" },
291
+ "id": { "type": "string", "minLength": 1 },
292
+ "runtime": { "$ref": "#/$defs/ContributionRuntime" },
293
+ "environment": {
294
+ "type": "object",
295
+ "additionalProperties": { "$ref": "#/$defs/EnvironmentBinding" }
296
+ }
297
+ },
298
+ "required": ["type", "id", "runtime"],
299
+ "additionalProperties": false
300
+ },
301
+
302
+ "SkillContribution": {
303
+ "type": "object",
304
+ "properties": {
305
+ "type": { "const": "skill" },
306
+ "id": { "type": "string", "minLength": 1 },
307
+ "path": { "$ref": "#/$defs/PackageRelativePath" }
308
+ },
309
+ "required": ["type", "id", "path"],
310
+ "additionalProperties": false
311
+ },
312
+
313
+ "LimbContribution": {
314
+ "type": "object",
315
+ "properties": {
316
+ "type": { "const": "limb" },
317
+ "id": { "type": "string", "minLength": 1 },
318
+ "manifestPath": { "$ref": "#/$defs/PackageRelativePath" }
319
+ },
320
+ "required": ["type", "id", "manifestPath"],
321
+ "additionalProperties": false
322
+ },
323
+
324
+ "WebhookContribution": {
325
+ "type": "object",
326
+ "properties": {
327
+ "type": { "const": "webhook" },
328
+ "id": { "type": "string", "minLength": 1 },
329
+ "path": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*(/[A-Za-z0-9][A-Za-z0-9_-]*)*$" },
330
+ "methods": { "type": "array", "items": { "type": "string", "enum": ["GET", "POST", "PUT", "DELETE"] }, "minItems": 1, "uniqueItems": true },
331
+ "action": { "$ref": "#/$defs/CallbackAction" },
332
+ "verificationSecretRef": { "type": "string", "minLength": 1 }
333
+ },
334
+ "required": ["type", "id", "path", "methods", "action"],
335
+ "additionalProperties": false
336
+ },
337
+
338
+ "MessageSubscriptionContribution": {
339
+ "type": "object",
340
+ "properties": {
341
+ "type": { "const": "message-subscription" },
342
+ "id": { "type": "string", "minLength": 1 },
343
+ "binding": { "type": "string", "minLength": 1 },
344
+ "filter": { "type": "object", "additionalProperties": true },
345
+ "action": { "$ref": "#/$defs/CallbackAction" }
346
+ },
347
+ "required": ["type", "id", "binding", "action"],
348
+ "additionalProperties": false
349
+ },
350
+
351
+ "ServiceContribution": {
352
+ "type": "object",
353
+ "properties": {
354
+ "type": { "const": "service" },
355
+ "id": { "type": "string", "minLength": 1 },
356
+ "runtime": { "$ref": "#/$defs/ContributionRuntime" },
357
+ "healthMethod": { "type": "string", "minLength": 1 },
358
+ "environment": {
359
+ "type": "object",
360
+ "additionalProperties": { "$ref": "#/$defs/EnvironmentBinding" }
361
+ }
362
+ },
363
+ "required": ["type", "id", "runtime", "healthMethod"],
364
+ "additionalProperties": false
365
+ },
366
+
367
+ "ConnectorContribution": {
368
+ "type": "object",
369
+ "properties": {
370
+ "type": { "const": "connector" },
371
+ "id": { "type": "string", "minLength": 1 },
372
+ "identityRef": { "type": "string", "minLength": 1 },
373
+ "inboundMethod": { "type": "string", "minLength": 1 },
374
+ "outboundMethod": { "type": "string", "minLength": 1 }
375
+ },
376
+ "required": ["type", "id", "identityRef", "inboundMethod", "outboundMethod"],
377
+ "additionalProperties": false
378
+ },
379
+
380
+ "UiWhenClause": {
381
+ "type": "object",
382
+ "properties": {
383
+ "featureEnabled": { "type": "boolean" },
384
+ "requiresCapabilities": {
385
+ "type": "array",
386
+ "items": { "$ref": "#/$defs/Capability" },
387
+ "minItems": 1,
388
+ "uniqueItems": true
389
+ }
390
+ },
391
+ "minProperties": 1,
392
+ "additionalProperties": false
393
+ },
394
+
395
+ "UiAnchor": {
396
+ "type": "object",
397
+ "properties": {
398
+ "position": { "type": "string", "enum": ["before", "after"] },
399
+ "target": { "type": "string", "minLength": 1 }
400
+ },
401
+ "required": ["position", "target"],
402
+ "additionalProperties": false
403
+ },
404
+
405
+ "UiCommandContribution": {
406
+ "type": "object",
407
+ "properties": {
408
+ "type": { "const": "ui" },
409
+ "id": { "type": "string", "minLength": 1 },
410
+ "kind": { "const": "command" },
411
+ "label": { "type": "string", "minLength": 1 },
412
+ "action": { "$ref": "#/$defs/CallbackAction" },
413
+ "when": { "$ref": "#/$defs/UiWhenClause" }
414
+ },
415
+ "required": ["type", "id", "kind", "label", "action"],
416
+ "additionalProperties": false
417
+ },
418
+
419
+ "UiSlotItemContribution": {
420
+ "type": "object",
421
+ "properties": {
422
+ "type": { "const": "ui" },
423
+ "id": { "type": "string", "minLength": 1 },
424
+ "kind": { "const": "slot-item" },
425
+ "label": { "type": "string", "minLength": 1 },
426
+ "command": { "type": "string", "minLength": 1 },
427
+ "group": { "type": "string", "minLength": 1 },
428
+ "anchor": { "$ref": "#/$defs/UiAnchor" },
429
+ "order": { "type": "integer", "minimum": -10000, "maximum": 10000 },
430
+ "when": { "$ref": "#/$defs/UiWhenClause" }
431
+ },
432
+ "required": ["type", "id", "kind", "label", "command", "group"],
433
+ "additionalProperties": false
434
+ },
435
+
436
+ "UiMessageElementContribution": {
437
+ "type": "object",
438
+ "properties": {
439
+ "type": { "const": "ui" },
440
+ "id": { "type": "string", "minLength": 1 },
441
+ "kind": { "const": "message-element" },
442
+ "label": { "type": "string", "minLength": 1 },
443
+ "elementKind": { "type": "string", "minLength": 1 },
444
+ "renderer": { "type": "string", "minLength": 1 },
445
+ "when": { "$ref": "#/$defs/UiWhenClause" }
446
+ },
447
+ "required": ["type", "id", "kind", "label", "elementKind", "renderer"],
448
+ "additionalProperties": false
449
+ },
450
+
451
+ "UiContribution": {
452
+ "oneOf": [
453
+ { "$ref": "#/$defs/UiCommandContribution" },
454
+ { "$ref": "#/$defs/UiSlotItemContribution" },
455
+ { "$ref": "#/$defs/UiMessageElementContribution" }
456
+ ]
457
+ },
458
+
459
+ "SemanticMaterializerDeclaration": {
460
+ "type": "object",
461
+ "description": "Optional independent DOCX computation. The Host admits one closed worker bundle under the installed package and live feature authority, in a fresh sandboxed private browser process with no ambient effects. This is not permission to execute package code in the Host or renderer.",
462
+ "properties": {
463
+ "executionClass": { "const": "dedicated-browser-worker" },
464
+ "entrypoint": { "$ref": "#/$defs/PackageRelativePath", "pattern": "\\.js$" },
465
+ "integrity": { "type": "string", "pattern": "^sha256-[A-Za-z0-9+/]{43}=$" },
466
+ "protocolVersion": { "const": "1.0.0" }
467
+ },
468
+ "required": ["executionClass", "entrypoint", "integrity", "protocolVersion"],
469
+ "additionalProperties": false
470
+ },
471
+
472
+ "DesktopWindowContribution": {
473
+ "type": "object",
474
+ "description": "Host-created desktop surface under its owning feature's windows.create grant. surface.integrity verifies only the entry HTML bytes. The Host must separately verify the complete installed package and serve a verified snapshot of all referenced assets. This declares no executable, Host origin, identity, or capture permission. The Host owns window execution, media/session admission and the isolated receive-only provider channel.",
475
+ "properties": {
476
+ "type": { "const": "desktop-window" },
477
+ "id": { "type": "string", "minLength": 1, "maxLength": 128 },
478
+ "role": { "const": "companion" },
479
+ "surface": {
480
+ "type": "object",
481
+ "properties": {
482
+ "entrypoint": { "$ref": "#/$defs/PackageRelativePath", "pattern": "\\.html$" },
483
+ "integrity": { "type": "string", "pattern": "^sha256-[A-Za-z0-9+/]{43}=$" }
484
+ },
485
+ "required": ["entrypoint", "integrity"],
486
+ "additionalProperties": false
487
+ },
488
+ "bridgeVersion": { "enum": ["1.0.0", "1.1.0", "1.2.0", "1.3.0"] },
489
+ "presentation": {
490
+ "type": "object",
491
+ "properties": {
492
+ "width": { "type": "integer", "minimum": 160, "maximum": 600 },
493
+ "height": { "type": "integer", "minimum": 160, "maximum": 1000 },
494
+ "transparent": { "const": true },
495
+ "frame": { "const": false },
496
+ "alwaysOnTop": { "type": "boolean" },
497
+ "skipTaskbar": { "type": "boolean" }
498
+ },
499
+ "required": ["width", "height", "transparent", "frame", "alwaysOnTop", "skipTaskbar"],
500
+ "additionalProperties": false
501
+ }
502
+ },
503
+ "required": ["type", "id", "role", "surface", "bridgeVersion", "presentation"],
504
+ "additionalProperties": false
505
+ },
506
+
507
+ "ContentEditorProviderContribution": {
508
+ "type": "object",
509
+ "properties": {
510
+ "type": { "const": "content-editor-provider" },
511
+ "id": { "type": "string", "minLength": 1 },
512
+ "mediaTypes": {
513
+ "type": "array",
514
+ "items": {
515
+ "const": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
516
+ },
517
+ "minItems": 1,
518
+ "maxItems": 1,
519
+ "uniqueItems": true
520
+ },
521
+ "surface": {
522
+ "type": "object",
523
+ "properties": {
524
+ "entrypoint": { "$ref": "#/$defs/PackageRelativePath" },
525
+ "integrity": {
526
+ "type": "string",
527
+ "pattern": "^sha256-[A-Za-z0-9+/]{43}=$"
528
+ },
529
+ "sandbox": {
530
+ "const": "dedicated-origin-iframe",
531
+ "description": "Host serves the renderer from an origin that has no Host cookies or Host APIs, applies sandbox=allow-scripts allow-same-origin, and sends a frame-ancestors response header restricted to the exact Host origin."
532
+ },
533
+ "navigationPolicy": {
534
+ "const": "navigation-api-deny",
535
+ "description": "The renderer must install a fail-closed Navigation API listener before upstream code and prevent every self-navigation before its request starts."
536
+ }
537
+ },
538
+ "required": ["entrypoint", "integrity", "sandbox", "navigationPolicy"],
539
+ "additionalProperties": false
540
+ },
541
+ "bridgeVersion": { "const": "1.0.0" },
542
+ "semanticMaterializer": { "$ref": "#/$defs/SemanticMaterializerDeclaration" },
543
+ "operations": {
544
+ "type": "array",
545
+ "items": { "type": "string", "enum": ["load", "settle", "comment", "tracked-change"] },
546
+ "minItems": 4,
547
+ "maxItems": 4,
548
+ "uniqueItems": true
549
+ }
550
+ },
551
+ "required": ["type", "id", "mediaTypes", "surface", "bridgeVersion", "operations"],
552
+ "additionalProperties": false
553
+ },
554
+
555
+ "StaticContribution": {
556
+ "oneOf": [
557
+ { "$ref": "#/$defs/IdentityContribution" },
558
+ { "$ref": "#/$defs/ScheduleContribution" },
559
+ { "$ref": "#/$defs/DirectToolContribution" },
560
+ { "$ref": "#/$defs/McpContribution" },
561
+ { "$ref": "#/$defs/SkillContribution" },
562
+ { "$ref": "#/$defs/LimbContribution" },
563
+ { "$ref": "#/$defs/WebhookContribution" },
564
+ { "$ref": "#/$defs/MessageSubscriptionContribution" },
565
+ { "$ref": "#/$defs/ServiceContribution" },
566
+ { "$ref": "#/$defs/ConnectorContribution" },
567
+ { "$ref": "#/$defs/UiContribution" },
568
+ { "$ref": "#/$defs/ContentEditorProviderContribution" },
569
+ { "$ref": "#/$defs/DesktopWindowContribution" }
570
+ ]
571
+ },
572
+
103
573
  "PluginFeature": {
104
574
  "type": "object",
105
575
  "properties": {
@@ -109,6 +579,10 @@
109
579
  "type": "array",
110
580
  "items": { "$ref": "#/$defs/ResourceReference" }
111
581
  },
582
+ "contributions": {
583
+ "type": "array",
584
+ "items": { "$ref": "#/$defs/ContributionReference" }
585
+ },
112
586
  "capabilities": {
113
587
  "type": "array",
114
588
  "items": { "$ref": "#/$defs/Capability" },
@@ -133,7 +607,7 @@
133
607
  "type": "object",
134
608
  "properties": {
135
609
  "transport": { "$ref": "#/$defs/ExternalRuntimeTransport" },
136
- "entrypoint": { "type": "string", "minLength": 1 }
610
+ "entrypoint": { "$ref": "#/$defs/PackageRelativePath" }
137
611
  },
138
612
  "required": ["transport", "entrypoint"],
139
613
  "additionalProperties": false
@@ -169,7 +643,16 @@
169
643
  "description": "Must be an exact published semver version — no ranges, wildcards, or operator prefixes (five-step freeze: pin exact version). §9: numeric prerelease identifiers MUST NOT have leading zeroes."
170
644
  },
171
645
  "name": { "type": "string", "minLength": 1 },
172
- "description": { "type": "string" },
646
+ "description": { "$ref": "https://clowder-ai.dev/schemas/plugin-metadata/v1#/$defs/LocalizedDescription" },
647
+ "icon": { "$ref": "https://clowder-ai.dev/schemas/plugin-metadata/v1#/$defs/PluginIcon" },
648
+ "configuration": {
649
+ "type": "array",
650
+ "items": { "$ref": "#/$defs/ConfigurationField" }
651
+ },
652
+ "contributions": {
653
+ "type": "array",
654
+ "items": { "$ref": "#/$defs/StaticContribution" }
655
+ },
173
656
  "features": {
174
657
  "type": "array",
175
658
  "items": { "$ref": "#/$defs/PluginFeature" },
@@ -179,7 +662,10 @@
179
662
  "type": "array",
180
663
  "items": { "$ref": "#/$defs/DataDeclaration" }
181
664
  },
182
- "runtime": { "$ref": "#/$defs/RuntimeDeclaration" }
665
+ "runtime": { "$ref": "#/$defs/RuntimeDeclaration" },
666
+ "signals": {
667
+ "$ref": "https://clowder-ai.dev/schemas/signals/v0.2#/$defs/SignalContribution"
668
+ }
183
669
  },
184
670
  "required": ["pluginId", "version", "contractVersion", "name", "features", "runtime"],
185
671
  "additionalProperties": false