@clowder-ai/plugin-contract 0.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codegen/generate-contract.d.ts +24 -0
- package/dist/codegen/generate-contract.d.ts.map +1 -0
- package/dist/codegen/generate-contract.js +328 -0
- package/dist/codegen/generate-contract.js.map +1 -0
- package/dist/conformance/index.d.ts +13 -0
- package/dist/conformance/index.d.ts.map +1 -0
- package/dist/conformance/index.js +13 -0
- package/dist/conformance/index.js.map +1 -0
- package/dist/conformance/runner.d.ts +18 -0
- package/dist/conformance/runner.d.ts.map +1 -0
- package/dist/conformance/runner.js +252 -0
- package/dist/conformance/runner.js.map +1 -0
- package/dist/generated/contract.generated.d.ts +282 -0
- package/dist/generated/contract.generated.d.ts.map +1 -0
- package/dist/generated/contract.generated.js +37 -0
- package/dist/generated/contract.generated.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/types/capability.d.ts +4 -0
- package/dist/types/capability.d.ts.map +1 -0
- package/dist/types/capability.js +11 -0
- package/dist/types/capability.js.map +1 -0
- package/dist/types/data-class.d.ts +3 -0
- package/dist/types/data-class.d.ts.map +1 -0
- package/dist/types/data-class.js +12 -0
- package/dist/types/data-class.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validation/index.d.ts +2 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +2 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/messaging-semantic.d.ts +10 -0
- package/dist/validation/messaging-semantic.d.ts.map +1 -0
- package/dist/validation/messaging-semantic.js +99 -0
- package/dist/validation/messaging-semantic.js.map +1 -0
- package/fixtures/behavior/messaging/adversarial-invariants.json +475 -0
- package/fixtures/manifest/invalid/.gitkeep +0 -0
- package/fixtures/manifest/invalid/contract-version-leading-zero-prerelease.json +17 -0
- package/fixtures/manifest/invalid/contract-version-range.json +17 -0
- package/fixtures/manifest/invalid/ipc-empty-entrypoint.json +18 -0
- package/fixtures/manifest/invalid/plugin-version-leading-zero-prerelease.json +17 -0
- package/fixtures/manifest/invalid/plugin-version-not-semver.json +17 -0
- package/fixtures/manifest/invalid/semver-empty-build-metadata.json +17 -0
- package/fixtures/manifest/invalid/stdio-missing-entrypoint.json +17 -0
- package/fixtures/manifest/invalid/unknown-capability.json +19 -0
- package/fixtures/manifest/invalid/user-authored-lifecycle.json +24 -0
- package/fixtures/manifest/valid/.gitkeep +0 -0
- package/fixtures/manifest/valid/minimal-builtin.json +17 -0
- package/fixtures/manifest/valid/protocol-intrinsic-lifecycle.json +18 -0
- package/fixtures/manifest/valid/semver-build-metadata.json +17 -0
- package/fixtures/manifest/valid/stdio-entrypoint.json +18 -0
- package/fixtures/messaging/invalid/.gitkeep +0 -0
- package/fixtures/messaging/invalid/non-rfc3339-occurred-at.json +34 -0
- package/fixtures/messaging/invalid/non-utc-occurred-at.json +34 -0
- package/fixtures/messaging/invalid/raw-message-id-append.json +16 -0
- package/fixtures/messaging/invalid/raw-thread-id.json +28 -0
- package/fixtures/messaging/invalid/stale-read-with-ack-token.json +8 -0
- package/fixtures/messaging/invalid/system-draft-audience.json +31 -0
- package/fixtures/messaging/invalid/text-payload-missing-text.json +10 -0
- package/fixtures/messaging/invalid/untyped-root-document.json +3 -0
- package/fixtures/messaging/valid/.gitkeep +0 -0
- package/fixtures/messaging/valid/append-elements-with-handle.json +21 -0
- package/fixtures/messaging/valid/message-draft.json +28 -0
- package/fixtures/messaging/valid/root-message-draft.json +25 -0
- package/fixtures/messaging/valid/subscription-delivery.json +45 -0
- package/package.json +59 -0
- package/src/schemas/behavior-fixture.schema.json +370 -0
- package/src/schemas/manifest.schema.json +186 -0
- package/src/schemas/messaging.schema.json +473 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clowder-ai/plugin-contract
|
|
3
|
+
*
|
|
4
|
+
* The single machine-readable truth source for the Clowder AI plugin
|
|
5
|
+
* ecosystem (P15). Schema, types, capability table, and conformance
|
|
6
|
+
* utilities all ship from this package — the host (clowder-ai) and
|
|
7
|
+
* plugin SDK both consume it; neither redefines structures.
|
|
8
|
+
*
|
|
9
|
+
* ## Version strategy (pre-1.0)
|
|
10
|
+
*
|
|
11
|
+
* - `0.x.0-candidate.N`: work-in-progress, NOT published to registry,
|
|
12
|
+
* no implementation may consume.
|
|
13
|
+
* - `0.x.0`: published after dual-sign merge (CODEOWNERS) + CI publish.
|
|
14
|
+
* Registry must show exact version + digest before any gate proceeds.
|
|
15
|
+
* - Breaking changes are expected before 1.0 (P3).
|
|
16
|
+
* - v1.0.0 = public compatibility commitment; breaking window closes.
|
|
17
|
+
*
|
|
18
|
+
* ## Domains (v0.1 candidate)
|
|
19
|
+
*
|
|
20
|
+
* - **messaging**: MessagePayload, MessageDraft, MessageEnvelope,
|
|
21
|
+
* MessageOutputEvent, AppendElementsRequest, SendReceipt
|
|
22
|
+
* - **manifest**: PluginManifest, PluginFeature, DataDeclaration,
|
|
23
|
+
* RuntimeDeclaration (v0.1 scope — signals/tasks/windows deferred)
|
|
24
|
+
* - **capability**: L0/L1/L2 capability table (`@signed(G-0 2026-07-15)`)
|
|
25
|
+
* - **data-class**: DataClass × DataStrategy validation
|
|
26
|
+
* - **generated projection**: all public structural types and contract tables
|
|
27
|
+
* are deterministically generated from the JSON Schemas
|
|
28
|
+
* - **validation**: shared semantic checks for constraints JSON Schema cannot
|
|
29
|
+
* express, including UTF-8 payload byte budgets
|
|
30
|
+
*
|
|
31
|
+
* @packageDocumentation
|
|
32
|
+
*/
|
|
33
|
+
// Re-export everything from the types barrel
|
|
34
|
+
export * from './types/index.js';
|
|
35
|
+
export * from './validation/index.js';
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,6CAA6C;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type AuthorizationLayer } from '../generated/contract.generated.js';
|
|
2
|
+
/** Return the schema-owned authorization layer for a capability identifier. */
|
|
3
|
+
export declare function getCapabilityLayer(capability: string): AuthorizationLayer | undefined;
|
|
4
|
+
//# sourceMappingURL=capability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../src/types/capability.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,oCAAoC,CAAC;AAE5C,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAOrF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CAPABILITY_TABLE, } from '../generated/contract.generated.js';
|
|
2
|
+
/** Return the schema-owned authorization layer for a capability identifier. */
|
|
3
|
+
export function getCapabilityLayer(capability) {
|
|
4
|
+
for (const layer of Object.keys(CAPABILITY_TABLE)) {
|
|
5
|
+
if (CAPABILITY_TABLE[layer].includes(capability)) {
|
|
6
|
+
return layer;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=capability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/types/capability.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAEjB,MAAM,oCAAoC,CAAC;AAE5C,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAyB,EAAE,CAAC;QAC1E,IAAK,gBAAgB,CAAC,KAAK,CAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-class.d.ts","sourceRoot":"","sources":["../../src/types/data-class.ts"],"names":[],"mappings":"AAMA,iEAAiE;AACjE,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAOT"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DATA_CLASS_ALLOWED_STRATEGIES } from '../generated/contract.generated.js';
|
|
2
|
+
const STRATEGIES_BY_DATA_CLASS = DATA_CLASS_ALLOWED_STRATEGIES;
|
|
3
|
+
/** Validate a schema-owned (dataClass, strategy) combination. */
|
|
4
|
+
export function isValidDataClassStrategy(dataClass, strategy) {
|
|
5
|
+
if (typeof dataClass !== 'string' || typeof strategy !== 'string')
|
|
6
|
+
return false;
|
|
7
|
+
const allowed = STRATEGIES_BY_DATA_CLASS[dataClass];
|
|
8
|
+
if (allowed === undefined)
|
|
9
|
+
return false;
|
|
10
|
+
return allowed.includes(strategy);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data-class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-class.js","sourceRoot":"","sources":["../../src/types/data-class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,MAAM,wBAAwB,GAAG,6BAEhC,CAAC;AAEF,iEAAiE;AACjE,MAAM,UAAU,wBAAwB,CACtC,SAAkB,EAClB,QAAiB;IAEjB,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEhF,MAAM,OAAO,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAExC,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Schema-generated contract types and tables plus handwritten runtime helpers. */
|
|
2
|
+
export * from '../generated/contract.generated.js';
|
|
3
|
+
export { getCapabilityLayer } from './capability.js';
|
|
4
|
+
export { isValidDataClassStrategy } from './data-class.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,cAAc,oCAAoC,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Schema-generated contract types and tables plus handwritten runtime helpers. */
|
|
2
|
+
export * from '../generated/contract.generated.js';
|
|
3
|
+
export { getCapabilityLayer } from './capability.js';
|
|
4
|
+
export { isValidDataClassStrategy } from './data-class.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,cAAc,oCAAoC,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,GAG3B,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface SemanticValidationError {
|
|
2
|
+
readonly path: string;
|
|
3
|
+
readonly message: string;
|
|
4
|
+
}
|
|
5
|
+
export interface SemanticValidationResult {
|
|
6
|
+
readonly valid: boolean;
|
|
7
|
+
readonly errors: readonly SemanticValidationError[];
|
|
8
|
+
}
|
|
9
|
+
export declare function validateMessagingSemantics(schemaRef: string, value: unknown): SemanticValidationResult;
|
|
10
|
+
//# sourceMappingURL=messaging-semantic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging-semantic.d.ts","sourceRoot":"","sources":["../../src/validation/messaging-semantic.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACrD;AAuFD,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACb,wBAAwB,CAoC1B"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { MESSAGING_BOUNDS } from '../generated/contract.generated.js';
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
function payloadBytes(payload) {
|
|
6
|
+
try {
|
|
7
|
+
const serialized = JSON.stringify(payload);
|
|
8
|
+
return serialized === undefined
|
|
9
|
+
? undefined
|
|
10
|
+
: Buffer.byteLength(serialized, 'utf8');
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function elementGroups(schemaRef, value) {
|
|
17
|
+
if (!isRecord(value))
|
|
18
|
+
return [];
|
|
19
|
+
if (schemaRef === 'MessageDraft' || schemaRef === 'MessageEnvelope') {
|
|
20
|
+
const payload = value['payload'];
|
|
21
|
+
return isRecord(payload) && Array.isArray(payload['elements'])
|
|
22
|
+
? [payload['elements']]
|
|
23
|
+
: [];
|
|
24
|
+
}
|
|
25
|
+
if (schemaRef === 'AppendElementsRequest' ||
|
|
26
|
+
schemaRef === 'MessageElementsAppendEvent') {
|
|
27
|
+
return Array.isArray(value['elements']) ? [value['elements']] : [];
|
|
28
|
+
}
|
|
29
|
+
if (schemaRef === 'MessagePublishEvent') {
|
|
30
|
+
const envelope = value['envelope'];
|
|
31
|
+
return isRecord(envelope)
|
|
32
|
+
? elementGroups('MessageEnvelope', envelope)
|
|
33
|
+
: [];
|
|
34
|
+
}
|
|
35
|
+
if (schemaRef === 'MessageOutputEvent') {
|
|
36
|
+
return value['type'] === 'message.publish'
|
|
37
|
+
? elementGroups('MessagePublishEvent', value)
|
|
38
|
+
: elementGroups('MessageElementsAppendEvent', value);
|
|
39
|
+
}
|
|
40
|
+
if (schemaRef === 'SubscriptionReadResponse' && Array.isArray(value['events'])) {
|
|
41
|
+
return value['events'].flatMap((event) => elementGroups('MessageOutputEvent', event));
|
|
42
|
+
}
|
|
43
|
+
if (schemaRef === 'SnapshotResponse' && Array.isArray(value['envelopes'])) {
|
|
44
|
+
return value['envelopes'].flatMap((envelope) => elementGroups('MessageEnvelope', envelope));
|
|
45
|
+
}
|
|
46
|
+
if (schemaRef === 'root') {
|
|
47
|
+
if ('address' in value && 'payload' in value) {
|
|
48
|
+
return elementGroups('MessageDraft', value);
|
|
49
|
+
}
|
|
50
|
+
if ('occurredAt' in value && 'payload' in value) {
|
|
51
|
+
return elementGroups('MessageEnvelope', value);
|
|
52
|
+
}
|
|
53
|
+
if ('handle' in value && 'elements' in value) {
|
|
54
|
+
return elementGroups('AppendElementsRequest', value);
|
|
55
|
+
}
|
|
56
|
+
if (typeof value['type'] === 'string') {
|
|
57
|
+
return elementGroups('MessageOutputEvent', value);
|
|
58
|
+
}
|
|
59
|
+
if ('events' in value) {
|
|
60
|
+
return elementGroups('SubscriptionReadResponse', value);
|
|
61
|
+
}
|
|
62
|
+
if ('envelopes' in value) {
|
|
63
|
+
return elementGroups('SnapshotResponse', value);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
export function validateMessagingSemantics(schemaRef, value) {
|
|
69
|
+
const errors = [];
|
|
70
|
+
for (const [groupIndex, elements] of elementGroups(schemaRef, value).entries()) {
|
|
71
|
+
let totalBytes = 0;
|
|
72
|
+
for (const [elementIndex, rawElement] of elements.entries()) {
|
|
73
|
+
const path = `/elementGroups/${groupIndex}/${elementIndex}/payload`;
|
|
74
|
+
const payload = isRecord(rawElement)
|
|
75
|
+
? rawElement.payload
|
|
76
|
+
: undefined;
|
|
77
|
+
const bytes = payloadBytes(payload);
|
|
78
|
+
if (bytes === undefined) {
|
|
79
|
+
errors.push({ path, message: 'element payload must be JSON-serializable' });
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
totalBytes += bytes;
|
|
83
|
+
if (bytes > MESSAGING_BOUNDS.maxElementPayloadBytes) {
|
|
84
|
+
errors.push({
|
|
85
|
+
path,
|
|
86
|
+
message: `element payload exceeds ${MESSAGING_BOUNDS.maxElementPayloadBytes} bytes`,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (totalBytes > MESSAGING_BOUNDS.maxTotalPayloadBytes) {
|
|
91
|
+
errors.push({
|
|
92
|
+
path: `/elementGroups/${groupIndex}`,
|
|
93
|
+
message: `total element payload exceeds ${MESSAGING_BOUNDS.maxTotalPayloadBytes} bytes`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return { valid: errors.length === 0, errors };
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=messaging-semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging-semantic.js","sourceRoot":"","sources":["../../src/validation/messaging-semantic.ts"],"names":[],"mappings":"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"}
|