@clowder-ai/plugin-contract 0.1.0-beta.1 → 0.1.0-beta.11

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 (173) hide show
  1. package/dist/codegen/generate-contract.d.ts +5 -0
  2. package/dist/codegen/generate-contract.d.ts.map +1 -1
  3. package/dist/codegen/generate-contract.js +45 -4
  4. package/dist/codegen/generate-contract.js.map +1 -1
  5. package/dist/conformance/behavior-executor.d.ts +18 -0
  6. package/dist/conformance/behavior-executor.d.ts.map +1 -0
  7. package/dist/conformance/behavior-executor.js +52 -0
  8. package/dist/conformance/behavior-executor.js.map +1 -0
  9. package/dist/conformance/fixtures.d.ts +11 -0
  10. package/dist/conformance/fixtures.d.ts.map +1 -0
  11. package/dist/conformance/fixtures.js +9 -0
  12. package/dist/conformance/fixtures.js.map +1 -0
  13. package/dist/conformance/index.d.ts +6 -0
  14. package/dist/conformance/index.d.ts.map +1 -1
  15. package/dist/conformance/index.js +5 -0
  16. package/dist/conformance/index.js.map +1 -1
  17. package/dist/conformance/messaging-behavior-fixture.d.ts +12 -0
  18. package/dist/conformance/messaging-behavior-fixture.d.ts.map +1 -0
  19. package/dist/conformance/messaging-behavior-fixture.js +30 -0
  20. package/dist/conformance/messaging-behavior-fixture.js.map +1 -0
  21. package/dist/conformance/messaging-loopback-adapter.d.ts +23 -0
  22. package/dist/conformance/messaging-loopback-adapter.d.ts.map +1 -0
  23. package/dist/conformance/messaging-loopback-adapter.js +389 -0
  24. package/dist/conformance/messaging-loopback-adapter.js.map +1 -0
  25. package/dist/conformance/messaging-loopback-state.d.ts +22 -0
  26. package/dist/conformance/messaging-loopback-state.d.ts.map +1 -0
  27. package/dist/conformance/messaging-loopback-state.js +101 -0
  28. package/dist/conformance/messaging-loopback-state.js.map +1 -0
  29. package/dist/conformance/runner.d.ts +18 -1
  30. package/dist/conformance/runner.d.ts.map +1 -1
  31. package/dist/conformance/runner.js +153 -66
  32. package/dist/conformance/runner.js.map +1 -1
  33. package/dist/conformance/stdio-harness/child-process-harness.d.ts +65 -0
  34. package/dist/conformance/stdio-harness/child-process-harness.d.ts.map +1 -0
  35. package/dist/conformance/stdio-harness/child-process-harness.js +296 -0
  36. package/dist/conformance/stdio-harness/child-process-harness.js.map +1 -0
  37. package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts +26 -0
  38. package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts.map +1 -0
  39. package/dist/conformance/stdio-harness/dual-transport-oracle.js +32 -0
  40. package/dist/conformance/stdio-harness/dual-transport-oracle.js.map +1 -0
  41. package/dist/conformance/stdio-harness/harness-process-spawn.d.ts +27 -0
  42. package/dist/conformance/stdio-harness/harness-process-spawn.d.ts.map +1 -0
  43. package/dist/conformance/stdio-harness/harness-process-spawn.js +43 -0
  44. package/dist/conformance/stdio-harness/harness-process-spawn.js.map +1 -0
  45. package/dist/conformance/stdio-harness/index.d.ts +5 -0
  46. package/dist/conformance/stdio-harness/index.d.ts.map +1 -0
  47. package/dist/conformance/stdio-harness/index.js +4 -0
  48. package/dist/conformance/stdio-harness/index.js.map +1 -0
  49. package/dist/conformance/stdio-harness/ndjson-frame.d.ts +31 -0
  50. package/dist/conformance/stdio-harness/ndjson-frame.d.ts.map +1 -0
  51. package/dist/conformance/stdio-harness/ndjson-frame.js +125 -0
  52. package/dist/conformance/stdio-harness/ndjson-frame.js.map +1 -0
  53. package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts +15 -0
  54. package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts.map +1 -0
  55. package/dist/conformance/stdio-harness/node-process-tree-runtime.js +78 -0
  56. package/dist/conformance/stdio-harness/node-process-tree-runtime.js.map +1 -0
  57. package/dist/conformance/stdio-harness/process-tree-controller.d.ts +51 -0
  58. package/dist/conformance/stdio-harness/process-tree-controller.d.ts.map +1 -0
  59. package/dist/conformance/stdio-harness/process-tree-controller.js +162 -0
  60. package/dist/conformance/stdio-harness/process-tree-controller.js.map +1 -0
  61. package/dist/conformance/stdio-harness/windows-sentinel.d.ts +15 -0
  62. package/dist/conformance/stdio-harness/windows-sentinel.d.ts.map +1 -0
  63. package/dist/conformance/stdio-harness/windows-sentinel.js +160 -0
  64. package/dist/conformance/stdio-harness/windows-sentinel.js.map +1 -0
  65. package/dist/conformance/stdio-harness/wire-shape.d.ts +18 -0
  66. package/dist/conformance/stdio-harness/wire-shape.d.ts.map +1 -0
  67. package/dist/conformance/stdio-harness/wire-shape.js +2 -0
  68. package/dist/conformance/stdio-harness/wire-shape.js.map +1 -0
  69. package/dist/generated/contract.generated.d.ts +370 -4
  70. package/dist/generated/contract.generated.d.ts.map +1 -1
  71. package/dist/generated/contract.generated.js +7 -1
  72. package/dist/generated/contract.generated.js.map +1 -1
  73. package/dist/index.d.ts +3 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +5 -1
  76. package/dist/index.js.map +1 -1
  77. package/dist/validation/index.d.ts +3 -0
  78. package/dist/validation/index.d.ts.map +1 -1
  79. package/dist/validation/index.js +3 -0
  80. package/dist/validation/index.js.map +1 -1
  81. package/dist/validation/manifest.d.ts +23 -0
  82. package/dist/validation/manifest.d.ts.map +1 -0
  83. package/dist/validation/manifest.js +53 -0
  84. package/dist/validation/manifest.js.map +1 -0
  85. package/dist/validation/messaging-semantic.d.ts.map +1 -1
  86. package/dist/validation/messaging-semantic.js +49 -0
  87. package/dist/validation/messaging-semantic.js.map +1 -1
  88. package/dist/validation/messaging-wire.d.ts +38 -0
  89. package/dist/validation/messaging-wire.d.ts.map +1 -0
  90. package/dist/validation/messaging-wire.js +164 -0
  91. package/dist/validation/messaging-wire.js.map +1 -0
  92. package/dist/validation/signals.d.ts +26 -0
  93. package/dist/validation/signals.d.ts.map +1 -0
  94. package/dist/validation/signals.js +206 -0
  95. package/dist/validation/signals.js.map +1 -0
  96. package/dist/wire/constants.d.ts +36 -0
  97. package/dist/wire/constants.d.ts.map +1 -0
  98. package/dist/wire/constants.js +36 -0
  99. package/dist/wire/constants.js.map +1 -0
  100. package/dist/wire/disposition-fixtures.d.ts +118 -0
  101. package/dist/wire/disposition-fixtures.d.ts.map +1 -0
  102. package/dist/wire/disposition-fixtures.js +1881 -0
  103. package/dist/wire/disposition-fixtures.js.map +1 -0
  104. package/dist/wire/disposition.d.ts +102 -0
  105. package/dist/wire/disposition.d.ts.map +1 -0
  106. package/dist/wire/disposition.js +217 -0
  107. package/dist/wire/disposition.js.map +1 -0
  108. package/dist/wire/envelope.d.ts +253 -0
  109. package/dist/wire/envelope.d.ts.map +1 -0
  110. package/dist/wire/envelope.js +19 -0
  111. package/dist/wire/envelope.js.map +1 -0
  112. package/dist/wire/errors.d.ts +222 -0
  113. package/dist/wire/errors.d.ts.map +1 -0
  114. package/dist/wire/errors.js +153 -0
  115. package/dist/wire/errors.js.map +1 -0
  116. package/dist/wire/grants.d.ts +57 -0
  117. package/dist/wire/grants.d.ts.map +1 -0
  118. package/dist/wire/grants.js +59 -0
  119. package/dist/wire/grants.js.map +1 -0
  120. package/dist/wire/handshake-byte-bounds.d.ts +69 -0
  121. package/dist/wire/handshake-byte-bounds.d.ts.map +1 -0
  122. package/dist/wire/handshake-byte-bounds.js +173 -0
  123. package/dist/wire/handshake-byte-bounds.js.map +1 -0
  124. package/dist/wire/handshake.d.ts +146 -0
  125. package/dist/wire/handshake.d.ts.map +1 -0
  126. package/dist/wire/handshake.js +189 -0
  127. package/dist/wire/handshake.js.map +1 -0
  128. package/dist/wire/index.d.ts +37 -0
  129. package/dist/wire/index.d.ts.map +1 -0
  130. package/dist/wire/index.js +61 -0
  131. package/dist/wire/index.js.map +1 -0
  132. package/dist/wire/lifecycle-byte-bounds.d.ts +55 -0
  133. package/dist/wire/lifecycle-byte-bounds.d.ts.map +1 -0
  134. package/dist/wire/lifecycle-byte-bounds.js +209 -0
  135. package/dist/wire/lifecycle-byte-bounds.js.map +1 -0
  136. package/dist/wire/messaging-byte-bounds.d.ts +61 -0
  137. package/dist/wire/messaging-byte-bounds.d.ts.map +1 -0
  138. package/dist/wire/messaging-byte-bounds.js +459 -0
  139. package/dist/wire/messaging-byte-bounds.js.map +1 -0
  140. package/dist/wire/registry.d.ts +294 -0
  141. package/dist/wire/registry.d.ts.map +1 -0
  142. package/dist/wire/registry.js +256 -0
  143. package/dist/wire/registry.js.map +1 -0
  144. package/dist/wire/request-id.d.ts +34 -0
  145. package/dist/wire/request-id.d.ts.map +1 -0
  146. package/dist/wire/request-id.js +40 -0
  147. package/dist/wire/request-id.js.map +1 -0
  148. package/dist/wire/row-shapes.d.ts +217 -0
  149. package/dist/wire/row-shapes.d.ts.map +1 -0
  150. package/dist/wire/row-shapes.js +75 -0
  151. package/dist/wire/row-shapes.js.map +1 -0
  152. package/dist/wire/signal-byte-bounds.d.ts +97 -0
  153. package/dist/wire/signal-byte-bounds.d.ts.map +1 -0
  154. package/dist/wire/signal-byte-bounds.js +229 -0
  155. package/dist/wire/signal-byte-bounds.js.map +1 -0
  156. package/dist/wire/wire-uint53.d.ts +26 -0
  157. package/dist/wire/wire-uint53.d.ts.map +1 -0
  158. package/dist/wire/wire-uint53.js +32 -0
  159. package/dist/wire/wire-uint53.js.map +1 -0
  160. package/fixtures/behavior/messaging/adversarial-invariants.json +56 -5
  161. package/fixtures/manifest/invalid/duplicate-signal-type.json +33 -0
  162. package/fixtures/messaging/valid/subscription-delivery.json +1 -1
  163. package/fixtures/signals/invalid/destination-injection.json +15 -0
  164. package/fixtures/signals/invalid/dynamic-schema-url.json +10 -0
  165. package/fixtures/signals/invalid/forbidden-raw-privacy.json +10 -0
  166. package/fixtures/signals/invalid/non-utc-occurred-at.json +12 -0
  167. package/fixtures/signals/valid/feishu-meeting-artifact.json +18 -0
  168. package/fixtures/signals/valid/remote-service-declaration.json +10 -0
  169. package/package.json +15 -6
  170. package/src/schemas/manifest.schema.json +5 -2
  171. package/src/schemas/messaging.schema.json +209 -32
  172. package/src/schemas/physical-limb.schema.json +319 -0
  173. package/src/schemas/signal.schema.json +129 -0
@@ -11,7 +11,13 @@
11
11
  "maxIdempotencyKeyLength": 200,
12
12
  "maxElementIdLength": 128,
13
13
  "maxElementsPerMessage": 128,
14
- "maxAppendOpsPerMessage": 64
14
+ "maxAppendOpsPerMessage": 64,
15
+ "maxMessageIdLength": 512,
16
+ "maxThreadIdLength": 512,
17
+ "maxActorIdLength": 512,
18
+ "maxMessageHandleTokenLength": 512,
19
+ "maxEventIdLength": 720,
20
+ "maxOccurredAtLength": 27
15
21
  },
16
22
  "x-clowder-replay-window-default": "P7D",
17
23
  "oneOf": [
@@ -33,7 +39,7 @@
33
39
  "type": "object",
34
40
  "properties": {
35
41
  "kind": { "$ref": "#/$defs/ActorKind" },
36
- "id": { "type": "string", "minLength": 1 }
42
+ "id": { "type": "string", "minLength": 1, "maxLength": 512 }
37
43
  },
38
44
  "required": ["kind", "id"],
39
45
  "additionalProperties": false
@@ -291,20 +297,32 @@
291
297
  "required": ["address", "idempotencyKey", "payload"],
292
298
  "additionalProperties": false
293
299
  },
300
+ "OccurredAt": {
301
+ "oneOf": [
302
+ {
303
+ "type": "string",
304
+ "maxLength": 24,
305
+ "format": "date-time",
306
+ "pattern": "Z$"
307
+ },
308
+ {
309
+ "type": "string",
310
+ "minLength": 27,
311
+ "maxLength": 27,
312
+ "pattern": "^[+-][0-9]{6}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\.[0-9]{3}Z$"
313
+ }
314
+ ]
315
+ },
294
316
  "MessageEnvelope": {
295
317
  "type": "object",
296
318
  "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 },
319
+ "messageId": { "type": "string", "minLength": 1, "maxLength": 512 },
320
+ "revision": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
321
+ "threadId": { "type": "string", "minLength": 1, "maxLength": 512 },
322
+ "replyTo": { "type": "string", "minLength": 1, "maxLength": 256 },
301
323
  "actor": { "$ref": "#/$defs/ActorRef" },
302
324
  "audience": { "$ref": "#/$defs/CanonicalAudience" },
303
- "occurredAt": {
304
- "type": "string",
305
- "format": "date-time",
306
- "pattern": "Z$"
307
- },
325
+ "occurredAt": { "$ref": "#/$defs/OccurredAt" },
308
326
  "payload": { "$ref": "#/$defs/MessagePayload" }
309
327
  },
310
328
  "required": ["messageId", "revision", "threadId", "actor", "audience", "occurredAt", "payload"],
@@ -313,8 +331,8 @@
313
331
  "MessagePublishEvent": {
314
332
  "type": "object",
315
333
  "properties": {
316
- "eventId": { "type": "string", "minLength": 1 },
317
- "sequence": { "type": "integer", "minimum": 0 },
334
+ "eventId": { "type": "string", "minLength": 1, "maxLength": 720 },
335
+ "sequence": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
318
336
  "type": { "const": "message.publish" },
319
337
  "envelope": { "$ref": "#/$defs/MessageEnvelope" }
320
338
  },
@@ -324,14 +342,14 @@
324
342
  "MessageElementsAppendEvent": {
325
343
  "type": "object",
326
344
  "properties": {
327
- "eventId": { "type": "string", "minLength": 1 },
328
- "sequence": { "type": "integer", "minimum": 0 },
345
+ "eventId": { "type": "string", "minLength": 1, "maxLength": 720 },
346
+ "sequence": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
329
347
  "type": { "const": "message.elements.append" },
330
- "messageId": { "type": "string", "minLength": 1 },
331
- "threadId": { "type": "string", "minLength": 1 },
348
+ "messageId": { "type": "string", "minLength": 1, "maxLength": 512 },
349
+ "threadId": { "type": "string", "minLength": 1, "maxLength": 512 },
332
350
  "operationId": { "type": "string", "minLength": 1, "maxLength": 200 },
333
- "baseRevision": { "type": "integer", "minimum": 1 },
334
- "revision": { "type": "integer", "minimum": 1 },
351
+ "baseRevision": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
352
+ "revision": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
335
353
  "elements": {
336
354
  "type": "array",
337
355
  "items": { "$ref": "#/$defs/MessageElement" },
@@ -351,23 +369,26 @@
351
369
  "SendReceipt": {
352
370
  "type": "object",
353
371
  "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 }
372
+ "messageId": { "type": "string", "minLength": 1, "maxLength": 512 },
373
+ "threadId": { "type": "string", "minLength": 1, "maxLength": 512 },
374
+ "revision": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
375
+ "messageHandle": { "$ref": "#/$defs/MessageHandle" },
376
+ "publishSequence": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
358
377
  },
359
- "required": ["messageId", "threadId", "revision"],
378
+ "required": ["messageId", "threadId", "revision", "messageHandle"],
360
379
  "additionalProperties": false
361
380
  },
362
381
  "AppendReceipt": {
363
382
  "type": "object",
364
383
  "properties": {
365
- "messageId": { "type": "string", "minLength": 1 },
366
- "revision": { "type": "integer", "minimum": 1 },
367
- "appendSequence": { "type": "integer", "minimum": 0 },
384
+ "messageId": { "type": "string", "minLength": 1, "maxLength": 512 },
385
+ "revision": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
386
+ "appendSequence": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
368
387
  "appliedElementIds": {
369
388
  "type": "array",
370
- "items": { "type": "string", "minLength": 1, "maxLength": 128 }
389
+ "items": { "type": "string", "minLength": 1, "maxLength": 128 },
390
+ "minItems": 1,
391
+ "maxItems": 32
371
392
  }
372
393
  },
373
394
  "required": ["messageId", "revision", "appliedElementIds"],
@@ -381,7 +402,7 @@
381
402
  "type": "object",
382
403
  "properties": {
383
404
  "kind": { "const": "message" },
384
- "token": { "type": "string", "minLength": 1 }
405
+ "token": { "type": "string", "minLength": 1, "maxLength": 512 }
385
406
  },
386
407
  "required": ["kind", "token"],
387
408
  "additionalProperties": false
@@ -391,7 +412,7 @@
391
412
  "properties": {
392
413
  "handle": { "$ref": "#/$defs/MessageHandle" },
393
414
  "operationId": { "type": "string", "minLength": 1, "maxLength": 200 },
394
- "baseRevision": { "type": "integer", "minimum": 1 },
415
+ "baseRevision": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
395
416
  "elements": {
396
417
  "type": "array",
397
418
  "items": { "$ref": "#/$defs/MessageElement" },
@@ -405,6 +426,7 @@
405
426
  "SubscriptionCursor": {
406
427
  "type": "string",
407
428
  "minLength": 1,
429
+ "maxLength": 512,
408
430
  "description": "Opaque, subscription-local acknowledgement token."
409
431
  },
410
432
  "SubscriptionNormalResponse": {
@@ -428,6 +450,7 @@
428
450
  "events": {
429
451
  "type": "array",
430
452
  "items": { "$ref": "#/$defs/MessageOutputEvent" },
453
+ "minItems": 0,
431
454
  "maxItems": 0
432
455
  },
433
456
  "ackToken": { "type": "null" },
@@ -442,6 +465,7 @@
442
465
  "events": {
443
466
  "type": "array",
444
467
  "items": { "$ref": "#/$defs/MessageOutputEvent" },
468
+ "minItems": 0,
445
469
  "maxItems": 0
446
470
  },
447
471
  "ackToken": { "type": "null" },
@@ -462,12 +486,165 @@
462
486
  "properties": {
463
487
  "envelopes": {
464
488
  "type": "array",
465
- "items": { "$ref": "#/$defs/MessageEnvelope" }
489
+ "items": { "$ref": "#/$defs/MessageEnvelope" },
490
+ "maxItems": 128
466
491
  },
467
- "resumeSequence": { "type": "integer", "minimum": 0 }
492
+ "resumeSequence": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
468
493
  },
469
494
  "required": ["envelopes", "resumeSequence"],
470
495
  "additionalProperties": false
496
+ },
497
+ "M0CSubscribeInput": {
498
+ "type": "object",
499
+ "properties": {
500
+ "handle": { "type": "string", "minLength": 1, "maxLength": 256 }
501
+ },
502
+ "required": ["handle"],
503
+ "additionalProperties": false
504
+ },
505
+ "M0CSubscribeResult": {
506
+ "type": "object",
507
+ "properties": {
508
+ "subscriptionId": { "type": "string", "minLength": 1, "maxLength": 128 }
509
+ },
510
+ "required": ["subscriptionId"],
511
+ "additionalProperties": false
512
+ },
513
+ "M0CReadInput": {
514
+ "type": "object",
515
+ "properties": {
516
+ "subscriptionId": { "type": "string", "minLength": 1, "maxLength": 128 },
517
+ "limit": { "type": "integer", "minimum": 1, "maximum": 32 }
518
+ },
519
+ "required": ["subscriptionId", "limit"],
520
+ "additionalProperties": false
521
+ },
522
+ "M0CReadNormalResult": {
523
+ "type": "object",
524
+ "properties": {
525
+ "events": {
526
+ "type": "array",
527
+ "items": { "$ref": "#/$defs/MessageOutputEvent" },
528
+ "minItems": 1,
529
+ "maxItems": 32
530
+ },
531
+ "ackToken": { "type": "string", "minLength": 1, "maxLength": 512 },
532
+ "stale": { "const": false }
533
+ },
534
+ "required": ["events", "ackToken", "stale"],
535
+ "additionalProperties": false
536
+ },
537
+ "M0CReadEmptyResult": {
538
+ "type": "object",
539
+ "properties": {
540
+ "events": {
541
+ "type": "array",
542
+ "items": { "$ref": "#/$defs/MessageOutputEvent" },
543
+ "minItems": 0,
544
+ "maxItems": 0
545
+ },
546
+ "ackToken": { "type": "null" },
547
+ "stale": { "const": false }
548
+ },
549
+ "required": ["events", "ackToken", "stale"],
550
+ "additionalProperties": false
551
+ },
552
+ "M0CReadStaleResult": {
553
+ "type": "object",
554
+ "properties": {
555
+ "events": {
556
+ "type": "array",
557
+ "items": { "$ref": "#/$defs/MessageOutputEvent" },
558
+ "minItems": 0,
559
+ "maxItems": 0
560
+ },
561
+ "ackToken": { "type": "null" },
562
+ "stale": { "const": true }
563
+ },
564
+ "required": ["events", "ackToken", "stale"],
565
+ "additionalProperties": false
566
+ },
567
+ "M0CReadResult": {
568
+ "oneOf": [
569
+ { "$ref": "#/$defs/M0CReadNormalResult" },
570
+ { "$ref": "#/$defs/M0CReadEmptyResult" },
571
+ { "$ref": "#/$defs/M0CReadStaleResult" }
572
+ ]
573
+ },
574
+ "M0CAckInput": {
575
+ "type": "object",
576
+ "properties": {
577
+ "subscriptionId": { "type": "string", "minLength": 1, "maxLength": 128 },
578
+ "ackToken": { "type": "string", "minLength": 1, "maxLength": 512 }
579
+ },
580
+ "required": ["subscriptionId", "ackToken"],
581
+ "additionalProperties": false
582
+ },
583
+ "M0CAckResult": {
584
+ "type": "null"
585
+ },
586
+ "M0CSnapshotInput": {
587
+ "type": "object",
588
+ "properties": {
589
+ "subscriptionId": { "type": "string", "minLength": 1, "maxLength": 128 },
590
+ "maxItems": { "type": "integer", "minimum": 1, "maximum": 64 },
591
+ "pageToken": { "type": "string", "minLength": 1, "maxLength": 512 }
592
+ },
593
+ "required": ["subscriptionId", "maxItems"],
594
+ "additionalProperties": false
595
+ },
596
+ "M0CSnapshotIntermediateResult": {
597
+ "type": "object",
598
+ "properties": {
599
+ "items": {
600
+ "type": "array",
601
+ "items": { "$ref": "#/$defs/MessageEnvelope" },
602
+ "minItems": 1,
603
+ "maxItems": 64
604
+ },
605
+ "nextPageToken": { "type": "string", "minLength": 1, "maxLength": 512 },
606
+ "snapshotAckToken": { "type": "null" }
607
+ },
608
+ "required": ["items", "nextPageToken", "snapshotAckToken"],
609
+ "additionalProperties": false
610
+ },
611
+ "M0CSnapshotFinalResult": {
612
+ "type": "object",
613
+ "properties": {
614
+ "items": {
615
+ "type": "array",
616
+ "items": { "$ref": "#/$defs/MessageEnvelope" },
617
+ "maxItems": 64
618
+ },
619
+ "nextPageToken": { "type": "null" },
620
+ "snapshotAckToken": { "type": "string", "minLength": 1, "maxLength": 512 }
621
+ },
622
+ "required": ["items", "nextPageToken", "snapshotAckToken"],
623
+ "additionalProperties": false
624
+ },
625
+ "M0CSnapshotResult": {
626
+ "oneOf": [
627
+ { "$ref": "#/$defs/M0CSnapshotIntermediateResult" },
628
+ { "$ref": "#/$defs/M0CSnapshotFinalResult" }
629
+ ]
630
+ },
631
+ "M0CDeliverInput": {
632
+ "type": "object",
633
+ "properties": {
634
+ "deliveryId": { "type": "string", "minLength": 1, "maxLength": 128 },
635
+ "threadHandle": { "$ref": "#/$defs/ThreadHandleAddress" },
636
+ "envelope": { "$ref": "#/$defs/MessageEnvelope" }
637
+ },
638
+ "required": ["deliveryId", "threadHandle", "envelope"],
639
+ "additionalProperties": false
640
+ },
641
+ "M0CDeliverResult": {
642
+ "type": "object",
643
+ "properties": {
644
+ "deliveryId": { "type": "string", "minLength": 1, "maxLength": 128 }
645
+ },
646
+ "required": ["deliveryId"],
647
+ "additionalProperties": false
471
648
  }
472
649
  }
473
650
  }
@@ -0,0 +1,319 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://clowder-ai.dev/schemas/physical-limb/v0.1",
4
+ "title": "Clowder AI Physical Limb Contribution (v0.1)",
5
+ "description": "Typed, bounded contract for a Host-governed physical limb contribution. Raw sensor media is intentionally absent.",
6
+ "x-clowder-physical-limb-grants": [
7
+ "limb.action.motion",
8
+ "limb.action.display",
9
+ "limb.action.light",
10
+ "limb.action.speaker",
11
+ "limb.observe.touch",
12
+ "limb.sensor.microphone",
13
+ "limb.sensor.camera"
14
+ ],
15
+ "x-clowder-physical-limb-bounds": {
16
+ "maxIdentifierLength": 128,
17
+ "maxTranscriptCodePoints": 4096,
18
+ "maxTouchDurationMs": 10000,
19
+ "minListenDurationMs": 100,
20
+ "maxListenDurationMs": 30000,
21
+ "maxActionTimeoutMs": 30000
22
+ },
23
+ "$defs": {
24
+ "PhysicalLimbIdentifier": {
25
+ "type": "string",
26
+ "minLength": 1,
27
+ "maxLength": 128
28
+ },
29
+ "PhysicalLimbGrant": {
30
+ "type": "string",
31
+ "enum": [
32
+ "limb.action.motion",
33
+ "limb.action.display",
34
+ "limb.action.light",
35
+ "limb.action.speaker",
36
+ "limb.observe.touch",
37
+ "limb.sensor.microphone",
38
+ "limb.sensor.camera"
39
+ ]
40
+ },
41
+ "PhysicalLimbSafePose": {
42
+ "type": "object",
43
+ "properties": {
44
+ "yawDeg": { "type": "number", "minimum": -90, "maximum": 90 },
45
+ "pitchDeg": { "type": "number", "minimum": -90, "maximum": 90 },
46
+ "timeoutMs": { "type": "integer", "minimum": 100, "maximum": 30000 }
47
+ },
48
+ "required": ["yawDeg", "pitchDeg", "timeoutMs"],
49
+ "additionalProperties": false
50
+ },
51
+ "PhysicalLimbContribution": {
52
+ "type": "object",
53
+ "properties": {
54
+ "contributionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
55
+ "nodeType": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
56
+ "displayName": { "type": "string", "minLength": 1, "maxLength": 128 },
57
+ "grants": {
58
+ "type": "array",
59
+ "items": { "$ref": "#/$defs/PhysicalLimbGrant" },
60
+ "minItems": 1,
61
+ "maxItems": 7,
62
+ "uniqueItems": true
63
+ },
64
+ "safePose": { "$ref": "#/$defs/PhysicalLimbSafePose" }
65
+ },
66
+ "required": ["contributionId", "nodeType", "displayName", "grants", "safePose"],
67
+ "additionalProperties": false
68
+ },
69
+ "PhysicalLimbExpressionSource": {
70
+ "type": "object",
71
+ "properties": {
72
+ "kind": { "type": "string", "enum": ["cat_state", "play", "degraded"] },
73
+ "ref": { "$ref": "#/$defs/PhysicalLimbIdentifier" }
74
+ },
75
+ "required": ["kind", "ref"],
76
+ "additionalProperties": false
77
+ },
78
+ "PhysicalLimbTouchPayload": {
79
+ "type": "object",
80
+ "properties": {
81
+ "gesture": { "type": "string", "enum": ["tap", "stroke"] },
82
+ "durationMs": { "type": "integer", "minimum": 0, "maximum": 10000 },
83
+ "confidence": { "type": "number", "minimum": 0, "maximum": 1 }
84
+ },
85
+ "required": ["gesture", "durationMs", "confidence"],
86
+ "additionalProperties": false
87
+ },
88
+ "PhysicalLimbTranscriptPayload": {
89
+ "type": "object",
90
+ "properties": {
91
+ "interactionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
92
+ "text": { "type": "string", "minLength": 1, "maxLength": 4096 },
93
+ "language": { "type": "string", "minLength": 1, "maxLength": 32 },
94
+ "captureDurationMs": { "type": "integer", "minimum": 100, "maximum": 30000 }
95
+ },
96
+ "required": ["interactionId", "text", "captureDurationMs"],
97
+ "additionalProperties": false
98
+ },
99
+ "PhysicalLimbTouchObservation": {
100
+ "type": "object",
101
+ "properties": {
102
+ "v": { "const": 1 },
103
+ "observationId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
104
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
105
+ "occurredAt": { "type": "string", "format": "date-time" },
106
+ "sessionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
107
+ "kind": { "const": "touch" },
108
+ "payload": { "$ref": "#/$defs/PhysicalLimbTouchPayload" }
109
+ },
110
+ "required": ["v", "observationId", "nodeId", "occurredAt", "sessionId", "kind", "payload"],
111
+ "additionalProperties": false
112
+ },
113
+ "PhysicalLimbTranscriptObservation": {
114
+ "type": "object",
115
+ "properties": {
116
+ "v": { "const": 1 },
117
+ "observationId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
118
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
119
+ "occurredAt": { "type": "string", "format": "date-time" },
120
+ "sessionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
121
+ "kind": { "const": "transcript" },
122
+ "payload": { "$ref": "#/$defs/PhysicalLimbTranscriptPayload" }
123
+ },
124
+ "required": ["v", "observationId", "nodeId", "occurredAt", "sessionId", "kind", "payload"],
125
+ "additionalProperties": false
126
+ },
127
+ "PhysicalLimbObservation": {
128
+ "oneOf": [
129
+ { "$ref": "#/$defs/PhysicalLimbTouchObservation" },
130
+ { "$ref": "#/$defs/PhysicalLimbTranscriptObservation" }
131
+ ]
132
+ },
133
+ "PhysicalLimbMotionPayload": {
134
+ "type": "object",
135
+ "properties": {
136
+ "yawDeg": { "type": "number", "minimum": -90, "maximum": 90 },
137
+ "pitchDeg": { "type": "number", "minimum": -90, "maximum": 90 },
138
+ "speedDps": { "type": "number", "exclusiveMinimum": 0, "maximum": 240 },
139
+ "accelerationDps2": { "type": "number", "exclusiveMinimum": 0, "maximum": 720 }
140
+ },
141
+ "required": ["yawDeg", "pitchDeg", "speedDps", "accelerationDps2"],
142
+ "additionalProperties": false
143
+ },
144
+ "PhysicalLimbDisplayPayload": {
145
+ "type": "object",
146
+ "properties": {
147
+ "expression": { "type": "string", "minLength": 1, "maxLength": 128 },
148
+ "expressionSource": { "$ref": "#/$defs/PhysicalLimbExpressionSource" }
149
+ },
150
+ "required": ["expression", "expressionSource"],
151
+ "additionalProperties": false
152
+ },
153
+ "PhysicalLimbRgb": {
154
+ "type": "array",
155
+ "items": { "type": "integer", "minimum": 0, "maximum": 255 },
156
+ "minItems": 3,
157
+ "maxItems": 3
158
+ },
159
+ "PhysicalLimbLightPayload": {
160
+ "type": "object",
161
+ "properties": {
162
+ "colors": {
163
+ "type": "array",
164
+ "items": { "$ref": "#/$defs/PhysicalLimbRgb" },
165
+ "minItems": 1,
166
+ "maxItems": 256
167
+ }
168
+ },
169
+ "required": ["colors"],
170
+ "additionalProperties": false
171
+ },
172
+ "PhysicalLimbSpeakerPayload": {
173
+ "type": "object",
174
+ "properties": {
175
+ "text": { "type": "string", "minLength": 1, "maxLength": 4096 },
176
+ "voiceProfileRef": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
177
+ "volumePercent": { "type": "integer", "minimum": 0, "maximum": 100 }
178
+ },
179
+ "required": ["text", "voiceProfileRef", "volumePercent"],
180
+ "additionalProperties": false
181
+ },
182
+ "PhysicalLimbMotionAction": {
183
+ "type": "object",
184
+ "properties": {
185
+ "v": { "const": 1 },
186
+ "actionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
187
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
188
+ "deadlineUnixMs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
189
+ "timeoutMs": { "type": "integer", "minimum": 1, "maximum": 30000 },
190
+ "cancelToken": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
191
+ "kind": { "const": "motion" },
192
+ "payload": { "$ref": "#/$defs/PhysicalLimbMotionPayload" }
193
+ },
194
+ "required": ["v", "actionId", "nodeId", "deadlineUnixMs", "timeoutMs", "cancelToken", "kind", "payload"],
195
+ "additionalProperties": false
196
+ },
197
+ "PhysicalLimbDisplayAction": {
198
+ "type": "object",
199
+ "properties": {
200
+ "v": { "const": 1 },
201
+ "actionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
202
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
203
+ "deadlineUnixMs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
204
+ "timeoutMs": { "type": "integer", "minimum": 1, "maximum": 30000 },
205
+ "cancelToken": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
206
+ "kind": { "const": "display" },
207
+ "payload": { "$ref": "#/$defs/PhysicalLimbDisplayPayload" }
208
+ },
209
+ "required": ["v", "actionId", "nodeId", "deadlineUnixMs", "timeoutMs", "cancelToken", "kind", "payload"],
210
+ "additionalProperties": false
211
+ },
212
+ "PhysicalLimbLightAction": {
213
+ "type": "object",
214
+ "properties": {
215
+ "v": { "const": 1 },
216
+ "actionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
217
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
218
+ "deadlineUnixMs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
219
+ "timeoutMs": { "type": "integer", "minimum": 1, "maximum": 30000 },
220
+ "cancelToken": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
221
+ "kind": { "const": "light" },
222
+ "payload": { "$ref": "#/$defs/PhysicalLimbLightPayload" }
223
+ },
224
+ "required": ["v", "actionId", "nodeId", "deadlineUnixMs", "timeoutMs", "cancelToken", "kind", "payload"],
225
+ "additionalProperties": false
226
+ },
227
+ "PhysicalLimbSpeakerAction": {
228
+ "type": "object",
229
+ "properties": {
230
+ "v": { "const": 1 },
231
+ "actionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
232
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
233
+ "deadlineUnixMs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
234
+ "timeoutMs": { "type": "integer", "minimum": 1, "maximum": 30000 },
235
+ "cancelToken": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
236
+ "kind": { "const": "speaker" },
237
+ "payload": { "$ref": "#/$defs/PhysicalLimbSpeakerPayload" }
238
+ },
239
+ "required": ["v", "actionId", "nodeId", "deadlineUnixMs", "timeoutMs", "cancelToken", "kind", "payload"],
240
+ "additionalProperties": false
241
+ },
242
+ "PhysicalLimbAction": {
243
+ "oneOf": [
244
+ { "$ref": "#/$defs/PhysicalLimbMotionAction" },
245
+ { "$ref": "#/$defs/PhysicalLimbDisplayAction" },
246
+ { "$ref": "#/$defs/PhysicalLimbLightAction" },
247
+ { "$ref": "#/$defs/PhysicalLimbSpeakerAction" }
248
+ ]
249
+ },
250
+ "PhysicalLimbCancel": {
251
+ "type": "object",
252
+ "properties": {
253
+ "v": { "const": 1 },
254
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
255
+ "actionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
256
+ "cancelToken": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
257
+ "reason": { "type": "string", "enum": ["user", "timeout", "lease_lost", "host_lost", "superseded"] }
258
+ },
259
+ "required": ["v", "nodeId", "actionId", "cancelToken", "reason"],
260
+ "additionalProperties": false
261
+ },
262
+ "PhysicalLimbActionResult": {
263
+ "type": "object",
264
+ "properties": {
265
+ "v": { "const": 1 },
266
+ "actionId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
267
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
268
+ "outcome": { "type": "string", "enum": ["succeeded", "refused", "failed", "canceled"] },
269
+ "reason": { "type": "string", "maxLength": 512 },
270
+ "observedAt": { "type": "string", "format": "date-time" }
271
+ },
272
+ "required": ["v", "actionId", "nodeId", "outcome", "observedAt"],
273
+ "additionalProperties": false
274
+ },
275
+ "PhysicalLimbReadinessReason": {
276
+ "type": "string",
277
+ "enum": [
278
+ "gateway_disconnected",
279
+ "device_disconnected",
280
+ "firmware_incompatible",
281
+ "sensor_unavailable",
282
+ "speech_dependency_missing",
283
+ "skin_unavailable",
284
+ "grant_revoked",
285
+ "host_unavailable"
286
+ ]
287
+ },
288
+ "PhysicalLimbReadyReadiness": {
289
+ "type": "object",
290
+ "properties": {
291
+ "v": { "const": 1 },
292
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
293
+ "status": { "const": "ready" },
294
+ "observedAt": { "type": "string", "format": "date-time" }
295
+ },
296
+ "required": ["v", "nodeId", "status", "observedAt"],
297
+ "additionalProperties": false
298
+ },
299
+ "PhysicalLimbUnavailableReadiness": {
300
+ "type": "object",
301
+ "properties": {
302
+ "v": { "const": 1 },
303
+ "nodeId": { "$ref": "#/$defs/PhysicalLimbIdentifier" },
304
+ "status": { "type": "string", "enum": ["degraded", "offline"] },
305
+ "reason": { "$ref": "#/$defs/PhysicalLimbReadinessReason" },
306
+ "observedAt": { "type": "string", "format": "date-time" }
307
+ },
308
+ "required": ["v", "nodeId", "status", "reason", "observedAt"],
309
+ "additionalProperties": false
310
+ },
311
+ "PhysicalLimbReadiness": {
312
+ "oneOf": [
313
+ { "$ref": "#/$defs/PhysicalLimbReadyReadiness" },
314
+ { "$ref": "#/$defs/PhysicalLimbUnavailableReadiness" }
315
+ ]
316
+ }
317
+ },
318
+ "$ref": "#/$defs/PhysicalLimbContribution"
319
+ }