@clowder-ai/plugin-contract 0.1.0-beta.29 → 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.
Files changed (113) hide show
  1. package/dist/codegen/generate-contract.d.ts.map +1 -1
  2. package/dist/codegen/generate-contract.js +88 -1
  3. package/dist/codegen/generate-contract.js.map +1 -1
  4. package/dist/conformance/fixtures.d.ts +1 -1
  5. package/dist/conformance/fixtures.d.ts.map +1 -1
  6. package/dist/conformance/fixtures.js +1 -1
  7. package/dist/conformance/fixtures.js.map +1 -1
  8. package/dist/conformance/index.d.ts +1 -1
  9. package/dist/conformance/index.d.ts.map +1 -1
  10. package/dist/conformance/index.js +1 -1
  11. package/dist/conformance/index.js.map +1 -1
  12. package/dist/conformance/runner.js +1 -1
  13. package/dist/conformance/runner.js.map +1 -1
  14. package/dist/generated/contract.generated.d.ts +425 -62
  15. package/dist/generated/contract.generated.d.ts.map +1 -1
  16. package/dist/generated/contract.generated.js +63 -2
  17. package/dist/generated/contract.generated.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/validation/cloud-conversation-host.d.ts +18 -0
  21. package/dist/validation/cloud-conversation-host.d.ts.map +1 -0
  22. package/dist/validation/cloud-conversation-host.js +83 -0
  23. package/dist/validation/cloud-conversation-host.js.map +1 -0
  24. package/dist/validation/index.d.ts +5 -1
  25. package/dist/validation/index.d.ts.map +1 -1
  26. package/dist/validation/index.js +5 -1
  27. package/dist/validation/index.js.map +1 -1
  28. package/dist/validation/manifest.d.ts.map +1 -1
  29. package/dist/validation/manifest.js +113 -0
  30. package/dist/validation/manifest.js.map +1 -1
  31. package/dist/validation/members.d.ts +4 -0
  32. package/dist/validation/members.d.ts.map +1 -0
  33. package/dist/validation/members.js +11 -0
  34. package/dist/validation/members.js.map +1 -0
  35. package/dist/validation/messaging-semantic.d.ts.map +1 -1
  36. package/dist/validation/messaging-semantic.js +52 -3
  37. package/dist/validation/messaging-semantic.js.map +1 -1
  38. package/dist/validation/messaging-wire.d.ts +6 -2
  39. package/dist/validation/messaging-wire.d.ts.map +1 -1
  40. package/dist/validation/messaging-wire.js +22 -2
  41. package/dist/validation/messaging-wire.js.map +1 -1
  42. package/dist/validation/operation-rows.d.ts +25 -0
  43. package/dist/validation/operation-rows.d.ts.map +1 -0
  44. package/dist/validation/operation-rows.js +135 -0
  45. package/dist/validation/operation-rows.js.map +1 -0
  46. package/dist/validation/signals.d.ts +1 -10
  47. package/dist/validation/signals.d.ts.map +1 -1
  48. package/dist/validation/signals.js +0 -174
  49. package/dist/validation/signals.js.map +1 -1
  50. package/dist/wire/constants.d.ts +2 -1
  51. package/dist/wire/constants.d.ts.map +1 -1
  52. package/dist/wire/constants.js +2 -1
  53. package/dist/wire/constants.js.map +1 -1
  54. package/dist/wire/dispatch.d.ts +49 -0
  55. package/dist/wire/dispatch.d.ts.map +1 -0
  56. package/dist/wire/dispatch.js +880 -0
  57. package/dist/wire/dispatch.js.map +1 -0
  58. package/dist/wire/disposition-fixtures.d.ts +0 -2
  59. package/dist/wire/disposition-fixtures.d.ts.map +1 -1
  60. package/dist/wire/disposition-fixtures.js +20 -245
  61. package/dist/wire/disposition-fixtures.js.map +1 -1
  62. package/dist/wire/envelope.d.ts +31 -0
  63. package/dist/wire/envelope.d.ts.map +1 -1
  64. package/dist/wire/envelope.js +48 -1
  65. package/dist/wire/envelope.js.map +1 -1
  66. package/dist/wire/errors.d.ts +31 -1
  67. package/dist/wire/errors.d.ts.map +1 -1
  68. package/dist/wire/errors.js +36 -0
  69. package/dist/wire/errors.js.map +1 -1
  70. package/dist/wire/grants.d.ts +4 -4
  71. package/dist/wire/grants.js +3 -3
  72. package/dist/wire/handshake-byte-bounds.d.ts.map +1 -1
  73. package/dist/wire/handshake-byte-bounds.js +5 -2
  74. package/dist/wire/handshake-byte-bounds.js.map +1 -1
  75. package/dist/wire/handshake.d.ts +6 -0
  76. package/dist/wire/handshake.d.ts.map +1 -1
  77. package/dist/wire/handshake.js +6 -3
  78. package/dist/wire/handshake.js.map +1 -1
  79. package/dist/wire/index.d.ts +11 -11
  80. package/dist/wire/index.d.ts.map +1 -1
  81. package/dist/wire/index.js +20 -7
  82. package/dist/wire/index.js.map +1 -1
  83. package/dist/wire/lifecycle-byte-bounds.d.ts +0 -15
  84. package/dist/wire/lifecycle-byte-bounds.d.ts.map +1 -1
  85. package/dist/wire/lifecycle-byte-bounds.js +2 -62
  86. package/dist/wire/lifecycle-byte-bounds.js.map +1 -1
  87. package/dist/wire/messaging-byte-bounds.d.ts +4 -3
  88. package/dist/wire/messaging-byte-bounds.d.ts.map +1 -1
  89. package/dist/wire/messaging-byte-bounds.js +134 -12
  90. package/dist/wire/messaging-byte-bounds.js.map +1 -1
  91. package/dist/wire/registry.d.ts +15 -62
  92. package/dist/wire/registry.d.ts.map +1 -1
  93. package/dist/wire/registry.js +15 -61
  94. package/dist/wire/registry.js.map +1 -1
  95. package/dist/wire/row-shapes.d.ts +25 -13
  96. package/dist/wire/row-shapes.d.ts.map +1 -1
  97. package/dist/wire/row-shapes.js +11 -0
  98. package/dist/wire/row-shapes.js.map +1 -1
  99. package/fixtures/behavior/messaging/adversarial-invariants.json +7 -2
  100. package/fixtures/manifest/invalid/duplicate-signal-type.json +4 -2
  101. package/package.json +2 -2
  102. package/src/schemas/behavior-fixture.schema.json +711 -184
  103. package/src/schemas/companion-bridge.schema.json +51 -28
  104. package/src/schemas/manifest.schema.json +1954 -306
  105. package/src/schemas/messaging.schema.json +510 -35
  106. package/src/schemas/signal.schema.json +68 -78
  107. package/dist/wire/signal-byte-bounds.d.ts +0 -97
  108. package/dist/wire/signal-byte-bounds.d.ts.map +0 -1
  109. package/dist/wire/signal-byte-bounds.js +0 -229
  110. package/dist/wire/signal-byte-bounds.js.map +0 -1
  111. package/fixtures/signals/invalid/destination-injection.json +0 -15
  112. package/fixtures/signals/invalid/non-utc-occurred-at.json +0 -12
  113. package/fixtures/signals/valid/feishu-meeting-artifact.json +0 -18
@@ -0,0 +1,135 @@
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 manifestSchema = require('@clowder-ai/plugin-contract/schemas/manifest');
6
+ const messagingSchema = require('@clowder-ai/plugin-contract/schemas/messaging');
7
+ const pluginMetadataSchema = require('@clowder-ai/plugin-contract/schemas/plugin-metadata');
8
+ const signalSchema = require('@clowder-ai/plugin-contract/schemas/signals');
9
+ const ajv = new Ajv2020({ allErrors: true, strict: false });
10
+ addFormats(ajv);
11
+ const schemaId = manifestSchema['$id'];
12
+ ajv.addSchema(pluginMetadataSchema, pluginMetadataSchema['$id']);
13
+ ajv.addSchema(signalSchema, signalSchema['$id']);
14
+ ajv.addSchema(messagingSchema, messagingSchema['$id']);
15
+ ajv.addSchema(manifestSchema, schemaId);
16
+ const validateRowsShape = ajv.compile({
17
+ $ref: `${schemaId}#/$defs/OperationRows`,
18
+ });
19
+ function hasOnlyUnicodeScalars(value) {
20
+ for (let index = 0; index < value.length; index += 1) {
21
+ const unit = value.charCodeAt(index);
22
+ if (unit >= 0xd800 && unit <= 0xdbff) {
23
+ const next = value.charCodeAt(index + 1);
24
+ if (!(next >= 0xdc00 && next <= 0xdfff))
25
+ return false;
26
+ index += 1;
27
+ }
28
+ else if (unit >= 0xdc00 && unit <= 0xdfff) {
29
+ return false;
30
+ }
31
+ }
32
+ return true;
33
+ }
34
+ function isJsonScalarTree(value, ancestors = new Set()) {
35
+ if (value === null || typeof value === 'boolean')
36
+ return true;
37
+ if (typeof value === 'string')
38
+ return hasOnlyUnicodeScalars(value);
39
+ if (typeof value === 'number')
40
+ return Number.isFinite(value);
41
+ if (typeof value !== 'object')
42
+ return false;
43
+ if (ancestors.has(value))
44
+ return false;
45
+ const prototype = Object.getPrototypeOf(value);
46
+ if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) {
47
+ return false;
48
+ }
49
+ if (Object.getOwnPropertySymbols(value).length > 0)
50
+ return false;
51
+ ancestors.add(value);
52
+ let valid = true;
53
+ if (Array.isArray(value)) {
54
+ for (let index = 0; index < value.length; index += 1) {
55
+ if (!Object.hasOwn(value, index) || !isJsonScalarTree(value[index], ancestors)) {
56
+ valid = false;
57
+ break;
58
+ }
59
+ }
60
+ if (valid) {
61
+ valid = Object.keys(value).every((key) => /^(0|[1-9][0-9]*)$/.test(key));
62
+ }
63
+ }
64
+ else {
65
+ for (const [key, child] of Object.entries(value)) {
66
+ if (!hasOnlyUnicodeScalars(key) || !isJsonScalarTree(child, ancestors)) {
67
+ valid = false;
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ ancestors.delete(value);
73
+ return valid;
74
+ }
75
+ function invalid(instancePath, schemaPath, keyword, message) {
76
+ return {
77
+ valid: false,
78
+ errors: [{ instancePath, schemaPath, keyword, message }],
79
+ };
80
+ }
81
+ /**
82
+ * Validates an `OperationActionResult` with `render: 'rows'` against the manifest's
83
+ * row declarations of the same operation. Host fail-closed: an undeclared or
84
+ * non-row action reference, a duplicate row key, or any schema violation makes the
85
+ * whole result invalid.
86
+ */
87
+ export function validateOperationRowsResult(operation, value) {
88
+ let jsonSafe = false;
89
+ try {
90
+ jsonSafe = isJsonScalarTree(value);
91
+ }
92
+ catch {
93
+ jsonSafe = false;
94
+ }
95
+ if (!jsonSafe) {
96
+ return invalid('', '#/$defs/OperationRows', 'jsonScalarTree', 'value must contain only finite JSON values and Unicode scalar strings without cycles');
97
+ }
98
+ let structurallyValid = false;
99
+ try {
100
+ structurallyValid = validateRowsShape(value);
101
+ }
102
+ catch {
103
+ structurallyValid = false;
104
+ }
105
+ if (!structurallyValid) {
106
+ const errors = (validateRowsShape.errors ?? []).map((error) => ({
107
+ instancePath: error.instancePath,
108
+ schemaPath: error.schemaPath,
109
+ keyword: error.keyword,
110
+ message: error.message ?? 'operation rows validation failed',
111
+ }));
112
+ return errors.length > 0
113
+ ? { valid: false, errors }
114
+ : invalid('', '#/$defs/OperationRows', 'schema', 'schema validation failed');
115
+ }
116
+ const rows = value;
117
+ const rowActionIds = new Set(operation.actions.filter((action) => action.render === 'row').map((action) => action.id));
118
+ const seenKeys = new Set();
119
+ for (let rowIndex = 0; rowIndex < rows.rows.length; rowIndex += 1) {
120
+ const row = rows.rows[rowIndex];
121
+ if (seenKeys.has(row.key)) {
122
+ return invalid(`/rows/${rowIndex}/key`, '#/$defs/OperationRow', 'uniqueKeys', `row key must be unique within the result: ${row.key}`);
123
+ }
124
+ seenKeys.add(row.key);
125
+ const actions = row.actions ?? [];
126
+ for (let actionIndex = 0; actionIndex < actions.length; actionIndex += 1) {
127
+ const reference = actions[actionIndex].action;
128
+ if (!rowActionIds.has(reference)) {
129
+ return invalid(`/rows/${rowIndex}/actions/${actionIndex}/action`, '#/$defs/OperationRowAction', 'rowActionReference', `row action must reference an ActionDef with render 'row' declared in the same operation: ${reference}`);
130
+ }
131
+ }
132
+ }
133
+ return { valid: true, value: rows, errors: [] };
134
+ }
135
+ //# sourceMappingURL=operation-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-rows.js","sourceRoot":"","sources":["../../src/validation/operation-rows.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { EventsPublishInput, EventsPublishResult, SignalDeclaration } from '../generated/contract.generated.js';
1
+ import type { SignalDeclaration } from '../generated/contract.generated.js';
2
2
  export interface SignalValidationError {
3
3
  readonly instancePath: string;
4
4
  readonly schemaPath: string;
@@ -13,14 +13,5 @@ export type SignalValidationResult<Value> = {
13
13
  readonly valid: false;
14
14
  readonly errors: readonly SignalValidationError[];
15
15
  };
16
- export declare const SIGNAL_PAYLOAD_MAX_ENCODED_BYTES: 65536;
17
- export type SignalSchemaCatalog = Readonly<Record<string, Readonly<Record<string, unknown>>>>;
18
16
  export declare function validateSignalDeclaration(value: unknown): SignalValidationResult<SignalDeclaration>;
19
- export declare function validateEventsPublishInput(value: unknown): SignalValidationResult<EventsPublishInput>;
20
- /**
21
- * Cross-document admission: a structurally legal publish is still forbidden
22
- * unless its signalType appears in this plugin manifest's declared provides.
23
- */
24
- export declare function validateDeclaredEventsPublishInput(declarations: readonly unknown[], signalSchemas: SignalSchemaCatalog, value: unknown): SignalValidationResult<EventsPublishInput>;
25
- export declare function validateEventsPublishResult(value: unknown): SignalValidationResult<EventsPublishResult>;
26
17
  //# sourceMappingURL=signals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/validation/signals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,oCAAoC,CAAC;AA+B5C,MAAM,WAAW,qBAAqB;IACpC,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,sBAAsB,CAAC,KAAK,IACpC;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,qBAAqB,EAAE,CAAA;CAAE,CAAC;AAEjF,eAAO,MAAM,gCAAgC,EAAG,KAAe,CAAC;AAEhE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CACxC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAClD,CAAC;AAyDF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,sBAAsB,CAAC,iBAAiB,CAAC,CAE3C;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,sBAAsB,CAAC,kBAAkB,CAAC,CAuD5C;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,YAAY,EAAE,SAAS,OAAO,EAAE,EAChC,aAAa,EAAE,mBAAmB,EAClC,KAAK,EAAE,OAAO,GACb,sBAAsB,CAAC,kBAAkB,CAAC,CA4F5C;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,GACb,sBAAsB,CAAC,mBAAmB,CAAC,CAE7C"}
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/validation/signals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EAClB,MAAM,oCAAoC,CAAC;AA+B5C,MAAM,WAAW,qBAAqB;IACpC,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,sBAAsB,CAAC,KAAK,IACpC;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,qBAAqB,EAAE,CAAA;CAAE,CAAC;AAiCjF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,sBAAsB,CAAC,iBAAiB,CAAC,CAE3C"}
@@ -3,7 +3,6 @@ const require = createRequire(import.meta.url);
3
3
  const Ajv2020 = require('ajv/dist/2020');
4
4
  const addFormats = require('ajv-formats');
5
5
  const signalSchema = require('@clowder-ai/plugin-contract/schemas/signals');
6
- export const SIGNAL_PAYLOAD_MAX_ENCODED_BYTES = 65_536;
7
6
  const ajv = new Ajv2020({ allErrors: true, strict: false });
8
7
  addFormats(ajv);
9
8
  ajv.addSchema(signalSchema, signalSchema['$id']);
@@ -14,9 +13,6 @@ function validator(definition) {
14
13
  return validate;
15
14
  }
16
15
  const validateDeclarationSchema = validator('SignalDeclaration');
17
- const validatePublishInputSchema = validator('EventsPublishInput');
18
- const validatePublishResultSchema = validator('EventsPublishResult');
19
- const resolvedSchemaValidators = new WeakMap();
20
16
  function errorsOf(validate) {
21
17
  return (validate.errors ?? []).map((error) => ({
22
18
  instancePath: error.instancePath,
@@ -30,177 +26,7 @@ function validateWith(validate, value) {
30
26
  return { valid: false, errors: errorsOf(validate) };
31
27
  return { valid: true, value: value, errors: [] };
32
28
  }
33
- function isJsonValue(value, ancestors = new Set()) {
34
- if (value === null ||
35
- typeof value === 'string' ||
36
- typeof value === 'boolean') {
37
- return true;
38
- }
39
- if (typeof value === 'number')
40
- return Number.isFinite(value);
41
- if (typeof value !== 'object')
42
- return false;
43
- if (ancestors.has(value))
44
- return false;
45
- ancestors.add(value);
46
- const valid = Array.isArray(value)
47
- ? value.every((item) => isJsonValue(item, ancestors))
48
- : Object.values(value).every((item) => isJsonValue(item, ancestors));
49
- ancestors.delete(value);
50
- return valid;
51
- }
52
29
  export function validateSignalDeclaration(value) {
53
30
  return validateWith(validateDeclarationSchema, value);
54
31
  }
55
- export function validateEventsPublishInput(value) {
56
- const structural = validateWith(validatePublishInputSchema, value);
57
- if (!structural.valid)
58
- return structural;
59
- let validJsonValue = false;
60
- try {
61
- validJsonValue = isJsonValue(structural.value.payload);
62
- }
63
- catch {
64
- validJsonValue = false;
65
- }
66
- if (!validJsonValue) {
67
- return {
68
- valid: false,
69
- errors: [
70
- {
71
- instancePath: '/payload',
72
- schemaPath: '#/$defs/EventsPublishInput/properties/payload',
73
- keyword: 'jsonValue',
74
- message: 'payload must contain only finite JSON values without cycles',
75
- },
76
- ],
77
- };
78
- }
79
- let encodedPayloadBytes;
80
- try {
81
- encodedPayloadBytes = Buffer.byteLength(JSON.stringify(structural.value.payload), 'utf8');
82
- }
83
- catch {
84
- return {
85
- valid: false,
86
- errors: [
87
- {
88
- instancePath: '/payload',
89
- schemaPath: '#/$defs/EventsPublishInput/properties/payload',
90
- keyword: 'jsonValue',
91
- message: 'payload could not be safely serialized as JSON',
92
- },
93
- ],
94
- };
95
- }
96
- if (encodedPayloadBytes > SIGNAL_PAYLOAD_MAX_ENCODED_BYTES) {
97
- return {
98
- valid: false,
99
- errors: [
100
- {
101
- instancePath: '/payload',
102
- schemaPath: '#/x-clowder-payload-max-encoded-bytes',
103
- keyword: 'maxEncodedBytes',
104
- message: `payload exceeds ${SIGNAL_PAYLOAD_MAX_ENCODED_BYTES} encoded bytes`,
105
- },
106
- ],
107
- };
108
- }
109
- return structural;
110
- }
111
- /**
112
- * Cross-document admission: a structurally legal publish is still forbidden
113
- * unless its signalType appears in this plugin manifest's declared provides.
114
- */
115
- export function validateDeclaredEventsPublishInput(declarations, signalSchemas, value) {
116
- const input = validateEventsPublishInput(value);
117
- if (!input.valid)
118
- return input;
119
- let matchingDeclaration;
120
- for (const candidate of declarations) {
121
- const declaration = validateSignalDeclaration(candidate);
122
- if (!declaration.valid) {
123
- return {
124
- valid: false,
125
- errors: [
126
- {
127
- instancePath: '/signals/provides',
128
- schemaPath: '#/$defs/SignalContribution/properties/provides',
129
- keyword: 'signalDeclaration',
130
- message: 'declared signal metadata is invalid',
131
- },
132
- ],
133
- };
134
- }
135
- if (declaration.value.type === input.value.signalType) {
136
- matchingDeclaration = declaration.value;
137
- }
138
- }
139
- if (matchingDeclaration === undefined) {
140
- return {
141
- valid: false,
142
- errors: [
143
- {
144
- instancePath: '/signalType',
145
- schemaPath: '#/$defs/SignalContribution/properties/provides',
146
- keyword: 'declaredSignalType',
147
- message: 'signalType is not declared by the plugin manifest',
148
- },
149
- ],
150
- };
151
- }
152
- const resolvedSchema = signalSchemas[matchingDeclaration.schemaRef];
153
- if (typeof resolvedSchema !== 'object' ||
154
- resolvedSchema === null ||
155
- Array.isArray(resolvedSchema)) {
156
- return {
157
- valid: false,
158
- errors: [
159
- {
160
- instancePath: '/signalType',
161
- schemaPath: matchingDeclaration.schemaRef,
162
- keyword: 'signalSchemaUnresolved',
163
- message: 'declared signal schema is not resolved from the installed package',
164
- },
165
- ],
166
- };
167
- }
168
- let validateResolved = resolvedSchemaValidators.get(resolvedSchema);
169
- if (validateResolved === undefined) {
170
- try {
171
- const schemaAjv = new Ajv2020({ allErrors: true, strict: false });
172
- addFormats(schemaAjv);
173
- validateResolved = schemaAjv.compile(resolvedSchema);
174
- resolvedSchemaValidators.set(resolvedSchema, validateResolved);
175
- }
176
- catch {
177
- resolvedSchemaValidators.set(resolvedSchema, null);
178
- validateResolved = null;
179
- }
180
- }
181
- if (validateResolved === null) {
182
- return {
183
- valid: false,
184
- errors: [
185
- {
186
- instancePath: '/signalType',
187
- schemaPath: matchingDeclaration.schemaRef,
188
- keyword: 'signalSchemaInvalid',
189
- message: 'declared signal schema could not be compiled safely',
190
- },
191
- ],
192
- };
193
- }
194
- const content = {
195
- payload: input.value.payload,
196
- source: input.value.source,
197
- };
198
- if (!validateResolved(content)) {
199
- return { valid: false, errors: errorsOf(validateResolved) };
200
- }
201
- return input;
202
- }
203
- export function validateEventsPublishResult(value) {
204
- return validateWith(validatePublishResultSchema, value);
205
- }
206
32
  //# sourceMappingURL=signals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/validation/signals.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/validation/signals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAM5C,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,YAAY,GAAG,OAAO,CAAC,6CAA6C,CAGzE,CAAC;AA+BF,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;AAE3D,SAAS,SAAS,CAAC,UAAkB;IACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAC5B,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,WAAW,UAAU,EAAE,CACtD,CAAC;IACF,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;IAClF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,yBAAyB,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAC;AAEjE,SAAS,QAAQ,CAAC,QAA6B;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,0BAA0B;KACrD,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CACnB,QAA6B,EAC7B,KAAc;IAEd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAc,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAc;IAEd,OAAO,YAAY,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;AACxD,CAAC"}
@@ -14,7 +14,8 @@ export declare const JSONRPC_VERSION: "2.0";
14
14
  /**
15
15
  * Maximum payload bytes per element payload (frozen x-clowder-bounds).
16
16
  * Open-membered payloads (MediaRefElementPayload, RichBlockElementPayload)
17
- * are bounded by this ceiling alone — no structural narrowing.
17
+ * use their contract schemas for structural narrowing. Unknown extension payloads remain
18
+ * open and are bounded by this ceiling.
18
19
  */
19
20
  export declare const MAX_ELEMENT_PAYLOAD_BYTES: 65536;
20
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/wire/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,eAAO,MAAM,eAAe,EAAG,OAAkB,CAAC;AAElD,oCAAoC;AACpC,eAAO,MAAM,YAAY,EAAG,OAAgB,CAAC;AAE7C,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,EAAG,OAAgB,CAAC;AAEjD,gDAAgD;AAChD,eAAO,MAAM,eAAe,EAAG,KAAc,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAG,KAAe,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAG,MAAgB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAG,EAAW,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAG,GAAY,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAG,EAAW,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/wire/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,eAAO,MAAM,eAAe,EAAG,OAAkB,CAAC;AAElD,oCAAoC;AACpC,eAAO,MAAM,YAAY,EAAG,OAAgB,CAAC;AAE7C,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,EAAG,OAAgB,CAAC;AAEjD,gDAAgD;AAChD,eAAO,MAAM,eAAe,EAAG,KAAc,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAG,KAAe,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAG,MAAgB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAG,EAAW,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAG,GAAY,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAG,EAAW,CAAC"}
@@ -14,7 +14,8 @@ export const JSONRPC_VERSION = '2.0';
14
14
  /**
15
15
  * Maximum payload bytes per element payload (frozen x-clowder-bounds).
16
16
  * Open-membered payloads (MediaRefElementPayload, RichBlockElementPayload)
17
- * are bounded by this ceiling alone — no structural narrowing.
17
+ * use their contract schemas for structural narrowing. Unknown extension payloads remain
18
+ * open and are bounded by this ceiling.
18
19
  */
19
20
  export const MAX_ELEMENT_PAYLOAD_BYTES = 65_536;
20
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/wire/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,SAAkB,CAAC;AAElD,oCAAoC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,OAAgB,CAAC;AAE7C,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAgB,CAAC;AAEjD,gDAAgD;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAc,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAe,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAgB,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAW,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAY,CAAC;AAErD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAW,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/wire/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,SAAkB,CAAC;AAElD,oCAAoC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,OAAgB,CAAC;AAE7C,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAgB,CAAC;AAEjD,gDAAgD;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAc,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAe,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAgB,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAW,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAY,CAAC;AAErD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAW,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Wire dispatch classifier — pre-dispatch frame classification per the
3
+ * disposition table (T-A through T-M, §3.8-1 plus beta.8 closure).
4
+ *
5
+ * This module classifies decoded NDJSON frames into one of the 13
6
+ * disposition classes. T-A (transport failure) and T-B (JSON parse error)
7
+ * are handled by the NDJSON frame decoder layer — this classifier covers
8
+ * T-C through T-M.
9
+ *
10
+ * A frame that passes all rejection checks returns disposition=null with
11
+ * outcome='accept', indicating a valid request that should be dispatched
12
+ * to a method handler.
13
+ *
14
+ * This module lives in @clowder-ai/plugin-contract (F202 C1: the wire
15
+ * frame classifier was moved here from @clowder-ai/plugin-sdk so the
16
+ * dependency arrow is 插件 → SDK → contract ← Host). It defines nothing
17
+ * new — every classification rule traces to the frozen disposition table
18
+ * in this package, and every key set it uses is co-located with or
19
+ * generated from the contract types it mirrors.
20
+ */
21
+ import type { DecodedNdjsonFrame, JsonObject } from '../conformance/stdio-harness/ndjson-frame.js';
22
+ import type { DispositionClass } from './disposition.js';
23
+ import type { RequestSnapshot } from './disposition-fixtures.js';
24
+ import { type WireMethodName } from './registry.js';
25
+ export type { RequestSnapshot } from './disposition-fixtures.js';
26
+ export interface InFlightEntry {
27
+ readonly method: WireMethodName;
28
+ readonly requestSnapshot?: RequestSnapshot;
29
+ }
30
+ export interface DispatchResult {
31
+ /** T-class from the disposition table, or null for valid requests. */
32
+ readonly disposition: DispositionClass | null;
33
+ /** Required transport action: close, respond (with error), or accept. */
34
+ readonly outcome: 'close' | 'respond' | 'accept';
35
+ /** For 'respond': the error envelope to write back as NDJSON. */
36
+ readonly response?: JsonObject;
37
+ }
38
+ /**
39
+ * Classify a decoded NDJSON frame into a disposition class.
40
+ *
41
+ * Covers T-C through T-M of the disposition table. T-A and T-B
42
+ * are handled by the NDJSON frame decoder layer.
43
+ *
44
+ * @param frame Decoded frame with raw bytes and parsed value.
45
+ * @param inFlight Map of in-flight request IDs to their entry metadata.
46
+ * @returns The disposition result with class, outcome, and optional error response.
47
+ */
48
+ export declare function classifyFrame(frame: DecodedNdjsonFrame, inFlight: ReadonlyMap<string, InFlightEntry>): DispatchResult;
49
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/wire/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAEnG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAwDjE,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAiBvB,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;CAChC;AAwzBD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAC3C,cAAc,CAuEhB"}