@clowder-ai/plugin-contract 0.1.0-beta.9 → 0.2.0

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.
Files changed (145) hide show
  1. package/dist/codegen/generate-contract.d.ts +6 -0
  2. package/dist/codegen/generate-contract.d.ts.map +1 -1
  3. package/dist/codegen/generate-contract.js +343 -19
  4. package/dist/codegen/generate-contract.js.map +1 -1
  5. package/dist/conformance/fixtures.d.ts +3 -1
  6. package/dist/conformance/fixtures.d.ts.map +1 -1
  7. package/dist/conformance/fixtures.js +2 -1
  8. package/dist/conformance/fixtures.js.map +1 -1
  9. package/dist/conformance/index.d.ts +2 -1
  10. package/dist/conformance/index.d.ts.map +1 -1
  11. package/dist/conformance/index.js +2 -1
  12. package/dist/conformance/index.js.map +1 -1
  13. package/dist/conformance/messaging-behavior-fixture.d.ts +12 -0
  14. package/dist/conformance/messaging-behavior-fixture.d.ts.map +1 -0
  15. package/dist/conformance/messaging-behavior-fixture.js +30 -0
  16. package/dist/conformance/messaging-behavior-fixture.js.map +1 -0
  17. package/dist/conformance/runner.d.ts.map +1 -1
  18. package/dist/conformance/runner.js +3 -1
  19. package/dist/conformance/runner.js.map +1 -1
  20. package/dist/docx-materialization.d.ts +8 -0
  21. package/dist/docx-materialization.d.ts.map +1 -0
  22. package/dist/docx-materialization.js +19 -0
  23. package/dist/docx-materialization.js.map +1 -0
  24. package/dist/generated/contract.generated.d.ts +1647 -52
  25. package/dist/generated/contract.generated.d.ts.map +1 -1
  26. package/dist/generated/contract.generated.js +72 -3
  27. package/dist/generated/contract.generated.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.js +1 -1
  30. package/dist/validation/catalog.d.ts +21 -0
  31. package/dist/validation/catalog.d.ts.map +1 -0
  32. package/dist/validation/catalog.js +140 -0
  33. package/dist/validation/catalog.js.map +1 -0
  34. package/dist/validation/cloud-conversation-host.d.ts +18 -0
  35. package/dist/validation/cloud-conversation-host.d.ts.map +1 -0
  36. package/dist/validation/cloud-conversation-host.js +83 -0
  37. package/dist/validation/cloud-conversation-host.js.map +1 -0
  38. package/dist/validation/companion-bridge.d.ts +6 -0
  39. package/dist/validation/companion-bridge.d.ts.map +1 -0
  40. package/dist/validation/companion-bridge.js +198 -0
  41. package/dist/validation/companion-bridge.js.map +1 -0
  42. package/dist/validation/docx-materialization.d.ts +6 -0
  43. package/dist/validation/docx-materialization.d.ts.map +1 -0
  44. package/dist/validation/docx-materialization.js +36 -0
  45. package/dist/validation/docx-materialization.js.map +1 -0
  46. package/dist/validation/index.d.ts +9 -1
  47. package/dist/validation/index.d.ts.map +1 -1
  48. package/dist/validation/index.js +9 -1
  49. package/dist/validation/index.js.map +1 -1
  50. package/dist/validation/manifest.d.ts.map +1 -1
  51. package/dist/validation/manifest.js +303 -0
  52. package/dist/validation/manifest.js.map +1 -1
  53. package/dist/validation/members.d.ts +4 -0
  54. package/dist/validation/members.d.ts.map +1 -0
  55. package/dist/validation/members.js +11 -0
  56. package/dist/validation/members.js.map +1 -0
  57. package/dist/validation/messaging-semantic.d.ts.map +1 -1
  58. package/dist/validation/messaging-semantic.js +98 -0
  59. package/dist/validation/messaging-semantic.js.map +1 -1
  60. package/dist/validation/messaging-wire.d.ts +42 -0
  61. package/dist/validation/messaging-wire.d.ts.map +1 -0
  62. package/dist/validation/messaging-wire.js +184 -0
  63. package/dist/validation/messaging-wire.js.map +1 -0
  64. package/dist/validation/operation-rows.d.ts +25 -0
  65. package/dist/validation/operation-rows.d.ts.map +1 -0
  66. package/dist/validation/operation-rows.js +135 -0
  67. package/dist/validation/operation-rows.js.map +1 -0
  68. package/dist/validation/signals.d.ts +1 -10
  69. package/dist/validation/signals.d.ts.map +1 -1
  70. package/dist/validation/signals.js +0 -174
  71. package/dist/validation/signals.js.map +1 -1
  72. package/dist/variant.d.ts +114 -0
  73. package/dist/variant.d.ts.map +1 -0
  74. package/dist/variant.js +305 -0
  75. package/dist/variant.js.map +1 -0
  76. package/dist/wire/constants.d.ts +2 -1
  77. package/dist/wire/constants.d.ts.map +1 -1
  78. package/dist/wire/constants.js +2 -1
  79. package/dist/wire/constants.js.map +1 -1
  80. package/dist/wire/dispatch.d.ts +49 -0
  81. package/dist/wire/dispatch.d.ts.map +1 -0
  82. package/dist/wire/dispatch.js +880 -0
  83. package/dist/wire/dispatch.js.map +1 -0
  84. package/dist/wire/disposition-fixtures.d.ts +9 -1
  85. package/dist/wire/disposition-fixtures.d.ts.map +1 -1
  86. package/dist/wire/disposition-fixtures.js +622 -95
  87. package/dist/wire/disposition-fixtures.js.map +1 -1
  88. package/dist/wire/envelope.d.ts +31 -0
  89. package/dist/wire/envelope.d.ts.map +1 -1
  90. package/dist/wire/envelope.js +48 -1
  91. package/dist/wire/envelope.js.map +1 -1
  92. package/dist/wire/errors.d.ts +31 -1
  93. package/dist/wire/errors.d.ts.map +1 -1
  94. package/dist/wire/errors.js +36 -0
  95. package/dist/wire/errors.js.map +1 -1
  96. package/dist/wire/grants.d.ts +4 -4
  97. package/dist/wire/grants.js +3 -3
  98. package/dist/wire/handshake-byte-bounds.d.ts.map +1 -1
  99. package/dist/wire/handshake-byte-bounds.js +5 -2
  100. package/dist/wire/handshake-byte-bounds.js.map +1 -1
  101. package/dist/wire/handshake.d.ts +6 -0
  102. package/dist/wire/handshake.d.ts.map +1 -1
  103. package/dist/wire/handshake.js +6 -3
  104. package/dist/wire/handshake.js.map +1 -1
  105. package/dist/wire/index.d.ts +13 -9
  106. package/dist/wire/index.d.ts.map +1 -1
  107. package/dist/wire/index.js +29 -6
  108. package/dist/wire/index.js.map +1 -1
  109. package/dist/wire/lifecycle-byte-bounds.d.ts +40 -0
  110. package/dist/wire/lifecycle-byte-bounds.d.ts.map +1 -0
  111. package/dist/wire/lifecycle-byte-bounds.js +149 -0
  112. package/dist/wire/lifecycle-byte-bounds.js.map +1 -0
  113. package/dist/wire/messaging-byte-bounds.d.ts +62 -0
  114. package/dist/wire/messaging-byte-bounds.d.ts.map +1 -0
  115. package/dist/wire/messaging-byte-bounds.js +581 -0
  116. package/dist/wire/messaging-byte-bounds.js.map +1 -0
  117. package/dist/wire/registry.d.ts +58 -86
  118. package/dist/wire/registry.d.ts.map +1 -1
  119. package/dist/wire/registry.js +45 -88
  120. package/dist/wire/registry.js.map +1 -1
  121. package/dist/wire/row-shapes.d.ts +86 -69
  122. package/dist/wire/row-shapes.d.ts.map +1 -1
  123. package/dist/wire/row-shapes.js +30 -3
  124. package/dist/wire/row-shapes.js.map +1 -1
  125. package/fixtures/behavior/messaging/adversarial-invariants.json +92 -2
  126. package/fixtures/manifest/invalid/duplicate-signal-type.json +4 -2
  127. package/fixtures/manifest/invalid/icon-package-escape.json +22 -0
  128. package/fixtures/manifest/valid/localized-product-metadata.json +27 -0
  129. package/fixtures/messaging/valid/subscription-delivery.json +1 -1
  130. package/package.json +16 -3
  131. package/src/schemas/behavior-fixture.schema.json +903 -116
  132. package/src/schemas/catalog.schema.json +91 -0
  133. package/src/schemas/companion-bridge.schema.json +2256 -0
  134. package/src/schemas/docx-materialization.schema.json +302 -0
  135. package/src/schemas/manifest.schema.json +2273 -88
  136. package/src/schemas/messaging.schema.json +692 -41
  137. package/src/schemas/plugin-metadata.schema.json +62 -0
  138. package/src/schemas/signal.schema.json +68 -78
  139. package/dist/wire/signal-byte-bounds.d.ts +0 -97
  140. package/dist/wire/signal-byte-bounds.d.ts.map +0 -1
  141. package/dist/wire/signal-byte-bounds.js +0 -229
  142. package/dist/wire/signal-byte-bounds.js.map +0 -1
  143. package/fixtures/signals/invalid/destination-injection.json +0 -15
  144. package/fixtures/signals/invalid/non-utc-occurred-at.json +0 -12
  145. package/fixtures/signals/valid/feishu-meeting-artifact.json +0 -18
@@ -2,12 +2,37 @@ import { createRequire } from 'node:module';
2
2
  const require = createRequire(import.meta.url);
3
3
  const Ajv2020 = require('ajv/dist/2020');
4
4
  const addFormats = require('ajv-formats');
5
+ const pluginMetadataSchema = require('@clowder-ai/plugin-contract/schemas/plugin-metadata');
5
6
  const manifestSchema = require('@clowder-ai/plugin-contract/schemas/manifest');
7
+ const messagingSchema = require('@clowder-ai/plugin-contract/schemas/messaging');
6
8
  const signalSchema = require('@clowder-ai/plugin-contract/schemas/signals');
7
9
  const ajv = new Ajv2020({ allErrors: true, strict: false });
8
10
  addFormats(ajv);
11
+ ajv.addSchema(pluginMetadataSchema, pluginMetadataSchema['$id']);
9
12
  ajv.addSchema(signalSchema, signalSchema['$id']);
13
+ ajv.addSchema(messagingSchema, messagingSchema['$id']);
10
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
+ }
11
36
  /**
12
37
  * Validates an untrusted plugin manifest against the contract-owned schema.
13
38
  *
@@ -34,6 +59,284 @@ export function validateManifest(value) {
34
59
  }
35
60
  declaredTypes.add(declaration.type);
36
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
+ const variants = manifest.configurationVariants;
108
+ if (variants !== undefined) {
109
+ if (manifest.contractVersion !== '0.2.0') {
110
+ return semanticError('/configurationVariants', '#/$defs/ConfigurationVariants/contractVersion', 'contractVersion', 'configurationVariants requires contractVersion 0.2.0');
111
+ }
112
+ const discriminator = configByKey.get(variants.discriminator);
113
+ if (discriminator === undefined) {
114
+ return semanticError('/configurationVariants/discriminator', '#/$defs/ConfigurationVariants/discriminatorDeclaredKey', 'discriminatorDeclaredKey', 'configurationVariants discriminator must reference a declared configuration field');
115
+ }
116
+ if (discriminator.kind !== 'select') {
117
+ return semanticError('/configurationVariants/discriminator', '#/$defs/ConfigurationVariants/discriminatorSelectKey', 'discriminatorSelectKey', 'configurationVariants discriminator must reference a select configuration field');
118
+ }
119
+ const optionValues = (discriminator.options ?? []).map((option) => option.value);
120
+ const optionSet = new Set(optionValues);
121
+ const branchIds = new Set();
122
+ for (const [branchIndex, branch] of variants.branches.entries()) {
123
+ if (branchIds.has(branch.id)) {
124
+ return semanticError(`/configurationVariants/branches/${branchIndex}/id`, '#/$defs/ConfigurationVariantBranch/uniqueBranchIds', 'uniqueBranchIds', 'configurationVariants branch id must be declared at most once per manifest');
125
+ }
126
+ branchIds.add(branch.id);
127
+ const whenKeys = typeof branch.when === 'object' && branch.when !== null
128
+ ? Object.keys(branch.when)
129
+ : [];
130
+ if (whenKeys.length !== 1 || whenKeys[0] !== 'properties') {
131
+ return semanticError(`/configurationVariants/branches/${branchIndex}/when`, '#/$defs/ConfigurationVariantBranch/whenConstrainedKeywords', 'whenConstrainedKeywords', 'configurationVariants branch when must contain only a properties object (unsupported JSON Schema keywords such as not/anyOf are rejected)');
132
+ }
133
+ const properties = branch.when['properties'];
134
+ if (typeof properties !== 'object' || properties === null) {
135
+ return semanticError(`/configurationVariants/branches/${branchIndex}/when/properties`, '#/$defs/ConfigurationVariantBranch/whenProperties', 'whenProperties', 'configurationVariants branch when must declare a properties object');
136
+ }
137
+ const propertyKeys = Object.keys(properties);
138
+ if (propertyKeys.length !== 1 ||
139
+ propertyKeys[0] !== variants.discriminator) {
140
+ return semanticError(`/configurationVariants/branches/${branchIndex}/when/properties`, '#/$defs/ConfigurationVariantBranch/whenSingleDiscriminator', 'whenSingleDiscriminator', 'configurationVariants branch when.properties may only constrain the discriminator key');
141
+ }
142
+ const constraint = properties[variants.discriminator];
143
+ if (typeof constraint !== 'object' || constraint === null) {
144
+ return semanticError(`/configurationVariants/branches/${branchIndex}/when/properties/${variants.discriminator}`, '#/$defs/ConfigurationVariantBranch/whenConstraint', 'whenConstraint', 'configurationVariants branch discriminator constraint must be an object');
145
+ }
146
+ const constraintRecord = constraint;
147
+ const constraintKeys = Object.keys(constraintRecord);
148
+ const usesConst = constraintKeys.includes('const');
149
+ const usesEnum = constraintKeys.includes('enum');
150
+ if ((usesConst === usesEnum) ||
151
+ constraintKeys.some((key) => key !== 'const' && key !== 'enum')) {
152
+ return semanticError(`/configurationVariants/branches/${branchIndex}/when/properties/${variants.discriminator}`, '#/$defs/ConfigurationVariantBranch/whenConstOrEnum', 'whenConstOrEnum', 'configurationVariants branch discriminator constraint must use exactly one of const or enum');
153
+ }
154
+ const declaredValues = usesConst
155
+ ? [constraintRecord['const']]
156
+ : constraintRecord['enum'];
157
+ if (!Array.isArray(declaredValues) ||
158
+ declaredValues.length === 0 ||
159
+ !declaredValues.every((value) => typeof value === 'string' && optionSet.has(value))) {
160
+ return semanticError(`/configurationVariants/branches/${branchIndex}/when/properties/${variants.discriminator}`, '#/$defs/ConfigurationVariantBranch/whenDeclaredOption', 'whenDeclaredOption', 'configurationVariants branch constraint values must be declared option values of the discriminator select field');
161
+ }
162
+ if (new Set(declaredValues).size !== declaredValues.length) {
163
+ return semanticError(`/configurationVariants/branches/${branchIndex}/when/properties/${variants.discriminator}`, '#/$defs/ConfigurationVariantBranch/whenUniqueOptions', 'whenUniqueOptions', 'configurationVariants branch enum values must be unique');
164
+ }
165
+ for (const [fieldIndex, key] of branch.fields.entries()) {
166
+ if (key === variants.discriminator) {
167
+ return semanticError(`/configurationVariants/branches/${branchIndex}/fields/${fieldIndex}`, '#/$defs/ConfigurationVariantBranch/discriminatorNotBranchField', 'discriminatorNotBranchField', 'configurationVariants branch fields must not include the discriminator itself');
168
+ }
169
+ if (!configByKey.has(key)) {
170
+ return semanticError(`/configurationVariants/branches/${branchIndex}/fields/${fieldIndex}`, '#/$defs/ConfigurationVariantBranch/declaredBranchField', 'declaredBranchField', 'configurationVariants branch fields must reference declared configuration keys');
171
+ }
172
+ }
173
+ }
174
+ const branchValidators = variants.branches.map((branch) => ajv.compile({
175
+ type: 'object',
176
+ properties: structuredClone(branch.when['properties']),
177
+ required: [variants.discriminator],
178
+ }));
179
+ for (const optionValue of optionValues) {
180
+ let matched = 0;
181
+ for (const trial of branchValidators) {
182
+ if (trial({ [variants.discriminator]: optionValue }))
183
+ matched += 1;
184
+ }
185
+ if (matched !== 1) {
186
+ return semanticError('/configurationVariants/branches', '#/$defs/ConfigurationVariants/completeExclusiveBranches', 'completeExclusiveBranches', `each discriminator option value must be matched by exactly one branch; option ${JSON.stringify(optionValue)} matched ${matched}`);
187
+ }
188
+ }
189
+ }
190
+ for (const [index, field] of configuration.entries()) {
191
+ if (field.kind !== 'operation')
192
+ continue;
193
+ const actionIds = new Set();
194
+ for (const [actionIndex, action] of field.actions.entries()) {
195
+ if (actionIds.has(action.id)) {
196
+ return semanticError(`/configuration/${index}/actions/${actionIndex}/id`, '#/$defs/ActionDef/uniqueActionIds', 'uniqueActionIds', 'operation action id must be unique within the same operation');
197
+ }
198
+ actionIds.add(action.id);
199
+ }
200
+ for (const [actionIndex, action] of field.actions.entries()) {
201
+ for (const reference of ['next', 'rollback']) {
202
+ const target = action[reference];
203
+ if (target !== undefined && !actionIds.has(target)) {
204
+ return semanticError(`/configuration/${index}/actions/${actionIndex}/${reference}`, `#/$defs/ActionDef/${reference}DeclaredByOperation`, `${reference}DeclaredByOperation`, `operation action ${reference} must reference an action in the same operation`);
205
+ }
206
+ }
207
+ }
208
+ for (const [targetIndex, target] of (field.target ?? []).entries()) {
209
+ const targetField = configByKey.get(target);
210
+ if (targetField === undefined || targetField.kind === 'operation') {
211
+ return semanticError(`/configuration/${index}/target/${targetIndex}`, '#/$defs/ConfigurationField/declaredValueTarget', 'declaredValueTarget', 'operation target must reference a declared non-operation configuration key');
212
+ }
213
+ }
214
+ }
215
+ const contributions = manifest.contributions ?? [];
216
+ const webhooks = contributions.filter(contribution => contribution.type === 'webhook');
217
+ for (const [index, route] of webhooks.entries()) {
218
+ const segments = route.path.split('/');
219
+ const names = segments.filter(segment => segment.startsWith(':'));
220
+ if (new Set(names).size !== names.length)
221
+ return semanticError(`/contributions/${contributions.indexOf(route)}/path`, '#/$defs/WebhookContribution/uniqueParameters', 'uniqueParameters', 'webhook parameter names must be unique within a path');
222
+ for (const previous of webhooks.slice(0, index)) {
223
+ const other = previous.path.split('/');
224
+ const overlap = segments.length === other.length && segments.every((segment, i) => segment === other[i] || segment.startsWith(':') || other[i].startsWith(':'));
225
+ if (overlap && route.methods.some(method => previous.methods.includes(method)))
226
+ return semanticError(`/contributions/${contributions.indexOf(route)}/path`, '#/$defs/WebhookContribution/unambiguousRoutes', 'unambiguousRoutes', 'webhook paths must not overlap for a shared HTTP method');
227
+ }
228
+ }
229
+ const contributionByKey = new Map();
230
+ for (const [index, contribution] of contributions.entries()) {
231
+ const key = `${contribution.type}\0${contribution.id}`;
232
+ if (contributionByKey.has(key)) {
233
+ return semanticError(`/contributions/${index}/id`, '#/$defs/StaticContribution/uniqueContributionKeys', 'uniqueContributionKeys', 'contribution type/id must be declared at most once per manifest');
234
+ }
235
+ contributionByKey.set(key, contribution);
236
+ if ('environment' in contribution && contribution.environment !== undefined) {
237
+ for (const [environmentName, binding] of Object.entries(contribution.environment)) {
238
+ const field = configByKey.get(binding.key);
239
+ if (field === undefined) {
240
+ return semanticError(`/contributions/${index}/environment/${environmentName}/key`, '#/$defs/EnvironmentBinding/declaredConfigurationKey', 'declaredConfigurationKey', 'environment binding must reference a declared configuration key');
241
+ }
242
+ if ((binding.source === 'secret' && field.kind !== 'secret') ||
243
+ (binding.source === 'config' && field.kind === 'secret')) {
244
+ return semanticError(`/contributions/${index}/environment/${environmentName}/source`, '#/$defs/EnvironmentBinding/sourceMatchesConfigurationKind', 'sourceMatchesConfigurationKind', 'secret bindings must reference secret fields and config bindings must not');
245
+ }
246
+ }
247
+ }
248
+ if (contribution.type === 'webhook' && contribution.verificationSecretRef !== undefined) {
249
+ const secret = configByKey.get(contribution.verificationSecretRef);
250
+ if (secret?.kind !== 'secret') {
251
+ return semanticError(`/contributions/${index}/verificationSecretRef`, '#/$defs/WebhookContribution/declaredSecretReference', 'declaredSecretReference', 'webhook verificationSecretRef must reference a declared secret field');
252
+ }
253
+ }
254
+ }
255
+ if (manifest.runtime === undefined) {
256
+ const runtimeConfigurationIndex = configuration.findIndex((field) => field.kind === 'operation');
257
+ if (runtimeConfigurationIndex !== -1) {
258
+ const field = configuration[runtimeConfigurationIndex];
259
+ return semanticError(`/configuration/${runtimeConfigurationIndex}`, '#/$defs/ConfigurationField/runtimeRequired', 'runtimeRequired', `runtime is required by configuration ${field.key}`);
260
+ }
261
+ if (manifest.test !== undefined) {
262
+ return semanticError('/test', '#/$defs/PluginTestDeclaration/runtimeRequired', 'runtimeRequired', `runtime is required by test ${manifest.pluginId}`);
263
+ }
264
+ const runtimeContributionIndex = contributions.findIndex((contribution) => 'action' in contribution ||
265
+ contribution.type === 'media-source' ||
266
+ contribution.type === 'limb' ||
267
+ contribution.type === 'connector' ||
268
+ contribution.type === 'cloud-conversation-host');
269
+ if (runtimeContributionIndex !== -1) {
270
+ const contribution = contributions[runtimeContributionIndex];
271
+ return semanticError(`/contributions/${runtimeContributionIndex}`, '#/$defs/StaticContribution/runtimeRequired', 'runtimeRequired', `runtime is required by contribution ${contribution.id}`);
272
+ }
273
+ }
274
+ const referenceOwners = new Map();
275
+ for (const [featureIndex, feature] of manifest.features.entries()) {
276
+ for (const [contributionIndex, reference] of (feature.contributions ?? []).entries()) {
277
+ const key = `${reference.type}\0${reference.id}`;
278
+ if (!contributionByKey.has(key)) {
279
+ return semanticError(`/features/${featureIndex}/contributions/${contributionIndex}`, '#/$defs/ContributionReference/declaredContribution', 'declaredContribution', 'feature contribution must reference a declared contribution with the same type and id');
280
+ }
281
+ const existingOwner = referenceOwners.get(key);
282
+ if (existingOwner !== undefined) {
283
+ return semanticError(`/features/${featureIndex}/contributions/${contributionIndex}`, '#/$defs/ContributionReference/singleFeatureOwner', 'singleFeatureOwner', `a static contribution must have exactly one feature reference; already owned by ${existingOwner}`);
284
+ }
285
+ referenceOwners.set(key, feature.id);
286
+ if (reference.type === 'desktop-window' && !feature.capabilities.includes('windows.create')) {
287
+ return semanticError(`/features/${featureIndex}/capabilities`, '#/$defs/DesktopWindowContribution/windowCapabilityRequired', 'windowCapabilityRequired', 'a desktop window must be owned by a feature that requests windows.create');
288
+ }
289
+ }
290
+ }
291
+ for (const [key, contribution] of contributionByKey) {
292
+ if (!referenceOwners.has(key)) {
293
+ const index = contributions.indexOf(contribution);
294
+ return semanticError(`/contributions/${index}`, '#/$defs/StaticContribution/featureOwnerRequired', 'featureOwnerRequired', 'every static contribution must be owned by one feature resource reference');
295
+ }
296
+ }
297
+ for (const [index, contribution] of contributions.entries()) {
298
+ const owner = referenceOwners.get(`${contribution.type}\0${contribution.id}`);
299
+ if (contribution.type === 'connector') {
300
+ const identityKey = `identity\0${contribution.identityRef}`;
301
+ if (!contributionByKey.has(identityKey)) {
302
+ return semanticError(`/contributions/${index}/identityRef`, '#/$defs/ConnectorContribution/declaredIdentityReference', 'declaredIdentityReference', 'connector identityRef must reference a declared identity contribution');
303
+ }
304
+ if (referenceOwners.get(identityKey) !== owner) {
305
+ return semanticError(`/contributions/${index}/identityRef`, '#/$defs/ConnectorContribution/sameFeatureOwner', 'sameFeatureOwner', 'connector identityRef must reference an identity owned by the same feature');
306
+ }
307
+ }
308
+ if (contribution.type === 'media-source') {
309
+ const identityKey = `identity\0${contribution.binding}`;
310
+ if (!contributionByKey.has(identityKey)) {
311
+ return semanticError(`/contributions/${index}/binding`, '#/$defs/MediaSourceContribution/declaredIdentityBinding', 'declaredIdentityBinding', 'media-source binding must reference a declared identity contribution');
312
+ }
313
+ if (referenceOwners.get(identityKey) !== owner) {
314
+ return semanticError(`/contributions/${index}/binding`, '#/$defs/MediaSourceContribution/sameFeatureOwner', 'sameFeatureOwner', 'media-source binding must reference an identity owned by the same feature');
315
+ }
316
+ const feature = manifest.features.find((candidate) => candidate.id === owner);
317
+ if (feature === undefined ||
318
+ !feature.capabilities.includes('plugin.state.get') ||
319
+ !feature.capabilities.includes('plugin.state.set')) {
320
+ 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');
321
+ }
322
+ }
323
+ if (contribution.type === 'cloud-conversation-host') {
324
+ const feature = manifest.features.find((candidate) => candidate.id === owner);
325
+ if (feature === undefined || !feature.capabilities.includes('cloud.conversation.host')) {
326
+ 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');
327
+ }
328
+ }
329
+ if (contribution.type === 'ui' && contribution.kind === 'slot-item') {
330
+ const commandKey = `ui\0${contribution.command}`;
331
+ const command = contributionByKey.get(commandKey);
332
+ if (command?.type !== 'ui' || command.kind !== 'command') {
333
+ return semanticError(`/contributions/${index}/command`, '#/$defs/UiSlotItemContribution/declaredCommandReference', 'declaredCommandReference', 'UI slot command must reference a declared UI command contribution');
334
+ }
335
+ if (referenceOwners.get(commandKey) !== owner) {
336
+ return semanticError(`/contributions/${index}/command`, '#/$defs/UiSlotItemContribution/sameFeatureOwner', 'sameFeatureOwner', 'UI slot command must reference a command owned by the same feature');
337
+ }
338
+ }
339
+ }
37
340
  return {
38
341
  valid: true,
39
342
  manifest,
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/validation/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,OAAO,GAGO,OAAO,CAAC,eAAe,CAAC,CAAC;AAC7C,MAAM,UAAU,GAA+B,OAAO,CAAC,aAAa,CAAC,CAAC;AACtE,MAAM,cAAc,GAAG,OAAO,CAAC,8CAA8C,CAG5E,CAAC;AACF,MAAM,YAAY,GAAG,OAAO,CAAC,6CAA6C,CAGzE,CAAC;AAqCF,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5D,UAAU,CAAC,GAAG,CAAC,CAAC;AAChB,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,KAAK,CAAW,CAAC,CAAC;AAC3D,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,KAAuB,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QACxC,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAChF,IAAI,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE;wBACN;4BACE,YAAY,EAAE,qBAAqB,KAAK,OAAO;4BAC/C,UAAU,EAAE,8CAA8C;4BAC1D,OAAO,EAAE,mBAAmB;4BAC5B,OAAO,EAAE,wDAAwD;yBAClE;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO;YACL,KAAK,EAAE,IAAI;YACX,QAAQ;YACR,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpD,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,4BAA4B;SACvD,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
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;AAuFD,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACb,wBAAwB,CAoC1B"}
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":"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"}
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"}