@framers/agentos 0.1.6 → 0.1.8
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 +100 -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 +360 -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 +8 -0
- package/dist/extensions/ExtensionManager.d.ts.map +1 -1
- package/dist/extensions/ExtensionManager.js +58 -3
- 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/manifest.d.ts +3 -1
- package/dist/extensions/manifest.d.ts.map +1 -1
- 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 +23 -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 +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -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/dist/voice/CallManager.d.ts +116 -0
- package/dist/voice/CallManager.d.ts.map +1 -0
- package/dist/voice/CallManager.js +426 -0
- package/dist/voice/CallManager.js.map +1 -0
- package/dist/voice/IVoiceCallProvider.d.ts +137 -0
- package/dist/voice/IVoiceCallProvider.d.ts.map +1 -0
- package/dist/voice/IVoiceCallProvider.js +11 -0
- package/dist/voice/IVoiceCallProvider.js.map +1 -0
- package/dist/voice/index.d.ts +10 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +8 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/providers/mock.d.ts +74 -0
- package/dist/voice/providers/mock.d.ts.map +1 -0
- package/dist/voice/providers/mock.js +199 -0
- package/dist/voice/providers/mock.js.map +1 -0
- package/dist/voice/telephony-audio.d.ts +42 -0
- package/dist/voice/telephony-audio.d.ts.map +1 -0
- package/dist/voice/telephony-audio.js +150 -0
- package/dist/voice/telephony-audio.js.map +1 -0
- package/dist/voice/types.d.ts +260 -0
- package/dist/voice/types.d.ts.map +1 -0
- package/dist/voice/types.js +36 -0
- package/dist/voice/types.js.map +1 -0
- package/package.json +22 -6
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file PolicyProfiles.ts
|
|
3
|
+
* @description Preset policy profiles for common provenance configurations.
|
|
4
|
+
* Provides mutableDev(), revisionedVerified(), and sealedAutonomous() presets.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Config
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Policy profiles for quick configuration.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { profiles } from '@framers/agentos/provenance';
|
|
14
|
+
*
|
|
15
|
+
* // For development:
|
|
16
|
+
* const config = profiles.mutableDev();
|
|
17
|
+
*
|
|
18
|
+
* // For production with audit trail:
|
|
19
|
+
* const config = profiles.revisionedVerified();
|
|
20
|
+
*
|
|
21
|
+
* // For autonomous agents:
|
|
22
|
+
* const config = profiles.sealedAutonomous();
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export const profiles = {
|
|
26
|
+
/**
|
|
27
|
+
* Mutable (development) mode.
|
|
28
|
+
* No enforcement, no signing, no restrictions.
|
|
29
|
+
* Standard app semantics with optional ledger.
|
|
30
|
+
*/
|
|
31
|
+
mutableDev() {
|
|
32
|
+
return {
|
|
33
|
+
storagePolicy: {
|
|
34
|
+
mode: 'mutable',
|
|
35
|
+
},
|
|
36
|
+
provenance: {
|
|
37
|
+
enabled: false,
|
|
38
|
+
signatureMode: 'anchor-only',
|
|
39
|
+
hashAlgorithm: 'sha256',
|
|
40
|
+
keySource: { type: 'generate' },
|
|
41
|
+
},
|
|
42
|
+
autonomy: {
|
|
43
|
+
allowHumanPrompting: true,
|
|
44
|
+
allowConfigEdits: true,
|
|
45
|
+
allowToolChanges: true,
|
|
46
|
+
},
|
|
47
|
+
anchorIntervalMs: 0,
|
|
48
|
+
anchorBatchSize: 0,
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
/**
|
|
52
|
+
* Revisioned (verifiable) mode.
|
|
53
|
+
* Edits become revisions. Deletes become tombstones.
|
|
54
|
+
* Full signed event ledger with periodic anchoring.
|
|
55
|
+
* Humans can still interact, but all changes are tracked.
|
|
56
|
+
*/
|
|
57
|
+
revisionedVerified() {
|
|
58
|
+
return {
|
|
59
|
+
storagePolicy: {
|
|
60
|
+
mode: 'revisioned',
|
|
61
|
+
},
|
|
62
|
+
provenance: {
|
|
63
|
+
enabled: true,
|
|
64
|
+
signatureMode: 'every-event',
|
|
65
|
+
hashAlgorithm: 'sha256',
|
|
66
|
+
keySource: { type: 'generate' },
|
|
67
|
+
},
|
|
68
|
+
autonomy: {
|
|
69
|
+
allowHumanPrompting: true,
|
|
70
|
+
allowConfigEdits: true,
|
|
71
|
+
allowToolChanges: true,
|
|
72
|
+
},
|
|
73
|
+
anchorIntervalMs: 300000, // 5 minutes
|
|
74
|
+
anchorBatchSize: 100,
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
/**
|
|
78
|
+
* Sealed (autonomous) mode.
|
|
79
|
+
* Append-only storage. No human prompting after genesis.
|
|
80
|
+
* Signed event ledger with frequent anchoring.
|
|
81
|
+
* Required for "Verified Autonomous" badge.
|
|
82
|
+
*/
|
|
83
|
+
sealedAutonomous() {
|
|
84
|
+
return {
|
|
85
|
+
storagePolicy: {
|
|
86
|
+
mode: 'sealed',
|
|
87
|
+
protectedTables: [
|
|
88
|
+
'conversations',
|
|
89
|
+
'conversation_messages',
|
|
90
|
+
'messages',
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
provenance: {
|
|
94
|
+
enabled: true,
|
|
95
|
+
signatureMode: 'every-event',
|
|
96
|
+
hashAlgorithm: 'sha256',
|
|
97
|
+
keySource: { type: 'generate' },
|
|
98
|
+
},
|
|
99
|
+
autonomy: {
|
|
100
|
+
allowHumanPrompting: false,
|
|
101
|
+
allowConfigEdits: false,
|
|
102
|
+
allowToolChanges: false,
|
|
103
|
+
allowedHumanActions: ['pause', 'stop', 'approve_gated_action'],
|
|
104
|
+
},
|
|
105
|
+
anchorIntervalMs: 60000, // 1 minute
|
|
106
|
+
anchorBatchSize: 50,
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
/**
|
|
110
|
+
* Sealed mode with Rekor transparency log anchoring.
|
|
111
|
+
* Suitable for publicly auditable autonomous agents.
|
|
112
|
+
*
|
|
113
|
+
* Requires `@framers/agentos-ext-anchor-providers` extension
|
|
114
|
+
* with `registerExtensionProviders()` called at startup.
|
|
115
|
+
*/
|
|
116
|
+
sealedAuditable(rekorEndpoint) {
|
|
117
|
+
return profiles.custom(profiles.sealedAutonomous(), {
|
|
118
|
+
provenance: {
|
|
119
|
+
enabled: true,
|
|
120
|
+
signatureMode: 'every-event',
|
|
121
|
+
hashAlgorithm: 'sha256',
|
|
122
|
+
keySource: { type: 'generate' },
|
|
123
|
+
anchorTarget: {
|
|
124
|
+
type: 'rekor',
|
|
125
|
+
endpoint: rekorEndpoint ?? 'https://rekor.sigstore.dev',
|
|
126
|
+
options: { serverUrl: rekorEndpoint ?? 'https://rekor.sigstore.dev' },
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
},
|
|
131
|
+
/**
|
|
132
|
+
* Create a custom profile by merging overrides onto a base.
|
|
133
|
+
*/
|
|
134
|
+
custom(base, overrides) {
|
|
135
|
+
return {
|
|
136
|
+
...base,
|
|
137
|
+
...overrides,
|
|
138
|
+
storagePolicy: { ...base.storagePolicy, ...overrides.storagePolicy },
|
|
139
|
+
provenance: { ...base.provenance, ...overrides.provenance },
|
|
140
|
+
autonomy: { ...base.autonomy, ...overrides.autonomy },
|
|
141
|
+
};
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=PolicyProfiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolicyProfiles.js","sourceRoot":"","sources":["../../../../src/core/provenance/config/PolicyProfiles.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB;;;;OAIG;IACH,UAAU;QACR,OAAO;YACL,aAAa,EAAE;gBACb,IAAI,EAAE,SAAS;aAChB;YACD,UAAU,EAAE;gBACV,OAAO,EAAE,KAAK;gBACd,aAAa,EAAE,aAAa;gBAC5B,aAAa,EAAE,QAAQ;gBACvB,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aAChC;YACD,QAAQ,EAAE;gBACR,mBAAmB,EAAE,IAAI;gBACzB,gBAAgB,EAAE,IAAI;gBACtB,gBAAgB,EAAE,IAAI;aACvB;YACD,gBAAgB,EAAE,CAAC;YACnB,eAAe,EAAE,CAAC;SACnB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,kBAAkB;QAChB,OAAO;YACL,aAAa,EAAE;gBACb,IAAI,EAAE,YAAY;aACnB;YACD,UAAU,EAAE;gBACV,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,aAAa;gBAC5B,aAAa,EAAE,QAAQ;gBACvB,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aAChC;YACD,QAAQ,EAAE;gBACR,mBAAmB,EAAE,IAAI;gBACzB,gBAAgB,EAAE,IAAI;gBACtB,gBAAgB,EAAE,IAAI;aACvB;YACD,gBAAgB,EAAE,MAAO,EAAE,YAAY;YACvC,eAAe,EAAE,GAAG;SACrB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,gBAAgB;QACd,OAAO;YACL,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,eAAe,EAAE;oBACf,eAAe;oBACf,uBAAuB;oBACvB,UAAU;iBACX;aACF;YACD,UAAU,EAAE;gBACV,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,aAAa;gBAC5B,aAAa,EAAE,QAAQ;gBACvB,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aAChC;YACD,QAAQ,EAAE;gBACR,mBAAmB,EAAE,KAAK;gBAC1B,gBAAgB,EAAE,KAAK;gBACvB,gBAAgB,EAAE,KAAK;gBACvB,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,sBAAsB,CAAC;aAC/D;YACD,gBAAgB,EAAE,KAAM,EAAE,WAAW;YACrC,eAAe,EAAE,EAAE;SACpB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,aAAsB;QACpC,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE;YAClD,UAAU,EAAE;gBACV,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,aAAa;gBAC5B,aAAa,EAAE,QAAQ;gBACvB,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;gBAC/B,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,aAAa,IAAI,4BAA4B;oBACvD,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,IAAI,4BAA4B,EAAE;iBACtE;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CACJ,IAA4B,EAC5B,SAA0C;QAE1C,OAAO;YACL,GAAG,IAAI;YACP,GAAG,SAAS;YACZ,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,aAAa,EAAE;YACpE,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,UAAU,EAAE;YAC3D,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE;SACtD,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file AgentKeyManager.ts
|
|
3
|
+
* @description Ed25519 keypair generation, signing, and verification.
|
|
4
|
+
* Uses Node.js `crypto` module on server; falls back to `@noble/ed25519` in browser.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Crypto
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentKeySource } from '../types.js';
|
|
9
|
+
export declare class AgentKeyManager {
|
|
10
|
+
private privateKey;
|
|
11
|
+
private publicKey;
|
|
12
|
+
readonly agentId: string;
|
|
13
|
+
private constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Generate a new Ed25519 keypair.
|
|
16
|
+
*/
|
|
17
|
+
static generate(agentId: string): Promise<AgentKeyManager>;
|
|
18
|
+
/**
|
|
19
|
+
* Create from an imported key source configuration.
|
|
20
|
+
*/
|
|
21
|
+
static fromKeySource(agentId: string, source: AgentKeySource): Promise<AgentKeyManager>;
|
|
22
|
+
/**
|
|
23
|
+
* Sign data and return a base64-encoded signature.
|
|
24
|
+
*/
|
|
25
|
+
sign(data: string): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Verify a signature against data using a public key.
|
|
28
|
+
* Can verify using this instance's key or a provided external key.
|
|
29
|
+
*/
|
|
30
|
+
verify(data: string, signatureBase64: string, publicKeyBase64?: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Static verification using only a public key (no instance needed).
|
|
33
|
+
*/
|
|
34
|
+
static verifySignature(data: string, signatureBase64: string, publicKeyBase64: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the base64-encoded public key.
|
|
37
|
+
*/
|
|
38
|
+
getPublicKeyBase64(): string;
|
|
39
|
+
/**
|
|
40
|
+
* Get the base64-encoded private key (for persistence).
|
|
41
|
+
*/
|
|
42
|
+
getPrivateKeyBase64(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Export as an AgentKeySource for serialization.
|
|
45
|
+
*/
|
|
46
|
+
toKeySource(): AgentKeySource;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=AgentKeyManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentKeyManager.d.ts","sourceRoot":"","sources":["../../../../src/core/provenance/crypto/AgentKeyManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkBlD,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,SAAS,CAAsB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO;IAUP;;OAEG;WACU,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAkBhE;;OAEG;WACU,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAc7F;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBzC;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA8B/F;;OAEG;WACU,eAAe,CAC1B,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,CAAC;IA2BnB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,WAAW,IAAI,cAAc;CAO9B"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file AgentKeyManager.ts
|
|
3
|
+
* @description Ed25519 keypair generation, signing, and verification.
|
|
4
|
+
* Uses Node.js `crypto` module on server; falls back to `@noble/ed25519` in browser.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Crypto
|
|
7
|
+
*/
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// Runtime Detection
|
|
10
|
+
// =============================================================================
|
|
11
|
+
let nodeCrypto;
|
|
12
|
+
try {
|
|
13
|
+
// Dynamic import for Node.js runtime
|
|
14
|
+
nodeCrypto = await import('node:crypto');
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Not in Node.js environment
|
|
18
|
+
}
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// AgentKeyManager
|
|
21
|
+
// =============================================================================
|
|
22
|
+
export class AgentKeyManager {
|
|
23
|
+
constructor(agentId, privateKey, publicKey) {
|
|
24
|
+
this.agentId = agentId;
|
|
25
|
+
this.privateKey = privateKey;
|
|
26
|
+
this.publicKey = publicKey;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generate a new Ed25519 keypair.
|
|
30
|
+
*/
|
|
31
|
+
static async generate(agentId) {
|
|
32
|
+
if (nodeCrypto) {
|
|
33
|
+
const { publicKey, privateKey } = nodeCrypto.generateKeyPairSync('ed25519');
|
|
34
|
+
return new AgentKeyManager(agentId, privateKey.export({ type: 'pkcs8', format: 'der' }), publicKey.export({ type: 'spki', format: 'der' }));
|
|
35
|
+
}
|
|
36
|
+
// Browser fallback via @noble/ed25519
|
|
37
|
+
// @ts-ignore -- optional peer dependency, only used in browser environments
|
|
38
|
+
const noble = await import('@noble/ed25519');
|
|
39
|
+
const privKey = noble.utils.randomPrivateKey();
|
|
40
|
+
const pubKey = await noble.getPublicKeyAsync(privKey);
|
|
41
|
+
return new AgentKeyManager(agentId, privKey, pubKey);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create from an imported key source configuration.
|
|
45
|
+
*/
|
|
46
|
+
static async fromKeySource(agentId, source) {
|
|
47
|
+
if (source.type === 'generate') {
|
|
48
|
+
return AgentKeyManager.generate(agentId);
|
|
49
|
+
}
|
|
50
|
+
if (!source.privateKeyBase64 || !source.publicKeyBase64) {
|
|
51
|
+
throw new Error('AgentKeyManager: import requires both privateKeyBase64 and publicKeyBase64');
|
|
52
|
+
}
|
|
53
|
+
const privateKey = Buffer.from(source.privateKeyBase64, 'base64');
|
|
54
|
+
const publicKey = Buffer.from(source.publicKeyBase64, 'base64');
|
|
55
|
+
return new AgentKeyManager(agentId, privateKey, publicKey);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Sign data and return a base64-encoded signature.
|
|
59
|
+
*/
|
|
60
|
+
async sign(data) {
|
|
61
|
+
const dataBuffer = Buffer.from(data, 'utf-8');
|
|
62
|
+
if (nodeCrypto) {
|
|
63
|
+
const keyObject = nodeCrypto.createPrivateKey({
|
|
64
|
+
key: this.privateKey,
|
|
65
|
+
format: 'der',
|
|
66
|
+
type: 'pkcs8',
|
|
67
|
+
});
|
|
68
|
+
const signature = nodeCrypto.sign(null, dataBuffer, keyObject);
|
|
69
|
+
return signature.toString('base64');
|
|
70
|
+
}
|
|
71
|
+
// Browser fallback
|
|
72
|
+
// @ts-ignore -- optional peer dependency, only used in browser environments
|
|
73
|
+
const noble = await import('@noble/ed25519');
|
|
74
|
+
const sig = await noble.signAsync(dataBuffer, this.privateKey);
|
|
75
|
+
return Buffer.from(sig).toString('base64');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Verify a signature against data using a public key.
|
|
79
|
+
* Can verify using this instance's key or a provided external key.
|
|
80
|
+
*/
|
|
81
|
+
async verify(data, signatureBase64, publicKeyBase64) {
|
|
82
|
+
const dataBuffer = Buffer.from(data, 'utf-8');
|
|
83
|
+
const sigBuffer = Buffer.from(signatureBase64, 'base64');
|
|
84
|
+
const pubKeyBytes = publicKeyBase64
|
|
85
|
+
? Buffer.from(publicKeyBase64, 'base64')
|
|
86
|
+
: this.publicKey;
|
|
87
|
+
if (nodeCrypto) {
|
|
88
|
+
try {
|
|
89
|
+
const keyObject = nodeCrypto.createPublicKey({
|
|
90
|
+
key: pubKeyBytes,
|
|
91
|
+
format: 'der',
|
|
92
|
+
type: 'spki',
|
|
93
|
+
});
|
|
94
|
+
return nodeCrypto.verify(null, dataBuffer, keyObject, sigBuffer);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Browser fallback
|
|
101
|
+
try {
|
|
102
|
+
// @ts-ignore -- optional peer dependency, only used in browser environments
|
|
103
|
+
const noble = await import('@noble/ed25519');
|
|
104
|
+
return await noble.verifyAsync(sigBuffer, dataBuffer, pubKeyBytes);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Static verification using only a public key (no instance needed).
|
|
112
|
+
*/
|
|
113
|
+
static async verifySignature(data, signatureBase64, publicKeyBase64) {
|
|
114
|
+
const dataBuffer = Buffer.from(data, 'utf-8');
|
|
115
|
+
const sigBuffer = Buffer.from(signatureBase64, 'base64');
|
|
116
|
+
const pubKeyBytes = Buffer.from(publicKeyBase64, 'base64');
|
|
117
|
+
if (nodeCrypto) {
|
|
118
|
+
try {
|
|
119
|
+
const keyObject = nodeCrypto.createPublicKey({
|
|
120
|
+
key: pubKeyBytes,
|
|
121
|
+
format: 'der',
|
|
122
|
+
type: 'spki',
|
|
123
|
+
});
|
|
124
|
+
return nodeCrypto.verify(null, dataBuffer, keyObject, sigBuffer);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
// @ts-ignore -- optional peer dependency, only used in browser environments
|
|
132
|
+
const noble = await import('@noble/ed25519');
|
|
133
|
+
return await noble.verifyAsync(sigBuffer, dataBuffer, pubKeyBytes);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get the base64-encoded public key.
|
|
141
|
+
*/
|
|
142
|
+
getPublicKeyBase64() {
|
|
143
|
+
return Buffer.from(this.publicKey).toString('base64');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get the base64-encoded private key (for persistence).
|
|
147
|
+
*/
|
|
148
|
+
getPrivateKeyBase64() {
|
|
149
|
+
return Buffer.from(this.privateKey).toString('base64');
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Export as an AgentKeySource for serialization.
|
|
153
|
+
*/
|
|
154
|
+
toKeySource() {
|
|
155
|
+
return {
|
|
156
|
+
type: 'import',
|
|
157
|
+
privateKeyBase64: this.getPrivateKeyBase64(),
|
|
158
|
+
publicKeyBase64: this.getPublicKeyBase64(),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=AgentKeyManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentKeyManager.js","sourceRoot":"","sources":["../../../../src/core/provenance/crypto/AgentKeyManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file HashChain.ts
|
|
3
|
+
* @description SHA-256 hash chain for provenance events.
|
|
4
|
+
* Computes deterministic hashes using a canonical preimage format.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Crypto
|
|
7
|
+
*/
|
|
8
|
+
import type { ProvenanceEventType } from '../types.js';
|
|
9
|
+
export declare class HashChain {
|
|
10
|
+
private lastHash;
|
|
11
|
+
private sequence;
|
|
12
|
+
constructor(initialHash?: string, initialSequence?: number);
|
|
13
|
+
/**
|
|
14
|
+
* Get the current sequence number.
|
|
15
|
+
*/
|
|
16
|
+
getSequence(): number;
|
|
17
|
+
/**
|
|
18
|
+
* Get the hash of the last event in the chain.
|
|
19
|
+
*/
|
|
20
|
+
getLastHash(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Advance the chain: increment sequence, return the new sequence and prevHash.
|
|
23
|
+
*/
|
|
24
|
+
advance(): {
|
|
25
|
+
sequence: number;
|
|
26
|
+
prevHash: string;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Record a hash as the new chain head (call after event is persisted).
|
|
30
|
+
*/
|
|
31
|
+
recordHash(hash: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Compute the SHA-256 hash of an event's preimage.
|
|
34
|
+
* Preimage format: `${sequence}|${type}|${timestamp}|${agentId}|${prevHash}|${payloadHash}`
|
|
35
|
+
*/
|
|
36
|
+
static computeEventHash(event: {
|
|
37
|
+
sequence: number;
|
|
38
|
+
type: ProvenanceEventType;
|
|
39
|
+
timestamp: string;
|
|
40
|
+
agentId: string;
|
|
41
|
+
prevHash: string;
|
|
42
|
+
payloadHash: string;
|
|
43
|
+
}, algorithm?: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Compute the SHA-256 hash of a payload object using canonical JSON.
|
|
46
|
+
* Canonical = sorted keys recursively for deterministic output.
|
|
47
|
+
*/
|
|
48
|
+
static computePayloadHash(payload: Record<string, unknown>, algorithm?: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Produce canonical JSON: keys sorted lexicographically at every level.
|
|
51
|
+
*/
|
|
52
|
+
static canonicalJSON(obj: unknown): string;
|
|
53
|
+
/**
|
|
54
|
+
* Compute a generic SHA-256 hash of a string.
|
|
55
|
+
*/
|
|
56
|
+
static hash(data: string, algorithm?: string): string;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=HashChain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HashChain.d.ts","sourceRoot":"","sources":["../../../../src/core/provenance/crypto/HashChain.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAMpE,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,QAAQ,CAAa;gBAEjB,WAAW,GAAE,MAAW,EAAE,eAAe,GAAE,MAAU;IAKjE;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,OAAO,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAQjD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,mBAAmB,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,EAAE,SAAS,GAAE,MAAiB,GAAG,MAAM;IAKxC;;;OAGG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAE,MAAiB,GAAG,MAAM;IAKjG;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAe1C;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB,GAAG,MAAM;CAGhE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file HashChain.ts
|
|
3
|
+
* @description SHA-256 hash chain for provenance events.
|
|
4
|
+
* Computes deterministic hashes using a canonical preimage format.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Crypto
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// HashChain
|
|
11
|
+
// =============================================================================
|
|
12
|
+
export class HashChain {
|
|
13
|
+
constructor(initialHash = '', initialSequence = 0) {
|
|
14
|
+
this.lastHash = '';
|
|
15
|
+
this.sequence = 0;
|
|
16
|
+
this.lastHash = initialHash;
|
|
17
|
+
this.sequence = initialSequence;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the current sequence number.
|
|
21
|
+
*/
|
|
22
|
+
getSequence() {
|
|
23
|
+
return this.sequence;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the hash of the last event in the chain.
|
|
27
|
+
*/
|
|
28
|
+
getLastHash() {
|
|
29
|
+
return this.lastHash;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Advance the chain: increment sequence, return the new sequence and prevHash.
|
|
33
|
+
*/
|
|
34
|
+
advance() {
|
|
35
|
+
this.sequence += 1;
|
|
36
|
+
return {
|
|
37
|
+
sequence: this.sequence,
|
|
38
|
+
prevHash: this.lastHash,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Record a hash as the new chain head (call after event is persisted).
|
|
43
|
+
*/
|
|
44
|
+
recordHash(hash) {
|
|
45
|
+
this.lastHash = hash;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Compute the SHA-256 hash of an event's preimage.
|
|
49
|
+
* Preimage format: `${sequence}|${type}|${timestamp}|${agentId}|${prevHash}|${payloadHash}`
|
|
50
|
+
*/
|
|
51
|
+
static computeEventHash(event, algorithm = 'sha256') {
|
|
52
|
+
const preimage = `${event.sequence}|${event.type}|${event.timestamp}|${event.agentId}|${event.prevHash}|${event.payloadHash}`;
|
|
53
|
+
return createHash(algorithm).update(preimage, 'utf-8').digest('hex');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Compute the SHA-256 hash of a payload object using canonical JSON.
|
|
57
|
+
* Canonical = sorted keys recursively for deterministic output.
|
|
58
|
+
*/
|
|
59
|
+
static computePayloadHash(payload, algorithm = 'sha256') {
|
|
60
|
+
const canonical = HashChain.canonicalJSON(payload);
|
|
61
|
+
return createHash(algorithm).update(canonical, 'utf-8').digest('hex');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Produce canonical JSON: keys sorted lexicographically at every level.
|
|
65
|
+
*/
|
|
66
|
+
static canonicalJSON(obj) {
|
|
67
|
+
if (obj === null || obj === undefined)
|
|
68
|
+
return JSON.stringify(obj);
|
|
69
|
+
if (typeof obj !== 'object')
|
|
70
|
+
return JSON.stringify(obj);
|
|
71
|
+
if (Array.isArray(obj)) {
|
|
72
|
+
return '[' + obj.map(item => HashChain.canonicalJSON(item)).join(',') + ']';
|
|
73
|
+
}
|
|
74
|
+
const record = obj;
|
|
75
|
+
const sortedKeys = Object.keys(record).sort();
|
|
76
|
+
const entries = sortedKeys.map(key => `${JSON.stringify(key)}:${HashChain.canonicalJSON(record[key])}`);
|
|
77
|
+
return '{' + entries.join(',') + '}';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Compute a generic SHA-256 hash of a string.
|
|
81
|
+
*/
|
|
82
|
+
static hash(data, algorithm = 'sha256') {
|
|
83
|
+
return createHash(algorithm).update(data, 'utf-8').digest('hex');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=HashChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HashChain.js","sourceRoot":"","sources":["../../../../src/core/provenance/crypto/HashChain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file MerkleTree.ts
|
|
3
|
+
* @description Merkle tree computation for anchoring provenance events.
|
|
4
|
+
* Computes a root hash from a list of leaf hashes.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Crypto
|
|
7
|
+
*/
|
|
8
|
+
export declare class MerkleTree {
|
|
9
|
+
/**
|
|
10
|
+
* Compute the Merkle root of a list of leaf hashes.
|
|
11
|
+
* If the number of leaves is odd, the last leaf is duplicated.
|
|
12
|
+
* Returns empty string for empty input.
|
|
13
|
+
*/
|
|
14
|
+
static computeRoot(leaves: string[], algorithm?: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Compute a Merkle inclusion proof for a leaf at a given index.
|
|
17
|
+
* Returns the sibling hashes needed to reconstruct the root.
|
|
18
|
+
*/
|
|
19
|
+
static computeProof(leaves: string[], leafIndex: number, algorithm?: string): MerkleProof;
|
|
20
|
+
/**
|
|
21
|
+
* Verify a Merkle inclusion proof.
|
|
22
|
+
*/
|
|
23
|
+
static verifyProof(proof: MerkleProof, algorithm?: string): boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface MerkleProofStep {
|
|
26
|
+
/** Sibling hash at this level. */
|
|
27
|
+
hash: string;
|
|
28
|
+
/** Position of the sibling relative to the current node. */
|
|
29
|
+
position: 'left' | 'right';
|
|
30
|
+
}
|
|
31
|
+
export interface MerkleProof {
|
|
32
|
+
/** Hash of the leaf being proved. */
|
|
33
|
+
leafHash: string;
|
|
34
|
+
/** Index of the leaf in the original list. */
|
|
35
|
+
leafIndex: number;
|
|
36
|
+
/** Ordered sibling hashes for reconstruction. */
|
|
37
|
+
proof: MerkleProofStep[];
|
|
38
|
+
/** Expected Merkle root. */
|
|
39
|
+
root: string;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=MerkleTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MerkleTree.d.ts","sourceRoot":"","sources":["../../../../src/core/provenance/crypto/MerkleTree.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,qBAAa,UAAU;IACrB;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAiB,GAAG,MAAM;IAwB1E;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAiB,GAC3B,WAAW;IAsCd;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,GAAE,MAAiB,GAAG,OAAO;CAY9E;AAMD,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file MerkleTree.ts
|
|
3
|
+
* @description Merkle tree computation for anchoring provenance events.
|
|
4
|
+
* Computes a root hash from a list of leaf hashes.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Crypto
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// MerkleTree
|
|
11
|
+
// =============================================================================
|
|
12
|
+
export class MerkleTree {
|
|
13
|
+
/**
|
|
14
|
+
* Compute the Merkle root of a list of leaf hashes.
|
|
15
|
+
* If the number of leaves is odd, the last leaf is duplicated.
|
|
16
|
+
* Returns empty string for empty input.
|
|
17
|
+
*/
|
|
18
|
+
static computeRoot(leaves, algorithm = 'sha256') {
|
|
19
|
+
if (leaves.length === 0)
|
|
20
|
+
return '';
|
|
21
|
+
if (leaves.length === 1)
|
|
22
|
+
return leaves[0];
|
|
23
|
+
let currentLevel = [...leaves];
|
|
24
|
+
while (currentLevel.length > 1) {
|
|
25
|
+
const nextLevel = [];
|
|
26
|
+
for (let i = 0; i < currentLevel.length; i += 2) {
|
|
27
|
+
const left = currentLevel[i];
|
|
28
|
+
// If odd number of nodes, duplicate the last one
|
|
29
|
+
const right = i + 1 < currentLevel.length ? currentLevel[i + 1] : currentLevel[i];
|
|
30
|
+
const combined = left + right;
|
|
31
|
+
const parentHash = createHash(algorithm).update(combined, 'utf-8').digest('hex');
|
|
32
|
+
nextLevel.push(parentHash);
|
|
33
|
+
}
|
|
34
|
+
currentLevel = nextLevel;
|
|
35
|
+
}
|
|
36
|
+
return currentLevel[0];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Compute a Merkle inclusion proof for a leaf at a given index.
|
|
40
|
+
* Returns the sibling hashes needed to reconstruct the root.
|
|
41
|
+
*/
|
|
42
|
+
static computeProof(leaves, leafIndex, algorithm = 'sha256') {
|
|
43
|
+
if (leafIndex < 0 || leafIndex >= leaves.length) {
|
|
44
|
+
throw new Error(`MerkleTree: leafIndex ${leafIndex} out of range [0, ${leaves.length})`);
|
|
45
|
+
}
|
|
46
|
+
const proof = [];
|
|
47
|
+
let currentLevel = [...leaves];
|
|
48
|
+
let currentIndex = leafIndex;
|
|
49
|
+
while (currentLevel.length > 1) {
|
|
50
|
+
const nextLevel = [];
|
|
51
|
+
for (let i = 0; i < currentLevel.length; i += 2) {
|
|
52
|
+
const left = currentLevel[i];
|
|
53
|
+
const right = i + 1 < currentLevel.length ? currentLevel[i + 1] : currentLevel[i];
|
|
54
|
+
if (i === currentIndex || i + 1 === currentIndex) {
|
|
55
|
+
const siblingHash = i === currentIndex ? right : left;
|
|
56
|
+
const position = i === currentIndex ? 'right' : 'left';
|
|
57
|
+
proof.push({ hash: siblingHash, position });
|
|
58
|
+
}
|
|
59
|
+
const combined = left + right;
|
|
60
|
+
nextLevel.push(createHash(algorithm).update(combined, 'utf-8').digest('hex'));
|
|
61
|
+
}
|
|
62
|
+
currentIndex = Math.floor(currentIndex / 2);
|
|
63
|
+
currentLevel = nextLevel;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
leafHash: leaves[leafIndex],
|
|
67
|
+
leafIndex,
|
|
68
|
+
proof,
|
|
69
|
+
root: currentLevel[0],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Verify a Merkle inclusion proof.
|
|
74
|
+
*/
|
|
75
|
+
static verifyProof(proof, algorithm = 'sha256') {
|
|
76
|
+
let currentHash = proof.leafHash;
|
|
77
|
+
for (const step of proof.proof) {
|
|
78
|
+
const combined = step.position === 'right'
|
|
79
|
+
? currentHash + step.hash
|
|
80
|
+
: step.hash + currentHash;
|
|
81
|
+
currentHash = createHash(algorithm).update(combined, 'utf-8').digest('hex');
|
|
82
|
+
}
|
|
83
|
+
return currentHash === proof.root;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=MerkleTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MerkleTree.js","sourceRoot":"","sources":["../../../../src/core/provenance/crypto/MerkleTree.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF,MAAM,OAAO,UAAU;IACrB;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,MAAgB,EAAE,YAAoB,QAAQ;QAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QAE1C,IAAI,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QAE/B,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,iDAAiD;gBACjD,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC;gBAC9B,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjF,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC;YAED,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,MAAgB,EAChB,SAAiB,EACjB,YAAoB,QAAQ;QAE5B,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,qBAAqB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,KAAK,GAAsB,EAAE,CAAC;QACpC,IAAI,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QAC/B,IAAI,YAAY,GAAG,SAAS,CAAC;QAE7B,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAElF,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,KAAK,YAAY,EAAE,CAAC;oBACjD,MAAM,WAAW,GAAG,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;oBACtD,MAAM,QAAQ,GAAqB,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;oBACzE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC9C,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC;gBAC9B,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAChF,CAAC;YAED,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YAC5C,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC;YAC3B,SAAS;YACT,KAAK;YACL,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAkB,EAAE,YAAoB,QAAQ;QACjE,IAAI,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,OAAO;gBACxC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI;gBACzB,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;YAC5B,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,WAAW,KAAK,KAAK,CAAC,IAAI,CAAC;IACpC,CAAC;CACF"}
|