@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
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface JsonSchema {
|
|
2
|
+
readonly $defs?: Record<string, JsonSchema>;
|
|
3
|
+
readonly $ref?: string;
|
|
4
|
+
readonly type?: string | readonly string[];
|
|
5
|
+
readonly enum?: string[];
|
|
6
|
+
readonly const?: unknown;
|
|
7
|
+
readonly properties?: Record<string, JsonSchema>;
|
|
8
|
+
readonly required?: readonly string[];
|
|
9
|
+
readonly items?: JsonSchema;
|
|
10
|
+
readonly oneOf?: readonly JsonSchema[];
|
|
11
|
+
readonly anyOf?: readonly JsonSchema[];
|
|
12
|
+
readonly allOf?: readonly JsonSchema[];
|
|
13
|
+
readonly additionalProperties?: boolean | JsonSchema;
|
|
14
|
+
readonly [key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface ContractSchemas {
|
|
17
|
+
readonly manifest: JsonSchema;
|
|
18
|
+
readonly messaging: JsonSchema;
|
|
19
|
+
}
|
|
20
|
+
export declare function loadContractSchemas(): Promise<ContractSchemas>;
|
|
21
|
+
export declare function generateContractSource(schemas: ContractSchemas): string;
|
|
22
|
+
export declare function writeGeneratedContract(): Promise<void>;
|
|
23
|
+
export declare function checkGeneratedContract(): Promise<boolean>;
|
|
24
|
+
//# sourceMappingURL=generate-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-contract.d.ts","sourceRoot":"","sources":["../../src/codegen/generate-contract.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACrD,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;CAChC;AAQD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC,CAKpE;AA6VD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAyBvE;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAI5D;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS/D"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
const GENERATED_URL = new URL('../generated/contract.generated.ts', import.meta.url);
|
|
5
|
+
async function readSchema(url) {
|
|
6
|
+
return JSON.parse(await readFile(url, 'utf8'));
|
|
7
|
+
}
|
|
8
|
+
export async function loadContractSchemas() {
|
|
9
|
+
return {
|
|
10
|
+
manifest: await readSchema(new URL('../schemas/manifest.schema.json', import.meta.url)),
|
|
11
|
+
messaging: await readSchema(new URL('../schemas/messaging.schema.json', import.meta.url)),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function quote(value) {
|
|
15
|
+
return `'${value.replaceAll('\\', '\\\\').replaceAll("'", "\\'")}'`;
|
|
16
|
+
}
|
|
17
|
+
function literal(value) {
|
|
18
|
+
if (typeof value === 'string')
|
|
19
|
+
return quote(value);
|
|
20
|
+
if (value === null)
|
|
21
|
+
return 'null';
|
|
22
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
23
|
+
return String(value);
|
|
24
|
+
throw new Error(`Unsupported schema literal: ${JSON.stringify(value)}`);
|
|
25
|
+
}
|
|
26
|
+
function refName(ref) {
|
|
27
|
+
const marker = '#/$defs/';
|
|
28
|
+
if (!ref.startsWith(marker)) {
|
|
29
|
+
throw new Error(`Only local $defs references are supported: ${ref}`);
|
|
30
|
+
}
|
|
31
|
+
return decodeURIComponent(ref.slice(marker.length));
|
|
32
|
+
}
|
|
33
|
+
function arrayType(itemType) {
|
|
34
|
+
const needsParentheses = itemType.includes(' | ') || itemType.includes('\n');
|
|
35
|
+
return `readonly ${needsParentheses ? `(${itemType})` : itemType}[]`;
|
|
36
|
+
}
|
|
37
|
+
function propertyName(name) {
|
|
38
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name) ? name : quote(name);
|
|
39
|
+
}
|
|
40
|
+
function indentContinuation(value, spaces) {
|
|
41
|
+
const indent = ' '.repeat(spaces);
|
|
42
|
+
return value.replaceAll('\n', `\n${indent}`);
|
|
43
|
+
}
|
|
44
|
+
function renderObject(schema) {
|
|
45
|
+
const properties = schema.properties ?? {};
|
|
46
|
+
const entries = Object.entries(properties);
|
|
47
|
+
if (entries.length === 0) {
|
|
48
|
+
if (schema.additionalProperties === false)
|
|
49
|
+
return 'Record<string, never>';
|
|
50
|
+
if (typeof schema.additionalProperties === 'object') {
|
|
51
|
+
return `Readonly<Record<string, ${renderType(schema.additionalProperties)}>>`;
|
|
52
|
+
}
|
|
53
|
+
return 'Readonly<Record<string, unknown>>';
|
|
54
|
+
}
|
|
55
|
+
const required = new Set(schema.required ?? []);
|
|
56
|
+
const fields = entries.map(([name, property]) => {
|
|
57
|
+
const optional = required.has(name) ? '' : '?';
|
|
58
|
+
const rendered = indentContinuation(renderType(property), 2);
|
|
59
|
+
return ` readonly ${propertyName(name)}${optional}: ${rendered};`;
|
|
60
|
+
});
|
|
61
|
+
return `{\n${fields.join('\n')}\n}`;
|
|
62
|
+
}
|
|
63
|
+
function renderType(schema) {
|
|
64
|
+
if (schema.$ref)
|
|
65
|
+
return refName(schema.$ref);
|
|
66
|
+
if (schema.const !== undefined)
|
|
67
|
+
return literal(schema.const);
|
|
68
|
+
if (schema.enum)
|
|
69
|
+
return schema.enum.map(quote).join(' | ');
|
|
70
|
+
const alternatives = schema.oneOf ?? schema.anyOf;
|
|
71
|
+
if (alternatives)
|
|
72
|
+
return alternatives.map(renderType).join(' | ');
|
|
73
|
+
if (Array.isArray(schema.type)) {
|
|
74
|
+
return schema.type.map((type) => renderType({ ...schema, type })).join(' | ');
|
|
75
|
+
}
|
|
76
|
+
switch (schema.type) {
|
|
77
|
+
case 'object':
|
|
78
|
+
return renderObject(schema);
|
|
79
|
+
case 'array':
|
|
80
|
+
return arrayType(renderType(schema.items ?? {}));
|
|
81
|
+
case 'string':
|
|
82
|
+
return 'string';
|
|
83
|
+
case 'integer':
|
|
84
|
+
case 'number':
|
|
85
|
+
return 'number';
|
|
86
|
+
case 'boolean':
|
|
87
|
+
return 'boolean';
|
|
88
|
+
case 'null':
|
|
89
|
+
return 'null';
|
|
90
|
+
case undefined:
|
|
91
|
+
return 'unknown';
|
|
92
|
+
default:
|
|
93
|
+
throw new Error(`Unsupported schema type: ${String(schema.type)}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function renderDataDeclaration(schema, definition) {
|
|
97
|
+
const strategies = deriveDataClassStrategies(schema);
|
|
98
|
+
const variants = Object.entries(strategies).map(([dataClass, allowedStrategies]) => renderType({
|
|
99
|
+
...definition,
|
|
100
|
+
properties: {
|
|
101
|
+
...definition.properties,
|
|
102
|
+
dataClass: { const: dataClass },
|
|
103
|
+
strategy: { enum: [...allowedStrategies] },
|
|
104
|
+
},
|
|
105
|
+
}));
|
|
106
|
+
return variants.join(' | ');
|
|
107
|
+
}
|
|
108
|
+
function renderDefinitions(schema) {
|
|
109
|
+
return Object.entries(schema.$defs ?? {}).map(([name, definition]) => {
|
|
110
|
+
const rendered = name === 'DataDeclaration' && schema['x-clowder-data-class-strategies'] !== undefined
|
|
111
|
+
? renderDataDeclaration(schema, definition)
|
|
112
|
+
: renderType(definition);
|
|
113
|
+
return `export type ${name} = ${rendered};`;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function stringArray(value, label) {
|
|
117
|
+
if (!Array.isArray(value) || !value.every((item) => typeof item === 'string')) {
|
|
118
|
+
throw new Error(`${label} must be an array of strings`);
|
|
119
|
+
}
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
function stringArrayMap(value, label) {
|
|
123
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
124
|
+
throw new Error(`${label} must be an object`);
|
|
125
|
+
}
|
|
126
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, stringArray(item, `${label}.${key}`)]));
|
|
127
|
+
}
|
|
128
|
+
function numberMap(value, label) {
|
|
129
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
130
|
+
throw new Error(`${label} must be an object`);
|
|
131
|
+
}
|
|
132
|
+
const entries = Object.entries(value);
|
|
133
|
+
if (!entries.every(([, item]) => typeof item === 'number')) {
|
|
134
|
+
throw new Error(`${label} values must be numbers`);
|
|
135
|
+
}
|
|
136
|
+
return Object.fromEntries(entries);
|
|
137
|
+
}
|
|
138
|
+
function renderConstArray(name, values) {
|
|
139
|
+
return `export const ${name} = [${values.map(quote).join(', ')}] as const;`;
|
|
140
|
+
}
|
|
141
|
+
function renderCapabilityTables(schema) {
|
|
142
|
+
const layers = stringArrayMap(schema['x-clowder-capability-layers'], 'x-clowder-capability-layers');
|
|
143
|
+
const capabilityValues = schema.$defs?.['Capability']?.enum ?? [];
|
|
144
|
+
const layeredValues = Object.values(layers).flat();
|
|
145
|
+
if (capabilityValues.length !== layeredValues.length ||
|
|
146
|
+
capabilityValues.some((value) => !layeredValues.includes(value))) {
|
|
147
|
+
throw new Error('Capability enum and capability layer metadata must contain identical values');
|
|
148
|
+
}
|
|
149
|
+
const lines = [];
|
|
150
|
+
for (const [layer, values] of Object.entries(layers)) {
|
|
151
|
+
lines.push(renderConstArray(`${layer}_CAPABILITIES`, values));
|
|
152
|
+
lines.push(`export type ${layer}Capability = (typeof ${layer}_CAPABILITIES)[number];`);
|
|
153
|
+
}
|
|
154
|
+
lines.push('export const CAPABILITY_TABLE = {');
|
|
155
|
+
for (const layer of Object.keys(layers)) {
|
|
156
|
+
lines.push(` ${layer}: ${layer}_CAPABILITIES,`);
|
|
157
|
+
}
|
|
158
|
+
lines.push('} as const;');
|
|
159
|
+
lines.push('export type AuthorizationLayer = keyof typeof CAPABILITY_TABLE;');
|
|
160
|
+
return lines;
|
|
161
|
+
}
|
|
162
|
+
function renderDataStrategyTable(schema) {
|
|
163
|
+
const strategies = stringArrayMap(schema['x-clowder-data-class-strategies'], 'x-clowder-data-class-strategies');
|
|
164
|
+
const lines = ['export const DATA_CLASS_ALLOWED_STRATEGIES = {'];
|
|
165
|
+
for (const [dataClass, values] of Object.entries(strategies)) {
|
|
166
|
+
lines.push(` ${quote(dataClass)}: [${values.map(quote).join(', ')}],`);
|
|
167
|
+
}
|
|
168
|
+
lines.push('} as const satisfies Readonly<Record<DataClass, readonly DataStrategy[]>>;');
|
|
169
|
+
return lines;
|
|
170
|
+
}
|
|
171
|
+
function renderMessagingBounds(schema) {
|
|
172
|
+
const bounds = numberMap(schema['x-clowder-bounds'], 'x-clowder-bounds');
|
|
173
|
+
const lines = ['export const MESSAGING_BOUNDS = {'];
|
|
174
|
+
for (const [name, value] of Object.entries(bounds)) {
|
|
175
|
+
lines.push(` ${name}: ${value},`);
|
|
176
|
+
}
|
|
177
|
+
lines.push('} as const;');
|
|
178
|
+
return lines;
|
|
179
|
+
}
|
|
180
|
+
function renderMessagingReplayWindowDefault(schema) {
|
|
181
|
+
const replayWindow = schema['x-clowder-replay-window-default'];
|
|
182
|
+
if (typeof replayWindow !== 'string' || !/^P[1-9][0-9]*D$/.test(replayWindow)) {
|
|
183
|
+
throw new Error('messaging replay window default must use ISO 8601 days (for example P7D)');
|
|
184
|
+
}
|
|
185
|
+
return [
|
|
186
|
+
'/**',
|
|
187
|
+
' * @signed(G-0 2026-07-15)',
|
|
188
|
+
' * Host control plane/UI obligation: expose effective retention to users.',
|
|
189
|
+
' * This does not add a plugin handshake field or query API.',
|
|
190
|
+
' */',
|
|
191
|
+
`export const MESSAGING_REPLAY_WINDOW_DEFAULT = ${quote(replayWindow)} as const;`,
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
function schemaProperty(schema, definitionName, property) {
|
|
195
|
+
const result = schema.$defs?.[definitionName]?.properties?.[property];
|
|
196
|
+
if (!result)
|
|
197
|
+
throw new Error(`Missing schema property ${definitionName}.${property}`);
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
function assertSchemaNumber(schema, metadataName, expected, definitionName, property, keyword) {
|
|
201
|
+
const actual = schemaProperty(schema, definitionName, property)[keyword];
|
|
202
|
+
if (actual !== expected) {
|
|
203
|
+
throw new Error(`${metadataName} metadata (${expected}) must match ${definitionName}.${property}.${keyword} (${String(actual)})`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function validateMessagingBounds(schema) {
|
|
207
|
+
const bounds = numberMap(schema['x-clowder-bounds'], 'x-clowder-bounds');
|
|
208
|
+
for (const definitionName of [
|
|
209
|
+
'DraftPayload',
|
|
210
|
+
'AppendElementsRequest',
|
|
211
|
+
'MessageElementsAppendEvent',
|
|
212
|
+
]) {
|
|
213
|
+
assertSchemaNumber(schema, 'maxElementsPerOperation', bounds['maxElementsPerOperation'], definitionName, 'elements', 'maxItems');
|
|
214
|
+
}
|
|
215
|
+
assertSchemaNumber(schema, 'maxElementsPerMessage', bounds['maxElementsPerMessage'], 'MessagePayload', 'elements', 'maxItems');
|
|
216
|
+
assertSchemaNumber(schema, 'maxWhisperTargets', bounds['maxWhisperTargets'], 'WhisperAudience', 'targets', 'maxItems');
|
|
217
|
+
for (const [definitionName, property] of [
|
|
218
|
+
['MessageDraft', 'idempotencyKey'],
|
|
219
|
+
['AppendElementsRequest', 'operationId'],
|
|
220
|
+
['MessageElementsAppendEvent', 'operationId'],
|
|
221
|
+
]) {
|
|
222
|
+
assertSchemaNumber(schema, 'maxIdempotencyKeyLength', bounds['maxIdempotencyKeyLength'], definitionName, property, 'maxLength');
|
|
223
|
+
}
|
|
224
|
+
for (const definitionName of [
|
|
225
|
+
'TextMessageElement',
|
|
226
|
+
'MediaRefMessageElement',
|
|
227
|
+
'RichBlockMessageElement',
|
|
228
|
+
]) {
|
|
229
|
+
for (const property of ['elementId', 'derivedFromElementId']) {
|
|
230
|
+
assertSchemaNumber(schema, 'maxElementIdLength', bounds['maxElementIdLength'], definitionName, property, 'maxLength');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function deriveDataClassStrategies(schema) {
|
|
235
|
+
const dataClasses = schema.$defs?.['DataClass']?.enum ?? [];
|
|
236
|
+
const allStrategies = schema.$defs?.['DataStrategy']?.enum ?? [];
|
|
237
|
+
const declaration = schema.$defs?.['DataDeclaration'];
|
|
238
|
+
const rules = declaration?.allOf ?? [];
|
|
239
|
+
const result = {};
|
|
240
|
+
for (const dataClass of dataClasses) {
|
|
241
|
+
let allowed = [...allStrategies];
|
|
242
|
+
for (const rule of rules) {
|
|
243
|
+
const condition = rule['if'];
|
|
244
|
+
const consequence = rule['then'];
|
|
245
|
+
const restrictedClasses = condition?.properties?.['dataClass']?.enum ?? [];
|
|
246
|
+
if (!restrictedClasses.includes(dataClass))
|
|
247
|
+
continue;
|
|
248
|
+
const restrictedStrategies = consequence?.properties?.['strategy']?.enum;
|
|
249
|
+
if (restrictedStrategies) {
|
|
250
|
+
allowed = allowed.filter((strategy) => restrictedStrategies.includes(strategy));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
result[dataClass] = allowed;
|
|
254
|
+
}
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
function validateDataStrategyMetadata(schema) {
|
|
258
|
+
const metadata = stringArrayMap(schema['x-clowder-data-class-strategies'], 'x-clowder-data-class-strategies');
|
|
259
|
+
const derived = deriveDataClassStrategies(schema);
|
|
260
|
+
const keys = new Set([...Object.keys(metadata), ...Object.keys(derived)]);
|
|
261
|
+
for (const dataClass of keys) {
|
|
262
|
+
const declared = metadata[dataClass] ?? [];
|
|
263
|
+
const expected = derived[dataClass] ?? [];
|
|
264
|
+
if (declared.length !== expected.length ||
|
|
265
|
+
declared.some((strategy) => !expected.includes(strategy))) {
|
|
266
|
+
throw new Error(`data-class strategy metadata for ${dataClass} must match schema constraints`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
export function generateContractSource(schemas) {
|
|
271
|
+
validateDataStrategyMetadata(schemas.manifest);
|
|
272
|
+
validateMessagingBounds(schemas.messaging);
|
|
273
|
+
const sections = [
|
|
274
|
+
'/**',
|
|
275
|
+
' * Generated from manifest.schema.json and messaging.schema.json.',
|
|
276
|
+
' * Do not edit by hand. Run `pnpm generate` after changing a schema.',
|
|
277
|
+
' */',
|
|
278
|
+
'',
|
|
279
|
+
...renderDefinitions(schemas.manifest),
|
|
280
|
+
'',
|
|
281
|
+
`export type PluginManifest = ${renderType(schemas.manifest)};`,
|
|
282
|
+
'',
|
|
283
|
+
...renderDefinitions(schemas.messaging),
|
|
284
|
+
'',
|
|
285
|
+
...renderCapabilityTables(schemas.manifest),
|
|
286
|
+
'',
|
|
287
|
+
...renderDataStrategyTable(schemas.manifest),
|
|
288
|
+
'',
|
|
289
|
+
...renderMessagingBounds(schemas.messaging),
|
|
290
|
+
'',
|
|
291
|
+
...renderMessagingReplayWindowDefault(schemas.messaging),
|
|
292
|
+
'',
|
|
293
|
+
];
|
|
294
|
+
return `${sections.join('\n').trimEnd()}\n`;
|
|
295
|
+
}
|
|
296
|
+
export async function writeGeneratedContract() {
|
|
297
|
+
const source = generateContractSource(await loadContractSchemas());
|
|
298
|
+
await mkdir(dirname(fileURLToPath(GENERATED_URL)), { recursive: true });
|
|
299
|
+
await writeFile(GENERATED_URL, source, 'utf8');
|
|
300
|
+
}
|
|
301
|
+
export async function checkGeneratedContract() {
|
|
302
|
+
const expected = generateContractSource(await loadContractSchemas());
|
|
303
|
+
let actual;
|
|
304
|
+
try {
|
|
305
|
+
actual = await readFile(GENERATED_URL, 'utf8');
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
return actual === expected;
|
|
311
|
+
}
|
|
312
|
+
async function main() {
|
|
313
|
+
if (process.argv.includes('--check')) {
|
|
314
|
+
if (!(await checkGeneratedContract())) {
|
|
315
|
+
console.error('Generated contract is stale. Run `pnpm --filter @clowder-ai/plugin-contract generate`.');
|
|
316
|
+
process.exitCode = 1;
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
console.log('✅ Generated contract is current');
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
await writeGeneratedContract();
|
|
323
|
+
console.log(`Generated ${fileURLToPath(GENERATED_URL)}`);
|
|
324
|
+
}
|
|
325
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
326
|
+
await main();
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=generate-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-contract.js","sourceRoot":"","sources":["../../src/codegen/generate-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conformance utilities — re-exported for programmatic use.
|
|
3
|
+
*
|
|
4
|
+
* The primary entry point is the runner CLI (runner.ts).
|
|
5
|
+
* This module exports validation helpers that the host and SDK can use
|
|
6
|
+
* to validate manifests and messages against the contract schemas.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
export { isValidDataClassStrategy } from '../types/data-class.js';
|
|
11
|
+
export { getCapabilityLayer } from '../types/capability.js';
|
|
12
|
+
export { DATA_CLASS_ALLOWED_STRATEGIES, CAPABILITY_TABLE, L0_CAPABILITIES, L1_CAPABILITIES, L2_CAPABILITIES, } from '../generated/contract.generated.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conformance/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,GAChB,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conformance utilities — re-exported for programmatic use.
|
|
3
|
+
*
|
|
4
|
+
* The primary entry point is the runner CLI (runner.ts).
|
|
5
|
+
* This module exports validation helpers that the host and SDK can use
|
|
6
|
+
* to validate manifests and messages against the contract schemas.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
export { isValidDataClassStrategy } from '../types/data-class.js';
|
|
11
|
+
export { getCapabilityLayer } from '../types/capability.js';
|
|
12
|
+
export { DATA_CLASS_ALLOWED_STRATEGIES, CAPABILITY_TABLE, L0_CAPABILITIES, L1_CAPABILITIES, L2_CAPABILITIES, } from '../generated/contract.generated.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conformance/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,GAChB,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conformance runner skeleton.
|
|
3
|
+
*
|
|
4
|
+
* Validates fixture files against contract JSON Schemas. This is the
|
|
5
|
+
* mechanical verification that fixtures (maintained by sol) conform to
|
|
6
|
+
* the schema shapes (maintained by opus).
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* pnpm --filter @clowder-ai/plugin-contract conformance
|
|
10
|
+
*
|
|
11
|
+
* Exit codes:
|
|
12
|
+
* 0 = all fixtures valid (or no fixtures yet)
|
|
13
|
+
* 1 = validation errors found
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/conformance/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|