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

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 (173) hide show
  1. package/dist/codegen/generate-contract.d.ts +5 -0
  2. package/dist/codegen/generate-contract.d.ts.map +1 -1
  3. package/dist/codegen/generate-contract.js +45 -4
  4. package/dist/codegen/generate-contract.js.map +1 -1
  5. package/dist/conformance/behavior-executor.d.ts +18 -0
  6. package/dist/conformance/behavior-executor.d.ts.map +1 -0
  7. package/dist/conformance/behavior-executor.js +52 -0
  8. package/dist/conformance/behavior-executor.js.map +1 -0
  9. package/dist/conformance/fixtures.d.ts +11 -0
  10. package/dist/conformance/fixtures.d.ts.map +1 -0
  11. package/dist/conformance/fixtures.js +9 -0
  12. package/dist/conformance/fixtures.js.map +1 -0
  13. package/dist/conformance/index.d.ts +6 -0
  14. package/dist/conformance/index.d.ts.map +1 -1
  15. package/dist/conformance/index.js +5 -0
  16. package/dist/conformance/index.js.map +1 -1
  17. package/dist/conformance/messaging-behavior-fixture.d.ts +12 -0
  18. package/dist/conformance/messaging-behavior-fixture.d.ts.map +1 -0
  19. package/dist/conformance/messaging-behavior-fixture.js +30 -0
  20. package/dist/conformance/messaging-behavior-fixture.js.map +1 -0
  21. package/dist/conformance/messaging-loopback-adapter.d.ts +23 -0
  22. package/dist/conformance/messaging-loopback-adapter.d.ts.map +1 -0
  23. package/dist/conformance/messaging-loopback-adapter.js +389 -0
  24. package/dist/conformance/messaging-loopback-adapter.js.map +1 -0
  25. package/dist/conformance/messaging-loopback-state.d.ts +22 -0
  26. package/dist/conformance/messaging-loopback-state.d.ts.map +1 -0
  27. package/dist/conformance/messaging-loopback-state.js +101 -0
  28. package/dist/conformance/messaging-loopback-state.js.map +1 -0
  29. package/dist/conformance/runner.d.ts +18 -1
  30. package/dist/conformance/runner.d.ts.map +1 -1
  31. package/dist/conformance/runner.js +153 -66
  32. package/dist/conformance/runner.js.map +1 -1
  33. package/dist/conformance/stdio-harness/child-process-harness.d.ts +65 -0
  34. package/dist/conformance/stdio-harness/child-process-harness.d.ts.map +1 -0
  35. package/dist/conformance/stdio-harness/child-process-harness.js +296 -0
  36. package/dist/conformance/stdio-harness/child-process-harness.js.map +1 -0
  37. package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts +26 -0
  38. package/dist/conformance/stdio-harness/dual-transport-oracle.d.ts.map +1 -0
  39. package/dist/conformance/stdio-harness/dual-transport-oracle.js +32 -0
  40. package/dist/conformance/stdio-harness/dual-transport-oracle.js.map +1 -0
  41. package/dist/conformance/stdio-harness/harness-process-spawn.d.ts +27 -0
  42. package/dist/conformance/stdio-harness/harness-process-spawn.d.ts.map +1 -0
  43. package/dist/conformance/stdio-harness/harness-process-spawn.js +43 -0
  44. package/dist/conformance/stdio-harness/harness-process-spawn.js.map +1 -0
  45. package/dist/conformance/stdio-harness/index.d.ts +5 -0
  46. package/dist/conformance/stdio-harness/index.d.ts.map +1 -0
  47. package/dist/conformance/stdio-harness/index.js +4 -0
  48. package/dist/conformance/stdio-harness/index.js.map +1 -0
  49. package/dist/conformance/stdio-harness/ndjson-frame.d.ts +31 -0
  50. package/dist/conformance/stdio-harness/ndjson-frame.d.ts.map +1 -0
  51. package/dist/conformance/stdio-harness/ndjson-frame.js +125 -0
  52. package/dist/conformance/stdio-harness/ndjson-frame.js.map +1 -0
  53. package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts +15 -0
  54. package/dist/conformance/stdio-harness/node-process-tree-runtime.d.ts.map +1 -0
  55. package/dist/conformance/stdio-harness/node-process-tree-runtime.js +78 -0
  56. package/dist/conformance/stdio-harness/node-process-tree-runtime.js.map +1 -0
  57. package/dist/conformance/stdio-harness/process-tree-controller.d.ts +51 -0
  58. package/dist/conformance/stdio-harness/process-tree-controller.d.ts.map +1 -0
  59. package/dist/conformance/stdio-harness/process-tree-controller.js +162 -0
  60. package/dist/conformance/stdio-harness/process-tree-controller.js.map +1 -0
  61. package/dist/conformance/stdio-harness/windows-sentinel.d.ts +15 -0
  62. package/dist/conformance/stdio-harness/windows-sentinel.d.ts.map +1 -0
  63. package/dist/conformance/stdio-harness/windows-sentinel.js +160 -0
  64. package/dist/conformance/stdio-harness/windows-sentinel.js.map +1 -0
  65. package/dist/conformance/stdio-harness/wire-shape.d.ts +18 -0
  66. package/dist/conformance/stdio-harness/wire-shape.d.ts.map +1 -0
  67. package/dist/conformance/stdio-harness/wire-shape.js +2 -0
  68. package/dist/conformance/stdio-harness/wire-shape.js.map +1 -0
  69. package/dist/generated/contract.generated.d.ts +370 -4
  70. package/dist/generated/contract.generated.d.ts.map +1 -1
  71. package/dist/generated/contract.generated.js +7 -1
  72. package/dist/generated/contract.generated.js.map +1 -1
  73. package/dist/index.d.ts +3 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +5 -1
  76. package/dist/index.js.map +1 -1
  77. package/dist/validation/index.d.ts +3 -0
  78. package/dist/validation/index.d.ts.map +1 -1
  79. package/dist/validation/index.js +3 -0
  80. package/dist/validation/index.js.map +1 -1
  81. package/dist/validation/manifest.d.ts +23 -0
  82. package/dist/validation/manifest.d.ts.map +1 -0
  83. package/dist/validation/manifest.js +53 -0
  84. package/dist/validation/manifest.js.map +1 -0
  85. package/dist/validation/messaging-semantic.d.ts.map +1 -1
  86. package/dist/validation/messaging-semantic.js +49 -0
  87. package/dist/validation/messaging-semantic.js.map +1 -1
  88. package/dist/validation/messaging-wire.d.ts +38 -0
  89. package/dist/validation/messaging-wire.d.ts.map +1 -0
  90. package/dist/validation/messaging-wire.js +164 -0
  91. package/dist/validation/messaging-wire.js.map +1 -0
  92. package/dist/validation/signals.d.ts +26 -0
  93. package/dist/validation/signals.d.ts.map +1 -0
  94. package/dist/validation/signals.js +206 -0
  95. package/dist/validation/signals.js.map +1 -0
  96. package/dist/wire/constants.d.ts +36 -0
  97. package/dist/wire/constants.d.ts.map +1 -0
  98. package/dist/wire/constants.js +36 -0
  99. package/dist/wire/constants.js.map +1 -0
  100. package/dist/wire/disposition-fixtures.d.ts +118 -0
  101. package/dist/wire/disposition-fixtures.d.ts.map +1 -0
  102. package/dist/wire/disposition-fixtures.js +1881 -0
  103. package/dist/wire/disposition-fixtures.js.map +1 -0
  104. package/dist/wire/disposition.d.ts +102 -0
  105. package/dist/wire/disposition.d.ts.map +1 -0
  106. package/dist/wire/disposition.js +217 -0
  107. package/dist/wire/disposition.js.map +1 -0
  108. package/dist/wire/envelope.d.ts +253 -0
  109. package/dist/wire/envelope.d.ts.map +1 -0
  110. package/dist/wire/envelope.js +19 -0
  111. package/dist/wire/envelope.js.map +1 -0
  112. package/dist/wire/errors.d.ts +222 -0
  113. package/dist/wire/errors.d.ts.map +1 -0
  114. package/dist/wire/errors.js +153 -0
  115. package/dist/wire/errors.js.map +1 -0
  116. package/dist/wire/grants.d.ts +57 -0
  117. package/dist/wire/grants.d.ts.map +1 -0
  118. package/dist/wire/grants.js +59 -0
  119. package/dist/wire/grants.js.map +1 -0
  120. package/dist/wire/handshake-byte-bounds.d.ts +69 -0
  121. package/dist/wire/handshake-byte-bounds.d.ts.map +1 -0
  122. package/dist/wire/handshake-byte-bounds.js +173 -0
  123. package/dist/wire/handshake-byte-bounds.js.map +1 -0
  124. package/dist/wire/handshake.d.ts +146 -0
  125. package/dist/wire/handshake.d.ts.map +1 -0
  126. package/dist/wire/handshake.js +189 -0
  127. package/dist/wire/handshake.js.map +1 -0
  128. package/dist/wire/index.d.ts +37 -0
  129. package/dist/wire/index.d.ts.map +1 -0
  130. package/dist/wire/index.js +61 -0
  131. package/dist/wire/index.js.map +1 -0
  132. package/dist/wire/lifecycle-byte-bounds.d.ts +55 -0
  133. package/dist/wire/lifecycle-byte-bounds.d.ts.map +1 -0
  134. package/dist/wire/lifecycle-byte-bounds.js +209 -0
  135. package/dist/wire/lifecycle-byte-bounds.js.map +1 -0
  136. package/dist/wire/messaging-byte-bounds.d.ts +61 -0
  137. package/dist/wire/messaging-byte-bounds.d.ts.map +1 -0
  138. package/dist/wire/messaging-byte-bounds.js +459 -0
  139. package/dist/wire/messaging-byte-bounds.js.map +1 -0
  140. package/dist/wire/registry.d.ts +294 -0
  141. package/dist/wire/registry.d.ts.map +1 -0
  142. package/dist/wire/registry.js +256 -0
  143. package/dist/wire/registry.js.map +1 -0
  144. package/dist/wire/request-id.d.ts +34 -0
  145. package/dist/wire/request-id.d.ts.map +1 -0
  146. package/dist/wire/request-id.js +40 -0
  147. package/dist/wire/request-id.js.map +1 -0
  148. package/dist/wire/row-shapes.d.ts +217 -0
  149. package/dist/wire/row-shapes.d.ts.map +1 -0
  150. package/dist/wire/row-shapes.js +75 -0
  151. package/dist/wire/row-shapes.js.map +1 -0
  152. package/dist/wire/signal-byte-bounds.d.ts +97 -0
  153. package/dist/wire/signal-byte-bounds.d.ts.map +1 -0
  154. package/dist/wire/signal-byte-bounds.js +229 -0
  155. package/dist/wire/signal-byte-bounds.js.map +1 -0
  156. package/dist/wire/wire-uint53.d.ts +26 -0
  157. package/dist/wire/wire-uint53.d.ts.map +1 -0
  158. package/dist/wire/wire-uint53.js +32 -0
  159. package/dist/wire/wire-uint53.js.map +1 -0
  160. package/fixtures/behavior/messaging/adversarial-invariants.json +56 -5
  161. package/fixtures/manifest/invalid/duplicate-signal-type.json +33 -0
  162. package/fixtures/messaging/valid/subscription-delivery.json +1 -1
  163. package/fixtures/signals/invalid/destination-injection.json +15 -0
  164. package/fixtures/signals/invalid/dynamic-schema-url.json +10 -0
  165. package/fixtures/signals/invalid/forbidden-raw-privacy.json +10 -0
  166. package/fixtures/signals/invalid/non-utc-occurred-at.json +12 -0
  167. package/fixtures/signals/valid/feishu-meeting-artifact.json +18 -0
  168. package/fixtures/signals/valid/remote-service-declaration.json +10 -0
  169. package/package.json +15 -6
  170. package/src/schemas/manifest.schema.json +5 -2
  171. package/src/schemas/messaging.schema.json +209 -32
  172. package/src/schemas/physical-limb.schema.json +319 -0
  173. package/src/schemas/signal.schema.json +129 -0
@@ -0,0 +1,389 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { CAPABILITY_TABLE, } from '../generated/contract.generated.js';
3
+ import { createMessagingLoopbackState, } from './messaging-loopback-state.js';
4
+ function isRecord(value) {
5
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
6
+ }
7
+ function isMessageHandle(value) {
8
+ if (!isRecord(value)) {
9
+ return false;
10
+ }
11
+ const keys = Object.keys(value);
12
+ return (value.kind === 'message' &&
13
+ typeof value.token === 'string' &&
14
+ value.token.length > 0 &&
15
+ keys.length === 2 &&
16
+ keys.every((key) => key === 'kind' || key === 'token'));
17
+ }
18
+ function error(errorCode) {
19
+ return { status: 'error', errorCode };
20
+ }
21
+ const success = { status: 'success' };
22
+ function assertNever(value) {
23
+ throw new Error(`Unsupported fixture operation: ${JSON.stringify(value)}`);
24
+ }
25
+ export class MessagingLoopbackAdapter {
26
+ state;
27
+ async setup(given) {
28
+ this.state = createMessagingLoopbackState(given);
29
+ }
30
+ async observe(target) {
31
+ return structuredClone(this.requireState().observations.get(target));
32
+ }
33
+ async execute(operation) {
34
+ switch (operation.operation) {
35
+ case 'send':
36
+ return this.send(operation.input);
37
+ case 'appendElements':
38
+ return this.appendElements(operation.input);
39
+ case 'subscribe':
40
+ return this.subscribe(operation.input.handleId);
41
+ case 'read':
42
+ return this.read(operation.input.subscriptionId);
43
+ case 'ack':
44
+ return this.ack(operation.input.subscriptionId, operation.input.ackToken);
45
+ case 'snapshot':
46
+ return this.snapshot(operation.input.subscriptionId);
47
+ case 'applyGrantPreset':
48
+ return this.applyGrantPreset(operation.input.capabilities);
49
+ case 'revokeGrant':
50
+ return this.revokeGrant(operation.input.capability);
51
+ case 'deliverOnMessage':
52
+ return this.deliverOnMessage(operation.input);
53
+ case 'checkPermissionMatrix':
54
+ return this.checkPermissionMatrix(operation.input.entries);
55
+ case 'deleteReplayEvents':
56
+ return this.deleteReplayEvents(operation.input);
57
+ default:
58
+ return assertNever(operation);
59
+ }
60
+ }
61
+ requireState() {
62
+ if (!this.state) {
63
+ throw new Error('MessagingLoopbackAdapter.setup must be called before use');
64
+ }
65
+ return this.state;
66
+ }
67
+ accessScopedHandle(token, kind) {
68
+ const state = this.requireState();
69
+ if (typeof token !== 'string') {
70
+ return { ok: false, verdict: error('VALIDATION') };
71
+ }
72
+ const handle = state.handles.get(token);
73
+ if (!handle || handle.kind !== kind) {
74
+ return { ok: false, verdict: error('NOT_FOUND') };
75
+ }
76
+ if (handle.ownerPluginInstanceId !== state.callerId) {
77
+ return { ok: false, verdict: error('PERMISSION') };
78
+ }
79
+ if (typeof handle.threadId !== 'string' || handle.threadId.length === 0) {
80
+ return { ok: false, verdict: error('NOT_FOUND') };
81
+ }
82
+ return { ok: true, handle: handle };
83
+ }
84
+ accessSubscription(subscriptionId) {
85
+ const state = this.requireState();
86
+ if (!state.grants.has('message.event.subscribe')) {
87
+ return { ok: false, verdict: error('PERMISSION') };
88
+ }
89
+ const subscription = state.subscriptions.get(subscriptionId);
90
+ if (!subscription) {
91
+ return { ok: false, verdict: error('NOT_FOUND') };
92
+ }
93
+ if (subscription.ownerPluginInstanceId !== state.callerId) {
94
+ return { ok: false, verdict: error('PERMISSION') };
95
+ }
96
+ return { ok: true, subscription };
97
+ }
98
+ send(input) {
99
+ const state = this.requireState();
100
+ if (!state.grants.has('messaging.send')) {
101
+ return error('PERMISSION');
102
+ }
103
+ const rawInput = input;
104
+ const address = input.address;
105
+ if (address.kind === 'thread_id') {
106
+ return error('PERMISSION');
107
+ }
108
+ if (address.kind !== 'thread_handle' &&
109
+ address.kind !== 'connector_binding') {
110
+ return error('VALIDATION');
111
+ }
112
+ const targetAccess = this.accessScopedHandle(address.handle, address.kind);
113
+ if (!targetAccess.ok) {
114
+ return targetAccess.verdict;
115
+ }
116
+ const { handle: target } = targetAccess;
117
+ const audience = rawInput.draftAudience;
118
+ if (isRecord(audience) && audience.kind === 'system') {
119
+ return error('VALIDATION');
120
+ }
121
+ if (isRecord(audience) && audience.kind === 'whisper') {
122
+ const targets = audience.targets;
123
+ if (!Array.isArray(targets) ||
124
+ targets.some((target) => typeof target !== 'string' || !state.whisperGrantTargets.has(target))) {
125
+ return error('PERMISSION');
126
+ }
127
+ }
128
+ const provenance = input.payload.provenance;
129
+ if (isRecord(provenance) && isRecord(provenance.origin)) {
130
+ const origin = provenance.origin;
131
+ if (origin.kind === 'plugin' &&
132
+ origin.instanceId !== state.callerId) {
133
+ return error('PERMISSION');
134
+ }
135
+ }
136
+ const replyTo = rawInput.replyTo;
137
+ if (replyTo !== undefined) {
138
+ if (typeof replyTo !== 'string') {
139
+ return error('VALIDATION');
140
+ }
141
+ const reply = state.messages.get(replyTo);
142
+ if (!reply || reply.threadId !== target.threadId) {
143
+ return error('VALIDATION');
144
+ }
145
+ state.observations.set('reply_preview', { messageId: replyTo });
146
+ }
147
+ const messageId = `loopback-message-${state.messages.size + 1}`;
148
+ const message = {
149
+ messageId,
150
+ threadId: target.threadId,
151
+ revision: 1,
152
+ payload: structuredClone(input.payload),
153
+ };
154
+ const event = { eventId: `loopback-event-${state.outputEvents.length + 1}`, messageId };
155
+ const ledgerEntry = { idempotencyKey: input.idempotencyKey, messageId };
156
+ state.messages.set(messageId, message);
157
+ state.outputEvents.push(event);
158
+ state.ledger.set(input.idempotencyKey, ledgerEntry);
159
+ state.observations.set('messages', [...state.messages.values()]);
160
+ state.observations.set('output_events', state.outputEvents);
161
+ state.observations.set('idempotency_ledger', [...state.ledger.values()]);
162
+ state.observations.set('provenance', provenance);
163
+ return success;
164
+ }
165
+ appendElements(input) {
166
+ const state = this.requireState();
167
+ if (!state.grants.has('messaging.appendElements')) {
168
+ return error('PERMISSION');
169
+ }
170
+ const rawHandle = input.handle;
171
+ if (!isMessageHandle(rawHandle)) {
172
+ return error('VALIDATION');
173
+ }
174
+ const handleAccess = this.accessScopedHandle(rawHandle.token, 'message_handle');
175
+ if (!handleAccess.ok) {
176
+ return handleAccess.verdict;
177
+ }
178
+ const { handle } = handleAccess;
179
+ if (typeof handle.messageId !== 'string' || handle.messageId.length === 0) {
180
+ return error('NOT_FOUND');
181
+ }
182
+ const message = state.messages.get(handle.messageId);
183
+ if (!message) {
184
+ return error('NOT_FOUND');
185
+ }
186
+ if (typeof message.threadId !== 'string' ||
187
+ message.threadId !== handle.threadId) {
188
+ return error('VALIDATION');
189
+ }
190
+ const baseRevision = input.baseRevision;
191
+ if (baseRevision !== undefined && baseRevision !== message.revision) {
192
+ return error('CONFLICT');
193
+ }
194
+ const existingElements = Array.isArray(message.elements) ? message.elements : [];
195
+ for (const candidate of input.elements) {
196
+ if (!isRecord(candidate) || typeof candidate.elementId !== 'string') {
197
+ return error('VALIDATION');
198
+ }
199
+ if (typeof candidate.derivedFromElementId === 'string') {
200
+ const source = existingElements.find((element) => isRecord(element) && element.elementId === candidate.derivedFromElementId);
201
+ if (isRecord(source) &&
202
+ source.epistemicStatus === 'inference' &&
203
+ candidate.epistemicStatus === 'user_intent') {
204
+ return error('VALIDATION');
205
+ }
206
+ }
207
+ }
208
+ message.elements = [...existingElements, ...structuredClone(input.elements)];
209
+ message.revision = typeof message.revision === 'number' ? message.revision + 1 : 1;
210
+ const event = {
211
+ eventId: `loopback-event-${state.outputEvents.length + 1}`,
212
+ messageId: handle?.messageId,
213
+ operationId: input.operationId,
214
+ };
215
+ state.outputEvents.push(event);
216
+ state.ledger.set(input.operationId, { operationId: input.operationId });
217
+ state.observations.set('messages', [...state.messages.values()]);
218
+ state.observations.set('output_events', state.outputEvents);
219
+ state.observations.set('idempotency_ledger', [...state.ledger.values()]);
220
+ return success;
221
+ }
222
+ subscribe(handleId) {
223
+ const state = this.requireState();
224
+ if (!state.grants.has('message.event.subscribe')) {
225
+ return error('PERMISSION');
226
+ }
227
+ const handleAccess = this.accessScopedHandle(handleId, 'thread_handle');
228
+ if (!handleAccess.ok) {
229
+ return handleAccess.verdict;
230
+ }
231
+ const { handle } = handleAccess;
232
+ const subscriptionId = `loopback-subscription-${state.subscriptions.size + 1}`;
233
+ const subscription = {
234
+ subscriptionId,
235
+ ownerPluginInstanceId: state.callerId,
236
+ threadId: handle.threadId,
237
+ cursorSequence: 0,
238
+ ackedSequence: 0,
239
+ };
240
+ state.subscriptions.set(subscriptionId, subscription);
241
+ state.observations.set('subscription', subscription);
242
+ return success;
243
+ }
244
+ read(subscriptionId) {
245
+ const state = this.requireState();
246
+ const access = this.accessSubscription(subscriptionId);
247
+ if (!access.ok) {
248
+ return access.verdict;
249
+ }
250
+ const { subscription } = access;
251
+ const cursor = subscription.cursorSequence;
252
+ const oldest = state.eventWindow?.oldestSequence;
253
+ if (typeof cursor === 'number' && typeof oldest === 'number' && cursor < oldest) {
254
+ const head = state.eventWindow?.headSequence;
255
+ if (typeof head !== 'number') {
256
+ return error('VALIDATION');
257
+ }
258
+ state.observations.set('subscription', {
259
+ stale: true,
260
+ ackToken: null,
261
+ events: [],
262
+ });
263
+ state.observations.set('snapshot', {
264
+ operation: 'snapshot',
265
+ resumeSequence: head,
266
+ nextReadStartsAfter: head,
267
+ });
268
+ return success;
269
+ }
270
+ state.observations.set('subscription', {
271
+ stale: false,
272
+ ackToken: null,
273
+ events: [],
274
+ });
275
+ return success;
276
+ }
277
+ ack(subscriptionId, ackToken) {
278
+ const state = this.requireState();
279
+ const access = this.accessSubscription(subscriptionId);
280
+ if (!access.ok) {
281
+ return access.verdict;
282
+ }
283
+ const { subscription } = access;
284
+ const tokenHandle = state.handles.get(ackToken);
285
+ if (!tokenHandle ||
286
+ tokenHandle.kind !== 'subscription' ||
287
+ tokenHandle.subscriptionId !== subscriptionId ||
288
+ tokenHandle.ownerPluginInstanceId !== state.callerId) {
289
+ return error('VALIDATION');
290
+ }
291
+ subscription.ackedSequence = subscription.cursorSequence ?? 0;
292
+ state.observations.set('subscription', subscription);
293
+ return success;
294
+ }
295
+ snapshot(subscriptionId) {
296
+ const state = this.requireState();
297
+ const access = this.accessSubscription(subscriptionId);
298
+ if (!access.ok) {
299
+ return access.verdict;
300
+ }
301
+ const head = state.eventWindow?.headSequence;
302
+ if (typeof head !== 'number') {
303
+ return error('VALIDATION');
304
+ }
305
+ state.observations.set('snapshot', {
306
+ operation: 'snapshot',
307
+ resumeSequence: head,
308
+ nextReadStartsAfter: head,
309
+ });
310
+ return success;
311
+ }
312
+ applyGrantPreset(capabilities) {
313
+ const state = this.requireState();
314
+ const l1 = new Set(CAPABILITY_TABLE.L1);
315
+ if (capabilities.some((capability) => !l1.has(capability))) {
316
+ return error('PERMISSION');
317
+ }
318
+ for (const capability of capabilities) {
319
+ state.grants.add(capability);
320
+ state.grantState.set(capability, { visible: true, granted: true });
321
+ }
322
+ state.observations.set('grant_state', Object.fromEntries(state.grantState));
323
+ return success;
324
+ }
325
+ revokeGrant(capability) {
326
+ const state = this.requireState();
327
+ const current = state.grantState.get(capability);
328
+ if (!current) {
329
+ return error('NOT_FOUND');
330
+ }
331
+ state.grants.delete(capability);
332
+ state.grantState.set(capability, { visible: current.visible, granted: false });
333
+ state.observations.set('grant_state', {
334
+ capability,
335
+ visible: current.visible,
336
+ granted: false,
337
+ });
338
+ return success;
339
+ }
340
+ deliverOnMessage(input) {
341
+ const state = this.requireState();
342
+ if (!state.grants.has('onMessage')) {
343
+ return error('PERMISSION');
344
+ }
345
+ const handleAccess = this.accessScopedHandle(input.threadHandle, 'thread_handle');
346
+ if (!handleAccess.ok) {
347
+ return handleAccess.verdict;
348
+ }
349
+ const envelopeThreadId = input.envelope.threadId;
350
+ if (typeof envelopeThreadId !== 'string' ||
351
+ envelopeThreadId.length === 0 ||
352
+ envelopeThreadId !== handleAccess.handle.threadId) {
353
+ return error('VALIDATION');
354
+ }
355
+ return success;
356
+ }
357
+ checkPermissionMatrix(entries) {
358
+ const expected = Object.entries(CAPABILITY_TABLE).flatMap(([layer, capabilities]) => capabilities.map((capability) => ({
359
+ capability,
360
+ layer,
361
+ firstPartyPreset: layer === 'L1',
362
+ })));
363
+ const uniqueCapabilities = new Set(entries.map(({ capability }) => capability));
364
+ if (entries.length !== expected.length ||
365
+ uniqueCapabilities.size !== expected.length ||
366
+ !expected.every((expectedEntry) => entries.some((entry) => isDeepStrictEqual(entry, expectedEntry)))) {
367
+ return error('VALIDATION');
368
+ }
369
+ this.requireState().observations.set('permission_matrix', {
370
+ complete: true,
371
+ firstPartyPresetLayers: ['L1'],
372
+ defaultWhisperTargets: [],
373
+ });
374
+ return success;
375
+ }
376
+ deleteReplayEvents(input) {
377
+ const state = this.requireState();
378
+ const access = this.accessSubscription(input.subscriptionId);
379
+ if (!access.ok) {
380
+ return access.verdict;
381
+ }
382
+ state.replayEvents = state.replayEvents.filter((event) => event.subscriptionId !== input.subscriptionId ||
383
+ typeof event.sequence !== 'number' ||
384
+ event.sequence > input.throughSequence);
385
+ state.observations.set('replay_events', state.replayEvents);
386
+ return success;
387
+ }
388
+ }
389
+ //# sourceMappingURL=messaging-loopback-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging-loopback-adapter.js","sourceRoot":"","sources":["../../src/conformance/messaging-loopback-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { FixtureHandle, FixtureSetup } from '../generated/contract.generated.js';
2
+ import type { BehaviorTarget } from './behavior-executor.js';
3
+ export type LoopbackRecord = Record<string, unknown>;
4
+ export interface MessagingLoopbackState {
5
+ callerId: string;
6
+ grants: Set<string>;
7
+ handles: Map<string, FixtureHandle>;
8
+ messages: Map<string, LoopbackRecord>;
9
+ outputEvents: LoopbackRecord[];
10
+ ledger: Map<string, LoopbackRecord>;
11
+ subscriptions: Map<string, LoopbackRecord>;
12
+ replayEvents: LoopbackRecord[];
13
+ grantState: Map<string, {
14
+ visible: boolean;
15
+ granted: boolean;
16
+ }>;
17
+ observations: Map<BehaviorTarget, unknown>;
18
+ eventWindow?: LoopbackRecord;
19
+ whisperGrantTargets: Set<string>;
20
+ }
21
+ export declare function createMessagingLoopbackState(given: FixtureSetup): MessagingLoopbackState;
22
+ //# sourceMappingURL=messaging-loopback-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging-loopback-state.d.ts","sourceRoot":"","sources":["../../src/conformance/messaging-loopback-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtC,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC3C,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChE,YAAY,EAAE,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAClC;AA0BD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,YAAY,GAAG,sBAAsB,CA8FxF"}
@@ -0,0 +1,101 @@
1
+ function isRecord(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ function recordArray(value) {
5
+ return Array.isArray(value)
6
+ ? value.filter(isRecord).map((entry) => structuredClone(entry))
7
+ : [];
8
+ }
9
+ function recordsByStringKey(records, key) {
10
+ const result = new Map();
11
+ for (const record of records) {
12
+ const value = record[key];
13
+ if (typeof value === 'string') {
14
+ result.set(value, record);
15
+ }
16
+ }
17
+ return result;
18
+ }
19
+ export function createMessagingLoopbackState(given) {
20
+ const setup = structuredClone(given);
21
+ const rawState = setup.state;
22
+ const messages = recordArray(rawState.messages);
23
+ const outputEvents = recordArray(rawState.outputEvents);
24
+ const replayEvents = recordArray(rawState.replayEvents);
25
+ const subscriptions = recordArray(rawState.subscriptions);
26
+ const handles = new Map();
27
+ for (const handle of Object.values(setup.handles)) {
28
+ handles.set(handle.token, handle);
29
+ }
30
+ if (isRecord(rawState.subscription) && subscriptions.length === 0) {
31
+ const subscriptionHandle = [...handles.values()].find((handle) => handle.kind === 'subscription' && handle.subscriptionId);
32
+ if (subscriptionHandle?.subscriptionId) {
33
+ subscriptions.push({
34
+ subscriptionId: subscriptionHandle.subscriptionId,
35
+ ...structuredClone(rawState.subscription),
36
+ });
37
+ }
38
+ }
39
+ for (const handle of handles.values()) {
40
+ if (handle.kind === 'subscription' && handle.subscriptionId) {
41
+ const subscription = subscriptions.find((candidate) => candidate.subscriptionId === handle.subscriptionId);
42
+ if (subscription) {
43
+ subscription.ownerPluginInstanceId = handle.ownerPluginInstanceId;
44
+ }
45
+ else {
46
+ subscriptions.push({
47
+ subscriptionId: handle.subscriptionId,
48
+ ownerPluginInstanceId: handle.ownerPluginInstanceId,
49
+ });
50
+ }
51
+ }
52
+ }
53
+ const grantState = new Map();
54
+ if (isRecord(rawState.grantState)) {
55
+ for (const [capability, value] of Object.entries(rawState.grantState)) {
56
+ if (isRecord(value) &&
57
+ typeof value.visible === 'boolean' &&
58
+ typeof value.granted === 'boolean') {
59
+ grantState.set(capability, {
60
+ visible: value.visible,
61
+ granted: value.granted,
62
+ });
63
+ }
64
+ }
65
+ }
66
+ const ledgerRecords = recordArray(rawState.idempotencyLedger);
67
+ const observations = new Map([
68
+ ['messages', messages],
69
+ ['output_events', outputEvents],
70
+ ['idempotency_ledger', ledgerRecords],
71
+ [
72
+ 'subscription',
73
+ rawState.subscription ?? rawState.subscriptions,
74
+ ],
75
+ ['snapshot', rawState.snapshot],
76
+ ['reply_preview', rawState.replyPreview],
77
+ ['provenance', rawState.provenance],
78
+ ['grant_state', rawState.grantState],
79
+ ['permission_matrix', rawState.permissionMatrix],
80
+ ['replay_events', replayEvents],
81
+ ]);
82
+ return {
83
+ callerId: setup.caller.pluginInstanceId,
84
+ grants: new Set(setup.grants),
85
+ handles,
86
+ messages: recordsByStringKey(messages, 'messageId'),
87
+ outputEvents,
88
+ ledger: recordsByStringKey(ledgerRecords, 'idempotencyKey'),
89
+ subscriptions: recordsByStringKey(subscriptions, 'subscriptionId'),
90
+ replayEvents,
91
+ grantState,
92
+ observations,
93
+ eventWindow: isRecord(rawState.eventWindow)
94
+ ? structuredClone(rawState.eventWindow)
95
+ : undefined,
96
+ whisperGrantTargets: new Set(Array.isArray(rawState.whisperGrantTargets)
97
+ ? rawState.whisperGrantTargets.filter((target) => typeof target === 'string')
98
+ : []),
99
+ };
100
+ }
101
+ //# sourceMappingURL=messaging-loopback-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging-loopback-state.js","sourceRoot":"","sources":["../../src/conformance/messaging-loopback-state.ts"],"names":[],"mappings":"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"}
@@ -14,5 +14,22 @@
14
14
  *
15
15
  * @packageDocumentation
16
16
  */
17
- export {};
17
+ import { type BehaviorAdapter } from './behavior-executor.js';
18
+ export interface ConformanceReport {
19
+ readonly contractFixtures: {
20
+ readonly passed: number;
21
+ readonly total: number;
22
+ };
23
+ readonly behaviorCases: {
24
+ readonly passed: number;
25
+ readonly total: number;
26
+ };
27
+ readonly failures: readonly string[];
28
+ }
29
+ export interface ConformanceOptions {
30
+ readonly behaviorAdapters?: Readonly<Record<string, () => BehaviorAdapter>>;
31
+ readonly fixturesDir?: string;
32
+ readonly write?: (line: string) => void;
33
+ }
34
+ export declare function runConformance(options?: ConformanceOptions): Promise<ConformanceReport>;
18
35
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/conformance/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/conformance/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAqMhC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,gBAAgB,EAAE;QACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,eAAe,CAAC,CAAC,CAAC;IAC5E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAeD,wBAAsB,cAAc,CAClC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAoL5B"}