@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,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file AutonomyGuard.ts
|
|
3
|
+
* @description Enforces autonomy rules in sealed mode.
|
|
4
|
+
* Blocks human input/prompting after genesis, logs all human interventions.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Enforcement
|
|
7
|
+
*/
|
|
8
|
+
import type { AutonomyConfig } from '../types.js';
|
|
9
|
+
import type { SignedEventLedger } from '../ledger/SignedEventLedger.js';
|
|
10
|
+
export declare class AutonomyGuard {
|
|
11
|
+
private readonly config;
|
|
12
|
+
private readonly ledger;
|
|
13
|
+
private genesisRecorded;
|
|
14
|
+
constructor(config: AutonomyConfig, ledger?: SignedEventLedger | null);
|
|
15
|
+
/**
|
|
16
|
+
* Check if a human action is allowed under the current autonomy config.
|
|
17
|
+
* Throws ProvenanceViolationError if the action is blocked.
|
|
18
|
+
*
|
|
19
|
+
* @param actionType - Type of human action (e.g., 'prompt', 'edit_config', 'add_tool', 'pause', 'stop')
|
|
20
|
+
* @param details - Optional details about the action
|
|
21
|
+
*/
|
|
22
|
+
checkHumanAction(actionType: string, details?: Record<string, unknown>): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Record the genesis event, marking the start of sealed autonomous operation.
|
|
25
|
+
*/
|
|
26
|
+
recordGenesis(genesisEventId: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if genesis has been recorded.
|
|
29
|
+
*/
|
|
30
|
+
isSealed(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Check whether a specific action type would be blocked.
|
|
33
|
+
* Returns true if the action is allowed, false if it would be blocked.
|
|
34
|
+
*/
|
|
35
|
+
wouldAllow(actionType: string): boolean;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=AutonomyGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutonomyGuard.d.ts","sourceRoot":"","sources":["../../../../src/core/provenance/enforcement/AutonomyGuard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA0B,MAAM,aAAa,CAAC;AAE1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAMxE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,eAAe,CAAkB;gBAE7B,MAAM,EAAE,cAAc,EAAE,MAAM,GAAE,iBAAiB,GAAG,IAAW;IAM3E;;;;;;OAMG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IA0EhB;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1D;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;;OAGG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;CAoBxC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file AutonomyGuard.ts
|
|
3
|
+
* @description Enforces autonomy rules in sealed mode.
|
|
4
|
+
* Blocks human input/prompting after genesis, logs all human interventions.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Enforcement
|
|
7
|
+
*/
|
|
8
|
+
import { ProvenanceViolationError } from '../types.js';
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// AutonomyGuard
|
|
11
|
+
// =============================================================================
|
|
12
|
+
export class AutonomyGuard {
|
|
13
|
+
constructor(config, ledger = null) {
|
|
14
|
+
this.genesisRecorded = false;
|
|
15
|
+
this.config = config;
|
|
16
|
+
this.ledger = ledger;
|
|
17
|
+
this.genesisRecorded = !!config.genesisEventId;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if a human action is allowed under the current autonomy config.
|
|
21
|
+
* Throws ProvenanceViolationError if the action is blocked.
|
|
22
|
+
*
|
|
23
|
+
* @param actionType - Type of human action (e.g., 'prompt', 'edit_config', 'add_tool', 'pause', 'stop')
|
|
24
|
+
* @param details - Optional details about the action
|
|
25
|
+
*/
|
|
26
|
+
async checkHumanAction(actionType, details) {
|
|
27
|
+
if (!this.genesisRecorded) {
|
|
28
|
+
// Before genesis, all human actions are allowed
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Check whitelist first
|
|
32
|
+
if (this.config.allowedHumanActions?.includes(actionType)) {
|
|
33
|
+
// Allowed but log it
|
|
34
|
+
if (this.ledger) {
|
|
35
|
+
await this.ledger.appendEvent('human.intervention', {
|
|
36
|
+
interventionType: actionType,
|
|
37
|
+
allowed: true,
|
|
38
|
+
details,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Check specific permissions
|
|
44
|
+
switch (actionType) {
|
|
45
|
+
case 'prompt':
|
|
46
|
+
case 'user_message':
|
|
47
|
+
case 'human_input':
|
|
48
|
+
if (!this.config.allowHumanPrompting) {
|
|
49
|
+
throw new ProvenanceViolationError(`Human prompting is blocked in sealed autonomous mode. Action: ${actionType}`, { code: 'AUTONOMY_HUMAN_PROMPT_BLOCKED', operation: actionType });
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
case 'edit_config':
|
|
53
|
+
case 'config_change':
|
|
54
|
+
if (!this.config.allowConfigEdits) {
|
|
55
|
+
throw new ProvenanceViolationError(`Configuration changes are blocked in sealed autonomous mode.`, { code: 'AUTONOMY_CONFIG_EDIT_BLOCKED', operation: actionType });
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
case 'add_tool':
|
|
59
|
+
case 'remove_tool':
|
|
60
|
+
case 'tool_change':
|
|
61
|
+
if (!this.config.allowToolChanges) {
|
|
62
|
+
throw new ProvenanceViolationError(`Tool changes are blocked in sealed autonomous mode.`, { code: 'AUTONOMY_TOOL_CHANGE_BLOCKED', operation: actionType });
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
// Unknown action types are blocked by default in sealed mode
|
|
67
|
+
// unless explicitly in the allowedHumanActions list
|
|
68
|
+
if (!this.config.allowHumanPrompting) {
|
|
69
|
+
throw new ProvenanceViolationError(`Human action '${actionType}' is blocked in sealed autonomous mode.`, { code: 'AUTONOMY_ACTION_BLOCKED', operation: actionType });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Log the allowed action
|
|
73
|
+
if (this.ledger) {
|
|
74
|
+
await this.ledger.appendEvent('human.intervention', {
|
|
75
|
+
interventionType: actionType,
|
|
76
|
+
allowed: true,
|
|
77
|
+
details,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Record the genesis event, marking the start of sealed autonomous operation.
|
|
83
|
+
*/
|
|
84
|
+
async recordGenesis(genesisEventId) {
|
|
85
|
+
this.config.genesisEventId = genesisEventId;
|
|
86
|
+
this.genesisRecorded = true;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if genesis has been recorded.
|
|
90
|
+
*/
|
|
91
|
+
isSealed() {
|
|
92
|
+
return this.genesisRecorded;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check whether a specific action type would be blocked.
|
|
96
|
+
* Returns true if the action is allowed, false if it would be blocked.
|
|
97
|
+
*/
|
|
98
|
+
wouldAllow(actionType) {
|
|
99
|
+
if (!this.genesisRecorded)
|
|
100
|
+
return true;
|
|
101
|
+
if (this.config.allowedHumanActions?.includes(actionType))
|
|
102
|
+
return true;
|
|
103
|
+
switch (actionType) {
|
|
104
|
+
case 'prompt':
|
|
105
|
+
case 'user_message':
|
|
106
|
+
case 'human_input':
|
|
107
|
+
return this.config.allowHumanPrompting;
|
|
108
|
+
case 'edit_config':
|
|
109
|
+
case 'config_change':
|
|
110
|
+
return this.config.allowConfigEdits;
|
|
111
|
+
case 'add_tool':
|
|
112
|
+
case 'remove_tool':
|
|
113
|
+
case 'tool_change':
|
|
114
|
+
return this.config.allowToolChanges;
|
|
115
|
+
default:
|
|
116
|
+
return this.config.allowHumanPrompting;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=AutonomyGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutonomyGuard.js","sourceRoot":"","sources":["../../../../src/core/provenance/enforcement/AutonomyGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file ProvenanceStorageHooks.ts
|
|
3
|
+
* @description StorageHooks implementation that enforces provenance policies.
|
|
4
|
+
* Integrates with sql-storage-adapter's onBeforeWrite/onAfterWrite hooks.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Enforcement
|
|
7
|
+
*/
|
|
8
|
+
import type { ProvenanceSystemConfig } from '../types.js';
|
|
9
|
+
import type { SignedEventLedger } from '../ledger/SignedEventLedger.js';
|
|
10
|
+
import type { RevisionManager } from './RevisionManager.js';
|
|
11
|
+
import type { TombstoneManager } from './TombstoneManager.js';
|
|
12
|
+
interface WriteContext {
|
|
13
|
+
readonly operation: 'run' | 'batch';
|
|
14
|
+
statement: string;
|
|
15
|
+
parameters?: unknown[];
|
|
16
|
+
affectedTables?: string[];
|
|
17
|
+
readonly inTransaction?: boolean;
|
|
18
|
+
operationId: string;
|
|
19
|
+
startTime: number;
|
|
20
|
+
adapterKind?: string;
|
|
21
|
+
metadata?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
interface StorageRunResult {
|
|
24
|
+
changes: number;
|
|
25
|
+
lastInsertRowid?: string | number | null;
|
|
26
|
+
}
|
|
27
|
+
type WriteHookResult = WriteContext | undefined | void;
|
|
28
|
+
interface StorageHooks {
|
|
29
|
+
onBeforeWrite?(context: WriteContext): Promise<WriteHookResult>;
|
|
30
|
+
onAfterWrite?(context: WriteContext, result: StorageRunResult): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create StorageHooks that enforce provenance policies.
|
|
34
|
+
*
|
|
35
|
+
* @param config - The provenance system configuration.
|
|
36
|
+
* @param ledger - The signed event ledger (optional, for logging events).
|
|
37
|
+
* @param revisionManager - For capturing revisions in revisioned mode.
|
|
38
|
+
* @param tombstoneManager - For creating tombstones in revisioned mode.
|
|
39
|
+
* @returns StorageHooks compatible with sql-storage-adapter's combineHooks().
|
|
40
|
+
*/
|
|
41
|
+
export declare function createProvenanceHooks(config: ProvenanceSystemConfig, ledger?: SignedEventLedger, revisionManager?: RevisionManager, tombstoneManager?: TombstoneManager): StorageHooks;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=ProvenanceStorageHooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProvenanceStorageHooks.d.ts","sourceRoot":"","sources":["../../../../src/core/provenance/enforcement/ProvenanceStorageHooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAuB,MAAM,aAAa,CAAC;AAE/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM9D,UAAU,YAAY;IACpB,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,KAAK,eAAe,GAAG,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC;AAEvD,UAAU,YAAY;IACpB,aAAa,CAAC,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAChE,YAAY,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AA+FD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,CAAC,EAAE,iBAAiB,EAC1B,eAAe,CAAC,EAAE,eAAe,EACjC,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,YAAY,CAkGd"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file ProvenanceStorageHooks.ts
|
|
3
|
+
* @description StorageHooks implementation that enforces provenance policies.
|
|
4
|
+
* Integrates with sql-storage-adapter's onBeforeWrite/onAfterWrite hooks.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Enforcement
|
|
7
|
+
*/
|
|
8
|
+
import { ProvenanceViolationError } from '../types.js';
|
|
9
|
+
function detectSqlOperation(statement) {
|
|
10
|
+
const trimmed = statement.trim().toUpperCase();
|
|
11
|
+
if (trimmed.startsWith('INSERT'))
|
|
12
|
+
return 'INSERT';
|
|
13
|
+
if (trimmed.startsWith('UPDATE'))
|
|
14
|
+
return 'UPDATE';
|
|
15
|
+
if (trimmed.startsWith('DELETE'))
|
|
16
|
+
return 'DELETE';
|
|
17
|
+
if (trimmed.startsWith('CREATE'))
|
|
18
|
+
return 'CREATE';
|
|
19
|
+
if (trimmed.startsWith('ALTER'))
|
|
20
|
+
return 'ALTER';
|
|
21
|
+
if (trimmed.startsWith('DROP'))
|
|
22
|
+
return 'DROP';
|
|
23
|
+
return 'UNKNOWN';
|
|
24
|
+
}
|
|
25
|
+
function extractTableFromStatement(statement) {
|
|
26
|
+
const trimmed = statement.trim();
|
|
27
|
+
// INSERT INTO <table>
|
|
28
|
+
const insertMatch = trimmed.match(/INSERT\s+(?:OR\s+\w+\s+)?INTO\s+(\S+)/i);
|
|
29
|
+
if (insertMatch)
|
|
30
|
+
return insertMatch[1];
|
|
31
|
+
// UPDATE <table>
|
|
32
|
+
const updateMatch = trimmed.match(/UPDATE\s+(\S+)/i);
|
|
33
|
+
if (updateMatch)
|
|
34
|
+
return updateMatch[1];
|
|
35
|
+
// DELETE FROM <table>
|
|
36
|
+
const deleteMatch = trimmed.match(/DELETE\s+FROM\s+(\S+)/i);
|
|
37
|
+
if (deleteMatch)
|
|
38
|
+
return deleteMatch[1];
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
function extractWhereClause(statement) {
|
|
42
|
+
const whereMatch = statement.match(/WHERE\s+(.+?)(?:;|\s*$)/i);
|
|
43
|
+
if (!whereMatch)
|
|
44
|
+
return null;
|
|
45
|
+
return { clause: whereMatch[1], params: [] };
|
|
46
|
+
}
|
|
47
|
+
function inferWhereParameters(whereClause, parameters) {
|
|
48
|
+
const positional = Array.isArray(parameters) ? parameters : [];
|
|
49
|
+
const placeholderCount = (whereClause.match(/\?/g) || []).length;
|
|
50
|
+
if (placeholderCount <= 0) {
|
|
51
|
+
return positional;
|
|
52
|
+
}
|
|
53
|
+
if (positional.length <= placeholderCount) {
|
|
54
|
+
return positional;
|
|
55
|
+
}
|
|
56
|
+
return positional.slice(positional.length - placeholderCount);
|
|
57
|
+
}
|
|
58
|
+
// =============================================================================
|
|
59
|
+
// isTableProtected
|
|
60
|
+
// =============================================================================
|
|
61
|
+
function isTableProtected(tableName, config) {
|
|
62
|
+
// Skip provenance's own tables
|
|
63
|
+
if (tableName.includes('signed_events') ||
|
|
64
|
+
tableName.includes('revisions') ||
|
|
65
|
+
tableName.includes('tombstones') ||
|
|
66
|
+
tableName.includes('anchors') ||
|
|
67
|
+
tableName.includes('agent_keys')) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
// Check exempt tables
|
|
71
|
+
if (config.exemptTables?.includes(tableName)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
// If protectedTables is specified, only those are protected
|
|
75
|
+
if (config.protectedTables && config.protectedTables.length > 0) {
|
|
76
|
+
return config.protectedTables.includes(tableName);
|
|
77
|
+
}
|
|
78
|
+
// Default: all tables are protected
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
// =============================================================================
|
|
82
|
+
// Factory: createProvenanceHooks
|
|
83
|
+
// =============================================================================
|
|
84
|
+
/**
|
|
85
|
+
* Create StorageHooks that enforce provenance policies.
|
|
86
|
+
*
|
|
87
|
+
* @param config - The provenance system configuration.
|
|
88
|
+
* @param ledger - The signed event ledger (optional, for logging events).
|
|
89
|
+
* @param revisionManager - For capturing revisions in revisioned mode.
|
|
90
|
+
* @param tombstoneManager - For creating tombstones in revisioned mode.
|
|
91
|
+
* @returns StorageHooks compatible with sql-storage-adapter's combineHooks().
|
|
92
|
+
*/
|
|
93
|
+
export function createProvenanceHooks(config, ledger, revisionManager, tombstoneManager) {
|
|
94
|
+
return {
|
|
95
|
+
onBeforeWrite: async (context) => {
|
|
96
|
+
const operation = detectSqlOperation(context.statement);
|
|
97
|
+
const table = context.affectedTables?.[0] ?? extractTableFromStatement(context.statement);
|
|
98
|
+
// Schema operations always allowed
|
|
99
|
+
if (operation === 'CREATE' || operation === 'ALTER' || operation === 'DROP') {
|
|
100
|
+
return context;
|
|
101
|
+
}
|
|
102
|
+
// Check if the table is protected
|
|
103
|
+
if (!table || !isTableProtected(table, config.storagePolicy)) {
|
|
104
|
+
return context;
|
|
105
|
+
}
|
|
106
|
+
const mode = config.storagePolicy.mode;
|
|
107
|
+
switch (mode) {
|
|
108
|
+
case 'sealed':
|
|
109
|
+
if (operation === 'UPDATE' || operation === 'DELETE') {
|
|
110
|
+
throw new ProvenanceViolationError(`${operation} operations are forbidden in sealed mode on table '${table}'`, { code: 'SEALED_MUTATION_BLOCKED', table, operation });
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
case 'revisioned':
|
|
114
|
+
if (operation === 'UPDATE' && revisionManager) {
|
|
115
|
+
// Capture snapshot before the update
|
|
116
|
+
const where = extractWhereClause(context.statement);
|
|
117
|
+
if (where) {
|
|
118
|
+
await revisionManager.captureRevision(table, where.clause, inferWhereParameters(where.clause, context.parameters));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (operation === 'DELETE' && tombstoneManager) {
|
|
122
|
+
// Create tombstone and abort the actual DELETE
|
|
123
|
+
const where = extractWhereClause(context.statement);
|
|
124
|
+
if (where) {
|
|
125
|
+
await tombstoneManager.createTombstone(table, where.clause, inferWhereParameters(where.clause, context.parameters));
|
|
126
|
+
}
|
|
127
|
+
// Return undefined to abort the DELETE
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
break;
|
|
131
|
+
case 'mutable':
|
|
132
|
+
// No enforcement
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
return context;
|
|
136
|
+
},
|
|
137
|
+
onAfterWrite: async (context, result) => {
|
|
138
|
+
// Log events to the signed ledger (for all modes when provenance is enabled)
|
|
139
|
+
if (!config.provenance.enabled || !ledger || result.changes === 0) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const operation = detectSqlOperation(context.statement);
|
|
143
|
+
const table = context.affectedTables?.[0] ?? extractTableFromStatement(context.statement);
|
|
144
|
+
if (!table)
|
|
145
|
+
return;
|
|
146
|
+
// Skip logging for provenance's own tables (prevent infinite recursion)
|
|
147
|
+
if (table.includes('signed_events') ||
|
|
148
|
+
table.includes('revisions') ||
|
|
149
|
+
table.includes('tombstones') ||
|
|
150
|
+
table.includes('anchors') ||
|
|
151
|
+
table.includes('agent_keys')) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Map SQL operation to event type
|
|
155
|
+
const eventType = mapOperationToEventType(operation, table);
|
|
156
|
+
if (!eventType)
|
|
157
|
+
return;
|
|
158
|
+
await ledger.appendEvent(eventType, {
|
|
159
|
+
table,
|
|
160
|
+
operation,
|
|
161
|
+
changes: result.changes,
|
|
162
|
+
operationId: context.operationId,
|
|
163
|
+
});
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// =============================================================================
|
|
168
|
+
// Helpers
|
|
169
|
+
// =============================================================================
|
|
170
|
+
function mapOperationToEventType(operation, table) {
|
|
171
|
+
if (table.includes('message')) {
|
|
172
|
+
switch (operation) {
|
|
173
|
+
case 'INSERT': return 'message.created';
|
|
174
|
+
case 'UPDATE': return 'message.revised';
|
|
175
|
+
case 'DELETE': return 'message.tombstoned';
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (table.includes('conversation')) {
|
|
179
|
+
switch (operation) {
|
|
180
|
+
case 'INSERT': return 'conversation.created';
|
|
181
|
+
case 'UPDATE': return 'conversation.archived';
|
|
182
|
+
case 'DELETE': return 'conversation.tombstoned';
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Generic storage events
|
|
186
|
+
switch (operation) {
|
|
187
|
+
case 'INSERT': return 'memory.stored';
|
|
188
|
+
case 'UPDATE': return 'memory.revised';
|
|
189
|
+
case 'DELETE': return 'memory.tombstoned';
|
|
190
|
+
}
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=ProvenanceStorageHooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProvenanceStorageHooks.js","sourceRoot":"","sources":["../../../../src/core/provenance/enforcement/ProvenanceStorageHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file RevisionManager.ts
|
|
3
|
+
* @description Captures row snapshots before UPDATE operations in revisioned mode.
|
|
4
|
+
* Creates revision records so the full history of every row is preserved.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Enforcement
|
|
7
|
+
*/
|
|
8
|
+
import type { RevisionRecord } from '../types.js';
|
|
9
|
+
import type { SignedEventLedger } from '../ledger/SignedEventLedger.js';
|
|
10
|
+
interface RevisionStorageAdapter {
|
|
11
|
+
run(statement: string, parameters?: unknown[]): Promise<{
|
|
12
|
+
changes: number;
|
|
13
|
+
}>;
|
|
14
|
+
all<T = unknown>(statement: string, parameters?: unknown[]): Promise<T[]>;
|
|
15
|
+
get<T = unknown>(statement: string, parameters?: unknown[]): Promise<T | null>;
|
|
16
|
+
}
|
|
17
|
+
export declare class RevisionManager {
|
|
18
|
+
private readonly storageAdapter;
|
|
19
|
+
private readonly ledger;
|
|
20
|
+
private readonly tablePrefix;
|
|
21
|
+
constructor(storageAdapter: RevisionStorageAdapter, ledger?: SignedEventLedger | null, tablePrefix?: string);
|
|
22
|
+
/**
|
|
23
|
+
* Capture the current state of records that are about to be updated.
|
|
24
|
+
* Call this BEFORE the UPDATE executes.
|
|
25
|
+
*
|
|
26
|
+
* @param tableName - The table being updated.
|
|
27
|
+
* @param whereClause - The WHERE clause from the UPDATE statement (without "WHERE").
|
|
28
|
+
* @param parameters - Parameters for the WHERE clause.
|
|
29
|
+
*/
|
|
30
|
+
captureRevision(tableName: string, whereClause: string, parameters?: unknown[]): Promise<RevisionRecord[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Get all revisions for a specific record.
|
|
33
|
+
*/
|
|
34
|
+
getRevisions(tableName: string, recordId: string): Promise<RevisionRecord[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the latest revision for a specific record.
|
|
37
|
+
*/
|
|
38
|
+
getLatestRevision(tableName: string, recordId: string): Promise<RevisionRecord | null>;
|
|
39
|
+
}
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=RevisionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RevisionManager.d.ts","sourceRoot":"","sources":["../../../../src/core/provenance/enforcement/RevisionManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAOxE,UAAU,sBAAsB;IAC9B,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAChF;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAGnC,cAAc,EAAE,sBAAsB,EACtC,MAAM,GAAE,iBAAiB,GAAG,IAAW,EACvC,WAAW,GAAE,MAAW;IAO1B;;;;;;;OAOG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,OAAO,EAAO,GACzB,OAAO,CAAC,cAAc,EAAE,CAAC;IA2D5B;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAmBlF;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAoB7F"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file RevisionManager.ts
|
|
3
|
+
* @description Captures row snapshots before UPDATE operations in revisioned mode.
|
|
4
|
+
* Creates revision records so the full history of every row is preserved.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Enforcement
|
|
7
|
+
*/
|
|
8
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
+
import { HashChain } from '../crypto/HashChain.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// RevisionManager
|
|
12
|
+
// =============================================================================
|
|
13
|
+
export class RevisionManager {
|
|
14
|
+
constructor(storageAdapter, ledger = null, tablePrefix = '') {
|
|
15
|
+
this.storageAdapter = storageAdapter;
|
|
16
|
+
this.ledger = ledger;
|
|
17
|
+
this.tablePrefix = tablePrefix;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Capture the current state of records that are about to be updated.
|
|
21
|
+
* Call this BEFORE the UPDATE executes.
|
|
22
|
+
*
|
|
23
|
+
* @param tableName - The table being updated.
|
|
24
|
+
* @param whereClause - The WHERE clause from the UPDATE statement (without "WHERE").
|
|
25
|
+
* @param parameters - Parameters for the WHERE clause.
|
|
26
|
+
*/
|
|
27
|
+
async captureRevision(tableName, whereClause, parameters = []) {
|
|
28
|
+
// Fetch current rows that match the WHERE clause
|
|
29
|
+
const rows = await this.storageAdapter.all(`SELECT * FROM ${tableName} WHERE ${whereClause}`, parameters);
|
|
30
|
+
const revisions = [];
|
|
31
|
+
for (const row of rows) {
|
|
32
|
+
// Determine the record ID (use 'id' column by convention)
|
|
33
|
+
const recordId = row.id ?? row.Id ?? row.ID ?? JSON.stringify(row);
|
|
34
|
+
// Get the current revision number for this record
|
|
35
|
+
const lastRevision = await this.storageAdapter.get(`SELECT MAX(revision_number) as revision_number FROM ${this.tablePrefix}revisions
|
|
36
|
+
WHERE table_name = ? AND record_id = ?`, [tableName, String(recordId)]);
|
|
37
|
+
const revisionNumber = (lastRevision?.revision_number ?? 0) + 1;
|
|
38
|
+
const snapshot = JSON.stringify(row);
|
|
39
|
+
const timestamp = new Date().toISOString();
|
|
40
|
+
const id = uuidv4();
|
|
41
|
+
// Log to signed event ledger
|
|
42
|
+
let eventId = id; // fallback
|
|
43
|
+
if (this.ledger) {
|
|
44
|
+
const event = await this.ledger.appendEvent('message.revised', {
|
|
45
|
+
tableName,
|
|
46
|
+
recordId: String(recordId),
|
|
47
|
+
revisionNumber,
|
|
48
|
+
previousContentHash: HashChain.computePayloadHash(row),
|
|
49
|
+
});
|
|
50
|
+
eventId = event.id;
|
|
51
|
+
}
|
|
52
|
+
// Insert revision record
|
|
53
|
+
await this.storageAdapter.run(`INSERT INTO ${this.tablePrefix}revisions
|
|
54
|
+
(id, table_name, record_id, revision_number, snapshot, event_id, timestamp)
|
|
55
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, [id, tableName, String(recordId), revisionNumber, snapshot, eventId, timestamp]);
|
|
56
|
+
revisions.push({
|
|
57
|
+
id,
|
|
58
|
+
tableName,
|
|
59
|
+
recordId: String(recordId),
|
|
60
|
+
revisionNumber,
|
|
61
|
+
snapshot,
|
|
62
|
+
eventId,
|
|
63
|
+
timestamp,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return revisions;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get all revisions for a specific record.
|
|
70
|
+
*/
|
|
71
|
+
async getRevisions(tableName, recordId) {
|
|
72
|
+
const rows = await this.storageAdapter.all(`SELECT * FROM ${this.tablePrefix}revisions
|
|
73
|
+
WHERE table_name = ? AND record_id = ?
|
|
74
|
+
ORDER BY revision_number ASC`, [tableName, recordId]);
|
|
75
|
+
return rows.map(row => ({
|
|
76
|
+
id: row.id,
|
|
77
|
+
tableName: row.table_name,
|
|
78
|
+
recordId: row.record_id,
|
|
79
|
+
revisionNumber: row.revision_number,
|
|
80
|
+
snapshot: row.snapshot,
|
|
81
|
+
eventId: row.event_id,
|
|
82
|
+
timestamp: row.timestamp,
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get the latest revision for a specific record.
|
|
87
|
+
*/
|
|
88
|
+
async getLatestRevision(tableName, recordId) {
|
|
89
|
+
const row = await this.storageAdapter.get(`SELECT * FROM ${this.tablePrefix}revisions
|
|
90
|
+
WHERE table_name = ? AND record_id = ?
|
|
91
|
+
ORDER BY revision_number DESC LIMIT 1`, [tableName, recordId]);
|
|
92
|
+
if (!row)
|
|
93
|
+
return null;
|
|
94
|
+
return {
|
|
95
|
+
id: row.id,
|
|
96
|
+
tableName: row.table_name,
|
|
97
|
+
recordId: row.record_id,
|
|
98
|
+
revisionNumber: row.revision_number,
|
|
99
|
+
snapshot: row.snapshot,
|
|
100
|
+
eventId: row.event_id,
|
|
101
|
+
timestamp: row.timestamp,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=RevisionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RevisionManager.js","sourceRoot":"","sources":["../../../../src/core/provenance/enforcement/RevisionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file TombstoneManager.ts
|
|
3
|
+
* @description Manages soft-deletion via tombstone records.
|
|
4
|
+
* In revisioned/sealed modes, DELETE operations are converted to tombstones.
|
|
5
|
+
*
|
|
6
|
+
* @module AgentOS/Provenance/Enforcement
|
|
7
|
+
*/
|
|
8
|
+
import type { TombstoneRecord } from '../types.js';
|
|
9
|
+
import type { SignedEventLedger } from '../ledger/SignedEventLedger.js';
|
|
10
|
+
interface TombstoneStorageAdapter {
|
|
11
|
+
run(statement: string, parameters?: unknown[]): Promise<{
|
|
12
|
+
changes: number;
|
|
13
|
+
}>;
|
|
14
|
+
all<T = unknown>(statement: string, parameters?: unknown[]): Promise<T[]>;
|
|
15
|
+
get<T = unknown>(statement: string, parameters?: unknown[]): Promise<T | null>;
|
|
16
|
+
}
|
|
17
|
+
export declare class TombstoneManager {
|
|
18
|
+
private readonly storageAdapter;
|
|
19
|
+
private readonly ledger;
|
|
20
|
+
private readonly tablePrefix;
|
|
21
|
+
constructor(storageAdapter: TombstoneStorageAdapter, ledger?: SignedEventLedger | null, tablePrefix?: string);
|
|
22
|
+
/**
|
|
23
|
+
* Create a tombstone for records about to be deleted.
|
|
24
|
+
* Call this INSTEAD of executing the DELETE.
|
|
25
|
+
*
|
|
26
|
+
* @param tableName - The table the records belong to.
|
|
27
|
+
* @param whereClause - The WHERE clause from the DELETE statement.
|
|
28
|
+
* @param parameters - Parameters for the WHERE clause.
|
|
29
|
+
* @param reason - Reason for deletion.
|
|
30
|
+
* @param initiator - Who initiated the deletion (agent ID or 'human').
|
|
31
|
+
*/
|
|
32
|
+
createTombstone(tableName: string, whereClause: string, parameters?: unknown[], reason?: string, initiator?: string): Promise<TombstoneRecord[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a record has been tombstoned.
|
|
35
|
+
*/
|
|
36
|
+
isTombstoned(tableName: string, recordId: string): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Get the tombstone record for a specific record.
|
|
39
|
+
*/
|
|
40
|
+
getTombstone(tableName: string, recordId: string): Promise<TombstoneRecord | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Get all tombstones for a table.
|
|
43
|
+
*/
|
|
44
|
+
getTombstones(tableName?: string): Promise<TombstoneRecord[]>;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=TombstoneManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TombstoneManager.d.ts","sourceRoot":"","sources":["../../../../src/core/provenance/enforcement/TombstoneManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAMxE,UAAU,uBAAuB;IAC/B,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAChF;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAGnC,cAAc,EAAE,uBAAuB,EACvC,MAAM,GAAE,iBAAiB,GAAG,IAAW,EACvC,WAAW,GAAE,MAAW;IAO1B;;;;;;;;;OASG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,OAAO,EAAO,EAC1B,MAAM,GAAE,MAAkB,EAC1B,SAAS,GAAE,MAAiB,GAC3B,OAAO,CAAC,eAAe,EAAE,CAAC;IAiE7B;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQzE;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAmBxF;;OAEG;IACG,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAsBpE"}
|