@clowder-ai/plugin-contract 0.1.0-beta.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.
Files changed (74) hide show
  1. package/dist/codegen/generate-contract.d.ts +24 -0
  2. package/dist/codegen/generate-contract.d.ts.map +1 -0
  3. package/dist/codegen/generate-contract.js +328 -0
  4. package/dist/codegen/generate-contract.js.map +1 -0
  5. package/dist/conformance/index.d.ts +13 -0
  6. package/dist/conformance/index.d.ts.map +1 -0
  7. package/dist/conformance/index.js +13 -0
  8. package/dist/conformance/index.js.map +1 -0
  9. package/dist/conformance/runner.d.ts +18 -0
  10. package/dist/conformance/runner.d.ts.map +1 -0
  11. package/dist/conformance/runner.js +252 -0
  12. package/dist/conformance/runner.js.map +1 -0
  13. package/dist/generated/contract.generated.d.ts +282 -0
  14. package/dist/generated/contract.generated.d.ts.map +1 -0
  15. package/dist/generated/contract.generated.js +37 -0
  16. package/dist/generated/contract.generated.js.map +1 -0
  17. package/dist/index.d.ts +35 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +36 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/types/capability.d.ts +4 -0
  22. package/dist/types/capability.d.ts.map +1 -0
  23. package/dist/types/capability.js +11 -0
  24. package/dist/types/capability.js.map +1 -0
  25. package/dist/types/data-class.d.ts +3 -0
  26. package/dist/types/data-class.d.ts.map +1 -0
  27. package/dist/types/data-class.js +12 -0
  28. package/dist/types/data-class.js.map +1 -0
  29. package/dist/types/index.d.ts +5 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/types/index.js +5 -0
  32. package/dist/types/index.js.map +1 -0
  33. package/dist/validation/index.d.ts +2 -0
  34. package/dist/validation/index.d.ts.map +1 -0
  35. package/dist/validation/index.js +2 -0
  36. package/dist/validation/index.js.map +1 -0
  37. package/dist/validation/messaging-semantic.d.ts +10 -0
  38. package/dist/validation/messaging-semantic.d.ts.map +1 -0
  39. package/dist/validation/messaging-semantic.js +99 -0
  40. package/dist/validation/messaging-semantic.js.map +1 -0
  41. package/fixtures/behavior/messaging/adversarial-invariants.json +475 -0
  42. package/fixtures/manifest/invalid/.gitkeep +0 -0
  43. package/fixtures/manifest/invalid/contract-version-leading-zero-prerelease.json +17 -0
  44. package/fixtures/manifest/invalid/contract-version-range.json +17 -0
  45. package/fixtures/manifest/invalid/ipc-empty-entrypoint.json +18 -0
  46. package/fixtures/manifest/invalid/plugin-version-leading-zero-prerelease.json +17 -0
  47. package/fixtures/manifest/invalid/plugin-version-not-semver.json +17 -0
  48. package/fixtures/manifest/invalid/semver-empty-build-metadata.json +17 -0
  49. package/fixtures/manifest/invalid/stdio-missing-entrypoint.json +17 -0
  50. package/fixtures/manifest/invalid/unknown-capability.json +19 -0
  51. package/fixtures/manifest/invalid/user-authored-lifecycle.json +24 -0
  52. package/fixtures/manifest/valid/.gitkeep +0 -0
  53. package/fixtures/manifest/valid/minimal-builtin.json +17 -0
  54. package/fixtures/manifest/valid/protocol-intrinsic-lifecycle.json +18 -0
  55. package/fixtures/manifest/valid/semver-build-metadata.json +17 -0
  56. package/fixtures/manifest/valid/stdio-entrypoint.json +18 -0
  57. package/fixtures/messaging/invalid/.gitkeep +0 -0
  58. package/fixtures/messaging/invalid/non-rfc3339-occurred-at.json +34 -0
  59. package/fixtures/messaging/invalid/non-utc-occurred-at.json +34 -0
  60. package/fixtures/messaging/invalid/raw-message-id-append.json +16 -0
  61. package/fixtures/messaging/invalid/raw-thread-id.json +28 -0
  62. package/fixtures/messaging/invalid/stale-read-with-ack-token.json +8 -0
  63. package/fixtures/messaging/invalid/system-draft-audience.json +31 -0
  64. package/fixtures/messaging/invalid/text-payload-missing-text.json +10 -0
  65. package/fixtures/messaging/invalid/untyped-root-document.json +3 -0
  66. package/fixtures/messaging/valid/.gitkeep +0 -0
  67. package/fixtures/messaging/valid/append-elements-with-handle.json +21 -0
  68. package/fixtures/messaging/valid/message-draft.json +28 -0
  69. package/fixtures/messaging/valid/root-message-draft.json +25 -0
  70. package/fixtures/messaging/valid/subscription-delivery.json +45 -0
  71. package/package.json +59 -0
  72. package/src/schemas/behavior-fixture.schema.json +370 -0
  73. package/src/schemas/manifest.schema.json +186 -0
  74. package/src/schemas/messaging.schema.json +473 -0
@@ -0,0 +1,473 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://clowder-ai.dev/schemas/messaging/v0.1",
4
+ "title": "Clowder AI Plugin Contract — Messaging Domain (v0.1)",
5
+ "description": "Machine-readable truth source for messaging types (§3.1). Candidate — do not consume until published.",
6
+ "x-clowder-bounds": {
7
+ "maxElementsPerOperation": 32,
8
+ "maxElementPayloadBytes": 65536,
9
+ "maxTotalPayloadBytes": 262144,
10
+ "maxWhisperTargets": 16,
11
+ "maxIdempotencyKeyLength": 200,
12
+ "maxElementIdLength": 128,
13
+ "maxElementsPerMessage": 128,
14
+ "maxAppendOpsPerMessage": 64
15
+ },
16
+ "x-clowder-replay-window-default": "P7D",
17
+ "oneOf": [
18
+ { "$ref": "#/$defs/MessageDraft" },
19
+ { "$ref": "#/$defs/MessageEnvelope" },
20
+ { "$ref": "#/$defs/MessageOutputEvent" },
21
+ { "$ref": "#/$defs/AppendElementsRequest" },
22
+ { "$ref": "#/$defs/SendReceipt" },
23
+ { "$ref": "#/$defs/AppendReceipt" },
24
+ { "$ref": "#/$defs/SubscriptionReadResponse" },
25
+ { "$ref": "#/$defs/SnapshotResponse" }
26
+ ],
27
+ "$defs": {
28
+ "ActorKind": {
29
+ "type": "string",
30
+ "enum": ["user", "cat", "plugin", "device", "system"]
31
+ },
32
+ "ActorRef": {
33
+ "type": "object",
34
+ "properties": {
35
+ "kind": { "$ref": "#/$defs/ActorKind" },
36
+ "id": { "type": "string", "minLength": 1 }
37
+ },
38
+ "required": ["kind", "id"],
39
+ "additionalProperties": false
40
+ },
41
+ "EpistemicStatus": {
42
+ "type": "string",
43
+ "enum": ["observation", "user_intent", "inference"]
44
+ },
45
+ "ExternalSourceAddress": {
46
+ "type": "object",
47
+ "properties": {
48
+ "connectorId": { "type": "string", "minLength": 1, "maxLength": 256 },
49
+ "chatId": { "type": "string", "minLength": 1, "maxLength": 512 },
50
+ "messageId": { "type": "string", "minLength": 1, "maxLength": 512 }
51
+ },
52
+ "required": ["connectorId", "chatId"],
53
+ "additionalProperties": false
54
+ },
55
+ "IngressSourceAddress": {
56
+ "$ref": "#/$defs/ExternalSourceAddress",
57
+ "description": "Backward-compatible name for the external ingress address."
58
+ },
59
+ "PluginOrigin": {
60
+ "type": "object",
61
+ "properties": {
62
+ "kind": { "const": "plugin" },
63
+ "instanceId": { "type": "string", "minLength": 1, "maxLength": 256 }
64
+ },
65
+ "required": ["kind", "instanceId"],
66
+ "additionalProperties": false
67
+ },
68
+ "ExternalOrigin": {
69
+ "type": "object",
70
+ "properties": {
71
+ "kind": { "const": "external" },
72
+ "connectorId": { "type": "string", "minLength": 1, "maxLength": 256 },
73
+ "sourceAddress": { "$ref": "#/$defs/ExternalSourceAddress" }
74
+ },
75
+ "required": ["kind", "connectorId"],
76
+ "additionalProperties": false
77
+ },
78
+ "HostOrigin": {
79
+ "type": "object",
80
+ "properties": {
81
+ "kind": { "const": "host" }
82
+ },
83
+ "required": ["kind"],
84
+ "additionalProperties": false
85
+ },
86
+ "ProvenanceOrigin": {
87
+ "oneOf": [
88
+ { "$ref": "#/$defs/PluginOrigin" },
89
+ { "$ref": "#/$defs/ExternalOrigin" },
90
+ { "$ref": "#/$defs/HostOrigin" }
91
+ ]
92
+ },
93
+ "DraftOrigin": {
94
+ "oneOf": [
95
+ { "$ref": "#/$defs/PluginOrigin" },
96
+ { "$ref": "#/$defs/ExternalOrigin" }
97
+ ],
98
+ "description": "Drafts cannot self-declare host provenance."
99
+ },
100
+ "MessageProvenance": {
101
+ "type": "object",
102
+ "properties": {
103
+ "origin": { "$ref": "#/$defs/ProvenanceOrigin" },
104
+ "epistemicStatus": { "$ref": "#/$defs/EpistemicStatus" }
105
+ },
106
+ "required": ["origin", "epistemicStatus"],
107
+ "additionalProperties": false
108
+ },
109
+ "DraftProvenance": {
110
+ "type": "object",
111
+ "properties": {
112
+ "origin": { "$ref": "#/$defs/DraftOrigin" },
113
+ "epistemicStatus": { "$ref": "#/$defs/EpistemicStatus" }
114
+ },
115
+ "required": ["epistemicStatus"],
116
+ "additionalProperties": false
117
+ },
118
+ "ElementKind": {
119
+ "type": "string",
120
+ "enum": ["text", "media_ref", "rich_block"]
121
+ },
122
+ "TextElementPayload": {
123
+ "type": "object",
124
+ "properties": {
125
+ "text": { "type": "string" }
126
+ },
127
+ "required": ["text"],
128
+ "additionalProperties": false
129
+ },
130
+ "MediaRefElementPayload": {
131
+ "type": "object",
132
+ "additionalProperties": true
133
+ },
134
+ "RichBlockElementPayload": {
135
+ "type": "object",
136
+ "additionalProperties": true
137
+ },
138
+ "TextMessageElement": {
139
+ "type": "object",
140
+ "properties": {
141
+ "elementId": { "type": "string", "minLength": 1, "maxLength": 128 },
142
+ "kind": { "const": "text" },
143
+ "payload": { "$ref": "#/$defs/TextElementPayload" },
144
+ "derivedFromElementId": { "type": "string", "minLength": 1, "maxLength": 128 },
145
+ "epistemicStatus": { "$ref": "#/$defs/EpistemicStatus" }
146
+ },
147
+ "required": ["elementId", "kind", "payload"],
148
+ "additionalProperties": false
149
+ },
150
+ "MediaRefMessageElement": {
151
+ "type": "object",
152
+ "properties": {
153
+ "elementId": { "type": "string", "minLength": 1, "maxLength": 128 },
154
+ "kind": { "const": "media_ref" },
155
+ "payload": { "$ref": "#/$defs/MediaRefElementPayload" },
156
+ "derivedFromElementId": { "type": "string", "minLength": 1, "maxLength": 128 },
157
+ "epistemicStatus": { "$ref": "#/$defs/EpistemicStatus" }
158
+ },
159
+ "required": ["elementId", "kind", "payload"],
160
+ "additionalProperties": false
161
+ },
162
+ "RichBlockMessageElement": {
163
+ "type": "object",
164
+ "properties": {
165
+ "elementId": { "type": "string", "minLength": 1, "maxLength": 128 },
166
+ "kind": { "const": "rich_block" },
167
+ "payload": { "$ref": "#/$defs/RichBlockElementPayload" },
168
+ "derivedFromElementId": { "type": "string", "minLength": 1, "maxLength": 128 },
169
+ "epistemicStatus": { "$ref": "#/$defs/EpistemicStatus" }
170
+ },
171
+ "required": ["elementId", "kind", "payload"],
172
+ "additionalProperties": false
173
+ },
174
+ "MessageElement": {
175
+ "oneOf": [
176
+ { "$ref": "#/$defs/TextMessageElement" },
177
+ { "$ref": "#/$defs/MediaRefMessageElement" },
178
+ { "$ref": "#/$defs/RichBlockMessageElement" }
179
+ ]
180
+ },
181
+ "MessagePayload": {
182
+ "type": "object",
183
+ "properties": {
184
+ "provenance": { "$ref": "#/$defs/MessageProvenance" },
185
+ "elements": {
186
+ "type": "array",
187
+ "items": { "$ref": "#/$defs/MessageElement" },
188
+ "minItems": 1,
189
+ "maxItems": 128
190
+ },
191
+ "correlationId": { "type": "string", "minLength": 1, "maxLength": 256 },
192
+ "causationId": { "type": "string", "minLength": 1, "maxLength": 256 }
193
+ },
194
+ "required": ["provenance", "elements"],
195
+ "additionalProperties": false
196
+ },
197
+ "DraftPayload": {
198
+ "type": "object",
199
+ "properties": {
200
+ "provenance": { "$ref": "#/$defs/DraftProvenance" },
201
+ "elements": {
202
+ "type": "array",
203
+ "items": { "$ref": "#/$defs/MessageElement" },
204
+ "minItems": 1,
205
+ "maxItems": 32
206
+ },
207
+ "correlationId": { "type": "string", "minLength": 1, "maxLength": 256 },
208
+ "causationId": { "type": "string", "minLength": 1, "maxLength": 256 }
209
+ },
210
+ "required": ["provenance", "elements"],
211
+ "additionalProperties": false
212
+ },
213
+ "ThreadHandleAddress": {
214
+ "type": "object",
215
+ "properties": {
216
+ "kind": { "const": "thread_handle" },
217
+ "handle": { "type": "string", "minLength": 1, "maxLength": 256 }
218
+ },
219
+ "required": ["kind", "handle"],
220
+ "additionalProperties": false
221
+ },
222
+ "ConnectorBindingAddress": {
223
+ "type": "object",
224
+ "properties": {
225
+ "kind": { "const": "connector_binding" },
226
+ "handle": { "type": "string", "minLength": 1, "maxLength": 256 }
227
+ },
228
+ "required": ["kind", "handle"],
229
+ "additionalProperties": false
230
+ },
231
+ "MessageAddress": {
232
+ "oneOf": [
233
+ { "$ref": "#/$defs/ThreadHandleAddress" },
234
+ { "$ref": "#/$defs/ConnectorBindingAddress" }
235
+ ]
236
+ },
237
+ "PublicAudience": {
238
+ "type": "object",
239
+ "properties": {
240
+ "kind": { "const": "public" }
241
+ },
242
+ "required": ["kind"],
243
+ "additionalProperties": false
244
+ },
245
+ "WhisperAudience": {
246
+ "type": "object",
247
+ "properties": {
248
+ "kind": { "const": "whisper" },
249
+ "targets": {
250
+ "type": "array",
251
+ "items": { "type": "string", "minLength": 1, "maxLength": 256 },
252
+ "minItems": 1,
253
+ "maxItems": 16,
254
+ "uniqueItems": true
255
+ }
256
+ },
257
+ "required": ["kind", "targets"],
258
+ "additionalProperties": false
259
+ },
260
+ "SystemAudience": {
261
+ "type": "object",
262
+ "properties": {
263
+ "kind": { "const": "system" }
264
+ },
265
+ "required": ["kind"],
266
+ "additionalProperties": false
267
+ },
268
+ "DraftAudience": {
269
+ "oneOf": [
270
+ { "$ref": "#/$defs/PublicAudience" },
271
+ { "$ref": "#/$defs/WhisperAudience" }
272
+ ]
273
+ },
274
+ "CanonicalAudience": {
275
+ "oneOf": [
276
+ { "$ref": "#/$defs/PublicAudience" },
277
+ { "$ref": "#/$defs/WhisperAudience" },
278
+ { "$ref": "#/$defs/SystemAudience" }
279
+ ]
280
+ },
281
+ "MessageDraft": {
282
+ "type": "object",
283
+ "properties": {
284
+ "address": { "$ref": "#/$defs/MessageAddress" },
285
+ "draftAudience": { "$ref": "#/$defs/DraftAudience" },
286
+ "idempotencyKey": { "type": "string", "minLength": 1, "maxLength": 200 },
287
+ "sourceEventId": { "type": "string", "minLength": 1, "maxLength": 512 },
288
+ "replyTo": { "type": "string", "minLength": 1, "maxLength": 256 },
289
+ "payload": { "$ref": "#/$defs/DraftPayload" }
290
+ },
291
+ "required": ["address", "idempotencyKey", "payload"],
292
+ "additionalProperties": false
293
+ },
294
+ "MessageEnvelope": {
295
+ "type": "object",
296
+ "properties": {
297
+ "messageId": { "type": "string", "minLength": 1 },
298
+ "revision": { "type": "integer", "minimum": 1 },
299
+ "threadId": { "type": "string", "minLength": 1 },
300
+ "replyTo": { "type": "string", "minLength": 1 },
301
+ "actor": { "$ref": "#/$defs/ActorRef" },
302
+ "audience": { "$ref": "#/$defs/CanonicalAudience" },
303
+ "occurredAt": {
304
+ "type": "string",
305
+ "format": "date-time",
306
+ "pattern": "Z$"
307
+ },
308
+ "payload": { "$ref": "#/$defs/MessagePayload" }
309
+ },
310
+ "required": ["messageId", "revision", "threadId", "actor", "audience", "occurredAt", "payload"],
311
+ "additionalProperties": false
312
+ },
313
+ "MessagePublishEvent": {
314
+ "type": "object",
315
+ "properties": {
316
+ "eventId": { "type": "string", "minLength": 1 },
317
+ "sequence": { "type": "integer", "minimum": 0 },
318
+ "type": { "const": "message.publish" },
319
+ "envelope": { "$ref": "#/$defs/MessageEnvelope" }
320
+ },
321
+ "required": ["eventId", "sequence", "type", "envelope"],
322
+ "additionalProperties": false
323
+ },
324
+ "MessageElementsAppendEvent": {
325
+ "type": "object",
326
+ "properties": {
327
+ "eventId": { "type": "string", "minLength": 1 },
328
+ "sequence": { "type": "integer", "minimum": 0 },
329
+ "type": { "const": "message.elements.append" },
330
+ "messageId": { "type": "string", "minLength": 1 },
331
+ "threadId": { "type": "string", "minLength": 1 },
332
+ "operationId": { "type": "string", "minLength": 1, "maxLength": 200 },
333
+ "baseRevision": { "type": "integer", "minimum": 1 },
334
+ "revision": { "type": "integer", "minimum": 1 },
335
+ "elements": {
336
+ "type": "array",
337
+ "items": { "$ref": "#/$defs/MessageElement" },
338
+ "minItems": 1,
339
+ "maxItems": 32
340
+ }
341
+ },
342
+ "required": ["eventId", "sequence", "type", "messageId", "threadId", "operationId", "revision", "elements"],
343
+ "additionalProperties": false
344
+ },
345
+ "MessageOutputEvent": {
346
+ "oneOf": [
347
+ { "$ref": "#/$defs/MessagePublishEvent" },
348
+ { "$ref": "#/$defs/MessageElementsAppendEvent" }
349
+ ]
350
+ },
351
+ "SendReceipt": {
352
+ "type": "object",
353
+ "properties": {
354
+ "messageId": { "type": "string", "minLength": 1 },
355
+ "threadId": { "type": "string", "minLength": 1 },
356
+ "revision": { "type": "integer", "minimum": 1 },
357
+ "publishSequence": { "type": "integer", "minimum": 0 }
358
+ },
359
+ "required": ["messageId", "threadId", "revision"],
360
+ "additionalProperties": false
361
+ },
362
+ "AppendReceipt": {
363
+ "type": "object",
364
+ "properties": {
365
+ "messageId": { "type": "string", "minLength": 1 },
366
+ "revision": { "type": "integer", "minimum": 1 },
367
+ "appendSequence": { "type": "integer", "minimum": 0 },
368
+ "appliedElementIds": {
369
+ "type": "array",
370
+ "items": { "type": "string", "minLength": 1, "maxLength": 128 }
371
+ }
372
+ },
373
+ "required": ["messageId", "revision", "appliedElementIds"],
374
+ "additionalProperties": false
375
+ },
376
+ "MessagingErrorCode": {
377
+ "type": "string",
378
+ "enum": ["VALIDATION", "PERMISSION", "NOT_FOUND", "CONFLICT", "RETRYABLE_INFLIGHT", "STALE_CURSOR"]
379
+ },
380
+ "MessageHandle": {
381
+ "type": "object",
382
+ "properties": {
383
+ "kind": { "const": "message" },
384
+ "token": { "type": "string", "minLength": 1 }
385
+ },
386
+ "required": ["kind", "token"],
387
+ "additionalProperties": false
388
+ },
389
+ "AppendElementsRequest": {
390
+ "type": "object",
391
+ "properties": {
392
+ "handle": { "$ref": "#/$defs/MessageHandle" },
393
+ "operationId": { "type": "string", "minLength": 1, "maxLength": 200 },
394
+ "baseRevision": { "type": "integer", "minimum": 1 },
395
+ "elements": {
396
+ "type": "array",
397
+ "items": { "$ref": "#/$defs/MessageElement" },
398
+ "minItems": 1,
399
+ "maxItems": 32
400
+ }
401
+ },
402
+ "required": ["handle", "operationId", "elements"],
403
+ "additionalProperties": false
404
+ },
405
+ "SubscriptionCursor": {
406
+ "type": "string",
407
+ "minLength": 1,
408
+ "description": "Opaque, subscription-local acknowledgement token."
409
+ },
410
+ "SubscriptionNormalResponse": {
411
+ "type": "object",
412
+ "properties": {
413
+ "events": {
414
+ "type": "array",
415
+ "items": { "$ref": "#/$defs/MessageOutputEvent" },
416
+ "minItems": 1,
417
+ "maxItems": 32
418
+ },
419
+ "ackToken": { "$ref": "#/$defs/SubscriptionCursor" },
420
+ "stale": { "const": false }
421
+ },
422
+ "required": ["events", "ackToken", "stale"],
423
+ "additionalProperties": false
424
+ },
425
+ "SubscriptionEmptyResponse": {
426
+ "type": "object",
427
+ "properties": {
428
+ "events": {
429
+ "type": "array",
430
+ "items": { "$ref": "#/$defs/MessageOutputEvent" },
431
+ "maxItems": 0
432
+ },
433
+ "ackToken": { "type": "null" },
434
+ "stale": { "const": false }
435
+ },
436
+ "required": ["events", "ackToken", "stale"],
437
+ "additionalProperties": false
438
+ },
439
+ "SubscriptionStaleResponse": {
440
+ "type": "object",
441
+ "properties": {
442
+ "events": {
443
+ "type": "array",
444
+ "items": { "$ref": "#/$defs/MessageOutputEvent" },
445
+ "maxItems": 0
446
+ },
447
+ "ackToken": { "type": "null" },
448
+ "stale": { "const": true }
449
+ },
450
+ "required": ["events", "ackToken", "stale"],
451
+ "additionalProperties": false
452
+ },
453
+ "SubscriptionReadResponse": {
454
+ "oneOf": [
455
+ { "$ref": "#/$defs/SubscriptionNormalResponse" },
456
+ { "$ref": "#/$defs/SubscriptionEmptyResponse" },
457
+ { "$ref": "#/$defs/SubscriptionStaleResponse" }
458
+ ]
459
+ },
460
+ "SnapshotResponse": {
461
+ "type": "object",
462
+ "properties": {
463
+ "envelopes": {
464
+ "type": "array",
465
+ "items": { "$ref": "#/$defs/MessageEnvelope" }
466
+ },
467
+ "resumeSequence": { "type": "integer", "minimum": 0 }
468
+ },
469
+ "required": ["envelopes", "resumeSequence"],
470
+ "additionalProperties": false
471
+ }
472
+ }
473
+ }