@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
@@ -0,0 +1,26 @@
1
+ /**
2
+ * WireUInt53 — the single contract-owned numeric profile.
3
+ * Mechanized from the #1165 frozen shape.
4
+ *
5
+ * Raw JSON lexeme: canonical decimal digits 0|[1-9][0-9]*
6
+ * No sign, no decimal point, no exponent, no leading zeros.
7
+ * Raw token length ≤ 16 characters.
8
+ * Parsed value: non-negative safe integer.
9
+ */
10
+ /** Maximum safe integer (2^53 - 1). */
11
+ export declare const WIRE_UINT53_MAX: 9007199254740991;
12
+ /** Pattern for canonical decimal integer raw tokens. */
13
+ export declare const WIRE_UINT53_RAW_PATTERN: RegExp;
14
+ /** Maximum raw token length (digit count of 2^53-1). */
15
+ export declare const WIRE_UINT53_MAX_RAW_LENGTH: 16;
16
+ /**
17
+ * Validate a parsed number as a WireUInt53.
18
+ * Checks Number.isSafeInteger and non-negative.
19
+ */
20
+ export declare function isWireUInt53(value: number, min?: number, max?: number): boolean;
21
+ /**
22
+ * Validate a raw JSON token as a canonical WireUInt53 lexeme.
23
+ * Must be checked BEFORE JSON.parse (pre-dispatch).
24
+ */
25
+ export declare function isCanonicalUInt53Token(rawToken: string): boolean;
26
+ //# sourceMappingURL=wire-uint53.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire-uint53.d.ts","sourceRoot":"","sources":["../../src/wire/wire-uint53.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,uCAAuC;AACvC,eAAO,MAAM,eAAe,EAAG,gBAA8B,CAAC;AAE9D,wDAAwD;AACxD,eAAO,MAAM,uBAAuB,QAAwB,CAAC;AAE7D,wDAAwD;AACxD,eAAO,MAAM,0BAA0B,EAAG,EAAW,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAU,EAAE,GAAG,GAAE,MAAwB,GAAG,OAAO,CAEnG;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGhE"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * WireUInt53 — the single contract-owned numeric profile.
3
+ * Mechanized from the #1165 frozen shape.
4
+ *
5
+ * Raw JSON lexeme: canonical decimal digits 0|[1-9][0-9]*
6
+ * No sign, no decimal point, no exponent, no leading zeros.
7
+ * Raw token length ≤ 16 characters.
8
+ * Parsed value: non-negative safe integer.
9
+ */
10
+ /** Maximum safe integer (2^53 - 1). */
11
+ export const WIRE_UINT53_MAX = 9_007_199_254_740_991;
12
+ /** Pattern for canonical decimal integer raw tokens. */
13
+ export const WIRE_UINT53_RAW_PATTERN = /^(?:0|[1-9][0-9]*)$/;
14
+ /** Maximum raw token length (digit count of 2^53-1). */
15
+ export const WIRE_UINT53_MAX_RAW_LENGTH = 16;
16
+ /**
17
+ * Validate a parsed number as a WireUInt53.
18
+ * Checks Number.isSafeInteger and non-negative.
19
+ */
20
+ export function isWireUInt53(value, min = 0, max = WIRE_UINT53_MAX) {
21
+ return Number.isSafeInteger(value) && value >= min && value <= max;
22
+ }
23
+ /**
24
+ * Validate a raw JSON token as a canonical WireUInt53 lexeme.
25
+ * Must be checked BEFORE JSON.parse (pre-dispatch).
26
+ */
27
+ export function isCanonicalUInt53Token(rawToken) {
28
+ if (rawToken.length === 0 || rawToken.length > WIRE_UINT53_MAX_RAW_LENGTH)
29
+ return false;
30
+ return WIRE_UINT53_RAW_PATTERN.test(rawToken);
31
+ }
32
+ //# sourceMappingURL=wire-uint53.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire-uint53.js","sourceRoot":"","sources":["../../src/wire/wire-uint53.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,uCAAuC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,qBAA8B,CAAC;AAE9D,wDAAwD;AACxD,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE7D,wDAAwD;AACxD,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAW,CAAC;AAEtD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,MAAc,CAAC,EAAE,MAAc,eAAe;IACxF,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,0BAA0B;QAAE,OAAO,KAAK,CAAC;IACxF,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChD,CAAC"}
@@ -79,7 +79,7 @@
79
79
  "handles": {
80
80
  "foreignMessage": { "kind": "message_handle", "token": "message-handle-b", "ownerPluginInstanceId": "plugin-b", "threadId": "thread-1", "messageId": "message-1" }
81
81
  },
82
- "state": { "messages": [{ "messageId": "message-1", "revision": 1 }] }
82
+ "state": { "messages": [{ "messageId": "message-1", "threadId": "thread-1", "revision": 1 }] }
83
83
  },
84
84
  "when": {
85
85
  "operation": "appendElements",
@@ -141,7 +141,7 @@
141
141
  "handles": {
142
142
  "message": { "kind": "message_handle", "token": "message-handle-a", "ownerPluginInstanceId": "plugin-a", "threadId": "thread-1", "messageId": "message-1" }
143
143
  },
144
- "state": { "messages": [{ "messageId": "message-1", "revision": 2 }] }
144
+ "state": { "messages": [{ "messageId": "message-1", "threadId": "thread-1", "revision": 2 }] }
145
145
  },
146
146
  "when": {
147
147
  "operation": "appendElements",
@@ -253,7 +253,7 @@
253
253
  "handles": {
254
254
  "message": { "kind": "message_handle", "token": "message-handle-a", "ownerPluginInstanceId": "plugin-a", "threadId": "thread-1", "messageId": "message-1" }
255
255
  },
256
- "state": { "messages": [{ "messageId": "message-1", "revision": 1, "elements": [{ "elementId": "source-1", "epistemicStatus": "inference" }] }] }
256
+ "state": { "messages": [{ "messageId": "message-1", "threadId": "thread-1", "revision": 1, "elements": [{ "elementId": "source-1", "epistemicStatus": "inference" }] }] }
257
257
  },
258
258
  "when": {
259
259
  "operation": "appendElements",
@@ -357,7 +357,7 @@
357
357
  "handles": {
358
358
  "message": { "kind": "message_handle", "token": "message-handle-a", "ownerPluginInstanceId": "plugin-a", "threadId": "thread-1", "messageId": "message-1" }
359
359
  },
360
- "state": { "messages": [{ "messageId": "message-1", "revision": 1 }] }
360
+ "state": { "messages": [{ "messageId": "message-1", "threadId": "thread-1", "revision": 1 }] }
361
361
  },
362
362
  "when": {
363
363
  "operation": "appendElements",
@@ -456,7 +456,7 @@
456
456
  },
457
457
  "state": {
458
458
  "messages": [{ "messageId": "message-1", "threadId": "thread-1" }],
459
- "replayEvents": [{ "eventId": "event-1", "sequence": 1 }]
459
+ "replayEvents": [{ "eventId": "event-1", "subscriptionId": "subscription-a", "sequence": 1 }]
460
460
  }
461
461
  },
462
462
  "when": {
@@ -470,6 +470,57 @@
470
470
  { "target": "messages", "assertion": "unchanged" }
471
471
  ]
472
472
  }
473
+ },
474
+ {
475
+ "id": "snapshot-without-grant-rejected",
476
+ "invariant": "A subscription identifier cannot bypass the message.event.subscribe grant for snapshots.",
477
+ "given": {
478
+ "caller": { "pluginInstanceId": "plugin-a" },
479
+ "grants": [],
480
+ "handles": {
481
+ "subscription": { "kind": "subscription", "token": "subscription-token-a", "ownerPluginInstanceId": "plugin-a", "threadId": "thread-1", "subscriptionId": "subscription-a" }
482
+ },
483
+ "state": { "subscription": { "cursorSequence": 4 } }
484
+ },
485
+ "when": {
486
+ "operation": "snapshot",
487
+ "input": { "subscriptionId": "subscription-a" }
488
+ },
489
+ "expect": {
490
+ "status": "error",
491
+ "errorCode": "PERMISSION",
492
+ "sideEffects": [
493
+ { "target": "snapshot", "assertion": "none" },
494
+ { "target": "subscription", "assertion": "unchanged" }
495
+ ]
496
+ }
497
+ },
498
+ {
499
+ "id": "foreign-replay-delete-rejected",
500
+ "invariant": "A caller cannot delete another plugin instance's subscription replay buffer.",
501
+ "given": {
502
+ "caller": { "pluginInstanceId": "plugin-b" },
503
+ "grants": ["message.event.subscribe"],
504
+ "handles": {
505
+ "subscription": { "kind": "subscription", "token": "subscription-token-a", "ownerPluginInstanceId": "plugin-a", "threadId": "thread-1", "subscriptionId": "subscription-a" }
506
+ },
507
+ "state": {
508
+ "messages": [{ "messageId": "message-1", "threadId": "thread-1" }],
509
+ "replayEvents": [{ "eventId": "event-1", "subscriptionId": "subscription-a", "sequence": 1 }]
510
+ }
511
+ },
512
+ "when": {
513
+ "operation": "deleteReplayEvents",
514
+ "input": { "subscriptionId": "subscription-a", "throughSequence": 1 }
515
+ },
516
+ "expect": {
517
+ "status": "error",
518
+ "errorCode": "PERMISSION",
519
+ "sideEffects": [
520
+ { "target": "replay_events", "assertion": "unchanged" },
521
+ { "target": "messages", "assertion": "unchanged" }
522
+ ]
523
+ }
473
524
  }
474
525
  ]
475
526
  }
@@ -0,0 +1,33 @@
1
+ {
2
+ "pluginId": "example.duplicate-signal",
3
+ "version": "1.0.0",
4
+ "contractVersion": "0.1.0",
5
+ "name": "Duplicate Signal Type",
6
+ "features": [
7
+ {
8
+ "id": "meeting-intake",
9
+ "name": "Meeting intake",
10
+ "resources": [],
11
+ "capabilities": ["events.publish"]
12
+ }
13
+ ],
14
+ "signals": {
15
+ "provides": [
16
+ {
17
+ "type": "feishu.meeting_artifact.generated.v1",
18
+ "schemaRef": "schemas/meeting-a.schema.json",
19
+ "epistemicStatus": "observation",
20
+ "privacyClass": "content-adjacent",
21
+ "sourceClass": "remote-service"
22
+ },
23
+ {
24
+ "type": "feishu.meeting_artifact.generated.v1",
25
+ "schemaRef": "schemas/meeting-b.schema.json",
26
+ "epistemicStatus": "inference",
27
+ "privacyClass": "content",
28
+ "sourceClass": "remote-service"
29
+ }
30
+ ]
31
+ },
32
+ "runtime": { "transport": "builtin" }
33
+ }
@@ -18,7 +18,7 @@
18
18
  "audience": {
19
19
  "kind": "public"
20
20
  },
21
- "occurredAt": "2026-07-15T02:42:00Z",
21
+ "occurredAt": "2026-07-15T02:42:00.000Z",
22
22
  "payload": {
23
23
  "provenance": {
24
24
  "origin": {
@@ -0,0 +1,15 @@
1
+ {
2
+ "_meta": {
3
+ "schemaRef": "EventsPublishInput"
4
+ },
5
+ "signalType": "feishu.meeting_artifact.generated.v1",
6
+ "eventId": "feishu-minute-om_abc123-v7",
7
+ "idempotencyKey": "feishu:minute:om_abc123:7",
8
+ "occurredAt": "2026-08-09T04:12:31Z",
9
+ "payload": {
10
+ "artifactId": "om_abc123"
11
+ },
12
+ "destination": {
13
+ "threadId": "thread_user_selected"
14
+ }
15
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "_meta": {
3
+ "schemaRef": "SignalDeclaration"
4
+ },
5
+ "type": "feishu.meeting_artifact.generated.v1",
6
+ "schemaRef": "https://attacker.example/schemas/meeting.json",
7
+ "epistemicStatus": "observation",
8
+ "privacyClass": "content-adjacent",
9
+ "sourceClass": "remote-service"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "_meta": {
3
+ "schemaRef": "SignalDeclaration"
4
+ },
5
+ "type": "local.microphone.frame.v1",
6
+ "schemaRef": "schemas/microphone-frame.schema.json",
7
+ "epistemicStatus": "observation",
8
+ "privacyClass": "av-raw",
9
+ "sourceClass": "os-metadata"
10
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "_meta": {
3
+ "schemaRef": "EventsPublishInput"
4
+ },
5
+ "signalType": "feishu.meeting_artifact.generated.v1",
6
+ "eventId": "feishu-minute-om_abc123-v7",
7
+ "idempotencyKey": "feishu:minute:om_abc123:7",
8
+ "occurredAt": "2026-08-09T12:12:31+08:00",
9
+ "payload": {
10
+ "artifactId": "om_abc123"
11
+ }
12
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "_meta": {
3
+ "schemaRef": "EventsPublishInput"
4
+ },
5
+ "signalType": "feishu.meeting_artifact.generated.v1",
6
+ "eventId": "feishu-minute-om_abc123-v7",
7
+ "idempotencyKey": "feishu:minute:om_abc123:7",
8
+ "occurredAt": "2026-08-09T04:12:31Z",
9
+ "payload": {
10
+ "artifactId": "om_abc123",
11
+ "artifactKind": "minute",
12
+ "revision": "7",
13
+ "title": "F292 design review"
14
+ },
15
+ "source": {
16
+ "handle": "feishu://meeting-artifacts/minute/om_abc123?revision=7"
17
+ }
18
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "_meta": {
3
+ "schemaRef": "SignalDeclaration"
4
+ },
5
+ "type": "feishu.meeting_artifact.generated.v1",
6
+ "schemaRef": "schemas/feishu-meeting-artifact.schema.json",
7
+ "epistemicStatus": "observation",
8
+ "privacyClass": "content-adjacent",
9
+ "sourceClass": "remote-service"
10
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clowder-ai/plugin-contract",
3
- "version": "0.1.0-beta.1",
3
+ "version": "0.1.0-beta.11",
4
4
  "private": false,
5
5
  "description": "Clowder AI plugin contract — the single machine-readable truth source for plugin schema, types, capability table, and conformance fixtures (P15)",
6
6
  "license": "MIT",
@@ -10,9 +10,16 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
12
  },
13
+ "./conformance": {
14
+ "types": "./dist/conformance/index.d.ts",
15
+ "import": "./dist/conformance/index.js"
16
+ },
13
17
  "./schemas/messaging": "./src/schemas/messaging.schema.json",
14
18
  "./schemas/manifest": "./src/schemas/manifest.schema.json",
15
- "./schemas/behavior-fixture": "./src/schemas/behavior-fixture.schema.json"
19
+ "./schemas/signals": "./src/schemas/signal.schema.json",
20
+ "./schemas/physical-limb": "./src/schemas/physical-limb.schema.json",
21
+ "./schemas/behavior-fixture": "./src/schemas/behavior-fixture.schema.json",
22
+ "./fixtures/behavior/messaging/adversarial-invariants": "./fixtures/behavior/messaging/adversarial-invariants.json"
16
23
  },
17
24
  "main": "./dist/index.js",
18
25
  "types": "./dist/index.d.ts",
@@ -27,9 +34,9 @@
27
34
  "scripts": {
28
35
  "generate": "node --import tsx src/codegen/generate-contract.ts",
29
36
  "generate:check": "node --import tsx src/codegen/generate-contract.ts --check",
30
- "build": "pnpm clean && tsc -p tsconfig.build.json",
37
+ "build": "pnpm clean && tsc -p tsconfig.build.json && node --test scripts/conformance-public-boundary.test.mjs",
31
38
  "typecheck": "tsc --noEmit",
32
- "test": "node --import tsx --test src/**/*.test.ts",
39
+ "test": "node --import tsx --test src/**/*.test.ts src/**/**/*.test.ts",
33
40
  "conformance": "node --import tsx src/conformance/runner.ts",
34
41
  "lint": "tsc --noEmit",
35
42
  "clean": "rm -rf dist",
@@ -37,11 +44,13 @@
37
44
  },
38
45
  "devDependencies": {
39
46
  "@types/node": "^20.17.0",
40
- "ajv": "^8.17.0",
41
- "ajv-formats": "^3.0.0",
42
47
  "tsx": "^4.19.0",
43
48
  "typescript": "^5.7.0"
44
49
  },
50
+ "dependencies": {
51
+ "ajv": "^8.17.0",
52
+ "ajv-formats": "^3.0.0"
53
+ },
45
54
  "publishConfig": {
46
55
  "access": "public"
47
56
  },
@@ -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 plugin manifest (§3.4/§3.5). beta.9 adds the C-2 declared-signal contribution while schedule/state (C-3) remain future contract deltas.",
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"],
@@ -179,7 +179,10 @@
179
179
  "type": "array",
180
180
  "items": { "$ref": "#/$defs/DataDeclaration" }
181
181
  },
182
- "runtime": { "$ref": "#/$defs/RuntimeDeclaration" }
182
+ "runtime": { "$ref": "#/$defs/RuntimeDeclaration" },
183
+ "signals": {
184
+ "$ref": "https://clowder-ai.dev/schemas/signals/v0.2#/$defs/SignalContribution"
185
+ }
183
186
  },
184
187
  "required": ["pluginId", "version", "contractVersion", "name", "features", "runtime"],
185
188
  "additionalProperties": false