@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.
- package/dist/codegen/generate-contract.d.ts +5 -0
- package/dist/codegen/generate-contract.d.ts.map +1 -1
- package/dist/codegen/generate-contract.js +45 -4
- package/dist/codegen/generate-contract.js.map +1 -1
- package/dist/conformance/behavior-executor.d.ts +18 -0
- package/dist/conformance/behavior-executor.d.ts.map +1 -0
- package/dist/conformance/behavior-executor.js +52 -0
- package/dist/conformance/behavior-executor.js.map +1 -0
- package/dist/conformance/fixtures.d.ts +11 -0
- package/dist/conformance/fixtures.d.ts.map +1 -0
- package/dist/conformance/fixtures.js +9 -0
- package/dist/conformance/fixtures.js.map +1 -0
- package/dist/conformance/index.d.ts +6 -0
- package/dist/conformance/index.d.ts.map +1 -1
- package/dist/conformance/index.js +5 -0
- package/dist/conformance/index.js.map +1 -1
- package/dist/conformance/messaging-behavior-fixture.d.ts +12 -0
- package/dist/conformance/messaging-behavior-fixture.d.ts.map +1 -0
- package/dist/conformance/messaging-behavior-fixture.js +30 -0
- package/dist/conformance/messaging-behavior-fixture.js.map +1 -0
- package/dist/conformance/messaging-loopback-adapter.d.ts +23 -0
- package/dist/conformance/messaging-loopback-adapter.d.ts.map +1 -0
- package/dist/conformance/messaging-loopback-adapter.js +389 -0
- package/dist/conformance/messaging-loopback-adapter.js.map +1 -0
- package/dist/conformance/messaging-loopback-state.d.ts +22 -0
- package/dist/conformance/messaging-loopback-state.d.ts.map +1 -0
- package/dist/conformance/messaging-loopback-state.js +101 -0
- package/dist/conformance/messaging-loopback-state.js.map +1 -0
- package/dist/conformance/runner.d.ts +18 -1
- package/dist/conformance/runner.d.ts.map +1 -1
- package/dist/conformance/runner.js +153 -66
- package/dist/conformance/runner.js.map +1 -1
- package/dist/conformance/stdio-harness/child-process-harness.d.ts +65 -0
- package/dist/conformance/stdio-harness/child-process-harness.d.ts.map +1 -0
- package/dist/conformance/stdio-harness/child-process-harness.js +296 -0
- package/dist/conformance/stdio-harness/child-process-harness.js.map +1 -0
- package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts +26 -0
- package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts.map +1 -0
- package/dist/conformance/stdio-harness/dual-transport-oracle.js +32 -0
- package/dist/conformance/stdio-harness/dual-transport-oracle.js.map +1 -0
- package/dist/conformance/stdio-harness/harness-process-spawn.d.ts +27 -0
- package/dist/conformance/stdio-harness/harness-process-spawn.d.ts.map +1 -0
- package/dist/conformance/stdio-harness/harness-process-spawn.js +43 -0
- package/dist/conformance/stdio-harness/harness-process-spawn.js.map +1 -0
- package/dist/conformance/stdio-harness/index.d.ts +5 -0
- package/dist/conformance/stdio-harness/index.d.ts.map +1 -0
- package/dist/conformance/stdio-harness/index.js +4 -0
- package/dist/conformance/stdio-harness/index.js.map +1 -0
- package/dist/conformance/stdio-harness/ndjson-frame.d.ts +31 -0
- package/dist/conformance/stdio-harness/ndjson-frame.d.ts.map +1 -0
- package/dist/conformance/stdio-harness/ndjson-frame.js +125 -0
- package/dist/conformance/stdio-harness/ndjson-frame.js.map +1 -0
- package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts +15 -0
- package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts.map +1 -0
- package/dist/conformance/stdio-harness/node-process-tree-runtime.js +78 -0
- package/dist/conformance/stdio-harness/node-process-tree-runtime.js.map +1 -0
- package/dist/conformance/stdio-harness/process-tree-controller.d.ts +51 -0
- package/dist/conformance/stdio-harness/process-tree-controller.d.ts.map +1 -0
- package/dist/conformance/stdio-harness/process-tree-controller.js +162 -0
- package/dist/conformance/stdio-harness/process-tree-controller.js.map +1 -0
- package/dist/conformance/stdio-harness/windows-sentinel.d.ts +15 -0
- package/dist/conformance/stdio-harness/windows-sentinel.d.ts.map +1 -0
- package/dist/conformance/stdio-harness/windows-sentinel.js +160 -0
- package/dist/conformance/stdio-harness/windows-sentinel.js.map +1 -0
- package/dist/conformance/stdio-harness/wire-shape.d.ts +18 -0
- package/dist/conformance/stdio-harness/wire-shape.d.ts.map +1 -0
- package/dist/conformance/stdio-harness/wire-shape.js +2 -0
- package/dist/conformance/stdio-harness/wire-shape.js.map +1 -0
- package/dist/generated/contract.generated.d.ts +370 -4
- package/dist/generated/contract.generated.d.ts.map +1 -1
- package/dist/generated/contract.generated.js +7 -1
- package/dist/generated/contract.generated.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/validation/index.d.ts +3 -0
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +3 -0
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/manifest.d.ts +23 -0
- package/dist/validation/manifest.d.ts.map +1 -0
- package/dist/validation/manifest.js +53 -0
- package/dist/validation/manifest.js.map +1 -0
- package/dist/validation/messaging-semantic.d.ts.map +1 -1
- package/dist/validation/messaging-semantic.js +49 -0
- package/dist/validation/messaging-semantic.js.map +1 -1
- package/dist/validation/messaging-wire.d.ts +38 -0
- package/dist/validation/messaging-wire.d.ts.map +1 -0
- package/dist/validation/messaging-wire.js +164 -0
- package/dist/validation/messaging-wire.js.map +1 -0
- package/dist/validation/signals.d.ts +26 -0
- package/dist/validation/signals.d.ts.map +1 -0
- package/dist/validation/signals.js +206 -0
- package/dist/validation/signals.js.map +1 -0
- package/dist/wire/constants.d.ts +36 -0
- package/dist/wire/constants.d.ts.map +1 -0
- package/dist/wire/constants.js +36 -0
- package/dist/wire/constants.js.map +1 -0
- package/dist/wire/disposition-fixtures.d.ts +118 -0
- package/dist/wire/disposition-fixtures.d.ts.map +1 -0
- package/dist/wire/disposition-fixtures.js +1881 -0
- package/dist/wire/disposition-fixtures.js.map +1 -0
- package/dist/wire/disposition.d.ts +102 -0
- package/dist/wire/disposition.d.ts.map +1 -0
- package/dist/wire/disposition.js +217 -0
- package/dist/wire/disposition.js.map +1 -0
- package/dist/wire/envelope.d.ts +253 -0
- package/dist/wire/envelope.d.ts.map +1 -0
- package/dist/wire/envelope.js +19 -0
- package/dist/wire/envelope.js.map +1 -0
- package/dist/wire/errors.d.ts +222 -0
- package/dist/wire/errors.d.ts.map +1 -0
- package/dist/wire/errors.js +153 -0
- package/dist/wire/errors.js.map +1 -0
- package/dist/wire/grants.d.ts +57 -0
- package/dist/wire/grants.d.ts.map +1 -0
- package/dist/wire/grants.js +59 -0
- package/dist/wire/grants.js.map +1 -0
- package/dist/wire/handshake-byte-bounds.d.ts +69 -0
- package/dist/wire/handshake-byte-bounds.d.ts.map +1 -0
- package/dist/wire/handshake-byte-bounds.js +173 -0
- package/dist/wire/handshake-byte-bounds.js.map +1 -0
- package/dist/wire/handshake.d.ts +146 -0
- package/dist/wire/handshake.d.ts.map +1 -0
- package/dist/wire/handshake.js +189 -0
- package/dist/wire/handshake.js.map +1 -0
- package/dist/wire/index.d.ts +37 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +61 -0
- package/dist/wire/index.js.map +1 -0
- package/dist/wire/lifecycle-byte-bounds.d.ts +55 -0
- package/dist/wire/lifecycle-byte-bounds.d.ts.map +1 -0
- package/dist/wire/lifecycle-byte-bounds.js +209 -0
- package/dist/wire/lifecycle-byte-bounds.js.map +1 -0
- package/dist/wire/messaging-byte-bounds.d.ts +61 -0
- package/dist/wire/messaging-byte-bounds.d.ts.map +1 -0
- package/dist/wire/messaging-byte-bounds.js +459 -0
- package/dist/wire/messaging-byte-bounds.js.map +1 -0
- package/dist/wire/registry.d.ts +294 -0
- package/dist/wire/registry.d.ts.map +1 -0
- package/dist/wire/registry.js +256 -0
- package/dist/wire/registry.js.map +1 -0
- package/dist/wire/request-id.d.ts +34 -0
- package/dist/wire/request-id.d.ts.map +1 -0
- package/dist/wire/request-id.js +40 -0
- package/dist/wire/request-id.js.map +1 -0
- package/dist/wire/row-shapes.d.ts +217 -0
- package/dist/wire/row-shapes.d.ts.map +1 -0
- package/dist/wire/row-shapes.js +75 -0
- package/dist/wire/row-shapes.js.map +1 -0
- package/dist/wire/signal-byte-bounds.d.ts +97 -0
- package/dist/wire/signal-byte-bounds.d.ts.map +1 -0
- package/dist/wire/signal-byte-bounds.js +229 -0
- package/dist/wire/signal-byte-bounds.js.map +1 -0
- package/dist/wire/wire-uint53.d.ts +26 -0
- package/dist/wire/wire-uint53.d.ts.map +1 -0
- package/dist/wire/wire-uint53.js +32 -0
- package/dist/wire/wire-uint53.js.map +1 -0
- package/fixtures/behavior/messaging/adversarial-invariants.json +56 -5
- package/fixtures/manifest/invalid/duplicate-signal-type.json +33 -0
- package/fixtures/messaging/valid/subscription-delivery.json +1 -1
- package/fixtures/signals/invalid/destination-injection.json +15 -0
- package/fixtures/signals/invalid/dynamic-schema-url.json +10 -0
- package/fixtures/signals/invalid/forbidden-raw-privacy.json +10 -0
- package/fixtures/signals/invalid/non-utc-occurred-at.json +12 -0
- package/fixtures/signals/valid/feishu-meeting-artifact.json +18 -0
- package/fixtures/signals/valid/remote-service-declaration.json +10 -0
- package/package.json +15 -6
- package/src/schemas/manifest.schema.json +5 -2
- package/src/schemas/messaging.schema.json +209 -32
- package/src/schemas/physical-limb.schema.json +319 -0
- 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
|
+
}
|
|
@@ -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,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.
|
|
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/
|
|
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).
|
|
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
|