yakmesh 2.8.2 → 3.0.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 +637 -0
- package/CONTRIBUTING.md +42 -0
- package/Caddyfile +77 -0
- package/README.md +119 -29
- package/adapters/adapter-mlv-bible/README.md +124 -0
- package/adapters/adapter-mlv-bible/index.js +400 -0
- package/adapters/chat-mod-adapter.js +532 -0
- package/adapters/content-adapter.js +273 -0
- package/content/api.js +50 -41
- package/content/index.js +2 -2
- package/content/store.js +355 -173
- package/dashboard/index.html +19 -3
- package/database/replication.js +117 -37
- package/docs/CRYPTO-AGILITY.md +204 -0
- package/docs/MTLS-RESEARCH.md +367 -0
- package/docs/NAMCHE-SPEC.md +681 -0
- package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
- package/docs/PRECISION-DISCLOSURE.md +96 -0
- package/docs/README.md +76 -0
- package/docs/ROADMAP-2.4.0.md +447 -0
- package/docs/ROADMAP-2.5.0.md +244 -0
- package/docs/SECURITY-AUDIT-REPORT.md +306 -0
- package/docs/SST-INTEGRATION.md +712 -0
- package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
- package/docs/TERNARY-AUDIT-REPORT.md +247 -0
- package/docs/TME-FAQ.md +221 -0
- package/docs/WHITEPAPER.md +623 -0
- package/docs/adapters.html +1001 -0
- package/docs/advanced-systems.html +1045 -0
- package/docs/annex.html +1046 -0
- package/docs/api.html +970 -0
- package/docs/business/response-templates.md +160 -0
- package/docs/c2c.html +1225 -0
- package/docs/cli.html +1332 -0
- package/docs/configuration.html +1248 -0
- package/docs/darshan.html +1085 -0
- package/docs/dharma.html +966 -0
- package/docs/docs-bundle.html +1075 -0
- package/docs/docs.css +3120 -0
- package/docs/docs.js +556 -0
- package/docs/doko.html +969 -0
- package/docs/geo-proof.html +858 -0
- package/docs/getting-started.html +840 -0
- package/docs/gumba-tutorial.html +1144 -0
- package/docs/gumba.html +1098 -0
- package/docs/index.html +914 -0
- package/docs/jhilke.html +1312 -0
- package/docs/karma.html +1100 -0
- package/docs/katha.html +1037 -0
- package/docs/lama.html +978 -0
- package/docs/mandala.html +1067 -0
- package/docs/mani.html +964 -0
- package/docs/mantra.html +967 -0
- package/docs/mesh.html +1409 -0
- package/docs/nakpak.html +869 -0
- package/docs/namche.html +928 -0
- package/docs/nav-order.json +53 -0
- package/docs/prahari.html +1043 -0
- package/docs/prism-bash.min.js +1 -0
- package/docs/prism-javascript.min.js +1 -0
- package/docs/prism-json.min.js +1 -0
- package/docs/prism-tomorrow.min.css +1 -0
- package/docs/prism.min.js +1 -0
- package/docs/privacy.html +699 -0
- package/docs/quick-reference.html +1181 -0
- package/docs/sakshi.html +1402 -0
- package/docs/sandboxing.md +386 -0
- package/docs/seva.html +911 -0
- package/docs/sherpa.html +871 -0
- package/docs/studio.html +860 -0
- package/docs/stupa.html +995 -0
- package/docs/tailwind.min.css +2 -0
- package/docs/tattva.html +1332 -0
- package/docs/terms.html +686 -0
- package/docs/time-server-deployment.md +166 -0
- package/docs/time-sources.html +1392 -0
- package/docs/tivra.html +1127 -0
- package/docs/trademark-policy.html +686 -0
- package/docs/tribhuj.html +1183 -0
- package/docs/trust-security.html +1029 -0
- package/docs/tutorials/backup-recovery.html +654 -0
- package/docs/tutorials/dashboard.html +604 -0
- package/docs/tutorials/domain-setup.html +605 -0
- package/docs/tutorials/host-website.html +456 -0
- package/docs/tutorials/mesh-network.html +505 -0
- package/docs/tutorials/mobile-access.html +445 -0
- package/docs/tutorials/privacy.html +467 -0
- package/docs/tutorials/raspberry-pi.html +600 -0
- package/docs/tutorials/security-basics.html +539 -0
- package/docs/tutorials/share-files.html +431 -0
- package/docs/tutorials/troubleshooting.html +637 -0
- package/docs/tutorials/trust-karma.html +419 -0
- package/docs/tutorials/yak-protocol.html +456 -0
- package/docs/tutorials.html +1034 -0
- package/docs/vani.html +1270 -0
- package/docs/webserver.html +809 -0
- package/docs/yak-protocol.html +940 -0
- package/docs/yak-timeserver-design.md +475 -0
- package/docs/yakapp.html +1015 -0
- package/docs/ypc27.html +1069 -0
- package/docs/yurt.html +1344 -0
- package/embedded-docs/bundle.js +334 -74
- package/gossip/protocol.js +247 -27
- package/identity/key-resolver.js +262 -0
- package/identity/machine-seed.js +632 -0
- package/identity/node-key.js +669 -368
- package/identity/tribhuj-ratchet.js +506 -0
- package/knowledge-base.js +37 -8
- package/launcher/yakmesh.bat +62 -0
- package/launcher/yakmesh.sh +70 -0
- package/mesh/annex.js +462 -108
- package/mesh/beacon-broadcast.js +113 -1
- package/mesh/darshan.js +1718 -0
- package/mesh/gumba.js +1567 -0
- package/mesh/jhilke.js +651 -0
- package/mesh/katha.js +1012 -0
- package/mesh/nakpak-routing.js +8 -5
- package/mesh/network.js +724 -34
- package/mesh/pulse-sync.js +4 -1
- package/mesh/rate-limiter.js +127 -15
- package/mesh/seva.js +526 -0
- package/mesh/sherpa-discovery.js +89 -8
- package/mesh/sybil-defense.js +19 -5
- package/mesh/temporal-encoder.js +4 -3
- package/mesh/vani.js +1364 -0
- package/mesh/yurt.js +1340 -0
- package/models/entropy-sentinel.onnx +0 -0
- package/models/karma-trust.onnx +0 -0
- package/models/manifest.json +43 -0
- package/models/sakshi-anomaly.onnx +0 -0
- package/oracle/code-proof-protocol.js +7 -6
- package/oracle/codebase-lock.js +257 -28
- package/oracle/index.js +74 -15
- package/oracle/ma902-snmp.js +678 -0
- package/oracle/module-sealer.js +5 -3
- package/oracle/network-identity.js +16 -0
- package/oracle/packet-checksum.js +201 -0
- package/oracle/sst.js +579 -0
- package/oracle/ternary-144t.js +714 -0
- package/oracle/ternary-ml.js +481 -0
- package/oracle/time-api.js +239 -0
- package/oracle/time-source.js +137 -47
- package/oracle/validation-oracle-hardened.js +1111 -1071
- package/oracle/validation-oracle.js +4 -2
- package/oracle/ypc27.js +211 -0
- package/package.json +20 -3
- package/protocol/yak-handler.js +35 -9
- package/protocol/yak-protocol.js +28 -13
- package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
- package/reference/cpp/yakmesh_ypc27.cpp +179 -0
- package/sbom.json +87 -0
- package/scripts/security-audit.mjs +264 -0
- package/scripts/update-docs-nav.js +194 -0
- package/scripts/update-docs-sidebar.cjs +164 -0
- package/security/crypto-config.js +4 -3
- package/security/dharma-moderation.js +517 -0
- package/security/doko-identity.js +193 -143
- package/security/domain-consensus.js +86 -85
- package/security/fs-hardening.js +620 -0
- package/security/hardware-attestation.js +5 -3
- package/security/hybrid-trust.js +227 -87
- package/security/karma-rate-limiter.js +692 -0
- package/security/khata-protocol.js +22 -21
- package/security/khata-trust-integration.js +277 -150
- package/security/memory-safety.js +635 -0
- package/security/mesh-auth.js +11 -10
- package/security/mesh-revocation.js +373 -5
- package/security/namche-gateway.js +298 -69
- package/security/sakshi.js +460 -3
- package/security/sangha.js +770 -0
- package/security/secure-config.js +473 -0
- package/security/silicon-parity.js +13 -10
- package/security/steadywatch.js +1142 -0
- package/security/strike-system.js +32 -3
- package/security/temporal-signing.js +488 -0
- package/security/trit-commitment.js +464 -0
- package/server/crypto/annex.js +247 -0
- package/server/darshan-api.js +343 -0
- package/server/index.js +3259 -362
- package/server/komm-api.js +668 -0
- package/utils/accel.js +2273 -0
- package/utils/ternary-id.js +79 -0
- package/utils/verify-worker.js +57 -0
- package/webserver/index.js +95 -5
- package/assets/yakmesh-logo.png +0 -0
- package/assets/yakmesh-logo.svg +0 -80
- package/assets/yakmesh-logo2.png +0 -0
- package/assets/yakmesh-logo2sm.png +0 -0
- package/assets/ymsm.png +0 -0
- package/website/assets/silhouettes/adapters.svg +0 -107
- package/website/assets/silhouettes/api-endpoints.svg +0 -115
- package/website/assets/silhouettes/atomic-clock.svg +0 -83
- package/website/assets/silhouettes/base-camp.svg +0 -81
- package/website/assets/silhouettes/bridge.svg +0 -69
- package/website/assets/silhouettes/docs-bundle.svg +0 -113
- package/website/assets/silhouettes/doko-basket.svg +0 -70
- package/website/assets/silhouettes/fortress.svg +0 -93
- package/website/assets/silhouettes/gateway.svg +0 -54
- package/website/assets/silhouettes/gears.svg +0 -93
- package/website/assets/silhouettes/globe-satellite.svg +0 -67
- package/website/assets/silhouettes/karma-wheel.svg +0 -137
- package/website/assets/silhouettes/lama-council.svg +0 -141
- package/website/assets/silhouettes/mandala-network.svg +0 -169
- package/website/assets/silhouettes/mani-stones.svg +0 -149
- package/website/assets/silhouettes/mantra-wheel.svg +0 -116
- package/website/assets/silhouettes/mesh-nodes.svg +0 -113
- package/website/assets/silhouettes/nakpak.svg +0 -56
- package/website/assets/silhouettes/peak-lightning.svg +0 -73
- package/website/assets/silhouettes/sherpa.svg +0 -69
- package/website/assets/silhouettes/stupa-tower.svg +0 -119
- package/website/assets/silhouettes/tattva-eye.svg +0 -78
- package/website/assets/silhouettes/terminal.svg +0 -74
- package/website/assets/silhouettes/webserver.svg +0 -145
- package/website/assets/silhouettes/yak.svg +0 -78
- package/website/assets/yakmesh-logo.png +0 -0
- package/website/assets/yakmesh-logo.webp +0 -0
- package/website/assets/yakmesh-logo128x140.webp +0 -0
- package/website/assets/yakmesh-logo2.png +0 -0
- package/website/assets/yakmesh-logo2.svg +0 -51
- package/website/assets/yakmesh-logo40x44.webp +0 -0
- package/website/assets/yakmesh.gif +0 -0
- package/website/assets/yakmesh.ico +0 -0
- package/website/assets/yakmesh.jpg +0 -0
- package/website/assets/yakmesh.pdf +0 -0
- package/website/assets/yakmesh.png +0 -0
- package/website/assets/yakmesh.svg +0 -70
- package/website/assets/yakmesh128.webp +0 -0
- package/website/assets/yakmesh32.png +0 -0
- package/website/assets/yakmesh32.svg +0 -65
- package/website/assets/yakmesh32o.ico +0 -2
- package/website/assets/yakmesh32o.svg +0 -65
- package/website/assets/yakmesh32o.svgz +0 -0
package/security/hybrid-trust.js
CHANGED
|
@@ -59,6 +59,14 @@ import { EventEmitter } from 'events';
|
|
|
59
59
|
import { sha3_256 } from '@noble/hashes/sha3.js';
|
|
60
60
|
import { bytesToHex, utf8ToBytes } from '@noble/hashes/utils.js';
|
|
61
61
|
|
|
62
|
+
// ═══ TRIBHUJ — Balanced ternary for evidence verification states ═══
|
|
63
|
+
// Evidence sources use trits: POSITIVE (verified), NEUTRAL (unchecked), NEGATIVE (failed)
|
|
64
|
+
import { POSITIVE, NEUTRAL, NEGATIVE, TritState } from '../oracle/tribhuj.js';
|
|
65
|
+
|
|
66
|
+
// ═══ SST — Synergy Sequence Theory for trust geometry ═══
|
|
67
|
+
// Trust decay uses the 30-60-90 triangle geometry (√3 ratios)
|
|
68
|
+
import { propagateTrust, decayTrust, TRUST_PROPAGATION, SynergyAngles } from '../oracle/sst.js';
|
|
69
|
+
|
|
62
70
|
/**
|
|
63
71
|
* KARMA Level Constants - Stages of spiritual trust
|
|
64
72
|
*/
|
|
@@ -67,6 +75,11 @@ export const KarmaLevel = {
|
|
|
67
75
|
SEEKING: 1, // Basic - Self-asserted only (on the path)
|
|
68
76
|
AWAKENED: 2, // Standard - Mesh verified (eyes opening)
|
|
69
77
|
ENLIGHTENED: 3, // Highest - Full verification (full realization)
|
|
78
|
+
|
|
79
|
+
// Backward compatibility aliases
|
|
80
|
+
BRONZE: 1, // → SEEKING
|
|
81
|
+
GOLD: 2, // → AWAKENED
|
|
82
|
+
PLATINUM: 3, // → ENLIGHTENED
|
|
70
83
|
};
|
|
71
84
|
|
|
72
85
|
// Backward compatibility alias
|
|
@@ -153,11 +166,14 @@ class KarmaEvidence {
|
|
|
153
166
|
this.createdAt = Date.now();
|
|
154
167
|
this.lastUpdated = Date.now();
|
|
155
168
|
|
|
156
|
-
// Evidence sources
|
|
169
|
+
// Evidence sources — verified uses balanced ternary trits:
|
|
170
|
+
// POSITIVE (+1) = verified/passed
|
|
171
|
+
// NEUTRAL ( 0) = unchecked (not yet attempted)
|
|
172
|
+
// NEGATIVE (-1) = verification failed
|
|
157
173
|
this.sources = {
|
|
158
174
|
// DOKO verification via NAMCHE
|
|
159
175
|
doko: {
|
|
160
|
-
verified:
|
|
176
|
+
verified: NEUTRAL,
|
|
161
177
|
verifiedAt: null,
|
|
162
178
|
gatesPassedCount: 0,
|
|
163
179
|
dokoHash: null,
|
|
@@ -165,7 +181,7 @@ class KarmaEvidence {
|
|
|
165
181
|
|
|
166
182
|
// Mesh quorum verification
|
|
167
183
|
meshQuorum: {
|
|
168
|
-
verified:
|
|
184
|
+
verified: NEUTRAL,
|
|
169
185
|
verifiedAt: null,
|
|
170
186
|
quorumSize: 0,
|
|
171
187
|
verifiers: [],
|
|
@@ -174,7 +190,7 @@ class KarmaEvidence {
|
|
|
174
190
|
|
|
175
191
|
// SSL/TLS verification
|
|
176
192
|
ssl: {
|
|
177
|
-
verified:
|
|
193
|
+
verified: NEUTRAL,
|
|
178
194
|
verifiedAt: null,
|
|
179
195
|
certType: null, // 'ca-signed', 'self-signed', 'doko-bound'
|
|
180
196
|
certFingerprint: null,
|
|
@@ -183,7 +199,7 @@ class KarmaEvidence {
|
|
|
183
199
|
|
|
184
200
|
// Domain ownership
|
|
185
201
|
domain: {
|
|
186
|
-
verified:
|
|
202
|
+
verified: NEUTRAL,
|
|
187
203
|
verifiedAt: null,
|
|
188
204
|
domain: null,
|
|
189
205
|
proofCount: 0,
|
|
@@ -199,17 +215,28 @@ class KarmaEvidence {
|
|
|
199
215
|
};
|
|
200
216
|
|
|
201
217
|
// Computed trust level
|
|
202
|
-
this.trustLevel =
|
|
218
|
+
this.trustLevel = KarmaLevel.UNTRUSTED;
|
|
203
219
|
this.trustScore = 0; // 0-100 detailed score
|
|
204
220
|
this.levelHistory = []; // Track level changes
|
|
205
221
|
}
|
|
206
222
|
|
|
223
|
+
/**
|
|
224
|
+
* Convert boolean → trit for backward compatibility
|
|
225
|
+
* true → POSITIVE (+1), false → NEGATIVE (-1), null/undefined → NEUTRAL (0)
|
|
226
|
+
*/
|
|
227
|
+
static boolToTrit(val) {
|
|
228
|
+
if (typeof val === 'number' && val >= -1 && val <= 1) return val; // already a trit
|
|
229
|
+
if (val === null || val === undefined) return NEUTRAL;
|
|
230
|
+
return val ? POSITIVE : NEGATIVE;
|
|
231
|
+
}
|
|
232
|
+
|
|
207
233
|
/**
|
|
208
234
|
* Record DOKO verification
|
|
209
235
|
*/
|
|
210
236
|
recordDokoVerification(result) {
|
|
237
|
+
const passed = result.passed ?? result.verified;
|
|
211
238
|
this.sources.doko = {
|
|
212
|
-
verified:
|
|
239
|
+
verified: KarmaEvidence.boolToTrit(passed),
|
|
213
240
|
verifiedAt: Date.now(),
|
|
214
241
|
gatesPassedCount: result.gatesChecked || 7,
|
|
215
242
|
dokoHash: result.dokoHash || null,
|
|
@@ -222,7 +249,7 @@ class KarmaEvidence {
|
|
|
222
249
|
*/
|
|
223
250
|
recordMeshQuorum(result) {
|
|
224
251
|
this.sources.meshQuorum = {
|
|
225
|
-
verified: result.valid,
|
|
252
|
+
verified: KarmaEvidence.boolToTrit(result.valid),
|
|
226
253
|
verifiedAt: Date.now(),
|
|
227
254
|
quorumSize: result.validProofs || 0,
|
|
228
255
|
verifiers: result.verifiers || [],
|
|
@@ -236,7 +263,7 @@ class KarmaEvidence {
|
|
|
236
263
|
*/
|
|
237
264
|
recordSSLVerification(result) {
|
|
238
265
|
this.sources.ssl = {
|
|
239
|
-
verified: result.verified,
|
|
266
|
+
verified: KarmaEvidence.boolToTrit(result.verified),
|
|
240
267
|
verifiedAt: Date.now(),
|
|
241
268
|
certType: result.certType || 'unknown',
|
|
242
269
|
certFingerprint: result.fingerprint || null,
|
|
@@ -250,7 +277,7 @@ class KarmaEvidence {
|
|
|
250
277
|
*/
|
|
251
278
|
recordDomainVerification(result) {
|
|
252
279
|
this.sources.domain = {
|
|
253
|
-
verified: result.valid,
|
|
280
|
+
verified: KarmaEvidence.boolToTrit(result.valid),
|
|
254
281
|
verifiedAt: Date.now(),
|
|
255
282
|
domain: result.domain || null,
|
|
256
283
|
proofCount: result.proofCount || 0,
|
|
@@ -328,7 +355,7 @@ class KarmaEvidence {
|
|
|
328
355
|
* Restore from persistence
|
|
329
356
|
*/
|
|
330
357
|
static deserialize(data) {
|
|
331
|
-
const evidence = new
|
|
358
|
+
const evidence = new KarmaEvidence(data.nodeId);
|
|
332
359
|
evidence.createdAt = data.createdAt;
|
|
333
360
|
evidence.lastUpdated = data.lastUpdated;
|
|
334
361
|
evidence.sources = data.sources;
|
|
@@ -349,6 +376,8 @@ export class KarmaTrustModel extends EventEmitter {
|
|
|
349
376
|
constructor(config = {}) {
|
|
350
377
|
super();
|
|
351
378
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
379
|
+
this._inferenceEngine = config.inferenceEngine || null;
|
|
380
|
+
this._modelName = 'karma-trust';
|
|
352
381
|
|
|
353
382
|
// Karma evidence per node (spiritual ledger)
|
|
354
383
|
this.evidence = new Map(); // nodeId -> KarmaEvidence
|
|
@@ -377,10 +406,12 @@ export class KarmaTrustModel extends EventEmitter {
|
|
|
377
406
|
* Get or create karma evidence for a node
|
|
378
407
|
*/
|
|
379
408
|
getEvidence(nodeId) {
|
|
380
|
-
|
|
381
|
-
|
|
409
|
+
// Coerce to string — prevent non-string keys from entering evidence Map
|
|
410
|
+
const id = typeof nodeId === 'string' ? nodeId : String(nodeId ?? 'unknown');
|
|
411
|
+
if (!this.evidence.has(id)) {
|
|
412
|
+
this.evidence.set(id, new KarmaEvidence(id));
|
|
382
413
|
}
|
|
383
|
-
return this.evidence.get(
|
|
414
|
+
return this.evidence.get(id);
|
|
384
415
|
}
|
|
385
416
|
|
|
386
417
|
/**
|
|
@@ -479,114 +510,223 @@ export class KarmaTrustModel extends EventEmitter {
|
|
|
479
510
|
|
|
480
511
|
/**
|
|
481
512
|
* Calculate trust level based on evidence
|
|
513
|
+
* Uses TRIBHUJ balanced ternary for verification state checks
|
|
514
|
+
* and SST geometric decay (√3 ratios) for trust degradation.
|
|
482
515
|
*/
|
|
483
516
|
calculateTrustLevel(evidence) {
|
|
484
517
|
const sources = evidence.sources;
|
|
485
518
|
const age = evidence.getAge();
|
|
486
519
|
|
|
487
520
|
// ═════════════════════════════════════════════════════════════════════
|
|
488
|
-
// Check for UNTRUSTED conditions first
|
|
521
|
+
// Check for UNTRUSTED conditions first (NEGATIVE karma)
|
|
489
522
|
// ═════════════════════════════════════════════════════════════════════
|
|
490
523
|
|
|
491
|
-
// If DOKO verification explicitly failed (not just
|
|
492
|
-
if (sources.doko.verified ===
|
|
524
|
+
// If DOKO verification explicitly failed (NEGATIVE trit — not just NEUTRAL/unchecked)
|
|
525
|
+
if (sources.doko.verified === NEGATIVE) {
|
|
493
526
|
return {
|
|
494
|
-
level:
|
|
527
|
+
level: KarmaLevel.UNTRUSTED,
|
|
495
528
|
score: 0,
|
|
496
|
-
reason: 'DOKO verification failed',
|
|
497
|
-
requirements: { dokoVerification: '
|
|
529
|
+
reason: 'DOKO verification failed (NEGATIVE karma)',
|
|
530
|
+
requirements: { dokoVerification: 'NEGATIVE' },
|
|
498
531
|
};
|
|
499
532
|
}
|
|
500
533
|
|
|
501
|
-
//
|
|
534
|
+
// SST geometric trust decay (replaces flat 30-day threshold)
|
|
535
|
+
// Uses the 30-60-90 Synergy Triangle: MIDDLE angle = 7-day half-life
|
|
502
536
|
if (this.config.trustDecayEnabled) {
|
|
503
|
-
const
|
|
504
|
-
const
|
|
537
|
+
const elapsedMs = Date.now() - evidence.lastUpdated;
|
|
538
|
+
const currentScore = evidence.trustScore || 0;
|
|
505
539
|
|
|
506
|
-
if (
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
540
|
+
if (currentScore > 0 && elapsedMs > 0) {
|
|
541
|
+
const decayedScore = decayTrust(currentScore / 100, elapsedMs, SynergyAngles.MIDDLE);
|
|
542
|
+
|
|
543
|
+
// Fully decayed: trust has gone below threshold
|
|
544
|
+
if (decayedScore * 100 < 1) {
|
|
545
|
+
return {
|
|
546
|
+
level: KarmaLevel.UNTRUSTED,
|
|
547
|
+
score: 0,
|
|
548
|
+
reason: 'Trust decayed (SST √3 geometric — 7-day half-life)',
|
|
549
|
+
requirements: { activity: 'DECAYED', decayedScore: Math.round(decayedScore * 100) },
|
|
550
|
+
};
|
|
551
|
+
}
|
|
513
552
|
}
|
|
514
553
|
}
|
|
515
554
|
|
|
516
555
|
// ═════════════════════════════════════════════════════════════════════
|
|
517
|
-
// Check for
|
|
556
|
+
// Check for ENLIGHTENED level (formerly PLATINUM)
|
|
518
557
|
// ═════════════════════════════════════════════════════════════════════
|
|
519
558
|
|
|
520
|
-
const
|
|
521
|
-
doko: sources.doko.verified,
|
|
522
|
-
meshQuorum: sources.meshQuorum.verified &&
|
|
559
|
+
const enlightenedRequirements = {
|
|
560
|
+
doko: sources.doko.verified === POSITIVE,
|
|
561
|
+
meshQuorum: sources.meshQuorum.verified === POSITIVE &&
|
|
523
562
|
sources.meshQuorum.quorumSize >= this.config.minQuorumForGold,
|
|
524
563
|
meshDiversity: sources.meshQuorum.diversity?.sufficient || false,
|
|
525
|
-
ssl: !this.config.requireSSLForPlatinum || sources.ssl.verified,
|
|
564
|
+
ssl: !this.config.requireSSLForPlatinum || sources.ssl.verified === POSITIVE,
|
|
526
565
|
age: age >= this.config.minAgeForPlatinum,
|
|
527
|
-
domain: !this.config.requireDomainForPlatinum || sources.domain.verified,
|
|
566
|
+
domain: !this.config.requireDomainForPlatinum || sources.domain.verified === POSITIVE,
|
|
528
567
|
consistency: evidence.calculateBeaconConsistency(this.config.beaconCheckWindow)
|
|
529
568
|
>= this.config.minBeaconConsistency,
|
|
530
569
|
};
|
|
531
570
|
|
|
532
|
-
const
|
|
533
|
-
const
|
|
571
|
+
const enlightenedScore = Object.values(enlightenedRequirements).filter(Boolean).length;
|
|
572
|
+
const enlightenedTotal = Object.keys(enlightenedRequirements).length;
|
|
534
573
|
|
|
535
|
-
if (
|
|
574
|
+
if (enlightenedScore === enlightenedTotal) {
|
|
536
575
|
return {
|
|
537
|
-
level:
|
|
538
|
-
score: 90 + (
|
|
539
|
-
reason: 'Full verification: SSL + Mesh + Time + Domain',
|
|
540
|
-
requirements:
|
|
576
|
+
level: KarmaLevel.ENLIGHTENED,
|
|
577
|
+
score: 90 + (enlightenedScore / enlightenedTotal) * 10,
|
|
578
|
+
reason: 'Full verification: SSL + Mesh + Time + Domain (dharma embodied)',
|
|
579
|
+
requirements: enlightenedRequirements,
|
|
541
580
|
};
|
|
542
581
|
}
|
|
543
582
|
|
|
544
583
|
// ═════════════════════════════════════════════════════════════════════
|
|
545
|
-
// Check for
|
|
584
|
+
// Check for AWAKENED level (formerly GOLD)
|
|
546
585
|
// ═════════════════════════════════════════════════════════════════════
|
|
547
586
|
|
|
548
|
-
const
|
|
549
|
-
doko: sources.doko.verified,
|
|
550
|
-
meshQuorum: sources.meshQuorum.verified &&
|
|
587
|
+
const awakenedRequirements = {
|
|
588
|
+
doko: sources.doko.verified === POSITIVE,
|
|
589
|
+
meshQuorum: sources.meshQuorum.verified === POSITIVE &&
|
|
551
590
|
sources.meshQuorum.quorumSize >= this.config.minQuorumForGold,
|
|
552
591
|
meshDiversity: sources.meshQuorum.diversity?.sufficient || false,
|
|
553
592
|
};
|
|
554
593
|
|
|
555
|
-
const
|
|
556
|
-
const
|
|
594
|
+
const awakenedScore = Object.values(awakenedRequirements).filter(Boolean).length;
|
|
595
|
+
const awakenedTotal = Object.keys(awakenedRequirements).length;
|
|
557
596
|
|
|
558
|
-
if (
|
|
559
|
-
// Calculate how close to
|
|
560
|
-
const
|
|
597
|
+
if (awakenedScore === awakenedTotal) {
|
|
598
|
+
// Calculate how close to enlightenment
|
|
599
|
+
const progressTowardsEnlightenment = enlightenedScore / enlightenedTotal;
|
|
561
600
|
|
|
562
601
|
return {
|
|
563
|
-
level:
|
|
564
|
-
score: 50 + (
|
|
565
|
-
reason: 'Mesh verified with diverse quorum',
|
|
566
|
-
requirements:
|
|
567
|
-
|
|
602
|
+
level: KarmaLevel.AWAKENED,
|
|
603
|
+
score: 50 + (progressTowardsEnlightenment * 40),
|
|
604
|
+
reason: 'Mesh verified with diverse quorum (eyes opening)',
|
|
605
|
+
requirements: awakenedRequirements,
|
|
606
|
+
enlightenedProgress: enlightenedRequirements,
|
|
568
607
|
};
|
|
569
608
|
}
|
|
570
609
|
|
|
571
610
|
// ═════════════════════════════════════════════════════════════════════
|
|
572
|
-
// Default to
|
|
611
|
+
// Default to SEEKING level (formerly BRONZE)
|
|
573
612
|
// ═════════════════════════════════════════════════════════════════════
|
|
574
613
|
|
|
575
|
-
const
|
|
576
|
-
(sources.doko.verified ? 20 : 0) +
|
|
614
|
+
const seekingScore = (
|
|
615
|
+
(sources.doko.verified === POSITIVE ? 20 : 0) +
|
|
577
616
|
(sources.beaconHistory.sightings > 0 ? 10 : 0) +
|
|
578
|
-
(
|
|
617
|
+
(awakenedScore / awakenedTotal) * 20
|
|
579
618
|
);
|
|
580
619
|
|
|
581
620
|
return {
|
|
582
|
-
level:
|
|
583
|
-
score:
|
|
584
|
-
reason: 'Self-asserted, awaiting mesh verification',
|
|
621
|
+
level: KarmaLevel.SEEKING,
|
|
622
|
+
score: seekingScore,
|
|
623
|
+
reason: 'Self-asserted, awaiting mesh verification (beginning the journey)',
|
|
585
624
|
requirements: {
|
|
586
|
-
doko: sources.doko.verified,
|
|
625
|
+
doko: sources.doko.verified === POSITIVE,
|
|
587
626
|
beaconSeen: sources.beaconHistory.sightings > 0,
|
|
588
627
|
},
|
|
589
|
-
|
|
628
|
+
awakenedProgress: awakenedRequirements,
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/**
|
|
633
|
+
* NPU-accelerated trust level prediction.
|
|
634
|
+
* Feeds evidence features into the karma-trust ONNX model for softmax
|
|
635
|
+
* probability distribution over [UNTRUSTED, SEEKING, AWAKENED, ENLIGHTENED].
|
|
636
|
+
*
|
|
637
|
+
* Falls back to CPU rule-based `calculateTrustLevel()` if ONNX is unavailable.
|
|
638
|
+
*
|
|
639
|
+
* The NPU prediction is a "second opinion" — the authoritative trust level
|
|
640
|
+
* is always the rule-based `calculateTrustLevel()` method.
|
|
641
|
+
*
|
|
642
|
+
* @param {Object} evidence - KarmaEvidence instance
|
|
643
|
+
* @returns {Promise<Object>} Trust prediction with probabilities per level
|
|
644
|
+
*/
|
|
645
|
+
async predictTrustLevel(evidence) {
|
|
646
|
+
const sources = evidence.sources;
|
|
647
|
+
const age = evidence.getAge();
|
|
648
|
+
|
|
649
|
+
// Map trit value to normalized float: -1→0, 0→0.5, 1→1
|
|
650
|
+
const tritNorm = (t) => (t + 1) / 2;
|
|
651
|
+
|
|
652
|
+
// Determine SSL type numeric value
|
|
653
|
+
let sslType = 0;
|
|
654
|
+
if (sources.ssl.verified === POSITIVE) {
|
|
655
|
+
sslType = sources.ssl.certBound ? 0.67 : (sources.ssl.selfSigned ? 0.33 : 1.0);
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
// Determine strike count (if evidence tracks it)
|
|
659
|
+
const strikes = Math.min(3, evidence.strikes || 0);
|
|
660
|
+
|
|
661
|
+
// Days since last evidence update
|
|
662
|
+
const daysSinceUpdate = Math.min(90, (Date.now() - evidence.lastUpdated) / 86400000);
|
|
663
|
+
|
|
664
|
+
// Build 14-feature input vector (must match training data order)
|
|
665
|
+
const features = new Float32Array([
|
|
666
|
+
tritNorm(sources.doko.verified),
|
|
667
|
+
sources.doko.hash ? 1.0 : 0.0,
|
|
668
|
+
tritNorm(sources.meshQuorum.verified),
|
|
669
|
+
Math.min(1.0, (sources.meshQuorum.quorumSize || 0) / 10),
|
|
670
|
+
sources.meshQuorum.diversity?.sufficient ? 1.0 : 0.0,
|
|
671
|
+
tritNorm(sources.ssl.verified),
|
|
672
|
+
sslType,
|
|
673
|
+
tritNorm(sources.domain.verified),
|
|
674
|
+
Math.min(1.0, age / (365 * 86400000)), // age in days normalized
|
|
675
|
+
Math.min(1.0, evidence.uptime || 0.5),
|
|
676
|
+
Math.min(1.0, (evidence.trustScore || 0) / 100),
|
|
677
|
+
evidence.calculateBeaconConsistency?.(this.config.beaconCheckWindow) || 0,
|
|
678
|
+
strikes / 3,
|
|
679
|
+
daysSinceUpdate / 90,
|
|
680
|
+
]);
|
|
681
|
+
|
|
682
|
+
// NPU path: use ONNX model if available
|
|
683
|
+
const engine = this._inferenceEngine;
|
|
684
|
+
if (engine && engine.hasModel(this._modelName)) {
|
|
685
|
+
try {
|
|
686
|
+
const result = await engine.infer(this._modelName, {
|
|
687
|
+
trust_evidence: features,
|
|
688
|
+
});
|
|
689
|
+
if (result && result.karma_level) {
|
|
690
|
+
const probs = result.karma_level;
|
|
691
|
+
const levels = ['UNTRUSTED', 'SEEKING', 'AWAKENED', 'ENLIGHTENED'];
|
|
692
|
+
const predicted = levels[probs.indexOf(Math.max(...probs))];
|
|
693
|
+
|
|
694
|
+
return {
|
|
695
|
+
source: 'NPU',
|
|
696
|
+
predicted,
|
|
697
|
+
probabilities: {
|
|
698
|
+
UNTRUSTED: probs[0],
|
|
699
|
+
SEEKING: probs[1],
|
|
700
|
+
AWAKENED: probs[2],
|
|
701
|
+
ENLIGHTENED: probs[3],
|
|
702
|
+
},
|
|
703
|
+
features,
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
} catch (err) {
|
|
707
|
+
// Fall through to CPU
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
// CPU fallback: use rule-based assessment
|
|
712
|
+
const ruleResult = this.calculateTrustLevel(evidence);
|
|
713
|
+
const levelNames = ['UNTRUSTED', 'SEEKING', 'AWAKENED', 'ENLIGHTENED'];
|
|
714
|
+
const predicted = levelNames[ruleResult.level] || 'UNTRUSTED';
|
|
715
|
+
|
|
716
|
+
// Build approximate probability distribution from rule-based score
|
|
717
|
+
const probs = [0.05, 0.05, 0.05, 0.05];
|
|
718
|
+
probs[ruleResult.level] = 0.85;
|
|
719
|
+
|
|
720
|
+
return {
|
|
721
|
+
source: 'CPU',
|
|
722
|
+
predicted,
|
|
723
|
+
probabilities: {
|
|
724
|
+
UNTRUSTED: probs[0],
|
|
725
|
+
SEEKING: probs[1],
|
|
726
|
+
AWAKENED: probs[2],
|
|
727
|
+
ENLIGHTENED: probs[3],
|
|
728
|
+
},
|
|
729
|
+
features,
|
|
590
730
|
};
|
|
591
731
|
}
|
|
592
732
|
|
|
@@ -596,8 +736,8 @@ export class KarmaTrustModel extends EventEmitter {
|
|
|
596
736
|
getTrustLevel(nodeId) {
|
|
597
737
|
if (!this.evidence.has(nodeId)) {
|
|
598
738
|
return {
|
|
599
|
-
level:
|
|
600
|
-
levelInfo:
|
|
739
|
+
level: KarmaLevel.UNTRUSTED,
|
|
740
|
+
levelInfo: KarmaLevelInfo[KarmaLevel.UNTRUSTED],
|
|
601
741
|
score: 0,
|
|
602
742
|
reason: 'Unknown node',
|
|
603
743
|
};
|
|
@@ -727,7 +867,7 @@ export class KarmaTrustModel extends EventEmitter {
|
|
|
727
867
|
this.evidence.clear();
|
|
728
868
|
|
|
729
869
|
for (const evidenceData of data.evidence || []) {
|
|
730
|
-
const evidence =
|
|
870
|
+
const evidence = KarmaEvidence.deserialize(evidenceData);
|
|
731
871
|
this.evidence.set(evidence.nodeId, evidence);
|
|
732
872
|
}
|
|
733
873
|
|
|
@@ -740,12 +880,12 @@ export class KarmaTrustModel extends EventEmitter {
|
|
|
740
880
|
* Get statistics
|
|
741
881
|
*/
|
|
742
882
|
getStats() {
|
|
743
|
-
// Recount nodes by level
|
|
883
|
+
// Recount nodes by level (KARMA naming)
|
|
744
884
|
const byLevel = {
|
|
745
|
-
[
|
|
746
|
-
[
|
|
747
|
-
[
|
|
748
|
-
[
|
|
885
|
+
[KarmaLevel.UNTRUSTED]: 0,
|
|
886
|
+
[KarmaLevel.SEEKING]: 0,
|
|
887
|
+
[KarmaLevel.AWAKENED]: 0,
|
|
888
|
+
[KarmaLevel.ENLIGHTENED]: 0,
|
|
749
889
|
};
|
|
750
890
|
|
|
751
891
|
for (const evidence of this.evidence.values()) {
|
|
@@ -769,10 +909,10 @@ export class KarmaTrustModel extends EventEmitter {
|
|
|
769
909
|
promotions: 0,
|
|
770
910
|
demotions: 0,
|
|
771
911
|
nodesByLevel: {
|
|
772
|
-
[
|
|
773
|
-
[
|
|
774
|
-
[
|
|
775
|
-
[
|
|
912
|
+
[KarmaLevel.UNTRUSTED]: 0,
|
|
913
|
+
[KarmaLevel.SEEKING]: 0,
|
|
914
|
+
[KarmaLevel.AWAKENED]: 0,
|
|
915
|
+
[KarmaLevel.ENLIGHTENED]: 0,
|
|
776
916
|
},
|
|
777
917
|
};
|
|
778
918
|
}
|
|
@@ -787,23 +927,23 @@ export class TrustBasedAccessControl {
|
|
|
787
927
|
constructor(trustModel) {
|
|
788
928
|
this.trustModel = trustModel;
|
|
789
929
|
|
|
790
|
-
// Default access requirements
|
|
930
|
+
// Default access requirements (KARMA naming)
|
|
791
931
|
this.accessRequirements = {
|
|
792
932
|
// Content serving/requesting
|
|
793
|
-
'content:request':
|
|
794
|
-
'content:serve':
|
|
933
|
+
'content:request': KarmaLevel.SEEKING,
|
|
934
|
+
'content:serve': KarmaLevel.SEEKING,
|
|
795
935
|
|
|
796
936
|
// Mesh participation
|
|
797
|
-
'mesh:relay':
|
|
798
|
-
'mesh:route':
|
|
937
|
+
'mesh:relay': KarmaLevel.AWAKENED,
|
|
938
|
+
'mesh:route': KarmaLevel.AWAKENED,
|
|
799
939
|
|
|
800
940
|
// Verification participation
|
|
801
|
-
'verify:domain':
|
|
802
|
-
'verify:quorum':
|
|
941
|
+
'verify:domain': KarmaLevel.AWAKENED,
|
|
942
|
+
'verify:quorum': KarmaLevel.AWAKENED,
|
|
803
943
|
|
|
804
944
|
// Admin functions
|
|
805
|
-
'admin:revoke':
|
|
806
|
-
'admin:announce':
|
|
945
|
+
'admin:revoke': KarmaLevel.ENLIGHTENED,
|
|
946
|
+
'admin:announce': KarmaLevel.AWAKENED,
|
|
807
947
|
};
|
|
808
948
|
}
|
|
809
949
|
|