@vorionsys/proof-plane 0.1.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 (41) hide show
  1. package/dist/events/event-emitter.d.ts +140 -0
  2. package/dist/events/event-emitter.d.ts.map +1 -0
  3. package/dist/events/event-emitter.js +235 -0
  4. package/dist/events/event-emitter.js.map +1 -0
  5. package/dist/events/event-signatures.d.ts +154 -0
  6. package/dist/events/event-signatures.d.ts.map +1 -0
  7. package/dist/events/event-signatures.js +302 -0
  8. package/dist/events/event-signatures.js.map +1 -0
  9. package/dist/events/event-store.d.ts +159 -0
  10. package/dist/events/event-store.d.ts.map +1 -0
  11. package/dist/events/event-store.js +36 -0
  12. package/dist/events/event-store.js.map +1 -0
  13. package/dist/events/hash-chain.d.ts +63 -0
  14. package/dist/events/hash-chain.d.ts.map +1 -0
  15. package/dist/events/hash-chain.js +135 -0
  16. package/dist/events/hash-chain.js.map +1 -0
  17. package/dist/events/index.d.ts +9 -0
  18. package/dist/events/index.d.ts.map +1 -0
  19. package/dist/events/index.js +9 -0
  20. package/dist/events/index.js.map +1 -0
  21. package/dist/events/memory-store.d.ts +82 -0
  22. package/dist/events/memory-store.d.ts.map +1 -0
  23. package/dist/events/memory-store.js +215 -0
  24. package/dist/events/memory-store.js.map +1 -0
  25. package/dist/index.d.ts +36 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +41 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/proof-plane/index.d.ts +6 -0
  30. package/dist/proof-plane/index.d.ts.map +1 -0
  31. package/dist/proof-plane/index.js +6 -0
  32. package/dist/proof-plane/index.js.map +1 -0
  33. package/dist/proof-plane/logger.d.ts +47 -0
  34. package/dist/proof-plane/logger.d.ts.map +1 -0
  35. package/dist/proof-plane/logger.js +48 -0
  36. package/dist/proof-plane/logger.js.map +1 -0
  37. package/dist/proof-plane/proof-plane.d.ts +263 -0
  38. package/dist/proof-plane/proof-plane.d.ts.map +1 -0
  39. package/dist/proof-plane/proof-plane.js +431 -0
  40. package/dist/proof-plane/proof-plane.js.map +1 -0
  41. package/package.json +48 -0
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Event Emitter - Creates and chains proof events
3
+ *
4
+ * Handles the creation of properly hashed and chained proof events,
5
+ * ensuring immutability and tamper detection.
6
+ */
7
+ import type { ProofEvent, ProofEventPayload, ProofEventType, LogProofEventRequest, ShadowModeStatus } from '@vorion/contracts';
8
+ import { type ProofEventStore } from './event-store.js';
9
+ import { type EventSigningService } from './event-signatures.js';
10
+ /**
11
+ * Configuration for the event emitter
12
+ */
13
+ export interface EventEmitterConfig {
14
+ /** Event store to use */
15
+ store: ProofEventStore;
16
+ /** Signer identifier (e.g., service name) */
17
+ signedBy?: string;
18
+ /** Enable signature generation */
19
+ enableSignatures?: boolean;
20
+ /**
21
+ * Signing service for Ed25519 signatures
22
+ * Required when enableSignatures is true
23
+ */
24
+ signingService?: EventSigningService;
25
+ /**
26
+ * Private key for signing (base64-encoded Ed25519 private key)
27
+ * Alternative to signingService for simple setups
28
+ */
29
+ privateKey?: string;
30
+ /** Event listeners for real-time notifications */
31
+ listeners?: EventListener[];
32
+ /**
33
+ * Shadow mode for sandbox/testnet events
34
+ *
35
+ * When set, all emitted events are tagged with this status.
36
+ * Used for T0_SANDBOX agents whose events need HITL verification.
37
+ *
38
+ * @default 'production'
39
+ */
40
+ shadowMode?: ShadowModeStatus;
41
+ }
42
+ /**
43
+ * Event listener callback
44
+ */
45
+ export type EventListener = (event: ProofEvent) => void | Promise<void>;
46
+ /**
47
+ * Result of emitting an event
48
+ */
49
+ export interface EmitResult {
50
+ /** The created event */
51
+ event: ProofEvent;
52
+ /** Whether this is the first event in the chain */
53
+ isGenesis: boolean;
54
+ /** Previous event hash (null for genesis) */
55
+ previousHash: string | null;
56
+ }
57
+ /**
58
+ * Batch emit options
59
+ */
60
+ export interface BatchEmitOptions {
61
+ /** Whether to stop on first error */
62
+ stopOnError?: boolean;
63
+ /** Correlation ID to use for all events */
64
+ correlationId?: string;
65
+ }
66
+ /**
67
+ * Result of batch emit
68
+ */
69
+ export interface BatchEmitResult {
70
+ /** Successfully created events */
71
+ events: ProofEvent[];
72
+ /** Errors encountered */
73
+ errors: Array<{
74
+ index: number;
75
+ error: Error;
76
+ }>;
77
+ /** Whether all events were created successfully */
78
+ success: boolean;
79
+ }
80
+ /**
81
+ * ProofEventEmitter - Creates properly hashed and chained events
82
+ */
83
+ export declare class ProofEventEmitter {
84
+ private readonly store;
85
+ private readonly signedBy?;
86
+ private readonly enableSignatures;
87
+ private readonly signingService?;
88
+ private readonly privateKey?;
89
+ private readonly listeners;
90
+ private readonly shadowMode;
91
+ private emitLock;
92
+ constructor(config: EventEmitterConfig);
93
+ /**
94
+ * Check if signature generation is enabled and configured
95
+ */
96
+ isSigningEnabled(): boolean;
97
+ /**
98
+ * Check if this emitter is in shadow mode
99
+ */
100
+ isShadowMode(): boolean;
101
+ /**
102
+ * Get the current shadow mode status
103
+ */
104
+ getShadowMode(): ShadowModeStatus;
105
+ /**
106
+ * Emit a new proof event
107
+ *
108
+ * Events are serialized to ensure proper chaining.
109
+ */
110
+ emit(request: LogProofEventRequest): Promise<EmitResult>;
111
+ /**
112
+ * Emit an event with specific type helper
113
+ */
114
+ emitTyped<T extends ProofEventPayload>(eventType: ProofEventType, correlationId: string, payload: T, agentId?: string): Promise<EmitResult>;
115
+ /**
116
+ * Emit multiple events in a batch
117
+ */
118
+ emitBatch(requests: LogProofEventRequest[], options?: BatchEmitOptions): Promise<BatchEmitResult>;
119
+ /**
120
+ * Add an event listener
121
+ */
122
+ addListener(listener: EventListener): void;
123
+ /**
124
+ * Remove an event listener
125
+ */
126
+ removeListener(listener: EventListener): void;
127
+ /**
128
+ * Get the underlying store
129
+ */
130
+ getStore(): ProofEventStore;
131
+ private serializedEmit;
132
+ private createAndStoreEvent;
133
+ private validateEvent;
134
+ private notifyListeners;
135
+ }
136
+ /**
137
+ * Create a proof event emitter
138
+ */
139
+ export declare function createEventEmitter(config: EventEmitterConfig): ProofEventEmitter;
140
+ //# sourceMappingURL=event-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/events/event-emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Event Emitter - Creates and chains proof events
3
+ *
4
+ * Handles the creation of properly hashed and chained proof events,
5
+ * ensuring immutability and tamper detection.
6
+ */
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ import { EventStoreError, EventStoreErrorCode } from './event-store.js';
9
+ import { computeEventHash, getGenesisHash } from './hash-chain.js';
10
+ import { signEvent } from './event-signatures.js';
11
+ /**
12
+ * ProofEventEmitter - Creates properly hashed and chained events
13
+ */
14
+ export class ProofEventEmitter {
15
+ store;
16
+ signedBy;
17
+ enableSignatures;
18
+ signingService;
19
+ privateKey;
20
+ listeners;
21
+ shadowMode;
22
+ emitLock = Promise.resolve();
23
+ constructor(config) {
24
+ this.store = config.store;
25
+ this.signedBy = config.signedBy;
26
+ this.enableSignatures = config.enableSignatures ?? false;
27
+ this.signingService = config.signingService;
28
+ this.privateKey = config.privateKey;
29
+ this.listeners = config.listeners ?? [];
30
+ this.shadowMode = config.shadowMode ?? 'production';
31
+ // Validate signing configuration
32
+ if (this.enableSignatures && !this.signingService && !this.privateKey) {
33
+ console.warn('[ProofEventEmitter] Signatures enabled but no signingService or privateKey provided. ' +
34
+ 'Events will be emitted without signatures.');
35
+ }
36
+ }
37
+ /**
38
+ * Check if signature generation is enabled and configured
39
+ */
40
+ isSigningEnabled() {
41
+ return this.enableSignatures && (this.signingService?.canSign() || !!this.privateKey);
42
+ }
43
+ /**
44
+ * Check if this emitter is in shadow mode
45
+ */
46
+ isShadowMode() {
47
+ return this.shadowMode !== 'production';
48
+ }
49
+ /**
50
+ * Get the current shadow mode status
51
+ */
52
+ getShadowMode() {
53
+ return this.shadowMode;
54
+ }
55
+ /**
56
+ * Emit a new proof event
57
+ *
58
+ * Events are serialized to ensure proper chaining.
59
+ */
60
+ async emit(request) {
61
+ // Serialize event creation to ensure proper chaining
62
+ return this.serializedEmit(request);
63
+ }
64
+ /**
65
+ * Emit an event with specific type helper
66
+ */
67
+ async emitTyped(eventType, correlationId, payload, agentId) {
68
+ return this.emit({
69
+ eventType,
70
+ correlationId,
71
+ payload,
72
+ agentId,
73
+ occurredAt: new Date(),
74
+ signedBy: this.signedBy,
75
+ });
76
+ }
77
+ /**
78
+ * Emit multiple events in a batch
79
+ */
80
+ async emitBatch(requests, options) {
81
+ const events = [];
82
+ const errors = [];
83
+ for (let i = 0; i < requests.length; i++) {
84
+ try {
85
+ const request = {
86
+ ...requests[i],
87
+ correlationId: options?.correlationId ?? requests[i].correlationId,
88
+ };
89
+ const result = await this.emit(request);
90
+ events.push(result.event);
91
+ }
92
+ catch (error) {
93
+ const err = error instanceof Error ? error : new Error(String(error));
94
+ errors.push({ index: i, error: err });
95
+ if (options?.stopOnError) {
96
+ break;
97
+ }
98
+ }
99
+ }
100
+ return {
101
+ events,
102
+ errors,
103
+ success: errors.length === 0,
104
+ };
105
+ }
106
+ /**
107
+ * Add an event listener
108
+ */
109
+ addListener(listener) {
110
+ this.listeners.push(listener);
111
+ }
112
+ /**
113
+ * Remove an event listener
114
+ */
115
+ removeListener(listener) {
116
+ const index = this.listeners.indexOf(listener);
117
+ if (index !== -1) {
118
+ this.listeners.splice(index, 1);
119
+ }
120
+ }
121
+ /**
122
+ * Get the underlying store
123
+ */
124
+ getStore() {
125
+ return this.store;
126
+ }
127
+ // Private methods
128
+ async serializedEmit(request) {
129
+ // Wait for any pending emit to complete
130
+ const previousLock = this.emitLock;
131
+ let resolve;
132
+ this.emitLock = new Promise(r => { resolve = r; });
133
+ try {
134
+ await previousLock;
135
+ return await this.createAndStoreEvent(request);
136
+ }
137
+ finally {
138
+ resolve();
139
+ }
140
+ }
141
+ async createAndStoreEvent(request) {
142
+ const now = new Date();
143
+ const eventId = uuidv4();
144
+ // Get previous hash for chaining
145
+ const previousHash = await this.store.getLatestHash() ?? getGenesisHash();
146
+ const isGenesis = previousHash === null;
147
+ // Determine the signer identity
148
+ const signerIdentity = request.signedBy ?? this.signedBy ?? this.signingService?.getServiceId();
149
+ // Build event without hash and signature
150
+ const eventWithoutHashAndSig = {
151
+ eventId,
152
+ eventType: request.eventType,
153
+ correlationId: request.correlationId,
154
+ agentId: request.agentId,
155
+ payload: request.payload,
156
+ previousHash,
157
+ occurredAt: request.occurredAt ?? now,
158
+ signedBy: signerIdentity,
159
+ // Tag with shadow mode for T0 sandbox/testnet events
160
+ shadowMode: this.shadowMode !== 'production' ? this.shadowMode : undefined,
161
+ };
162
+ // Generate signature if enabled
163
+ let signature;
164
+ if (this.isSigningEnabled() && signerIdentity) {
165
+ try {
166
+ if (this.signingService?.canSign()) {
167
+ signature = await this.signingService.sign(eventWithoutHashAndSig);
168
+ }
169
+ else if (this.privateKey) {
170
+ signature = await signEvent(eventWithoutHashAndSig, this.privateKey, signerIdentity);
171
+ }
172
+ }
173
+ catch (error) {
174
+ console.error('[ProofEventEmitter] Failed to sign event:', error);
175
+ // Continue without signature - event is still valid for hash chain
176
+ }
177
+ }
178
+ // Build event with signature (for hash computation)
179
+ const eventWithSig = {
180
+ ...eventWithoutHashAndSig,
181
+ signature,
182
+ };
183
+ // Compute hash (includes signature if present)
184
+ const eventHash = await computeEventHash(eventWithSig);
185
+ // Create complete event
186
+ const event = {
187
+ ...eventWithSig,
188
+ eventHash,
189
+ recordedAt: now,
190
+ };
191
+ // Validate the event
192
+ this.validateEvent(event);
193
+ // Store the event
194
+ const storedEvent = await this.store.append(event);
195
+ // Notify listeners
196
+ await this.notifyListeners(storedEvent);
197
+ return {
198
+ event: storedEvent,
199
+ isGenesis,
200
+ previousHash,
201
+ };
202
+ }
203
+ validateEvent(event) {
204
+ if (!event.eventId) {
205
+ throw new EventStoreError('Event ID is required', EventStoreErrorCode.INVALID_EVENT);
206
+ }
207
+ if (!event.eventType) {
208
+ throw new EventStoreError('Event type is required', EventStoreErrorCode.INVALID_EVENT);
209
+ }
210
+ if (!event.correlationId) {
211
+ throw new EventStoreError('Correlation ID is required', EventStoreErrorCode.INVALID_EVENT);
212
+ }
213
+ if (!event.payload) {
214
+ throw new EventStoreError('Event payload is required', EventStoreErrorCode.INVALID_EVENT);
215
+ }
216
+ }
217
+ async notifyListeners(event) {
218
+ for (const listener of this.listeners) {
219
+ try {
220
+ await listener(event);
221
+ }
222
+ catch (error) {
223
+ // Log but don't throw - listeners shouldn't block event creation
224
+ console.error('Event listener error:', error);
225
+ }
226
+ }
227
+ }
228
+ }
229
+ /**
230
+ * Create a proof event emitter
231
+ */
232
+ export function createEventEmitter(config) {
233
+ return new ProofEventEmitter(config);
234
+ }
235
+ //# sourceMappingURL=event-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../src/events/event-emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Event Signatures - Ed25519 Digital Signatures for Proof Events
3
+ *
4
+ * Provides cryptographic signing and verification for proof events,
5
+ * ensuring authenticity and non-repudiation in the audit trail.
6
+ *
7
+ * Uses Ed25519 (EdDSA) which provides:
8
+ * - 128-bit security level
9
+ * - Small signatures (64 bytes)
10
+ * - Fast signing and verification
11
+ * - Deterministic signatures (no random nonce needed)
12
+ */
13
+ import type { ProofEvent } from '@vorion/contracts';
14
+ /**
15
+ * Signing key pair
16
+ */
17
+ export interface SigningKeyPair {
18
+ /** Public key in base64 format */
19
+ publicKey: string;
20
+ /** Private key in base64 format (keep secret!) */
21
+ privateKey: string;
22
+ /** Key ID for identification */
23
+ keyId: string;
24
+ /** When the key was created */
25
+ createdAt: Date;
26
+ /** Service/component that owns this key */
27
+ owner: string;
28
+ }
29
+ /**
30
+ * Public key for verification only
31
+ */
32
+ export interface PublicKey {
33
+ /** Public key in base64 format */
34
+ publicKey: string;
35
+ /** Key ID for identification */
36
+ keyId: string;
37
+ /** Service/component that owns this key */
38
+ owner: string;
39
+ }
40
+ /**
41
+ * Result of signature verification
42
+ */
43
+ export interface SignatureVerificationResult {
44
+ /** Is the signature valid? */
45
+ valid: boolean;
46
+ /** Key ID that was used for signing */
47
+ keyId?: string;
48
+ /** Signer identity (signedBy field) */
49
+ signer?: string;
50
+ /** Error message if verification failed */
51
+ error?: string;
52
+ /** Verification timestamp */
53
+ verifiedAt: Date;
54
+ }
55
+ /**
56
+ * Configuration for the signing service
57
+ */
58
+ export interface SigningServiceConfig {
59
+ /** Service identifier (used in signedBy field) */
60
+ serviceId: string;
61
+ /** Private key for signing (base64) */
62
+ privateKey?: string;
63
+ /** Key ID */
64
+ keyId?: string;
65
+ /** Known public keys for verification */
66
+ trustedKeys?: PublicKey[];
67
+ }
68
+ /**
69
+ * Generate a new Ed25519 signing key pair
70
+ */
71
+ export declare function generateSigningKeyPair(owner: string): Promise<SigningKeyPair>;
72
+ /**
73
+ * Sign an event using Ed25519
74
+ */
75
+ export declare function signEvent(event: Omit<ProofEvent, 'signature' | 'eventHash' | 'recordedAt'>, privateKeyBase64: string, signedBy: string): Promise<string>;
76
+ /**
77
+ * Verify an event signature using Ed25519
78
+ */
79
+ export declare function verifyEventSignature(event: ProofEvent, publicKeyBase64: string): Promise<SignatureVerificationResult>;
80
+ /**
81
+ * Event Signing Service - Manages signing keys and operations
82
+ */
83
+ export declare class EventSigningService {
84
+ private readonly serviceId;
85
+ private readonly privateKey?;
86
+ private readonly keyId?;
87
+ private readonly trustedKeys;
88
+ constructor(config: SigningServiceConfig);
89
+ /**
90
+ * Check if this service can sign events
91
+ */
92
+ canSign(): boolean;
93
+ /**
94
+ * Get the service ID (used in signedBy field)
95
+ */
96
+ getServiceId(): string;
97
+ /**
98
+ * Get the key ID
99
+ */
100
+ getKeyId(): string | undefined;
101
+ /**
102
+ * Sign an event
103
+ */
104
+ sign(event: Omit<ProofEvent, 'signature' | 'eventHash' | 'recordedAt'>): Promise<string>;
105
+ /**
106
+ * Verify an event signature
107
+ */
108
+ verify(event: ProofEvent): Promise<SignatureVerificationResult>;
109
+ /**
110
+ * Add a trusted public key
111
+ */
112
+ addTrustedKey(key: PublicKey): void;
113
+ /**
114
+ * Remove a trusted public key
115
+ */
116
+ removeTrustedKey(owner: string): boolean;
117
+ /**
118
+ * Get all trusted keys
119
+ */
120
+ getTrustedKeys(): PublicKey[];
121
+ /**
122
+ * Check if a signer is trusted
123
+ */
124
+ isTrusted(signer: string): boolean;
125
+ }
126
+ /**
127
+ * Create an event signing service
128
+ */
129
+ export declare function createSigningService(config: SigningServiceConfig): EventSigningService;
130
+ /**
131
+ * Batch verification result
132
+ */
133
+ export interface BatchVerificationResult {
134
+ /** Number of events verified */
135
+ totalEvents: number;
136
+ /** Number of valid signatures */
137
+ validCount: number;
138
+ /** Number of invalid signatures */
139
+ invalidCount: number;
140
+ /** Number of unsigned events */
141
+ unsignedCount: number;
142
+ /** All verification results */
143
+ results: Array<{
144
+ eventId: string;
145
+ result: SignatureVerificationResult;
146
+ }>;
147
+ /** Overall success (all signed events valid) */
148
+ success: boolean;
149
+ }
150
+ /**
151
+ * Verify signatures for a batch of events
152
+ */
153
+ export declare function verifyEventSignatures(events: ProofEvent[], signingService: EventSigningService): Promise<BatchVerificationResult>;
154
+ //# sourceMappingURL=event-signatures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-signatures.d.ts","sourceRoot":"","sources":["../../src/events/event-signatures.ts"],"names":[],"mappings":"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"}