@kya-os/mcp 1.10.0 → 1.11.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 (224) hide show
  1. package/AUDITABILITY.md +441 -0
  2. package/CHANGELOG.md +104 -0
  3. package/CONFORMANCE.md +598 -0
  4. package/README.md +67 -4
  5. package/SPEC.md +1827 -0
  6. package/dist/audit/adapters/legacy-audit-log.d.ts +20 -0
  7. package/dist/audit/adapters/legacy-audit-log.d.ts.map +1 -0
  8. package/dist/audit/adapters/legacy-audit-log.js +56 -0
  9. package/dist/audit/adapters/legacy-audit-log.js.map +1 -0
  10. package/dist/audit/adapters/mcp.d.ts +105 -0
  11. package/dist/audit/adapters/mcp.d.ts.map +1 -0
  12. package/dist/audit/adapters/mcp.js +213 -0
  13. package/dist/audit/adapters/mcp.js.map +1 -0
  14. package/dist/audit/assurance.d.ts +22 -0
  15. package/dist/audit/assurance.d.ts.map +1 -0
  16. package/dist/audit/assurance.js +39 -0
  17. package/dist/audit/assurance.js.map +1 -0
  18. package/dist/audit/checkpoint-coordinator.d.ts +51 -0
  19. package/dist/audit/checkpoint-coordinator.d.ts.map +1 -0
  20. package/dist/audit/checkpoint-coordinator.js +112 -0
  21. package/dist/audit/checkpoint-coordinator.js.map +1 -0
  22. package/dist/audit/checkpoint.d.ts +59 -0
  23. package/dist/audit/checkpoint.d.ts.map +1 -0
  24. package/dist/audit/checkpoint.js +219 -0
  25. package/dist/audit/checkpoint.js.map +1 -0
  26. package/dist/audit/cli.d.ts +8 -0
  27. package/dist/audit/cli.d.ts.map +1 -0
  28. package/dist/audit/cli.js +85 -0
  29. package/dist/audit/cli.js.map +1 -0
  30. package/dist/audit/crypto.d.ts +37 -0
  31. package/dist/audit/crypto.d.ts.map +1 -0
  32. package/dist/audit/crypto.js +68 -0
  33. package/dist/audit/crypto.js.map +1 -0
  34. package/dist/audit/errors.d.ts +29 -0
  35. package/dist/audit/errors.d.ts.map +1 -0
  36. package/dist/audit/errors.js +33 -0
  37. package/dist/audit/errors.js.map +1 -0
  38. package/dist/audit/evidence.d.ts +45 -0
  39. package/dist/audit/evidence.d.ts.map +1 -0
  40. package/dist/audit/evidence.js +151 -0
  41. package/dist/audit/evidence.js.map +1 -0
  42. package/dist/audit/index.d.ts +27 -0
  43. package/dist/audit/index.d.ts.map +1 -0
  44. package/dist/audit/index.js +27 -0
  45. package/dist/audit/index.js.map +1 -0
  46. package/dist/audit/integrity.d.ts +19 -0
  47. package/dist/audit/integrity.d.ts.map +1 -0
  48. package/dist/audit/integrity.js +64 -0
  49. package/dist/audit/integrity.js.map +1 -0
  50. package/dist/audit/merkle.d.ts +31 -0
  51. package/dist/audit/merkle.d.ts.map +1 -0
  52. package/dist/audit/merkle.js +195 -0
  53. package/dist/audit/merkle.js.map +1 -0
  54. package/dist/audit/mirror-service.d.ts +19 -0
  55. package/dist/audit/mirror-service.d.ts.map +1 -0
  56. package/dist/audit/mirror-service.js +54 -0
  57. package/dist/audit/mirror-service.js.map +1 -0
  58. package/dist/audit/projection.d.ts +90 -0
  59. package/dist/audit/projection.d.ts.map +1 -0
  60. package/dist/audit/projection.js +142 -0
  61. package/dist/audit/projection.js.map +1 -0
  62. package/dist/audit/providers/anchor.d.ts +23 -0
  63. package/dist/audit/providers/anchor.d.ts.map +1 -0
  64. package/dist/audit/providers/anchor.js +25 -0
  65. package/dist/audit/providers/anchor.js.map +1 -0
  66. package/dist/audit/providers/evidence.d.ts +36 -0
  67. package/dist/audit/providers/evidence.d.ts.map +1 -0
  68. package/dist/audit/providers/evidence.js +2 -0
  69. package/dist/audit/providers/evidence.js.map +1 -0
  70. package/dist/audit/providers/journal.d.ts +35 -0
  71. package/dist/audit/providers/journal.d.ts.map +1 -0
  72. package/dist/audit/providers/journal.js +2 -0
  73. package/dist/audit/providers/journal.js.map +1 -0
  74. package/dist/audit/providers/memory-journal.d.ts +24 -0
  75. package/dist/audit/providers/memory-journal.d.ts.map +1 -0
  76. package/dist/audit/providers/memory-journal.js +73 -0
  77. package/dist/audit/providers/memory-journal.js.map +1 -0
  78. package/dist/audit/providers/observer.d.ts +30 -0
  79. package/dist/audit/providers/observer.d.ts.map +1 -0
  80. package/dist/audit/providers/observer.js +100 -0
  81. package/dist/audit/providers/observer.js.map +1 -0
  82. package/dist/audit/providers/outbox.d.ts +37 -0
  83. package/dist/audit/providers/outbox.d.ts.map +1 -0
  84. package/dist/audit/providers/outbox.js +52 -0
  85. package/dist/audit/providers/outbox.js.map +1 -0
  86. package/dist/audit/providers/recorder-client.d.ts +22 -0
  87. package/dist/audit/providers/recorder-client.d.ts.map +1 -0
  88. package/dist/audit/providers/recorder-client.js +17 -0
  89. package/dist/audit/providers/recorder-client.js.map +1 -0
  90. package/dist/audit/providers/source-state.d.ts +37 -0
  91. package/dist/audit/providers/source-state.d.ts.map +1 -0
  92. package/dist/audit/providers/source-state.js +94 -0
  93. package/dist/audit/providers/source-state.js.map +1 -0
  94. package/dist/audit/recorder-service.d.ts +78 -0
  95. package/dist/audit/recorder-service.d.ts.map +1 -0
  96. package/dist/audit/recorder-service.js +331 -0
  97. package/dist/audit/recorder-service.js.map +1 -0
  98. package/dist/audit/replay-bundle.d.ts +52 -0
  99. package/dist/audit/replay-bundle.d.ts.map +1 -0
  100. package/dist/audit/replay-bundle.js +551 -0
  101. package/dist/audit/replay-bundle.js.map +1 -0
  102. package/dist/audit/schemas.d.ts +1144 -0
  103. package/dist/audit/schemas.d.ts.map +1 -0
  104. package/dist/audit/schemas.js +483 -0
  105. package/dist/audit/schemas.js.map +1 -0
  106. package/dist/audit/service.d.ts +91 -0
  107. package/dist/audit/service.d.ts.map +1 -0
  108. package/dist/audit/service.js +222 -0
  109. package/dist/audit/service.js.map +1 -0
  110. package/dist/audit/testing/index.d.ts +2 -0
  111. package/dist/audit/testing/index.d.ts.map +1 -0
  112. package/dist/audit/testing/index.js +2 -0
  113. package/dist/audit/testing/index.js.map +1 -0
  114. package/dist/audit/testing/provider-contracts.d.ts +51 -0
  115. package/dist/audit/testing/provider-contracts.d.ts.map +1 -0
  116. package/dist/audit/testing/provider-contracts.js +391 -0
  117. package/dist/audit/testing/provider-contracts.js.map +1 -0
  118. package/dist/audit/types.d.ts +356 -0
  119. package/dist/audit/types.d.ts.map +1 -0
  120. package/dist/audit/types.js +49 -0
  121. package/dist/audit/types.js.map +1 -0
  122. package/dist/audit/verifier.d.ts +73 -0
  123. package/dist/audit/verifier.d.ts.map +1 -0
  124. package/dist/audit/verifier.js +322 -0
  125. package/dist/audit/verifier.js.map +1 -0
  126. package/dist/card/proof/canonical.d.ts.map +1 -1
  127. package/dist/card/proof/canonical.js +19 -1
  128. package/dist/card/proof/canonical.js.map +1 -1
  129. package/dist/delegation/delegation-graph.d.ts +4 -0
  130. package/dist/delegation/delegation-graph.d.ts.map +1 -1
  131. package/dist/delegation/delegation-graph.js +28 -2
  132. package/dist/delegation/delegation-graph.js.map +1 -1
  133. package/dist/delegation/statuslist-manager.d.ts +5 -0
  134. package/dist/delegation/statuslist-manager.d.ts.map +1 -1
  135. package/dist/delegation/statuslist-manager.js.map +1 -1
  136. package/dist/delegation/storage/memory-graph-storage.d.ts +4 -2
  137. package/dist/delegation/storage/memory-graph-storage.d.ts.map +1 -1
  138. package/dist/delegation/storage/memory-graph-storage.js +18 -0
  139. package/dist/delegation/storage/memory-graph-storage.js.map +1 -1
  140. package/dist/delegation/storage/memory-statuslist-storage.d.ts +5 -2
  141. package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +1 -1
  142. package/dist/delegation/storage/memory-statuslist-storage.js +21 -2
  143. package/dist/delegation/storage/memory-statuslist-storage.js.map +1 -1
  144. package/dist/delegation/utils.d.ts.map +1 -1
  145. package/dist/delegation/utils.js +2 -42
  146. package/dist/delegation/utils.js.map +1 -1
  147. package/dist/delegation/vc-verifier.d.ts +4 -0
  148. package/dist/delegation/vc-verifier.d.ts.map +1 -1
  149. package/dist/delegation/vc-verifier.js +44 -13
  150. package/dist/delegation/vc-verifier.js.map +1 -1
  151. package/dist/errors.d.ts +1 -1
  152. package/dist/errors.js +1 -1
  153. package/dist/index.d.ts +2 -1
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +3 -1
  156. package/dist/index.js.map +1 -1
  157. package/dist/middleware/kya-os-transport.d.ts.map +1 -1
  158. package/dist/middleware/kya-os-transport.js +10 -3
  159. package/dist/middleware/kya-os-transport.js.map +1 -1
  160. package/dist/middleware/with-kya-os-server.d.ts +6 -0
  161. package/dist/middleware/with-kya-os-server.d.ts.map +1 -1
  162. package/dist/middleware/with-kya-os-server.js +2 -0
  163. package/dist/middleware/with-kya-os-server.js.map +1 -1
  164. package/dist/middleware/with-kya-os.config-types.d.ts +15 -0
  165. package/dist/middleware/with-kya-os.config-types.d.ts.map +1 -1
  166. package/dist/middleware/with-kya-os.config-types.js.map +1 -1
  167. package/dist/middleware/with-kya-os.d.ts.map +1 -1
  168. package/dist/middleware/with-kya-os.delegation-gate.d.ts.map +1 -1
  169. package/dist/middleware/with-kya-os.delegation-gate.js +96 -3
  170. package/dist/middleware/with-kya-os.delegation-gate.js.map +1 -1
  171. package/dist/middleware/with-kya-os.deps.d.ts +2 -0
  172. package/dist/middleware/with-kya-os.deps.d.ts.map +1 -1
  173. package/dist/middleware/with-kya-os.js +23 -0
  174. package/dist/middleware/with-kya-os.js.map +1 -1
  175. package/dist/middleware/with-kya-os.policy-gate.d.ts.map +1 -1
  176. package/dist/middleware/with-kya-os.policy-gate.js +29 -4
  177. package/dist/middleware/with-kya-os.policy-gate.js.map +1 -1
  178. package/dist/middleware/with-kya-os.protocol.d.ts.map +1 -1
  179. package/dist/middleware/with-kya-os.protocol.js +10 -0
  180. package/dist/middleware/with-kya-os.protocol.js.map +1 -1
  181. package/dist/middleware/with-kya-os.session.d.ts.map +1 -1
  182. package/dist/middleware/with-kya-os.session.js +208 -2
  183. package/dist/middleware/with-kya-os.session.js.map +1 -1
  184. package/dist/middleware/with-kya-os.types.d.ts +6 -0
  185. package/dist/middleware/with-kya-os.types.d.ts.map +1 -1
  186. package/dist/middleware/with-kya-os.types.js.map +1 -1
  187. package/dist/proof/generator.d.ts.map +1 -1
  188. package/dist/proof/generator.js +6 -5
  189. package/dist/proof/generator.js.map +1 -1
  190. package/dist/proof/verifier.d.ts +12 -0
  191. package/dist/proof/verifier.d.ts.map +1 -1
  192. package/dist/proof/verifier.js +35 -4
  193. package/dist/proof/verifier.js.map +1 -1
  194. package/dist/session/manager.js +1 -1
  195. package/dist/session/manager.js.map +1 -1
  196. package/dist/utils/canonical-json.d.ts +15 -0
  197. package/dist/utils/canonical-json.d.ts.map +1 -0
  198. package/dist/utils/canonical-json.js +109 -0
  199. package/dist/utils/canonical-json.js.map +1 -0
  200. package/dist/utils/crypto-service.d.ts.map +1 -1
  201. package/dist/utils/crypto-service.js +5 -0
  202. package/dist/utils/crypto-service.js.map +1 -1
  203. package/dist/utils/index.d.ts +1 -0
  204. package/dist/utils/index.d.ts.map +1 -1
  205. package/dist/utils/index.js +1 -0
  206. package/dist/utils/index.js.map +1 -1
  207. package/dist/utils/safe-fetch-transports.d.ts +15 -2
  208. package/dist/utils/safe-fetch-transports.d.ts.map +1 -1
  209. package/dist/utils/safe-fetch-transports.js +66 -32
  210. package/dist/utils/safe-fetch-transports.js.map +1 -1
  211. package/package.json +29 -11
  212. package/schemas/README.md +27 -1
  213. package/schemas/audit-anchor-receipt.schema.json +16 -0
  214. package/schemas/audit-bundle-manifest.schema.json +71 -0
  215. package/schemas/audit-checkpoint.schema.json +37 -0
  216. package/schemas/audit-consistency-proof.schema.json +17 -0
  217. package/schemas/audit-entry.schema.json +33 -0
  218. package/schemas/audit-event.schema.json +168 -0
  219. package/schemas/audit-inclusion-proof.schema.json +17 -0
  220. package/schemas/audit-observation.schema.json +40 -0
  221. package/schemas/audit-receipt.schema.json +32 -0
  222. package/schemas/audit-verification-policy.schema.json +71 -0
  223. package/schemas/audit-verification-report.schema.json +29 -0
  224. package/schemas/well-known-mcpi.json +17 -0
@@ -0,0 +1,391 @@
1
+ function digest(character) {
2
+ return `sha256:${character.repeat(64)}`;
3
+ }
4
+ function equalJson(left, right) {
5
+ return JSON.stringify(left) === JSON.stringify(right);
6
+ }
7
+ function expectContract(condition, message) {
8
+ if (!condition)
9
+ throw new Error(message);
10
+ }
11
+ async function check(checks, name, execute) {
12
+ try {
13
+ await execute();
14
+ checks.push({ name, passed: true });
15
+ }
16
+ catch (error) {
17
+ checks.push({ name, passed: false, error });
18
+ }
19
+ }
20
+ function report(providerKind, checks) {
21
+ return { providerKind, passed: checks.every((item) => item.passed), checks };
22
+ }
23
+ export function assertAuditProviderContract(value) {
24
+ const failures = value.checks.filter((item) => !item.passed);
25
+ if (failures.length > 0) {
26
+ throw new AggregateError(failures.map((item) => item.error), `${value.providerKind} provider contract failed: ${failures.map((item) => item.name).join(', ')}`);
27
+ }
28
+ }
29
+ function contractEntry(ledger, sequence, eventDigest, previousEntryDigest) {
30
+ const entryDigest = digest(((sequence + 3) % 10).toString());
31
+ const eventId = `contract-event-${sequence}`;
32
+ return {
33
+ core: {
34
+ schema: 'https://schema.kya-os.org/v1/protocol/audit/entry/v1.0.0',
35
+ ...ledger,
36
+ sequence: String(sequence),
37
+ previousEntryDigest,
38
+ recordedAt: 1_750_000_000_000 + sequence,
39
+ recorder: {
40
+ did: 'did:key:zContractRecorder',
41
+ kid: 'did:key:zContractRecorder#key',
42
+ alg: 'EdDSA',
43
+ },
44
+ eventDigest,
45
+ event: {
46
+ schema: 'https://schema.kya-os.org/v1/protocol/audit/event/v1.0.0',
47
+ eventId,
48
+ eventType: sequence === 0 ? 'ledger.epoch.started' : 'tool.call.completed',
49
+ eventVersion: '1.0.0',
50
+ binding: 'urn:kya-os:audit-binding:contract:1',
51
+ occurredAt: 1_750_000_000_000 + sequence,
52
+ tenantRef: { kind: 'pairwise_did', did: 'did:key:zContractTenant' },
53
+ source: {
54
+ producer: { kind: 'pairwise_did', did: 'did:key:zContractProducer' },
55
+ sourceId: 'contract-source',
56
+ sourceSequence: String(sequence),
57
+ },
58
+ action: { category: sequence === 0 ? 'ledger.epoch' : 'tool.call' },
59
+ outcome: 'succeeded',
60
+ evidence: [],
61
+ details: sequence === 0
62
+ ? { family: 'ledger', phase: 'epoch_started' }
63
+ : { family: 'tool', phase: 'completed', attempt: '1' },
64
+ privacy: { classification: 'internal', retentionClass: 'contract' },
65
+ },
66
+ evidenceManifestDigest: digest('a'),
67
+ integritySuite: 'KYA-AUDIT-JCS-SHA256-JWS-2026',
68
+ },
69
+ eventDigest,
70
+ entryDigest,
71
+ recorderReceipt: {
72
+ core: {
73
+ schema: 'https://schema.kya-os.org/v1/protocol/audit/receipt/v1.0.0',
74
+ ...ledger,
75
+ sequence: String(sequence),
76
+ eventId,
77
+ entryDigest,
78
+ previousEntryDigest,
79
+ recordedAt: 1_750_000_000_000 + sequence,
80
+ recorder: {
81
+ did: 'did:key:zContractRecorder',
82
+ kid: 'did:key:zContractRecorder#key',
83
+ alg: 'EdDSA',
84
+ },
85
+ integritySuite: 'KYA-AUDIT-JCS-SHA256-JWS-2026',
86
+ },
87
+ jws: `contract-signature-${sequence}`,
88
+ },
89
+ };
90
+ }
91
+ /** Framework-neutral executable contract for authoritative journal adapters. */
92
+ export async function evaluateAuditJournalProviderContract(createProvider) {
93
+ const checks = [];
94
+ const ledger = { ledgerId: 'contract-ledger', ledgerEpochId: 'epoch-1' };
95
+ const first = contractEntry(ledger, 0, digest('1'), null);
96
+ const second = contractEntry(ledger, 1, digest('2'), first.entryDigest);
97
+ const third = contractEntry(ledger, 2, digest('3'), second.entryDigest);
98
+ const idOne = digest('b');
99
+ const idTwo = digest('c');
100
+ const idThree = digest('d');
101
+ await check(checks, 'declares atomic ordered capabilities', async () => {
102
+ const provider = await createProvider();
103
+ expectContract(provider.capabilities.atomicAppend === true, 'atomicAppend must be true');
104
+ expectContract(provider.capabilities.orderedRead === true, 'orderedRead must be true');
105
+ expectContract(provider.capabilities.durability === 'ephemeral' ||
106
+ provider.capabilities.durability === 'durable', 'durability must be declared');
107
+ });
108
+ await check(checks, 'atomically appends and rejects a stale head', async () => {
109
+ const provider = await createProvider();
110
+ const appended = await provider.compareAndAppend({
111
+ ledger, expectedHead: null, entry: first, idempotencyKey: idOne,
112
+ });
113
+ expectContract(appended.kind === 'appended', 'genesis append was not committed');
114
+ const stale = await provider.compareAndAppend({
115
+ ledger, expectedHead: null, entry: second, idempotencyKey: idTwo,
116
+ });
117
+ expectContract(stale.kind === 'head_conflict', 'stale head did not conflict');
118
+ const head = await provider.getHead(ledger);
119
+ expectContract(head?.entryDigest === first.entryDigest, 'stale append changed the head');
120
+ });
121
+ await check(checks, 'returns exact duplicates and rejects idempotency conflicts', async () => {
122
+ const provider = await createProvider();
123
+ await provider.compareAndAppend({ ledger, expectedHead: null, entry: first, idempotencyKey: idOne });
124
+ const duplicate = await provider.compareAndAppend({
125
+ ledger, expectedHead: null, entry: first, idempotencyKey: idOne,
126
+ });
127
+ expectContract(duplicate.kind === 'duplicate' && equalJson(duplicate.entry, first), 'same key and producer digest must return the original entry');
128
+ const conflicting = { ...first, eventDigest: digest('f') };
129
+ const conflict = await provider.compareAndAppend({
130
+ ledger, expectedHead: null, entry: conflicting, idempotencyKey: idOne,
131
+ });
132
+ expectContract(conflict.kind === 'idempotency_conflict', 'changed content was not rejected');
133
+ });
134
+ await check(checks, 'keeps logical-ledger idempotency across epoch changes', async () => {
135
+ const provider = await createProvider();
136
+ await provider.compareAndAppend({ ledger, expectedHead: null, entry: first, idempotencyKey: idOne });
137
+ const nextEpoch = { ledgerId: ledger.ledgerId, ledgerEpochId: 'epoch-2' };
138
+ const replay = contractEntry(nextEpoch, 0, first.eventDigest, null);
139
+ const duplicate = await provider.compareAndAppend({
140
+ ledger: nextEpoch, expectedHead: null, entry: replay, idempotencyKey: idOne,
141
+ });
142
+ expectContract(duplicate.kind === 'duplicate', 'epoch transition reopened idempotency scope');
143
+ });
144
+ await check(checks, 'scopes heads and ranges by epoch within a logical ledger', async () => {
145
+ const provider = await createProvider();
146
+ await provider.compareAndAppend({ ledger, expectedHead: null, entry: first, idempotencyKey: idOne });
147
+ const nextEpoch = { ledgerId: ledger.ledgerId, ledgerEpochId: 'epoch-2' };
148
+ expectContract((await provider.getHead(nextEpoch)) === null, 'a fresh epoch inherited the previous epoch head');
149
+ const nextGenesis = contractEntry(nextEpoch, 0, digest('7'), null);
150
+ const appended = await provider.compareAndAppend({
151
+ ledger: nextEpoch, expectedHead: null, entry: nextGenesis, idempotencyKey: digest('8'),
152
+ });
153
+ expectContract(appended.kind === 'appended', 'fresh epoch genesis append failed');
154
+ const previousHead = await provider.getHead(ledger);
155
+ expectContract(previousHead?.entryDigest === first.entryDigest, 'appending to a new epoch changed the previous epoch head');
156
+ const nextHead = await provider.getHead(nextEpoch);
157
+ expectContract(nextHead?.entryDigest === nextGenesis.entryDigest, 'the new epoch head is not scoped to its epoch');
158
+ const nextRange = [];
159
+ for await (const entry of provider.readRange(nextEpoch))
160
+ nextRange.push(entry);
161
+ expectContract(nextRange.length === 1 && nextRange[0]?.entryDigest === nextGenesis.entryDigest, 'the new epoch range leaked entries from another epoch');
162
+ });
163
+ await check(checks, 'provides ordered stable range cursors', async () => {
164
+ const provider = await createProvider();
165
+ const firstResult = await provider.compareAndAppend({
166
+ ledger, expectedHead: null, entry: first, idempotencyKey: idOne,
167
+ });
168
+ expectContract(firstResult.kind === 'appended', 'first append failed');
169
+ const head = await provider.getHead(ledger);
170
+ const secondResult = await provider.compareAndAppend({
171
+ ledger, expectedHead: head, entry: second, idempotencyKey: idTwo,
172
+ });
173
+ expectContract(secondResult.kind === 'appended', 'second append failed');
174
+ const iterator = provider.readRange(ledger)[Symbol.asyncIterator]();
175
+ const firstRead = await iterator.next();
176
+ const nextHead = await provider.getHead(ledger);
177
+ await provider.compareAndAppend({
178
+ ledger, expectedHead: nextHead, entry: third, idempotencyKey: idThree,
179
+ });
180
+ const remaining = [];
181
+ for (;;) {
182
+ const item = await iterator.next();
183
+ if (item.done)
184
+ break;
185
+ remaining.push(item.value);
186
+ }
187
+ expectContract(firstRead.value?.core.sequence === '0', 'range did not start at sequence zero');
188
+ expectContract(remaining.length === 1 && remaining[0]?.core.sequence === '1', 'range cursor was not ordered and snapshot-stable');
189
+ });
190
+ return report('journal', checks);
191
+ }
192
+ function contractEvidenceRef(ciphertextDigest, size, objectId = 'evi_contract') {
193
+ return {
194
+ objectId,
195
+ ciphertextDigest,
196
+ mediaType: 'application/octet-stream',
197
+ size: String(size),
198
+ encryption: {
199
+ suite: 'A256GCM', keyId: 'contract-key-v1', nonce: 'AAAAAAAAAAAAAAAA',
200
+ aadDigest: digest('e'),
201
+ },
202
+ };
203
+ }
204
+ /** Executable contract for encrypted evidence/retention adapters. */
205
+ export async function evaluateAuditEvidenceProviderContract(input) {
206
+ const checks = [];
207
+ const ciphertext = Uint8Array.of(1, 2, 3, 4);
208
+ const ciphertextDigest = await input.hasher.sha256(ciphertext);
209
+ const evidence = {
210
+ ref: contractEvidenceRef(ciphertextDigest, ciphertext.byteLength),
211
+ ciphertext,
212
+ };
213
+ await check(checks, 'stores exact ciphertext idempotently and returns defensive bytes', async () => {
214
+ const provider = await input.createProvider();
215
+ await provider.putIfAbsent(evidence);
216
+ await provider.putIfAbsent(evidence);
217
+ const first = await provider.get(evidence.ref, { actor: 'contract', purpose: 'verification' });
218
+ expectContract(first !== null && first[0] === 1, 'stored ciphertext was unavailable');
219
+ first[0] = 255;
220
+ const second = await provider.get(evidence.ref, { actor: 'contract', purpose: 'verification' });
221
+ expectContract(second?.[0] === 1, 'provider leaked mutable ciphertext storage');
222
+ });
223
+ await check(checks, 'rejects opaque object identifier collisions', async () => {
224
+ const provider = await input.createProvider();
225
+ await provider.putIfAbsent(evidence);
226
+ const otherBytes = Uint8Array.of(5, 6, 7);
227
+ const collision = {
228
+ ref: contractEvidenceRef(await input.hasher.sha256(otherBytes), otherBytes.byteLength, evidence.ref.objectId),
229
+ ciphertext: otherBytes,
230
+ };
231
+ let rejected = false;
232
+ try {
233
+ await provider.putIfAbsent(collision);
234
+ }
235
+ catch {
236
+ rejected = true;
237
+ }
238
+ expectContract(rejected, 'object ID collision was accepted');
239
+ });
240
+ await check(checks, 'enforces legal hold before irreversible disposal', async () => {
241
+ const provider = await input.createProvider();
242
+ await provider.putIfAbsent(evidence);
243
+ await provider.applyRetention({
244
+ kind: 'legal_hold', ref: evidence.ref, holdId: 'hold-1', authorizedBy: 'contract',
245
+ });
246
+ let rejected = false;
247
+ try {
248
+ await provider.applyRetention({
249
+ kind: 'dispose', ref: evidence.ref, authorizedBy: 'contract', reason: 'expired',
250
+ });
251
+ }
252
+ catch {
253
+ rejected = true;
254
+ }
255
+ expectContract(rejected, 'held evidence was disposed');
256
+ await provider.applyRetention({
257
+ kind: 'release_hold', ref: evidence.ref, holdId: 'hold-1', authorizedBy: 'contract',
258
+ });
259
+ const disposed = await provider.applyRetention({
260
+ kind: 'dispose', ref: evidence.ref, authorizedBy: 'contract', reason: 'expired',
261
+ });
262
+ expectContract(disposed.state === 'disposed', 'released evidence was not disposed');
263
+ expectContract(!(await provider.has(evidence.ref)), 'disposed ciphertext remains available');
264
+ });
265
+ return report('evidence', checks);
266
+ }
267
+ /** Executable monotonicity/split-view contract for independent observers. */
268
+ export async function evaluateAuditObserverProviderContract(input) {
269
+ const checks = [];
270
+ await check(checks, 'retains monotonic linked observations and exact duplicates', async () => {
271
+ const provider = await input.createProvider();
272
+ expectContract(provider.capability === 'independent-observer', 'observer capability is false');
273
+ const first = await provider.publish(input.fixtures.first);
274
+ const duplicate = await provider.publish(input.fixtures.first);
275
+ expectContract(equalJson(first, duplicate), 'duplicate checkpoint changed observation receipt');
276
+ const next = await provider.publish(input.fixtures.next);
277
+ expectContract(next.core.previousObservationDigest === first.observationDigest, 'observation receipt chain was not linked');
278
+ const latest = await provider.latest(input.fixtures.next.core);
279
+ expectContract(latest?.checkpoint.checkpointDigest === input.fixtures.next.checkpointDigest, 'latest observed checkpoint is incorrect');
280
+ });
281
+ await check(checks, 'rejects rollback and same-size conflicting views', async () => {
282
+ const provider = await input.createProvider();
283
+ await provider.publish(input.fixtures.first);
284
+ for (const candidate of [input.fixtures.conflict, input.fixtures.rollback]) {
285
+ let rejected = false;
286
+ try {
287
+ await provider.publish(candidate);
288
+ }
289
+ catch {
290
+ rejected = true;
291
+ }
292
+ expectContract(rejected, 'observer accepted rollback or split view');
293
+ }
294
+ });
295
+ if (input.fixtures.gapped !== undefined) {
296
+ const gapped = input.fixtures.gapped;
297
+ await check(checks, 'accepts a gapped but consistent extension as catch-up', async () => {
298
+ const provider = await input.createProvider();
299
+ const first = await provider.publish(input.fixtures.first);
300
+ const observation = await provider.publish(gapped);
301
+ expectContract(observation.core.previousObservationDigest === first.observationDigest, 'gapped observation did not link the prior observation receipt');
302
+ const latest = await provider.latest(gapped.core);
303
+ expectContract(latest?.checkpoint.checkpointDigest === gapped.checkpointDigest, 'gapped catch-up did not become the latest observation');
304
+ });
305
+ }
306
+ return report('observer', checks);
307
+ }
308
+ /** Executable role-separation and binding contract for supporting anchors. */
309
+ export async function evaluateAuditAnchorProviderContract(input) {
310
+ const checks = [];
311
+ await check(checks, 'publishes and verifies only a checkpoint-bound supporting receipt', async () => {
312
+ const provider = await input.createProvider();
313
+ expectContract(provider.capability === 'supporting-anchor', 'anchor claimed observer capability');
314
+ const receipt = await provider.publish(input.checkpoint);
315
+ expectContract(receipt.kind === provider.kind, 'anchor kind mismatch');
316
+ expectContract(receipt.checkpointDigest === input.checkpoint.checkpointDigest, 'receipt is unbound');
317
+ expectContract(await provider.verify(input.checkpoint, receipt), 'valid receipt did not verify');
318
+ expectContract(!(await provider.verify(input.otherCheckpoint, receipt)), 'receipt verified for a different checkpoint');
319
+ });
320
+ return report('anchor', checks);
321
+ }
322
+ /** Executable FIFO, retry-accounting, and acknowledgement contract for outboxes. */
323
+ export async function evaluateAuditOutboxProviderContract(createProvider) {
324
+ const checks = [];
325
+ const ledger = { ledgerId: 'contract-ledger', ledgerEpochId: 'epoch-1' };
326
+ const firstEntry = contractEntry(ledger, 1, digest('1'), digest('0'));
327
+ const secondEntry = contractEntry(ledger, 2, digest('2'), firstEntry.entryDigest);
328
+ const item = (entry) => ({
329
+ eventId: entry.core.event.eventId,
330
+ submission: {
331
+ ledgerId: ledger.ledgerId,
332
+ expectedLedgerEpochId: ledger.ledgerEpochId,
333
+ producerEvent: entry.core.event,
334
+ encryptedEvidence: [],
335
+ },
336
+ enqueuedAt: entry.core.recordedAt,
337
+ attempts: 0,
338
+ });
339
+ const collect = async (provider) => {
340
+ const values = [];
341
+ for await (const value of provider.pending())
342
+ values.push(value);
343
+ return values;
344
+ };
345
+ await check(checks, 'declares and preserves FIFO order per source', async () => {
346
+ const provider = await createProvider();
347
+ expectContract(provider.capabilities.fifoPerSource === true, 'fifoPerSource must be true');
348
+ await provider.enqueue(item(firstEntry));
349
+ await provider.enqueue(item(secondEntry));
350
+ expectContract(equalJson((await collect(provider)).map((value) => value.eventId), [
351
+ firstEntry.core.event.eventId,
352
+ secondEntry.core.event.eventId,
353
+ ]), 'pending items were not yielded in enqueue order');
354
+ });
355
+ await check(checks, 'enqueues idempotently and rejects divergent content per event identity', async () => {
356
+ const provider = await createProvider();
357
+ await provider.enqueue(item(firstEntry));
358
+ await provider.enqueue(structuredClone(item(firstEntry)));
359
+ const pending = await collect(provider);
360
+ expectContract(pending.length === 1, 'redelivered enqueue duplicated the pending item');
361
+ const divergent = item(firstEntry);
362
+ divergent.submission = {
363
+ ...divergent.submission,
364
+ producerEvent: {
365
+ ...divergent.submission.producerEvent,
366
+ action: { category: 'tampered' },
367
+ },
368
+ };
369
+ let rejected = false;
370
+ try {
371
+ await provider.enqueue(divergent);
372
+ }
373
+ catch {
374
+ rejected = true;
375
+ }
376
+ expectContract(rejected, 'divergent content under one event identity was accepted');
377
+ });
378
+ await check(checks, 'accounts for failures and removes only acknowledged items', async () => {
379
+ const provider = await createProvider();
380
+ await provider.enqueue(item(firstEntry));
381
+ await provider.enqueue(item(secondEntry));
382
+ await provider.markFailed(firstEntry.core.event.eventId, new Error('offline'));
383
+ let pending = await collect(provider);
384
+ expectContract(pending[0]?.attempts === 1, 'failed delivery attempt was not persisted');
385
+ await provider.markDelivered(firstEntry.core.event.eventId);
386
+ pending = await collect(provider);
387
+ expectContract(pending.length === 1 && pending[0]?.eventId === secondEntry.core.event.eventId, 'acknowledgement removed the wrong pending item');
388
+ });
389
+ return report('outbox', checks);
390
+ }
391
+ //# sourceMappingURL=provider-contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-contracts.js","sourceRoot":"","sources":["../../../src/audit/testing/provider-contracts.ts"],"names":[],"mappings":"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"}