@clowder-ai/plugin-contract 0.1.0-beta.3 → 0.1.0-beta.37
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 +10 -0
- package/dist/codegen/generate-contract.d.ts.map +1 -1
- package/dist/codegen/generate-contract.js +362 -21
- package/dist/codegen/generate-contract.js.map +1 -1
- 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 +4 -1
- package/dist/conformance/index.d.ts.map +1 -1
- package/dist/conformance/index.js +3 -1
- 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/runner.d.ts.map +1 -1
- package/dist/conformance/runner.js +23 -3
- package/dist/conformance/runner.js.map +1 -1
- package/dist/conformance/stdio-harness/child-process-harness.d.ts +6 -0
- package/dist/conformance/stdio-harness/child-process-harness.d.ts.map +1 -1
- package/dist/conformance/stdio-harness/child-process-harness.js +26 -9
- package/dist/conformance/stdio-harness/child-process-harness.js.map +1 -1
- package/dist/conformance/stdio-harness/index.d.ts +1 -1
- package/dist/conformance/stdio-harness/index.d.ts.map +1 -1
- package/dist/conformance/stdio-harness/index.js +1 -1
- package/dist/conformance/stdio-harness/index.js.map +1 -1
- package/dist/conformance/stdio-harness/ndjson-frame.d.ts +6 -1
- package/dist/conformance/stdio-harness/ndjson-frame.d.ts.map +1 -1
- package/dist/conformance/stdio-harness/ndjson-frame.js +7 -1
- package/dist/conformance/stdio-harness/ndjson-frame.js.map +1 -1
- package/dist/conformance/stdio-harness/wire-shape.d.ts +1 -1
- package/dist/docx-materialization.d.ts +8 -0
- package/dist/docx-materialization.d.ts.map +1 -0
- package/dist/docx-materialization.js +19 -0
- package/dist/docx-materialization.js.map +1 -0
- package/dist/generated/contract.generated.d.ts +1793 -32
- package/dist/generated/contract.generated.d.ts.map +1 -1
- package/dist/generated/contract.generated.js +72 -3
- package/dist/generated/contract.generated.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/validation/catalog.d.ts +21 -0
- package/dist/validation/catalog.d.ts.map +1 -0
- package/dist/validation/catalog.js +140 -0
- package/dist/validation/catalog.js.map +1 -0
- package/dist/validation/cloud-conversation-host.d.ts +18 -0
- package/dist/validation/cloud-conversation-host.d.ts.map +1 -0
- package/dist/validation/cloud-conversation-host.js +83 -0
- package/dist/validation/cloud-conversation-host.js.map +1 -0
- package/dist/validation/companion-bridge.d.ts +6 -0
- package/dist/validation/companion-bridge.d.ts.map +1 -0
- package/dist/validation/companion-bridge.js +198 -0
- package/dist/validation/companion-bridge.js.map +1 -0
- package/dist/validation/docx-materialization.d.ts +6 -0
- package/dist/validation/docx-materialization.d.ts.map +1 -0
- package/dist/validation/docx-materialization.js +36 -0
- package/dist/validation/docx-materialization.js.map +1 -0
- package/dist/validation/index.d.ts +10 -0
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +10 -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 +273 -0
- package/dist/validation/manifest.js.map +1 -0
- package/dist/validation/members.d.ts +4 -0
- package/dist/validation/members.d.ts.map +1 -0
- package/dist/validation/members.js +11 -0
- package/dist/validation/members.js.map +1 -0
- package/dist/validation/messaging-semantic.d.ts.map +1 -1
- package/dist/validation/messaging-semantic.js +98 -0
- package/dist/validation/messaging-semantic.js.map +1 -1
- package/dist/validation/messaging-wire.d.ts +42 -0
- package/dist/validation/messaging-wire.d.ts.map +1 -0
- package/dist/validation/messaging-wire.js +184 -0
- package/dist/validation/messaging-wire.js.map +1 -0
- package/dist/validation/operation-rows.d.ts +25 -0
- package/dist/validation/operation-rows.d.ts.map +1 -0
- package/dist/validation/operation-rows.js +135 -0
- package/dist/validation/operation-rows.js.map +1 -0
- package/dist/validation/signals.d.ts +17 -0
- package/dist/validation/signals.d.ts.map +1 -0
- package/dist/validation/signals.js +32 -0
- package/dist/validation/signals.js.map +1 -0
- package/dist/wire/constants.d.ts +2 -1
- package/dist/wire/constants.d.ts.map +1 -1
- package/dist/wire/constants.js +2 -1
- package/dist/wire/constants.js.map +1 -1
- package/dist/wire/dispatch.d.ts +49 -0
- package/dist/wire/dispatch.d.ts.map +1 -0
- package/dist/wire/dispatch.js +880 -0
- package/dist/wire/dispatch.js.map +1 -0
- package/dist/wire/disposition-fixtures.d.ts +19 -2
- package/dist/wire/disposition-fixtures.d.ts.map +1 -1
- package/dist/wire/disposition-fixtures.js +1110 -77
- package/dist/wire/disposition-fixtures.js.map +1 -1
- package/dist/wire/disposition.d.ts +10 -8
- package/dist/wire/disposition.d.ts.map +1 -1
- package/dist/wire/disposition.js +20 -8
- package/dist/wire/disposition.js.map +1 -1
- package/dist/wire/envelope.d.ts +31 -0
- package/dist/wire/envelope.d.ts.map +1 -1
- package/dist/wire/envelope.js +48 -1
- package/dist/wire/envelope.js.map +1 -1
- package/dist/wire/errors.d.ts +31 -1
- package/dist/wire/errors.d.ts.map +1 -1
- package/dist/wire/errors.js +36 -0
- package/dist/wire/errors.js.map +1 -1
- package/dist/wire/grants.d.ts +4 -4
- package/dist/wire/grants.js +3 -3
- 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 +176 -0
- package/dist/wire/handshake-byte-bounds.js.map +1 -0
- package/dist/wire/handshake.d.ts +59 -7
- package/dist/wire/handshake.d.ts.map +1 -1
- package/dist/wire/handshake.js +132 -10
- package/dist/wire/handshake.js.map +1 -1
- package/dist/wire/index.d.ts +18 -7
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +35 -6
- package/dist/wire/index.js.map +1 -1
- package/dist/wire/lifecycle-byte-bounds.d.ts +40 -0
- package/dist/wire/lifecycle-byte-bounds.d.ts.map +1 -0
- package/dist/wire/lifecycle-byte-bounds.js +149 -0
- package/dist/wire/lifecycle-byte-bounds.js.map +1 -0
- package/dist/wire/messaging-byte-bounds.d.ts +62 -0
- package/dist/wire/messaging-byte-bounds.d.ts.map +1 -0
- package/dist/wire/messaging-byte-bounds.js +581 -0
- package/dist/wire/messaging-byte-bounds.js.map +1 -0
- package/dist/wire/registry.d.ts +192 -35
- package/dist/wire/registry.d.ts.map +1 -1
- package/dist/wire/registry.js +57 -79
- package/dist/wire/registry.js.map +1 -1
- package/dist/wire/row-shapes.d.ts +98 -81
- package/dist/wire/row-shapes.d.ts.map +1 -1
- package/dist/wire/row-shapes.js +31 -4
- package/dist/wire/row-shapes.js.map +1 -1
- package/fixtures/behavior/messaging/adversarial-invariants.json +92 -2
- package/fixtures/manifest/invalid/duplicate-signal-type.json +35 -0
- package/fixtures/manifest/invalid/icon-package-escape.json +22 -0
- package/fixtures/manifest/valid/localized-product-metadata.json +27 -0
- package/fixtures/messaging/valid/subscription-delivery.json +1 -1
- package/fixtures/signals/invalid/dynamic-schema-url.json +10 -0
- package/fixtures/signals/invalid/forbidden-raw-privacy.json +10 -0
- package/fixtures/signals/valid/remote-service-declaration.json +10 -0
- package/package.json +18 -5
- package/src/schemas/behavior-fixture.schema.json +903 -116
- package/src/schemas/catalog.schema.json +91 -0
- package/src/schemas/companion-bridge.schema.json +2256 -0
- package/src/schemas/docx-materialization.schema.json +302 -0
- package/src/schemas/manifest.schema.json +2223 -89
- package/src/schemas/messaging.schema.json +692 -40
- package/src/schemas/physical-limb.schema.json +319 -0
- package/src/schemas/plugin-metadata.schema.json +62 -0
- package/src/schemas/signal.schema.json +119 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
const require = createRequire(import.meta.url);
|
|
3
|
+
const Ajv2020 = require('ajv/dist/2020');
|
|
4
|
+
const addFormats = require('ajv-formats');
|
|
5
|
+
const pluginMetadataSchema = require('@clowder-ai/plugin-contract/schemas/plugin-metadata');
|
|
6
|
+
const manifestSchema = require('@clowder-ai/plugin-contract/schemas/manifest');
|
|
7
|
+
const messagingSchema = require('@clowder-ai/plugin-contract/schemas/messaging');
|
|
8
|
+
const signalSchema = require('@clowder-ai/plugin-contract/schemas/signals');
|
|
9
|
+
const ajv = new Ajv2020({ allErrors: true, strict: false });
|
|
10
|
+
addFormats(ajv);
|
|
11
|
+
ajv.addSchema(pluginMetadataSchema, pluginMetadataSchema['$id']);
|
|
12
|
+
ajv.addSchema(signalSchema, signalSchema['$id']);
|
|
13
|
+
ajv.addSchema(messagingSchema, messagingSchema['$id']);
|
|
14
|
+
const validateSchema = ajv.compile(manifestSchema);
|
|
15
|
+
function semanticError(instancePath, schemaPath, keyword, message) {
|
|
16
|
+
return {
|
|
17
|
+
valid: false,
|
|
18
|
+
errors: [{ instancePath, schemaPath, keyword, message }],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function requiredWhenScalarType(field) {
|
|
22
|
+
switch (field.kind) {
|
|
23
|
+
case 'string':
|
|
24
|
+
case 'secret':
|
|
25
|
+
case 'select':
|
|
26
|
+
case 'url':
|
|
27
|
+
return 'string';
|
|
28
|
+
case 'number':
|
|
29
|
+
return 'number';
|
|
30
|
+
case 'boolean':
|
|
31
|
+
return 'boolean';
|
|
32
|
+
case 'operation':
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validates an untrusted plugin manifest against the contract-owned schema.
|
|
38
|
+
*
|
|
39
|
+
* The schema is resolved through the package's public export so runtime users
|
|
40
|
+
* and the conformance suite share one manifest definition and Ajv policy.
|
|
41
|
+
*/
|
|
42
|
+
export function validateManifest(value) {
|
|
43
|
+
if (validateSchema(value)) {
|
|
44
|
+
const manifest = value;
|
|
45
|
+
const declaredTypes = new Set();
|
|
46
|
+
for (const [index, declaration] of (manifest.signals?.provides ?? []).entries()) {
|
|
47
|
+
if (declaredTypes.has(declaration.type)) {
|
|
48
|
+
return {
|
|
49
|
+
valid: false,
|
|
50
|
+
errors: [
|
|
51
|
+
{
|
|
52
|
+
instancePath: `/signals/provides/${index}/type`,
|
|
53
|
+
schemaPath: '#/$defs/SignalContribution/uniqueSignalTypes',
|
|
54
|
+
keyword: 'uniqueSignalTypes',
|
|
55
|
+
message: 'signal type must be declared at most once per manifest',
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
declaredTypes.add(declaration.type);
|
|
61
|
+
}
|
|
62
|
+
const featureIds = new Set();
|
|
63
|
+
for (const [index, feature] of manifest.features.entries()) {
|
|
64
|
+
if (featureIds.has(feature.id)) {
|
|
65
|
+
return semanticError(`/features/${index}/id`, '#/$defs/PluginFeature/uniqueFeatureIds', 'uniqueFeatureIds', 'feature id must be declared at most once per manifest');
|
|
66
|
+
}
|
|
67
|
+
featureIds.add(feature.id);
|
|
68
|
+
}
|
|
69
|
+
const configuration = manifest.configuration ?? [];
|
|
70
|
+
const configByKey = new Map();
|
|
71
|
+
for (const [index, field] of configuration.entries()) {
|
|
72
|
+
if (configByKey.has(field.key)) {
|
|
73
|
+
return semanticError(`/configuration/${index}/key`, '#/$defs/ConfigurationField/uniqueConfigurationKeys', 'uniqueConfigurationKeys', 'configuration key must be declared at most once per manifest');
|
|
74
|
+
}
|
|
75
|
+
configByKey.set(field.key, field);
|
|
76
|
+
if (field.kind === 'select') {
|
|
77
|
+
const optionValues = new Set();
|
|
78
|
+
for (const [optionIndex, option] of (field.options ?? []).entries()) {
|
|
79
|
+
if (optionValues.has(option.value)) {
|
|
80
|
+
return semanticError(`/configuration/${index}/options/${optionIndex}/value`, '#/$defs/ConfigurationOption/uniqueOptionValues', 'uniqueOptionValues', 'select option values must be unique within one configuration field');
|
|
81
|
+
}
|
|
82
|
+
optionValues.add(option.value);
|
|
83
|
+
}
|
|
84
|
+
if (field.default !== undefined && !optionValues.has(field.default)) {
|
|
85
|
+
return semanticError(`/configuration/${index}/default`, '#/$defs/ConfigurationField/defaultDeclaredBySelect', 'defaultDeclaredBySelect', 'select default must equal one of the declared option values');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const [index, field] of configuration.entries()) {
|
|
90
|
+
if (field.requiredWhen === undefined)
|
|
91
|
+
continue;
|
|
92
|
+
const conditionField = configByKey.get(field.requiredWhen.key);
|
|
93
|
+
if (conditionField === undefined) {
|
|
94
|
+
return semanticError(`/configuration/${index}/requiredWhen/key`, '#/$defs/ConfigurationField/requiredWhenDeclaredKey', 'requiredWhenDeclaredKey', 'requiredWhen key must reference a declared configuration field');
|
|
95
|
+
}
|
|
96
|
+
const scalarType = requiredWhenScalarType(conditionField);
|
|
97
|
+
if (scalarType === undefined) {
|
|
98
|
+
return semanticError(`/configuration/${index}/requiredWhen/key`, '#/$defs/ConfigurationField/requiredWhenScalarKey', 'requiredWhenScalarKey', 'requiredWhen key must reference a non-operation scalar configuration field');
|
|
99
|
+
}
|
|
100
|
+
const conditionValues = Array.isArray(field.requiredWhen.value)
|
|
101
|
+
? field.requiredWhen.value
|
|
102
|
+
: [field.requiredWhen.value];
|
|
103
|
+
if (!conditionValues.every((value) => typeof value === scalarType)) {
|
|
104
|
+
return semanticError(`/configuration/${index}/requiredWhen/value`, '#/$defs/ConfigurationField/requiredWhenCompatibleValue', 'requiredWhenCompatibleValue', `requiredWhen value must match the referenced ${scalarType} configuration field`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
for (const [index, field] of configuration.entries()) {
|
|
108
|
+
if (field.kind !== 'operation')
|
|
109
|
+
continue;
|
|
110
|
+
const actionIds = new Set();
|
|
111
|
+
for (const [actionIndex, action] of field.actions.entries()) {
|
|
112
|
+
if (actionIds.has(action.id)) {
|
|
113
|
+
return semanticError(`/configuration/${index}/actions/${actionIndex}/id`, '#/$defs/ActionDef/uniqueActionIds', 'uniqueActionIds', 'operation action id must be unique within the same operation');
|
|
114
|
+
}
|
|
115
|
+
actionIds.add(action.id);
|
|
116
|
+
}
|
|
117
|
+
for (const [actionIndex, action] of field.actions.entries()) {
|
|
118
|
+
for (const reference of ['next', 'rollback']) {
|
|
119
|
+
const target = action[reference];
|
|
120
|
+
if (target !== undefined && !actionIds.has(target)) {
|
|
121
|
+
return semanticError(`/configuration/${index}/actions/${actionIndex}/${reference}`, `#/$defs/ActionDef/${reference}DeclaredByOperation`, `${reference}DeclaredByOperation`, `operation action ${reference} must reference an action in the same operation`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
for (const [targetIndex, target] of (field.target ?? []).entries()) {
|
|
126
|
+
const targetField = configByKey.get(target);
|
|
127
|
+
if (targetField === undefined || targetField.kind === 'operation') {
|
|
128
|
+
return semanticError(`/configuration/${index}/target/${targetIndex}`, '#/$defs/ConfigurationField/declaredValueTarget', 'declaredValueTarget', 'operation target must reference a declared non-operation configuration key');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const contributions = manifest.contributions ?? [];
|
|
133
|
+
const webhooks = contributions.filter(contribution => contribution.type === 'webhook');
|
|
134
|
+
for (const [index, route] of webhooks.entries()) {
|
|
135
|
+
const segments = route.path.split('/');
|
|
136
|
+
const names = segments.filter(segment => segment.startsWith(':'));
|
|
137
|
+
if (new Set(names).size !== names.length)
|
|
138
|
+
return semanticError(`/contributions/${contributions.indexOf(route)}/path`, '#/$defs/WebhookContribution/uniqueParameters', 'uniqueParameters', 'webhook parameter names must be unique within a path');
|
|
139
|
+
for (const previous of webhooks.slice(0, index)) {
|
|
140
|
+
const other = previous.path.split('/');
|
|
141
|
+
const overlap = segments.length === other.length && segments.every((segment, i) => segment === other[i] || segment.startsWith(':') || other[i].startsWith(':'));
|
|
142
|
+
if (overlap && route.methods.some(method => previous.methods.includes(method)))
|
|
143
|
+
return semanticError(`/contributions/${contributions.indexOf(route)}/path`, '#/$defs/WebhookContribution/unambiguousRoutes', 'unambiguousRoutes', 'webhook paths must not overlap for a shared HTTP method');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const contributionByKey = new Map();
|
|
147
|
+
for (const [index, contribution] of contributions.entries()) {
|
|
148
|
+
const key = `${contribution.type}\0${contribution.id}`;
|
|
149
|
+
if (contributionByKey.has(key)) {
|
|
150
|
+
return semanticError(`/contributions/${index}/id`, '#/$defs/StaticContribution/uniqueContributionKeys', 'uniqueContributionKeys', 'contribution type/id must be declared at most once per manifest');
|
|
151
|
+
}
|
|
152
|
+
contributionByKey.set(key, contribution);
|
|
153
|
+
if ('environment' in contribution && contribution.environment !== undefined) {
|
|
154
|
+
for (const [environmentName, binding] of Object.entries(contribution.environment)) {
|
|
155
|
+
const field = configByKey.get(binding.key);
|
|
156
|
+
if (field === undefined) {
|
|
157
|
+
return semanticError(`/contributions/${index}/environment/${environmentName}/key`, '#/$defs/EnvironmentBinding/declaredConfigurationKey', 'declaredConfigurationKey', 'environment binding must reference a declared configuration key');
|
|
158
|
+
}
|
|
159
|
+
if ((binding.source === 'secret' && field.kind !== 'secret') ||
|
|
160
|
+
(binding.source === 'config' && field.kind === 'secret')) {
|
|
161
|
+
return semanticError(`/contributions/${index}/environment/${environmentName}/source`, '#/$defs/EnvironmentBinding/sourceMatchesConfigurationKind', 'sourceMatchesConfigurationKind', 'secret bindings must reference secret fields and config bindings must not');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (contribution.type === 'webhook' && contribution.verificationSecretRef !== undefined) {
|
|
166
|
+
const secret = configByKey.get(contribution.verificationSecretRef);
|
|
167
|
+
if (secret?.kind !== 'secret') {
|
|
168
|
+
return semanticError(`/contributions/${index}/verificationSecretRef`, '#/$defs/WebhookContribution/declaredSecretReference', 'declaredSecretReference', 'webhook verificationSecretRef must reference a declared secret field');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (manifest.runtime === undefined) {
|
|
173
|
+
const runtimeConfigurationIndex = configuration.findIndex((field) => field.kind === 'operation');
|
|
174
|
+
if (runtimeConfigurationIndex !== -1) {
|
|
175
|
+
const field = configuration[runtimeConfigurationIndex];
|
|
176
|
+
return semanticError(`/configuration/${runtimeConfigurationIndex}`, '#/$defs/ConfigurationField/runtimeRequired', 'runtimeRequired', `runtime is required by configuration ${field.key}`);
|
|
177
|
+
}
|
|
178
|
+
if (manifest.test !== undefined) {
|
|
179
|
+
return semanticError('/test', '#/$defs/PluginTestDeclaration/runtimeRequired', 'runtimeRequired', `runtime is required by test ${manifest.pluginId}`);
|
|
180
|
+
}
|
|
181
|
+
const runtimeContributionIndex = contributions.findIndex((contribution) => 'action' in contribution ||
|
|
182
|
+
contribution.type === 'media-source' ||
|
|
183
|
+
contribution.type === 'limb' ||
|
|
184
|
+
contribution.type === 'connector' ||
|
|
185
|
+
contribution.type === 'cloud-conversation-host');
|
|
186
|
+
if (runtimeContributionIndex !== -1) {
|
|
187
|
+
const contribution = contributions[runtimeContributionIndex];
|
|
188
|
+
return semanticError(`/contributions/${runtimeContributionIndex}`, '#/$defs/StaticContribution/runtimeRequired', 'runtimeRequired', `runtime is required by contribution ${contribution.id}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const referenceOwners = new Map();
|
|
192
|
+
for (const [featureIndex, feature] of manifest.features.entries()) {
|
|
193
|
+
for (const [contributionIndex, reference] of (feature.contributions ?? []).entries()) {
|
|
194
|
+
const key = `${reference.type}\0${reference.id}`;
|
|
195
|
+
if (!contributionByKey.has(key)) {
|
|
196
|
+
return semanticError(`/features/${featureIndex}/contributions/${contributionIndex}`, '#/$defs/ContributionReference/declaredContribution', 'declaredContribution', 'feature contribution must reference a declared contribution with the same type and id');
|
|
197
|
+
}
|
|
198
|
+
const existingOwner = referenceOwners.get(key);
|
|
199
|
+
if (existingOwner !== undefined) {
|
|
200
|
+
return semanticError(`/features/${featureIndex}/contributions/${contributionIndex}`, '#/$defs/ContributionReference/singleFeatureOwner', 'singleFeatureOwner', `a static contribution must have exactly one feature reference; already owned by ${existingOwner}`);
|
|
201
|
+
}
|
|
202
|
+
referenceOwners.set(key, feature.id);
|
|
203
|
+
if (reference.type === 'desktop-window' && !feature.capabilities.includes('windows.create')) {
|
|
204
|
+
return semanticError(`/features/${featureIndex}/capabilities`, '#/$defs/DesktopWindowContribution/windowCapabilityRequired', 'windowCapabilityRequired', 'a desktop window must be owned by a feature that requests windows.create');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
for (const [key, contribution] of contributionByKey) {
|
|
209
|
+
if (!referenceOwners.has(key)) {
|
|
210
|
+
const index = contributions.indexOf(contribution);
|
|
211
|
+
return semanticError(`/contributions/${index}`, '#/$defs/StaticContribution/featureOwnerRequired', 'featureOwnerRequired', 'every static contribution must be owned by one feature resource reference');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
for (const [index, contribution] of contributions.entries()) {
|
|
215
|
+
const owner = referenceOwners.get(`${contribution.type}\0${contribution.id}`);
|
|
216
|
+
if (contribution.type === 'connector') {
|
|
217
|
+
const identityKey = `identity\0${contribution.identityRef}`;
|
|
218
|
+
if (!contributionByKey.has(identityKey)) {
|
|
219
|
+
return semanticError(`/contributions/${index}/identityRef`, '#/$defs/ConnectorContribution/declaredIdentityReference', 'declaredIdentityReference', 'connector identityRef must reference a declared identity contribution');
|
|
220
|
+
}
|
|
221
|
+
if (referenceOwners.get(identityKey) !== owner) {
|
|
222
|
+
return semanticError(`/contributions/${index}/identityRef`, '#/$defs/ConnectorContribution/sameFeatureOwner', 'sameFeatureOwner', 'connector identityRef must reference an identity owned by the same feature');
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (contribution.type === 'media-source') {
|
|
226
|
+
const identityKey = `identity\0${contribution.binding}`;
|
|
227
|
+
if (!contributionByKey.has(identityKey)) {
|
|
228
|
+
return semanticError(`/contributions/${index}/binding`, '#/$defs/MediaSourceContribution/declaredIdentityBinding', 'declaredIdentityBinding', 'media-source binding must reference a declared identity contribution');
|
|
229
|
+
}
|
|
230
|
+
if (referenceOwners.get(identityKey) !== owner) {
|
|
231
|
+
return semanticError(`/contributions/${index}/binding`, '#/$defs/MediaSourceContribution/sameFeatureOwner', 'sameFeatureOwner', 'media-source binding must reference an identity owned by the same feature');
|
|
232
|
+
}
|
|
233
|
+
const feature = manifest.features.find((candidate) => candidate.id === owner);
|
|
234
|
+
if (feature === undefined ||
|
|
235
|
+
!feature.capabilities.includes('plugin.state.get') ||
|
|
236
|
+
!feature.capabilities.includes('plugin.state.set')) {
|
|
237
|
+
return semanticError(`/features/${manifest.features.indexOf(feature)}/capabilities`, '#/$defs/MediaSourceContribution/stateCapabilitiesRequired', 'stateCapabilitiesRequired', 'media-source requires plugin.state.get and plugin.state.set for durable PMR retention');
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (contribution.type === 'cloud-conversation-host') {
|
|
241
|
+
const feature = manifest.features.find((candidate) => candidate.id === owner);
|
|
242
|
+
if (feature === undefined || !feature.capabilities.includes('cloud.conversation.host')) {
|
|
243
|
+
return semanticError(`/features/${manifest.features.indexOf(feature)}/capabilities`, '#/$defs/CloudConversationHostContribution/capabilityRequired', 'capabilityRequired', 'a cloud conversation host must be owned by a feature that requests cloud.conversation.host');
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (contribution.type === 'ui' && contribution.kind === 'slot-item') {
|
|
247
|
+
const commandKey = `ui\0${contribution.command}`;
|
|
248
|
+
const command = contributionByKey.get(commandKey);
|
|
249
|
+
if (command?.type !== 'ui' || command.kind !== 'command') {
|
|
250
|
+
return semanticError(`/contributions/${index}/command`, '#/$defs/UiSlotItemContribution/declaredCommandReference', 'declaredCommandReference', 'UI slot command must reference a declared UI command contribution');
|
|
251
|
+
}
|
|
252
|
+
if (referenceOwners.get(commandKey) !== owner) {
|
|
253
|
+
return semanticError(`/contributions/${index}/command`, '#/$defs/UiSlotItemContribution/sameFeatureOwner', 'sameFeatureOwner', 'UI slot command must reference a command owned by the same feature');
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
valid: true,
|
|
259
|
+
manifest,
|
|
260
|
+
errors: [],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
valid: false,
|
|
265
|
+
errors: (validateSchema.errors ?? []).map((error) => ({
|
|
266
|
+
instancePath: error.instancePath,
|
|
267
|
+
schemaPath: error.schemaPath,
|
|
268
|
+
keyword: error.keyword,
|
|
269
|
+
message: error.message ?? 'manifest validation failed',
|
|
270
|
+
})),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/validation/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PluginMember } from '../generated/contract.generated.js';
|
|
2
|
+
/** Public registry data only. Availability is quota information, never invocation permission. */
|
|
3
|
+
export declare function assertPluginMember(value: unknown): asserts value is PluginMember;
|
|
4
|
+
//# sourceMappingURL=members.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/validation/members.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAKvE,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAEhF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
const require = createRequire(import.meta.url);
|
|
3
|
+
const Ajv = require('ajv/dist/2020');
|
|
4
|
+
const schema = require('@clowder-ai/plugin-contract/schemas/manifest');
|
|
5
|
+
const member = new Ajv({ strict: false, allErrors: true }).compile({ $defs: schema.$defs, $ref: '#/$defs/PluginMember' });
|
|
6
|
+
/** Public registry data only. Availability is quota information, never invocation permission. */
|
|
7
|
+
export function assertPluginMember(value) {
|
|
8
|
+
if (!member(value) || !value.catId.trim())
|
|
9
|
+
throw new TypeError('Invalid PluginMember');
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/validation/members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AACrC,MAAM,MAAM,GAAG,OAAO,CAAC,8CAA8C,CAAC,CAAC;AACvE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC;AAC1H,iGAAiG;AACjG,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAE,KAAsB,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;AAC3G,CAAC"}
|
|
@@ -1 +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;
|
|
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;AAyJD,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACb,wBAAwB,CA2F1B"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { MESSAGING_BOUNDS } from '../generated/contract.generated.js';
|
|
2
|
+
const FORBIDDEN_DISPLAY_URL_QUERY_KEYS = new Set([
|
|
3
|
+
'bearer',
|
|
4
|
+
'access_token',
|
|
5
|
+
'token',
|
|
6
|
+
'secret',
|
|
7
|
+
'api_key',
|
|
8
|
+
]);
|
|
2
9
|
function isRecord(value) {
|
|
3
10
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
11
|
}
|
|
@@ -13,6 +20,35 @@ function payloadBytes(payload) {
|
|
|
13
20
|
return undefined;
|
|
14
21
|
}
|
|
15
22
|
}
|
|
23
|
+
function isCanonicalOccurredAt(value) {
|
|
24
|
+
if (typeof value !== 'string')
|
|
25
|
+
return false;
|
|
26
|
+
const date = new Date(value);
|
|
27
|
+
return Number.isFinite(date.getTime()) && date.toISOString() === value;
|
|
28
|
+
}
|
|
29
|
+
function envelopesFor(schemaRef, value) {
|
|
30
|
+
if (schemaRef === 'MessageEnvelope')
|
|
31
|
+
return [value];
|
|
32
|
+
if (!isRecord(value))
|
|
33
|
+
return [];
|
|
34
|
+
if (schemaRef === 'MessagePublishEvent' || schemaRef === 'PluginDeliveryInput') {
|
|
35
|
+
return value['envelope'] === undefined ? [] : [value['envelope']];
|
|
36
|
+
}
|
|
37
|
+
if (schemaRef === 'MessageOutputEvent') {
|
|
38
|
+
return value['type'] === 'message.publish' ? [value['envelope']] : [];
|
|
39
|
+
}
|
|
40
|
+
if ((schemaRef === 'SubscriptionReadResponse' || schemaRef === 'M0CReadResult') &&
|
|
41
|
+
Array.isArray(value['events'])) {
|
|
42
|
+
return value['events'].flatMap((event) => envelopesFor('MessageOutputEvent', event));
|
|
43
|
+
}
|
|
44
|
+
if (schemaRef === 'SnapshotResponse' && Array.isArray(value['envelopes'])) {
|
|
45
|
+
return value['envelopes'];
|
|
46
|
+
}
|
|
47
|
+
if (schemaRef === 'M0CSnapshotResult' && Array.isArray(value['items'])) {
|
|
48
|
+
return value['items'];
|
|
49
|
+
}
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
16
52
|
function elementGroups(schemaRef, value) {
|
|
17
53
|
if (!isRecord(value))
|
|
18
54
|
return [];
|
|
@@ -40,9 +76,20 @@ function elementGroups(schemaRef, value) {
|
|
|
40
76
|
if (schemaRef === 'SubscriptionReadResponse' && Array.isArray(value['events'])) {
|
|
41
77
|
return value['events'].flatMap((event) => elementGroups('MessageOutputEvent', event));
|
|
42
78
|
}
|
|
79
|
+
if (schemaRef === 'M0CReadResult' && Array.isArray(value['events'])) {
|
|
80
|
+
return value['events'].flatMap((event) => elementGroups('MessageOutputEvent', event));
|
|
81
|
+
}
|
|
43
82
|
if (schemaRef === 'SnapshotResponse' && Array.isArray(value['envelopes'])) {
|
|
44
83
|
return value['envelopes'].flatMap((envelope) => elementGroups('MessageEnvelope', envelope));
|
|
45
84
|
}
|
|
85
|
+
if (schemaRef === 'M0CSnapshotResult' && Array.isArray(value['items'])) {
|
|
86
|
+
return value['items'].flatMap((envelope) => elementGroups('MessageEnvelope', envelope));
|
|
87
|
+
}
|
|
88
|
+
if (schemaRef === 'PluginDeliveryInput') {
|
|
89
|
+
return isRecord(value['envelope'])
|
|
90
|
+
? elementGroups('MessageEnvelope', value['envelope'])
|
|
91
|
+
: [];
|
|
92
|
+
}
|
|
46
93
|
if (schemaRef === 'root') {
|
|
47
94
|
if ('address' in value && 'payload' in value) {
|
|
48
95
|
return elementGroups('MessageDraft', value);
|
|
@@ -69,6 +116,9 @@ export function validateMessagingSemantics(schemaRef, value) {
|
|
|
69
116
|
const errors = [];
|
|
70
117
|
for (const [groupIndex, elements] of elementGroups(schemaRef, value).entries()) {
|
|
71
118
|
let totalBytes = 0;
|
|
119
|
+
const mediaElementIds = new Set(elements.flatMap((element) => isRecord(element) && element['kind'] === 'media_ref' && typeof element['elementId'] === 'string'
|
|
120
|
+
? [element['elementId']]
|
|
121
|
+
: []));
|
|
72
122
|
for (const [elementIndex, rawElement] of elements.entries()) {
|
|
73
123
|
const path = `/elementGroups/${groupIndex}/${elementIndex}/payload`;
|
|
74
124
|
const payload = isRecord(rawElement)
|
|
@@ -86,6 +136,16 @@ export function validateMessagingSemantics(schemaRef, value) {
|
|
|
86
136
|
message: `element payload exceeds ${MESSAGING_BOUNDS.maxElementPayloadBytes} bytes`,
|
|
87
137
|
});
|
|
88
138
|
}
|
|
139
|
+
if (isRecord(rawElement) &&
|
|
140
|
+
rawElement['kind'] === 'media_warning' &&
|
|
141
|
+
isRecord(payload) &&
|
|
142
|
+
typeof payload['mediaElementId'] === 'string' &&
|
|
143
|
+
!mediaElementIds.has(payload['mediaElementId'])) {
|
|
144
|
+
errors.push({
|
|
145
|
+
path: `${path}/mediaElementId`,
|
|
146
|
+
message: 'media_warning must reference a media_ref element in the same message',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
89
149
|
}
|
|
90
150
|
if (totalBytes > MESSAGING_BOUNDS.maxTotalPayloadBytes) {
|
|
91
151
|
errors.push({
|
|
@@ -94,6 +154,44 @@ export function validateMessagingSemantics(schemaRef, value) {
|
|
|
94
154
|
});
|
|
95
155
|
}
|
|
96
156
|
}
|
|
157
|
+
if (schemaRef === 'PluginDeliveryInput') {
|
|
158
|
+
const candidates = [];
|
|
159
|
+
if (isRecord(value)) {
|
|
160
|
+
if (isRecord(value['presentation'])) {
|
|
161
|
+
candidates.push({ path: '/presentation/deepLinkUrl', value: value['presentation']['deepLinkUrl'] });
|
|
162
|
+
}
|
|
163
|
+
candidates.push({ path: '/recoveryUrl', value: value['recoveryUrl'] });
|
|
164
|
+
}
|
|
165
|
+
for (const candidate of candidates) {
|
|
166
|
+
if (candidate.value === undefined)
|
|
167
|
+
continue;
|
|
168
|
+
try {
|
|
169
|
+
const url = new URL(String(candidate.value));
|
|
170
|
+
const forbidden = [...url.searchParams.keys()].find((key) => FORBIDDEN_DISPLAY_URL_QUERY_KEYS.has(key.toLowerCase()));
|
|
171
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
172
|
+
throw new Error('protocol');
|
|
173
|
+
if (url.username !== '' || url.password !== '')
|
|
174
|
+
throw new Error('userinfo');
|
|
175
|
+
if (forbidden !== undefined)
|
|
176
|
+
throw new Error(`credential query key ${forbidden}`);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
errors.push({
|
|
180
|
+
path: candidate.path,
|
|
181
|
+
message: 'display URL must be absolute http(s) without userinfo or credential query keys',
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const envelopes = envelopesFor(schemaRef, value);
|
|
187
|
+
for (const [index, rawEnvelope] of envelopes.entries()) {
|
|
188
|
+
if (!isRecord(rawEnvelope) || !isCanonicalOccurredAt(rawEnvelope['occurredAt'])) {
|
|
189
|
+
errors.push({
|
|
190
|
+
path: `/envelopes/${index}/occurredAt`,
|
|
191
|
+
message: 'occurredAt must be canonical Date.toISOString output',
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
97
195
|
return { valid: errors.length === 0, errors };
|
|
98
196
|
}
|
|
99
197
|
//# sourceMappingURL=messaging-semantic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messaging-semantic.js","sourceRoot":"","sources":["../../src/validation/messaging-semantic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"messaging-semantic.js","sourceRoot":"","sources":["../../src/validation/messaging-semantic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AppendInput, AppendResult, DeliverInput, DeliverResult, MediaReadInput, MediaReadResult, ReadInput, ReadResult, SendInput, SendResult, MessagingAckRequest, MessagingAckResult, SnapshotInput, SnapshotResult, SubscribeInput, SubscribeResult } from '../wire/row-shapes.js';
|
|
2
|
+
export interface MessagingRowValidationError {
|
|
3
|
+
readonly instancePath: string;
|
|
4
|
+
readonly schemaPath: string;
|
|
5
|
+
readonly keyword: string;
|
|
6
|
+
readonly message: string;
|
|
7
|
+
}
|
|
8
|
+
export type MessagingRowValidationResult<Value> = {
|
|
9
|
+
readonly valid: true;
|
|
10
|
+
readonly value: Value;
|
|
11
|
+
readonly errors: readonly [];
|
|
12
|
+
} | {
|
|
13
|
+
readonly valid: false;
|
|
14
|
+
readonly errors: readonly MessagingRowValidationError[];
|
|
15
|
+
};
|
|
16
|
+
export declare const MESSAGING_ROW_METHODS: readonly ["messaging.send", "messaging.appendElements", "messaging.subscribe", "messaging.read", "messaging.ack", "messaging.snapshot", "streams.read", "host.messaging.deliver"];
|
|
17
|
+
export type MessagingRowMethod = (typeof MESSAGING_ROW_METHODS)[number];
|
|
18
|
+
export interface MessagingRowInputByMethod {
|
|
19
|
+
readonly 'messaging.send': SendInput;
|
|
20
|
+
readonly 'messaging.appendElements': AppendInput;
|
|
21
|
+
readonly 'messaging.subscribe': SubscribeInput;
|
|
22
|
+
readonly 'messaging.read': ReadInput;
|
|
23
|
+
readonly 'messaging.ack': MessagingAckRequest;
|
|
24
|
+
readonly 'messaging.snapshot': SnapshotInput;
|
|
25
|
+
readonly 'streams.read': MediaReadInput;
|
|
26
|
+
readonly 'host.messaging.deliver': DeliverInput;
|
|
27
|
+
}
|
|
28
|
+
export interface MessagingRowResultByMethod {
|
|
29
|
+
readonly 'messaging.send': SendResult;
|
|
30
|
+
readonly 'messaging.appendElements': AppendResult;
|
|
31
|
+
readonly 'messaging.subscribe': SubscribeResult;
|
|
32
|
+
readonly 'messaging.read': ReadResult;
|
|
33
|
+
readonly 'messaging.ack': MessagingAckResult;
|
|
34
|
+
readonly 'messaging.snapshot': SnapshotResult;
|
|
35
|
+
readonly 'streams.read': MediaReadResult;
|
|
36
|
+
readonly 'host.messaging.deliver': DeliverResult;
|
|
37
|
+
}
|
|
38
|
+
export declare function validateMessagingRowInput<Method extends MessagingRowMethod>(method: Method, value: unknown): MessagingRowValidationResult<MessagingRowInputByMethod[Method]>;
|
|
39
|
+
export declare function validateMessagingRowResult<Method extends MessagingRowMethod>(method: Method, value: unknown): MessagingRowValidationResult<MessagingRowResultByMethod[Method]>;
|
|
40
|
+
export declare function isPluginDeliveryInput(value: unknown): value is import('../generated/contract.generated.js').PluginDeliveryInput;
|
|
41
|
+
export declare function isPluginDeliveryReceipt(value: unknown): value is import('../generated/contract.generated.js').PluginDeliveryReceipt;
|
|
42
|
+
//# sourceMappingURL=messaging-wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging-wire.d.ts","sourceRoot":"","sources":["../../src/validation/messaging-wire.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,SAAS,EACT,UAAU,EACV,SAAS,EACT,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,uBAAuB,CAAC;AA+B/B,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,4BAA4B,CAAC,KAAK,IAC1C;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,GAC7E;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,2BAA2B,EAAE,CAAA;CAAE,CAAC;AAEvF,eAAO,MAAM,qBAAqB,mLASxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,CAAC;IACrC,QAAQ,CAAC,0BAA0B,EAAE,WAAW,CAAC;IACjD,QAAQ,CAAC,qBAAqB,EAAE,cAAc,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAC9C,QAAQ,CAAC,oBAAoB,EAAE,aAAa,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,wBAAwB,EAAE,YAAY,CAAC;CACjD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,gBAAgB,EAAE,UAAU,CAAC;IACtC,QAAQ,CAAC,0BAA0B,EAAE,YAAY,CAAC;IAClD,QAAQ,CAAC,qBAAqB,EAAE,eAAe,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,UAAU,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC;IAC7C,QAAQ,CAAC,oBAAoB,EAAE,cAAc,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,wBAAwB,EAAE,aAAa,CAAC;CAClD;AAwKD,wBAAgB,yBAAyB,CAAC,MAAM,SAAS,kBAAkB,EACzE,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,4BAA4B,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAEjE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,SAAS,kBAAkB,EAC1E,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,4BAA4B,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAiBlE;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,oCAAoC,EAAE,mBAAmB,CAI/H;AACD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,oCAAoC,EAAE,qBAAqB,CAEnI"}
|