@clowder-ai/plugin-contract 0.1.0-beta.1

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