@salimassili/ai-costguard 1.1.3
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 +112 -0
- package/dist/aecl/ExecutionInterceptor.d.ts +111 -0
- package/dist/aecl/ExecutionInterceptor.d.ts.map +1 -0
- package/dist/aecl/ExecutionInterceptor.js +280 -0
- package/dist/aecl/ExecutionInterceptor.js.map +1 -0
- package/dist/aecl/ExecutionMemory.d.ts +103 -0
- package/dist/aecl/ExecutionMemory.d.ts.map +1 -0
- package/dist/aecl/ExecutionMemory.js +164 -0
- package/dist/aecl/ExecutionMemory.js.map +1 -0
- package/dist/aecl/PolicyEngine.d.ts +77 -0
- package/dist/aecl/PolicyEngine.d.ts.map +1 -0
- package/dist/aecl/PolicyEngine.js +170 -0
- package/dist/aecl/PolicyEngine.js.map +1 -0
- package/dist/aecl/ROITelemetry.d.ts +110 -0
- package/dist/aecl/ROITelemetry.d.ts.map +1 -0
- package/dist/aecl/ROITelemetry.js +211 -0
- package/dist/aecl/ROITelemetry.js.map +1 -0
- package/dist/aecl/RiskEngine.d.ts +90 -0
- package/dist/aecl/RiskEngine.d.ts.map +1 -0
- package/dist/aecl/RiskEngine.js +207 -0
- package/dist/aecl/RiskEngine.js.map +1 -0
- package/dist/aecl/index.d.ts +76 -0
- package/dist/aecl/index.d.ts.map +1 -0
- package/dist/aecl/index.js +111 -0
- package/dist/aecl/index.js.map +1 -0
- package/dist/aerl/ExecutionGraph.d.ts +123 -0
- package/dist/aerl/ExecutionGraph.d.ts.map +1 -0
- package/dist/aerl/ExecutionGraph.js +289 -0
- package/dist/aerl/ExecutionGraph.js.map +1 -0
- package/dist/aerl/ExecutionInterceptor.d.ts +94 -0
- package/dist/aerl/ExecutionInterceptor.d.ts.map +1 -0
- package/dist/aerl/ExecutionInterceptor.js +246 -0
- package/dist/aerl/ExecutionInterceptor.js.map +1 -0
- package/dist/aerl/ExecutionMemory.d.ts +138 -0
- package/dist/aerl/ExecutionMemory.d.ts.map +1 -0
- package/dist/aerl/ExecutionMemory.js +284 -0
- package/dist/aerl/ExecutionMemory.js.map +1 -0
- package/dist/aerl/FailurePrediction.d.ts +71 -0
- package/dist/aerl/FailurePrediction.d.ts.map +1 -0
- package/dist/aerl/FailurePrediction.js +204 -0
- package/dist/aerl/FailurePrediction.js.map +1 -0
- package/dist/aerl/RecoveryEngine.d.ts +74 -0
- package/dist/aerl/RecoveryEngine.d.ts.map +1 -0
- package/dist/aerl/RecoveryEngine.js +194 -0
- package/dist/aerl/RecoveryEngine.js.map +1 -0
- package/dist/aerl/ReliabilityEngine.d.ts +74 -0
- package/dist/aerl/ReliabilityEngine.d.ts.map +1 -0
- package/dist/aerl/ReliabilityEngine.js +205 -0
- package/dist/aerl/ReliabilityEngine.js.map +1 -0
- package/dist/aerl/ReliabilityTelemetry.d.ts +118 -0
- package/dist/aerl/ReliabilityTelemetry.d.ts.map +1 -0
- package/dist/aerl/ReliabilityTelemetry.js +247 -0
- package/dist/aerl/ReliabilityTelemetry.js.map +1 -0
- package/dist/aerl/index.d.ts +170 -0
- package/dist/aerl/index.d.ts.map +1 -0
- package/dist/aerl/index.js +223 -0
- package/dist/aerl/index.js.map +1 -0
- package/dist/ambient/AmbientProtection.d.ts +79 -0
- package/dist/ambient/AmbientProtection.d.ts.map +1 -0
- package/dist/ambient/AmbientProtection.js +251 -0
- package/dist/ambient/AmbientProtection.js.map +1 -0
- package/dist/bin/start.d.ts +14 -0
- package/dist/bin/start.d.ts.map +1 -0
- package/dist/bin/start.js +54 -0
- package/dist/bin/start.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +64 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/outputContract.d.ts +19 -0
- package/dist/cli/outputContract.d.ts.map +1 -0
- package/dist/cli/outputContract.js +54 -0
- package/dist/cli/outputContract.js.map +1 -0
- package/dist/cli/storage.d.ts +61 -0
- package/dist/cli/storage.d.ts.map +1 -0
- package/dist/cli/storage.js +143 -0
- package/dist/cli/storage.js.map +1 -0
- package/dist/client.d.ts +29 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +58 -0
- package/dist/client.js.map +1 -0
- package/dist/config/constants.d.ts +109 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +151 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +21 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/pricing.d.ts +12 -0
- package/dist/config/pricing.d.ts.map +1 -0
- package/dist/config/pricing.js +45 -0
- package/dist/config/pricing.js.map +1 -0
- package/dist/config/productionConfig.d.ts +8 -0
- package/dist/config/productionConfig.d.ts.map +1 -0
- package/dist/config/productionConfig.js +21 -0
- package/dist/config/productionConfig.js.map +1 -0
- package/dist/config/userConfig.d.ts +31 -0
- package/dist/config/userConfig.d.ts.map +1 -0
- package/dist/config/userConfig.js +116 -0
- package/dist/config/userConfig.js.map +1 -0
- package/dist/controlPlane/configServer.d.ts +7 -0
- package/dist/controlPlane/configServer.d.ts.map +1 -0
- package/dist/controlPlane/configServer.js +47 -0
- package/dist/controlPlane/configServer.js.map +1 -0
- package/dist/core/AgentBehaviorGraph.d.ts +163 -0
- package/dist/core/AgentBehaviorGraph.d.ts.map +1 -0
- package/dist/core/AgentBehaviorGraph.js +341 -0
- package/dist/core/AgentBehaviorGraph.js.map +1 -0
- package/dist/core/AlertManager.d.ts +19 -0
- package/dist/core/AlertManager.d.ts.map +1 -0
- package/dist/core/AlertManager.js +64 -0
- package/dist/core/AlertManager.js.map +1 -0
- package/dist/core/AuditTrail.d.ts +107 -0
- package/dist/core/AuditTrail.d.ts.map +1 -0
- package/dist/core/AuditTrail.js +256 -0
- package/dist/core/AuditTrail.js.map +1 -0
- package/dist/core/CostLedger.d.ts +135 -0
- package/dist/core/CostLedger.d.ts.map +1 -0
- package/dist/core/CostLedger.js +224 -0
- package/dist/core/CostLedger.js.map +1 -0
- package/dist/core/CostPredictionEngine.d.ts +110 -0
- package/dist/core/CostPredictionEngine.d.ts.map +1 -0
- package/dist/core/CostPredictionEngine.js +225 -0
- package/dist/core/CostPredictionEngine.js.map +1 -0
- package/dist/core/CostTruthEngine.d.ts +108 -0
- package/dist/core/CostTruthEngine.d.ts.map +1 -0
- package/dist/core/CostTruthEngine.js +170 -0
- package/dist/core/CostTruthEngine.js.map +1 -0
- package/dist/core/DetectionEngine.d.ts +147 -0
- package/dist/core/DetectionEngine.d.ts.map +1 -0
- package/dist/core/DetectionEngine.js +429 -0
- package/dist/core/DetectionEngine.js.map +1 -0
- package/dist/core/ExecutionInterceptor.d.ts +135 -0
- package/dist/core/ExecutionInterceptor.d.ts.map +1 -0
- package/dist/core/ExecutionInterceptor.js +285 -0
- package/dist/core/ExecutionInterceptor.js.map +1 -0
- package/dist/core/ExplainabilityLayer.d.ts +109 -0
- package/dist/core/ExplainabilityLayer.d.ts.map +1 -0
- package/dist/core/ExplainabilityLayer.js +277 -0
- package/dist/core/ExplainabilityLayer.js.map +1 -0
- package/dist/core/LearningSystem.d.ts +124 -0
- package/dist/core/LearningSystem.d.ts.map +1 -0
- package/dist/core/LearningSystem.js +294 -0
- package/dist/core/LearningSystem.js.map +1 -0
- package/dist/core/Logger.d.ts +122 -0
- package/dist/core/Logger.d.ts.map +1 -0
- package/dist/core/Logger.js +233 -0
- package/dist/core/Logger.js.map +1 -0
- package/dist/core/PolicyEngine.d.ts +148 -0
- package/dist/core/PolicyEngine.d.ts.map +1 -0
- package/dist/core/PolicyEngine.js +336 -0
- package/dist/core/PolicyEngine.js.map +1 -0
- package/dist/core/PricingConfig.d.ts +55 -0
- package/dist/core/PricingConfig.d.ts.map +1 -0
- package/dist/core/PricingConfig.js +132 -0
- package/dist/core/PricingConfig.js.map +1 -0
- package/dist/core/SessionStats.d.ts +101 -0
- package/dist/core/SessionStats.d.ts.map +1 -0
- package/dist/core/SessionStats.js +261 -0
- package/dist/core/SessionStats.js.map +1 -0
- package/dist/core/StateStore.d.ts +100 -0
- package/dist/core/StateStore.d.ts.map +1 -0
- package/dist/core/StateStore.js +336 -0
- package/dist/core/StateStore.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +19 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/types.d.ts +26 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/cost-guard.d.ts +41 -0
- package/dist/cost-guard.d.ts.map +1 -0
- package/dist/cost-guard.js +274 -0
- package/dist/cost-guard.js.map +1 -0
- package/dist/dashboard/roiDashboard.d.ts +12 -0
- package/dist/dashboard/roiDashboard.d.ts.map +1 -0
- package/dist/dashboard/roiDashboard.js +28 -0
- package/dist/dashboard/roiDashboard.js.map +1 -0
- package/dist/demo/compareExecution.d.ts +9 -0
- package/dist/demo/compareExecution.d.ts.map +1 -0
- package/dist/demo/compareExecution.js +43 -0
- package/dist/demo/compareExecution.js.map +1 -0
- package/dist/demo/demoRunner.d.ts +16 -0
- package/dist/demo/demoRunner.d.ts.map +1 -0
- package/dist/demo/demoRunner.js +73 -0
- package/dist/demo/demoRunner.js.map +1 -0
- package/dist/firewall/costEstimator.d.ts +3 -0
- package/dist/firewall/costEstimator.d.ts.map +1 -0
- package/dist/firewall/costEstimator.js +22 -0
- package/dist/firewall/costEstimator.js.map +1 -0
- package/dist/firewall/executionGuard.d.ts +18 -0
- package/dist/firewall/executionGuard.d.ts.map +1 -0
- package/dist/firewall/executionGuard.js +80 -0
- package/dist/firewall/executionGuard.js.map +1 -0
- package/dist/firewall/loopDetector.d.ts +13 -0
- package/dist/firewall/loopDetector.d.ts.map +1 -0
- package/dist/firewall/loopDetector.js +24 -0
- package/dist/firewall/loopDetector.js.map +1 -0
- package/dist/firewall/policy.d.ts +4 -0
- package/dist/firewall/policy.d.ts.map +1 -0
- package/dist/firewall/policy.js +16 -0
- package/dist/firewall/policy.js.map +1 -0
- package/dist/firewall/types.d.ts +38 -0
- package/dist/firewall/types.d.ts.map +1 -0
- package/dist/firewall/types.js +3 -0
- package/dist/firewall/types.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/console.d.ts +27 -0
- package/dist/logger/console.d.ts.map +1 -0
- package/dist/logger/console.js +68 -0
- package/dist/logger/console.js.map +1 -0
- package/dist/logger/database.d.ts +40 -0
- package/dist/logger/database.d.ts.map +1 -0
- package/dist/logger/database.js +127 -0
- package/dist/logger/database.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +11 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/loop-shield.d.ts +48 -0
- package/dist/loop-shield.d.ts.map +1 -0
- package/dist/loop-shield.js +436 -0
- package/dist/loop-shield.js.map +1 -0
- package/dist/metrics/BusinessMetricsEngine.d.ts +109 -0
- package/dist/metrics/BusinessMetricsEngine.d.ts.map +1 -0
- package/dist/metrics/BusinessMetricsEngine.js +222 -0
- package/dist/metrics/BusinessMetricsEngine.js.map +1 -0
- package/dist/metrics/index.d.ts +11 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +17 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/middleware/expressFirewall.d.ts +51 -0
- package/dist/middleware/expressFirewall.d.ts.map +1 -0
- package/dist/middleware/expressFirewall.js +140 -0
- package/dist/middleware/expressFirewall.js.map +1 -0
- package/dist/middleware/index.d.ts +8 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +15 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/withFirewall.d.ts +50 -0
- package/dist/middleware/withFirewall.d.ts.map +1 -0
- package/dist/middleware/withFirewall.js +155 -0
- package/dist/middleware/withFirewall.js.map +1 -0
- package/dist/observability/logger.d.ts +14 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +21 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +17 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +36 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/os/ExecutionOS.d.ts +220 -0
- package/dist/os/ExecutionOS.d.ts.map +1 -0
- package/dist/os/ExecutionOS.js +398 -0
- package/dist/os/ExecutionOS.js.map +1 -0
- package/dist/os/GlobalIntelligence.d.ts +154 -0
- package/dist/os/GlobalIntelligence.d.ts.map +1 -0
- package/dist/os/GlobalIntelligence.js +374 -0
- package/dist/os/GlobalIntelligence.js.map +1 -0
- package/dist/os/PolicyMarketplace.d.ts +192 -0
- package/dist/os/PolicyMarketplace.d.ts.map +1 -0
- package/dist/os/PolicyMarketplace.js +384 -0
- package/dist/os/PolicyMarketplace.js.map +1 -0
- package/dist/os/SDKInterception.d.ts +115 -0
- package/dist/os/SDKInterception.d.ts.map +1 -0
- package/dist/os/SDKInterception.js +317 -0
- package/dist/os/SDKInterception.js.map +1 -0
- package/dist/os/index.d.ts +60 -0
- package/dist/os/index.d.ts.map +1 -0
- package/dist/os/index.js +82 -0
- package/dist/os/index.js.map +1 -0
- package/dist/proxy/index.d.ts +2 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +18 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/server.d.ts +24 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +395 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/public/BenchmarksPage.d.ts +60 -0
- package/dist/public/BenchmarksPage.d.ts.map +1 -0
- package/dist/public/BenchmarksPage.js +397 -0
- package/dist/public/BenchmarksPage.js.map +1 -0
- package/dist/public/DocsPage.d.ts +11 -0
- package/dist/public/DocsPage.d.ts.map +1 -0
- package/dist/public/DocsPage.js +496 -0
- package/dist/public/DocsPage.js.map +1 -0
- package/dist/public/StatusPage.d.ts +55 -0
- package/dist/public/StatusPage.d.ts.map +1 -0
- package/dist/public/StatusPage.js +344 -0
- package/dist/public/StatusPage.js.map +1 -0
- package/dist/public/index.d.ts +12 -0
- package/dist/public/index.d.ts.map +1 -0
- package/dist/public/index.js +20 -0
- package/dist/public/index.js.map +1 -0
- package/dist/replacements/axios.d.ts +14 -0
- package/dist/replacements/axios.d.ts.map +1 -0
- package/dist/replacements/axios.js +35 -0
- package/dist/replacements/axios.js.map +1 -0
- package/dist/replacements/fetch.d.ts +13 -0
- package/dist/replacements/fetch.d.ts.map +1 -0
- package/dist/replacements/fetch.js +20 -0
- package/dist/replacements/fetch.js.map +1 -0
- package/dist/replacements/openai.d.ts +14 -0
- package/dist/replacements/openai.d.ts.map +1 -0
- package/dist/replacements/openai.js +22 -0
- package/dist/replacements/openai.js.map +1 -0
- package/dist/saas/CostExplosionDemo.d.ts +56 -0
- package/dist/saas/CostExplosionDemo.d.ts.map +1 -0
- package/dist/saas/CostExplosionDemo.js +190 -0
- package/dist/saas/CostExplosionDemo.js.map +1 -0
- package/dist/saas/LiveProtection.d.ts +61 -0
- package/dist/saas/LiveProtection.d.ts.map +1 -0
- package/dist/saas/LiveProtection.js +187 -0
- package/dist/saas/LiveProtection.js.map +1 -0
- package/dist/saas/ProductionSaaS.d.ts +56 -0
- package/dist/saas/ProductionSaaS.d.ts.map +1 -0
- package/dist/saas/ProductionSaaS.js +831 -0
- package/dist/saas/ProductionSaaS.js.map +1 -0
- package/dist/saas/SaaSServer.d.ts +50 -0
- package/dist/saas/SaaSServer.d.ts.map +1 -0
- package/dist/saas/SaaSServer.js +669 -0
- package/dist/saas/SaaSServer.js.map +1 -0
- package/dist/saas/UserStore.d.ts +49 -0
- package/dist/saas/UserStore.d.ts.map +1 -0
- package/dist/saas/UserStore.js +137 -0
- package/dist/saas/UserStore.js.map +1 -0
- package/dist/saas/billingMetrics.d.ts +14 -0
- package/dist/saas/billingMetrics.d.ts.map +1 -0
- package/dist/saas/billingMetrics.js +23 -0
- package/dist/saas/billingMetrics.js.map +1 -0
- package/dist/saas/index.d.ts +12 -0
- package/dist/saas/index.d.ts.map +1 -0
- package/dist/saas/index.js +23 -0
- package/dist/saas/index.js.map +1 -0
- package/dist/saas/telemetry.d.ts +24 -0
- package/dist/saas/telemetry.d.ts.map +1 -0
- package/dist/saas/telemetry.js +30 -0
- package/dist/saas/telemetry.js.map +1 -0
- package/dist/saas/usageMeter.d.ts +28 -0
- package/dist/saas/usageMeter.d.ts.map +1 -0
- package/dist/saas/usageMeter.js +41 -0
- package/dist/saas/usageMeter.js.map +1 -0
- package/dist/security/TrustBoundaryValidator.d.ts +105 -0
- package/dist/security/TrustBoundaryValidator.d.ts.map +1 -0
- package/dist/security/TrustBoundaryValidator.js +305 -0
- package/dist/security/TrustBoundaryValidator.js.map +1 -0
- package/dist/starters/express-protected.d.ts +18 -0
- package/dist/starters/express-protected.d.ts.map +1 -0
- package/dist/starters/express-protected.js +93 -0
- package/dist/starters/express-protected.js.map +1 -0
- package/dist/starters/langchain-protected.d.ts +18 -0
- package/dist/starters/langchain-protected.d.ts.map +1 -0
- package/dist/starters/langchain-protected.js +85 -0
- package/dist/starters/langchain-protected.js.map +1 -0
- package/dist/starters/openai-protected.d.ts +19 -0
- package/dist/starters/openai-protected.d.ts.map +1 -0
- package/dist/starters/openai-protected.js +84 -0
- package/dist/starters/openai-protected.js.map +1 -0
- package/dist/starters/serverless-protected.d.ts +19 -0
- package/dist/starters/serverless-protected.d.ts.map +1 -0
- package/dist/starters/serverless-protected.js +83 -0
- package/dist/starters/serverless-protected.js.map +1 -0
- package/dist/storage/adapters.d.ts +24 -0
- package/dist/storage/adapters.d.ts.map +1 -0
- package/dist/storage/adapters.js +123 -0
- package/dist/storage/adapters.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +8 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/tests/b2b-hardening.test.d.ts +2 -0
- package/dist/tests/b2b-hardening.test.d.ts.map +1 -0
- package/dist/tests/b2b-hardening.test.js +164 -0
- package/dist/tests/b2b-hardening.test.js.map +1 -0
- package/dist/tests/cli.contract.test.d.ts +2 -0
- package/dist/tests/cli.contract.test.d.ts.map +1 -0
- package/dist/tests/cli.contract.test.js +28 -0
- package/dist/tests/cli.contract.test.js.map +1 -0
- package/dist/tests/cli.snapshot.test.d.ts +14 -0
- package/dist/tests/cli.snapshot.test.d.ts.map +1 -0
- package/dist/tests/cli.snapshot.test.js +132 -0
- package/dist/tests/cli.snapshot.test.js.map +1 -0
- package/dist/tests/cli.strict.test.d.ts +6 -0
- package/dist/tests/cli.strict.test.d.ts.map +1 -0
- package/dist/tests/cli.strict.test.js +173 -0
- package/dist/tests/cli.strict.test.js.map +1 -0
- package/dist/tests/cli.test.d.ts +5 -0
- package/dist/tests/cli.test.d.ts.map +1 -0
- package/dist/tests/cli.test.js +54 -0
- package/dist/tests/cli.test.js.map +1 -0
- package/dist/tests/concurrency.state.test.d.ts +6 -0
- package/dist/tests/concurrency.state.test.d.ts.map +1 -0
- package/dist/tests/concurrency.state.test.js +231 -0
- package/dist/tests/concurrency.state.test.js.map +1 -0
- package/dist/tests/detection-engine.strict.test.d.ts +6 -0
- package/dist/tests/detection-engine.strict.test.d.ts.map +1 -0
- package/dist/tests/detection-engine.strict.test.js +323 -0
- package/dist/tests/detection-engine.strict.test.js.map +1 -0
- package/dist/tests/e2e.system.test.d.ts +7 -0
- package/dist/tests/e2e.system.test.d.ts.map +1 -0
- package/dist/tests/e2e.system.test.js +189 -0
- package/dist/tests/e2e.system.test.js.map +1 -0
- package/dist/tests/edge-cases.test.d.ts +6 -0
- package/dist/tests/edge-cases.test.d.ts.map +1 -0
- package/dist/tests/edge-cases.test.js +357 -0
- package/dist/tests/edge-cases.test.js.map +1 -0
- package/dist/tests/performance.benchmark.test.d.ts +2 -0
- package/dist/tests/performance.benchmark.test.d.ts.map +1 -0
- package/dist/tests/performance.benchmark.test.js +24 -0
- package/dist/tests/performance.benchmark.test.js.map +1 -0
- package/dist/tests/proxy.production.test.d.ts +6 -0
- package/dist/tests/proxy.production.test.d.ts.map +1 -0
- package/dist/tests/proxy.production.test.js +274 -0
- package/dist/tests/proxy.production.test.js.map +1 -0
- package/dist/tests/proxy.strict.test.d.ts +6 -0
- package/dist/tests/proxy.strict.test.d.ts.map +1 -0
- package/dist/tests/proxy.strict.test.js +188 -0
- package/dist/tests/proxy.strict.test.js.map +1 -0
- package/dist/tests/proxy.test.d.ts +5 -0
- package/dist/tests/proxy.test.d.ts.map +1 -0
- package/dist/tests/proxy.test.js +61 -0
- package/dist/tests/proxy.test.js.map +1 -0
- package/dist/tests/roi.scenario.test.d.ts +2 -0
- package/dist/tests/roi.scenario.test.d.ts.map +1 -0
- package/dist/tests/roi.scenario.test.js +26 -0
- package/dist/tests/roi.scenario.test.js.map +1 -0
- package/dist/tests/server.contract.test.d.ts +6 -0
- package/dist/tests/server.contract.test.d.ts.map +1 -0
- package/dist/tests/server.contract.test.js +48 -0
- package/dist/tests/server.contract.test.js.map +1 -0
- package/dist/tests/tokenCounter.test.d.ts +5 -0
- package/dist/tests/tokenCounter.test.d.ts.map +1 -0
- package/dist/tests/tokenCounter.test.js +66 -0
- package/dist/tests/tokenCounter.test.js.map +1 -0
- package/dist/tests/v113/client.test.d.ts +2 -0
- package/dist/tests/v113/client.test.d.ts.map +1 -0
- package/dist/tests/v113/client.test.js +22 -0
- package/dist/tests/v113/client.test.js.map +1 -0
- package/dist/tests/v113/executionGuard.test.d.ts +2 -0
- package/dist/tests/v113/executionGuard.test.d.ts.map +1 -0
- package/dist/tests/v113/executionGuard.test.js +39 -0
- package/dist/tests/v113/executionGuard.test.js.map +1 -0
- package/dist/token-counter/index.d.ts +2 -0
- package/dist/token-counter/index.d.ts.map +1 -0
- package/dist/token-counter/index.js +18 -0
- package/dist/token-counter/index.js.map +1 -0
- package/dist/token-counter/tokenCounter.d.ts +18 -0
- package/dist/token-counter/tokenCounter.d.ts.map +1 -0
- package/dist/token-counter/tokenCounter.js +91 -0
- package/dist/token-counter/tokenCounter.js.map +1 -0
- package/dist/trust/ImmutableAudit.d.ts +159 -0
- package/dist/trust/ImmutableAudit.d.ts.map +1 -0
- package/dist/trust/ImmutableAudit.js +340 -0
- package/dist/trust/ImmutableAudit.js.map +1 -0
- package/dist/trust/PublicVerificationLedger.d.ts +91 -0
- package/dist/trust/PublicVerificationLedger.d.ts.map +1 -0
- package/dist/trust/PublicVerificationLedger.js +223 -0
- package/dist/trust/PublicVerificationLedger.js.map +1 -0
- package/dist/trust/index.d.ts +11 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +20 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/utils/alert.d.ts +13 -0
- package/dist/utils/alert.d.ts.map +1 -0
- package/dist/utils/alert.js +49 -0
- package/dist/utils/alert.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/wrapper/aiFirewall.d.ts +61 -0
- package/dist/wrapper/aiFirewall.d.ts.map +1 -0
- package/dist/wrapper/aiFirewall.js +117 -0
- package/dist/wrapper/aiFirewall.js.map +1 -0
- package/dist/wrapper/index.d.ts +3 -0
- package/dist/wrapper/index.d.ts.map +1 -0
- package/dist/wrapper/index.js +21 -0
- package/dist/wrapper/index.js.map +1 -0
- package/dist/wrapper/sdk.d.ts +49 -0
- package/dist/wrapper/sdk.d.ts.map +1 -0
- package/dist/wrapper/sdk.js +140 -0
- package/dist/wrapper/sdk.js.map +1 -0
- package/package.json +84 -0
package/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# OpenAI Agent Cost Explosion Prevention Layer
|
|
2
|
+
|
|
3
|
+
Stop OpenAI agent cost explosions before they happen.
|
|
4
|
+
|
|
5
|
+
A pre-execution firewall that detects and blocks runaway AI agent patterns—saving 60-90% on production API costs.
|
|
6
|
+
|
|
7
|
+
## The 3 Problems We Solve
|
|
8
|
+
|
|
9
|
+
1. **Runaway agent loops** → Infinite recursive calls draining budget
|
|
10
|
+
2. **Uncontrolled API spending** → No visibility into per-request costs
|
|
11
|
+
3. **Production LLM cost spikes** → Sudden $10K+ surprises at month-end
|
|
12
|
+
|
|
13
|
+
## Try It (No Install Required)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Run interactive demo
|
|
17
|
+
npx ai-firewall demo
|
|
18
|
+
|
|
19
|
+
# Or try the web demo
|
|
20
|
+
open https://ai-firewall.io/demo
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
See live simulations of cost explosions—and how much you save by blocking them.
|
|
24
|
+
|
|
25
|
+
## Integration Example
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import OpenAI from 'openai';
|
|
29
|
+
import { initFirewall, withFirewall } from 'ai-firewall';
|
|
30
|
+
|
|
31
|
+
const firewall = initFirewall({ apiKey: process.env.FIREWALL_API_KEY! });
|
|
32
|
+
const openai = withFirewall(new OpenAI({ apiKey: process.env.OPENAI_API_KEY! }));
|
|
33
|
+
|
|
34
|
+
const decision = firewall.evaluate({
|
|
35
|
+
model: 'gpt-4o-mini',
|
|
36
|
+
prompt: 'Summarize these tickets',
|
|
37
|
+
maxOutputTokens: 240,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
if (decision.decision !== 'block') {
|
|
41
|
+
await openai.chat.completions.create({
|
|
42
|
+
model: 'gpt-4o-mini',
|
|
43
|
+
messages: [{ role: 'user', content: 'Summarize these tickets' }],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Enterprise Trust Features
|
|
49
|
+
|
|
50
|
+
**Audit & Compliance:**
|
|
51
|
+
- Every decision logged with cryptographic integrity
|
|
52
|
+
- Hash-chained audit trail (tamper-evident)
|
|
53
|
+
- Replay any execution for debugging
|
|
54
|
+
- Compliance certificates for audits
|
|
55
|
+
|
|
56
|
+
**Production Safety:**
|
|
57
|
+
- Circuit breaker on engine failures
|
|
58
|
+
- Always returns a decision (never crashes execution)
|
|
59
|
+
- Automatic fallback to safe defaults
|
|
60
|
+
- Sub-100ms decision latency guaranteed
|
|
61
|
+
|
|
62
|
+
**Deterministic Replay:**
|
|
63
|
+
```ts
|
|
64
|
+
import { replaySession, generateComplianceReport } from 'ai-firewall';
|
|
65
|
+
|
|
66
|
+
// Replay any past decision
|
|
67
|
+
const result = replaySession('session-123');
|
|
68
|
+
console.log(result.summary); // "All 50 decisions replayed identically"
|
|
69
|
+
|
|
70
|
+
// Generate compliance certificate
|
|
71
|
+
const report = generateComplianceReport('session-123');
|
|
72
|
+
console.log(report.certificate); // Tamper-evident proof
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Distribution & Sharing
|
|
76
|
+
|
|
77
|
+
**Shareable Demo Links:**
|
|
78
|
+
```ts
|
|
79
|
+
import { quickDemo, generateViralPayload } from 'ai-firewall';
|
|
80
|
+
|
|
81
|
+
// Create shareable demo
|
|
82
|
+
const { session, link } = quickDemo('Runaway Chatbot');
|
|
83
|
+
console.log(link.url); // https://ai-firewall.io/demo/abc123
|
|
84
|
+
|
|
85
|
+
// Generate tweet-ready content
|
|
86
|
+
const payload = generateViralPayload(session);
|
|
87
|
+
console.log(payload.tweet); // Copy-paste ready
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Hosted Demo Server:**
|
|
91
|
+
```bash
|
|
92
|
+
# Start self-serve demo server
|
|
93
|
+
npx ai-firewall demo-server
|
|
94
|
+
|
|
95
|
+
# Users can now try without installing:
|
|
96
|
+
# → http://localhost:3001/demo
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## What This Is NOT
|
|
100
|
+
|
|
101
|
+
❌ General AI safety platform
|
|
102
|
+
❌ Model evaluation framework
|
|
103
|
+
❌ Generic "AI guardrails" tool
|
|
104
|
+
❌ Multi-cloud abstraction layer
|
|
105
|
+
|
|
106
|
+
✅ **Only OpenAI cost explosion prevention**
|
|
107
|
+
✅ **Only production API spending control**
|
|
108
|
+
✅ **Only runaway agent detection**
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
**One-sentence pitch:** *We stop AI agents from wasting money in production.*
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AECL - AI Execution Control Layer
|
|
3
|
+
* Execution Interceptor Module
|
|
4
|
+
*
|
|
5
|
+
* DESIGN PHILOSOPHY:
|
|
6
|
+
* - Synchronous, deterministic, cached
|
|
7
|
+
* - <5ms p95 latency (measured, not aspirational)
|
|
8
|
+
* - Fail-open default (production safety)
|
|
9
|
+
* - Zero external dependencies in hot path
|
|
10
|
+
*
|
|
11
|
+
* PRODUCTION REQUIREMENTS:
|
|
12
|
+
* - Must not block on I/O during decision
|
|
13
|
+
* - Must degrade gracefully under load
|
|
14
|
+
* - Must be debuggable (every decision explained)
|
|
15
|
+
*/
|
|
16
|
+
export type Decision = 'allow' | 'block';
|
|
17
|
+
export interface ExecutionContext {
|
|
18
|
+
sessionId: string;
|
|
19
|
+
agentId: string;
|
|
20
|
+
stepNumber: number;
|
|
21
|
+
previousCalls: number;
|
|
22
|
+
totalTokens: number;
|
|
23
|
+
totalCost: number;
|
|
24
|
+
startTime: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ExecutionRequest {
|
|
27
|
+
id: string;
|
|
28
|
+
provider: 'openai' | 'anthropic' | 'langchain' | 'custom';
|
|
29
|
+
operation: string;
|
|
30
|
+
model?: string;
|
|
31
|
+
estimatedTokens: number;
|
|
32
|
+
estimatedCost: number;
|
|
33
|
+
context: ExecutionContext;
|
|
34
|
+
inputHash: string;
|
|
35
|
+
}
|
|
36
|
+
export interface DecisionResult {
|
|
37
|
+
decision: Decision;
|
|
38
|
+
reason: string;
|
|
39
|
+
riskScore: number;
|
|
40
|
+
confidence: number;
|
|
41
|
+
latencyMs: number;
|
|
42
|
+
policyTriggered?: string;
|
|
43
|
+
estimatedSavings?: number;
|
|
44
|
+
cacheHit: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface InterceptorConfig {
|
|
47
|
+
failOpen: boolean;
|
|
48
|
+
maxLatencyMs: number;
|
|
49
|
+
cacheSize: number;
|
|
50
|
+
defaultPolicy: {
|
|
51
|
+
maxCostPerSession: number;
|
|
52
|
+
maxStepsPerSession: number;
|
|
53
|
+
maxCostPerRequest: number;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Execution Interceptor
|
|
58
|
+
*
|
|
59
|
+
* Core Design:
|
|
60
|
+
* 1. Hash-based cache lookup (sub-millisecond)
|
|
61
|
+
* 2. Deterministic policy evaluation (no ML in hot path)
|
|
62
|
+
* 3. Fixed-budget timeout (never exceeds 5ms)
|
|
63
|
+
* 4. Synchronous decision, async logging
|
|
64
|
+
*/
|
|
65
|
+
export declare class ExecutionInterceptor {
|
|
66
|
+
private config;
|
|
67
|
+
private cache;
|
|
68
|
+
private metrics;
|
|
69
|
+
constructor(config?: Partial<InterceptorConfig>);
|
|
70
|
+
/**
|
|
71
|
+
* Main interception method
|
|
72
|
+
* MUST complete in <5ms p95
|
|
73
|
+
*/
|
|
74
|
+
intercept(request: ExecutionRequest): DecisionResult;
|
|
75
|
+
/**
|
|
76
|
+
* Risk scoring - deterministic, explainable
|
|
77
|
+
* Returns 0-1 risk score
|
|
78
|
+
*/
|
|
79
|
+
private calculateRiskScore;
|
|
80
|
+
/**
|
|
81
|
+
* Policy evaluation - simple, deterministic rules
|
|
82
|
+
*/
|
|
83
|
+
private evaluatePolicy;
|
|
84
|
+
/**
|
|
85
|
+
* Generate cache key for request
|
|
86
|
+
*/
|
|
87
|
+
private generateCacheKey;
|
|
88
|
+
/**
|
|
89
|
+
* Record latency metrics
|
|
90
|
+
*/
|
|
91
|
+
private recordLatency;
|
|
92
|
+
/**
|
|
93
|
+
* Get metrics for ROI telemetry
|
|
94
|
+
*/
|
|
95
|
+
getMetrics(): {
|
|
96
|
+
cacheHitRate: number;
|
|
97
|
+
blockRate: number;
|
|
98
|
+
totalRequests: number;
|
|
99
|
+
cacheHits: number;
|
|
100
|
+
blockedRequests: number;
|
|
101
|
+
avgLatencyMs: number;
|
|
102
|
+
p95LatencyMs: number;
|
|
103
|
+
latencySamples: number[];
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Reset (for testing)
|
|
107
|
+
*/
|
|
108
|
+
reset(): void;
|
|
109
|
+
}
|
|
110
|
+
export declare const interceptor: ExecutionInterceptor;
|
|
111
|
+
//# sourceMappingURL=ExecutionInterceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionInterceptor.d.ts","sourceRoot":"","sources":["../../src/aecl/ExecutionInterceptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE;QACb,iBAAiB,EAAE,MAAM,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAwCD;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,OAAO,CAOb;gBAEU,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAwBnD;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,cAAc;IA6DpD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAyB1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAyDtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,UAAU;;;uBA9NO,MAAM;mBACV,MAAM;yBACA,MAAM;sBACT,MAAM;sBACN,MAAM;wBACJ,MAAM,EAAE;;IAqO1B;;OAEG;IACH,KAAK,IAAI,IAAI;CAWd;AAGD,eAAO,MAAM,WAAW,sBAA6B,CAAC"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AECL - AI Execution Control Layer
|
|
4
|
+
* Execution Interceptor Module
|
|
5
|
+
*
|
|
6
|
+
* DESIGN PHILOSOPHY:
|
|
7
|
+
* - Synchronous, deterministic, cached
|
|
8
|
+
* - <5ms p95 latency (measured, not aspirational)
|
|
9
|
+
* - Fail-open default (production safety)
|
|
10
|
+
* - Zero external dependencies in hot path
|
|
11
|
+
*
|
|
12
|
+
* PRODUCTION REQUIREMENTS:
|
|
13
|
+
* - Must not block on I/O during decision
|
|
14
|
+
* - Must degrade gracefully under load
|
|
15
|
+
* - Must be debuggable (every decision explained)
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.interceptor = exports.ExecutionInterceptor = void 0;
|
|
19
|
+
const perf_hooks_1 = require("perf_hooks");
|
|
20
|
+
const crypto_1 = require("crypto");
|
|
21
|
+
// In-memory LRU cache for sub-millisecond repeat decisions
|
|
22
|
+
class LRUCache {
|
|
23
|
+
constructor(maxSize) {
|
|
24
|
+
this.cache = new Map();
|
|
25
|
+
this.maxSize = maxSize;
|
|
26
|
+
}
|
|
27
|
+
get(key) {
|
|
28
|
+
const value = this.cache.get(key);
|
|
29
|
+
if (value !== undefined) {
|
|
30
|
+
// Move to end (most recently used)
|
|
31
|
+
this.cache.delete(key);
|
|
32
|
+
this.cache.set(key, value);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
set(key, value) {
|
|
37
|
+
if (this.cache.has(key)) {
|
|
38
|
+
this.cache.delete(key);
|
|
39
|
+
}
|
|
40
|
+
else if (this.cache.size >= this.maxSize) {
|
|
41
|
+
// Evict oldest
|
|
42
|
+
const firstKey = this.cache.keys().next().value;
|
|
43
|
+
if (firstKey !== undefined) {
|
|
44
|
+
this.cache.delete(firstKey);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
this.cache.set(key, value);
|
|
48
|
+
}
|
|
49
|
+
clear() {
|
|
50
|
+
this.cache.clear();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Execution Interceptor
|
|
55
|
+
*
|
|
56
|
+
* Core Design:
|
|
57
|
+
* 1. Hash-based cache lookup (sub-millisecond)
|
|
58
|
+
* 2. Deterministic policy evaluation (no ML in hot path)
|
|
59
|
+
* 3. Fixed-budget timeout (never exceeds 5ms)
|
|
60
|
+
* 4. Synchronous decision, async logging
|
|
61
|
+
*/
|
|
62
|
+
class ExecutionInterceptor {
|
|
63
|
+
constructor(config = {}) {
|
|
64
|
+
this.config = {
|
|
65
|
+
failOpen: true,
|
|
66
|
+
maxLatencyMs: 5,
|
|
67
|
+
cacheSize: 10000,
|
|
68
|
+
defaultPolicy: {
|
|
69
|
+
maxCostPerSession: 10, // $10 default
|
|
70
|
+
maxStepsPerSession: 50, // 50 steps default
|
|
71
|
+
maxCostPerRequest: 5, // $5 per request default
|
|
72
|
+
},
|
|
73
|
+
...config,
|
|
74
|
+
};
|
|
75
|
+
this.cache = new LRUCache(this.config.cacheSize);
|
|
76
|
+
this.metrics = {
|
|
77
|
+
totalRequests: 0,
|
|
78
|
+
cacheHits: 0,
|
|
79
|
+
blockedRequests: 0,
|
|
80
|
+
avgLatencyMs: 0,
|
|
81
|
+
p95LatencyMs: 0,
|
|
82
|
+
latencySamples: [],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Main interception method
|
|
87
|
+
* MUST complete in <5ms p95
|
|
88
|
+
*/
|
|
89
|
+
intercept(request) {
|
|
90
|
+
const startTime = perf_hooks_1.performance.now();
|
|
91
|
+
try {
|
|
92
|
+
// 1. Check cache (sub-millisecond path)
|
|
93
|
+
const cacheKey = this.generateCacheKey(request);
|
|
94
|
+
const cached = this.cache.get(cacheKey);
|
|
95
|
+
if (cached) {
|
|
96
|
+
this.metrics.cacheHits++;
|
|
97
|
+
this.recordLatency(perf_hooks_1.performance.now() - startTime);
|
|
98
|
+
return { ...cached, cacheHit: true, latencyMs: perf_hooks_1.performance.now() - startTime };
|
|
99
|
+
}
|
|
100
|
+
// 2. Risk scoring (<2ms)
|
|
101
|
+
const riskScore = this.calculateRiskScore(request);
|
|
102
|
+
// 3. Policy evaluation (<2ms)
|
|
103
|
+
const policyResult = this.evaluatePolicy(request, riskScore);
|
|
104
|
+
// 4. Build decision
|
|
105
|
+
const result = {
|
|
106
|
+
decision: policyResult.block ? 'block' : 'allow',
|
|
107
|
+
reason: policyResult.reason,
|
|
108
|
+
riskScore,
|
|
109
|
+
confidence: policyResult.confidence,
|
|
110
|
+
latencyMs: 0, // Will set after
|
|
111
|
+
policyTriggered: policyResult.policyName,
|
|
112
|
+
estimatedSavings: policyResult.block ? request.estimatedCost : 0,
|
|
113
|
+
cacheHit: false,
|
|
114
|
+
};
|
|
115
|
+
// 5. Cache the decision
|
|
116
|
+
this.cache.set(cacheKey, result);
|
|
117
|
+
// 6. Record metrics
|
|
118
|
+
const latency = perf_hooks_1.performance.now() - startTime;
|
|
119
|
+
result.latencyMs = latency;
|
|
120
|
+
this.recordLatency(latency);
|
|
121
|
+
if (result.decision === 'block') {
|
|
122
|
+
this.metrics.blockedRequests++;
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
// Fail-open: log error but allow execution
|
|
128
|
+
console.error('[AECL] Interceptor error:', error);
|
|
129
|
+
return {
|
|
130
|
+
decision: this.config.failOpen ? 'allow' : 'block',
|
|
131
|
+
reason: `Interceptor error: ${error instanceof Error ? error.message : 'unknown'}`,
|
|
132
|
+
riskScore: 0,
|
|
133
|
+
confidence: 0,
|
|
134
|
+
latencyMs: perf_hooks_1.performance.now() - startTime,
|
|
135
|
+
cacheHit: false,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Risk scoring - deterministic, explainable
|
|
141
|
+
* Returns 0-1 risk score
|
|
142
|
+
*/
|
|
143
|
+
calculateRiskScore(request) {
|
|
144
|
+
const ctx = request.context;
|
|
145
|
+
let riskFactors = [];
|
|
146
|
+
// Factor 1: Cost escalation risk
|
|
147
|
+
const sessionCostRatio = ctx.totalCost / this.config.defaultPolicy.maxCostPerSession;
|
|
148
|
+
if (sessionCostRatio > 0.8)
|
|
149
|
+
riskFactors.push(0.9);
|
|
150
|
+
else if (sessionCostRatio > 0.5)
|
|
151
|
+
riskFactors.push(0.6);
|
|
152
|
+
else if (sessionCostRatio > 0.2)
|
|
153
|
+
riskFactors.push(0.3);
|
|
154
|
+
// Factor 2: Step count risk (potential infinite loop)
|
|
155
|
+
const stepRatio = ctx.stepNumber / this.config.defaultPolicy.maxStepsPerSession;
|
|
156
|
+
if (stepRatio > 0.9)
|
|
157
|
+
riskFactors.push(0.95);
|
|
158
|
+
else if (stepRatio > 0.7)
|
|
159
|
+
riskFactors.push(0.7);
|
|
160
|
+
else if (stepRatio > 0.5)
|
|
161
|
+
riskFactors.push(0.4);
|
|
162
|
+
// Factor 3: Single request cost
|
|
163
|
+
const requestCostRatio = request.estimatedCost / this.config.defaultPolicy.maxCostPerRequest;
|
|
164
|
+
if (requestCostRatio > 1.0)
|
|
165
|
+
riskFactors.push(1.0);
|
|
166
|
+
else if (requestCostRatio > 0.8)
|
|
167
|
+
riskFactors.push(0.8);
|
|
168
|
+
// Combine factors (max risk dominates)
|
|
169
|
+
return riskFactors.length > 0 ? Math.max(...riskFactors) : 0.1;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Policy evaluation - simple, deterministic rules
|
|
173
|
+
*/
|
|
174
|
+
evaluatePolicy(request, riskScore) {
|
|
175
|
+
const ctx = request.context;
|
|
176
|
+
const policy = this.config.defaultPolicy;
|
|
177
|
+
// Policy 1: Hard cost limit per session
|
|
178
|
+
if (ctx.totalCost + request.estimatedCost > policy.maxCostPerSession) {
|
|
179
|
+
return {
|
|
180
|
+
block: true,
|
|
181
|
+
reason: `Session cost limit exceeded: $${ctx.totalCost.toFixed(2)} + $${request.estimatedCost.toFixed(2)} > $${policy.maxCostPerSession}`,
|
|
182
|
+
confidence: 1.0,
|
|
183
|
+
policyName: 'session_cost_limit',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// Policy 2: Step limit (loop prevention)
|
|
187
|
+
if (ctx.stepNumber >= policy.maxStepsPerSession) {
|
|
188
|
+
return {
|
|
189
|
+
block: true,
|
|
190
|
+
reason: `Step limit reached: ${ctx.stepNumber} >= ${policy.maxStepsPerSession}`,
|
|
191
|
+
confidence: 1.0,
|
|
192
|
+
policyName: 'step_limit',
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
// Policy 3: Single request cost
|
|
196
|
+
if (request.estimatedCost > policy.maxCostPerRequest) {
|
|
197
|
+
return {
|
|
198
|
+
block: true,
|
|
199
|
+
reason: `Request cost too high: $${request.estimatedCost.toFixed(2)} > $${policy.maxCostPerRequest}`,
|
|
200
|
+
confidence: 1.0,
|
|
201
|
+
policyName: 'request_cost_limit',
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// Policy 4: Risk threshold
|
|
205
|
+
if (riskScore > 0.85) {
|
|
206
|
+
return {
|
|
207
|
+
block: true,
|
|
208
|
+
reason: `High risk score: ${(riskScore * 100).toFixed(0)}%`,
|
|
209
|
+
confidence: riskScore,
|
|
210
|
+
policyName: 'risk_threshold',
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Allow with confidence based on risk
|
|
214
|
+
return {
|
|
215
|
+
block: false,
|
|
216
|
+
reason: riskScore > 0.5 ? `Elevated risk: ${(riskScore * 100).toFixed(0)}%` : 'Low risk',
|
|
217
|
+
confidence: 1 - riskScore,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Generate cache key for request
|
|
222
|
+
*/
|
|
223
|
+
generateCacheKey(request) {
|
|
224
|
+
// Hash of: sessionId + stepNumber + operation + estimatedCost
|
|
225
|
+
const key = `${request.context.sessionId}:${request.context.stepNumber}:${request.operation}:${request.estimatedCost}`;
|
|
226
|
+
return (0, crypto_1.createHash)('sha256').update(key).digest('hex').substring(0, 32);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Record latency metrics
|
|
230
|
+
*/
|
|
231
|
+
recordLatency(latencyMs) {
|
|
232
|
+
this.metrics.totalRequests++;
|
|
233
|
+
this.metrics.latencySamples.push(latencyMs);
|
|
234
|
+
// Keep only last 1000 samples for p95 calc
|
|
235
|
+
if (this.metrics.latencySamples.length > 1000) {
|
|
236
|
+
this.metrics.latencySamples.shift();
|
|
237
|
+
}
|
|
238
|
+
// Update avg
|
|
239
|
+
const prevAvg = this.metrics.avgLatencyMs;
|
|
240
|
+
const n = this.metrics.totalRequests;
|
|
241
|
+
this.metrics.avgLatencyMs = (prevAvg * (n - 1) + latencyMs) / n;
|
|
242
|
+
// Update p95 (simplified)
|
|
243
|
+
if (this.metrics.latencySamples.length >= 100) {
|
|
244
|
+
const sorted = [...this.metrics.latencySamples].sort((a, b) => a - b);
|
|
245
|
+
this.metrics.p95LatencyMs = sorted[Math.floor(sorted.length * 0.95)];
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get metrics for ROI telemetry
|
|
250
|
+
*/
|
|
251
|
+
getMetrics() {
|
|
252
|
+
return {
|
|
253
|
+
...this.metrics,
|
|
254
|
+
cacheHitRate: this.metrics.totalRequests > 0
|
|
255
|
+
? this.metrics.cacheHits / this.metrics.totalRequests
|
|
256
|
+
: 0,
|
|
257
|
+
blockRate: this.metrics.totalRequests > 0
|
|
258
|
+
? this.metrics.blockedRequests / this.metrics.totalRequests
|
|
259
|
+
: 0,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Reset (for testing)
|
|
264
|
+
*/
|
|
265
|
+
reset() {
|
|
266
|
+
this.cache.clear();
|
|
267
|
+
this.metrics = {
|
|
268
|
+
totalRequests: 0,
|
|
269
|
+
cacheHits: 0,
|
|
270
|
+
blockedRequests: 0,
|
|
271
|
+
avgLatencyMs: 0,
|
|
272
|
+
p95LatencyMs: 0,
|
|
273
|
+
latencySamples: [],
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
exports.ExecutionInterceptor = ExecutionInterceptor;
|
|
278
|
+
// Export singleton for simple use cases
|
|
279
|
+
exports.interceptor = new ExecutionInterceptor();
|
|
280
|
+
//# sourceMappingURL=ExecutionInterceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionInterceptor.js","sourceRoot":"","sources":["../../src/aecl/ExecutionInterceptor.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,2CAAyC;AACzC,mCAAoC;AA+CpC,2DAA2D;AAC3D,MAAM,QAAQ;IAIZ,YAAY,OAAe;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,GAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,mCAAmC;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,eAAe;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAa,oBAAoB;IAY/B,YAAY,SAAqC,EAAE;QACjD,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE;gBACb,iBAAiB,EAAE,EAAE,EAAK,cAAc;gBACxC,kBAAkB,EAAE,EAAE,EAAI,mBAAmB;gBAC7C,iBAAiB,EAAE,CAAC,EAAM,yBAAyB;aACpD;YACD,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG;YACb,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,eAAe,EAAE,CAAC;YAClB,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,EAAE;SACnB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,OAAyB;QACjC,MAAM,SAAS,GAAG,wBAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,wCAAwC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAExC,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACzB,IAAI,CAAC,aAAa,CAAC,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;gBAClD,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;YACjF,CAAC;YAED,yBAAyB;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAEnD,8BAA8B;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAE7D,oBAAoB;YACpB,MAAM,MAAM,GAAmB;gBAC7B,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBAChD,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,SAAS;gBACT,UAAU,EAAE,YAAY,CAAC,UAAU;gBACnC,SAAS,EAAE,CAAC,EAAE,iBAAiB;gBAC/B,eAAe,EAAE,YAAY,CAAC,UAAU;gBACxC,gBAAgB,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBAChE,QAAQ,EAAE,KAAK;aAChB,CAAC;YAEF,wBAAwB;YACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAEjC,oBAAoB;YACpB,MAAM,OAAO,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC9C,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAE5B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACjC,CAAC;YAED,OAAO,MAAM,CAAC;QAEhB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2CAA2C;YAC3C,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAElD,OAAO;gBACL,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBAClD,MAAM,EAAE,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE;gBAClF,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS;gBACxC,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,OAAyB;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;QAC5B,IAAI,WAAW,GAAa,EAAE,CAAC;QAE/B,iCAAiC;QACjC,MAAM,gBAAgB,GAAG,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC;QACrF,IAAI,gBAAgB,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC7C,IAAI,gBAAgB,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAClD,IAAI,gBAAgB,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvD,sDAAsD;QACtD,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC;QAChF,IAAI,SAAS,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACvC,IAAI,SAAS,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC3C,IAAI,SAAS,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEhD,gCAAgC;QAChC,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC;QAC7F,IAAI,gBAAgB,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC7C,IAAI,gBAAgB,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvD,uCAAuC;QACvC,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjE,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAyB,EAAE,SAAiB;QAMjE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QAEzC,wCAAwC;QACxC,IAAI,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACrE,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,iCAAiC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,iBAAiB,EAAE;gBACzI,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,oBAAoB;aACjC,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,IAAI,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAChD,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,uBAAuB,GAAG,CAAC,UAAU,OAAO,MAAM,CAAC,kBAAkB,EAAE;gBAC/E,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,YAAY;aACzB,CAAC;QACJ,CAAC;QAED,gCAAgC;QAChC,IAAI,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACrD,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,2BAA2B,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,iBAAiB,EAAE;gBACpG,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,oBAAoB;aACjC,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;YACrB,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,oBAAoB,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;gBAC3D,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,gBAAgB;aAC7B,CAAC;QACJ,CAAC;QAED,sCAAsC;QACtC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;YACxF,UAAU,EAAE,CAAC,GAAG,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAyB;QAChD,8DAA8D;QAC9D,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QACvH,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,SAAiB;QACrC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE5C,2CAA2C;QAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;QAED,aAAa;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAEhE,0BAA0B;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO;YACL,GAAG,IAAI,CAAC,OAAO;YACf,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC;gBAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;gBACrD,CAAC,CAAC,CAAC;YACL,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;gBAC3D,CAAC,CAAC,CAAC;SACN,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG;YACb,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,eAAe,EAAE,CAAC;YAClB,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,EAAE;SACnB,CAAC;IACJ,CAAC;CACF;AA5PD,oDA4PC;AAED,wCAAwC;AAC3B,QAAA,WAAW,GAAG,IAAI,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AECL - Execution Memory Layer
|
|
3
|
+
*
|
|
4
|
+
* Stores ONLY:
|
|
5
|
+
* - Hashed execution traces (no raw prompts)
|
|
6
|
+
* - Cost metrics per session
|
|
7
|
+
* - Loop signatures for deduplication
|
|
8
|
+
*
|
|
9
|
+
* DESIGN:
|
|
10
|
+
* - In-memory with optional persistence
|
|
11
|
+
* - Automatic TTL eviction (1 hour default)
|
|
12
|
+
* - Fixed memory budget (no unbounded growth)
|
|
13
|
+
*/
|
|
14
|
+
export interface ExecutionTrace {
|
|
15
|
+
sessionId: string;
|
|
16
|
+
stepNumber: number;
|
|
17
|
+
operation: string;
|
|
18
|
+
inputHash: string;
|
|
19
|
+
outputHash?: string;
|
|
20
|
+
cost: number;
|
|
21
|
+
tokens: number;
|
|
22
|
+
timestamp: number;
|
|
23
|
+
durationMs: number;
|
|
24
|
+
}
|
|
25
|
+
export interface SessionMemory {
|
|
26
|
+
sessionId: string;
|
|
27
|
+
startTime: number;
|
|
28
|
+
traces: ExecutionTrace[];
|
|
29
|
+
totalCost: number;
|
|
30
|
+
totalTokens: number;
|
|
31
|
+
stepCount: number;
|
|
32
|
+
lastActivity: number;
|
|
33
|
+
}
|
|
34
|
+
export interface DeduplicationResult {
|
|
35
|
+
isDuplicate: boolean;
|
|
36
|
+
previousOccurrences: number;
|
|
37
|
+
similarTraces: ExecutionTrace[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Execution Memory
|
|
41
|
+
*
|
|
42
|
+
* In-memory storage with TTL eviction.
|
|
43
|
+
* No raw data stored - only hashes and metrics.
|
|
44
|
+
*/
|
|
45
|
+
export declare class ExecutionMemory {
|
|
46
|
+
private sessions;
|
|
47
|
+
private maxSessions;
|
|
48
|
+
private ttlMs;
|
|
49
|
+
private maxTracesPerSession;
|
|
50
|
+
constructor(config?: {
|
|
51
|
+
maxSessions?: number;
|
|
52
|
+
ttlMinutes?: number;
|
|
53
|
+
maxTracesPerSession?: number;
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* Record execution trace
|
|
57
|
+
*/
|
|
58
|
+
record(trace: ExecutionTrace): void;
|
|
59
|
+
/**
|
|
60
|
+
* Check for deduplication
|
|
61
|
+
* Returns count of similar traces in session
|
|
62
|
+
*/
|
|
63
|
+
checkDeduplication(sessionId: string, inputHash: string, operation: string): DeduplicationResult;
|
|
64
|
+
/**
|
|
65
|
+
* Get session metrics
|
|
66
|
+
*/
|
|
67
|
+
getSession(sessionId: string): SessionMemory | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Get all session IDs
|
|
70
|
+
*/
|
|
71
|
+
getSessionIds(): string[];
|
|
72
|
+
/**
|
|
73
|
+
* Clear session (on completion or error)
|
|
74
|
+
*/
|
|
75
|
+
clearSession(sessionId: string): void;
|
|
76
|
+
/**
|
|
77
|
+
* Get global stats
|
|
78
|
+
*/
|
|
79
|
+
getStats(): {
|
|
80
|
+
activeSessions: number;
|
|
81
|
+
totalTraces: number;
|
|
82
|
+
totalCost: number;
|
|
83
|
+
avgTracesPerSession: number;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Hash content (for input/output hashing)
|
|
87
|
+
*/
|
|
88
|
+
hashContent(content: string): string;
|
|
89
|
+
/**
|
|
90
|
+
* Cleanup expired sessions
|
|
91
|
+
*/
|
|
92
|
+
private cleanup;
|
|
93
|
+
/**
|
|
94
|
+
* Evict oldest session when at capacity
|
|
95
|
+
*/
|
|
96
|
+
private evictOldest;
|
|
97
|
+
/**
|
|
98
|
+
* Reset (for testing)
|
|
99
|
+
*/
|
|
100
|
+
reset(): void;
|
|
101
|
+
}
|
|
102
|
+
export declare const executionMemory: ExecutionMemory;
|
|
103
|
+
//# sourceMappingURL=ExecutionMemory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionMemory.d.ts","sourceRoot":"","sources":["../../src/aecl/ExecutionMemory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,cAAc,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,mBAAmB,CAAS;gBAExB,MAAM,CAAC,EAAE;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B;IAUD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAkCnC;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB;IAkBhG;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIxD;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,QAAQ,IAAI;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B;IAmBD;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIpC;;OAEG;IACH,OAAO,CAAC,OAAO;IAmBf;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|