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.
Files changed (232) hide show
  1. package/CHANGELOG.md +637 -0
  2. package/CONTRIBUTING.md +42 -0
  3. package/Caddyfile +77 -0
  4. package/README.md +119 -29
  5. package/adapters/adapter-mlv-bible/README.md +124 -0
  6. package/adapters/adapter-mlv-bible/index.js +400 -0
  7. package/adapters/chat-mod-adapter.js +532 -0
  8. package/adapters/content-adapter.js +273 -0
  9. package/content/api.js +50 -41
  10. package/content/index.js +2 -2
  11. package/content/store.js +355 -173
  12. package/dashboard/index.html +19 -3
  13. package/database/replication.js +117 -37
  14. package/docs/CRYPTO-AGILITY.md +204 -0
  15. package/docs/MTLS-RESEARCH.md +367 -0
  16. package/docs/NAMCHE-SPEC.md +681 -0
  17. package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
  18. package/docs/PRECISION-DISCLOSURE.md +96 -0
  19. package/docs/README.md +76 -0
  20. package/docs/ROADMAP-2.4.0.md +447 -0
  21. package/docs/ROADMAP-2.5.0.md +244 -0
  22. package/docs/SECURITY-AUDIT-REPORT.md +306 -0
  23. package/docs/SST-INTEGRATION.md +712 -0
  24. package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
  25. package/docs/TERNARY-AUDIT-REPORT.md +247 -0
  26. package/docs/TME-FAQ.md +221 -0
  27. package/docs/WHITEPAPER.md +623 -0
  28. package/docs/adapters.html +1001 -0
  29. package/docs/advanced-systems.html +1045 -0
  30. package/docs/annex.html +1046 -0
  31. package/docs/api.html +970 -0
  32. package/docs/business/response-templates.md +160 -0
  33. package/docs/c2c.html +1225 -0
  34. package/docs/cli.html +1332 -0
  35. package/docs/configuration.html +1248 -0
  36. package/docs/darshan.html +1085 -0
  37. package/docs/dharma.html +966 -0
  38. package/docs/docs-bundle.html +1075 -0
  39. package/docs/docs.css +3120 -0
  40. package/docs/docs.js +556 -0
  41. package/docs/doko.html +969 -0
  42. package/docs/geo-proof.html +858 -0
  43. package/docs/getting-started.html +840 -0
  44. package/docs/gumba-tutorial.html +1144 -0
  45. package/docs/gumba.html +1098 -0
  46. package/docs/index.html +914 -0
  47. package/docs/jhilke.html +1312 -0
  48. package/docs/karma.html +1100 -0
  49. package/docs/katha.html +1037 -0
  50. package/docs/lama.html +978 -0
  51. package/docs/mandala.html +1067 -0
  52. package/docs/mani.html +964 -0
  53. package/docs/mantra.html +967 -0
  54. package/docs/mesh.html +1409 -0
  55. package/docs/nakpak.html +869 -0
  56. package/docs/namche.html +928 -0
  57. package/docs/nav-order.json +53 -0
  58. package/docs/prahari.html +1043 -0
  59. package/docs/prism-bash.min.js +1 -0
  60. package/docs/prism-javascript.min.js +1 -0
  61. package/docs/prism-json.min.js +1 -0
  62. package/docs/prism-tomorrow.min.css +1 -0
  63. package/docs/prism.min.js +1 -0
  64. package/docs/privacy.html +699 -0
  65. package/docs/quick-reference.html +1181 -0
  66. package/docs/sakshi.html +1402 -0
  67. package/docs/sandboxing.md +386 -0
  68. package/docs/seva.html +911 -0
  69. package/docs/sherpa.html +871 -0
  70. package/docs/studio.html +860 -0
  71. package/docs/stupa.html +995 -0
  72. package/docs/tailwind.min.css +2 -0
  73. package/docs/tattva.html +1332 -0
  74. package/docs/terms.html +686 -0
  75. package/docs/time-server-deployment.md +166 -0
  76. package/docs/time-sources.html +1392 -0
  77. package/docs/tivra.html +1127 -0
  78. package/docs/trademark-policy.html +686 -0
  79. package/docs/tribhuj.html +1183 -0
  80. package/docs/trust-security.html +1029 -0
  81. package/docs/tutorials/backup-recovery.html +654 -0
  82. package/docs/tutorials/dashboard.html +604 -0
  83. package/docs/tutorials/domain-setup.html +605 -0
  84. package/docs/tutorials/host-website.html +456 -0
  85. package/docs/tutorials/mesh-network.html +505 -0
  86. package/docs/tutorials/mobile-access.html +445 -0
  87. package/docs/tutorials/privacy.html +467 -0
  88. package/docs/tutorials/raspberry-pi.html +600 -0
  89. package/docs/tutorials/security-basics.html +539 -0
  90. package/docs/tutorials/share-files.html +431 -0
  91. package/docs/tutorials/troubleshooting.html +637 -0
  92. package/docs/tutorials/trust-karma.html +419 -0
  93. package/docs/tutorials/yak-protocol.html +456 -0
  94. package/docs/tutorials.html +1034 -0
  95. package/docs/vani.html +1270 -0
  96. package/docs/webserver.html +809 -0
  97. package/docs/yak-protocol.html +940 -0
  98. package/docs/yak-timeserver-design.md +475 -0
  99. package/docs/yakapp.html +1015 -0
  100. package/docs/ypc27.html +1069 -0
  101. package/docs/yurt.html +1344 -0
  102. package/embedded-docs/bundle.js +334 -74
  103. package/gossip/protocol.js +247 -27
  104. package/identity/key-resolver.js +262 -0
  105. package/identity/machine-seed.js +632 -0
  106. package/identity/node-key.js +669 -368
  107. package/identity/tribhuj-ratchet.js +506 -0
  108. package/knowledge-base.js +37 -8
  109. package/launcher/yakmesh.bat +62 -0
  110. package/launcher/yakmesh.sh +70 -0
  111. package/mesh/annex.js +462 -108
  112. package/mesh/beacon-broadcast.js +113 -1
  113. package/mesh/darshan.js +1718 -0
  114. package/mesh/gumba.js +1567 -0
  115. package/mesh/jhilke.js +651 -0
  116. package/mesh/katha.js +1012 -0
  117. package/mesh/nakpak-routing.js +8 -5
  118. package/mesh/network.js +724 -34
  119. package/mesh/pulse-sync.js +4 -1
  120. package/mesh/rate-limiter.js +127 -15
  121. package/mesh/seva.js +526 -0
  122. package/mesh/sherpa-discovery.js +89 -8
  123. package/mesh/sybil-defense.js +19 -5
  124. package/mesh/temporal-encoder.js +4 -3
  125. package/mesh/vani.js +1364 -0
  126. package/mesh/yurt.js +1340 -0
  127. package/models/entropy-sentinel.onnx +0 -0
  128. package/models/karma-trust.onnx +0 -0
  129. package/models/manifest.json +43 -0
  130. package/models/sakshi-anomaly.onnx +0 -0
  131. package/oracle/code-proof-protocol.js +7 -6
  132. package/oracle/codebase-lock.js +257 -28
  133. package/oracle/index.js +74 -15
  134. package/oracle/ma902-snmp.js +678 -0
  135. package/oracle/module-sealer.js +5 -3
  136. package/oracle/network-identity.js +16 -0
  137. package/oracle/packet-checksum.js +201 -0
  138. package/oracle/sst.js +579 -0
  139. package/oracle/ternary-144t.js +714 -0
  140. package/oracle/ternary-ml.js +481 -0
  141. package/oracle/time-api.js +239 -0
  142. package/oracle/time-source.js +137 -47
  143. package/oracle/validation-oracle-hardened.js +1111 -1071
  144. package/oracle/validation-oracle.js +4 -2
  145. package/oracle/ypc27.js +211 -0
  146. package/package.json +20 -3
  147. package/protocol/yak-handler.js +35 -9
  148. package/protocol/yak-protocol.js +28 -13
  149. package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
  150. package/reference/cpp/yakmesh_ypc27.cpp +179 -0
  151. package/sbom.json +87 -0
  152. package/scripts/security-audit.mjs +264 -0
  153. package/scripts/update-docs-nav.js +194 -0
  154. package/scripts/update-docs-sidebar.cjs +164 -0
  155. package/security/crypto-config.js +4 -3
  156. package/security/dharma-moderation.js +517 -0
  157. package/security/doko-identity.js +193 -143
  158. package/security/domain-consensus.js +86 -85
  159. package/security/fs-hardening.js +620 -0
  160. package/security/hardware-attestation.js +5 -3
  161. package/security/hybrid-trust.js +227 -87
  162. package/security/karma-rate-limiter.js +692 -0
  163. package/security/khata-protocol.js +22 -21
  164. package/security/khata-trust-integration.js +277 -150
  165. package/security/memory-safety.js +635 -0
  166. package/security/mesh-auth.js +11 -10
  167. package/security/mesh-revocation.js +373 -5
  168. package/security/namche-gateway.js +298 -69
  169. package/security/sakshi.js +460 -3
  170. package/security/sangha.js +770 -0
  171. package/security/secure-config.js +473 -0
  172. package/security/silicon-parity.js +13 -10
  173. package/security/steadywatch.js +1142 -0
  174. package/security/strike-system.js +32 -3
  175. package/security/temporal-signing.js +488 -0
  176. package/security/trit-commitment.js +464 -0
  177. package/server/crypto/annex.js +247 -0
  178. package/server/darshan-api.js +343 -0
  179. package/server/index.js +3259 -362
  180. package/server/komm-api.js +668 -0
  181. package/utils/accel.js +2273 -0
  182. package/utils/ternary-id.js +79 -0
  183. package/utils/verify-worker.js +57 -0
  184. package/webserver/index.js +95 -5
  185. package/assets/yakmesh-logo.png +0 -0
  186. package/assets/yakmesh-logo.svg +0 -80
  187. package/assets/yakmesh-logo2.png +0 -0
  188. package/assets/yakmesh-logo2sm.png +0 -0
  189. package/assets/ymsm.png +0 -0
  190. package/website/assets/silhouettes/adapters.svg +0 -107
  191. package/website/assets/silhouettes/api-endpoints.svg +0 -115
  192. package/website/assets/silhouettes/atomic-clock.svg +0 -83
  193. package/website/assets/silhouettes/base-camp.svg +0 -81
  194. package/website/assets/silhouettes/bridge.svg +0 -69
  195. package/website/assets/silhouettes/docs-bundle.svg +0 -113
  196. package/website/assets/silhouettes/doko-basket.svg +0 -70
  197. package/website/assets/silhouettes/fortress.svg +0 -93
  198. package/website/assets/silhouettes/gateway.svg +0 -54
  199. package/website/assets/silhouettes/gears.svg +0 -93
  200. package/website/assets/silhouettes/globe-satellite.svg +0 -67
  201. package/website/assets/silhouettes/karma-wheel.svg +0 -137
  202. package/website/assets/silhouettes/lama-council.svg +0 -141
  203. package/website/assets/silhouettes/mandala-network.svg +0 -169
  204. package/website/assets/silhouettes/mani-stones.svg +0 -149
  205. package/website/assets/silhouettes/mantra-wheel.svg +0 -116
  206. package/website/assets/silhouettes/mesh-nodes.svg +0 -113
  207. package/website/assets/silhouettes/nakpak.svg +0 -56
  208. package/website/assets/silhouettes/peak-lightning.svg +0 -73
  209. package/website/assets/silhouettes/sherpa.svg +0 -69
  210. package/website/assets/silhouettes/stupa-tower.svg +0 -119
  211. package/website/assets/silhouettes/tattva-eye.svg +0 -78
  212. package/website/assets/silhouettes/terminal.svg +0 -74
  213. package/website/assets/silhouettes/webserver.svg +0 -145
  214. package/website/assets/silhouettes/yak.svg +0 -78
  215. package/website/assets/yakmesh-logo.png +0 -0
  216. package/website/assets/yakmesh-logo.webp +0 -0
  217. package/website/assets/yakmesh-logo128x140.webp +0 -0
  218. package/website/assets/yakmesh-logo2.png +0 -0
  219. package/website/assets/yakmesh-logo2.svg +0 -51
  220. package/website/assets/yakmesh-logo40x44.webp +0 -0
  221. package/website/assets/yakmesh.gif +0 -0
  222. package/website/assets/yakmesh.ico +0 -0
  223. package/website/assets/yakmesh.jpg +0 -0
  224. package/website/assets/yakmesh.pdf +0 -0
  225. package/website/assets/yakmesh.png +0 -0
  226. package/website/assets/yakmesh.svg +0 -70
  227. package/website/assets/yakmesh128.webp +0 -0
  228. package/website/assets/yakmesh32.png +0 -0
  229. package/website/assets/yakmesh32.svg +0 -65
  230. package/website/assets/yakmesh32o.ico +0 -2
  231. package/website/assets/yakmesh32o.svg +0 -65
  232. package/website/assets/yakmesh32o.svgz +0 -0
@@ -0,0 +1,194 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * update-docs-nav.js - Update documentation navigation links
4
+ *
5
+ * Reads docs/nav-order.json and updates prev/next links in all doc pages.
6
+ * Handles two navigation formats:
7
+ * 1. Journey Navigation cards (with icons and descriptions)
8
+ * 2. Simple nav-footer links
9
+ *
10
+ * Usage: node scripts/update-docs-nav.js [--dry-run] [--verbose]
11
+ */
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ const DOCS_DIR = path.join(__dirname, '..', 'docs');
17
+ const NAV_ORDER_FILE = path.join(DOCS_DIR, 'nav-order.json');
18
+
19
+ // Parse args
20
+ const args = process.argv.slice(2);
21
+ const DRY_RUN = args.includes('--dry-run');
22
+ const VERBOSE = args.includes('--verbose');
23
+
24
+ function log(...msg) {
25
+ if (VERBOSE) console.log(...msg);
26
+ }
27
+
28
+ function loadNavOrder() {
29
+ const content = fs.readFileSync(NAV_ORDER_FILE, 'utf8');
30
+ return JSON.parse(content).pages;
31
+ }
32
+
33
+ /**
34
+ * Generate Journey Navigation card HTML
35
+ */
36
+ function generateJourneyCard(page, direction) {
37
+ if (!page) return '';
38
+
39
+ const borderClass = direction === 'prev'
40
+ ? 'border-mountain-700'
41
+ : 'border-theme-primary';
42
+ const label = direction === 'prev' ? '← Previous' : 'Next →';
43
+
44
+ return [
45
+ ' <a href="' + page.file + '" class="flex-1 block bg-mountain-800 border ' + borderClass + ' rounded-xl p-4 hover:border-theme-accent transition group">',
46
+ ' <div class="text-xs text-mountain-400 mb-1">' + label + '</div>',
47
+ ' <div class="flex items-center gap-2">',
48
+ ' <span class="text-xl">' + page.icon + '</span>',
49
+ ' <span class="font-semibold group-hover:text-theme-accent">' + page.title + '</span>',
50
+ ' </div>',
51
+ ' <p class="text-mountain-400 text-sm mt-1">' + page.description + '</p>',
52
+ ' </a>'
53
+ ].join('\n');
54
+ }
55
+
56
+ /**
57
+ * Generate Journey Navigation section
58
+ */
59
+ function generateJourneyNav(prevPage, nextPage) {
60
+ const cards = [];
61
+ if (prevPage) cards.push(generateJourneyCard(prevPage, 'prev'));
62
+ if (nextPage) cards.push(generateJourneyCard(nextPage, 'next'));
63
+
64
+ return [
65
+ ' <!-- Journey Navigation -->',
66
+ ' <div class="border-t border-mountain-700 mt-12 pt-8">',
67
+ ' <h2 class="text-xl font-bold mb-6">Continue the Journey</h2>',
68
+ ' <div class="flex flex-col sm:flex-row gap-4">',
69
+ cards.join('\n'),
70
+ ' </div>',
71
+ ' </div>'
72
+ ].join('\n');
73
+ }
74
+
75
+ /**
76
+ * Generate simple nav-footer HTML
77
+ */
78
+ function generateNavFooter(prevPage, nextPage) {
79
+ const links = [];
80
+ if (prevPage) {
81
+ links.push(' <a href="' + prevPage.file + '">← ' + prevPage.title + '</a>');
82
+ }
83
+ if (nextPage) {
84
+ const mlAuto = prevPage ? ' class="ml-auto"' : '';
85
+ links.push(' <a href="' + nextPage.file + '"' + mlAuto + '>' + nextPage.title + ' →</a>');
86
+ }
87
+
88
+ return [
89
+ ' <!-- Navigation -->',
90
+ ' <nav class="docs-nav-footer">',
91
+ links.join('\n'),
92
+ ' </nav>'
93
+ ].join('\n');
94
+ }
95
+
96
+ /**
97
+ * Update navigation in a single file
98
+ */
99
+ function updateFileNav(filePath, prevPage, nextPage) {
100
+ let content = fs.readFileSync(filePath, 'utf8');
101
+ const fileName = path.basename(filePath);
102
+ let modified = false;
103
+
104
+ // Pattern 1: Journey Navigation cards
105
+ const journeyPattern = /<!-- Journey Navigation -->.*?<\/div>\s*<\/div>\s*<\/div>/s;
106
+ if (journeyPattern.test(content)) {
107
+ const newNav = generateJourneyNav(prevPage, nextPage);
108
+ content = content.replace(journeyPattern, newNav);
109
+ modified = true;
110
+ log(' Updated Journey Navigation in', fileName);
111
+ }
112
+
113
+ // Pattern 2: Simple nav-footer (if no Journey Navigation)
114
+ const navFooterPattern = /<!-- Navigation -->\s*<nav class="docs-nav-footer">.*?<\/nav>/s;
115
+ if (!modified && navFooterPattern.test(content)) {
116
+ const newNav = generateNavFooter(prevPage, nextPage);
117
+ content = content.replace(navFooterPattern, newNav);
118
+ modified = true;
119
+ log(' Updated nav-footer in', fileName);
120
+ }
121
+
122
+ // Pattern 3: Alternative Journey Navigation format (closing with </div></div>)
123
+ const altJourneyPattern = /<div class="border-t border-mountain-700 mt-12 pt-8">\s*<h2 class="text-xl font-bold mb-6">Continue the Journey<\/h2>.*?<\/div>\s*<\/div>/s;
124
+ if (!modified && altJourneyPattern.test(content)) {
125
+ const newNav = generateJourneyNav(prevPage, nextPage);
126
+ content = content.replace(altJourneyPattern, newNav.replace(' <!-- Journey Navigation -->\n', ''));
127
+ modified = true;
128
+ log(' Updated alt Journey Navigation in', fileName);
129
+ }
130
+
131
+ if (modified) {
132
+ if (!DRY_RUN) {
133
+ fs.writeFileSync(filePath, content, 'utf8');
134
+ }
135
+ return true;
136
+ }
137
+
138
+ log(' No navigation section found in', fileName);
139
+ return false;
140
+ }
141
+
142
+ /**
143
+ * Main update function
144
+ */
145
+ function updateAllNavigation() {
146
+ console.log('📚 Updating documentation navigation links...');
147
+ if (DRY_RUN) console.log(' (DRY RUN - no files will be modified)');
148
+ console.log('');
149
+
150
+ const pages = loadNavOrder();
151
+ console.log('Found', pages.length, 'pages in nav-order.json');
152
+ console.log('');
153
+
154
+ let updated = 0;
155
+ let skipped = 0;
156
+ let notFound = 0;
157
+
158
+ for (let i = 0; i < pages.length; i++) {
159
+ const current = pages[i];
160
+ const prev = i > 0 ? pages[i - 1] : null;
161
+ const next = i < pages.length - 1 ? pages[i + 1] : null;
162
+
163
+ const filePath = path.join(DOCS_DIR, current.file);
164
+
165
+ if (!fs.existsSync(filePath)) {
166
+ console.log('⚠️ File not found:', current.file);
167
+ notFound++;
168
+ continue;
169
+ }
170
+
171
+ if (updateFileNav(filePath, prev, next)) {
172
+ console.log('✅', current.file, '→',
173
+ prev ? '← ' + prev.file : '(no prev)',
174
+ next ? '→ ' + next.file : '(no next)');
175
+ updated++;
176
+ } else {
177
+ skipped++;
178
+ }
179
+ }
180
+
181
+ console.log('');
182
+ console.log('Summary:');
183
+ console.log(' Updated:', updated);
184
+ console.log(' Skipped:', skipped, '(no nav section)');
185
+ console.log(' Not found:', notFound);
186
+
187
+ if (DRY_RUN) {
188
+ console.log('');
189
+ console.log('Run without --dry-run to apply changes.');
190
+ }
191
+ }
192
+
193
+ // Run
194
+ updateAllNavigation();
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * update-docs-sidebar.cjs - Update sidebar navigation in all doc pages
4
+ *
5
+ * Reads docs/nav-order.json and updates the <ul class="sidebar-nav"> section
6
+ * in all HTML files to match the canonical navigation order.
7
+ *
8
+ * Usage: node scripts/update-docs-sidebar.cjs [--dry-run] [--verbose]
9
+ *
10
+ * This ensures all pages have consistent sidebar navigation without manual updates.
11
+ */
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ // Support both /docs and /website/docs
17
+ const SCRIPTS_DIR = __dirname;
18
+ const ROOT_DIR = path.join(SCRIPTS_DIR, '..');
19
+ const NAV_ORDER_FILE = path.join(ROOT_DIR, 'docs', 'nav-order.json');
20
+
21
+ // Target directories to scan
22
+ const DOCS_DIRS = [
23
+ path.join(ROOT_DIR, 'docs'),
24
+ path.join(ROOT_DIR, 'website', 'docs'),
25
+ path.join(ROOT_DIR, 'website', 'docs', 'tutorials')
26
+ ];
27
+
28
+ // Parse args
29
+ const args = process.argv.slice(2);
30
+ const DRY_RUN = args.includes('--dry-run');
31
+ const VERBOSE = args.includes('--verbose');
32
+
33
+ function log(...msg) {
34
+ if (VERBOSE) console.log(...msg);
35
+ }
36
+
37
+ function loadNavOrder() {
38
+ const content = fs.readFileSync(NAV_ORDER_FILE, 'utf8');
39
+ return JSON.parse(content).pages;
40
+ }
41
+
42
+ /**
43
+ * Generate sidebar nav list items from nav-order.json
44
+ * @param {string} currentFile - The current file name (for "active" class)
45
+ * @param {string} prefix - Path prefix (e.g., "../" for subdirectory pages)
46
+ */
47
+ function generateSidebarNavItems(currentFile, prefix = '') {
48
+ const pages = loadNavOrder();
49
+
50
+ const items = pages.map(page => {
51
+ const isActive = page.file === currentFile;
52
+ const activeClass = isActive ? ' class="active"' : '';
53
+ const href = prefix + page.file;
54
+
55
+ // Icon handling - some use classes like yak-icon
56
+ let iconHtml;
57
+ if (page.title === 'YAK://') {
58
+ iconHtml = '<span class="yak-icon"></span>';
59
+ } else {
60
+ iconHtml = `<span>${page.icon}</span>`;
61
+ }
62
+
63
+ return ` <li><a href="${href}"${activeClass}>${iconHtml} <span>${page.title}</span></a></li>`;
64
+ });
65
+
66
+ return items.join('\n');
67
+ }
68
+
69
+ /**
70
+ * Update sidebar in a single file
71
+ */
72
+ function updateFileSidebar(filePath) {
73
+ let content = fs.readFileSync(filePath, 'utf8');
74
+ const fileName = path.basename(filePath);
75
+
76
+ // Determine prefix for subdirectory pages (tutorials/)
77
+ const inSubdir = filePath.includes(path.sep + 'tutorials' + path.sep);
78
+ const prefix = inSubdir ? '../' : '';
79
+
80
+ // Match the sidebar-nav ul section
81
+ const sidebarPattern = /<ul class="sidebar-nav">\s*(?:<li>.*?<\/li>\s*)+<\/ul>/s;
82
+
83
+ if (!sidebarPattern.test(content)) {
84
+ log(' No sidebar-nav found in', fileName);
85
+ return false;
86
+ }
87
+
88
+ const newNavItems = generateSidebarNavItems(fileName, prefix);
89
+ const newSidebar = `<ul class="sidebar-nav">\n${newNavItems}\n </ul>`;
90
+
91
+ const newContent = content.replace(sidebarPattern, newSidebar);
92
+
93
+ if (newContent === content) {
94
+ log(' No changes needed in', fileName);
95
+ return false;
96
+ }
97
+
98
+ if (!DRY_RUN) {
99
+ fs.writeFileSync(filePath, newContent, 'utf8');
100
+ }
101
+
102
+ return true;
103
+ }
104
+
105
+ /**
106
+ * Get all HTML files in a directory
107
+ */
108
+ function getHtmlFiles(dir) {
109
+ if (!fs.existsSync(dir)) return [];
110
+
111
+ return fs.readdirSync(dir)
112
+ .filter(f => f.endsWith('.html'))
113
+ .map(f => path.join(dir, f));
114
+ }
115
+
116
+ /**
117
+ * Main update function
118
+ */
119
+ function updateAllSidebars() {
120
+ console.log('🧭 Updating documentation sidebars...');
121
+ if (DRY_RUN) console.log(' (DRY RUN - no files will be modified)');
122
+ console.log('');
123
+
124
+ const pages = loadNavOrder();
125
+ console.log(`Loaded ${pages.length} pages from nav-order.json`);
126
+ console.log('');
127
+
128
+ let updated = 0;
129
+ let skipped = 0;
130
+
131
+ // Collect all HTML files from all directories
132
+ const allFiles = [];
133
+ for (const dir of DOCS_DIRS) {
134
+ allFiles.push(...getHtmlFiles(dir));
135
+ }
136
+
137
+ console.log(`Found ${allFiles.length} HTML files to process`);
138
+ console.log('');
139
+
140
+ for (const filePath of allFiles) {
141
+ const relativePath = path.relative(ROOT_DIR, filePath);
142
+
143
+ if (updateFileSidebar(filePath)) {
144
+ console.log('✅', relativePath);
145
+ updated++;
146
+ } else {
147
+ log('⏭️ ', relativePath);
148
+ skipped++;
149
+ }
150
+ }
151
+
152
+ console.log('');
153
+ console.log('Summary:');
154
+ console.log(' Updated:', updated);
155
+ console.log(' Skipped:', skipped);
156
+
157
+ if (DRY_RUN) {
158
+ console.log('');
159
+ console.log('Run without --dry-run to apply changes.');
160
+ }
161
+ }
162
+
163
+ // Run
164
+ updateAllSidebars();
@@ -276,12 +276,13 @@ export function getBackupSignatureName(level = activeLevel) {
276
276
  /**
277
277
  * Generate a backup (SLH-DSA) keypair using the current security level
278
278
  * Note: SLH-DSA keys are much smaller than ML-DSA, but signatures are larger
279
+ * @param {Uint8Array} [seed] - Optional seed for deterministic generation
279
280
  * @param {number} [level] - Optional security level
280
281
  * @returns {Object} { publicKey, secretKey }
281
282
  */
282
- export function generateBackupSignatureKeyPair(level = activeLevel) {
283
+ export function generateBackupSignatureKeyPair(seed = null, level = activeLevel) {
283
284
  const algo = CRYPTO_PROFILES[level].backupSignature.algorithm;
284
- return algo.keygen();
285
+ return seed ? algo.keygen(seed) : algo.keygen();
285
286
  }
286
287
 
287
288
  /**
@@ -324,7 +325,7 @@ export function verifyBackup(signature, message, publicKey, level = activeLevel)
324
325
  export function generateDualSignatureKeyPairs(seed, level = activeLevel) {
325
326
  return {
326
327
  primary: generateSignatureKeyPair(seed, level),
327
- backup: generateBackupSignatureKeyPair(level),
328
+ backup: generateBackupSignatureKeyPair(null, level),
328
329
  };
329
330
  }
330
331