@clowder-ai/plugin-contract 0.1.0-beta.1 → 0.1.0-beta.10
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 +9 -0
- package/dist/conformance/fixtures.d.ts.map +1 -0
- package/dist/conformance/fixtures.js +8 -0
- package/dist/conformance/fixtures.js.map +1 -0
- package/dist/conformance/index.d.ts +5 -0
- package/dist/conformance/index.d.ts.map +1 -1
- package/dist/conformance/index.js +4 -0
- package/dist/conformance/index.js.map +1 -1
- 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 +305 -1
- package/dist/generated/contract.generated.d.ts.map +1 -1
- package/dist/generated/contract.generated.js +1 -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 +2 -0
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +2 -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/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 +110 -0
- package/dist/wire/disposition-fixtures.d.ts.map +1 -0
- package/dist/wire/disposition-fixtures.js +1462 -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 +35 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +53 -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/registry.d.ts +283 -0
- package/dist/wire/registry.d.ts.map +1 -0
- package/dist/wire/registry.js +258 -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 +212 -0
- package/dist/wire/row-shapes.d.ts.map +1 -0
- package/dist/wire/row-shapes.js +59 -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/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 +13 -5
- package/src/schemas/manifest.schema.json +5 -2
- package/src/schemas/messaging.schema.json +1 -0
- package/src/schemas/physical-limb.schema.json +319 -0
- package/src/schemas/signal.schema.json +129 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derived compact-JSON byte bounds for the beta.9 C-2 events.publish row.
|
|
3
|
+
*
|
|
4
|
+
* Signal payloads are bounded by their compact encoded byte length, not by a
|
|
5
|
+
* string code-point count. That makes the generic leaf proof insufficient for
|
|
6
|
+
* row 13: this module constructs an exactly 64 KiB JSON object independently
|
|
7
|
+
* for ASCII, multibyte, and escaped-string families, then measures the entire
|
|
8
|
+
* request envelope and one rejected N+1 witness for every bounded leaf.
|
|
9
|
+
*/
|
|
10
|
+
import type { EventsPublishInput, EventsPublishResult } from '../generated/contract.generated.js';
|
|
11
|
+
export declare const EVENTS_PUBLISH_BYTE_PROOF_ENCODING_FAMILIES: readonly ["ascii", "multibyte", "escaping"];
|
|
12
|
+
export type EventsPublishByteProofEncodingFamily = (typeof EVENTS_PUBLISH_BYTE_PROOF_ENCODING_FAMILIES)[number];
|
|
13
|
+
export declare const SIGNAL_TYPE_MAX_LENGTH: 128;
|
|
14
|
+
export declare const SIGNAL_EVENT_ID_MAX_LENGTH: 128;
|
|
15
|
+
export declare const SIGNAL_IDEMPOTENCY_KEY_MAX_LENGTH: 256;
|
|
16
|
+
export declare const SIGNAL_OCCURRED_AT_MAX_LENGTH: 30;
|
|
17
|
+
export declare const SIGNAL_SOURCE_HANDLE_MAX_LENGTH: 512;
|
|
18
|
+
interface EventsPublishProofInput {
|
|
19
|
+
readonly requestId: string;
|
|
20
|
+
readonly input: EventsPublishInput;
|
|
21
|
+
readonly payloadEncodedBytes: number;
|
|
22
|
+
}
|
|
23
|
+
export interface EventsPublishNPlusOneWitness extends EventsPublishProofInput {
|
|
24
|
+
readonly leaf: 'requestId' | 'signalType' | 'eventId' | 'idempotencyKey' | 'occurredAt' | 'payloadBytes' | 'sourceHandle';
|
|
25
|
+
readonly encodedBytes: number;
|
|
26
|
+
readonly fitsFrame: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface EventsPublishEncodedByteProofCase {
|
|
29
|
+
readonly family: EventsPublishByteProofEncodingFamily;
|
|
30
|
+
readonly encodedBytes: number;
|
|
31
|
+
readonly fitsFrame: boolean;
|
|
32
|
+
readonly nPlusOne: readonly {
|
|
33
|
+
readonly leaf: string;
|
|
34
|
+
readonly encodedBytes: number;
|
|
35
|
+
readonly fitsFrame: boolean;
|
|
36
|
+
}[];
|
|
37
|
+
}
|
|
38
|
+
export interface EventsPublishEncodedByteProof {
|
|
39
|
+
readonly maxEncodedBytes: number;
|
|
40
|
+
readonly cases: readonly EventsPublishEncodedByteProofCase[];
|
|
41
|
+
}
|
|
42
|
+
export interface EventsPublishRowEncodedByteBounds {
|
|
43
|
+
readonly maxEncodedRequestBytes: number;
|
|
44
|
+
readonly maxEncodedResultBytes: number;
|
|
45
|
+
readonly maxEncodedErrorBytes: number;
|
|
46
|
+
}
|
|
47
|
+
export declare function eventsPublishMaximumInput(family: EventsPublishByteProofEncodingFamily): EventsPublishProofInput;
|
|
48
|
+
export declare function eventsPublishNPlusOneInputs(family: EventsPublishByteProofEncodingFamily): readonly EventsPublishNPlusOneWitness[];
|
|
49
|
+
export declare function eventsPublishMaximumResult(): {
|
|
50
|
+
readonly requestId: string;
|
|
51
|
+
readonly result: EventsPublishResult;
|
|
52
|
+
};
|
|
53
|
+
export declare function eventsPublishResultNPlusOneWitnesses(): readonly [{
|
|
54
|
+
readonly leaf: "requestId";
|
|
55
|
+
readonly requestId: string;
|
|
56
|
+
readonly result: EventsPublishResult;
|
|
57
|
+
}, {
|
|
58
|
+
readonly leaf: "publicationId";
|
|
59
|
+
readonly result: {
|
|
60
|
+
readonly publicationId: string;
|
|
61
|
+
readonly disposition: import("../generated/contract.generated.js").EventsPublishDisposition;
|
|
62
|
+
};
|
|
63
|
+
readonly requestId: string;
|
|
64
|
+
}];
|
|
65
|
+
export declare function eventsPublishStandardErrorEnvelopes(): ({
|
|
66
|
+
arm: string;
|
|
67
|
+
id: null;
|
|
68
|
+
error: {
|
|
69
|
+
code: -32700 | -32600 | -32601 | -32602 | -32603;
|
|
70
|
+
message: "Parse error" | "Invalid Request" | "Method not found" | "Invalid params" | "Internal error";
|
|
71
|
+
};
|
|
72
|
+
} | {
|
|
73
|
+
arm: string;
|
|
74
|
+
id: string;
|
|
75
|
+
error: {
|
|
76
|
+
code: -32700 | -32600 | -32601 | -32602 | -32603;
|
|
77
|
+
message: "Parse error" | "Invalid Request" | "Method not found" | "Invalid params" | "Internal error";
|
|
78
|
+
};
|
|
79
|
+
})[];
|
|
80
|
+
export declare function eventsPublishStandardErrorNPlusOneWitnesses(): {
|
|
81
|
+
id: string;
|
|
82
|
+
arm: string;
|
|
83
|
+
error: {
|
|
84
|
+
code: -32700 | -32600 | -32601 | -32602 | -32603;
|
|
85
|
+
message: "Parse error" | "Invalid Request" | "Method not found" | "Invalid params" | "Internal error";
|
|
86
|
+
};
|
|
87
|
+
}[];
|
|
88
|
+
export declare const EVENTS_PUBLISH_REQUEST_BYTE_PROOF: EventsPublishEncodedByteProof;
|
|
89
|
+
export declare const EVENTS_PUBLISH_RESULT_BYTE_PROOF: EventsPublishEncodedByteProof;
|
|
90
|
+
export declare const EVENTS_PUBLISH_ERROR_BYTE_PROOF: EventsPublishEncodedByteProof;
|
|
91
|
+
export declare const EVENTS_PUBLISH_ROW_ENCODED_BYTE_BOUNDS: {
|
|
92
|
+
readonly maxEncodedRequestBytes: number;
|
|
93
|
+
readonly maxEncodedResultBytes: number;
|
|
94
|
+
readonly maxEncodedErrorBytes: number;
|
|
95
|
+
};
|
|
96
|
+
export {};
|
|
97
|
+
//# sourceMappingURL=signal-byte-bounds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-byte-bounds.d.ts","sourceRoot":"","sources":["../../src/wire/signal-byte-bounds.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,oCAAoC,CAAC;AAY5C,eAAO,MAAM,2CAA2C,6CAI9C,CAAC;AAEX,MAAM,MAAM,oCAAoC,GAC9C,CAAC,OAAO,2CAA2C,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,eAAO,MAAM,sBAAsB,EAAG,GAAY,CAAC;AACnD,eAAO,MAAM,0BAA0B,EAAG,GAAY,CAAC;AACvD,eAAO,MAAM,iCAAiC,EAAG,GAAY,CAAC;AAC9D,eAAO,MAAM,6BAA6B,EAAG,EAAW,CAAC;AACzD,eAAO,MAAM,+BAA+B,EAAG,GAAY,CAAC;AAI5D,UAAU,uBAAuB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,QAAQ,CAAC,IAAI,EACT,WAAW,GACX,YAAY,GACZ,SAAS,GACT,gBAAgB,GAChB,YAAY,GACZ,cAAc,GACd,cAAc,CAAC;IACnB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,MAAM,EAAE,oCAAoC,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;KAC7B,EAAE,CAAC;CACL;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,iCAAiC,EAAE,CAAC;CAC9D;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAwED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,oCAAoC,GAC3C,uBAAuB,CAOzB;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,oCAAoC,GAC3C,SAAS,4BAA4B,EAAE,CAuDzC;AA6BD,wBAAgB,0BAA0B,IAAI;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;CACtC,CAKA;AAED,wBAAgB,oCAAoC;;;qBARjC,mBAAmB;;;;;;;wBADhB,MAAM;GAmB3B;AAED,wBAAgB,mCAAmC;;;;;;;;;;;;;;KAWlD;AAED,wBAAgB,2CAA2C;;;;;;;IAI1D;AAoBD,eAAO,MAAM,iCAAiC,+BAAiB,CAAC;AAGhE,eAAO,MAAM,gCAAgC,+BAM5C,CAAC;AAEF,eAAO,MAAM,+BAA+B,+BAO3C,CAAC;AAEF,eAAO,MAAM,sCAAsC;;;;CAIG,CAAC"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derived compact-JSON byte bounds for the beta.9 C-2 events.publish row.
|
|
3
|
+
*
|
|
4
|
+
* Signal payloads are bounded by their compact encoded byte length, not by a
|
|
5
|
+
* string code-point count. That makes the generic leaf proof insufficient for
|
|
6
|
+
* row 13: this module constructs an exactly 64 KiB JSON object independently
|
|
7
|
+
* for ASCII, multibyte, and escaped-string families, then measures the entire
|
|
8
|
+
* request envelope and one rejected N+1 witness for every bounded leaf.
|
|
9
|
+
*/
|
|
10
|
+
import { SIGNAL_PAYLOAD_MAX_ENCODED_BYTES } from '../validation/signals.js';
|
|
11
|
+
import { MAX_FRAME_BYTES } from './constants.js';
|
|
12
|
+
import { ERROR_CODE_TO_MESSAGE, INVALID_REQUEST_CODE, PARSE_ERROR_CODE, STANDARD_ERROR_CODES, } from './errors.js';
|
|
13
|
+
import { REQUEST_ID_MAX_LENGTH } from './request-id.js';
|
|
14
|
+
import { WIRE_UINT53_MAX } from './wire-uint53.js';
|
|
15
|
+
export const EVENTS_PUBLISH_BYTE_PROOF_ENCODING_FAMILIES = [
|
|
16
|
+
'ascii',
|
|
17
|
+
'multibyte',
|
|
18
|
+
'escaping',
|
|
19
|
+
];
|
|
20
|
+
export const SIGNAL_TYPE_MAX_LENGTH = 128;
|
|
21
|
+
export const SIGNAL_EVENT_ID_MAX_LENGTH = 128;
|
|
22
|
+
export const SIGNAL_IDEMPOTENCY_KEY_MAX_LENGTH = 256;
|
|
23
|
+
export const SIGNAL_OCCURRED_AT_MAX_LENGTH = 30;
|
|
24
|
+
export const SIGNAL_SOURCE_HANDLE_MAX_LENGTH = 512;
|
|
25
|
+
const MAX_OCCURRED_AT = '2026-08-09T04:12:31.123456789Z';
|
|
26
|
+
function byteLength(value) {
|
|
27
|
+
return Buffer.byteLength(JSON.stringify(value), 'utf8');
|
|
28
|
+
}
|
|
29
|
+
function familyCharacter(family) {
|
|
30
|
+
switch (family) {
|
|
31
|
+
case 'ascii':
|
|
32
|
+
return 'a';
|
|
33
|
+
case 'multibyte':
|
|
34
|
+
return '😀';
|
|
35
|
+
case 'escaping':
|
|
36
|
+
// Quote is admissible in idempotency/source handles and requires JSON
|
|
37
|
+
// escaping. Control characters would be a larger escape but are forbidden
|
|
38
|
+
// by those leaf grammars, so using them would not prove a legal maximum.
|
|
39
|
+
return '"';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function exactPayload(family, extraBytes = 0) {
|
|
43
|
+
const targetBytes = SIGNAL_PAYLOAD_MAX_ENCODED_BYTES + extraBytes;
|
|
44
|
+
const dataCharacter = family === 'escaping' ? '\u0000' : familyCharacter(family);
|
|
45
|
+
const empty = { data: '', pad: '' };
|
|
46
|
+
const staticBytes = byteLength(empty);
|
|
47
|
+
const unitBytes = byteLength({ data: dataCharacter, pad: '' }) - staticBytes;
|
|
48
|
+
const repetitions = Math.floor((targetBytes - staticBytes) / unitBytes);
|
|
49
|
+
const data = dataCharacter.repeat(repetitions);
|
|
50
|
+
const usedBytes = byteLength({ data, pad: '' });
|
|
51
|
+
const payload = { data, pad: 'a'.repeat(targetBytes - usedBytes) };
|
|
52
|
+
if (byteLength(payload) !== targetBytes) {
|
|
53
|
+
throw new Error(`failed to construct exact ${targetBytes}-byte signal payload`);
|
|
54
|
+
}
|
|
55
|
+
return payload;
|
|
56
|
+
}
|
|
57
|
+
function signalType(length = SIGNAL_TYPE_MAX_LENGTH) {
|
|
58
|
+
return `a.${'a'.repeat(length - 2)}`;
|
|
59
|
+
}
|
|
60
|
+
function inputFor(family, overrides = {}, payloadExtraBytes = 0) {
|
|
61
|
+
const character = familyCharacter(family);
|
|
62
|
+
return {
|
|
63
|
+
signalType: signalType(),
|
|
64
|
+
eventId: 'a'.repeat(SIGNAL_EVENT_ID_MAX_LENGTH),
|
|
65
|
+
idempotencyKey: character.repeat(SIGNAL_IDEMPOTENCY_KEY_MAX_LENGTH),
|
|
66
|
+
occurredAt: MAX_OCCURRED_AT,
|
|
67
|
+
payload: exactPayload(family, payloadExtraBytes),
|
|
68
|
+
source: { handle: character.repeat(SIGNAL_SOURCE_HANDLE_MAX_LENGTH) },
|
|
69
|
+
...overrides,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function requestFrame(requestId, input) {
|
|
73
|
+
return {
|
|
74
|
+
jsonrpc: '2.0',
|
|
75
|
+
id: requestId,
|
|
76
|
+
method: 'events.publish',
|
|
77
|
+
params: {
|
|
78
|
+
meta: { deadlineUnixMs: WIRE_UINT53_MAX },
|
|
79
|
+
input,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function eventsPublishMaximumInput(family) {
|
|
84
|
+
const input = inputFor(family);
|
|
85
|
+
return {
|
|
86
|
+
requestId: 'a'.repeat(REQUEST_ID_MAX_LENGTH),
|
|
87
|
+
input,
|
|
88
|
+
payloadEncodedBytes: byteLength(input.payload),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function eventsPublishNPlusOneInputs(family) {
|
|
92
|
+
const maximum = eventsPublishMaximumInput(family);
|
|
93
|
+
const character = familyCharacter(family);
|
|
94
|
+
const occurredAtNPlusOne = `${MAX_OCCURRED_AT.slice(0, -1)}0Z`;
|
|
95
|
+
const candidates = [
|
|
96
|
+
{
|
|
97
|
+
leaf: 'requestId',
|
|
98
|
+
requestId: 'a'.repeat(REQUEST_ID_MAX_LENGTH + 1),
|
|
99
|
+
input: maximum.input,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
leaf: 'signalType',
|
|
103
|
+
input: inputFor(family, { signalType: signalType(SIGNAL_TYPE_MAX_LENGTH + 1) }),
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
leaf: 'eventId',
|
|
107
|
+
input: inputFor(family, { eventId: 'a'.repeat(SIGNAL_EVENT_ID_MAX_LENGTH + 1) }),
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
leaf: 'idempotencyKey',
|
|
111
|
+
input: inputFor(family, {
|
|
112
|
+
idempotencyKey: character.repeat(SIGNAL_IDEMPOTENCY_KEY_MAX_LENGTH + 1),
|
|
113
|
+
}),
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
leaf: 'occurredAt',
|
|
117
|
+
input: inputFor(family, { occurredAt: occurredAtNPlusOne }),
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
leaf: 'payloadBytes',
|
|
121
|
+
input: inputFor(family, {}, 1),
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
leaf: 'sourceHandle',
|
|
125
|
+
input: inputFor(family, {
|
|
126
|
+
source: { handle: character.repeat(SIGNAL_SOURCE_HANDLE_MAX_LENGTH + 1) },
|
|
127
|
+
}),
|
|
128
|
+
},
|
|
129
|
+
];
|
|
130
|
+
return candidates.map(({ leaf, requestId = maximum.requestId, input }) => {
|
|
131
|
+
const encodedBytes = byteLength(requestFrame(requestId, input));
|
|
132
|
+
return {
|
|
133
|
+
leaf,
|
|
134
|
+
requestId,
|
|
135
|
+
input,
|
|
136
|
+
payloadEncodedBytes: byteLength(input.payload),
|
|
137
|
+
encodedBytes,
|
|
138
|
+
fitsFrame: encodedBytes <= MAX_FRAME_BYTES,
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function requestProof() {
|
|
143
|
+
const cases = EVENTS_PUBLISH_BYTE_PROOF_ENCODING_FAMILIES.map((family) => {
|
|
144
|
+
const maximum = eventsPublishMaximumInput(family);
|
|
145
|
+
const encodedBytes = byteLength(requestFrame(maximum.requestId, maximum.input));
|
|
146
|
+
return {
|
|
147
|
+
family,
|
|
148
|
+
encodedBytes,
|
|
149
|
+
fitsFrame: encodedBytes <= MAX_FRAME_BYTES,
|
|
150
|
+
nPlusOne: eventsPublishNPlusOneInputs(family).map(({ leaf, encodedBytes: witnessBytes, fitsFrame }) => ({
|
|
151
|
+
leaf,
|
|
152
|
+
encodedBytes: witnessBytes,
|
|
153
|
+
fitsFrame,
|
|
154
|
+
})),
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
maxEncodedBytes: Math.max(...cases.map(({ encodedBytes }) => encodedBytes)),
|
|
159
|
+
cases,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function responseFrame(requestId, result) {
|
|
163
|
+
return { jsonrpc: '2.0', id: requestId, result };
|
|
164
|
+
}
|
|
165
|
+
export function eventsPublishMaximumResult() {
|
|
166
|
+
return {
|
|
167
|
+
requestId: 'a'.repeat(REQUEST_ID_MAX_LENGTH),
|
|
168
|
+
result: { publicationId: 'a'.repeat(SIGNAL_EVENT_ID_MAX_LENGTH), disposition: 'duplicate' },
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
export function eventsPublishResultNPlusOneWitnesses() {
|
|
172
|
+
const maximum = eventsPublishMaximumResult();
|
|
173
|
+
return [
|
|
174
|
+
{ ...maximum, leaf: 'requestId', requestId: 'a'.repeat(REQUEST_ID_MAX_LENGTH + 1) },
|
|
175
|
+
{
|
|
176
|
+
...maximum,
|
|
177
|
+
leaf: 'publicationId',
|
|
178
|
+
result: { ...maximum.result, publicationId: 'a'.repeat(SIGNAL_EVENT_ID_MAX_LENGTH + 1) },
|
|
179
|
+
},
|
|
180
|
+
];
|
|
181
|
+
}
|
|
182
|
+
export function eventsPublishStandardErrorEnvelopes() {
|
|
183
|
+
const requestId = 'a'.repeat(REQUEST_ID_MAX_LENGTH);
|
|
184
|
+
return STANDARD_ERROR_CODES.flatMap((code) => {
|
|
185
|
+
const error = { code, message: ERROR_CODE_TO_MESSAGE[code] };
|
|
186
|
+
const arm = `standard:${code}`;
|
|
187
|
+
if (code === PARSE_ERROR_CODE)
|
|
188
|
+
return [{ arm, id: null, error }];
|
|
189
|
+
if (code === INVALID_REQUEST_CODE) {
|
|
190
|
+
return [{ arm: `${arm}:null`, id: null, error }, { arm, id: requestId, error }];
|
|
191
|
+
}
|
|
192
|
+
return [{ arm, id: requestId, error }];
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
export function eventsPublishStandardErrorNPlusOneWitnesses() {
|
|
196
|
+
return eventsPublishStandardErrorEnvelopes()
|
|
197
|
+
.filter((envelope) => envelope.id !== null)
|
|
198
|
+
.map((envelope) => ({ ...envelope, id: 'a'.repeat(REQUEST_ID_MAX_LENGTH + 1) }));
|
|
199
|
+
}
|
|
200
|
+
function repeatedProof(encodedBytes, nPlusOne) {
|
|
201
|
+
return {
|
|
202
|
+
maxEncodedBytes: encodedBytes,
|
|
203
|
+
cases: EVENTS_PUBLISH_BYTE_PROOF_ENCODING_FAMILIES.map((family) => ({
|
|
204
|
+
family,
|
|
205
|
+
encodedBytes,
|
|
206
|
+
fitsFrame: encodedBytes <= MAX_FRAME_BYTES,
|
|
207
|
+
nPlusOne: nPlusOne.map((witness) => ({
|
|
208
|
+
...witness,
|
|
209
|
+
fitsFrame: witness.encodedBytes <= MAX_FRAME_BYTES,
|
|
210
|
+
})),
|
|
211
|
+
})),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
export const EVENTS_PUBLISH_REQUEST_BYTE_PROOF = requestProof();
|
|
215
|
+
const maximumResult = eventsPublishMaximumResult();
|
|
216
|
+
export const EVENTS_PUBLISH_RESULT_BYTE_PROOF = repeatedProof(byteLength(responseFrame(maximumResult.requestId, maximumResult.result)), eventsPublishResultNPlusOneWitnesses().map(({ leaf, requestId, result }) => ({
|
|
217
|
+
leaf,
|
|
218
|
+
encodedBytes: byteLength(responseFrame(requestId, result)),
|
|
219
|
+
})));
|
|
220
|
+
export const EVENTS_PUBLISH_ERROR_BYTE_PROOF = repeatedProof(Math.max(...eventsPublishStandardErrorEnvelopes().map(({ id, error }) => byteLength({ jsonrpc: '2.0', id, error }))), eventsPublishStandardErrorNPlusOneWitnesses().map(({ arm, id, error }) => ({
|
|
221
|
+
leaf: `${arm}.requestId`,
|
|
222
|
+
encodedBytes: byteLength({ jsonrpc: '2.0', id, error }),
|
|
223
|
+
})));
|
|
224
|
+
export const EVENTS_PUBLISH_ROW_ENCODED_BYTE_BOUNDS = {
|
|
225
|
+
maxEncodedRequestBytes: EVENTS_PUBLISH_REQUEST_BYTE_PROOF.maxEncodedBytes,
|
|
226
|
+
maxEncodedResultBytes: EVENTS_PUBLISH_RESULT_BYTE_PROOF.maxEncodedBytes,
|
|
227
|
+
maxEncodedErrorBytes: EVENTS_PUBLISH_ERROR_BYTE_PROOF.maxEncodedBytes,
|
|
228
|
+
};
|
|
229
|
+
//# sourceMappingURL=signal-byte-bounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-byte-bounds.js","sourceRoot":"","sources":["../../src/wire/signal-byte-bounds.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
+
}
|