@vorionsys/atsf-core 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -0
- package/LICENSE +1 -1
- package/README.md +82 -29
- package/dist/adapters/base-adapter.d.ts +94 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +233 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/types.d.ts +83 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +4 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/webhook-handler.d.ts +64 -0
- package/dist/adapters/webhook-handler.d.ts.map +1 -0
- package/dist/adapters/webhook-handler.js +170 -0
- package/dist/adapters/webhook-handler.js.map +1 -0
- package/dist/api/index.d.ts +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +3 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/server.d.ts +2 -2
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +149 -184
- package/dist/api/server.js.map +1 -1
- package/dist/arbitration/index.d.ts +4 -12
- package/dist/arbitration/index.d.ts.map +1 -1
- package/dist/arbitration/index.js +43 -46
- package/dist/arbitration/index.js.map +1 -1
- package/dist/arbitration/types.d.ts +10 -10
- package/dist/arbitration/types.d.ts.map +1 -1
- package/dist/arbitration/types.js +2 -8
- package/dist/arbitration/types.js.map +1 -1
- package/dist/basis/evaluator.d.ts +1 -6
- package/dist/basis/evaluator.d.ts.map +1 -1
- package/dist/basis/evaluator.js +56 -56
- package/dist/basis/evaluator.js.map +1 -1
- package/dist/basis/index.d.ts +3 -3
- package/dist/basis/index.d.ts.map +1 -1
- package/dist/basis/index.js +5 -3
- package/dist/basis/index.js.map +1 -1
- package/dist/basis/parser.d.ts +30 -30
- package/dist/basis/parser.d.ts.map +1 -1
- package/dist/basis/parser.js +27 -32
- package/dist/basis/parser.js.map +1 -1
- package/dist/basis/types.d.ts +2 -2
- package/dist/basis/types.d.ts.map +1 -1
- package/dist/basis/types.js +2 -3
- package/dist/basis/types.js.map +1 -1
- package/dist/chain/index.d.ts +0 -8
- package/dist/chain/index.d.ts.map +1 -1
- package/dist/chain/index.js +18 -16
- package/dist/chain/index.js.map +1 -1
- package/dist/cognigate/index.d.ts +1 -9
- package/dist/cognigate/index.d.ts.map +1 -1
- package/dist/cognigate/index.js +35 -44
- package/dist/cognigate/index.js.map +1 -1
- package/dist/common/adapters.d.ts +4 -4
- package/dist/common/adapters.d.ts.map +1 -1
- package/dist/common/adapters.js +54 -70
- package/dist/common/adapters.js.map +1 -1
- package/dist/common/config.d.ts +69 -68
- package/dist/common/config.d.ts.map +1 -1
- package/dist/common/config.js +52 -50
- package/dist/common/config.js.map +1 -1
- package/dist/common/index.d.ts +4 -4
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +6 -4
- package/dist/common/index.js.map +1 -1
- package/dist/common/logger.d.ts +1 -1
- package/dist/common/logger.d.ts.map +1 -1
- package/dist/common/logger.js +10 -8
- package/dist/common/logger.js.map +1 -1
- package/dist/common/types.d.ts +12 -12
- package/dist/common/types.d.ts.map +1 -1
- package/dist/common/types.js +7 -14
- package/dist/common/types.js.map +1 -1
- package/dist/containment/index.d.ts +3 -11
- package/dist/containment/index.d.ts.map +1 -1
- package/dist/containment/index.js +107 -119
- package/dist/containment/index.js.map +1 -1
- package/dist/containment/types.d.ts +11 -11
- package/dist/containment/types.d.ts.map +1 -1
- package/dist/containment/types.js +2 -8
- package/dist/containment/types.js.map +1 -1
- package/dist/contracts/index.d.ts +9 -17
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +56 -59
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/types.d.ts +12 -12
- package/dist/contracts/types.d.ts.map +1 -1
- package/dist/contracts/types.js +2 -8
- package/dist/contracts/types.js.map +1 -1
- package/dist/crewai/callback.d.ts +2 -9
- package/dist/crewai/callback.d.ts.map +1 -1
- package/dist/crewai/callback.js +29 -27
- package/dist/crewai/callback.js.map +1 -1
- package/dist/crewai/executor.d.ts +95 -11
- package/dist/crewai/executor.d.ts.map +1 -1
- package/dist/crewai/executor.js +459 -16
- package/dist/crewai/executor.js.map +1 -1
- package/dist/crewai/index.d.ts +4 -4
- package/dist/crewai/index.d.ts.map +1 -1
- package/dist/crewai/index.js +6 -4
- package/dist/crewai/index.js.map +1 -1
- package/dist/crewai/tools.d.ts +1 -1
- package/dist/crewai/tools.d.ts.map +1 -1
- package/dist/crewai/tools.js +40 -46
- package/dist/crewai/tools.js.map +1 -1
- package/dist/crewai/types.d.ts +66 -3
- package/dist/crewai/types.d.ts.map +1 -1
- package/dist/crewai/types.js +2 -7
- package/dist/crewai/types.js.map +1 -1
- package/dist/enforce/index.d.ts +226 -19
- package/dist/enforce/index.d.ts.map +1 -1
- package/dist/enforce/index.js +55 -81
- package/dist/enforce/index.js.map +1 -1
- package/dist/enforce/trust-aware-enforcement-service.d.ts +8 -23
- package/dist/enforce/trust-aware-enforcement-service.d.ts.map +1 -1
- package/dist/enforce/trust-aware-enforcement-service.js +109 -125
- package/dist/enforce/trust-aware-enforcement-service.js.map +1 -1
- package/dist/governance/fluid-workflow.d.ts +8 -16
- package/dist/governance/fluid-workflow.d.ts.map +1 -1
- package/dist/governance/fluid-workflow.js +88 -114
- package/dist/governance/fluid-workflow.js.map +1 -1
- package/dist/governance/index.d.ts +7 -15
- package/dist/governance/index.d.ts.map +1 -1
- package/dist/governance/index.js +76 -81
- package/dist/governance/index.js.map +1 -1
- package/dist/governance/proof-bridge.d.ts +6 -6
- package/dist/governance/proof-bridge.d.ts.map +1 -1
- package/dist/governance/proof-bridge.js +6 -16
- package/dist/governance/proof-bridge.js.map +1 -1
- package/dist/governance/types.d.ts +9 -16
- package/dist/governance/types.d.ts.map +1 -1
- package/dist/governance/types.js +2 -8
- package/dist/governance/types.js.map +1 -1
- package/dist/index.d.ts +30 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -31
- package/dist/index.js.map +1 -1
- package/dist/intent/index.d.ts +55 -18
- package/dist/intent/index.d.ts.map +1 -1
- package/dist/intent/index.js +25 -26
- package/dist/intent/index.js.map +1 -1
- package/dist/intent/persistent-intent-service.d.ts +2 -17
- package/dist/intent/persistent-intent-service.d.ts.map +1 -1
- package/dist/intent/persistent-intent-service.js +33 -43
- package/dist/intent/persistent-intent-service.js.map +1 -1
- package/dist/intent/supabase-intent-repository.d.ts +107 -0
- package/dist/intent/supabase-intent-repository.d.ts.map +1 -0
- package/dist/intent/supabase-intent-repository.js +406 -0
- package/dist/intent/supabase-intent-repository.js.map +1 -0
- package/dist/intent-gateway/index.d.ts +5 -28
- package/dist/intent-gateway/index.d.ts.map +1 -1
- package/dist/intent-gateway/index.js +341 -508
- package/dist/intent-gateway/index.js.map +1 -1
- package/dist/langchain/callback.d.ts +2 -9
- package/dist/langchain/callback.d.ts.map +1 -1
- package/dist/langchain/callback.js +32 -30
- package/dist/langchain/callback.js.map +1 -1
- package/dist/langchain/executor.d.ts +4 -11
- package/dist/langchain/executor.d.ts.map +1 -1
- package/dist/langchain/executor.js +82 -82
- package/dist/langchain/executor.js.map +1 -1
- package/dist/langchain/index.d.ts +5 -5
- package/dist/langchain/index.d.ts.map +1 -1
- package/dist/langchain/index.js +7 -5
- package/dist/langchain/index.js.map +1 -1
- package/dist/langchain/tools.d.ts +1 -1
- package/dist/langchain/tools.d.ts.map +1 -1
- package/dist/langchain/tools.js +36 -43
- package/dist/langchain/tools.js.map +1 -1
- package/dist/langchain/types.d.ts +3 -3
- package/dist/langchain/types.d.ts.map +1 -1
- package/dist/langchain/types.js +2 -7
- package/dist/langchain/types.js.map +1 -1
- package/dist/layers/implementations/L0-request-format.d.ts +2 -2
- package/dist/layers/implementations/L0-request-format.d.ts.map +1 -1
- package/dist/layers/implementations/L0-request-format.js +54 -54
- package/dist/layers/implementations/L0-request-format.js.map +1 -1
- package/dist/layers/implementations/L1-input-size.d.ts +2 -2
- package/dist/layers/implementations/L1-input-size.d.ts.map +1 -1
- package/dist/layers/implementations/L1-input-size.js +41 -49
- package/dist/layers/implementations/L1-input-size.js.map +1 -1
- package/dist/layers/implementations/L2-charset-sanitizer.d.ts +2 -2
- package/dist/layers/implementations/L2-charset-sanitizer.d.ts.map +1 -1
- package/dist/layers/implementations/L2-charset-sanitizer.js +73 -81
- package/dist/layers/implementations/L2-charset-sanitizer.js.map +1 -1
- package/dist/layers/implementations/L3-schema-conformance.d.ts +3 -3
- package/dist/layers/implementations/L3-schema-conformance.d.ts.map +1 -1
- package/dist/layers/implementations/L3-schema-conformance.js +75 -82
- package/dist/layers/implementations/L3-schema-conformance.js.map +1 -1
- package/dist/layers/implementations/L4-injection-detector.d.ts +4 -4
- package/dist/layers/implementations/L4-injection-detector.d.ts.map +1 -1
- package/dist/layers/implementations/L4-injection-detector.js +83 -85
- package/dist/layers/implementations/L4-injection-detector.js.map +1 -1
- package/dist/layers/implementations/L5-rate-limiter.d.ts +2 -2
- package/dist/layers/implementations/L5-rate-limiter.d.ts.map +1 -1
- package/dist/layers/implementations/L5-rate-limiter.js +22 -20
- package/dist/layers/implementations/L5-rate-limiter.js.map +1 -1
- package/dist/layers/implementations/index.d.ts +6 -6
- package/dist/layers/implementations/index.d.ts.map +1 -1
- package/dist/layers/implementations/index.js +8 -6
- package/dist/layers/implementations/index.js.map +1 -1
- package/dist/layers/index.d.ts +3 -11
- package/dist/layers/index.d.ts.map +1 -1
- package/dist/layers/index.js +73 -99
- package/dist/layers/index.js.map +1 -1
- package/dist/layers/types.d.ts +16 -16
- package/dist/layers/types.d.ts.map +1 -1
- package/dist/layers/types.js +2 -8
- package/dist/layers/types.js.map +1 -1
- package/dist/paramesphere/activation-collector.d.ts +128 -0
- package/dist/paramesphere/activation-collector.d.ts.map +1 -0
- package/dist/paramesphere/activation-collector.js +260 -0
- package/dist/paramesphere/activation-collector.js.map +1 -0
- package/dist/paramesphere/cognitive-envelope.d.ts +73 -0
- package/dist/paramesphere/cognitive-envelope.d.ts.map +1 -0
- package/dist/paramesphere/cognitive-envelope.js +209 -0
- package/dist/paramesphere/cognitive-envelope.js.map +1 -0
- package/dist/paramesphere/envelope-integration.d.ts +60 -0
- package/dist/paramesphere/envelope-integration.d.ts.map +1 -0
- package/dist/paramesphere/envelope-integration.js +93 -0
- package/dist/paramesphere/envelope-integration.js.map +1 -0
- package/dist/paramesphere/fingerprint-monitor.d.ts +136 -0
- package/dist/paramesphere/fingerprint-monitor.d.ts.map +1 -0
- package/dist/paramesphere/fingerprint-monitor.js +212 -0
- package/dist/paramesphere/fingerprint-monitor.js.map +1 -0
- package/dist/paramesphere/fingerprint-store.d.ts +85 -0
- package/dist/paramesphere/fingerprint-store.d.ts.map +1 -0
- package/dist/paramesphere/fingerprint-store.js +68 -0
- package/dist/paramesphere/fingerprint-store.js.map +1 -0
- package/dist/paramesphere/index.d.ts +21 -0
- package/dist/paramesphere/index.d.ts.map +1 -0
- package/dist/paramesphere/index.js +18 -0
- package/dist/paramesphere/index.js.map +1 -0
- package/dist/paramesphere/monitor-integration.d.ts +37 -0
- package/dist/paramesphere/monitor-integration.d.ts.map +1 -0
- package/dist/paramesphere/monitor-integration.js +81 -0
- package/dist/paramesphere/monitor-integration.js.map +1 -0
- package/dist/paramesphere/paramesphere-engine.d.ts +111 -0
- package/dist/paramesphere/paramesphere-engine.d.ts.map +1 -0
- package/dist/paramesphere/paramesphere-engine.js +542 -0
- package/dist/paramesphere/paramesphere-engine.js.map +1 -0
- package/dist/paramesphere/types.d.ts +142 -0
- package/dist/paramesphere/types.d.ts.map +1 -0
- package/dist/paramesphere/types.js +4 -0
- package/dist/paramesphere/types.js.map +1 -0
- package/dist/persistence/file.d.ts +3 -10
- package/dist/persistence/file.d.ts.map +1 -1
- package/dist/persistence/file.js +30 -32
- package/dist/persistence/file.js.map +1 -1
- package/dist/persistence/index.d.ts +7 -7
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +20 -18
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/memory.d.ts +3 -3
- package/dist/persistence/memory.d.ts.map +1 -1
- package/dist/persistence/memory.js +10 -17
- package/dist/persistence/memory.js.map +1 -1
- package/dist/persistence/sqlite.d.ts +3 -11
- package/dist/persistence/sqlite.d.ts.map +1 -1
- package/dist/persistence/sqlite.js +42 -39
- package/dist/persistence/sqlite.js.map +1 -1
- package/dist/persistence/supabase.d.ts +3 -3
- package/dist/persistence/supabase.d.ts.map +1 -1
- package/dist/persistence/supabase.js +46 -49
- package/dist/persistence/supabase.js.map +1 -1
- package/dist/persistence/types.d.ts +5 -5
- package/dist/persistence/types.d.ts.map +1 -1
- package/dist/persistence/types.js +2 -7
- package/dist/persistence/types.js.map +1 -1
- package/dist/phase6/ceiling.d.ts +5 -21
- package/dist/phase6/ceiling.d.ts.map +1 -1
- package/dist/phase6/ceiling.js +38 -69
- package/dist/phase6/ceiling.js.map +1 -1
- package/dist/phase6/context.d.ts +3 -20
- package/dist/phase6/context.d.ts.map +1 -1
- package/dist/phase6/context.js +49 -93
- package/dist/phase6/context.js.map +1 -1
- package/dist/phase6/index.d.ts +12 -12
- package/dist/phase6/index.d.ts.map +1 -1
- package/dist/phase6/index.js +17 -15
- package/dist/phase6/index.js.map +1 -1
- package/dist/phase6/presets.d.ts +2 -18
- package/dist/phase6/presets.d.ts.map +1 -1
- package/dist/phase6/presets.js +35 -39
- package/dist/phase6/presets.js.map +1 -1
- package/dist/phase6/provenance.d.ts +4 -19
- package/dist/phase6/provenance.d.ts.map +1 -1
- package/dist/phase6/provenance.js +37 -42
- package/dist/phase6/provenance.js.map +1 -1
- package/dist/phase6/role-gates/index.d.ts +2 -2
- package/dist/phase6/role-gates/index.d.ts.map +1 -1
- package/dist/phase6/role-gates/index.js +4 -2
- package/dist/phase6/role-gates/index.js.map +1 -1
- package/dist/phase6/role-gates/kernel.d.ts.map +1 -1
- package/dist/phase6/role-gates/kernel.js +18 -16
- package/dist/phase6/role-gates/kernel.js.map +1 -1
- package/dist/phase6/role-gates/policy.d.ts +2 -2
- package/dist/phase6/role-gates/policy.d.ts.map +1 -1
- package/dist/phase6/role-gates/policy.js +8 -17
- package/dist/phase6/role-gates/policy.js.map +1 -1
- package/dist/phase6/role-gates.d.ts +4 -20
- package/dist/phase6/role-gates.d.ts.map +1 -1
- package/dist/phase6/role-gates.js +60 -80
- package/dist/phase6/role-gates.js.map +1 -1
- package/dist/phase6/types.d.ts +53 -23
- package/dist/phase6/types.d.ts.map +1 -1
- package/dist/phase6/types.js +131 -177
- package/dist/phase6/types.js.map +1 -1
- package/dist/phase6/weight-presets/canonical.d.ts.map +1 -1
- package/dist/phase6/weight-presets/canonical.js +12 -10
- package/dist/phase6/weight-presets/canonical.js.map +1 -1
- package/dist/phase6/weight-presets/deltas.d.ts +2 -2
- package/dist/phase6/weight-presets/deltas.d.ts.map +1 -1
- package/dist/phase6/weight-presets/deltas.js +29 -37
- package/dist/phase6/weight-presets/deltas.js.map +1 -1
- package/dist/phase6/weight-presets/index.d.ts +3 -3
- package/dist/phase6/weight-presets/index.d.ts.map +1 -1
- package/dist/phase6/weight-presets/index.js +5 -3
- package/dist/phase6/weight-presets/index.js.map +1 -1
- package/dist/phase6/weight-presets/merger.d.ts +2 -12
- package/dist/phase6/weight-presets/merger.d.ts.map +1 -1
- package/dist/phase6/weight-presets/merger.js +45 -39
- package/dist/phase6/weight-presets/merger.js.map +1 -1
- package/dist/proof/index.d.ts +6 -13
- package/dist/proof/index.d.ts.map +1 -1
- package/dist/proof/index.js +63 -51
- package/dist/proof/index.js.map +1 -1
- package/dist/proof/merkle.d.ts +24 -19
- package/dist/proof/merkle.d.ts.map +1 -1
- package/dist/proof/merkle.js +118 -32
- package/dist/proof/merkle.js.map +1 -1
- package/dist/proof/zk-proofs.d.ts +6 -24
- package/dist/proof/zk-proofs.d.ts.map +1 -1
- package/dist/proof/zk-proofs.js +45 -42
- package/dist/proof/zk-proofs.js.map +1 -1
- package/dist/provenance/index.d.ts +3 -11
- package/dist/provenance/index.d.ts.map +1 -1
- package/dist/provenance/index.js +19 -19
- package/dist/provenance/index.js.map +1 -1
- package/dist/provenance/types.d.ts +4 -4
- package/dist/provenance/types.d.ts.map +1 -1
- package/dist/provenance/types.js +2 -8
- package/dist/provenance/types.js.map +1 -1
- package/dist/sandbox-training/challenges.d.ts +1 -1
- package/dist/sandbox-training/challenges.d.ts.map +1 -1
- package/dist/sandbox-training/challenges.js +230 -236
- package/dist/sandbox-training/challenges.js.map +1 -1
- package/dist/sandbox-training/graduation.d.ts +1 -1
- package/dist/sandbox-training/graduation.d.ts.map +1 -1
- package/dist/sandbox-training/graduation.js +17 -22
- package/dist/sandbox-training/graduation.js.map +1 -1
- package/dist/sandbox-training/index.d.ts +9 -9
- package/dist/sandbox-training/index.d.ts.map +1 -1
- package/dist/sandbox-training/index.js +8 -6
- package/dist/sandbox-training/index.js.map +1 -1
- package/dist/sandbox-training/promotion-service.d.ts +4 -4
- package/dist/sandbox-training/promotion-service.d.ts.map +1 -1
- package/dist/sandbox-training/promotion-service.js +7 -16
- package/dist/sandbox-training/promotion-service.js.map +1 -1
- package/dist/sandbox-training/runner.d.ts +1 -1
- package/dist/sandbox-training/runner.d.ts.map +1 -1
- package/dist/sandbox-training/runner.js +75 -82
- package/dist/sandbox-training/runner.js.map +1 -1
- package/dist/sandbox-training/scorer.d.ts +4 -4
- package/dist/sandbox-training/scorer.d.ts.map +1 -1
- package/dist/sandbox-training/scorer.js +7 -13
- package/dist/sandbox-training/scorer.js.map +1 -1
- package/dist/sandbox-training/types.d.ts +4 -4
- package/dist/sandbox-training/types.d.ts.map +1 -1
- package/dist/sandbox-training/types.js +9 -19
- package/dist/sandbox-training/types.js.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/audit.d.ts +1 -9
- package/dist/trust-engine/ceiling-enforcement/audit.d.ts.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/audit.js +6 -11
- package/dist/trust-engine/ceiling-enforcement/audit.js.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/index.d.ts +2 -2
- package/dist/trust-engine/ceiling-enforcement/index.d.ts.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/index.js +4 -2
- package/dist/trust-engine/ceiling-enforcement/index.js.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/kernel.d.ts +12 -10
- package/dist/trust-engine/ceiling-enforcement/kernel.d.ts.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/kernel.js +28 -20
- package/dist/trust-engine/ceiling-enforcement/kernel.js.map +1 -1
- package/dist/trust-engine/context-policy/enforcement.d.ts +0 -9
- package/dist/trust-engine/context-policy/enforcement.d.ts.map +1 -1
- package/dist/trust-engine/context-policy/enforcement.js +2 -9
- package/dist/trust-engine/context-policy/enforcement.js.map +1 -1
- package/dist/trust-engine/context-policy/factory.d.ts +1 -1
- package/dist/trust-engine/context-policy/factory.d.ts.map +1 -1
- package/dist/trust-engine/context-policy/factory.js +3 -1
- package/dist/trust-engine/context-policy/factory.js.map +1 -1
- package/dist/trust-engine/context-policy/index.d.ts +2 -2
- package/dist/trust-engine/context-policy/index.d.ts.map +1 -1
- package/dist/trust-engine/context-policy/index.js +4 -2
- package/dist/trust-engine/context-policy/index.js.map +1 -1
- package/dist/trust-engine/creation-modifiers/index.d.ts +1 -1
- package/dist/trust-engine/creation-modifiers/index.d.ts.map +1 -1
- package/dist/trust-engine/creation-modifiers/index.js +3 -1
- package/dist/trust-engine/creation-modifiers/index.js.map +1 -1
- package/dist/trust-engine/creation-modifiers/types.d.ts.map +1 -1
- package/dist/trust-engine/creation-modifiers/types.js +5 -2
- package/dist/trust-engine/creation-modifiers/types.js.map +1 -1
- package/dist/trust-engine/decay-profiles.d.ts +37 -136
- package/dist/trust-engine/decay-profiles.d.ts.map +1 -1
- package/dist/trust-engine/decay-profiles.js +61 -183
- package/dist/trust-engine/decay-profiles.js.map +1 -1
- package/dist/trust-engine/index.d.ts +327 -22
- package/dist/trust-engine/index.d.ts.map +1 -1
- package/dist/trust-engine/index.js +706 -130
- package/dist/trust-engine/index.js.map +1 -1
- package/dist/trust-engine/phase6-types.d.ts +15 -18
- package/dist/trust-engine/phase6-types.d.ts.map +1 -1
- package/dist/trust-engine/phase6-types.js +32 -36
- package/dist/trust-engine/phase6-types.js.map +1 -1
- package/dist/trust-engine/trust-verifier.d.ts +121 -0
- package/dist/trust-engine/trust-verifier.d.ts.map +1 -0
- package/dist/trust-engine/trust-verifier.js +226 -0
- package/dist/trust-engine/trust-verifier.js.map +1 -0
- package/package.json +140 -135
- package/dist/enforce/types.d.ts +0 -234
- package/dist/enforce/types.d.ts.map +0 -1
- package/dist/enforce/types.js +0 -10
- package/dist/enforce/types.js.map +0 -1
- package/dist/intent/types.d.ts +0 -69
- package/dist/intent/types.d.ts.map +0 -1
- package/dist/intent/types.js +0 -10
- package/dist/intent/types.js.map +0 -1
- package/dist/trust-engine/types.d.ts +0 -77
- package/dist/trust-engine/types.d.ts.map +0 -1
- package/dist/trust-engine/types.js +0 -20
- package/dist/trust-engine/types.js.map +0 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright 2024-2026 Vorion LLC
|
|
1
3
|
/**
|
|
2
4
|
* L2 — Character Set Sanitizer
|
|
3
5
|
*
|
|
@@ -10,88 +12,87 @@
|
|
|
10
12
|
*
|
|
11
13
|
* @packageDocumentation
|
|
12
14
|
*/
|
|
13
|
-
import { BaseSecurityLayer, createLayerConfig } from
|
|
15
|
+
import { BaseSecurityLayer, createLayerConfig } from '../index.js';
|
|
14
16
|
/**
|
|
15
17
|
* Unicode categories of dangerous characters
|
|
16
18
|
*/
|
|
17
19
|
const DANGEROUS_PATTERNS = [
|
|
18
20
|
{
|
|
19
|
-
name:
|
|
21
|
+
name: 'bidi_override',
|
|
20
22
|
// Bi-directional override characters (used in trojan source attacks)
|
|
21
|
-
pattern: /
|
|
22
|
-
severity:
|
|
23
|
-
description:
|
|
23
|
+
pattern: /[\u200E\u200F\u202A-\u202E\u2066-\u2069]/g,
|
|
24
|
+
severity: 'critical',
|
|
25
|
+
description: 'Bi-directional text override characters can disguise malicious content',
|
|
24
26
|
},
|
|
25
27
|
{
|
|
26
|
-
name:
|
|
28
|
+
name: 'zero_width',
|
|
27
29
|
// Zero-width characters (invisible text injection)
|
|
28
|
-
pattern: /
|
|
29
|
-
severity:
|
|
30
|
-
description:
|
|
30
|
+
pattern: /[\u200B\u200C\u200D\uFEFF]/g,
|
|
31
|
+
severity: 'high',
|
|
32
|
+
description: 'Zero-width characters can hide content from human reviewers',
|
|
31
33
|
},
|
|
32
34
|
{
|
|
33
|
-
name:
|
|
35
|
+
name: 'control_chars',
|
|
34
36
|
// C0/C1 control characters except common whitespace (tab, newline, carriage return)
|
|
35
|
-
// eslint-disable-next-line no-control-regex
|
|
36
37
|
pattern: /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x80-\x9F]/g,
|
|
37
|
-
severity:
|
|
38
|
-
description:
|
|
38
|
+
severity: 'high',
|
|
39
|
+
description: 'Control characters can corrupt parsing or inject escape sequences',
|
|
39
40
|
},
|
|
40
41
|
{
|
|
41
|
-
name:
|
|
42
|
+
name: 'tag_chars',
|
|
42
43
|
// Unicode tag characters (U+E0001-U+E007F) — used to hide instructions
|
|
43
|
-
pattern:
|
|
44
|
-
severity:
|
|
45
|
-
description:
|
|
44
|
+
pattern: /[\uDB40][\uDC01-\uDC7F]/g,
|
|
45
|
+
severity: 'high',
|
|
46
|
+
description: 'Unicode tag characters can embed hidden instructions',
|
|
46
47
|
},
|
|
47
48
|
{
|
|
48
|
-
name:
|
|
49
|
+
name: 'interlinear_annotation',
|
|
49
50
|
// Interlinear annotation characters
|
|
50
51
|
pattern: /[\uFFF9\uFFFA\uFFFB]/g,
|
|
51
|
-
severity:
|
|
52
|
-
description:
|
|
52
|
+
severity: 'medium',
|
|
53
|
+
description: 'Annotation characters can inject hidden metadata',
|
|
53
54
|
},
|
|
54
55
|
{
|
|
55
|
-
name:
|
|
56
|
+
name: 'replacement_char',
|
|
56
57
|
// Object replacement character (can mask embedded objects)
|
|
57
58
|
pattern: /\uFFFC/g,
|
|
58
|
-
severity:
|
|
59
|
-
description:
|
|
59
|
+
severity: 'medium',
|
|
60
|
+
description: 'Object replacement character may mask embedded content',
|
|
60
61
|
},
|
|
61
62
|
{
|
|
62
|
-
name:
|
|
63
|
+
name: 'variation_selector_abuse',
|
|
63
64
|
// Excessive variation selectors (emoji/glyph variant abuse)
|
|
64
65
|
pattern: /[\uFE00-\uFE0F]{3,}/g,
|
|
65
|
-
severity:
|
|
66
|
-
description:
|
|
66
|
+
severity: 'low',
|
|
67
|
+
description: 'Excessive variation selectors suggest encoding manipulation',
|
|
67
68
|
},
|
|
68
69
|
];
|
|
69
70
|
/**
|
|
70
71
|
* Common homoglyph mappings (confusable characters → ASCII equivalent)
|
|
71
72
|
*/
|
|
72
73
|
const HOMOGLYPH_MAP = {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
74
|
+
'\u0410': 'A', // Cyrillic А → Latin A
|
|
75
|
+
'\u0412': 'B', // Cyrillic В → Latin B
|
|
76
|
+
'\u0421': 'C', // Cyrillic С → Latin C
|
|
77
|
+
'\u0415': 'E', // Cyrillic Е → Latin E
|
|
78
|
+
'\u041D': 'H', // Cyrillic Н → Latin H
|
|
79
|
+
'\u041A': 'K', // Cyrillic К → Latin K
|
|
80
|
+
'\u041C': 'M', // Cyrillic М → Latin M
|
|
81
|
+
'\u041E': 'O', // Cyrillic О → Latin O
|
|
82
|
+
'\u0420': 'P', // Cyrillic Р → Latin P
|
|
83
|
+
'\u0422': 'T', // Cyrillic Т → Latin T
|
|
84
|
+
'\u0425': 'X', // Cyrillic Х → Latin X
|
|
85
|
+
'\u0430': 'a', // Cyrillic а → Latin a
|
|
86
|
+
'\u0435': 'e', // Cyrillic е → Latin e
|
|
87
|
+
'\u043E': 'o', // Cyrillic о → Latin o
|
|
88
|
+
'\u0440': 'p', // Cyrillic р → Latin p
|
|
89
|
+
'\u0441': 'c', // Cyrillic с → Latin c
|
|
90
|
+
'\u0443': 'y', // Cyrillic у → Latin y
|
|
91
|
+
'\u0445': 'x', // Cyrillic х → Latin x
|
|
92
|
+
'\u0456': 'i', // Cyrillic і → Latin i
|
|
93
|
+
'\u0458': 'j', // Cyrillic ј → Latin j
|
|
94
|
+
'\u0455': 's', // Cyrillic ѕ → Latin s
|
|
95
|
+
'\u0501': 'd', // Cyrillic ԁ → Latin d
|
|
95
96
|
};
|
|
96
97
|
/**
|
|
97
98
|
* L2 Character Set Sanitizer
|
|
@@ -100,12 +101,12 @@ const HOMOGLYPH_MAP = {
|
|
|
100
101
|
*/
|
|
101
102
|
export class L2CharsetSanitizer extends BaseSecurityLayer {
|
|
102
103
|
constructor() {
|
|
103
|
-
super(createLayerConfig(2,
|
|
104
|
-
description:
|
|
105
|
-
tier:
|
|
106
|
-
primaryThreat:
|
|
107
|
-
secondaryThreats: [
|
|
108
|
-
failMode:
|
|
104
|
+
super(createLayerConfig(2, 'Character Set Sanitizer', {
|
|
105
|
+
description: 'Detects and sanitizes dangerous Unicode sequences, invisible characters, and homoglyph attacks',
|
|
106
|
+
tier: 'input_validation',
|
|
107
|
+
primaryThreat: 'prompt_injection',
|
|
108
|
+
secondaryThreats: ['deceptive_output', 'audit_evasion'],
|
|
109
|
+
failMode: 'block',
|
|
109
110
|
required: true,
|
|
110
111
|
timeoutMs: 300,
|
|
111
112
|
parallelizable: true,
|
|
@@ -118,20 +119,20 @@ export class L2CharsetSanitizer extends BaseSecurityLayer {
|
|
|
118
119
|
const findings = [];
|
|
119
120
|
const modifications = [];
|
|
120
121
|
// Walk all string values in the payload
|
|
121
|
-
this.scanObject(input.payload,
|
|
122
|
+
this.scanObject(input.payload, '', findings, modifications);
|
|
122
123
|
const timing = this.buildTiming(startedAt, t0);
|
|
123
|
-
const hasCritical = findings.some((f) => f.severity ===
|
|
124
|
-
const hasHigh = findings.some((f) => f.severity ===
|
|
124
|
+
const hasCritical = findings.some((f) => f.severity === 'critical');
|
|
125
|
+
const hasHigh = findings.some((f) => f.severity === 'high');
|
|
125
126
|
const passed = !hasCritical && !hasHigh;
|
|
126
127
|
if (passed) {
|
|
127
|
-
return this.createSuccessResult(
|
|
128
|
+
return this.createSuccessResult('allow', 0.9, findings, modifications, timing);
|
|
128
129
|
}
|
|
129
|
-
return this.createFailureResult(hasCritical ?
|
|
130
|
+
return this.createFailureResult(hasCritical ? 'deny' : 'escalate', 0.85, findings, timing);
|
|
130
131
|
}
|
|
131
132
|
scanObject(obj, path, findings, modifications) {
|
|
132
133
|
if (obj === null || obj === undefined)
|
|
133
134
|
return;
|
|
134
|
-
if (typeof obj ===
|
|
135
|
+
if (typeof obj === 'string') {
|
|
135
136
|
this.scanString(obj, path, findings, modifications);
|
|
136
137
|
return;
|
|
137
138
|
}
|
|
@@ -141,10 +142,10 @@ export class L2CharsetSanitizer extends BaseSecurityLayer {
|
|
|
141
142
|
}
|
|
142
143
|
return;
|
|
143
144
|
}
|
|
144
|
-
if (typeof obj ===
|
|
145
|
+
if (typeof obj === 'object') {
|
|
145
146
|
for (const [key, val] of Object.entries(obj)) {
|
|
146
147
|
// Also scan keys for homoglyphs
|
|
147
|
-
this.scanString(key, `${path ? path +
|
|
148
|
+
this.scanString(key, `${path ? path + '.' : ''}(key:${key})`, findings, modifications);
|
|
148
149
|
this.scanObject(val, path ? `${path}.${key}` : key, findings, modifications);
|
|
149
150
|
}
|
|
150
151
|
}
|
|
@@ -157,24 +158,21 @@ export class L2CharsetSanitizer extends BaseSecurityLayer {
|
|
|
157
158
|
const matches = value.match(pattern);
|
|
158
159
|
if (matches && matches.length > 0) {
|
|
159
160
|
findings.push({
|
|
160
|
-
type:
|
|
161
|
+
type: 'threat_detected',
|
|
161
162
|
severity,
|
|
162
163
|
code: `L2_${name.toUpperCase()}`,
|
|
163
164
|
description: `${description} at '${path}'`,
|
|
164
165
|
evidence: [
|
|
165
166
|
`Found ${matches.length} instance(s)`,
|
|
166
|
-
`Code points: ${matches
|
|
167
|
-
.slice(0, 5)
|
|
168
|
-
.map((c) => `U+${c.charCodeAt(0).toString(16).toUpperCase().padStart(4, "0")}`)
|
|
169
|
-
.join(", ")}`,
|
|
167
|
+
`Code points: ${matches.slice(0, 5).map((c) => `U+${c.charCodeAt(0).toString(16).toUpperCase().padStart(4, '0')}`).join(', ')}`,
|
|
170
168
|
],
|
|
171
169
|
remediation: `Remove ${name} characters from the input`,
|
|
172
170
|
});
|
|
173
171
|
modifications.push({
|
|
174
172
|
target: path,
|
|
175
|
-
type:
|
|
173
|
+
type: 'sanitize',
|
|
176
174
|
originalValue: `[${matches.length} ${name} chars]`,
|
|
177
|
-
newValue:
|
|
175
|
+
newValue: '[stripped]',
|
|
178
176
|
reason: description,
|
|
179
177
|
});
|
|
180
178
|
}
|
|
@@ -183,14 +181,12 @@ export class L2CharsetSanitizer extends BaseSecurityLayer {
|
|
|
183
181
|
const homoglyphs = this.detectHomoglyphs(value);
|
|
184
182
|
if (homoglyphs.length > 0) {
|
|
185
183
|
findings.push({
|
|
186
|
-
type:
|
|
187
|
-
severity:
|
|
188
|
-
code:
|
|
184
|
+
type: 'threat_detected',
|
|
185
|
+
severity: 'high',
|
|
186
|
+
code: 'L2_HOMOGLYPH_ATTACK',
|
|
189
187
|
description: `Mixed-script homoglyph characters detected at '${path}'`,
|
|
190
|
-
evidence: homoglyphs
|
|
191
|
-
|
|
192
|
-
.map((h) => `'${h.char}' (U+${h.codePoint}) looks like '${h.looksLike}'`),
|
|
193
|
-
remediation: "Use consistent character scripts (do not mix Cyrillic with Latin)",
|
|
188
|
+
evidence: homoglyphs.slice(0, 10).map((h) => `'${h.char}' (U+${h.codePoint}) looks like '${h.looksLike}'`),
|
|
189
|
+
remediation: 'Use consistent character scripts (do not mix Cyrillic with Latin)',
|
|
194
190
|
});
|
|
195
191
|
}
|
|
196
192
|
}
|
|
@@ -205,11 +201,7 @@ export class L2CharsetSanitizer extends BaseSecurityLayer {
|
|
|
205
201
|
if (mapped) {
|
|
206
202
|
results.push({
|
|
207
203
|
char,
|
|
208
|
-
codePoint: char
|
|
209
|
-
.charCodeAt(0)
|
|
210
|
-
.toString(16)
|
|
211
|
-
.toUpperCase()
|
|
212
|
-
.padStart(4, "0"),
|
|
204
|
+
codePoint: char.charCodeAt(0).toString(16).toUpperCase().padStart(4, '0'),
|
|
213
205
|
looksLike: mapped,
|
|
214
206
|
});
|
|
215
207
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"L2-charset-sanitizer.js","sourceRoot":"","sources":["../../../src/layers/implementations/L2-charset-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AASnE;;GAEG;AACH,MAAM,kBAAkB,GAKnB;IACH;QACE,IAAI,EAAE,eAAe;QACrB,qEAAqE;QACrE,OAAO,
|
|
1
|
+
{"version":3,"file":"L2-charset-sanitizer.js","sourceRoot":"","sources":["../../../src/layers/implementations/L2-charset-sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @packageDocumentation
|
|
12
12
|
*/
|
|
13
|
-
import { BaseSecurityLayer } from
|
|
14
|
-
import type { LayerInput, LayerExecutionResult } from
|
|
13
|
+
import { BaseSecurityLayer } from '../index.js';
|
|
14
|
+
import type { LayerInput, LayerExecutionResult } from '../types.js';
|
|
15
15
|
/**
|
|
16
16
|
* Schema definition for a known action
|
|
17
17
|
*/
|
|
@@ -25,7 +25,7 @@ export interface ActionSchema {
|
|
|
25
25
|
/** Maximum number of extra fields allowed beyond defined ones */
|
|
26
26
|
maxExtraFields?: number;
|
|
27
27
|
}
|
|
28
|
-
type FieldType =
|
|
28
|
+
type FieldType = 'string' | 'number' | 'boolean' | 'object' | 'array' | 'string[]' | 'number[]';
|
|
29
29
|
/**
|
|
30
30
|
* L3 Schema Conformance Validator
|
|
31
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"L3-schema-conformance.d.ts","sourceRoot":"","sources":["../../../src/layers/implementations/L3-schema-conformance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"L3-schema-conformance.d.ts","sourceRoot":"","sources":["../../../src/layers/implementations/L3-schema-conformance.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAA6B,MAAM,aAAa,CAAC;AAE/F;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AA4ChG;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,iBAAiB;IACxD,OAAO,CAAC,OAAO,CAA4B;gBAE/B,iBAAiB,CAAC,EAAE,YAAY,EAAE;IA0B9C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIpC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2H/D,OAAO,CAAC,SAAS;IAyCjB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,WAAW;CAUpB"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright 2024-2026 Vorion LLC
|
|
1
3
|
/**
|
|
2
4
|
* L3 — Schema Conformance Validator
|
|
3
5
|
*
|
|
@@ -10,50 +12,45 @@
|
|
|
10
12
|
*
|
|
11
13
|
* @packageDocumentation
|
|
12
14
|
*/
|
|
13
|
-
import { BaseSecurityLayer, createLayerConfig } from
|
|
15
|
+
import { BaseSecurityLayer, createLayerConfig } from '../index.js';
|
|
14
16
|
/**
|
|
15
17
|
* Built-in action schemas for the ATSF governance pipeline
|
|
16
18
|
*/
|
|
17
19
|
const KNOWN_ACTION_SCHEMAS = [
|
|
18
20
|
{
|
|
19
|
-
action:
|
|
20
|
-
required: { content:
|
|
21
|
-
optional: {
|
|
22
|
-
context: "object",
|
|
23
|
-
model: "string",
|
|
24
|
-
temperature: "number",
|
|
25
|
-
maxTokens: "number",
|
|
26
|
-
},
|
|
21
|
+
action: 'query',
|
|
22
|
+
required: { content: 'string' },
|
|
23
|
+
optional: { context: 'object', model: 'string', temperature: 'number', maxTokens: 'number' },
|
|
27
24
|
maxExtraFields: 10,
|
|
28
25
|
},
|
|
29
26
|
{
|
|
30
|
-
action:
|
|
31
|
-
required: { content:
|
|
32
|
-
optional: { args:
|
|
27
|
+
action: 'execute',
|
|
28
|
+
required: { content: 'string', target: 'string' },
|
|
29
|
+
optional: { args: 'object', timeout: 'number', dryRun: 'boolean' },
|
|
33
30
|
maxExtraFields: 5,
|
|
34
31
|
},
|
|
35
32
|
{
|
|
36
|
-
action:
|
|
37
|
-
required: { content:
|
|
38
|
-
optional: { format:
|
|
33
|
+
action: 'read',
|
|
34
|
+
required: { content: 'string', resource: 'string' },
|
|
35
|
+
optional: { format: 'string', limit: 'number', offset: 'number' },
|
|
39
36
|
maxExtraFields: 5,
|
|
40
37
|
},
|
|
41
38
|
{
|
|
42
|
-
action:
|
|
43
|
-
required: { content:
|
|
44
|
-
optional: { overwrite:
|
|
39
|
+
action: 'write',
|
|
40
|
+
required: { content: 'string', resource: 'string', data: 'object' },
|
|
41
|
+
optional: { overwrite: 'boolean', format: 'string' },
|
|
45
42
|
maxExtraFields: 5,
|
|
46
43
|
},
|
|
47
44
|
{
|
|
48
|
-
action:
|
|
49
|
-
required: { content:
|
|
50
|
-
optional: { recursive:
|
|
45
|
+
action: 'delete',
|
|
46
|
+
required: { content: 'string', resource: 'string' },
|
|
47
|
+
optional: { recursive: 'boolean', force: 'boolean' },
|
|
51
48
|
maxExtraFields: 3,
|
|
52
49
|
},
|
|
53
50
|
{
|
|
54
|
-
action:
|
|
55
|
-
required: { content:
|
|
56
|
-
optional: { channel:
|
|
51
|
+
action: 'communicate',
|
|
52
|
+
required: { content: 'string', recipient: 'string' },
|
|
53
|
+
optional: { channel: 'string', priority: 'string', metadata: 'object' },
|
|
57
54
|
maxExtraFields: 5,
|
|
58
55
|
},
|
|
59
56
|
];
|
|
@@ -65,12 +62,12 @@ const KNOWN_ACTION_SCHEMAS = [
|
|
|
65
62
|
export class L3SchemaConformance extends BaseSecurityLayer {
|
|
66
63
|
schemas;
|
|
67
64
|
constructor(additionalSchemas) {
|
|
68
|
-
super(createLayerConfig(3,
|
|
69
|
-
description:
|
|
70
|
-
tier:
|
|
71
|
-
primaryThreat:
|
|
72
|
-
secondaryThreats: [
|
|
73
|
-
failMode:
|
|
65
|
+
super(createLayerConfig(3, 'Schema Conformance', {
|
|
66
|
+
description: 'Validates payload action and fields against known schemas',
|
|
67
|
+
tier: 'input_validation',
|
|
68
|
+
primaryThreat: 'unauthorized_action',
|
|
69
|
+
secondaryThreats: ['capability_abuse', 'prompt_injection'],
|
|
70
|
+
failMode: 'block',
|
|
74
71
|
required: true,
|
|
75
72
|
timeoutMs: 200,
|
|
76
73
|
parallelizable: true,
|
|
@@ -98,57 +95,57 @@ export class L3SchemaConformance extends BaseSecurityLayer {
|
|
|
98
95
|
const findings = [];
|
|
99
96
|
const payload = input.payload;
|
|
100
97
|
// 1. Check that action field exists
|
|
101
|
-
const action = payload[
|
|
98
|
+
const action = payload['action'];
|
|
102
99
|
if (action === undefined || action === null) {
|
|
103
100
|
findings.push({
|
|
104
|
-
type:
|
|
105
|
-
severity:
|
|
106
|
-
code:
|
|
101
|
+
type: 'threat_detected',
|
|
102
|
+
severity: 'high',
|
|
103
|
+
code: 'L3_MISSING_ACTION',
|
|
107
104
|
description: 'Payload has no "action" field — cannot determine request type',
|
|
108
|
-
evidence: [
|
|
105
|
+
evidence: ['payload.action is undefined'],
|
|
109
106
|
remediation: 'Include an "action" field in the payload (e.g., "query", "execute", "read")',
|
|
110
107
|
});
|
|
111
108
|
const timing = this.buildTiming(startedAt, t0);
|
|
112
|
-
return this.createFailureResult(
|
|
109
|
+
return this.createFailureResult('deny', 0.9, findings, timing);
|
|
113
110
|
}
|
|
114
|
-
if (typeof action !==
|
|
111
|
+
if (typeof action !== 'string') {
|
|
115
112
|
findings.push({
|
|
116
|
-
type:
|
|
117
|
-
severity:
|
|
118
|
-
code:
|
|
113
|
+
type: 'threat_detected',
|
|
114
|
+
severity: 'high',
|
|
115
|
+
code: 'L3_INVALID_ACTION_TYPE',
|
|
119
116
|
description: `Action field must be a string, got ${typeof action}`,
|
|
120
117
|
evidence: [`typeof action = ${typeof action}`],
|
|
121
|
-
remediation:
|
|
118
|
+
remediation: 'Provide action as a string value',
|
|
122
119
|
});
|
|
123
120
|
const timing = this.buildTiming(startedAt, t0);
|
|
124
|
-
return this.createFailureResult(
|
|
121
|
+
return this.createFailureResult('deny', 0.9, findings, timing);
|
|
125
122
|
}
|
|
126
123
|
// 2. Look up schema for this action
|
|
127
124
|
const schema = this.schemas.get(action);
|
|
128
125
|
if (!schema) {
|
|
129
126
|
findings.push({
|
|
130
|
-
type:
|
|
131
|
-
severity:
|
|
132
|
-
code:
|
|
127
|
+
type: 'threat_detected',
|
|
128
|
+
severity: 'medium',
|
|
129
|
+
code: 'L3_UNKNOWN_ACTION',
|
|
133
130
|
description: `Unknown action '${action}' — not in registered schemas`,
|
|
134
131
|
evidence: [
|
|
135
132
|
`action=${action}`,
|
|
136
|
-
`known actions: ${Array.from(this.schemas.keys()).join(
|
|
133
|
+
`known actions: ${Array.from(this.schemas.keys()).join(', ')}`,
|
|
137
134
|
],
|
|
138
|
-
remediation: `Use a known action: ${Array.from(this.schemas.keys()).join(
|
|
135
|
+
remediation: `Use a known action: ${Array.from(this.schemas.keys()).join(', ')}`,
|
|
139
136
|
});
|
|
140
137
|
const timing = this.buildTiming(startedAt, t0);
|
|
141
138
|
// Unknown actions are escalated, not denied — allows extension
|
|
142
|
-
return this.createFailureResult(
|
|
139
|
+
return this.createFailureResult('escalate', 0.7, findings, timing);
|
|
143
140
|
}
|
|
144
141
|
// 3. Check required fields
|
|
145
142
|
for (const [field, expectedType] of Object.entries(schema.required)) {
|
|
146
143
|
const value = payload[field];
|
|
147
144
|
if (value === undefined || value === null) {
|
|
148
145
|
findings.push({
|
|
149
|
-
type:
|
|
150
|
-
severity:
|
|
151
|
-
code:
|
|
146
|
+
type: 'threat_detected',
|
|
147
|
+
severity: 'high',
|
|
148
|
+
code: 'L3_MISSING_REQUIRED_FIELD',
|
|
152
149
|
description: `Required field '${field}' missing for action '${action}'`,
|
|
153
150
|
evidence: [`field=${field}, action=${action}`],
|
|
154
151
|
remediation: `Include required field '${field}' (type: ${expectedType})`,
|
|
@@ -175,7 +172,7 @@ export class L3SchemaConformance extends BaseSecurityLayer {
|
|
|
175
172
|
}
|
|
176
173
|
// 5. Check for unexpected extra fields
|
|
177
174
|
const allKnownFields = new Set([
|
|
178
|
-
|
|
175
|
+
'action',
|
|
179
176
|
...Object.keys(schema.required),
|
|
180
177
|
...Object.keys(schema.optional ?? {}),
|
|
181
178
|
]);
|
|
@@ -183,61 +180,57 @@ export class L3SchemaConformance extends BaseSecurityLayer {
|
|
|
183
180
|
const maxExtra = schema.maxExtraFields ?? 10;
|
|
184
181
|
if (extraFields.length > maxExtra) {
|
|
185
182
|
findings.push({
|
|
186
|
-
type:
|
|
187
|
-
severity:
|
|
188
|
-
code:
|
|
183
|
+
type: 'warning',
|
|
184
|
+
severity: 'medium',
|
|
185
|
+
code: 'L3_EXCESS_EXTRA_FIELDS',
|
|
189
186
|
description: `${extraFields.length} extra fields exceed maximum ${maxExtra} for action '${action}'`,
|
|
190
|
-
evidence: [
|
|
191
|
-
`extra fields: ${extraFields.slice(0, 10).join(", ")}${extraFields.length > 10 ? "..." : ""}`,
|
|
192
|
-
],
|
|
187
|
+
evidence: [`extra fields: ${extraFields.slice(0, 10).join(', ')}${extraFields.length > 10 ? '...' : ''}`],
|
|
193
188
|
remediation: `Reduce extra fields to at most ${maxExtra}`,
|
|
194
189
|
});
|
|
195
190
|
}
|
|
196
191
|
const timing = this.buildTiming(startedAt, t0);
|
|
197
|
-
const hasHigh = findings.some((f) => f.severity ===
|
|
192
|
+
const hasHigh = findings.some((f) => f.severity === 'high' || f.severity === 'critical');
|
|
198
193
|
const passed = !hasHigh;
|
|
199
194
|
if (passed) {
|
|
200
|
-
return this.createSuccessResult(
|
|
195
|
+
return this.createSuccessResult('allow', 0.9, findings, [], timing);
|
|
201
196
|
}
|
|
202
|
-
return this.createFailureResult(
|
|
197
|
+
return this.createFailureResult('deny', 0.85, findings, timing);
|
|
203
198
|
}
|
|
204
199
|
checkType(value, expectedType, field) {
|
|
205
200
|
switch (expectedType) {
|
|
206
|
-
case
|
|
207
|
-
if (typeof value !==
|
|
201
|
+
case 'string':
|
|
202
|
+
if (typeof value !== 'string') {
|
|
208
203
|
return this.typeError(field, expectedType, typeof value);
|
|
209
204
|
}
|
|
210
205
|
break;
|
|
211
|
-
case
|
|
212
|
-
if (typeof value !==
|
|
206
|
+
case 'number':
|
|
207
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
213
208
|
return this.typeError(field, expectedType, typeof value);
|
|
214
209
|
}
|
|
215
210
|
break;
|
|
216
|
-
case
|
|
217
|
-
if (typeof value !==
|
|
211
|
+
case 'boolean':
|
|
212
|
+
if (typeof value !== 'boolean') {
|
|
218
213
|
return this.typeError(field, expectedType, typeof value);
|
|
219
214
|
}
|
|
220
215
|
break;
|
|
221
|
-
case
|
|
222
|
-
if (typeof value !==
|
|
223
|
-
return this.typeError(field, expectedType, Array.isArray(value) ?
|
|
216
|
+
case 'object':
|
|
217
|
+
if (typeof value !== 'object' || Array.isArray(value)) {
|
|
218
|
+
return this.typeError(field, expectedType, Array.isArray(value) ? 'array' : typeof value);
|
|
224
219
|
}
|
|
225
220
|
break;
|
|
226
|
-
case
|
|
221
|
+
case 'array':
|
|
227
222
|
if (!Array.isArray(value)) {
|
|
228
223
|
return this.typeError(field, expectedType, typeof value);
|
|
229
224
|
}
|
|
230
225
|
break;
|
|
231
|
-
case
|
|
232
|
-
if (!Array.isArray(value) ||
|
|
233
|
-
|
|
234
|
-
return this.typeError(field, expectedType, Array.isArray(value) ? "mixed array" : typeof value);
|
|
226
|
+
case 'string[]':
|
|
227
|
+
if (!Array.isArray(value) || !value.every((v) => typeof v === 'string')) {
|
|
228
|
+
return this.typeError(field, expectedType, Array.isArray(value) ? 'mixed array' : typeof value);
|
|
235
229
|
}
|
|
236
230
|
break;
|
|
237
|
-
case
|
|
238
|
-
if (!Array.isArray(value) ||
|
|
239
|
-
|
|
240
|
-
return this.typeError(field, expectedType, Array.isArray(value) ? "mixed array" : typeof value);
|
|
231
|
+
case 'number[]':
|
|
232
|
+
if (!Array.isArray(value) || !value.every((v) => typeof v === 'number')) {
|
|
233
|
+
return this.typeError(field, expectedType, Array.isArray(value) ? 'mixed array' : typeof value);
|
|
241
234
|
}
|
|
242
235
|
break;
|
|
243
236
|
}
|
|
@@ -245,9 +238,9 @@ export class L3SchemaConformance extends BaseSecurityLayer {
|
|
|
245
238
|
}
|
|
246
239
|
typeError(field, expected, actual) {
|
|
247
240
|
return {
|
|
248
|
-
type:
|
|
249
|
-
severity:
|
|
250
|
-
code:
|
|
241
|
+
type: 'threat_detected',
|
|
242
|
+
severity: 'high',
|
|
243
|
+
code: 'L3_TYPE_MISMATCH',
|
|
251
244
|
description: `Field '${field}' expected type '${expected}', got '${actual}'`,
|
|
252
245
|
evidence: [`field=${field}, expected=${expected}, actual=${actual}`],
|
|
253
246
|
remediation: `Provide '${field}' as type '${expected}'`,
|