@framers/agentos 0.1.6 → 0.1.7
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.
- package/README.md +19 -0
- package/dist/api/AgentOS.d.ts +12 -0
- package/dist/api/AgentOS.d.ts.map +1 -1
- package/dist/api/AgentOS.js +96 -2
- package/dist/api/AgentOS.js.map +1 -1
- package/dist/api/AgentOSOrchestrator.d.ts +45 -0
- package/dist/api/AgentOSOrchestrator.d.ts.map +1 -1
- package/dist/api/AgentOSOrchestrator.js +470 -6
- package/dist/api/AgentOSOrchestrator.js.map +1 -1
- package/dist/api/types/AgentOSInput.d.ts +8 -0
- package/dist/api/types/AgentOSInput.d.ts.map +1 -1
- package/dist/api/types/AgentOSResponse.d.ts +22 -2
- package/dist/api/types/AgentOSResponse.d.ts.map +1 -1
- package/dist/api/types/AgentOSResponse.js +1 -0
- package/dist/api/types/AgentOSResponse.js.map +1 -1
- package/dist/channels/ChannelRouter.d.ts +150 -0
- package/dist/channels/ChannelRouter.d.ts.map +1 -0
- package/dist/channels/ChannelRouter.js +309 -0
- package/dist/channels/ChannelRouter.js.map +1 -0
- package/dist/channels/IChannelAdapter.d.ts +113 -0
- package/dist/channels/IChannelAdapter.d.ts.map +1 -0
- package/dist/channels/IChannelAdapter.js +17 -0
- package/dist/channels/IChannelAdapter.js.map +1 -0
- package/dist/channels/index.d.ts +9 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +7 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/types.d.ts +257 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +12 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/cognitive_substrate/GMI.d.ts +139 -0
- package/dist/cognitive_substrate/GMI.d.ts.map +1 -1
- package/dist/cognitive_substrate/GMI.js +680 -14
- package/dist/cognitive_substrate/GMI.js.map +1 -1
- package/dist/cognitive_substrate/GMIEvent.d.ts +151 -0
- package/dist/cognitive_substrate/GMIEvent.d.ts.map +1 -0
- package/dist/cognitive_substrate/GMIEvent.js +79 -0
- package/dist/cognitive_substrate/GMIEvent.js.map +1 -0
- package/dist/cognitive_substrate/IGMI.d.ts +22 -0
- package/dist/cognitive_substrate/IGMI.d.ts.map +1 -1
- package/dist/cognitive_substrate/IGMI.js.map +1 -1
- package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts +92 -0
- package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts.map +1 -1
- package/dist/cognitive_substrate/personas/PersonaLoader.d.ts.map +1 -1
- package/dist/cognitive_substrate/personas/PersonaLoader.js +21 -0
- package/dist/cognitive_substrate/personas/PersonaLoader.js.map +1 -1
- package/dist/cognitive_substrate/personas/metaprompt_presets.d.ts +86 -0
- package/dist/cognitive_substrate/personas/metaprompt_presets.d.ts.map +1 -0
- package/dist/cognitive_substrate/personas/metaprompt_presets.js +457 -0
- package/dist/cognitive_substrate/personas/metaprompt_presets.js.map +1 -0
- package/dist/config/RetrievalAugmentorConfiguration.d.ts +21 -0
- package/dist/config/RetrievalAugmentorConfiguration.d.ts.map +1 -1
- package/dist/config/RetrievalAugmentorConfiguration.js.map +1 -1
- package/dist/config/VectorStoreConfiguration.d.ts +2 -1
- package/dist/config/VectorStoreConfiguration.d.ts.map +1 -1
- package/dist/config/VectorStoreConfiguration.js.map +1 -1
- package/dist/config/extension-secrets.json +198 -0
- package/dist/core/agents/AgentCore.d.ts +8 -0
- package/dist/core/agents/AgentCore.d.ts.map +1 -1
- package/dist/core/agents/AgentCore.js.map +1 -1
- package/dist/core/conversation/ConversationManager.d.ts.map +1 -1
- package/dist/core/conversation/ConversationManager.js +2 -4
- package/dist/core/conversation/ConversationManager.js.map +1 -1
- package/dist/core/conversation/ILongTermMemoryRetriever.d.ts +30 -0
- package/dist/core/conversation/ILongTermMemoryRetriever.d.ts.map +1 -0
- package/dist/core/conversation/ILongTermMemoryRetriever.js +2 -0
- package/dist/core/conversation/ILongTermMemoryRetriever.js.map +1 -0
- package/dist/core/conversation/IRollingSummaryMemorySink.d.ts +44 -0
- package/dist/core/conversation/IRollingSummaryMemorySink.d.ts.map +1 -0
- package/dist/core/conversation/IRollingSummaryMemorySink.js +9 -0
- package/dist/core/conversation/IRollingSummaryMemorySink.js.map +1 -0
- package/dist/core/conversation/LongTermMemoryPolicy.d.ts +53 -0
- package/dist/core/conversation/LongTermMemoryPolicy.d.ts.map +1 -0
- package/dist/core/conversation/LongTermMemoryPolicy.js +84 -0
- package/dist/core/conversation/LongTermMemoryPolicy.js.map +1 -0
- package/dist/core/conversation/RollingSummaryCompactor.d.ts +61 -0
- package/dist/core/conversation/RollingSummaryCompactor.d.ts.map +1 -0
- package/dist/core/conversation/RollingSummaryCompactor.js +255 -0
- package/dist/core/conversation/RollingSummaryCompactor.js.map +1 -0
- package/dist/core/llm/PromptEngine.d.ts.map +1 -1
- package/dist/core/llm/PromptEngine.js +10 -1
- package/dist/core/llm/PromptEngine.js.map +1 -1
- package/dist/core/orchestration/AgentOrchestrator.d.ts +40 -0
- package/dist/core/orchestration/AgentOrchestrator.d.ts.map +1 -1
- package/dist/core/orchestration/AgentOrchestrator.js +324 -2
- package/dist/core/orchestration/AgentOrchestrator.js.map +1 -1
- package/dist/core/prompting/PromptProfileRouter.d.ts +74 -0
- package/dist/core/prompting/PromptProfileRouter.d.ts.map +1 -0
- package/dist/core/prompting/PromptProfileRouter.js +270 -0
- package/dist/core/prompting/PromptProfileRouter.js.map +1 -0
- package/dist/core/provenance/anchoring/AnchorManager.d.ts +86 -0
- package/dist/core/provenance/anchoring/AnchorManager.d.ts.map +1 -0
- package/dist/core/provenance/anchoring/AnchorManager.js +244 -0
- package/dist/core/provenance/anchoring/AnchorManager.js.map +1 -0
- package/dist/core/provenance/anchoring/providers/CompositeAnchorProvider.d.ts +20 -0
- package/dist/core/provenance/anchoring/providers/CompositeAnchorProvider.d.ts.map +1 -0
- package/dist/core/provenance/anchoring/providers/CompositeAnchorProvider.js +62 -0
- package/dist/core/provenance/anchoring/providers/CompositeAnchorProvider.js.map +1 -0
- package/dist/core/provenance/anchoring/providers/NoneProvider.d.ts +15 -0
- package/dist/core/provenance/anchoring/providers/NoneProvider.d.ts.map +1 -0
- package/dist/core/provenance/anchoring/providers/NoneProvider.js +21 -0
- package/dist/core/provenance/anchoring/providers/NoneProvider.js.map +1 -0
- package/dist/core/provenance/anchoring/providers/createAnchorProvider.d.ts +38 -0
- package/dist/core/provenance/anchoring/providers/createAnchorProvider.d.ts.map +1 -0
- package/dist/core/provenance/anchoring/providers/createAnchorProvider.js +67 -0
- package/dist/core/provenance/anchoring/providers/createAnchorProvider.js.map +1 -0
- package/dist/core/provenance/anchoring/providers/index.d.ts +12 -0
- package/dist/core/provenance/anchoring/providers/index.d.ts.map +1 -0
- package/dist/core/provenance/anchoring/providers/index.js +12 -0
- package/dist/core/provenance/anchoring/providers/index.js.map +1 -0
- package/dist/core/provenance/config/PolicyProfiles.d.ts +60 -0
- package/dist/core/provenance/config/PolicyProfiles.d.ts.map +1 -0
- package/dist/core/provenance/config/PolicyProfiles.js +144 -0
- package/dist/core/provenance/config/PolicyProfiles.js.map +1 -0
- package/dist/core/provenance/crypto/AgentKeyManager.d.ts +48 -0
- package/dist/core/provenance/crypto/AgentKeyManager.d.ts.map +1 -0
- package/dist/core/provenance/crypto/AgentKeyManager.js +162 -0
- package/dist/core/provenance/crypto/AgentKeyManager.js.map +1 -0
- package/dist/core/provenance/crypto/HashChain.d.ts +58 -0
- package/dist/core/provenance/crypto/HashChain.d.ts.map +1 -0
- package/dist/core/provenance/crypto/HashChain.js +86 -0
- package/dist/core/provenance/crypto/HashChain.js.map +1 -0
- package/dist/core/provenance/crypto/MerkleTree.d.ts +41 -0
- package/dist/core/provenance/crypto/MerkleTree.d.ts.map +1 -0
- package/dist/core/provenance/crypto/MerkleTree.js +86 -0
- package/dist/core/provenance/crypto/MerkleTree.js.map +1 -0
- package/dist/core/provenance/enforcement/AutonomyGuard.d.ts +37 -0
- package/dist/core/provenance/enforcement/AutonomyGuard.d.ts.map +1 -0
- package/dist/core/provenance/enforcement/AutonomyGuard.js +120 -0
- package/dist/core/provenance/enforcement/AutonomyGuard.js.map +1 -0
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.d.ts +43 -0
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.d.ts.map +1 -0
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js +193 -0
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js.map +1 -0
- package/dist/core/provenance/enforcement/RevisionManager.d.ts +41 -0
- package/dist/core/provenance/enforcement/RevisionManager.d.ts.map +1 -0
- package/dist/core/provenance/enforcement/RevisionManager.js +105 -0
- package/dist/core/provenance/enforcement/RevisionManager.js.map +1 -0
- package/dist/core/provenance/enforcement/TombstoneManager.d.ts +47 -0
- package/dist/core/provenance/enforcement/TombstoneManager.d.ts.map +1 -0
- package/dist/core/provenance/enforcement/TombstoneManager.js +121 -0
- package/dist/core/provenance/enforcement/TombstoneManager.js.map +1 -0
- package/dist/core/provenance/index.d.ts +34 -0
- package/dist/core/provenance/index.d.ts.map +1 -0
- package/dist/core/provenance/index.js +39 -0
- package/dist/core/provenance/index.js.map +1 -0
- package/dist/core/provenance/ledger/EventTypes.d.ts +123 -0
- package/dist/core/provenance/ledger/EventTypes.d.ts.map +1 -0
- package/dist/core/provenance/ledger/EventTypes.js +9 -0
- package/dist/core/provenance/ledger/EventTypes.js.map +1 -0
- package/dist/core/provenance/ledger/SignedEventLedger.d.ts +75 -0
- package/dist/core/provenance/ledger/SignedEventLedger.d.ts.map +1 -0
- package/dist/core/provenance/ledger/SignedEventLedger.js +210 -0
- package/dist/core/provenance/ledger/SignedEventLedger.js.map +1 -0
- package/dist/core/provenance/schema/provenance-schema.d.ts +17 -0
- package/dist/core/provenance/schema/provenance-schema.d.ts.map +1 -0
- package/dist/core/provenance/schema/provenance-schema.js +104 -0
- package/dist/core/provenance/schema/provenance-schema.js.map +1 -0
- package/dist/core/provenance/types.d.ts +261 -0
- package/dist/core/provenance/types.d.ts.map +1 -0
- package/dist/core/provenance/types.js +21 -0
- package/dist/core/provenance/types.js.map +1 -0
- package/dist/core/provenance/verification/BundleExporter.d.ts +50 -0
- package/dist/core/provenance/verification/BundleExporter.d.ts.map +1 -0
- package/dist/core/provenance/verification/BundleExporter.js +240 -0
- package/dist/core/provenance/verification/BundleExporter.js.map +1 -0
- package/dist/core/provenance/verification/ChainVerifier.d.ts +39 -0
- package/dist/core/provenance/verification/ChainVerifier.d.ts.map +1 -0
- package/dist/core/provenance/verification/ChainVerifier.js +204 -0
- package/dist/core/provenance/verification/ChainVerifier.js.map +1 -0
- package/dist/core/provenance/verification/ConversationVerifier.d.ts +56 -0
- package/dist/core/provenance/verification/ConversationVerifier.d.ts.map +1 -0
- package/dist/core/provenance/verification/ConversationVerifier.js +109 -0
- package/dist/core/provenance/verification/ConversationVerifier.js.map +1 -0
- package/dist/extensions/ExtensionManager.d.ts.map +1 -1
- package/dist/extensions/ExtensionManager.js +6 -1
- package/dist/extensions/ExtensionManager.js.map +1 -1
- package/dist/extensions/MessagingChannelPayload.d.ts +39 -0
- package/dist/extensions/MessagingChannelPayload.d.ts.map +1 -0
- package/dist/extensions/MessagingChannelPayload.js +12 -0
- package/dist/extensions/MessagingChannelPayload.js.map +1 -0
- package/dist/extensions/packs/provenance-pack.d.ts +66 -0
- package/dist/extensions/packs/provenance-pack.d.ts.map +1 -0
- package/dist/extensions/packs/provenance-pack.js +162 -0
- package/dist/extensions/packs/provenance-pack.js.map +1 -0
- package/dist/extensions/types.d.ts +11 -0
- package/dist/extensions/types.d.ts.map +1 -1
- package/dist/extensions/types.js +4 -0
- package/dist/extensions/types.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/rag/IRetrievalAugmentor.d.ts +22 -1
- package/dist/rag/IRetrievalAugmentor.d.ts.map +1 -1
- package/dist/rag/RetrievalAugmentor.d.ts +37 -0
- package/dist/rag/RetrievalAugmentor.d.ts.map +1 -1
- package/dist/rag/RetrievalAugmentor.js +82 -6
- package/dist/rag/RetrievalAugmentor.js.map +1 -1
- package/dist/rag/VectorStoreManager.d.ts.map +1 -1
- package/dist/rag/VectorStoreManager.js +5 -0
- package/dist/rag/VectorStoreManager.js.map +1 -1
- package/dist/rag/graphrag/GraphRAGEngine.d.ts +100 -0
- package/dist/rag/graphrag/GraphRAGEngine.d.ts.map +1 -0
- package/dist/rag/graphrag/GraphRAGEngine.js +1146 -0
- package/dist/rag/graphrag/GraphRAGEngine.js.map +1 -0
- package/dist/rag/graphrag/IGraphRAG.d.ts +198 -0
- package/dist/rag/graphrag/IGraphRAG.d.ts.map +1 -0
- package/dist/rag/graphrag/IGraphRAG.js +11 -0
- package/dist/rag/graphrag/IGraphRAG.js.map +1 -0
- package/dist/rag/graphrag/index.d.ts +12 -0
- package/dist/rag/graphrag/index.d.ts.map +1 -0
- package/dist/rag/graphrag/index.js +11 -0
- package/dist/rag/graphrag/index.js.map +1 -0
- package/dist/rag/implementations/vector_stores/HnswlibVectorStore.d.ts +72 -0
- package/dist/rag/implementations/vector_stores/HnswlibVectorStore.d.ts.map +1 -0
- package/dist/rag/implementations/vector_stores/HnswlibVectorStore.js +463 -0
- package/dist/rag/implementations/vector_stores/HnswlibVectorStore.js.map +1 -0
- package/dist/rag/implementations/vector_stores/index.d.ts +1 -0
- package/dist/rag/implementations/vector_stores/index.d.ts.map +1 -1
- package/dist/rag/implementations/vector_stores/index.js +2 -0
- package/dist/rag/implementations/vector_stores/index.js.map +1 -1
- package/dist/rag/index.d.ts +3 -0
- package/dist/rag/index.d.ts.map +1 -1
- package/dist/rag/index.js +5 -0
- package/dist/rag/index.js.map +1 -1
- package/dist/rag/reranking/IRerankerService.d.ts +163 -0
- package/dist/rag/reranking/IRerankerService.d.ts.map +1 -0
- package/dist/rag/reranking/IRerankerService.js +9 -0
- package/dist/rag/reranking/IRerankerService.js.map +1 -0
- package/dist/rag/reranking/RerankerService.d.ts +107 -0
- package/dist/rag/reranking/RerankerService.d.ts.map +1 -0
- package/dist/rag/reranking/RerankerService.js +194 -0
- package/dist/rag/reranking/RerankerService.js.map +1 -0
- package/dist/rag/reranking/index.d.ts +55 -0
- package/dist/rag/reranking/index.d.ts.map +1 -0
- package/dist/rag/reranking/index.js +56 -0
- package/dist/rag/reranking/index.js.map +1 -0
- package/dist/rag/reranking/providers/CohereReranker.d.ts +66 -0
- package/dist/rag/reranking/providers/CohereReranker.d.ts.map +1 -0
- package/dist/rag/reranking/providers/CohereReranker.js +141 -0
- package/dist/rag/reranking/providers/CohereReranker.js.map +1 -0
- package/dist/rag/reranking/providers/LocalCrossEncoderReranker.d.ts +105 -0
- package/dist/rag/reranking/providers/LocalCrossEncoderReranker.d.ts.map +1 -0
- package/dist/rag/reranking/providers/LocalCrossEncoderReranker.js +214 -0
- package/dist/rag/reranking/providers/LocalCrossEncoderReranker.js.map +1 -0
- package/dist/rag/reranking/providers/index.d.ts +7 -0
- package/dist/rag/reranking/providers/index.d.ts.map +1 -0
- package/dist/rag/reranking/providers/index.js +7 -0
- package/dist/rag/reranking/providers/index.js.map +1 -0
- package/dist/rag/reranking/tests/index.d.ts +6 -0
- package/dist/rag/reranking/tests/index.d.ts.map +1 -0
- package/dist/rag/reranking/tests/index.js +11 -0
- package/dist/rag/reranking/tests/index.js.map +1 -0
- package/dist/types/optionalDependencies.d.ts +5 -0
- package/dist/types/optionalDependencies.d.ts.map +1 -0
- package/dist/types/optionalDependencies.js +4 -0
- package/dist/types/optionalDependencies.js.map +1 -0
- package/package.json +22 -6
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file BundleExporter.ts
|
|
3
|
+
* @description Export and import verification bundles for offline chain verification.
|
|
4
|
+
* Bundles contain events, anchors, public key, and a bundle-level signature.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Verification
|
|
7
|
+
*/
|
|
8
|
+
import { AgentKeyManager } from '../crypto/AgentKeyManager.js';
|
|
9
|
+
import { HashChain } from '../crypto/HashChain.js';
|
|
10
|
+
import { ChainVerifier } from './ChainVerifier.js';
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// BundleExporter
|
|
13
|
+
// =============================================================================
|
|
14
|
+
export class BundleExporter {
|
|
15
|
+
constructor(ledger, keyManager, anchorStorage = null, tablePrefix = '') {
|
|
16
|
+
this.ledger = ledger;
|
|
17
|
+
this.keyManager = keyManager;
|
|
18
|
+
this.anchorStorage = anchorStorage;
|
|
19
|
+
this.tablePrefix = tablePrefix;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Export a verification bundle containing all events, anchors, and public key.
|
|
23
|
+
* The bundle is signed for tamper evidence.
|
|
24
|
+
*
|
|
25
|
+
* @param fromSequence - Optional start sequence (inclusive). Defaults to 1.
|
|
26
|
+
* @param toSequence - Optional end sequence (inclusive). Defaults to latest.
|
|
27
|
+
* @returns A self-contained verification bundle.
|
|
28
|
+
*/
|
|
29
|
+
async exportBundle(fromSequence, toSequence) {
|
|
30
|
+
// Get events
|
|
31
|
+
let events;
|
|
32
|
+
if (fromSequence !== undefined && toSequence !== undefined) {
|
|
33
|
+
events = await this.ledger.getEventsByRange(fromSequence, toSequence);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
events = await this.ledger.getAllEvents();
|
|
37
|
+
}
|
|
38
|
+
// Get anchors
|
|
39
|
+
let anchors = [];
|
|
40
|
+
if (this.anchorStorage) {
|
|
41
|
+
const rows = await this.anchorStorage.all(`SELECT * FROM ${this.tablePrefix}anchors ORDER BY sequence_from ASC`);
|
|
42
|
+
anchors = rows.map(row => ({
|
|
43
|
+
id: row.id,
|
|
44
|
+
merkleRoot: row.merkle_root,
|
|
45
|
+
sequenceFrom: row.sequence_from,
|
|
46
|
+
sequenceTo: row.sequence_to,
|
|
47
|
+
eventCount: row.event_count,
|
|
48
|
+
signature: row.signature,
|
|
49
|
+
timestamp: row.timestamp,
|
|
50
|
+
externalRef: row.external_ref ?? undefined,
|
|
51
|
+
}));
|
|
52
|
+
// Filter anchors to the requested range
|
|
53
|
+
if (fromSequence !== undefined || toSequence !== undefined) {
|
|
54
|
+
anchors = anchors.filter(a => {
|
|
55
|
+
if (fromSequence !== undefined && a.sequenceTo < fromSequence)
|
|
56
|
+
return false;
|
|
57
|
+
if (toSequence !== undefined && a.sequenceFrom > toSequence)
|
|
58
|
+
return false;
|
|
59
|
+
return true;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const publicKey = this.keyManager.getPublicKeyBase64();
|
|
64
|
+
const exportedAt = new Date().toISOString();
|
|
65
|
+
// Compute bundle hash (hash of all event hashes + anchor merkle roots)
|
|
66
|
+
const contentHashes = [
|
|
67
|
+
...events.map(e => e.hash),
|
|
68
|
+
...anchors.map(a => a.merkleRoot),
|
|
69
|
+
];
|
|
70
|
+
const bundleContentHash = HashChain.hash(contentHashes.join('|'));
|
|
71
|
+
// Sign the bundle
|
|
72
|
+
const bundleSignature = await this.keyManager.sign(bundleContentHash);
|
|
73
|
+
const bundle = {
|
|
74
|
+
version: '1.0.0',
|
|
75
|
+
agentId: events.length > 0 ? events[0].agentId : '',
|
|
76
|
+
publicKey,
|
|
77
|
+
events,
|
|
78
|
+
anchors,
|
|
79
|
+
exportedAt,
|
|
80
|
+
bundleHash: bundleContentHash,
|
|
81
|
+
bundleSignature,
|
|
82
|
+
};
|
|
83
|
+
return bundle;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Export a bundle as a JSONL string (one JSON object per line).
|
|
87
|
+
* Format:
|
|
88
|
+
* Line 1: Bundle metadata (version, agentId, publicKey, exportedAt, bundleHash, bundleSignature)
|
|
89
|
+
* Lines 2-N: One event per line
|
|
90
|
+
* Lines N+1-M: One anchor per line (prefixed with type: 'anchor')
|
|
91
|
+
*/
|
|
92
|
+
async exportAsJSONL(fromSequence, toSequence) {
|
|
93
|
+
const bundle = await this.exportBundle(fromSequence, toSequence);
|
|
94
|
+
const lines = [];
|
|
95
|
+
// Metadata line
|
|
96
|
+
lines.push(JSON.stringify({
|
|
97
|
+
type: 'metadata',
|
|
98
|
+
version: bundle.version,
|
|
99
|
+
agentId: bundle.agentId,
|
|
100
|
+
publicKey: bundle.publicKey,
|
|
101
|
+
exportedAt: bundle.exportedAt,
|
|
102
|
+
bundleHash: bundle.bundleHash,
|
|
103
|
+
bundleSignature: bundle.bundleSignature,
|
|
104
|
+
eventCount: bundle.events.length,
|
|
105
|
+
anchorCount: bundle.anchors.length,
|
|
106
|
+
}));
|
|
107
|
+
// Event lines
|
|
108
|
+
for (const event of bundle.events) {
|
|
109
|
+
lines.push(JSON.stringify({ _line: 'event', ...event }));
|
|
110
|
+
}
|
|
111
|
+
// Anchor lines
|
|
112
|
+
for (const anchor of bundle.anchors) {
|
|
113
|
+
lines.push(JSON.stringify({ _line: 'anchor', ...anchor }));
|
|
114
|
+
}
|
|
115
|
+
return lines.join('\n');
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Import and verify a bundle. Works completely offline (no DB required).
|
|
119
|
+
*
|
|
120
|
+
* @param bundle - The verification bundle to verify.
|
|
121
|
+
* @returns Verification result.
|
|
122
|
+
*/
|
|
123
|
+
static async importAndVerify(bundle) {
|
|
124
|
+
const errors = [];
|
|
125
|
+
const warnings = [];
|
|
126
|
+
// 1. Verify bundle signature
|
|
127
|
+
const contentHashes = [
|
|
128
|
+
...bundle.events.map(e => e.hash),
|
|
129
|
+
...bundle.anchors.map(a => a.merkleRoot),
|
|
130
|
+
];
|
|
131
|
+
const recomputedBundleHash = HashChain.hash(contentHashes.join('|'));
|
|
132
|
+
if (recomputedBundleHash !== bundle.bundleHash) {
|
|
133
|
+
errors.push({
|
|
134
|
+
eventId: '',
|
|
135
|
+
sequence: 0,
|
|
136
|
+
code: 'BUNDLE_HASH_MISMATCH',
|
|
137
|
+
message: 'Bundle content hash does not match. Bundle may have been tampered with.',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (bundle.bundleSignature && bundle.publicKey) {
|
|
141
|
+
try {
|
|
142
|
+
const sigValid = await AgentKeyManager.verifySignature(bundle.bundleHash, bundle.bundleSignature, bundle.publicKey);
|
|
143
|
+
if (!sigValid) {
|
|
144
|
+
errors.push({
|
|
145
|
+
eventId: '',
|
|
146
|
+
sequence: 0,
|
|
147
|
+
code: 'BUNDLE_SIGNATURE_INVALID',
|
|
148
|
+
message: 'Bundle signature is invalid.',
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
errors.push({
|
|
154
|
+
eventId: '',
|
|
155
|
+
sequence: 0,
|
|
156
|
+
code: 'BUNDLE_SIGNATURE_INVALID',
|
|
157
|
+
message: `Bundle signature verification failed: ${e.message}`,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// 2. Verify the event chain
|
|
162
|
+
const chainResult = await ChainVerifier.verify(bundle.events, bundle.publicKey);
|
|
163
|
+
// 3. Verify anchors reference valid event ranges
|
|
164
|
+
for (const anchor of bundle.anchors) {
|
|
165
|
+
const anchorEvents = bundle.events.filter(e => e.sequence >= anchor.sequenceFrom && e.sequence <= anchor.sequenceTo);
|
|
166
|
+
if (anchorEvents.length !== anchor.eventCount) {
|
|
167
|
+
warnings.push(`Anchor ${anchor.id}: expected ${anchor.eventCount} events in range [${anchor.sequenceFrom}, ${anchor.sequenceTo}], found ${anchorEvents.length} in bundle.`);
|
|
168
|
+
}
|
|
169
|
+
// Verify anchor signature
|
|
170
|
+
if (anchor.signature && bundle.publicKey) {
|
|
171
|
+
try {
|
|
172
|
+
const sigValid = await AgentKeyManager.verifySignature(anchor.merkleRoot, anchor.signature, bundle.publicKey);
|
|
173
|
+
if (!sigValid) {
|
|
174
|
+
errors.push({
|
|
175
|
+
eventId: anchor.id,
|
|
176
|
+
sequence: anchor.sequenceFrom,
|
|
177
|
+
code: 'ANCHOR_SIGNATURE_INVALID',
|
|
178
|
+
message: `Anchor ${anchor.id} signature is invalid.`,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
errors.push({
|
|
184
|
+
eventId: anchor.id,
|
|
185
|
+
sequence: anchor.sequenceFrom,
|
|
186
|
+
code: 'ANCHOR_SIGNATURE_INVALID',
|
|
187
|
+
message: `Anchor ${anchor.id} signature verification failed: ${e.message}`,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
valid: errors.length === 0 && chainResult.valid,
|
|
194
|
+
eventsVerified: bundle.events.length,
|
|
195
|
+
errors: [...errors, ...chainResult.errors],
|
|
196
|
+
warnings: [...warnings, ...chainResult.warnings],
|
|
197
|
+
firstSequence: bundle.events.length > 0 ? bundle.events[0].sequence : undefined,
|
|
198
|
+
lastSequence: bundle.events.length > 0 ? bundle.events[bundle.events.length - 1].sequence : undefined,
|
|
199
|
+
agentId: bundle.agentId,
|
|
200
|
+
verifiedAt: new Date().toISOString(),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Parse a JSONL bundle string back into a VerificationBundle.
|
|
205
|
+
*/
|
|
206
|
+
static parseJSONL(jsonl) {
|
|
207
|
+
const lines = jsonl.trim().split('\n').filter(l => l.length > 0);
|
|
208
|
+
if (lines.length === 0) {
|
|
209
|
+
throw new Error('Empty JSONL bundle');
|
|
210
|
+
}
|
|
211
|
+
const metadataLine = JSON.parse(lines[0]);
|
|
212
|
+
if (metadataLine.type !== 'metadata') {
|
|
213
|
+
throw new Error('First line must be metadata');
|
|
214
|
+
}
|
|
215
|
+
const events = [];
|
|
216
|
+
const anchors = [];
|
|
217
|
+
for (let i = 1; i < lines.length; i++) {
|
|
218
|
+
const obj = JSON.parse(lines[i]);
|
|
219
|
+
if (obj._line === 'event') {
|
|
220
|
+
const { _line, ...event } = obj;
|
|
221
|
+
events.push(event);
|
|
222
|
+
}
|
|
223
|
+
else if (obj._line === 'anchor') {
|
|
224
|
+
const { _line, ...anchor } = obj;
|
|
225
|
+
anchors.push(anchor);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
version: metadataLine.version,
|
|
230
|
+
agentId: metadataLine.agentId,
|
|
231
|
+
publicKey: metadataLine.publicKey,
|
|
232
|
+
events,
|
|
233
|
+
anchors,
|
|
234
|
+
exportedAt: metadataLine.exportedAt,
|
|
235
|
+
bundleHash: metadataLine.bundleHash,
|
|
236
|
+
bundleSignature: metadataLine.bundleSignature,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=BundleExporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BundleExporter.js","sourceRoot":"","sources":["../../../../src/core/provenance/verification/BundleExporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file ChainVerifier.ts
|
|
3
|
+
* @description Verifies the integrity of the signed event hash chain.
|
|
4
|
+
* Checks sequence continuity, hash linkage, payload hashes, signatures,
|
|
5
|
+
* and timestamp monotonicity.
|
|
6
|
+
*
|
|
7
|
+
* @module AgentOS/Provenance/Verification
|
|
8
|
+
*/
|
|
9
|
+
import type { SignedEvent, VerificationResult } from '../types.js';
|
|
10
|
+
export declare class ChainVerifier {
|
|
11
|
+
/**
|
|
12
|
+
* Verify an ordered array of signed events for chain integrity.
|
|
13
|
+
*
|
|
14
|
+
* Checks performed:
|
|
15
|
+
* 1. Sequence continuity (monotonically increasing, no gaps)
|
|
16
|
+
* 2. Hash linkage (each event's prevHash matches the prior event's hash)
|
|
17
|
+
* 3. Payload hash integrity (recomputed hash matches stored payloadHash)
|
|
18
|
+
* 4. Event hash integrity (recomputed hash matches stored hash)
|
|
19
|
+
* 5. Ed25519 signature verification (if signatures present)
|
|
20
|
+
* 6. Timestamp monotonicity (non-decreasing)
|
|
21
|
+
*
|
|
22
|
+
* @param events - Ordered array of SignedEvent objects (sorted by sequence ASC).
|
|
23
|
+
* @param publicKeyBase64 - Optional public key for signature verification.
|
|
24
|
+
* If omitted, uses each event's signerPublicKey field.
|
|
25
|
+
* @param hashAlgorithm - Hash algorithm used (default: 'sha256').
|
|
26
|
+
* @returns VerificationResult with validity status and any errors found.
|
|
27
|
+
*/
|
|
28
|
+
static verify(events: SignedEvent[], publicKeyBase64?: string, hashAlgorithm?: 'sha256'): Promise<VerificationResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Quick integrity check - returns true/false without detailed errors.
|
|
31
|
+
*/
|
|
32
|
+
static isValid(events: SignedEvent[], publicKeyBase64?: string): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Verify a sub-chain (range of events) within a larger chain.
|
|
35
|
+
* The first event's prevHash is trusted as a starting point.
|
|
36
|
+
*/
|
|
37
|
+
static verifySubChain(events: SignedEvent[], expectedStartPrevHash: string, publicKeyBase64?: string): Promise<VerificationResult>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=ChainVerifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainVerifier.d.ts","sourceRoot":"","sources":["../../../../src/core/provenance/verification/ChainVerifier.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAqB,MAAM,aAAa,CAAC;AAQtF,qBAAa,aAAa;IACxB;;;;;;;;;;;;;;;;OAgBG;WACU,MAAM,CACjB,MAAM,EAAE,WAAW,EAAE,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,aAAa,GAAE,QAAmB,GACjC,OAAO,CAAC,kBAAkB,CAAC;IAyJ9B;;OAEG;WACU,OAAO,CAClB,MAAM,EAAE,WAAW,EAAE,EACrB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,OAAO,CAAC;IAKnB;;;OAGG;WACU,cAAc,CACzB,MAAM,EAAE,WAAW,EAAE,EACrB,qBAAqB,EAAE,MAAM,EAC7B,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,kBAAkB,CAAC;CA+B/B"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file ChainVerifier.ts
|
|
3
|
+
* @description Verifies the integrity of the signed event hash chain.
|
|
4
|
+
* Checks sequence continuity, hash linkage, payload hashes, signatures,
|
|
5
|
+
* and timestamp monotonicity.
|
|
6
|
+
*
|
|
7
|
+
* @module AgentOS/Provenance/Verification
|
|
8
|
+
*/
|
|
9
|
+
import { HashChain } from '../crypto/HashChain.js';
|
|
10
|
+
import { AgentKeyManager } from '../crypto/AgentKeyManager.js';
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// ChainVerifier
|
|
13
|
+
// =============================================================================
|
|
14
|
+
export class ChainVerifier {
|
|
15
|
+
/**
|
|
16
|
+
* Verify an ordered array of signed events for chain integrity.
|
|
17
|
+
*
|
|
18
|
+
* Checks performed:
|
|
19
|
+
* 1. Sequence continuity (monotonically increasing, no gaps)
|
|
20
|
+
* 2. Hash linkage (each event's prevHash matches the prior event's hash)
|
|
21
|
+
* 3. Payload hash integrity (recomputed hash matches stored payloadHash)
|
|
22
|
+
* 4. Event hash integrity (recomputed hash matches stored hash)
|
|
23
|
+
* 5. Ed25519 signature verification (if signatures present)
|
|
24
|
+
* 6. Timestamp monotonicity (non-decreasing)
|
|
25
|
+
*
|
|
26
|
+
* @param events - Ordered array of SignedEvent objects (sorted by sequence ASC).
|
|
27
|
+
* @param publicKeyBase64 - Optional public key for signature verification.
|
|
28
|
+
* If omitted, uses each event's signerPublicKey field.
|
|
29
|
+
* @param hashAlgorithm - Hash algorithm used (default: 'sha256').
|
|
30
|
+
* @returns VerificationResult with validity status and any errors found.
|
|
31
|
+
*/
|
|
32
|
+
static async verify(events, publicKeyBase64, hashAlgorithm = 'sha256') {
|
|
33
|
+
const errors = [];
|
|
34
|
+
const warnings = [];
|
|
35
|
+
if (events.length === 0) {
|
|
36
|
+
return {
|
|
37
|
+
valid: true,
|
|
38
|
+
eventsVerified: 0,
|
|
39
|
+
errors: [],
|
|
40
|
+
warnings: ['Empty event chain provided.'],
|
|
41
|
+
verifiedAt: new Date().toISOString(),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Check first event
|
|
45
|
+
const first = events[0];
|
|
46
|
+
if (first.sequence !== 1) {
|
|
47
|
+
warnings.push(`Chain does not start at sequence 1 (starts at ${first.sequence}). Partial chain verification.`);
|
|
48
|
+
}
|
|
49
|
+
let previousEvent = null;
|
|
50
|
+
for (let i = 0; i < events.length; i++) {
|
|
51
|
+
const event = events[i];
|
|
52
|
+
// 1. Sequence continuity
|
|
53
|
+
if (previousEvent && event.sequence !== previousEvent.sequence + 1) {
|
|
54
|
+
errors.push({
|
|
55
|
+
eventId: event.id,
|
|
56
|
+
sequence: event.sequence,
|
|
57
|
+
code: 'SEQUENCE_GAP',
|
|
58
|
+
message: `Sequence gap: expected ${previousEvent.sequence + 1}, got ${event.sequence}`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// 2. Hash linkage
|
|
62
|
+
const expectedPrevHash = previousEvent ? previousEvent.hash : '';
|
|
63
|
+
if (event.prevHash !== expectedPrevHash) {
|
|
64
|
+
// Allow first event in partial chain to have any prevHash
|
|
65
|
+
if (i > 0) {
|
|
66
|
+
errors.push({
|
|
67
|
+
eventId: event.id,
|
|
68
|
+
sequence: event.sequence,
|
|
69
|
+
code: 'HASH_CHAIN_BROKEN',
|
|
70
|
+
message: `Hash chain broken at sequence ${event.sequence}: prevHash does not match previous event's hash`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// 3. Payload hash integrity
|
|
75
|
+
const recomputedPayloadHash = HashChain.computePayloadHash(event.payload, hashAlgorithm);
|
|
76
|
+
if (recomputedPayloadHash !== event.payloadHash) {
|
|
77
|
+
errors.push({
|
|
78
|
+
eventId: event.id,
|
|
79
|
+
sequence: event.sequence,
|
|
80
|
+
code: 'PAYLOAD_HASH_MISMATCH',
|
|
81
|
+
message: `Payload hash mismatch at sequence ${event.sequence}: payload may have been tampered with`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// 4. Event hash integrity
|
|
85
|
+
const recomputedEventHash = HashChain.computeEventHash({
|
|
86
|
+
sequence: event.sequence,
|
|
87
|
+
type: event.type,
|
|
88
|
+
timestamp: event.timestamp,
|
|
89
|
+
agentId: event.agentId,
|
|
90
|
+
prevHash: event.prevHash,
|
|
91
|
+
payloadHash: event.payloadHash,
|
|
92
|
+
}, hashAlgorithm);
|
|
93
|
+
if (recomputedEventHash !== event.hash) {
|
|
94
|
+
errors.push({
|
|
95
|
+
eventId: event.id,
|
|
96
|
+
sequence: event.sequence,
|
|
97
|
+
code: 'EVENT_HASH_MISMATCH',
|
|
98
|
+
message: `Event hash mismatch at sequence ${event.sequence}: event data may have been tampered with`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// 5. Signature verification
|
|
102
|
+
if (event.signature && event.signature.length > 0) {
|
|
103
|
+
const pubKey = publicKeyBase64 || event.signerPublicKey;
|
|
104
|
+
if (pubKey) {
|
|
105
|
+
try {
|
|
106
|
+
const isValid = await AgentKeyManager.verifySignature(event.hash, event.signature, pubKey);
|
|
107
|
+
if (!isValid) {
|
|
108
|
+
errors.push({
|
|
109
|
+
eventId: event.id,
|
|
110
|
+
sequence: event.sequence,
|
|
111
|
+
code: 'SIGNATURE_INVALID',
|
|
112
|
+
message: `Invalid signature at sequence ${event.sequence}`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
errors.push({
|
|
118
|
+
eventId: event.id,
|
|
119
|
+
sequence: event.sequence,
|
|
120
|
+
code: 'SIGNATURE_INVALID',
|
|
121
|
+
message: `Signature verification failed at sequence ${event.sequence}: ${e.message}`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
warnings.push(`Event ${event.id} (seq ${event.sequence}) has signature but no public key for verification.`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// 6. Timestamp monotonicity
|
|
130
|
+
if (previousEvent) {
|
|
131
|
+
const prevTime = new Date(previousEvent.timestamp).getTime();
|
|
132
|
+
const currTime = new Date(event.timestamp).getTime();
|
|
133
|
+
if (currTime < prevTime) {
|
|
134
|
+
errors.push({
|
|
135
|
+
eventId: event.id,
|
|
136
|
+
sequence: event.sequence,
|
|
137
|
+
code: 'TIMESTAMP_REGRESSION',
|
|
138
|
+
message: `Timestamp regression at sequence ${event.sequence}: ${event.timestamp} is before ${previousEvent.timestamp}`,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
previousEvent = event;
|
|
143
|
+
}
|
|
144
|
+
// Check agent ID consistency
|
|
145
|
+
const agentIds = new Set(events.map(e => e.agentId));
|
|
146
|
+
if (agentIds.size > 1) {
|
|
147
|
+
warnings.push(`Multiple agent IDs found in chain: ${[...agentIds].join(', ')}. This may indicate events from different agents.`);
|
|
148
|
+
}
|
|
149
|
+
// Check signer key consistency
|
|
150
|
+
const signerKeys = new Set(events.filter(e => e.signerPublicKey).map(e => e.signerPublicKey));
|
|
151
|
+
if (signerKeys.size > 1) {
|
|
152
|
+
warnings.push(`Multiple signer public keys found. Key rotation may have occurred.`);
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
valid: errors.length === 0,
|
|
156
|
+
eventsVerified: events.length,
|
|
157
|
+
errors,
|
|
158
|
+
warnings,
|
|
159
|
+
firstSequence: events[0].sequence,
|
|
160
|
+
lastSequence: events[events.length - 1].sequence,
|
|
161
|
+
agentId: events[0].agentId,
|
|
162
|
+
verifiedAt: new Date().toISOString(),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Quick integrity check - returns true/false without detailed errors.
|
|
167
|
+
*/
|
|
168
|
+
static async isValid(events, publicKeyBase64) {
|
|
169
|
+
const result = await ChainVerifier.verify(events, publicKeyBase64);
|
|
170
|
+
return result.valid;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Verify a sub-chain (range of events) within a larger chain.
|
|
174
|
+
* The first event's prevHash is trusted as a starting point.
|
|
175
|
+
*/
|
|
176
|
+
static async verifySubChain(events, expectedStartPrevHash, publicKeyBase64) {
|
|
177
|
+
if (events.length === 0) {
|
|
178
|
+
return {
|
|
179
|
+
valid: true,
|
|
180
|
+
eventsVerified: 0,
|
|
181
|
+
errors: [],
|
|
182
|
+
warnings: ['Empty sub-chain provided.'],
|
|
183
|
+
verifiedAt: new Date().toISOString(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
const errors = [];
|
|
187
|
+
// Verify the sub-chain connects to the expected starting point
|
|
188
|
+
if (events[0].prevHash !== expectedStartPrevHash) {
|
|
189
|
+
errors.push({
|
|
190
|
+
eventId: events[0].id,
|
|
191
|
+
sequence: events[0].sequence,
|
|
192
|
+
code: 'HASH_CHAIN_BROKEN',
|
|
193
|
+
message: `Sub-chain does not connect: expected prevHash '${expectedStartPrevHash}', got '${events[0].prevHash}'`,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const chainResult = await ChainVerifier.verify(events, publicKeyBase64);
|
|
197
|
+
return {
|
|
198
|
+
...chainResult,
|
|
199
|
+
valid: chainResult.valid && errors.length === 0,
|
|
200
|
+
errors: [...errors, ...chainResult.errors],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=ChainVerifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainVerifier.js","sourceRoot":"","sources":["../../../../src/core/provenance/verification/ChainVerifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file ConversationVerifier.ts
|
|
3
|
+
* @description Convenience verifier for conversation-level provenance checks.
|
|
4
|
+
* Filters events by conversation ID and verifies the sub-chain.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Verification
|
|
7
|
+
*/
|
|
8
|
+
import type { VerificationResult } from '../types.js';
|
|
9
|
+
import type { SignedEventLedger } from '../ledger/SignedEventLedger.js';
|
|
10
|
+
export interface ConversationVerificationResult extends VerificationResult {
|
|
11
|
+
conversationId: string;
|
|
12
|
+
messageCount: number;
|
|
13
|
+
hasGenesis: boolean;
|
|
14
|
+
hasHumanInterventions: boolean;
|
|
15
|
+
humanInterventionCount: number;
|
|
16
|
+
isFullyAutonomous: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class ConversationVerifier {
|
|
19
|
+
private readonly ledger;
|
|
20
|
+
constructor(ledger: SignedEventLedger);
|
|
21
|
+
/**
|
|
22
|
+
* Verify the provenance chain for a specific conversation.
|
|
23
|
+
*
|
|
24
|
+
* @param conversationId - The conversation ID to verify.
|
|
25
|
+
* @param publicKeyBase64 - Optional public key for signature verification.
|
|
26
|
+
* @returns Detailed verification result including conversation-specific metadata.
|
|
27
|
+
*/
|
|
28
|
+
verifyConversation(conversationId: string, publicKeyBase64?: string): Promise<ConversationVerificationResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Verify a single post/message within a conversation.
|
|
31
|
+
* Checks that the message event exists and its chain position is valid.
|
|
32
|
+
*
|
|
33
|
+
* @param messageId - The message ID to verify.
|
|
34
|
+
* @param publicKeyBase64 - Optional public key for signature verification.
|
|
35
|
+
*/
|
|
36
|
+
verifyMessage(messageId: string, publicKeyBase64?: string): Promise<VerificationResult & {
|
|
37
|
+
messageId: string;
|
|
38
|
+
found: boolean;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Get a summary of provenance status for a conversation.
|
|
42
|
+
* Lighter than full verification - just counts and metadata.
|
|
43
|
+
*/
|
|
44
|
+
getProvenanceSummary(conversationId: string): Promise<{
|
|
45
|
+
conversationId: string;
|
|
46
|
+
totalEvents: number;
|
|
47
|
+
messageEvents: number;
|
|
48
|
+
revisionEvents: number;
|
|
49
|
+
tombstoneEvents: number;
|
|
50
|
+
humanInterventions: number;
|
|
51
|
+
hasGenesis: boolean;
|
|
52
|
+
chainLength: number;
|
|
53
|
+
lastEventTimestamp: string | null;
|
|
54
|
+
}>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=ConversationVerifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationVerifier.d.ts","sourceRoot":"","sources":["../../../../src/core/provenance/verification/ConversationVerifier.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAe,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAOxE,MAAM,WAAW,8BAA+B,SAAQ,kBAAkB;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAMD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;gBAE/B,MAAM,EAAE,iBAAiB;IAIrC;;;;;;OAMG;IACG,kBAAkB,CACtB,cAAc,EAAE,MAAM,EACtB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,8BAA8B,CAAC;IA2C1C;;;;;;OAMG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,kBAAkB,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAkCtE;;;OAGG;IACG,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QAC1D,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC,CAAC;CAwBH"}
|