@vorionsys/atsf-core 0.2.4 → 0.3.1
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.map +1 -1
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +2 -0
- package/dist/api/server.js.map +1 -1
- package/dist/arbitration/index.d.ts +0 -8
- package/dist/arbitration/index.d.ts.map +1 -1
- package/dist/arbitration/index.js +2 -0
- package/dist/arbitration/index.js.map +1 -1
- 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 +0 -5
- package/dist/basis/evaluator.d.ts.map +1 -1
- package/dist/basis/evaluator.js +2 -0
- package/dist/basis/evaluator.js.map +1 -1
- package/dist/basis/index.d.ts.map +1 -1
- package/dist/basis/index.js +2 -0
- package/dist/basis/index.js.map +1 -1
- package/dist/basis/parser.d.ts +46 -46
- package/dist/basis/parser.d.ts.map +1 -1
- package/dist/basis/parser.js +2 -0
- package/dist/basis/parser.js.map +1 -1
- 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 +2 -0
- package/dist/chain/index.js.map +1 -1
- package/dist/cognigate/index.d.ts +0 -8
- package/dist/cognigate/index.d.ts.map +1 -1
- package/dist/cognigate/index.js +2 -0
- package/dist/cognigate/index.js.map +1 -1
- package/dist/common/adapters.d.ts.map +1 -1
- package/dist/common/adapters.js +2 -8
- package/dist/common/adapters.js.map +1 -1
- package/dist/common/config.d.ts.map +1 -1
- package/dist/common/config.js +2 -0
- package/dist/common/config.js.map +1 -1
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +2 -0
- package/dist/common/index.js.map +1 -1
- package/dist/common/logger.d.ts.map +1 -1
- package/dist/common/logger.js +2 -0
- package/dist/common/logger.js.map +1 -1
- package/dist/common/types.d.ts +8 -8
- package/dist/common/types.d.ts.map +1 -1
- package/dist/common/types.js +2 -9
- package/dist/common/types.js.map +1 -1
- package/dist/containment/index.d.ts +0 -8
- package/dist/containment/index.d.ts.map +1 -1
- package/dist/containment/index.js +2 -0
- package/dist/containment/index.js.map +1 -1
- 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 +0 -8
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/index.js.map +1 -1
- 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 +0 -7
- package/dist/crewai/callback.d.ts.map +1 -1
- package/dist/crewai/callback.js +2 -0
- package/dist/crewai/callback.js.map +1 -1
- package/dist/crewai/executor.d.ts +0 -7
- package/dist/crewai/executor.d.ts.map +1 -1
- package/dist/crewai/executor.js +2 -0
- package/dist/crewai/executor.js.map +1 -1
- package/dist/crewai/index.d.ts.map +1 -1
- package/dist/crewai/index.js +2 -0
- package/dist/crewai/index.js.map +1 -1
- package/dist/crewai/tools.d.ts.map +1 -1
- package/dist/crewai/tools.js +2 -7
- package/dist/crewai/tools.js.map +1 -1
- 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 +0 -15
- package/dist/enforce/index.d.ts.map +1 -1
- package/dist/enforce/index.js +3 -1
- package/dist/enforce/index.js.map +1 -1
- package/dist/enforce/trust-aware-enforcement-service.d.ts +0 -15
- package/dist/enforce/trust-aware-enforcement-service.d.ts.map +1 -1
- package/dist/enforce/trust-aware-enforcement-service.js +2 -0
- package/dist/enforce/trust-aware-enforcement-service.js.map +1 -1
- package/dist/governance/fluid-workflow.d.ts +0 -8
- package/dist/governance/fluid-workflow.d.ts.map +1 -1
- package/dist/governance/fluid-workflow.js +2 -0
- package/dist/governance/fluid-workflow.js.map +1 -1
- package/dist/governance/index.d.ts +0 -8
- package/dist/governance/index.d.ts.map +1 -1
- package/dist/governance/index.js +2 -0
- package/dist/governance/index.js.map +1 -1
- package/dist/governance/proof-bridge.d.ts.map +1 -1
- package/dist/governance/proof-bridge.js +2 -12
- package/dist/governance/proof-bridge.js.map +1 -1
- 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 +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/intent/index.d.ts +0 -13
- package/dist/intent/index.d.ts.map +1 -1
- package/dist/intent/index.js +4 -2
- package/dist/intent/index.js.map +1 -1
- package/dist/intent/persistent-intent-service.d.ts +0 -15
- package/dist/intent/persistent-intent-service.d.ts.map +1 -1
- package/dist/intent/persistent-intent-service.js +2 -0
- package/dist/intent/persistent-intent-service.js.map +1 -1
- package/dist/intent/supabase-intent-repository.d.ts +0 -17
- package/dist/intent/supabase-intent-repository.d.ts.map +1 -1
- package/dist/intent/supabase-intent-repository.js +2 -0
- package/dist/intent/supabase-intent-repository.js.map +1 -1
- package/dist/intent-gateway/index.d.ts +499 -0
- package/dist/intent-gateway/index.d.ts.map +1 -0
- package/dist/intent-gateway/index.js +1332 -0
- package/dist/intent-gateway/index.js.map +1 -0
- package/dist/langchain/callback.d.ts +0 -7
- package/dist/langchain/callback.d.ts.map +1 -1
- package/dist/langchain/callback.js +2 -0
- package/dist/langchain/callback.js.map +1 -1
- package/dist/langchain/executor.d.ts +0 -7
- package/dist/langchain/executor.d.ts.map +1 -1
- package/dist/langchain/executor.js +2 -0
- package/dist/langchain/executor.js.map +1 -1
- package/dist/langchain/index.d.ts.map +1 -1
- package/dist/langchain/index.js +2 -0
- package/dist/langchain/index.js.map +1 -1
- package/dist/langchain/tools.d.ts.map +1 -1
- package/dist/langchain/tools.js +2 -7
- package/dist/langchain/tools.js.map +1 -1
- 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.map +1 -1
- package/dist/layers/implementations/L0-request-format.js +2 -0
- package/dist/layers/implementations/L0-request-format.js.map +1 -1
- package/dist/layers/implementations/L1-input-size.d.ts.map +1 -1
- package/dist/layers/implementations/L1-input-size.js +2 -0
- package/dist/layers/implementations/L1-input-size.js.map +1 -1
- package/dist/layers/implementations/L2-charset-sanitizer.d.ts.map +1 -1
- package/dist/layers/implementations/L2-charset-sanitizer.js +2 -0
- package/dist/layers/implementations/L2-charset-sanitizer.js.map +1 -1
- package/dist/layers/implementations/L3-schema-conformance.d.ts.map +1 -1
- package/dist/layers/implementations/L3-schema-conformance.js +2 -0
- package/dist/layers/implementations/L3-schema-conformance.js.map +1 -1
- package/dist/layers/implementations/L4-injection-detector.d.ts.map +1 -1
- package/dist/layers/implementations/L4-injection-detector.js +2 -0
- package/dist/layers/implementations/L4-injection-detector.js.map +1 -1
- package/dist/layers/implementations/L5-rate-limiter.d.ts.map +1 -1
- package/dist/layers/implementations/L5-rate-limiter.js +2 -0
- package/dist/layers/implementations/L5-rate-limiter.js.map +1 -1
- package/dist/layers/implementations/index.d.ts.map +1 -1
- package/dist/layers/implementations/index.js +2 -0
- package/dist/layers/implementations/index.js.map +1 -1
- package/dist/layers/index.d.ts +0 -8
- package/dist/layers/index.d.ts.map +1 -1
- package/dist/layers/index.js +2 -0
- package/dist/layers/index.js.map +1 -1
- 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 +117 -0
- package/dist/paramesphere/cognitive-envelope.d.ts.map +1 -0
- package/dist/paramesphere/cognitive-envelope.js +220 -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 +114 -0
- package/dist/paramesphere/envelope-integration.js.map +1 -0
- package/dist/paramesphere/fingerprint-monitor.d.ts +143 -0
- package/dist/paramesphere/fingerprint-monitor.d.ts.map +1 -0
- package/dist/paramesphere/fingerprint-monitor.js +240 -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 +22 -0
- package/dist/paramesphere/index.d.ts.map +1 -0
- package/dist/paramesphere/index.js +19 -0
- package/dist/paramesphere/index.js.map +1 -0
- package/dist/paramesphere/monitor-integration.d.ts +47 -0
- package/dist/paramesphere/monitor-integration.d.ts.map +1 -0
- package/dist/paramesphere/monitor-integration.js +102 -0
- package/dist/paramesphere/monitor-integration.js.map +1 -0
- package/dist/paramesphere/paramesphere-engine.d.ts +126 -0
- package/dist/paramesphere/paramesphere-engine.d.ts.map +1 -0
- package/dist/paramesphere/paramesphere-engine.js +610 -0
- package/dist/paramesphere/paramesphere-engine.js.map +1 -0
- package/dist/paramesphere/types.d.ts +191 -0
- package/dist/paramesphere/types.d.ts.map +1 -0
- package/dist/paramesphere/types.js +9 -0
- package/dist/paramesphere/types.js.map +1 -0
- package/dist/persistence/file.d.ts +0 -7
- package/dist/persistence/file.d.ts.map +1 -1
- package/dist/persistence/file.js +2 -0
- package/dist/persistence/file.js.map +1 -1
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +2 -0
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/memory.d.ts.map +1 -1
- package/dist/persistence/memory.js +2 -7
- package/dist/persistence/memory.js.map +1 -1
- package/dist/persistence/sqlite.d.ts +0 -8
- package/dist/persistence/sqlite.d.ts.map +1 -1
- package/dist/persistence/sqlite.js +3 -1
- package/dist/persistence/sqlite.js.map +1 -1
- package/dist/persistence/supabase.d.ts.map +1 -1
- package/dist/persistence/supabase.js +3 -8
- package/dist/persistence/supabase.js.map +1 -1
- 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 +0 -16
- package/dist/phase6/ceiling.d.ts.map +1 -1
- package/dist/phase6/ceiling.js +2 -0
- package/dist/phase6/ceiling.js.map +1 -1
- package/dist/phase6/context.d.ts +0 -17
- package/dist/phase6/context.d.ts.map +1 -1
- package/dist/phase6/context.js +2 -0
- package/dist/phase6/context.js.map +1 -1
- package/dist/phase6/index.d.ts.map +1 -1
- package/dist/phase6/index.js +2 -0
- package/dist/phase6/index.js.map +1 -1
- package/dist/phase6/presets.d.ts +0 -16
- package/dist/phase6/presets.d.ts.map +1 -1
- package/dist/phase6/presets.js +5 -3
- package/dist/phase6/presets.js.map +1 -1
- package/dist/phase6/provenance.d.ts +7 -16
- package/dist/phase6/provenance.d.ts.map +1 -1
- package/dist/phase6/provenance.js +18 -10
- package/dist/phase6/provenance.js.map +1 -1
- package/dist/phase6/role-gates/index.d.ts.map +1 -1
- package/dist/phase6/role-gates/index.js +2 -0
- 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 +2 -0
- package/dist/phase6/role-gates/kernel.js.map +1 -1
- package/dist/phase6/role-gates/policy.d.ts.map +1 -1
- package/dist/phase6/role-gates/policy.js +2 -11
- package/dist/phase6/role-gates/policy.js.map +1 -1
- package/dist/phase6/role-gates.d.ts +0 -16
- package/dist/phase6/role-gates.d.ts.map +1 -1
- package/dist/phase6/role-gates.js +2 -0
- package/dist/phase6/role-gates.js.map +1 -1
- package/dist/phase6/types.d.ts +217 -188
- package/dist/phase6/types.d.ts.map +1 -1
- package/dist/phase6/types.js +50 -1
- 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 +2 -0
- package/dist/phase6/weight-presets/canonical.js.map +1 -1
- package/dist/phase6/weight-presets/deltas.d.ts.map +1 -1
- package/dist/phase6/weight-presets/deltas.js +2 -10
- package/dist/phase6/weight-presets/deltas.js.map +1 -1
- package/dist/phase6/weight-presets/index.d.ts.map +1 -1
- package/dist/phase6/weight-presets/index.js +2 -0
- package/dist/phase6/weight-presets/index.js.map +1 -1
- package/dist/phase6/weight-presets/merger.d.ts +0 -10
- package/dist/phase6/weight-presets/merger.d.ts.map +1 -1
- package/dist/phase6/weight-presets/merger.js +2 -0
- package/dist/phase6/weight-presets/merger.js.map +1 -1
- package/dist/proof/index.d.ts +3 -10
- package/dist/proof/index.d.ts.map +1 -1
- package/dist/proof/index.js +27 -9
- package/dist/proof/index.js.map +1 -1
- package/dist/proof/merkle.d.ts +0 -16
- package/dist/proof/merkle.d.ts.map +1 -1
- package/dist/proof/merkle.js +2 -0
- package/dist/proof/merkle.js.map +1 -1
- package/dist/proof/zk-proofs.d.ts +0 -18
- package/dist/proof/zk-proofs.d.ts.map +1 -1
- package/dist/proof/zk-proofs.js +2 -0
- package/dist/proof/zk-proofs.js.map +1 -1
- package/dist/provenance/index.d.ts +0 -8
- package/dist/provenance/index.d.ts.map +1 -1
- package/dist/provenance/index.js +2 -0
- package/dist/provenance/index.js.map +1 -1
- 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.map +1 -1
- package/dist/sandbox-training/challenges.js +2 -8
- package/dist/sandbox-training/challenges.js.map +1 -1
- package/dist/sandbox-training/graduation.d.ts.map +1 -1
- package/dist/sandbox-training/graduation.js +2 -8
- package/dist/sandbox-training/graduation.js.map +1 -1
- package/dist/sandbox-training/index.d.ts.map +1 -1
- package/dist/sandbox-training/index.js +2 -0
- package/dist/sandbox-training/index.js.map +1 -1
- package/dist/sandbox-training/promotion-service.d.ts.map +1 -1
- package/dist/sandbox-training/promotion-service.js +2 -11
- package/dist/sandbox-training/promotion-service.js.map +1 -1
- package/dist/sandbox-training/runner.d.ts.map +1 -1
- package/dist/sandbox-training/runner.js +2 -8
- package/dist/sandbox-training/runner.js.map +1 -1
- package/dist/sandbox-training/scorer.d.ts.map +1 -1
- package/dist/sandbox-training/scorer.js +2 -8
- package/dist/sandbox-training/scorer.js.map +1 -1
- package/dist/sandbox-training/types.d.ts.map +1 -1
- package/dist/sandbox-training/types.js +2 -8
- package/dist/sandbox-training/types.js.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/audit.d.ts +0 -8
- package/dist/trust-engine/ceiling-enforcement/audit.d.ts.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/audit.js +2 -8
- package/dist/trust-engine/ceiling-enforcement/audit.js.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/index.d.ts.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/index.js +2 -0
- package/dist/trust-engine/ceiling-enforcement/index.js.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/kernel.d.ts.map +1 -1
- package/dist/trust-engine/ceiling-enforcement/kernel.js +2 -0
- 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.map +1 -1
- package/dist/trust-engine/context-policy/factory.js +2 -0
- package/dist/trust-engine/context-policy/factory.js.map +1 -1
- package/dist/trust-engine/context-policy/index.d.ts.map +1 -1
- package/dist/trust-engine/context-policy/index.js +2 -0
- package/dist/trust-engine/context-policy/index.js.map +1 -1
- package/dist/trust-engine/creation-modifiers/index.d.ts.map +1 -1
- package/dist/trust-engine/creation-modifiers/index.js +2 -0
- 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 +2 -0
- package/dist/trust-engine/creation-modifiers/types.js.map +1 -1
- package/dist/trust-engine/decay-profiles.d.ts +20 -11
- package/dist/trust-engine/decay-profiles.d.ts.map +1 -1
- package/dist/trust-engine/decay-profiles.js +15 -23
- package/dist/trust-engine/decay-profiles.js.map +1 -1
- package/dist/trust-engine/index.d.ts +419 -80
- package/dist/trust-engine/index.d.ts.map +1 -1
- package/dist/trust-engine/index.js +1048 -186
- package/dist/trust-engine/index.js.map +1 -1
- package/dist/trust-engine/phase6-types.d.ts +3 -13
- package/dist/trust-engine/phase6-types.d.ts.map +1 -1
- package/dist/trust-engine/phase6-types.js +5 -13
- 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
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FingerprintMonitor — Scheduled fingerprinting with automatic alerting.
|
|
3
|
+
*
|
|
4
|
+
* Runs fingerprint checks on a configurable interval, emits callbacks on
|
|
5
|
+
* drift detection, and produces signal-ready objects when tampering is
|
|
6
|
+
* detected. Deliberately decoupled from the trust engine — the monitor
|
|
7
|
+
* detects and reports, it never directly modifies trust scores.
|
|
8
|
+
*
|
|
9
|
+
* Key behaviours:
|
|
10
|
+
* - First check for a given entity establishes its baseline fingerprint.
|
|
11
|
+
* - Subsequent checks compare against that baseline via
|
|
12
|
+
* `ParameSphereEngine.checkDrift()`.
|
|
13
|
+
* - Drift exceeding `driftThreshold` triggers the `onDriftDetected` callback.
|
|
14
|
+
* - Drift exceeding `2 × driftThreshold` is classified as *tampering* and
|
|
15
|
+
* triggers the `onTamperingDetected` callback.
|
|
16
|
+
* - When `emitTrustSignal` is true, `MonitorCheckResult` includes a
|
|
17
|
+
* signal-ready payload (`trustSignal`) that callers can forward to a
|
|
18
|
+
* trust engine without introducing a direct dependency.
|
|
19
|
+
*
|
|
20
|
+
* @packageDocumentation
|
|
21
|
+
*/
|
|
22
|
+
import type { ParameSphereFingerprint, DriftResult } from './types.js';
|
|
23
|
+
import type { ParameSphereEngine } from './paramesphere-engine.js';
|
|
24
|
+
/** Configuration for the FingerprintMonitor. */
|
|
25
|
+
export interface FingerprintMonitorConfig {
|
|
26
|
+
/** ParameSphere engine instance used to compute and compare fingerprints. */
|
|
27
|
+
engine: ParameSphereEngine;
|
|
28
|
+
/** Interval between scheduled fingerprint checks, in milliseconds (default: 300 000 = 5 min). */
|
|
29
|
+
checkIntervalMs?: number;
|
|
30
|
+
/** Cosine-distance threshold that constitutes drift (default: 0.05). */
|
|
31
|
+
driftThreshold?: number;
|
|
32
|
+
/** Called whenever drift is detected. */
|
|
33
|
+
onDriftDetected?: (entityId: string, result: DriftResult) => void;
|
|
34
|
+
/** Called each time a fingerprint is successfully computed. */
|
|
35
|
+
onFingerprintTaken?: (entityId: string, fingerprint: ParameSphereFingerprint) => void;
|
|
36
|
+
/** Called when drift exceeds 2× threshold (severe — likely tampering). */
|
|
37
|
+
onTamperingDetected?: (entityId: string, result: DriftResult) => void;
|
|
38
|
+
/**
|
|
39
|
+
* When true, `MonitorCheckResult.trustSignal` is populated with a
|
|
40
|
+
* signal-ready object that consumers can forward to a trust engine.
|
|
41
|
+
* Default: true.
|
|
42
|
+
*/
|
|
43
|
+
emitTrustSignal?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/** Result of a single monitor check cycle. */
|
|
46
|
+
export interface MonitorCheckResult {
|
|
47
|
+
entityId: string;
|
|
48
|
+
fingerprint: ParameSphereFingerprint;
|
|
49
|
+
driftDetected: boolean;
|
|
50
|
+
/** Drift exceeds 2× threshold — severe / likely tampering. */
|
|
51
|
+
tamperingDetected: boolean;
|
|
52
|
+
/** Measured cosine distance from baseline (0 on first check). */
|
|
53
|
+
driftDistance: number;
|
|
54
|
+
checkedAt: Date;
|
|
55
|
+
/**
|
|
56
|
+
* Signal-ready object suitable for forwarding to a trust engine.
|
|
57
|
+
* Present only when `emitTrustSignal` is enabled AND drift or
|
|
58
|
+
* tampering was detected.
|
|
59
|
+
*/
|
|
60
|
+
trustSignal?: TrustSignalPayload;
|
|
61
|
+
}
|
|
62
|
+
/** Lightweight trust signal payload — decoupled from the trust engine's own type. */
|
|
63
|
+
export interface TrustSignalPayload {
|
|
64
|
+
entityId: string;
|
|
65
|
+
type: string;
|
|
66
|
+
value: number;
|
|
67
|
+
source: string;
|
|
68
|
+
timestamp: string;
|
|
69
|
+
metadata: Record<string, unknown>;
|
|
70
|
+
}
|
|
71
|
+
/** Per-entity monitoring status. */
|
|
72
|
+
export interface MonitorStatus {
|
|
73
|
+
entityId: string;
|
|
74
|
+
lastCheck: Date | null;
|
|
75
|
+
checksCompleted: number;
|
|
76
|
+
driftsDetected: number;
|
|
77
|
+
tamperingsDetected: number;
|
|
78
|
+
status: 'monitoring' | 'stopped';
|
|
79
|
+
}
|
|
80
|
+
export declare class FingerprintMonitor {
|
|
81
|
+
private readonly engine;
|
|
82
|
+
private readonly checkIntervalMs;
|
|
83
|
+
private readonly driftThreshold;
|
|
84
|
+
private readonly emitTrustSignal;
|
|
85
|
+
private onDriftDetected?;
|
|
86
|
+
private onFingerprintTaken?;
|
|
87
|
+
private onTamperingDetected?;
|
|
88
|
+
private envelopeHealthProvider?;
|
|
89
|
+
private readonly entities;
|
|
90
|
+
constructor(config: FingerprintMonitorConfig);
|
|
91
|
+
/**
|
|
92
|
+
* Start monitoring an entity's model weights.
|
|
93
|
+
*
|
|
94
|
+
* The first scheduled check establishes the baseline fingerprint.
|
|
95
|
+
* Subsequent checks compare against that baseline.
|
|
96
|
+
*
|
|
97
|
+
* @param entityId Unique identifier for the monitored entity / model.
|
|
98
|
+
* @param getWeights Callback that returns the current weight matrices.
|
|
99
|
+
*/
|
|
100
|
+
startMonitoring(entityId: string, getWeights: () => Float32Array[]): void;
|
|
101
|
+
/**
|
|
102
|
+
* Stop monitoring an entity. Clears the interval and marks status
|
|
103
|
+
* as `stopped`. The entity remains in the map so stats are queryable.
|
|
104
|
+
*/
|
|
105
|
+
stopMonitoring(entityId: string): void;
|
|
106
|
+
/**
|
|
107
|
+
* Manually trigger a fingerprint check outside the scheduled interval.
|
|
108
|
+
*/
|
|
109
|
+
checkNow(entityId: string): Promise<MonitorCheckResult>;
|
|
110
|
+
/**
|
|
111
|
+
* Get monitoring status for an entity.
|
|
112
|
+
*/
|
|
113
|
+
getStatus(entityId: string): MonitorStatus | undefined;
|
|
114
|
+
/**
|
|
115
|
+
* List all entity IDs currently registered (monitoring or stopped).
|
|
116
|
+
*/
|
|
117
|
+
getMonitoredEntities(): string[];
|
|
118
|
+
/**
|
|
119
|
+
* Replace the drift-detected callback. Allows integration layers to
|
|
120
|
+
* wire callbacks after construction without subclassing.
|
|
121
|
+
*/
|
|
122
|
+
setOnDriftDetected(cb: ((entityId: string, result: DriftResult) => void) | undefined): void;
|
|
123
|
+
/**
|
|
124
|
+
* Replace the tampering-detected callback.
|
|
125
|
+
*/
|
|
126
|
+
setOnTamperingDetected(cb: ((entityId: string, result: DriftResult) => void) | undefined): void;
|
|
127
|
+
/**
|
|
128
|
+
* Replace the fingerprint-taken callback.
|
|
129
|
+
*/
|
|
130
|
+
setOnFingerprintTaken(cb: ((entityId: string, fingerprint: ParameSphereFingerprint) => void) | undefined): void;
|
|
131
|
+
/**
|
|
132
|
+
* Set a provider callback that returns the current envelope health (1.0/0.9/0.7).
|
|
133
|
+
* Used when computing I(θ) for drift-detected trust signals.
|
|
134
|
+
* If not set, defaults to 1.0 (healthy).
|
|
135
|
+
*/
|
|
136
|
+
setEnvelopeHealthProvider(fn: (() => number) | undefined): void;
|
|
137
|
+
/**
|
|
138
|
+
* Stop all monitored entities and clear all state.
|
|
139
|
+
*/
|
|
140
|
+
shutdown(): void;
|
|
141
|
+
private runCheck;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=fingerprint-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint-monitor.d.ts","sourceRoot":"","sources":["../../src/paramesphere/fingerprint-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright 2024-2026 Vorion LLC
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Defaults
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
const DEFAULT_CHECK_INTERVAL_MS = 300_000; // 5 minutes
|
|
7
|
+
const DEFAULT_DRIFT_THRESHOLD = 0.05;
|
|
8
|
+
const TAMPERING_MULTIPLIER = 2;
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// FingerprintMonitor
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
export class FingerprintMonitor {
|
|
13
|
+
engine;
|
|
14
|
+
checkIntervalMs;
|
|
15
|
+
driftThreshold;
|
|
16
|
+
emitTrustSignal;
|
|
17
|
+
onDriftDetected;
|
|
18
|
+
onFingerprintTaken;
|
|
19
|
+
onTamperingDetected;
|
|
20
|
+
envelopeHealthProvider;
|
|
21
|
+
entities = new Map();
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.engine = config.engine;
|
|
24
|
+
this.checkIntervalMs = config.checkIntervalMs ?? DEFAULT_CHECK_INTERVAL_MS;
|
|
25
|
+
this.driftThreshold = config.driftThreshold ?? DEFAULT_DRIFT_THRESHOLD;
|
|
26
|
+
this.emitTrustSignal = config.emitTrustSignal ?? true;
|
|
27
|
+
this.onDriftDetected = config.onDriftDetected;
|
|
28
|
+
this.onFingerprintTaken = config.onFingerprintTaken;
|
|
29
|
+
this.onTamperingDetected = config.onTamperingDetected;
|
|
30
|
+
}
|
|
31
|
+
// -----------------------------------------------------------------------
|
|
32
|
+
// Public API
|
|
33
|
+
// -----------------------------------------------------------------------
|
|
34
|
+
/**
|
|
35
|
+
* Start monitoring an entity's model weights.
|
|
36
|
+
*
|
|
37
|
+
* The first scheduled check establishes the baseline fingerprint.
|
|
38
|
+
* Subsequent checks compare against that baseline.
|
|
39
|
+
*
|
|
40
|
+
* @param entityId Unique identifier for the monitored entity / model.
|
|
41
|
+
* @param getWeights Callback that returns the current weight matrices.
|
|
42
|
+
*/
|
|
43
|
+
startMonitoring(entityId, getWeights) {
|
|
44
|
+
// If already monitoring, stop first to avoid orphaned timers
|
|
45
|
+
if (this.entities.has(entityId)) {
|
|
46
|
+
this.stopMonitoring(entityId);
|
|
47
|
+
}
|
|
48
|
+
const state = {
|
|
49
|
+
entityId,
|
|
50
|
+
getWeights,
|
|
51
|
+
baseline: null,
|
|
52
|
+
timer: null,
|
|
53
|
+
checksCompleted: 0,
|
|
54
|
+
driftsDetected: 0,
|
|
55
|
+
tamperingsDetected: 0,
|
|
56
|
+
lastCheck: null,
|
|
57
|
+
status: 'monitoring',
|
|
58
|
+
};
|
|
59
|
+
// Schedule recurring checks
|
|
60
|
+
state.timer = setInterval(() => {
|
|
61
|
+
void this.runCheck(state);
|
|
62
|
+
}, this.checkIntervalMs);
|
|
63
|
+
this.entities.set(entityId, state);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Stop monitoring an entity. Clears the interval and marks status
|
|
67
|
+
* as `stopped`. The entity remains in the map so stats are queryable.
|
|
68
|
+
*/
|
|
69
|
+
stopMonitoring(entityId) {
|
|
70
|
+
const state = this.entities.get(entityId);
|
|
71
|
+
if (!state)
|
|
72
|
+
return;
|
|
73
|
+
if (state.timer !== null) {
|
|
74
|
+
clearInterval(state.timer);
|
|
75
|
+
state.timer = null;
|
|
76
|
+
}
|
|
77
|
+
state.status = 'stopped';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Manually trigger a fingerprint check outside the scheduled interval.
|
|
81
|
+
*/
|
|
82
|
+
async checkNow(entityId) {
|
|
83
|
+
const state = this.entities.get(entityId);
|
|
84
|
+
if (!state) {
|
|
85
|
+
throw new Error(`Entity "${entityId}" is not being monitored`);
|
|
86
|
+
}
|
|
87
|
+
return this.runCheck(state);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get monitoring status for an entity.
|
|
91
|
+
*/
|
|
92
|
+
getStatus(entityId) {
|
|
93
|
+
const state = this.entities.get(entityId);
|
|
94
|
+
if (!state)
|
|
95
|
+
return undefined;
|
|
96
|
+
return {
|
|
97
|
+
entityId: state.entityId,
|
|
98
|
+
lastCheck: state.lastCheck,
|
|
99
|
+
checksCompleted: state.checksCompleted,
|
|
100
|
+
driftsDetected: state.driftsDetected,
|
|
101
|
+
tamperingsDetected: state.tamperingsDetected,
|
|
102
|
+
status: state.status,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* List all entity IDs currently registered (monitoring or stopped).
|
|
107
|
+
*/
|
|
108
|
+
getMonitoredEntities() {
|
|
109
|
+
return Array.from(this.entities.keys());
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Replace the drift-detected callback. Allows integration layers to
|
|
113
|
+
* wire callbacks after construction without subclassing.
|
|
114
|
+
*/
|
|
115
|
+
setOnDriftDetected(cb) {
|
|
116
|
+
this.onDriftDetected = cb;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Replace the tampering-detected callback.
|
|
120
|
+
*/
|
|
121
|
+
setOnTamperingDetected(cb) {
|
|
122
|
+
this.onTamperingDetected = cb;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Replace the fingerprint-taken callback.
|
|
126
|
+
*/
|
|
127
|
+
setOnFingerprintTaken(cb) {
|
|
128
|
+
this.onFingerprintTaken = cb;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Set a provider callback that returns the current envelope health (1.0/0.9/0.7).
|
|
132
|
+
* Used when computing I(θ) for drift-detected trust signals.
|
|
133
|
+
* If not set, defaults to 1.0 (healthy).
|
|
134
|
+
*/
|
|
135
|
+
setEnvelopeHealthProvider(fn) {
|
|
136
|
+
this.envelopeHealthProvider = fn;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Stop all monitored entities and clear all state.
|
|
140
|
+
*/
|
|
141
|
+
shutdown() {
|
|
142
|
+
for (const [entityId] of this.entities) {
|
|
143
|
+
this.stopMonitoring(entityId);
|
|
144
|
+
}
|
|
145
|
+
this.entities.clear();
|
|
146
|
+
}
|
|
147
|
+
// -----------------------------------------------------------------------
|
|
148
|
+
// Internal
|
|
149
|
+
// -----------------------------------------------------------------------
|
|
150
|
+
async runCheck(state) {
|
|
151
|
+
const weights = state.getWeights();
|
|
152
|
+
const fingerprint = this.engine.computeFingerprint(weights);
|
|
153
|
+
const now = new Date();
|
|
154
|
+
// Notify fingerprint taken
|
|
155
|
+
this.onFingerprintTaken?.(state.entityId, fingerprint);
|
|
156
|
+
// First check — establish baseline
|
|
157
|
+
if (state.baseline === null) {
|
|
158
|
+
state.baseline = fingerprint;
|
|
159
|
+
this.engine.setBaseline(fingerprint);
|
|
160
|
+
state.checksCompleted++;
|
|
161
|
+
state.lastCheck = now;
|
|
162
|
+
return {
|
|
163
|
+
entityId: state.entityId,
|
|
164
|
+
fingerprint,
|
|
165
|
+
driftDetected: false,
|
|
166
|
+
tamperingDetected: false,
|
|
167
|
+
driftDistance: 0,
|
|
168
|
+
checkedAt: now,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// Compare against baseline
|
|
172
|
+
this.engine.setBaseline(state.baseline);
|
|
173
|
+
const driftResult = this.engine.checkDrift(fingerprint);
|
|
174
|
+
const distance = driftResult.cosineDistance;
|
|
175
|
+
const driftDetected = distance > this.driftThreshold;
|
|
176
|
+
const tamperingDetected = distance > this.driftThreshold * TAMPERING_MULTIPLIER;
|
|
177
|
+
// Update stats
|
|
178
|
+
state.checksCompleted++;
|
|
179
|
+
state.lastCheck = now;
|
|
180
|
+
if (driftDetected)
|
|
181
|
+
state.driftsDetected++;
|
|
182
|
+
if (tamperingDetected)
|
|
183
|
+
state.tamperingsDetected++;
|
|
184
|
+
// Fire callbacks
|
|
185
|
+
if (driftDetected) {
|
|
186
|
+
this.onDriftDetected?.(state.entityId, driftResult);
|
|
187
|
+
}
|
|
188
|
+
if (tamperingDetected) {
|
|
189
|
+
this.onTamperingDetected?.(state.entityId, driftResult);
|
|
190
|
+
}
|
|
191
|
+
// Build result
|
|
192
|
+
const result = {
|
|
193
|
+
entityId: state.entityId,
|
|
194
|
+
fingerprint,
|
|
195
|
+
driftDetected,
|
|
196
|
+
tamperingDetected,
|
|
197
|
+
driftDistance: distance,
|
|
198
|
+
checkedAt: now,
|
|
199
|
+
};
|
|
200
|
+
// Attach signal-ready payload if enabled and drift was detected
|
|
201
|
+
if (this.emitTrustSignal && driftDetected) {
|
|
202
|
+
let signalValue;
|
|
203
|
+
let integrityMetadata = {};
|
|
204
|
+
if (tamperingDetected) {
|
|
205
|
+
// Tampering: always zero trust
|
|
206
|
+
signalValue = 0.0;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Drift (non-tampering): compute I(θ) for continuous integrity signal
|
|
210
|
+
const envelopeHealth = this.envelopeHealthProvider ? this.envelopeHealthProvider() : 1.0;
|
|
211
|
+
const integrity = this.engine.computeIntegrityMultiplier(driftResult, envelopeHealth);
|
|
212
|
+
signalValue = integrity.composite;
|
|
213
|
+
integrityMetadata = {
|
|
214
|
+
integrityMultiplier: integrity.composite,
|
|
215
|
+
fingerprintComponent: integrity.fingerprintComponent,
|
|
216
|
+
driftComponent: integrity.driftComponent,
|
|
217
|
+
envelopeComponent: integrity.envelopeComponent,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
result.trustSignal = {
|
|
221
|
+
entityId: state.entityId,
|
|
222
|
+
type: tamperingDetected ? 'TAMPERING_DETECTED' : 'ANOMALY_DETECTED',
|
|
223
|
+
value: signalValue,
|
|
224
|
+
source: 'paramesphere:fingerprint-monitor',
|
|
225
|
+
timestamp: now.toISOString(),
|
|
226
|
+
metadata: {
|
|
227
|
+
cosineDistance: distance,
|
|
228
|
+
maxSingularValueDelta: driftResult.maxSingularValueDelta,
|
|
229
|
+
driftThreshold: this.driftThreshold,
|
|
230
|
+
tamperingThreshold: this.driftThreshold * TAMPERING_MULTIPLIER,
|
|
231
|
+
fingerprintSha256: fingerprint.sha256,
|
|
232
|
+
baselineSha256: state.baseline.sha256,
|
|
233
|
+
...integrityMetadata,
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=fingerprint-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint-monitor.js","sourceRoot":"","sources":["../../src/paramesphere/fingerprint-monitor.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AA2GjC,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,yBAAyB,GAAG,OAAO,CAAC,CAAC,YAAY;AACvD,MAAM,uBAAuB,GAAG,IAAI,CAAC;AACrC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,OAAO,kBAAkB;IACZ,MAAM,CAAqB;IAC3B,eAAe,CAAS;IACxB,cAAc,CAAS;IACvB,eAAe,CAAU;IAClC,eAAe,CAAmD;IAClE,kBAAkB,CAAoE;IACtF,mBAAmB,CAAmD;IACtE,sBAAsB,CAAgB;IAE7B,QAAQ,GAA6B,IAAI,GAAG,EAAE,CAAC;IAEhE,YAAY,MAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,yBAAyB,CAAC;QAC3E,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,uBAAuB,CAAC;QACvE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC;QACtD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;QACpD,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACxD,CAAC;IAED,0EAA0E;IAC1E,aAAa;IACb,0EAA0E;IAE1E;;;;;;;;OAQG;IACH,eAAe,CAAC,QAAgB,EAAE,UAAgC;QAChE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,KAAK,GAAgB;YACzB,QAAQ;YACR,UAAU;YACV,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,CAAC;YACjB,kBAAkB,EAAE,CAAC;YACrB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,YAAY;SACrB,CAAC;QAEF,4BAA4B;QAC5B,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,QAAgB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACzB,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,0BAA0B,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAAgB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAC,EAAiE;QAClF,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,EAAiE;QACtF,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,EAAkF;QACtG,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,yBAAyB,CAAC,EAA8B;QACtD,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,0EAA0E;IAC1E,WAAW;IACX,0EAA0E;IAElE,KAAK,CAAC,QAAQ,CAAC,KAAkB;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,2BAA2B;QAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEvD,mCAAmC;QACnC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC5B,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACrC,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC;YAEtB,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW;gBACX,aAAa,EAAE,KAAK;gBACpB,iBAAiB,EAAE,KAAK;gBACxB,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,GAAG;aACf,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,CAAC;QAC5C,MAAM,aAAa,GAAG,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;QACrD,MAAM,iBAAiB,GAAG,QAAQ,GAAG,IAAI,CAAC,cAAc,GAAG,oBAAoB,CAAC;QAEhF,eAAe;QACf,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC;QACtB,IAAI,aAAa;YAAE,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,iBAAiB;YAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAElD,iBAAiB;QACjB,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC1D,CAAC;QAED,eAAe;QACf,MAAM,MAAM,GAAuB;YACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW;YACX,aAAa;YACb,iBAAiB;YACjB,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,GAAG;SACf,CAAC;QAEF,gEAAgE;QAChE,IAAI,IAAI,CAAC,eAAe,IAAI,aAAa,EAAE,CAAC;YAC1C,IAAI,WAAmB,CAAC;YACxB,IAAI,iBAAiB,GAA4B,EAAE,CAAC;YAEpD,IAAI,iBAAiB,EAAE,CAAC;gBACtB,+BAA+B;gBAC/B,WAAW,GAAG,GAAG,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,sEAAsE;gBACtE,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBACzF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACtD,WAAW,EACX,cAAc,CACf,CAAC;gBACF,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC;gBAClC,iBAAiB,GAAG;oBAClB,mBAAmB,EAAE,SAAS,CAAC,SAAS;oBACxC,oBAAoB,EAAE,SAAS,CAAC,oBAAoB;oBACpD,cAAc,EAAE,SAAS,CAAC,cAAc;oBACxC,iBAAiB,EAAE,SAAS,CAAC,iBAAiB;iBAC/C,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,WAAW,GAAG;gBACnB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,kBAAkB;gBACnE,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,kCAAkC;gBAC1C,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;gBAC5B,QAAQ,EAAE;oBACR,cAAc,EAAE,QAAQ;oBACxB,qBAAqB,EAAE,WAAW,CAAC,qBAAqB;oBACxD,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,kBAAkB,EAAE,IAAI,CAAC,cAAc,GAAG,oBAAoB;oBAC9D,iBAAiB,EAAE,WAAW,CAAC,MAAM;oBACrC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;oBACrC,GAAG,iBAAiB;iBACrB;aACF,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FingerprintStore — Persistence layer for ParameSphere fingerprints.
|
|
3
|
+
*
|
|
4
|
+
* Default: InMemoryFingerprintStore (current behavior, no external deps)
|
|
5
|
+
* Override: implement the IFingerprintStore interface for SQLite, Postgres,
|
|
6
|
+
* Redis, or any other backend.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Serialisable fingerprint record suitable for persistence.
|
|
12
|
+
*
|
|
13
|
+
* Unlike `ParameSphereFingerprint` (which carries Float64Array vectors),
|
|
14
|
+
* `StoredFingerprint` uses plain number arrays so it can be round-tripped
|
|
15
|
+
* through JSON, SQL columns, or key-value stores without special handling.
|
|
16
|
+
*/
|
|
17
|
+
export interface StoredFingerprint {
|
|
18
|
+
/** The entity (model / agent) this fingerprint belongs to. */
|
|
19
|
+
entityId: string;
|
|
20
|
+
/** SHA-256 hex digest of the composite fingerprint vector. */
|
|
21
|
+
hash: string;
|
|
22
|
+
/** Top-K singular values (flattened across sampled layers). */
|
|
23
|
+
singularValues: number[];
|
|
24
|
+
/** Optional per-layer activation statistics. */
|
|
25
|
+
activationStats?: {
|
|
26
|
+
mean: number;
|
|
27
|
+
stddev: number;
|
|
28
|
+
kurtosis: number;
|
|
29
|
+
skewness: number;
|
|
30
|
+
}[];
|
|
31
|
+
/** When the fingerprint was computed. */
|
|
32
|
+
createdAt: Date;
|
|
33
|
+
/** Arbitrary metadata (model version, run ID, etc.). */
|
|
34
|
+
metadata?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Persistence interface for ParameSphere fingerprints and baselines.
|
|
38
|
+
*
|
|
39
|
+
* Implementations must be async-safe. The engine calls these methods
|
|
40
|
+
* fire-and-forget for saves and awaits on reads only when needed (e.g.
|
|
41
|
+
* loading a baseline on the first `checkDrift` call).
|
|
42
|
+
*/
|
|
43
|
+
export interface IFingerprintStore {
|
|
44
|
+
/** Append a fingerprint to the entity's history. */
|
|
45
|
+
saveFingerprint(entityId: string, fingerprint: StoredFingerprint): Promise<void>;
|
|
46
|
+
/** Return the most recently saved fingerprint for an entity, or undefined. */
|
|
47
|
+
getLatestFingerprint(entityId: string): Promise<StoredFingerprint | undefined>;
|
|
48
|
+
/** Return the baseline fingerprint for an entity, or undefined. */
|
|
49
|
+
getBaseline(entityId: string): Promise<StoredFingerprint | undefined>;
|
|
50
|
+
/** Set (or overwrite) the baseline fingerprint for an entity. */
|
|
51
|
+
setBaseline(entityId: string, fingerprint: StoredFingerprint): Promise<void>;
|
|
52
|
+
/** Return the last `limit` fingerprints for an entity, newest first. */
|
|
53
|
+
getHistory(entityId: string, limit?: number): Promise<StoredFingerprint[]>;
|
|
54
|
+
/** Remove all fingerprints and baseline for an entity. */
|
|
55
|
+
deleteEntity(entityId: string): Promise<void>;
|
|
56
|
+
/** List all entity IDs that have at least one stored fingerprint. */
|
|
57
|
+
listEntities(): Promise<string[]>;
|
|
58
|
+
}
|
|
59
|
+
/** Options for the in-memory store. */
|
|
60
|
+
export interface InMemoryStoreOptions {
|
|
61
|
+
/** Maximum fingerprints to retain per entity (default: 100). */
|
|
62
|
+
maxHistoryPerEntity?: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* In-memory implementation of `IFingerprintStore`.
|
|
66
|
+
*
|
|
67
|
+
* Suitable for development, testing, and short-lived server processes.
|
|
68
|
+
* Data does **not** survive a process restart — which is the exact
|
|
69
|
+
* behaviour this layer is designed to replace when a persistent backend
|
|
70
|
+
* is plugged in.
|
|
71
|
+
*/
|
|
72
|
+
export declare class InMemoryFingerprintStore implements IFingerprintStore {
|
|
73
|
+
private readonly maxHistory;
|
|
74
|
+
private readonly history;
|
|
75
|
+
private readonly baselines;
|
|
76
|
+
constructor(options?: InMemoryStoreOptions);
|
|
77
|
+
saveFingerprint(entityId: string, fingerprint: StoredFingerprint): Promise<void>;
|
|
78
|
+
getLatestFingerprint(entityId: string): Promise<StoredFingerprint | undefined>;
|
|
79
|
+
getBaseline(entityId: string): Promise<StoredFingerprint | undefined>;
|
|
80
|
+
setBaseline(entityId: string, fingerprint: StoredFingerprint): Promise<void>;
|
|
81
|
+
getHistory(entityId: string, limit?: number): Promise<StoredFingerprint[]>;
|
|
82
|
+
deleteEntity(entityId: string): Promise<void>;
|
|
83
|
+
listEntities(): Promise<string[]>;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=fingerprint-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint-store.d.ts","sourceRoot":"","sources":["../../src/paramesphere/fingerprint-store.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAMH;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gDAAgD;IAChD,eAAe,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzF,yCAAyC;IACzC,SAAS,EAAE,IAAI,CAAC;IAChB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjF,8EAA8E;IAC9E,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IAE/E,mEAAmE;IACnE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IAEtE,iEAAiE;IACjE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7E,wEAAwE;IACxE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAE3E,0DAA0D;IAC1D,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C,qEAAqE;IACrE,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACnC;AAMD,uCAAuC;AACvC,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,qBAAa,wBAAyB,YAAW,iBAAiB;IAChE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAClE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;gBAEtD,OAAO,CAAC,EAAE,oBAAoB;IAIpC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAahF,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAM9E,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAIrE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAW1E,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAUxC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright 2024-2026 Vorion LLC
|
|
3
|
+
/**
|
|
4
|
+
* In-memory implementation of `IFingerprintStore`.
|
|
5
|
+
*
|
|
6
|
+
* Suitable for development, testing, and short-lived server processes.
|
|
7
|
+
* Data does **not** survive a process restart — which is the exact
|
|
8
|
+
* behaviour this layer is designed to replace when a persistent backend
|
|
9
|
+
* is plugged in.
|
|
10
|
+
*/
|
|
11
|
+
export class InMemoryFingerprintStore {
|
|
12
|
+
maxHistory;
|
|
13
|
+
history = new Map();
|
|
14
|
+
baselines = new Map();
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.maxHistory = options?.maxHistoryPerEntity ?? 100;
|
|
17
|
+
}
|
|
18
|
+
async saveFingerprint(entityId, fingerprint) {
|
|
19
|
+
let list = this.history.get(entityId);
|
|
20
|
+
if (!list) {
|
|
21
|
+
list = [];
|
|
22
|
+
this.history.set(entityId, list);
|
|
23
|
+
}
|
|
24
|
+
list.push(fingerprint);
|
|
25
|
+
// Trim oldest entries if over capacity
|
|
26
|
+
while (list.length > this.maxHistory) {
|
|
27
|
+
list.shift();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async getLatestFingerprint(entityId) {
|
|
31
|
+
const list = this.history.get(entityId);
|
|
32
|
+
if (!list || list.length === 0)
|
|
33
|
+
return undefined;
|
|
34
|
+
return list[list.length - 1];
|
|
35
|
+
}
|
|
36
|
+
async getBaseline(entityId) {
|
|
37
|
+
return this.baselines.get(entityId);
|
|
38
|
+
}
|
|
39
|
+
async setBaseline(entityId, fingerprint) {
|
|
40
|
+
this.baselines.set(entityId, fingerprint);
|
|
41
|
+
}
|
|
42
|
+
async getHistory(entityId, limit) {
|
|
43
|
+
const list = this.history.get(entityId);
|
|
44
|
+
if (!list || list.length === 0)
|
|
45
|
+
return [];
|
|
46
|
+
// Return newest first
|
|
47
|
+
const reversed = [...list].reverse();
|
|
48
|
+
if (limit !== undefined && limit > 0) {
|
|
49
|
+
return reversed.slice(0, limit);
|
|
50
|
+
}
|
|
51
|
+
return reversed;
|
|
52
|
+
}
|
|
53
|
+
async deleteEntity(entityId) {
|
|
54
|
+
this.history.delete(entityId);
|
|
55
|
+
this.baselines.delete(entityId);
|
|
56
|
+
}
|
|
57
|
+
async listEntities() {
|
|
58
|
+
const entities = new Set();
|
|
59
|
+
for (const key of this.history.keys()) {
|
|
60
|
+
entities.add(key);
|
|
61
|
+
}
|
|
62
|
+
for (const key of this.baselines.keys()) {
|
|
63
|
+
entities.add(key);
|
|
64
|
+
}
|
|
65
|
+
return Array.from(entities);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=fingerprint-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint-store.js","sourceRoot":"","sources":["../../src/paramesphere/fingerprint-store.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAkFjC;;;;;;;GAOG;AACH,MAAM,OAAO,wBAAwB;IAClB,UAAU,CAAS;IACnB,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;IACjD,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;IAElE,YAAY,OAA8B;QACxC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,mBAAmB,IAAI,GAAG,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,WAA8B;QACpE,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,EAAE,CAAC;YACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvB,uCAAuC;QACvC,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,QAAgB;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACjD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,WAA8B;QAChE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAc;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1C,sBAAsB;QACtB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ParameSphere — SVD-Based Model Fingerprinting & Cognitive Envelope
|
|
3
|
+
*
|
|
4
|
+
* Production implementation of the patent-specified ParameSphere engine
|
|
5
|
+
* for detecting model weight drift and cognitive boundary breaches in
|
|
6
|
+
* AI agent deployments.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
export { ParameSphereEngine } from './paramesphere-engine.js';
|
|
11
|
+
export { CognitiveEnvelope } from './cognitive-envelope.js';
|
|
12
|
+
export { FingerprintMonitor } from './fingerprint-monitor.js';
|
|
13
|
+
export { ActivationCollector } from './activation-collector.js';
|
|
14
|
+
export { InMemoryFingerprintStore } from './fingerprint-store.js';
|
|
15
|
+
export { connectMonitorToTrustEngine, disconnectMonitor } from './monitor-integration.js';
|
|
16
|
+
export type { MonitorIntegrationConfig } from './monitor-integration.js';
|
|
17
|
+
export type { ActivationCollectorConfig } from './activation-collector.js';
|
|
18
|
+
export type { FingerprintMonitorConfig, MonitorCheckResult, MonitorStatus, TrustSignalPayload, } from './fingerprint-monitor.js';
|
|
19
|
+
export type { IFingerprintStore, StoredFingerprint, InMemoryStoreOptions, } from './fingerprint-store.js';
|
|
20
|
+
export { DEFAULT_INTEGRITY_WEIGHTS } from './types.js';
|
|
21
|
+
export type { ParameSphereConfig, ParameSphereFingerprint, ActivationStats, FingerprintComparison, DriftResult, EnvelopeConfig, BreachResult, EnvelopeState, DimensionBound, IntegrityMultiplier, IntegrityMultiplierConfig, } from './types.js';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/paramesphere/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,YAAY,EACV,wBAAwB,EACxB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright 2024-2026 Vorion LLC
|
|
3
|
+
/**
|
|
4
|
+
* ParameSphere — SVD-Based Model Fingerprinting & Cognitive Envelope
|
|
5
|
+
*
|
|
6
|
+
* Production implementation of the patent-specified ParameSphere engine
|
|
7
|
+
* for detecting model weight drift and cognitive boundary breaches in
|
|
8
|
+
* AI agent deployments.
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
export { ParameSphereEngine } from './paramesphere-engine.js';
|
|
13
|
+
export { CognitiveEnvelope } from './cognitive-envelope.js';
|
|
14
|
+
export { FingerprintMonitor } from './fingerprint-monitor.js';
|
|
15
|
+
export { ActivationCollector } from './activation-collector.js';
|
|
16
|
+
export { InMemoryFingerprintStore } from './fingerprint-store.js';
|
|
17
|
+
export { connectMonitorToTrustEngine, disconnectMonitor } from './monitor-integration.js';
|
|
18
|
+
export { DEFAULT_INTEGRITY_WEIGHTS } from './types.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/paramesphere/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAc1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC"}
|