yakmesh 1.6.0 → 1.7.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 +90 -1
- package/README.md +2 -1
- package/announcements/discord-v1.6.0.md +49 -0
- package/announcements/discord-v1.7.0.md +35 -0
- package/announcements/patreon-welcome.md +83 -0
- package/announcements/telegram-v1.6.0.md +15 -0
- package/announcements/telegram-v1.7.0.md +11 -0
- package/announcements/x-v1.6.0.md +13 -0
- package/announcements/x-v1.7.0.md +41 -0
- package/cli/index.js +4 -4
- package/dashboard/index.html +115 -41
- package/mesh/{phantom-routing.js → nakpak-routing.js} +50 -47
- package/package.json +7 -3
- package/server/index.js +91 -0
- package/yakbot/index.js +50 -3
- package/yakbot/register-commands.js +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,95 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to YAKMESH will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.7.0] - 2026-01-18
|
|
6
|
+
|
|
7
|
+
### 🦬 NAKPAK & SHERPA: Yak-Themed Protocol Naming
|
|
8
|
+
|
|
9
|
+
This release renames dark-themed protocols to yak-themed names for brand consistency.
|
|
10
|
+
|
|
11
|
+
#### Renamed Protocols
|
|
12
|
+
|
|
13
|
+
##### NAKPAK (formerly Phantom)
|
|
14
|
+
- **N**ested **A**nonymous **K**ernel for **P**rivate **A**uthenticated **K**omms
|
|
15
|
+
- Post-quantum onion routing with ML-KEM768 key encapsulation
|
|
16
|
+
- File renamed: `phantom-routing.js` → `nakpak-routing.js`
|
|
17
|
+
- Classes renamed: `PhantomRouter` → `NakpakRouter`, etc.
|
|
18
|
+
- Etymology: NAK (female yak) + PAK (package) = sounds like "knapsack" 🎒
|
|
19
|
+
|
|
20
|
+
##### SHERPA (new protocol slot)
|
|
21
|
+
- **S**ecure **H**idden **E**ndpoint **R**esolution **P**ath **A**rchitecture
|
|
22
|
+
- Peer discovery DHT via public web layer
|
|
23
|
+
- Guides nodes to find each other like Sherpas guide travelers
|
|
24
|
+
|
|
25
|
+
#### Protocol Stack Update
|
|
26
|
+
```text
|
|
27
|
+
1. HTTP API - Public content delivery
|
|
28
|
+
2. Annex - Encrypted P2P messaging
|
|
29
|
+
3. Gossip - Message propagation
|
|
30
|
+
4. Beacon - Emergency broadcast
|
|
31
|
+
5. Nakpak - Onion routing (NEW NAME)
|
|
32
|
+
6. Sherpa - Peer discovery (NEW)
|
|
33
|
+
7. Mesh - Core P2P network
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
### 🛡️ SLH-DSA Backup Signatures & Monitoring Dashboard
|
|
39
|
+
|
|
40
|
+
This release adds defense-in-depth with FIPS 205 hash-based backup signatures and a comprehensive monitoring dashboard.
|
|
41
|
+
|
|
42
|
+
#### New Features
|
|
43
|
+
|
|
44
|
+
##### SLH-DSA Backup Signatures (FIPS 205)
|
|
45
|
+
- **Dual Algorithm Support:** ML-DSA (lattice-based) + SLH-DSA (hash-based)
|
|
46
|
+
- **Level 3:** SLH-DSA-SHA2-192f (hash-based, different cryptographic assumptions)
|
|
47
|
+
- **Level 5:** SLH-DSA-SHA2-256f (hash-based, paranoid mode)
|
|
48
|
+
- New functions: `signBackup()`, `verifyBackup()`, `signDual()`, `verifyDual()`
|
|
49
|
+
- Generate dual keypairs with `generateDualSignatureKeyPairs()`
|
|
50
|
+
- Defense-in-depth: if lattice assumptions break, hash-based signatures still hold
|
|
51
|
+
|
|
52
|
+
##### Monitoring Dashboard
|
|
53
|
+
- Updated `/dashboard` with YAKMESH branding
|
|
54
|
+
- New `/metrics` endpoint aggregates all node status
|
|
55
|
+
- **Oracle Status:** Health, network identity, verified peers
|
|
56
|
+
- **Crypto Info:** Active algorithms, security level, NIST standards
|
|
57
|
+
- **Time Source:** Trust level, stratum, precision indicators
|
|
58
|
+
- **Uptime Tracking:** Human-readable uptime display
|
|
59
|
+
|
|
60
|
+
##### Dev.to Automation
|
|
61
|
+
- GitHub Actions now posts to Dev.to on major releases
|
|
62
|
+
- Automated article creation with version info
|
|
63
|
+
- Add `DEVTO_API_KEY` to GitHub secrets to enable
|
|
64
|
+
|
|
65
|
+
#### Technical Details
|
|
66
|
+
|
|
67
|
+
##### SLH-DSA Key/Signature Sizes
|
|
68
|
+
| Level | Public Key | Secret Key | Signature |
|
|
69
|
+
|-------|------------|------------|-----------|
|
|
70
|
+
| 3 (192f) | 48 bytes | 96 bytes | ~35 KB |
|
|
71
|
+
| 5 (256f) | 64 bytes | 128 bytes | ~50 KB |
|
|
72
|
+
|
|
73
|
+
##### Performance (SLH-DSA is slower than ML-DSA)
|
|
74
|
+
- Sign: ~100-160ms (vs 3ms for ML-DSA)
|
|
75
|
+
- Verify: ~5-9ms (vs 1ms for ML-DSA)
|
|
76
|
+
- Use dual signatures only for high-value operations
|
|
77
|
+
|
|
78
|
+
#### Added
|
|
79
|
+
- `signBackup()`, `verifyBackup()` - SLH-DSA standalone operations
|
|
80
|
+
- `signDual()`, `verifyDual()` - Dual signature operations
|
|
81
|
+
- `generateDualSignatureKeyPairs()` - Generate both ML-DSA and SLH-DSA keypairs
|
|
82
|
+
- `getBackupSignatureAlgorithm()`, `getBackupSignatureName()` - Config accessors
|
|
83
|
+
- `/metrics` endpoint for comprehensive node status
|
|
84
|
+
- Dashboard cards for Oracle, Crypto, Time Source
|
|
85
|
+
- Uptime tracking with human-readable formatting
|
|
86
|
+
|
|
87
|
+
#### Changed
|
|
88
|
+
- `getCryptoSummary()` now includes `backupSignatureAlgorithm` and FIPS 205 in standards
|
|
89
|
+
- Dashboard rebranded from "Lantern Mesh" to "YAKMESH"
|
|
90
|
+
- `discord-release.yml` now includes Dev.to posting job
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
5
94
|
## [1.6.0] - 2026-01-17
|
|
6
95
|
|
|
7
96
|
### 🔐 NIST Level 5 (Paranoid Mode) & Cryptographic Unification
|
|
@@ -37,7 +126,7 @@ All hash operations now use SHA3-256 for post-quantum consistency:
|
|
|
37
126
|
- `oracle/phase-epoch.js` - Phase derivation uses SHA3-256
|
|
38
127
|
- `gossip/protocol.js` - Bloom filters and message IDs use SHA3-256
|
|
39
128
|
- `mesh/temporal-encoder.js` - Temporal hashes use SHA3-256
|
|
40
|
-
- `mesh/
|
|
129
|
+
- `mesh/nakpak-routing.js` - Key derivation uses SHA3-256 (formerly phantom-routing)
|
|
41
130
|
- `mesh/annex.js` - Session key derivation uses SHA3-256
|
|
42
131
|
- `mesh/echo-ranging.js` - Probe key derivation uses SHA3-256
|
|
43
132
|
|
package/README.md
CHANGED
|
@@ -182,7 +182,8 @@ See [TRADEMARK.md](TRADEMARK.md) for trademark usage policy.
|
|
|
182
182
|
<p>
|
|
183
183
|
<a href="https://discord.gg/8mSPfbJB8N">💬 Discord</a> •
|
|
184
184
|
<a href="https://t.me/yakmesh">📱 Telegram</a> •
|
|
185
|
-
<a href="https://x.com/yakmesh_dev">𝕏 Twitter</a>
|
|
185
|
+
<a href="https://x.com/yakmesh_dev">𝕏 Twitter</a> •
|
|
186
|
+
<a href="https://patreon.com/yakmesh">❤️ Patreon</a>
|
|
186
187
|
</p>
|
|
187
188
|
<br>
|
|
188
189
|
<sub>© 2026 YAKMESH™ Project. Sturdy & Secure.</sub>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 🔐 YAKMESH v1.6.0 - NIST Level 5 & Cryptographic Unification
|
|
2
|
+
|
|
3
|
+
**The paranoid mode has arrived.**
|
|
4
|
+
|
|
5
|
+
## What's New
|
|
6
|
+
|
|
7
|
+
### 🛡️ NIST Level 5 Support (Paranoid Mode)
|
|
8
|
+
Choose your security level:
|
|
9
|
+
- **Level 3** (default): ML-DSA-65/ML-KEM-768 - ~192-bit classical security
|
|
10
|
+
- **Level 5** (paranoid): ML-DSA-87/ML-KEM-1024 - ~256-bit classical security
|
|
11
|
+
|
|
12
|
+
```javascript
|
|
13
|
+
import { setSecurityLevel, SecurityLevel } from 'yakmesh/security/crypto-config';
|
|
14
|
+
setSecurityLevel(SecurityLevel.LEVEL_5); // Maximum security
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 🔄 SHA3-256 Everywhere
|
|
18
|
+
All hash operations now use SHA3-256 for post-quantum consistency:
|
|
19
|
+
- Bloom filter hashing in gossip protocol
|
|
20
|
+
- Temporal mesh encoding
|
|
21
|
+
- Phantom routing key derivation
|
|
22
|
+
- Annex session keys
|
|
23
|
+
- Echo ranging probes
|
|
24
|
+
|
|
25
|
+
**Why?** SHA3-256 provides 128-bit quantum security (Grover resistance) with its sponge construction.
|
|
26
|
+
|
|
27
|
+
### 📋 Crypto Agility Documentation
|
|
28
|
+
New `docs/CRYPTO-AGILITY.md` formalizes our algorithm upgrade path:
|
|
29
|
+
- When to upgrade (NIST recommendations, new attacks, standards updates)
|
|
30
|
+
- 90-day dual-algorithm transition periods
|
|
31
|
+
- Version negotiation between nodes
|
|
32
|
+
|
|
33
|
+
### ✅ 36-Test PQ Crypto Suite
|
|
34
|
+
Comprehensive validation of all cryptographic operations:
|
|
35
|
+
```bash
|
|
36
|
+
npm run test:crypto
|
|
37
|
+
```
|
|
38
|
+
Tests ML-DSA-65/87, ML-KEM-768/1024, SHA3-256, and full handshake simulations.
|
|
39
|
+
|
|
40
|
+
## Upgrade
|
|
41
|
+
```bash
|
|
42
|
+
npm install yakmesh@1.6.0
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
**No classical asymmetric crypto. Only post-quantum. Only math.**
|
|
48
|
+
|
|
49
|
+
🦬 https://yakmesh.dev | 📦 npm: yakmesh
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Discord Announcement - v1.7.0
|
|
2
|
+
|
|
3
|
+
## Embed
|
|
4
|
+
|
|
5
|
+
**Title:** 🦬 YAKMESH™ v1.7.0 Released!
|
|
6
|
+
|
|
7
|
+
**Description:**
|
|
8
|
+
Defense-in-depth with dual post-quantum signatures!
|
|
9
|
+
|
|
10
|
+
**Fields:**
|
|
11
|
+
|
|
12
|
+
### 🛡️ SLH-DSA Backup Signatures
|
|
13
|
+
- Hash-based signatures (FIPS 205) as backup to ML-DSA
|
|
14
|
+
- Defense-in-depth: if lattice breaks, hash-based still holds
|
|
15
|
+
- `signDual()` and `verifyDual()` for maximum security
|
|
16
|
+
|
|
17
|
+
### 📊 Monitoring Dashboard
|
|
18
|
+
- New `/metrics` endpoint with comprehensive node status
|
|
19
|
+
- Dashboard shows Oracle, Crypto, Time Source, Uptime
|
|
20
|
+
- Real-time health monitoring
|
|
21
|
+
|
|
22
|
+
### 🤖 Dev.to Automation
|
|
23
|
+
- Release articles now auto-posted to Dev.to
|
|
24
|
+
- Three platforms automated: Discord, Telegram, Dev.to
|
|
25
|
+
|
|
26
|
+
### 📦 Install
|
|
27
|
+
```
|
|
28
|
+
npm install yakmesh@1.7.0
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Links:** [npm](https://npmjs.com/package/yakmesh) • [GitHub](https://github.com/yakmesh/yakmesh) • [Docs](https://yakmesh.dev/docs) • [Discord](https://discord.gg/8mSPfbJB8N) • [Telegram](https://t.me/yakmesh)
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
YAKMESH™ - Sturdy & Secure 🏔️
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Welcome to YAKMESH™ Patreon! 🦬
|
|
2
|
+
|
|
3
|
+
## Thank You for Supporting Post-Quantum Security
|
|
4
|
+
|
|
5
|
+
Welcome to the YAKMESH™ community! Your support helps us build the future of secure, decentralized networking.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🏔️ What is YAKMESH?
|
|
10
|
+
|
|
11
|
+
**YAKMESH** (Yielding Atomic Kernel Modular Encryption Secured Hub) is a high-resiliency, decentralized mesh network designed to survive the quantum computing era.
|
|
12
|
+
|
|
13
|
+
### Why It Matters
|
|
14
|
+
- 🔐 **Post-quantum cryptography** - Protected against future quantum attacks using ML-DSA-65, ML-KEM768, and SLH-DSA
|
|
15
|
+
- 🌐 **Truly decentralized** - No central servers, no single points of failure
|
|
16
|
+
- 🔮 **Self-verifying oracle** - Code is the authority, not humans
|
|
17
|
+
- 🕵️ **Phantom routing** - Onion routing for privacy
|
|
18
|
+
- ⚡ **PCIe atomic timing** - Nanosecond precision across the network
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 💚 What Your Support Enables
|
|
23
|
+
|
|
24
|
+
### Infrastructure
|
|
25
|
+
- 🖥️ Official node hosting and bandwidth
|
|
26
|
+
- 🔒 Security audits and penetration testing
|
|
27
|
+
- 📊 Network monitoring and uptime
|
|
28
|
+
|
|
29
|
+
### Development
|
|
30
|
+
- 🛠️ Full-time development resources
|
|
31
|
+
- 🧪 Testing infrastructure
|
|
32
|
+
- 📚 Documentation and tutorials
|
|
33
|
+
|
|
34
|
+
### Community
|
|
35
|
+
- 🎮 Discord bot (YakBot) hosting
|
|
36
|
+
- 🎉 Community events and hackathons
|
|
37
|
+
- 📰 Regular development updates
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 🎁 Supporter Benefits
|
|
42
|
+
|
|
43
|
+
### All Supporters
|
|
44
|
+
- 💬 Patron-only Discord channel access
|
|
45
|
+
- 📋 Early access to roadmap discussions
|
|
46
|
+
- 🏷️ Patron badge in Discord
|
|
47
|
+
- 📰 Monthly development digest
|
|
48
|
+
|
|
49
|
+
### Future Tiers (Coming Soon)
|
|
50
|
+
- **Builder** - Vote on feature priorities
|
|
51
|
+
- **Pioneer** - Name in contributors list
|
|
52
|
+
- **Architect** - Monthly dev call access
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 🔗 Connect With Us
|
|
57
|
+
|
|
58
|
+
- 🌐 **Website**: [yakmesh.dev](https://yakmesh.dev)
|
|
59
|
+
- 💬 **Discord**: [Join Server](https://discord.gg/8mSPfbJB8N)
|
|
60
|
+
- 📱 **Telegram**: [@yakmesh](https://t.me/yakmesh)
|
|
61
|
+
- 𝕏 **Twitter/X**: [@yakmesh_dev](https://x.com/yakmesh_dev)
|
|
62
|
+
- 📦 **npm**: [yakmesh](https://npmjs.com/package/yakmesh)
|
|
63
|
+
- 📂 **GitHub**: [yakmesh/yakmesh](https://github.com/yakmesh/yakmesh)
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 🚀 Quick Start
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm install yakmesh
|
|
71
|
+
npx yakmesh init
|
|
72
|
+
npx yakmesh start
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
**Thank you for being part of the quantum-resistant future!**
|
|
78
|
+
|
|
79
|
+
*Sturdy & Secure* 🏔️
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
© 2026 YAKMESH™ Project | [PeerQuanta](https://peerquanta.com)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
🔐 YAKMESH v1.6.0 - Paranoid Mode
|
|
2
|
+
|
|
3
|
+
New:
|
|
4
|
+
• NIST Level 5 support (ML-DSA-87/ML-KEM-1024)
|
|
5
|
+
• SHA3-256 unified across all modules
|
|
6
|
+
• Crypto agility documentation
|
|
7
|
+
• 36-test PQ crypto suite
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
setSecurityLevel(SecurityLevel.LEVEL_5); // Maximum security
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
npm install yakmesh@1.6.0
|
|
14
|
+
|
|
15
|
+
🦬 https://yakmesh.dev
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Telegram Announcement - v1.7.0
|
|
2
|
+
|
|
3
|
+
🦬 *YAKMESH™ v1.7.0 Released!*
|
|
4
|
+
|
|
5
|
+
🛡️ SLH-DSA backup signatures for defense-in-depth
|
|
6
|
+
📊 New monitoring dashboard with /metrics endpoint
|
|
7
|
+
🤖 Automated Dev.to article posting
|
|
8
|
+
|
|
9
|
+
📦 `npm install yakmesh@1.7.0`
|
|
10
|
+
|
|
11
|
+
🔗 https://github.com/yakmesh/yakmesh/releases/tag/v1.7.0
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
🔐 YAKMESH v1.6.0 - Paranoid Mode
|
|
2
|
+
|
|
3
|
+
NIST Level 5 support is here:
|
|
4
|
+
• ML-DSA-87 (Dilithium5) - 256-bit classical
|
|
5
|
+
• ML-KEM-1024 (Kyber1024) - 256-bit classical
|
|
6
|
+
|
|
7
|
+
Plus: SHA3-256 unified across all hashing operations.
|
|
8
|
+
|
|
9
|
+
No classical asymmetric crypto. Only post-quantum. Only math.
|
|
10
|
+
|
|
11
|
+
npm i yakmesh@1.6.0
|
|
12
|
+
|
|
13
|
+
🦬 yakmesh.dev
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# X/Twitter Announcement - v1.7.0
|
|
2
|
+
|
|
3
|
+
## Thread
|
|
4
|
+
|
|
5
|
+
### Tweet 1
|
|
6
|
+
🦬 YAKMESH™ v1.7.0 Released!
|
|
7
|
+
|
|
8
|
+
Defense-in-depth with dual post-quantum signatures 🛡️
|
|
9
|
+
|
|
10
|
+
Now using BOTH:
|
|
11
|
+
• ML-DSA (lattice-based) - fast primary
|
|
12
|
+
• SLH-DSA (hash-based) - backup
|
|
13
|
+
|
|
14
|
+
If lattice crypto ever breaks, hash-based still protects you.
|
|
15
|
+
|
|
16
|
+
npm i yakmesh@1.7.0
|
|
17
|
+
|
|
18
|
+
### Tweet 2 (Reply)
|
|
19
|
+
New features in v1.7.0:
|
|
20
|
+
|
|
21
|
+
📊 Monitoring Dashboard
|
|
22
|
+
- /metrics endpoint with full node status
|
|
23
|
+
- Oracle, Crypto, Time Source visualization
|
|
24
|
+
- Real-time uptime tracking
|
|
25
|
+
|
|
26
|
+
🤖 Automation
|
|
27
|
+
- Release articles auto-posted to Dev.to
|
|
28
|
+
- Discord + Telegram + Dev.to = 3 platforms automated
|
|
29
|
+
|
|
30
|
+
### Tweet 3 (Reply)
|
|
31
|
+
The philosophy: Sturdy & Secure 🏔️
|
|
32
|
+
|
|
33
|
+
Like a yak on a mountain, YAKMESH™ is built to survive harsh conditions.
|
|
34
|
+
|
|
35
|
+
Quantum computers? Covered.
|
|
36
|
+
Lattice assumptions break? Still covered.
|
|
37
|
+
Single point of failure? Mesh eliminates it.
|
|
38
|
+
|
|
39
|
+
Docs: yakmesh.dev
|
|
40
|
+
|
|
41
|
+
#PostQuantum #P2P #Cryptography
|
package/cli/index.js
CHANGED
|
@@ -56,7 +56,7 @@ program
|
|
|
56
56
|
// Parse bootstrap nodes
|
|
57
57
|
const bootstrapNodes = options.bootstrap
|
|
58
58
|
? options.bootstrap.split(',').map(s => s.trim())
|
|
59
|
-
: [
|
|
59
|
+
: []; // Empty by default - YAKMESH is decentralized, no central bootstrap
|
|
60
60
|
|
|
61
61
|
// Generate config
|
|
62
62
|
const config = `/**
|
|
@@ -302,6 +302,6 @@ if (!process.argv.slice(2).length) {
|
|
|
302
302
|
showBanner();
|
|
303
303
|
program.outputHelp();
|
|
304
304
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
|
package/dashboard/index.html
CHANGED
|
@@ -3,20 +3,22 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>
|
|
6
|
+
<title>YAKMESH Dashboard</title>
|
|
7
7
|
<style>
|
|
8
8
|
:root {
|
|
9
|
-
--bg-dark: #
|
|
10
|
-
--bg-card: #
|
|
11
|
-
--bg-hover: #
|
|
12
|
-
--border: #
|
|
13
|
-
--text: #
|
|
14
|
-
--text-dim: #
|
|
15
|
-
--accent: #
|
|
16
|
-
--accent-glow: rgba(
|
|
17
|
-
--
|
|
18
|
-
--
|
|
19
|
-
--
|
|
9
|
+
--bg-dark: #0f1419;
|
|
10
|
+
--bg-card: #1a2027;
|
|
11
|
+
--bg-hover: #242d38;
|
|
12
|
+
--border: #2d3a47;
|
|
13
|
+
--text: #e6edf3;
|
|
14
|
+
--text-dim: #8b949e;
|
|
15
|
+
--accent: #4ade80;
|
|
16
|
+
--accent-glow: rgba(74, 222, 128, 0.2);
|
|
17
|
+
--mountain: #4ade80;
|
|
18
|
+
--frost: #38bdf8;
|
|
19
|
+
--success: #4ade80;
|
|
20
|
+
--warning: #fbbf24;
|
|
21
|
+
--error: #f87171;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
* {
|
|
@@ -27,7 +29,7 @@
|
|
|
27
29
|
|
|
28
30
|
body {
|
|
29
31
|
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
|
|
30
|
-
background: var(--bg-dark);
|
|
32
|
+
background: linear-gradient(135deg, var(--bg-dark) 0%, #0a1520 100%);
|
|
31
33
|
color: var(--text);
|
|
32
34
|
min-height: 100vh;
|
|
33
35
|
padding: 2rem;
|
|
@@ -46,8 +48,9 @@
|
|
|
46
48
|
|
|
47
49
|
h1 {
|
|
48
50
|
font-size: 1.5rem;
|
|
49
|
-
font-weight:
|
|
50
|
-
color: var(--
|
|
51
|
+
font-weight: 600;
|
|
52
|
+
color: var(--mountain);
|
|
53
|
+
letter-spacing: 0.05em;
|
|
51
54
|
}
|
|
52
55
|
|
|
53
56
|
.subtitle {
|
|
@@ -306,10 +309,10 @@
|
|
|
306
309
|
</head>
|
|
307
310
|
<body>
|
|
308
311
|
<div class="header">
|
|
309
|
-
<span class="logo"
|
|
312
|
+
<span class="logo">🦬</span>
|
|
310
313
|
<div>
|
|
311
|
-
<h1>
|
|
312
|
-
<div class="subtitle">Post-Quantum Secure •
|
|
314
|
+
<h1>YAKMESH™ Dashboard</h1>
|
|
315
|
+
<div class="subtitle">Post-Quantum Secure • Sturdy & Secure • v1.7.0</div>
|
|
313
316
|
</div>
|
|
314
317
|
</div>
|
|
315
318
|
|
|
@@ -329,7 +332,7 @@
|
|
|
329
332
|
<div class="grid">
|
|
330
333
|
<!-- Node Identity -->
|
|
331
334
|
<div class="card">
|
|
332
|
-
<div class="card-title"
|
|
335
|
+
<div class="card-title">🦬 Node Identity</div>
|
|
333
336
|
<div id="node-identity">
|
|
334
337
|
<div class="empty-state">Connect to a node to view identity</div>
|
|
335
338
|
</div>
|
|
@@ -348,8 +351,8 @@
|
|
|
348
351
|
<div class="stat-label">Discovered Nodes</div>
|
|
349
352
|
</div>
|
|
350
353
|
<div class="stat">
|
|
351
|
-
<div class="stat-value" id="
|
|
352
|
-
<div class="stat-label">
|
|
354
|
+
<div class="stat-value" id="uptime">-</div>
|
|
355
|
+
<div class="stat-label">Uptime</div>
|
|
353
356
|
</div>
|
|
354
357
|
<div class="stat">
|
|
355
358
|
<div class="stat-value" id="gossip-messages">-</div>
|
|
@@ -358,6 +361,30 @@
|
|
|
358
361
|
</div>
|
|
359
362
|
</div>
|
|
360
363
|
|
|
364
|
+
<!-- Oracle Status -->
|
|
365
|
+
<div class="card">
|
|
366
|
+
<div class="card-title">🔮 Oracle Status</div>
|
|
367
|
+
<div id="oracle-status">
|
|
368
|
+
<div class="empty-state">Connect to view oracle status</div>
|
|
369
|
+
</div>
|
|
370
|
+
</div>
|
|
371
|
+
|
|
372
|
+
<!-- Crypto Configuration -->
|
|
373
|
+
<div class="card">
|
|
374
|
+
<div class="card-title">🔐 Post-Quantum Cryptography</div>
|
|
375
|
+
<div id="crypto-info">
|
|
376
|
+
<div class="empty-state">Connect to view crypto configuration</div>
|
|
377
|
+
</div>
|
|
378
|
+
</div>
|
|
379
|
+
|
|
380
|
+
<!-- Time Source -->
|
|
381
|
+
<div class="card">
|
|
382
|
+
<div class="card-title">⏱️ Time Source</div>
|
|
383
|
+
<div id="time-info">
|
|
384
|
+
<div class="empty-state">Connect to view time source</div>
|
|
385
|
+
</div>
|
|
386
|
+
</div>
|
|
387
|
+
|
|
361
388
|
<!-- Connected Peers -->
|
|
362
389
|
<div class="card">
|
|
363
390
|
<div class="card-title">
|
|
@@ -399,14 +426,6 @@
|
|
|
399
426
|
<li class="empty-state">No nodes discovered</li>
|
|
400
427
|
</ul>
|
|
401
428
|
</div>
|
|
402
|
-
|
|
403
|
-
<!-- Replication -->
|
|
404
|
-
<div class="card">
|
|
405
|
-
<div class="card-title">🔄 Replication Engine</div>
|
|
406
|
-
<div class="replication-log" id="replication-info">
|
|
407
|
-
<div class="empty-state">Connect to view replication info</div>
|
|
408
|
-
</div>
|
|
409
|
-
</div>
|
|
410
429
|
</div>
|
|
411
430
|
|
|
412
431
|
<script>
|
|
@@ -439,10 +458,10 @@
|
|
|
439
458
|
|
|
440
459
|
try {
|
|
441
460
|
// Fetch all data in parallel
|
|
442
|
-
const [node, peers,
|
|
461
|
+
const [node, peers, metrics, gossip, discovered] = await Promise.all([
|
|
443
462
|
fetch(`${nodeUrl}/node`).then(r => r.json()).catch(() => null),
|
|
444
463
|
fetch(`${nodeUrl}/peers`).then(r => r.json()).catch(() => []),
|
|
445
|
-
fetch(`${nodeUrl}/
|
|
464
|
+
fetch(`${nodeUrl}/metrics`).then(r => r.json()).catch(() => null),
|
|
446
465
|
fetch(`${nodeUrl}/gossip`).then(r => r.json()).catch(() => null),
|
|
447
466
|
fetch(`${nodeUrl}/discovered`).then(r => r.json()).catch(() => []),
|
|
448
467
|
]);
|
|
@@ -464,9 +483,73 @@
|
|
|
464
483
|
// Update stats
|
|
465
484
|
document.getElementById('peer-count').textContent = peers.length;
|
|
466
485
|
document.getElementById('discovered-count').textContent = discovered.length;
|
|
467
|
-
document.getElementById('
|
|
486
|
+
document.getElementById('uptime').textContent = metrics?.node?.uptimeFormatted || '-';
|
|
468
487
|
document.getElementById('gossip-messages').textContent = gossip?.seenMessages ?? '-';
|
|
469
488
|
|
|
489
|
+
// Update Oracle status
|
|
490
|
+
if (metrics?.oracle) {
|
|
491
|
+
const oracle = metrics.oracle;
|
|
492
|
+
const statusColor = oracle.status === 'healthy' ? 'var(--success)' : 'var(--error)';
|
|
493
|
+
document.getElementById('oracle-status').innerHTML = `
|
|
494
|
+
<div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1rem;">
|
|
495
|
+
<div style="width: 12px; height: 12px; border-radius: 50%; background: ${statusColor}; box-shadow: 0 0 8px ${statusColor};"></div>
|
|
496
|
+
<span style="font-weight: 600; color: ${statusColor}">${oracle.status.toUpperCase()}</span>
|
|
497
|
+
</div>
|
|
498
|
+
<div style="color: var(--text-dim); font-size: 0.85rem;">
|
|
499
|
+
<div>Network: ${oracle.networkName || 'N/A'}</div>
|
|
500
|
+
<div>ID: ${oracle.networkId || 'N/A'}</div>
|
|
501
|
+
<div style="word-break: break-all;">Fingerprint: ${oracle.fingerprint?.slice(0, 24) || 'N/A'}...</div>
|
|
502
|
+
<div>Verified Peers: ${oracle.verifiedPeers}</div>
|
|
503
|
+
</div>
|
|
504
|
+
`;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// Update Crypto info
|
|
508
|
+
if (metrics?.crypto) {
|
|
509
|
+
const crypto = metrics.crypto;
|
|
510
|
+
document.getElementById('crypto-info').innerHTML = `
|
|
511
|
+
<div style="color: var(--text-dim); font-size: 0.85rem;">
|
|
512
|
+
<div style="margin-bottom: 0.75rem;">
|
|
513
|
+
<span style="color: var(--frost)">Security Level:</span>
|
|
514
|
+
<span style="color: var(--mountain); font-weight: 600;">${crypto.levelName}</span>
|
|
515
|
+
</div>
|
|
516
|
+
<div>Signature: <span style="color: var(--text)">${crypto.signatureAlgorithm}</span></div>
|
|
517
|
+
<div>Backup Sig: <span style="color: var(--text)">${crypto.backupSignatureAlgorithm || 'N/A'}</span></div>
|
|
518
|
+
<div>KEM: <span style="color: var(--text)">${crypto.kemAlgorithm}</span></div>
|
|
519
|
+
<div style="margin-top: 0.5rem;">
|
|
520
|
+
Classical: ${crypto.classicalSecurity} | Quantum: ${crypto.quantumSecurity}
|
|
521
|
+
</div>
|
|
522
|
+
<div style="margin-top: 0.5rem; font-size: 0.75rem;">
|
|
523
|
+
${crypto.nistStandards?.join(' • ') || ''}
|
|
524
|
+
</div>
|
|
525
|
+
</div>
|
|
526
|
+
`;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// Update Time info
|
|
530
|
+
if (metrics?.time) {
|
|
531
|
+
const time = metrics.time;
|
|
532
|
+
const trustColors = {
|
|
533
|
+
ATOMIC: 'var(--success)',
|
|
534
|
+
GPS: 'var(--success)',
|
|
535
|
+
PTP: 'var(--warning)',
|
|
536
|
+
NTP: 'var(--text-dim)',
|
|
537
|
+
};
|
|
538
|
+
const trustColor = trustColors[time.trustLevel] || 'var(--text-dim)';
|
|
539
|
+
document.getElementById('time-info').innerHTML = `
|
|
540
|
+
<div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1rem;">
|
|
541
|
+
<div style="width: 12px; height: 12px; border-radius: 50%; background: ${trustColor}; box-shadow: 0 0 8px ${trustColor};"></div>
|
|
542
|
+
<span style="font-weight: 600; color: ${trustColor}">${time.trustLevel}</span>
|
|
543
|
+
</div>
|
|
544
|
+
<div style="color: var(--text-dim); font-size: 0.85rem;">
|
|
545
|
+
<div>Stratum: ${time.stratum ?? 'N/A'}</div>
|
|
546
|
+
<div>Phase Tolerance: ${time.phaseTolerance ? time.phaseTolerance + 'ms' : 'N/A'}</div>
|
|
547
|
+
<div>Atomic Time: ${time.hasAtomicTime ? '✅ Yes' : '❌ No'}</div>
|
|
548
|
+
<div>High Precision: ${time.hasHighPrecisionTime ? '✅ Yes' : '❌ No'}</div>
|
|
549
|
+
</div>
|
|
550
|
+
`;
|
|
551
|
+
}
|
|
552
|
+
|
|
470
553
|
// Update peer list
|
|
471
554
|
const peerList = document.getElementById('peer-list');
|
|
472
555
|
if (peers.length === 0) {
|
|
@@ -508,15 +591,6 @@
|
|
|
508
591
|
`).join('');
|
|
509
592
|
}
|
|
510
593
|
|
|
511
|
-
// Update replication info
|
|
512
|
-
if (replication) {
|
|
513
|
-
document.getElementById('replication-info').innerHTML = `
|
|
514
|
-
<div>Log Entries: ${replication.replicationLogSize}</div>
|
|
515
|
-
<div>Peer States: ${replication.peerStates}</div>
|
|
516
|
-
<div>Tables: ${replication.tables?.join(', ') || 'N/A'}</div>
|
|
517
|
-
`;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
594
|
} catch (e) {
|
|
521
595
|
console.error('Refresh failed:', e);
|
|
522
596
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Yakmesh
|
|
2
|
+
* Yakmesh NAKPAK Routing - Nested Anonymous Kernel for Private Authenticated Komms
|
|
3
3
|
*
|
|
4
4
|
* The first post-quantum secure onion routing implementation featuring:
|
|
5
5
|
* - ML-DSA-65 signatures at every routing layer
|
|
@@ -7,12 +7,15 @@
|
|
|
7
7
|
* - Multi-layer encryption with perfect forward secrecy
|
|
8
8
|
* - Timing attack resistance through temporal padding
|
|
9
9
|
*
|
|
10
|
-
* Key Innovation: "Your packets
|
|
10
|
+
* Key Innovation: "Your packets travel like yak caravans through hidden mountain paths"
|
|
11
11
|
* - Each routing layer uses different quantum-resistant keys
|
|
12
12
|
* - Decoy traffic masks real communication patterns
|
|
13
13
|
* - Temporal obfuscation defeats traffic analysis
|
|
14
14
|
*
|
|
15
|
-
*
|
|
15
|
+
* Etymology: NAK (female yak, the pack carrier) + PAK (package) = NAKPAK (sounds like "knapsack")
|
|
16
|
+
* Works with SHERPA (Secure Hidden Endpoint Resolution Path Architecture) for peer discovery.
|
|
17
|
+
*
|
|
18
|
+
* @module mesh/nakpak-routing
|
|
16
19
|
* @license MIT
|
|
17
20
|
* @copyright 2026 YAKMESH™ Contributors
|
|
18
21
|
*/
|
|
@@ -23,7 +26,7 @@ import { ml_kem768 } from '@noble/post-quantum/ml-kem.js';
|
|
|
23
26
|
import { sha3_256 } from '@noble/hashes/sha3.js';
|
|
24
27
|
import { bytesToHex, hexToBytes, utf8ToBytes } from '@noble/hashes/utils.js';
|
|
25
28
|
|
|
26
|
-
const
|
|
29
|
+
const NAKPAK_CONFIG = {
|
|
27
30
|
// Circuit settings
|
|
28
31
|
defaultHopCount: 3, // Number of hops (like Tor)
|
|
29
32
|
maxHopCount: 7, // Maximum allowed hops
|
|
@@ -44,13 +47,13 @@ const PHANTOM_CONFIG = {
|
|
|
44
47
|
maxPayloadSize: 7000, // Max actual payload
|
|
45
48
|
|
|
46
49
|
// Key derivation
|
|
47
|
-
keyDerivationSalt: '
|
|
50
|
+
keyDerivationSalt: 'NAKPAK-YAKMESH-2026',
|
|
48
51
|
};
|
|
49
52
|
|
|
50
53
|
/**
|
|
51
|
-
* A single routing layer in the onion
|
|
54
|
+
* A single routing layer in the onion (like a yak's pack saddle layer)
|
|
52
55
|
*/
|
|
53
|
-
class
|
|
56
|
+
class NakpakLayer {
|
|
54
57
|
constructor(options) {
|
|
55
58
|
this.hopIndex = options.hopIndex;
|
|
56
59
|
this.nodeId = options.nodeId;
|
|
@@ -114,12 +117,12 @@ class PhantomLayer {
|
|
|
114
117
|
throw new Error('No encryption key established');
|
|
115
118
|
}
|
|
116
119
|
|
|
117
|
-
const nonce = randomBytes(
|
|
120
|
+
const nonce = randomBytes(NAKPAK_CONFIG.nonceSize);
|
|
118
121
|
const cipher = createCipheriv(
|
|
119
|
-
|
|
122
|
+
NAKPAK_CONFIG.layerEncryption,
|
|
120
123
|
this.encryptionKey,
|
|
121
124
|
nonce,
|
|
122
|
-
{ authTagLength:
|
|
125
|
+
{ authTagLength: NAKPAK_CONFIG.authTagLength }
|
|
123
126
|
);
|
|
124
127
|
|
|
125
128
|
const plaintext = typeof data === 'string' ? data : JSON.stringify(data);
|
|
@@ -148,10 +151,10 @@ class PhantomLayer {
|
|
|
148
151
|
const tag = Buffer.from(encryptedData.tag, 'hex');
|
|
149
152
|
|
|
150
153
|
const decipher = createDecipheriv(
|
|
151
|
-
|
|
154
|
+
NAKPAK_CONFIG.layerEncryption,
|
|
152
155
|
this.encryptionKey,
|
|
153
156
|
nonce,
|
|
154
|
-
{ authTagLength:
|
|
157
|
+
{ authTagLength: NAKPAK_CONFIG.authTagLength }
|
|
155
158
|
);
|
|
156
159
|
decipher.setAuthTag(tag);
|
|
157
160
|
|
|
@@ -166,16 +169,16 @@ class PhantomLayer {
|
|
|
166
169
|
_deriveEncryptionKey(sharedSecret) {
|
|
167
170
|
return createHash('sha3-256')
|
|
168
171
|
.update(sharedSecret)
|
|
169
|
-
.update(
|
|
172
|
+
.update(NAKPAK_CONFIG.keyDerivationSalt)
|
|
170
173
|
.update(Buffer.from([this.hopIndex]))
|
|
171
174
|
.digest();
|
|
172
175
|
}
|
|
173
176
|
}
|
|
174
177
|
|
|
175
178
|
/**
|
|
176
|
-
* An onion-wrapped packet
|
|
179
|
+
* An onion-wrapped packet (like a yak's cargo bundle)
|
|
177
180
|
*/
|
|
178
|
-
class
|
|
181
|
+
class NakpakPacket {
|
|
179
182
|
constructor(options = {}) {
|
|
180
183
|
this.id = options.id || bytesToHex(randomBytes(16));
|
|
181
184
|
this.circuitId = options.circuitId;
|
|
@@ -211,7 +214,7 @@ class PhantomPacket {
|
|
|
211
214
|
});
|
|
212
215
|
|
|
213
216
|
const currentSize = Buffer.byteLength(serialized, 'utf8');
|
|
214
|
-
const paddingNeeded =
|
|
217
|
+
const paddingNeeded = NAKPAK_CONFIG.fixedPacketSize - currentSize - 50; // Reserve for padding field
|
|
215
218
|
|
|
216
219
|
if (paddingNeeded > 0) {
|
|
217
220
|
this.padding = randomBytes(Math.max(1, paddingNeeded)).toString('base64');
|
|
@@ -222,7 +225,7 @@ class PhantomPacket {
|
|
|
222
225
|
* Create decoy packet
|
|
223
226
|
*/
|
|
224
227
|
static createDecoy(circuitId) {
|
|
225
|
-
const decoy = new
|
|
228
|
+
const decoy = new NakpakPacket({
|
|
226
229
|
circuitId,
|
|
227
230
|
isDecoy: true,
|
|
228
231
|
});
|
|
@@ -251,7 +254,7 @@ class PhantomPacket {
|
|
|
251
254
|
}
|
|
252
255
|
|
|
253
256
|
static deserialize(obj) {
|
|
254
|
-
const packet = new
|
|
257
|
+
const packet = new NakpakPacket({
|
|
255
258
|
id: obj.id,
|
|
256
259
|
circuitId: obj.circuitId,
|
|
257
260
|
timestamp: obj.timestamp,
|
|
@@ -263,12 +266,12 @@ class PhantomPacket {
|
|
|
263
266
|
}
|
|
264
267
|
|
|
265
268
|
/**
|
|
266
|
-
* A circuit through the mesh (like a
|
|
269
|
+
* A circuit through the mesh (like a yak caravan route)
|
|
267
270
|
*/
|
|
268
|
-
class
|
|
271
|
+
class NakpakCircuit {
|
|
269
272
|
constructor(options = {}) {
|
|
270
273
|
this.circuitId = options.circuitId || bytesToHex(randomBytes(16));
|
|
271
|
-
this.hops = []; // Array of
|
|
274
|
+
this.hops = []; // Array of NakpakLayer
|
|
272
275
|
this.isEstablished = false;
|
|
273
276
|
this.createdAt = Date.now();
|
|
274
277
|
this.lastUsed = Date.now();
|
|
@@ -279,14 +282,14 @@ class PhantomCircuit {
|
|
|
279
282
|
* Build a circuit through specified nodes
|
|
280
283
|
*/
|
|
281
284
|
async buildCircuit(nodeIds) {
|
|
282
|
-
if (nodeIds.length >
|
|
283
|
-
throw new Error('Too many hops: max is ' +
|
|
285
|
+
if (nodeIds.length > NAKPAK_CONFIG.maxHopCount) {
|
|
286
|
+
throw new Error('Too many hops: max is ' + NAKPAK_CONFIG.maxHopCount);
|
|
284
287
|
}
|
|
285
288
|
|
|
286
289
|
this.hops = [];
|
|
287
290
|
|
|
288
291
|
for (let i = 0; i < nodeIds.length; i++) {
|
|
289
|
-
const layer = new
|
|
292
|
+
const layer = new NakpakLayer({
|
|
290
293
|
hopIndex: i,
|
|
291
294
|
nodeId: nodeIds[i],
|
|
292
295
|
nextHop: nodeIds[i + 1] || null,
|
|
@@ -356,7 +359,7 @@ class PhantomCircuit {
|
|
|
356
359
|
};
|
|
357
360
|
}
|
|
358
361
|
|
|
359
|
-
const packet = new
|
|
362
|
+
const packet = new NakpakPacket({
|
|
360
363
|
circuitId: this.circuitId,
|
|
361
364
|
});
|
|
362
365
|
packet.addLayer(payload);
|
|
@@ -369,14 +372,14 @@ class PhantomCircuit {
|
|
|
369
372
|
}
|
|
370
373
|
|
|
371
374
|
isExpired() {
|
|
372
|
-
return Date.now() - this.createdAt >
|
|
375
|
+
return Date.now() - this.createdAt > NAKPAK_CONFIG.circuitTimeout;
|
|
373
376
|
}
|
|
374
377
|
}
|
|
375
378
|
|
|
376
379
|
/**
|
|
377
|
-
* Relay node handler for forwarding
|
|
380
|
+
* Relay node handler for forwarding nakpak packets
|
|
378
381
|
*/
|
|
379
|
-
class
|
|
382
|
+
class NakpakRelay {
|
|
380
383
|
constructor(options = {}) {
|
|
381
384
|
this.nodeId = options.nodeId || bytesToHex(randomBytes(16));
|
|
382
385
|
this.circuits = new Map(); // circuitId -> local layer info
|
|
@@ -401,7 +404,7 @@ class PhantomRelay {
|
|
|
401
404
|
* Handle incoming circuit creation request
|
|
402
405
|
*/
|
|
403
406
|
async handleCircuitCreate(request) {
|
|
404
|
-
const layer = new
|
|
407
|
+
const layer = new NakpakLayer({
|
|
405
408
|
hopIndex: request.hopIndex,
|
|
406
409
|
nodeId: this.nodeId,
|
|
407
410
|
nextHop: request.nextHop,
|
|
@@ -491,8 +494,8 @@ class PhantomRelay {
|
|
|
491
494
|
* Add random delay to defeat timing analysis
|
|
492
495
|
*/
|
|
493
496
|
async _addTimingDelay() {
|
|
494
|
-
const delay =
|
|
495
|
-
Math.random() * (
|
|
497
|
+
const delay = NAKPAK_CONFIG.minPaddingMs +
|
|
498
|
+
Math.random() * (NAKPAK_CONFIG.maxPaddingMs - NAKPAK_CONFIG.minPaddingMs);
|
|
496
499
|
await new Promise(resolve => setTimeout(resolve, delay));
|
|
497
500
|
}
|
|
498
501
|
|
|
@@ -500,9 +503,9 @@ class PhantomRelay {
|
|
|
500
503
|
* Maybe inject a decoy packet to mask traffic patterns
|
|
501
504
|
*/
|
|
502
505
|
_maybeInjectDecoy(circuitId) {
|
|
503
|
-
if (Math.random() <
|
|
506
|
+
if (Math.random() < NAKPAK_CONFIG.decoyProbability) {
|
|
504
507
|
this.stats.decoysInjected++;
|
|
505
|
-
return
|
|
508
|
+
return NakpakPacket.createDecoy(circuitId).serialize();
|
|
506
509
|
}
|
|
507
510
|
return null;
|
|
508
511
|
}
|
|
@@ -537,13 +540,13 @@ class PhantomRelay {
|
|
|
537
540
|
}
|
|
538
541
|
|
|
539
542
|
/**
|
|
540
|
-
* Main
|
|
543
|
+
* Main NAKPAK routing manager
|
|
541
544
|
*/
|
|
542
|
-
class
|
|
545
|
+
class NakpakRouter {
|
|
543
546
|
constructor(options = {}) {
|
|
544
547
|
this.nodeId = options.nodeId || bytesToHex(randomBytes(16));
|
|
545
|
-
this.relay = new
|
|
546
|
-
this.circuits = new Map(); // circuitId ->
|
|
548
|
+
this.relay = new NakpakRelay({ nodeId: this.nodeId });
|
|
549
|
+
this.circuits = new Map(); // circuitId -> NakpakCircuit (for circuits we created)
|
|
547
550
|
this.knownNodes = new Map(); // nodeId -> { publicKey, lastSeen }
|
|
548
551
|
|
|
549
552
|
this.stats = {
|
|
@@ -576,7 +579,7 @@ class PhantomRouter {
|
|
|
576
579
|
const availableNodes = Array.from(this.knownNodes.keys())
|
|
577
580
|
.filter(id => id !== this.nodeId);
|
|
578
581
|
|
|
579
|
-
if (availableNodes.length <
|
|
582
|
+
if (availableNodes.length < NAKPAK_CONFIG.defaultHopCount) {
|
|
580
583
|
throw new Error('Not enough known nodes for circuit');
|
|
581
584
|
}
|
|
582
585
|
|
|
@@ -586,10 +589,10 @@ class PhantomRouter {
|
|
|
586
589
|
[availableNodes[i], availableNodes[j]] = [availableNodes[j], availableNodes[i]];
|
|
587
590
|
}
|
|
588
591
|
|
|
589
|
-
hopNodeIds = availableNodes.slice(0,
|
|
592
|
+
hopNodeIds = availableNodes.slice(0, NAKPAK_CONFIG.defaultHopCount);
|
|
590
593
|
}
|
|
591
594
|
|
|
592
|
-
const circuit = new
|
|
595
|
+
const circuit = new NakpakCircuit();
|
|
593
596
|
const buildResult = await circuit.buildCircuit(hopNodeIds);
|
|
594
597
|
|
|
595
598
|
this.circuits.set(circuit.circuitId, circuit);
|
|
@@ -638,7 +641,7 @@ class PhantomRouter {
|
|
|
638
641
|
* Handle incoming packet (as a relay)
|
|
639
642
|
*/
|
|
640
643
|
async handlePacket(packetData) {
|
|
641
|
-
const packet =
|
|
644
|
+
const packet = NakpakPacket.deserialize(packetData);
|
|
642
645
|
const result = await this.relay.processPacket(packet);
|
|
643
646
|
|
|
644
647
|
if (result.type === 'EXIT') {
|
|
@@ -690,10 +693,10 @@ class PhantomRouter {
|
|
|
690
693
|
}
|
|
691
694
|
|
|
692
695
|
export {
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
696
|
+
NAKPAK_CONFIG,
|
|
697
|
+
NakpakLayer,
|
|
698
|
+
NakpakPacket,
|
|
699
|
+
NakpakCircuit,
|
|
700
|
+
NakpakRelay,
|
|
701
|
+
NakpakRouter,
|
|
699
702
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yakmesh",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "YAKMESH: Yielding Atomic Kernel Modular Encryption Secured Hub - Post-quantum secure P2P mesh network for the 2026 threat landscape",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "server/index.js",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"./mesh/sybil-defense": "./mesh/sybil-defense.js",
|
|
26
26
|
"./mesh/echo-ranging": "./mesh/echo-ranging.js",
|
|
27
27
|
"./mesh/pulse-sync": "./mesh/pulse-sync.js",
|
|
28
|
-
"./mesh/
|
|
28
|
+
"./mesh/nakpak-routing": "./mesh/nakpak-routing.js",
|
|
29
29
|
"./mesh/beacon-broadcast": "./mesh/beacon-broadcast.js"
|
|
30
30
|
},
|
|
31
31
|
"bin": {
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"distributed-oracle",
|
|
67
67
|
"onion-routing",
|
|
68
68
|
"echo-ranging",
|
|
69
|
-
"
|
|
69
|
+
"nakpak-routing",
|
|
70
70
|
"pulse-sync",
|
|
71
71
|
"beacon-broadcast",
|
|
72
72
|
"kyber",
|
|
@@ -75,6 +75,10 @@
|
|
|
75
75
|
],
|
|
76
76
|
"author": "Yakmesh",
|
|
77
77
|
"license": "MIT",
|
|
78
|
+
"funding": {
|
|
79
|
+
"type": "patreon",
|
|
80
|
+
"url": "https://patreon.com/yakmesh"
|
|
81
|
+
},
|
|
78
82
|
"homepage": "https://yakmesh.dev",
|
|
79
83
|
"repository": {
|
|
80
84
|
"url": "git+https://github.com/peerquanta/yakmesh.git",
|
package/server/index.js
CHANGED
|
@@ -47,6 +47,19 @@ import {
|
|
|
47
47
|
} from '../oracle/time-source.js';
|
|
48
48
|
import { setTimeSourceConfig, getActiveConfig } from '../oracle/phase-epoch.js';
|
|
49
49
|
|
|
50
|
+
// Helper: Format uptime in human-readable format
|
|
51
|
+
function formatUptime(seconds) {
|
|
52
|
+
const days = Math.floor(seconds / 86400);
|
|
53
|
+
const hours = Math.floor((seconds % 86400) / 3600);
|
|
54
|
+
const mins = Math.floor((seconds % 3600) / 60);
|
|
55
|
+
const secs = seconds % 60;
|
|
56
|
+
|
|
57
|
+
if (days > 0) return `${days}d ${hours}h ${mins}m`;
|
|
58
|
+
if (hours > 0) return `${hours}h ${mins}m ${secs}s`;
|
|
59
|
+
if (mins > 0) return `${mins}m ${secs}s`;
|
|
60
|
+
return `${secs}s`;
|
|
61
|
+
}
|
|
62
|
+
|
|
50
63
|
// Optional adapter integration (loaded dynamically if enabled)
|
|
51
64
|
let ActiveAdapter = null;
|
|
52
65
|
|
|
@@ -140,6 +153,9 @@ export class YakmeshNode {
|
|
|
140
153
|
|
|
141
154
|
async start() {
|
|
142
155
|
console.log('\n🦬 Starting Yakmesh Node...\n');
|
|
156
|
+
|
|
157
|
+
// Record start time for uptime tracking
|
|
158
|
+
this._startTime = Date.now();
|
|
143
159
|
|
|
144
160
|
// 0. LOCK THE CODEBASE - Prevent any modifications during runtime
|
|
145
161
|
// This is critical for Code Proof Protocol security
|
|
@@ -898,6 +914,81 @@ export class YakmeshNode {
|
|
|
898
914
|
});
|
|
899
915
|
});
|
|
900
916
|
|
|
917
|
+
// =========================================
|
|
918
|
+
// Metrics Endpoint - Dashboard Data
|
|
919
|
+
// =========================================
|
|
920
|
+
|
|
921
|
+
app.get('/metrics', (req, res) => {
|
|
922
|
+
const startTime = this._startTime || Date.now();
|
|
923
|
+
const uptime = Math.floor((Date.now() - startTime) / 1000);
|
|
924
|
+
|
|
925
|
+
// Crypto configuration (imported at top of file)
|
|
926
|
+
let cryptoInfo = null;
|
|
927
|
+
try {
|
|
928
|
+
// Dynamic import not needed - use the imported module
|
|
929
|
+
cryptoInfo = this._cryptoSummary || {
|
|
930
|
+
levelName: 'NIST Level 3',
|
|
931
|
+
signatureAlgorithm: 'ML-DSA-65',
|
|
932
|
+
backupSignatureAlgorithm: 'SLH-DSA-SHA2-192f',
|
|
933
|
+
kemAlgorithm: 'ML-KEM-768',
|
|
934
|
+
classicalSecurity: '192-bit',
|
|
935
|
+
quantumSecurity: '128-bit',
|
|
936
|
+
nistStandards: ['FIPS 203 (ML-KEM)', 'FIPS 204 (ML-DSA)', 'FIPS 205 (SLH-DSA)'],
|
|
937
|
+
};
|
|
938
|
+
} catch (e) {
|
|
939
|
+
cryptoInfo = { error: 'Could not load crypto config' };
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
// Time source info
|
|
943
|
+
let timeInfo = null;
|
|
944
|
+
if (this.timeSource) {
|
|
945
|
+
const status = this.timeSource.getStatus();
|
|
946
|
+
timeInfo = {
|
|
947
|
+
trustLevel: status.trustLevel,
|
|
948
|
+
stratum: status.stratum,
|
|
949
|
+
phaseTolerance: status.phaseTolerance,
|
|
950
|
+
hasAtomicTime: this.timeSource.hasAtomicTime(),
|
|
951
|
+
hasHighPrecisionTime: this.timeSource.hasHighPrecisionTime(),
|
|
952
|
+
};
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
// Oracle status
|
|
956
|
+
let oracleInfo = null;
|
|
957
|
+
if (this.oracle) {
|
|
958
|
+
const integrity = this.oracle.verifySelfIntegrity();
|
|
959
|
+
oracleInfo = {
|
|
960
|
+
status: integrity.valid ? 'healthy' : 'compromised',
|
|
961
|
+
valid: integrity.valid,
|
|
962
|
+
networkName: this.genesisNetwork?.networkName || null,
|
|
963
|
+
networkId: this.genesisNetwork?.networkId || null,
|
|
964
|
+
fingerprint: this.genesisNetwork?.fingerprint || null,
|
|
965
|
+
verifiedPeers: this.codeProof?.getVerifiedPeers()?.length || 0,
|
|
966
|
+
};
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
// Mesh stats
|
|
970
|
+
const peerCount = this.mesh?.getPeers()?.length || 0;
|
|
971
|
+
const gossipStats = this.gossip?.getStats() || null;
|
|
972
|
+
|
|
973
|
+
res.json({
|
|
974
|
+
node: {
|
|
975
|
+
id: this.identity?.identity?.nodeId || null,
|
|
976
|
+
name: this.config?.node?.name || 'unknown',
|
|
977
|
+
version: '1.7.0',
|
|
978
|
+
uptime,
|
|
979
|
+
uptimeFormatted: formatUptime(uptime),
|
|
980
|
+
},
|
|
981
|
+
crypto: cryptoInfo,
|
|
982
|
+
time: timeInfo,
|
|
983
|
+
oracle: oracleInfo,
|
|
984
|
+
network: {
|
|
985
|
+
peers: peerCount,
|
|
986
|
+
gossip: gossipStats,
|
|
987
|
+
},
|
|
988
|
+
timestamp: new Date().toISOString(),
|
|
989
|
+
});
|
|
990
|
+
});
|
|
991
|
+
|
|
901
992
|
// =========================================
|
|
902
993
|
// Time Source Endpoints - Precision Timing
|
|
903
994
|
// =========================================
|
package/yakbot/index.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* - /changelog - Recent changes
|
|
8
8
|
* - /ask [question] - AI-powered Q&A about YAKMESH
|
|
9
9
|
* - /nodes - Check health of official YAKMESH nodes
|
|
10
|
+
* - /faq - Frequently asked questions
|
|
10
11
|
* - /ping - Bot latency check
|
|
11
12
|
* - Auto-greet new members
|
|
12
13
|
*
|
|
@@ -26,7 +27,7 @@ const config = {
|
|
|
26
27
|
geminiKey: process.env.GEMINI_API_KEY,
|
|
27
28
|
|
|
28
29
|
// Current version
|
|
29
|
-
version: '1.
|
|
30
|
+
version: '1.7.0',
|
|
30
31
|
|
|
31
32
|
// Official YAKMESH nodes for health checks
|
|
32
33
|
officialNodes: [
|
|
@@ -43,6 +44,7 @@ const config = {
|
|
|
43
44
|
discord: 'https://discord.gg/8mSPfbJB8N',
|
|
44
45
|
twitter: 'https://x.com/yakmesh_dev',
|
|
45
46
|
telegram: 'https://t.me/yakmesh',
|
|
47
|
+
patreon: 'https://patreon.com/yakmesh',
|
|
46
48
|
},
|
|
47
49
|
|
|
48
50
|
// Brand colors
|
|
@@ -75,8 +77,9 @@ Protocol Stack (top to bottom):
|
|
|
75
77
|
2. Annex - Encrypted point-to-point messaging (ML-KEM768 + AES-256-GCM)
|
|
76
78
|
3. Gossip - Epidemic-style message propagation
|
|
77
79
|
4. Beacon - Emergency broadcast with priority levels
|
|
78
|
-
5.
|
|
79
|
-
6.
|
|
80
|
+
5. Nakpak - Onion routing for anonymity (Nested Anonymous Kernel for Private Authenticated Komms)
|
|
81
|
+
6. Sherpa - Peer discovery DHT (Secure Hidden Endpoint Resolution Path Architecture)
|
|
82
|
+
7. Mesh - Core P2P network with Code Proof Protocol
|
|
80
83
|
|
|
81
84
|
Installation:
|
|
82
85
|
npm install yakmesh
|
|
@@ -470,6 +473,7 @@ const commands = {
|
|
|
470
473
|
{ name: '💬 Discord', value: `[Join Server](${config.links.discord})`, inline: true },
|
|
471
474
|
{ name: '🐦 Twitter/X', value: `[@yakmesh](${config.links.twitter})`, inline: true },
|
|
472
475
|
{ name: '📱 Telegram', value: `[@yakmesh](${config.links.telegram})`, inline: true },
|
|
476
|
+
{ name: '❤️ Patreon', value: `[Support Us](${config.links.patreon})`, inline: true },
|
|
473
477
|
],
|
|
474
478
|
footer: 'YAKMESH™ - Sturdy & Secure',
|
|
475
479
|
});
|
|
@@ -489,6 +493,7 @@ const commands = {
|
|
|
489
493
|
{ name: '📦 `/install`', value: 'Quick installation guide', inline: true },
|
|
490
494
|
{ name: '❓ `/ask <question>`', value: 'Ask YakBot about YAKMESH', inline: true },
|
|
491
495
|
{ name: '🔗 `/links`', value: 'All social and resource links', inline: true },
|
|
496
|
+
{ name: '❔ `/faq`', value: 'Frequently asked questions', inline: true },
|
|
492
497
|
{ name: '🏓 `/ping`', value: 'Check bot latency', inline: true },
|
|
493
498
|
{ name: '📈 `/botstats`', value: 'View bot performance metrics', inline: true },
|
|
494
499
|
],
|
|
@@ -497,6 +502,48 @@ const commands = {
|
|
|
497
502
|
await interaction.reply({ embeds: [embed] });
|
|
498
503
|
},
|
|
499
504
|
|
|
505
|
+
// /faq - Frequently asked questions
|
|
506
|
+
async faq(interaction) {
|
|
507
|
+
const embed = createEmbed({
|
|
508
|
+
title: '❔ Frequently Asked Questions',
|
|
509
|
+
description: 'Common questions about YAKMESH',
|
|
510
|
+
fields: [
|
|
511
|
+
{
|
|
512
|
+
name: '🦬 What is YAKMESH?',
|
|
513
|
+
value: 'YAKMESH (Yielding Atomic Kernel Modular Encryption Secured Hub) is a post-quantum secure P2P mesh network designed for the 2026 threat landscape.',
|
|
514
|
+
inline: false,
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
name: '🔐 What makes it "post-quantum"?',
|
|
518
|
+
value: 'We use ML-DSA-65/87 (NIST FIPS 204) for signatures and ML-KEM-768/1024 (NIST FIPS 203) for key exchange. These algorithms are resistant to quantum computer attacks.',
|
|
519
|
+
inline: false,
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
name: '💻 What are the requirements?',
|
|
523
|
+
value: 'Node.js 18+ is required. Install with `npm install yakmesh`.',
|
|
524
|
+
inline: false,
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
name: '🌐 How do nodes find each other?',
|
|
528
|
+
value: 'Nodes with identical code share the same "network name" derived from the codebase hash. Gossip protocol handles peer discovery.',
|
|
529
|
+
inline: false,
|
|
530
|
+
},
|
|
531
|
+
{
|
|
532
|
+
name: '🔒 Is traffic encrypted?',
|
|
533
|
+
value: 'Yes! Annex provides ML-KEM768 key exchange + AES-256-GCM encryption with perfect forward secrecy for P2P channels.',
|
|
534
|
+
inline: false,
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
name: '📦 Is it production ready?',
|
|
538
|
+
value: 'YAKMESH is actively developed. Check releases for stable versions. Current: v' + config.version,
|
|
539
|
+
inline: false,
|
|
540
|
+
},
|
|
541
|
+
],
|
|
542
|
+
footer: 'More questions? Use /ask <question> or check the docs!',
|
|
543
|
+
});
|
|
544
|
+
await interaction.reply({ embeds: [embed] });
|
|
545
|
+
},
|
|
546
|
+
|
|
500
547
|
// /botstats - Bot performance metrics
|
|
501
548
|
async botstats(interaction) {
|
|
502
549
|
const uptime = Date.now() - stats.startTime;
|
|
@@ -64,6 +64,10 @@ const commands = [
|
|
|
64
64
|
.setName('help')
|
|
65
65
|
.setDescription('Show all available YakBot commands'),
|
|
66
66
|
|
|
67
|
+
new SlashCommandBuilder()
|
|
68
|
+
.setName('faq')
|
|
69
|
+
.setDescription('Frequently asked questions about YAKMESH'),
|
|
70
|
+
|
|
67
71
|
new SlashCommandBuilder()
|
|
68
72
|
.setName('botstats')
|
|
69
73
|
.setDescription('View YakBot performance metrics and statistics'),
|