@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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../../src/audit/providers/evidence.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import type { AuditHead, AuditLedgerRef, Digest, SignedAuditEntryV1 } from '../types.js';
2
+ export type AuditAppendResult = {
3
+ kind: 'appended';
4
+ entry: SignedAuditEntryV1;
5
+ } | {
6
+ kind: 'duplicate';
7
+ entry: SignedAuditEntryV1;
8
+ } | {
9
+ kind: 'head_conflict';
10
+ actualHead: AuditHead | null;
11
+ } | {
12
+ kind: 'idempotency_conflict';
13
+ existing: SignedAuditEntryV1;
14
+ };
15
+ export interface AuditRangeQuery extends AuditLedgerRef {
16
+ afterSequence?: string;
17
+ limit?: number;
18
+ }
19
+ export interface AuditJournalProvider {
20
+ readonly capabilities: {
21
+ durability: 'ephemeral' | 'durable';
22
+ atomicAppend: true;
23
+ orderedRead: true;
24
+ };
25
+ getHead(ledger: AuditLedgerRef): Promise<AuditHead | null>;
26
+ getByIdempotencyKey(ledgerId: string, idempotencyKey: Digest): Promise<SignedAuditEntryV1 | null>;
27
+ compareAndAppend(input: {
28
+ ledger: AuditLedgerRef;
29
+ expectedHead: AuditHead | null;
30
+ entry: SignedAuditEntryV1;
31
+ idempotencyKey: Digest;
32
+ }): Promise<AuditAppendResult>;
33
+ readRange(query: AuditRangeQuery): AsyncIterable<SignedAuditEntryV1>;
34
+ }
35
+ //# sourceMappingURL=journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../../src/audit/providers/journal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEzF,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEnE,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,YAAY,EAAE;QACrB,UAAU,EAAE,WAAW,GAAG,SAAS,CAAC;QACpC,YAAY,EAAE,IAAI,CAAC;QACnB,WAAW,EAAE,IAAI,CAAC;KACnB,CAAC;IAEF,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC3D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAClG,gBAAgB,CAAC,KAAK,EAAE;QACtB,MAAM,EAAE,cAAc,CAAC;QACvB,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;QAC/B,KAAK,EAAE,kBAAkB,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/B,SAAS,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;CACtE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.js","sourceRoot":"","sources":["../../../src/audit/providers/journal.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import type { AuditAppendResult, AuditJournalProvider, AuditRangeQuery } from './journal.js';
2
+ import type { AuditHead, AuditLedgerRef, Digest, SignedAuditEntryV1 } from '../types.js';
3
+ /** Ephemeral reference journal with the same atomic contract as durable adapters. */
4
+ export declare class MemoryAuditJournal implements AuditJournalProvider {
5
+ readonly capabilities: {
6
+ durability: "ephemeral";
7
+ atomicAppend: true;
8
+ orderedRead: true;
9
+ };
10
+ private readonly entriesByLedger;
11
+ private readonly entriesByIdempotency;
12
+ private readonly heads;
13
+ getHead(ledger: AuditLedgerRef): Promise<AuditHead | null>;
14
+ getByIdempotencyKey(ledgerId: string, key: Digest): Promise<SignedAuditEntryV1 | null>;
15
+ compareAndAppend(input: {
16
+ ledger: AuditLedgerRef;
17
+ expectedHead: AuditHead | null;
18
+ entry: SignedAuditEntryV1;
19
+ idempotencyKey: Digest;
20
+ }): Promise<AuditAppendResult>;
21
+ readRange(query: AuditRangeQuery): AsyncIterable<SignedAuditEntryV1>;
22
+ snapshot(ledger: AuditLedgerRef): Promise<SignedAuditEntryV1[]>;
23
+ }
24
+ //# sourceMappingURL=memory-journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-journal.d.ts","sourceRoot":"","sources":["../../../src/audit/providers/memory-journal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAkBzF,qFAAqF;AACrF,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,QAAQ,CAAC,YAAY;;;;MAInB;IAEF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2C;IAC3E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAyC;IAC9E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IAEhD,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAI1D,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAI/B,gBAAgB,CAAC,KAAK,EAAE;QAC5B,MAAM,EAAE,cAAc,CAAC;QACvB,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;QAC/B,KAAK,EAAE,kBAAkB,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4BvB,SAAS,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CAAC,kBAAkB,CAAC;IAYrE,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAGtE"}
@@ -0,0 +1,73 @@
1
+ function ledgerKey(ledger) {
2
+ return `${ledger.ledgerId}\0${ledger.ledgerEpochId}`;
3
+ }
4
+ function idempotencyKey(ledgerId, key) {
5
+ return `${ledgerId}\0${key}`;
6
+ }
7
+ function headsEqual(left, right) {
8
+ if (left === null || right === null)
9
+ return left === right;
10
+ return left.ledgerId === right.ledgerId &&
11
+ left.ledgerEpochId === right.ledgerEpochId &&
12
+ left.sequence === right.sequence &&
13
+ left.entryDigest === right.entryDigest;
14
+ }
15
+ /** Ephemeral reference journal with the same atomic contract as durable adapters. */
16
+ export class MemoryAuditJournal {
17
+ capabilities = {
18
+ durability: 'ephemeral',
19
+ atomicAppend: true,
20
+ orderedRead: true,
21
+ };
22
+ entriesByLedger = new Map();
23
+ entriesByIdempotency = new Map();
24
+ heads = new Map();
25
+ async getHead(ledger) {
26
+ return this.heads.get(ledgerKey(ledger)) ?? null;
27
+ }
28
+ async getByIdempotencyKey(ledgerId, key) {
29
+ return this.entriesByIdempotency.get(idempotencyKey(ledgerId, key)) ?? null;
30
+ }
31
+ async compareAndAppend(input) {
32
+ const idKey = idempotencyKey(input.ledger.ledgerId, input.idempotencyKey);
33
+ const existing = this.entriesByIdempotency.get(idKey);
34
+ if (existing !== undefined) {
35
+ return existing.eventDigest === input.entry.eventDigest
36
+ ? { kind: 'duplicate', entry: existing }
37
+ : { kind: 'idempotency_conflict', existing };
38
+ }
39
+ const key = ledgerKey(input.ledger);
40
+ const actualHead = this.heads.get(key) ?? null;
41
+ if (!headsEqual(input.expectedHead, actualHead)) {
42
+ return { kind: 'head_conflict', actualHead };
43
+ }
44
+ const entries = this.entriesByLedger.get(key) ?? [];
45
+ entries.push(input.entry);
46
+ this.entriesByLedger.set(key, entries);
47
+ this.entriesByIdempotency.set(idKey, input.entry);
48
+ this.heads.set(key, {
49
+ ledgerId: input.ledger.ledgerId,
50
+ ledgerEpochId: input.ledger.ledgerEpochId,
51
+ sequence: input.entry.core.sequence,
52
+ entryDigest: input.entry.entryDigest,
53
+ });
54
+ return { kind: 'appended', entry: input.entry };
55
+ }
56
+ async *readRange(query) {
57
+ const snapshot = await this.snapshot(query);
58
+ const after = query.afterSequence === undefined ? null : BigInt(query.afterSequence);
59
+ let yielded = 0;
60
+ for (const entry of snapshot) {
61
+ if (after !== null && BigInt(entry.core.sequence) <= after)
62
+ continue;
63
+ if (query.limit !== undefined && yielded >= query.limit)
64
+ return;
65
+ yielded += 1;
66
+ yield entry;
67
+ }
68
+ }
69
+ async snapshot(ledger) {
70
+ return [...(this.entriesByLedger.get(ledgerKey(ledger)) ?? [])];
71
+ }
72
+ }
73
+ //# sourceMappingURL=memory-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-journal.js","sourceRoot":"","sources":["../../../src/audit/providers/memory-journal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type AuditHasher, type AuditSigner } from '../crypto.js';
2
+ import type { AuditLedgerRef, AuditObservationReceiptV1, ObservedAuditCheckpoint, SignedAuditCheckpointV1 } from '../types.js';
3
+ export interface AuditCheckpointObserverProvider {
4
+ readonly capability: 'independent-observer';
5
+ publish(checkpoint: SignedAuditCheckpointV1): Promise<AuditObservationReceiptV1>;
6
+ latest(ledger: AuditLedgerRef): Promise<ObservedAuditCheckpoint | null>;
7
+ verifyObservation(checkpoint: SignedAuditCheckpointV1, receipt: AuditObservationReceiptV1): Promise<boolean>;
8
+ }
9
+ export interface MemoryAuditCheckpointObserverConfig {
10
+ observerId: string;
11
+ signer: AuditSigner;
12
+ hasher: AuditHasher;
13
+ clock: {
14
+ now(): number;
15
+ };
16
+ verifyCheckpoint(checkpoint: SignedAuditCheckpointV1): Promise<boolean>;
17
+ verifyConsistency(previous: SignedAuditCheckpointV1, next: SignedAuditCheckpointV1): Promise<boolean>;
18
+ }
19
+ export declare class MemoryAuditCheckpointObserver implements AuditCheckpointObserverProvider {
20
+ private readonly config;
21
+ readonly capability: "independent-observer";
22
+ private readonly observations;
23
+ private readonly publicationTails;
24
+ constructor(config: MemoryAuditCheckpointObserverConfig);
25
+ publish(checkpoint: SignedAuditCheckpointV1): Promise<AuditObservationReceiptV1>;
26
+ private publishSerialized;
27
+ latest(ledger: AuditLedgerRef): Promise<ObservedAuditCheckpoint | null>;
28
+ verifyObservation(checkpoint: SignedAuditCheckpointV1, receipt: AuditObservationReceiptV1): Promise<boolean>;
29
+ }
30
+ //# sourceMappingURL=observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/audit/providers/observer.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAGlF,OAAO,KAAK,EACV,cAAc,EAEd,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,OAAO,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACjF,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;IACxE,iBAAiB,CACf,UAAU,EAAE,uBAAuB,EACnC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,mCAAmC;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE;QAAE,GAAG,IAAI,MAAM,CAAA;KAAE,CAAC;IACzB,gBAAgB,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,iBAAiB,CACf,QAAQ,EAAE,uBAAuB,EACjC,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAMD,qBAAa,6BAA8B,YAAW,+BAA+B;IAKvE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,QAAQ,CAAC,UAAU,EAAG,sBAAsB,CAAU;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8C;IAC3E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoC;gBAExC,MAAM,EAAE,mCAAmC;IAElE,OAAO,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAAC,yBAAyB,CAAC;YAqBxE,iBAAiB;IAuEzB,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAIvE,iBAAiB,CACrB,UAAU,EAAE,uBAAuB,EACnC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,OAAO,CAAC;CAQpB"}
@@ -0,0 +1,100 @@
1
+ import { canonicalizeJsonBytes } from '../../utils/canonical-json.js';
2
+ import { hashAuditValue } from '../crypto.js';
3
+ import { AUDIT_DIGEST_DOMAINS } from '../integrity.js';
4
+ import { AUDIT_ERROR_CODES, AuditProtocolError } from '../errors.js';
5
+ function key(ledger) {
6
+ return `${ledger.ledgerId}\0${ledger.ledgerEpochId}`;
7
+ }
8
+ export class MemoryAuditCheckpointObserver {
9
+ config;
10
+ capability = 'independent-observer';
11
+ observations = new Map();
12
+ publicationTails = new Map();
13
+ constructor(config) {
14
+ this.config = config;
15
+ }
16
+ async publish(checkpoint) {
17
+ const publicationKey = key({
18
+ ledgerId: checkpoint.core.ledgerId,
19
+ ledgerEpochId: checkpoint.core.ledgerEpochId,
20
+ });
21
+ const previous = this.publicationTails.get(publicationKey) ?? Promise.resolve();
22
+ let release;
23
+ const gate = new Promise((resolve) => { release = resolve; });
24
+ const tail = previous.then(() => gate);
25
+ this.publicationTails.set(publicationKey, tail);
26
+ await previous;
27
+ try {
28
+ return await this.publishSerialized(checkpoint);
29
+ }
30
+ finally {
31
+ release();
32
+ if (this.publicationTails.get(publicationKey) === tail) {
33
+ this.publicationTails.delete(publicationKey);
34
+ }
35
+ }
36
+ }
37
+ async publishSerialized(checkpoint) {
38
+ if (!(await this.config.verifyCheckpoint(checkpoint))) {
39
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_INVALID, 'Observer rejected an invalid checkpoint');
40
+ }
41
+ const ledger = {
42
+ ledgerId: checkpoint.core.ledgerId,
43
+ ledgerEpochId: checkpoint.core.ledgerEpochId,
44
+ };
45
+ const existing = this.observations.get(key(ledger));
46
+ if (existing !== undefined) {
47
+ const previousSize = BigInt(existing.checkpoint.core.treeSize);
48
+ const nextSize = BigInt(checkpoint.core.treeSize);
49
+ if (nextSize < previousSize) {
50
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_ROLLBACK, 'Observed checkpoint tree size moved backwards');
51
+ }
52
+ if (nextSize === previousSize) {
53
+ if (checkpoint.core.rootDigest !== existing.checkpoint.core.rootDigest ||
54
+ checkpoint.checkpointDigest !== existing.checkpoint.checkpointDigest) {
55
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_CONFLICT, 'Conflicting checkpoint roots were observed at the same tree size');
56
+ }
57
+ return existing.receipt;
58
+ }
59
+ // Direct-successor linkage is deliberately not required: an observer that
60
+ // missed intermediate publications catches up on any gapped extension,
61
+ // as long as tree consistency with its last observation verifies
62
+ // cryptographically. The consistency proof, not the checkpoint chain
63
+ // link, is the split-view guarantee.
64
+ if (!(await this.config.verifyConsistency(existing.checkpoint, checkpoint))) {
65
+ throw new AuditProtocolError(AUDIT_ERROR_CODES.CHECKPOINT_CONFLICT, 'Checkpoint does not consistently extend the previously observed tree');
66
+ }
67
+ }
68
+ const core = {
69
+ schema: 'https://schema.kya-os.org/v1/protocol/audit/observation/v1.0.0',
70
+ observerId: this.config.observerId,
71
+ observer: this.config.signer.ref,
72
+ ledgerId: checkpoint.core.ledgerId,
73
+ ledgerEpochId: checkpoint.core.ledgerEpochId,
74
+ checkpointDigest: checkpoint.checkpointDigest,
75
+ treeSize: checkpoint.core.treeSize,
76
+ observedAt: this.config.clock.now(),
77
+ previousObservationDigest: existing?.receipt.observationDigest ?? null,
78
+ };
79
+ const observationDigest = await hashAuditValue(this.config.hasher, AUDIT_DIGEST_DOMAINS.observation, core);
80
+ const receipt = Object.freeze({
81
+ core: Object.freeze(core),
82
+ observationDigest,
83
+ jws: await this.config.signer.sign(canonicalizeJsonBytes(core)),
84
+ });
85
+ this.observations.set(key(ledger), { checkpoint, receipt });
86
+ return receipt;
87
+ }
88
+ async latest(ledger) {
89
+ return this.observations.get(key(ledger)) ?? null;
90
+ }
91
+ async verifyObservation(checkpoint, receipt) {
92
+ const observed = await this.latest({
93
+ ledgerId: checkpoint.core.ledgerId,
94
+ ledgerEpochId: checkpoint.core.ledgerEpochId,
95
+ });
96
+ return observed?.checkpoint.checkpointDigest === checkpoint.checkpointDigest &&
97
+ observed.receipt.observationDigest === receipt.observationDigest;
98
+ }
99
+ }
100
+ //# sourceMappingURL=observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.js","sourceRoot":"","sources":["../../../src/audit/providers/observer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { AuditRecorderSubmission } from './recorder-client.js';
2
+ export interface AuditOutboxItem {
3
+ eventId: string;
4
+ submission: AuditRecorderSubmission;
5
+ enqueuedAt: number;
6
+ /** Persisted delivery failures; durable adapters use this for retry and DLQ policy. */
7
+ attempts: number;
8
+ }
9
+ export interface AuditOutboxProvider {
10
+ readonly capabilities: {
11
+ durability: 'ephemeral' | 'durable';
12
+ /** `pending()` yields enqueue order within each producer source. */
13
+ fifoPerSource: true;
14
+ };
15
+ enqueue(item: AuditOutboxItem): Promise<void>;
16
+ /**
17
+ * Eligible items MUST be yielded FIFO for each `producerEvent.source.sourceId`.
18
+ * The provider owns retry scheduling/caps and excludes dead-lettered items.
19
+ */
20
+ pending(limit?: number): AsyncIterable<AuditOutboxItem>;
21
+ markDelivered(eventId: string): Promise<void>;
22
+ /** Persist the failure and apply the provider's configured retry/DLQ policy. */
23
+ markFailed(eventId: string, error: unknown): Promise<void>;
24
+ }
25
+ /** Development-only outbox. Buffered assurance requires a durable adapter. */
26
+ export declare class MemoryAuditOutbox implements AuditOutboxProvider {
27
+ readonly capabilities: {
28
+ durability: "ephemeral";
29
+ fifoPerSource: true;
30
+ };
31
+ private readonly items;
32
+ enqueue(item: AuditOutboxItem): Promise<void>;
33
+ pending(limit?: number): AsyncIterable<AuditOutboxItem>;
34
+ markDelivered(eventId: string): Promise<void>;
35
+ markFailed(eventId: string): Promise<void>;
36
+ }
37
+ //# sourceMappingURL=outbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../../../src/audit/providers/outbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,uBAAuB,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE;QACrB,UAAU,EAAE,WAAW,GAAG,SAAS,CAAC;QACpC,oEAAoE;QACpE,aAAa,EAAE,IAAI,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;OAGG;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;IACxD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,gFAAgF;IAChF,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAED,8EAA8E;AAC9E,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,QAAQ,CAAC,YAAY;;;MAAsE;IAC3F,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAEtD,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5C,OAAO,CAAC,KAAK,SAA0B,GAAG,aAAa,CAAC,eAAe,CAAC;IASzE,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIjD"}
@@ -0,0 +1,52 @@
1
+ import { canonicalizeJson } from '../../utils/canonical-json.js';
2
+ /** Development-only outbox. Buffered assurance requires a durable adapter. */
3
+ export class MemoryAuditOutbox {
4
+ capabilities = { durability: 'ephemeral', fifoPerSource: true };
5
+ items = new Map();
6
+ async enqueue(item) {
7
+ const existing = this.items.get(item.eventId);
8
+ if (existing !== undefined) {
9
+ if (!sameSubmission(existing.submission, item.submission)) {
10
+ throw new Error(`Audit outbox event identity collision: ${item.eventId}`);
11
+ }
12
+ return;
13
+ }
14
+ this.items.set(item.eventId, item);
15
+ }
16
+ async *pending(limit = Number.MAX_SAFE_INTEGER) {
17
+ let count = 0;
18
+ for (const item of [...this.items.values()]) {
19
+ if (count >= limit)
20
+ return;
21
+ count += 1;
22
+ yield item;
23
+ }
24
+ }
25
+ async markDelivered(eventId) {
26
+ this.items.delete(eventId);
27
+ }
28
+ async markFailed(eventId) {
29
+ const item = this.items.get(eventId);
30
+ if (item !== undefined)
31
+ this.items.set(eventId, { ...item, attempts: item.attempts + 1 });
32
+ }
33
+ }
34
+ function sameSubmission(left, right) {
35
+ if (left.ledgerId !== right.ledgerId ||
36
+ left.expectedLedgerEpochId !== right.expectedLedgerEpochId ||
37
+ canonicalizeJson(left.producerEvent) !== canonicalizeJson(right.producerEvent) ||
38
+ left.encryptedEvidence.length !== right.encryptedEvidence.length)
39
+ return false;
40
+ return left.encryptedEvidence.every((item, index) => {
41
+ const other = right.encryptedEvidence[index];
42
+ if (other === undefined || canonicalizeJson(item.ref) !== canonicalizeJson(other.ref) ||
43
+ item.ciphertext.byteLength !== other.ciphertext.byteLength)
44
+ return false;
45
+ let difference = 0;
46
+ for (let offset = 0; offset < item.ciphertext.byteLength; offset += 1) {
47
+ difference |= item.ciphertext[offset] ^ other.ciphertext[offset];
48
+ }
49
+ return difference === 0;
50
+ });
51
+ }
52
+ //# sourceMappingURL=outbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../../src/audit/providers/outbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { EncryptedEvidenceInput } from './evidence.js';
2
+ import type { AuditProducerEventCoreV1, SignedAuditEntryV1 } from '../types.js';
3
+ import { AuditRecorderService, type AuditRecorderServiceConfig, type AuthenticatedAuditSubmissionContext } from '../recorder-service.js';
4
+ export interface AuditRecorderSubmission {
5
+ ledgerId: string;
6
+ expectedLedgerEpochId?: string;
7
+ producerEvent: AuditProducerEventCoreV1;
8
+ encryptedEvidence: readonly EncryptedEvidenceInput[];
9
+ }
10
+ /** Producer-facing port. Authority fields are deliberately absent. */
11
+ export interface AuditRecorderClient {
12
+ submit(input: AuditRecorderSubmission): Promise<SignedAuditEntryV1>;
13
+ }
14
+ export declare class LocalAuditRecorderClient implements AuditRecorderClient {
15
+ private readonly recorder;
16
+ private readonly context;
17
+ constructor(recorder: AuditRecorderService, context: () => AuthenticatedAuditSubmissionContext | Promise<AuthenticatedAuditSubmissionContext>);
18
+ submit(input: AuditRecorderSubmission): Promise<SignedAuditEntryV1>;
19
+ }
20
+ /** One-call composition helper for an in-process authoritative recorder. */
21
+ export declare function createLocalAuditRecorder(configuration: AuditRecorderServiceConfig, context: () => AuthenticatedAuditSubmissionContext | Promise<AuthenticatedAuditSubmissionContext>): AuditRecorderClient;
22
+ //# sourceMappingURL=recorder-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder-client.d.ts","sourceRoot":"","sources":["../../../src/audit/providers/recorder-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,oBAAoB,EACpB,KAAK,0BAA0B,EAC/B,KAAK,mCAAmC,EACzC,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,wBAAwB,CAAC;IACxC,iBAAiB,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACtD;AAED,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACrE;AAED,qBAAa,wBAAyB,YAAW,mBAAmB;IAEhE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,MACtB,mCAAmC,GACnC,OAAO,CAAC,mCAAmC,CAAC;IAG5C,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAG1E;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,0BAA0B,EACzC,OAAO,EAAE,MACL,mCAAmC,GACnC,OAAO,CAAC,mCAAmC,CAAC,GAC/C,mBAAmB,CAErB"}
@@ -0,0 +1,17 @@
1
+ import { AuditRecorderService, } from '../recorder-service.js';
2
+ export class LocalAuditRecorderClient {
3
+ recorder;
4
+ context;
5
+ constructor(recorder, context) {
6
+ this.recorder = recorder;
7
+ this.context = context;
8
+ }
9
+ async submit(input) {
10
+ return this.recorder.submitAuthenticated(input, await this.context());
11
+ }
12
+ }
13
+ /** One-call composition helper for an in-process authoritative recorder. */
14
+ export function createLocalAuditRecorder(configuration, context) {
15
+ return new LocalAuditRecorderClient(new AuditRecorderService(configuration), context);
16
+ }
17
+ //# sourceMappingURL=recorder-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder-client.js","sourceRoot":"","sources":["../../../src/audit/providers/recorder-client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,GAGrB,MAAM,wBAAwB,CAAC;AAchC,MAAM,OAAO,wBAAwB;IAEhB;IACA;IAFnB,YACmB,QAA8B,EAC9B,OAE+B;QAH/B,aAAQ,GAAR,QAAQ,CAAsB;QAC9B,YAAO,GAAP,OAAO,CAEwB;IAC/C,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,KAA8B;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,UAAU,wBAAwB,CACtC,aAAyC,EACzC,OAEgD;IAEhD,OAAO,IAAI,wBAAwB,CAAC,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { Digest } from '../types.js';
2
+ export interface AuditSourceState {
3
+ sourceId: string;
4
+ highestEmitted: string;
5
+ highestReceipted: string;
6
+ pendingSequences: string[];
7
+ }
8
+ export interface AuditSourceStateProvider {
9
+ readonly capabilities: {
10
+ durability: 'ephemeral' | 'durable';
11
+ atomicClaim: true;
12
+ };
13
+ claimEvent(sourceId: string, eventId: string): Promise<{
14
+ sequence: string;
15
+ previousSourceEventDigest?: Digest;
16
+ }>;
17
+ markEmitted(sourceId: string, eventId: string, sequence: string, eventDigest: Digest): Promise<void>;
18
+ markReceipted(sourceId: string, sequence: string, entryDigest: Digest): Promise<void>;
19
+ getState(sourceId: string): Promise<AuditSourceState>;
20
+ }
21
+ /** In-process reference source-watermark state. Production AAP-3 needs durability. */
22
+ export declare class MemoryAuditSourceState implements AuditSourceStateProvider {
23
+ readonly capabilities: {
24
+ durability: "ephemeral";
25
+ atomicClaim: true;
26
+ };
27
+ private readonly states;
28
+ claimEvent(sourceId: string, eventId: string): Promise<{
29
+ sequence: string;
30
+ previousSourceEventDigest?: Digest;
31
+ }>;
32
+ markEmitted(sourceId: string, eventId: string, sequence: string, eventDigest: Digest): Promise<void>;
33
+ markReceipted(sourceId: string, sequence: string): Promise<void>;
34
+ getState(sourceId: string): Promise<AuditSourceState>;
35
+ private state;
36
+ }
37
+ //# sourceMappingURL=source-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-state.d.ts","sourceRoot":"","sources":["../../../src/audit/providers/source-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,YAAY,EAAE;QAAE,UAAU,EAAE,WAAW,GAAG,SAAS,CAAC;QAAC,WAAW,EAAE,IAAI,CAAA;KAAE,CAAC;IAClF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QACrD,QAAQ,EAAE,MAAM,CAAC;QACjB,yBAAyB,CAAC,EAAE,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACvD;AAUD,sFAAsF;AACtF,qBAAa,sBAAuB,YAAW,wBAAwB;IACrE,QAAQ,CAAC,YAAY;;;MAAoE;IACzF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAE1D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3D,QAAQ,EAAE,MAAM,CAAC;QACjB,yBAAyB,CAAC,EAAE,MAAM,CAAC;KACpC,CAAC;IA0BI,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAYV,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBhE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAc3D,OAAO,CAAC,KAAK;CAad"}
@@ -0,0 +1,94 @@
1
+ /** In-process reference source-watermark state. Production AAP-3 needs durability. */
2
+ export class MemoryAuditSourceState {
3
+ capabilities = { durability: 'ephemeral', atomicClaim: true };
4
+ states = new Map();
5
+ async claimEvent(sourceId, eventId) {
6
+ const state = this.state(sourceId);
7
+ const existing = state.claims.get(eventId);
8
+ if (existing !== undefined) {
9
+ return {
10
+ sequence: existing.sequence.toString(),
11
+ ...(existing.previousSourceEventDigest === undefined
12
+ ? {}
13
+ : { previousSourceEventDigest: existing.previousSourceEventDigest }),
14
+ };
15
+ }
16
+ state.next += 1n;
17
+ const previousSourceEventDigest = state.eventDigests.get(state.next - 1n);
18
+ const claim = {
19
+ sequence: state.next,
20
+ ...(previousSourceEventDigest === undefined ? {} : { previousSourceEventDigest }),
21
+ };
22
+ state.claims.set(eventId, claim);
23
+ return {
24
+ sequence: claim.sequence.toString(),
25
+ ...(claim.previousSourceEventDigest === undefined
26
+ ? {}
27
+ : { previousSourceEventDigest: claim.previousSourceEventDigest }),
28
+ };
29
+ }
30
+ async markEmitted(sourceId, eventId, sequence, eventDigest) {
31
+ const state = this.state(sourceId);
32
+ const parsed = BigInt(sequence);
33
+ const claim = state.claims.get(eventId);
34
+ if (claim?.sequence !== parsed)
35
+ throw new RangeError('Unknown source event claim');
36
+ const existing = state.eventDigests.get(parsed);
37
+ if (existing !== undefined && existing !== eventDigest) {
38
+ throw new Error(`Source event identity collision: ${eventId}`);
39
+ }
40
+ state.eventDigests.set(parsed, eventDigest);
41
+ }
42
+ async markReceipted(sourceId, sequence) {
43
+ const parsed = BigInt(sequence);
44
+ const state = this.state(sourceId);
45
+ if (parsed < 1n || parsed > state.next)
46
+ throw new RangeError('Unknown source sequence');
47
+ if (parsed <= state.receiptedWatermark)
48
+ return;
49
+ state.receipted.add(parsed);
50
+ while (state.receipted.delete(state.receiptedWatermark + 1n)) {
51
+ state.receiptedWatermark += 1n;
52
+ }
53
+ // Keep only the current watermark's claim/digest plus unresolved entries.
54
+ // This bounds the reference adapter by the outstanding delivery window,
55
+ // while retaining the digest needed to link the next producer event.
56
+ for (const [eventId, claim] of state.claims) {
57
+ if (claim.sequence < state.receiptedWatermark)
58
+ state.claims.delete(eventId);
59
+ }
60
+ for (const sequenceNumber of state.eventDigests.keys()) {
61
+ if (sequenceNumber < state.receiptedWatermark)
62
+ state.eventDigests.delete(sequenceNumber);
63
+ }
64
+ }
65
+ async getState(sourceId) {
66
+ const state = this.state(sourceId);
67
+ const pendingSequences = [];
68
+ for (let sequence = state.receiptedWatermark + 1n; sequence <= state.next; sequence += 1n) {
69
+ if (!state.receipted.has(sequence))
70
+ pendingSequences.push(sequence.toString());
71
+ }
72
+ return {
73
+ sourceId,
74
+ highestEmitted: state.next.toString(),
75
+ highestReceipted: state.receiptedWatermark.toString(),
76
+ pendingSequences,
77
+ };
78
+ }
79
+ state(sourceId) {
80
+ const existing = this.states.get(sourceId);
81
+ if (existing !== undefined)
82
+ return existing;
83
+ const created = {
84
+ next: 0n,
85
+ receiptedWatermark: 0n,
86
+ receipted: new Set(),
87
+ claims: new Map(),
88
+ eventDigests: new Map(),
89
+ };
90
+ this.states.set(sourceId, created);
91
+ return created;
92
+ }
93
+ }
94
+ //# sourceMappingURL=source-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-state.js","sourceRoot":"","sources":["../../../src/audit/providers/source-state.ts"],"names":[],"mappings":"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"}