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
package/oracle/sst.js ADDED
@@ -0,0 +1,579 @@
1
+ /**
2
+ * SST - Synergy Sequence Theory Integration for YAKMESH
3
+ *
4
+ * Based on Wesley Long's Synergy Sequence Theory, this module provides:
5
+ * - Digital root calculation
6
+ * - SST family classification (1,4,7 / 2,5,8 / 3,6,9)
7
+ * - Fibonacci 24-cycle sequences
8
+ * - Synergy Matrix generation
9
+ *
10
+ * The theory proposes that the numbers 3, 6, and 9 are "keys to the universe"
11
+ * and that all numbers belong to one of three family groups that determine
12
+ * their fundamental polarity.
13
+ *
14
+ * Integration Points:
15
+ * - TRIBHUJ: Family → Trit mapping
16
+ * - YPC-27: 24-cycle seed rotation
17
+ * - KARMA: Synergy Triangle trust geometry
18
+ * - PRAMAAN: Hexagonal tessellation
19
+ *
20
+ * @module oracle/sst
21
+ * @license MIT
22
+ * @copyright 2026 YAKMESH™ Contributors
23
+ * @see docs/SST-INTEGRATION.md
24
+ */
25
+
26
+ import { Trit, POSITIVE, NEUTRAL, NEGATIVE } from './tribhuj.js';
27
+
28
+ // =============================================================================
29
+ // CONSTANTS
30
+ // =============================================================================
31
+
32
+ /**
33
+ * SST Family identifiers.
34
+ *
35
+ * Family A (1,4,7): Physical Negative - descending energy
36
+ * Family B (2,5,8): Physical Positive - ascending energy
37
+ * Family C (3,6,9): Governing/Source - the singularity
38
+ */
39
+ export const SSTFamily = Object.freeze({
40
+ A: 'A', // 1, 4, 7 - Physical Negative
41
+ B: 'B', // 2, 5, 8 - Physical Positive
42
+ C: 'C', // 3, 6, 9 - Governing/Source
43
+ });
44
+
45
+ /**
46
+ * The 24-digit repeating Fibonacci digital root sequence.
47
+ * This is the fundamental SST cycle discovered by reducing
48
+ * the infinite Fibonacci sequence to digital roots.
49
+ *
50
+ * Pattern emerges: positions 12 and 24 are both 9 (singularity markers)
51
+ */
52
+ export const FIBONACCI_CYCLE_24 = Object.freeze([
53
+ 1, 1, 2, 3, 5, 8, 4, 3, 7, 1, 8, 9, // First half
54
+ 8, 8, 7, 6, 4, 1, 5, 6, 2, 8, 1, 9 // Second half (mirror-ish)
55
+ ]);
56
+
57
+ /**
58
+ * Family to Trit mapping.
59
+ *
60
+ * This is the core SST-TRIBHUJ bridge:
61
+ * - Family A represents the negative/descending polarity
62
+ * - Family B represents the positive/ascending polarity
63
+ * - Family C represents the neutral/governing singularity
64
+ */
65
+ export const FAMILY_TO_TRIT = Object.freeze({
66
+ [SSTFamily.A]: NEGATIVE, // -1
67
+ [SSTFamily.B]: POSITIVE, // +1
68
+ [SSTFamily.C]: NEUTRAL, // 0
69
+ });
70
+
71
+ /**
72
+ * Synergy Triangle angles (degrees).
73
+ * These form the fundamental 30-60-90 right triangle.
74
+ */
75
+ export const SynergyAngles = Object.freeze({
76
+ BASE: 30, // Shallow, wide
77
+ MIDDLE: 60, // Balanced
78
+ APEX: 90, // Deep, narrow
79
+ });
80
+
81
+ /**
82
+ * Trust propagation ratios based on Synergy Triangle geometry.
83
+ * Derived from the 30-60-90 triangle: sides are in ratio 1 : √3 : 2
84
+ */
85
+ export const TRUST_PROPAGATION = Object.freeze({
86
+ DIRECT: 1.0, // Self
87
+ ONE_HOP: 1 / Math.sqrt(3), // ≈ 0.577
88
+ TWO_HOPS: 1 / 3, // ≈ 0.333
89
+ THREE_HOPS: 1 / Math.sqrt(27), // ≈ 0.192
90
+ });
91
+
92
+ /**
93
+ * Hexagonal cell sizes (km) based on powers of 3.
94
+ * These provide natural scaling for geographic zones.
95
+ */
96
+ export const HEX_CELL_SIZES = Object.freeze({
97
+ MICRO: 9, // 3² km - City district
98
+ SMALL: 27, // 3³ km - Metro area
99
+ MEDIUM: 81, // 3⁴ km - Regional
100
+ LARGE: 243, // 3⁵ km - National
101
+ MEGA: 729, // 3⁶ km - Continental
102
+ });
103
+
104
+ // =============================================================================
105
+ // DIGITAL ROOT FUNCTIONS
106
+ // =============================================================================
107
+
108
+ /**
109
+ * Calculate the digital root of a number.
110
+ *
111
+ * Sum digits repeatedly until a single digit (1-9) remains.
112
+ * This is equivalent to (n - 1) % 9 + 1 for positive n.
113
+ *
114
+ * Examples:
115
+ * digitalRoot(27) = 9 (2 + 7 = 9)
116
+ * digitalRoot(123) = 6 (1 + 2 + 3 = 6)
117
+ * digitalRoot(999) = 9
118
+ * digitalRoot(0) = 9 (special case: 0 → 9 in SST)
119
+ *
120
+ * @param {number | bigint} n - Any integer
121
+ * @returns {number} - A value 1-9
122
+ */
123
+ export function digitalRoot(n) {
124
+ // Handle BigInt
125
+ if (typeof n === 'bigint') {
126
+ if (n === 0n) return 9;
127
+ const abs = n < 0n ? -n : n;
128
+ const root = Number(abs % 9n);
129
+ return root === 0 ? 9 : root;
130
+ }
131
+
132
+ // Handle regular numbers
133
+ if (n === 0) return 9;
134
+ const abs = Math.abs(Math.floor(n));
135
+ const root = abs % 9;
136
+ return root === 0 ? 9 : root;
137
+ }
138
+
139
+ /**
140
+ * Get the SST family for a digital root (1-9).
141
+ *
142
+ * @param {number} root - Digital root value 1-9
143
+ * @returns {'A' | 'B' | 'C'}
144
+ */
145
+ export function getFamily(root) {
146
+ if (root === 1 || root === 4 || root === 7) return SSTFamily.A;
147
+ if (root === 2 || root === 5 || root === 8) return SSTFamily.B;
148
+ return SSTFamily.C; // 3, 6, 9
149
+ }
150
+
151
+ /**
152
+ * Get the SST family for any number.
153
+ * Calculates digital root, then returns family.
154
+ *
155
+ * @param {number | bigint} n - Any integer
156
+ * @returns {'A' | 'B' | 'C'}
157
+ */
158
+ export function getFamilyOf(n) {
159
+ return getFamily(digitalRoot(n));
160
+ }
161
+
162
+ /**
163
+ * Map any number to a Trit via its SST family.
164
+ *
165
+ * This is the core SST-TRIBHUJ mapping:
166
+ * Family A (1,4,7) → -1 (NEGATIVE) - Physical descending
167
+ * Family B (2,5,8) → +1 (POSITIVE) - Physical ascending
168
+ * Family C (3,6,9) → 0 (NEUTRAL) - Governing singularity
169
+ *
170
+ * @param {number | bigint} n
171
+ * @returns {Trit}
172
+ */
173
+ export function toFamilyTrit(n) {
174
+ const family = getFamilyOf(n);
175
+ return new Trit(FAMILY_TO_TRIT[family]);
176
+ }
177
+
178
+ /**
179
+ * Convert a byte array to family trits.
180
+ * Each byte maps to its SST family trit.
181
+ *
182
+ * @param {Uint8Array} bytes
183
+ * @returns {Int8Array} - Array of trit values (-1, 0, +1)
184
+ */
185
+ export function bytesToFamilyTrits(bytes) {
186
+ const trits = new Int8Array(bytes.length);
187
+ for (let i = 0; i < bytes.length; i++) {
188
+ trits[i] = toFamilyTrit(bytes[i]).value;
189
+ }
190
+ return trits;
191
+ }
192
+
193
+ /**
194
+ * Get family statistics for a byte array.
195
+ *
196
+ * @param {Uint8Array} bytes
197
+ * @returns {{ a: number, b: number, c: number, dominant: 'A' | 'B' | 'C' }}
198
+ */
199
+ export function analyzeBytesFamilies(bytes) {
200
+ let a = 0, b = 0, c = 0;
201
+
202
+ for (const byte of bytes) {
203
+ const family = getFamilyOf(byte);
204
+ if (family === SSTFamily.A) a++;
205
+ else if (family === SSTFamily.B) b++;
206
+ else c++;
207
+ }
208
+
209
+ const max = Math.max(a, b, c);
210
+ const dominant = max === a ? SSTFamily.A : max === b ? SSTFamily.B : SSTFamily.C;
211
+
212
+ return { a, b, c, dominant };
213
+ }
214
+
215
+ // =============================================================================
216
+ // FIBONACCI CYCLE FUNCTIONS
217
+ // =============================================================================
218
+
219
+ /**
220
+ * Get the digital root Fibonacci number at position n.
221
+ * Uses the 24-position cycle.
222
+ *
223
+ * @param {number} n - Position (0-indexed)
224
+ * @returns {number} - Digital root 1-9
225
+ */
226
+ export function fibonacciRoot(n) {
227
+ const pos = ((n % 24) + 24) % 24; // Handle negative indices
228
+ return FIBONACCI_CYCLE_24[pos];
229
+ }
230
+
231
+ /**
232
+ * Get the SST family for Fibonacci position n.
233
+ *
234
+ * @param {number} n
235
+ * @returns {'A' | 'B' | 'C'}
236
+ */
237
+ export function fibonacciFamily(n) {
238
+ return getFamily(fibonacciRoot(n));
239
+ }
240
+
241
+ /**
242
+ * Get the family trit for Fibonacci position n.
243
+ *
244
+ * @param {number} n
245
+ * @returns {Trit}
246
+ */
247
+ export function fibonacciFamilyTrit(n) {
248
+ return toFamilyTrit(fibonacciRoot(n));
249
+ }
250
+
251
+ /**
252
+ * Analyze the 24-cycle for family distribution.
253
+ *
254
+ * @returns {{ a: number[], b: number[], c: number[] }}
255
+ */
256
+ export function analyzeFibonacciCycle() {
257
+ const a = [], b = [], c = [];
258
+
259
+ for (let i = 0; i < 24; i++) {
260
+ const family = fibonacciFamily(i);
261
+ if (family === SSTFamily.A) a.push(i);
262
+ else if (family === SSTFamily.B) b.push(i);
263
+ else c.push(i);
264
+ }
265
+
266
+ return { a, b, c };
267
+ }
268
+
269
+ // =============================================================================
270
+ // SYNERGY MATRIX FUNCTIONS
271
+ // =============================================================================
272
+
273
+ /**
274
+ * Generate a Fibonacci-style sequence starting with a specific seed.
275
+ * Each term is the digital root of the sum of the previous two.
276
+ *
277
+ * @param {number} seed - Starting digit 1-9
278
+ * @param {number} length - How many terms
279
+ * @returns {number[]}
280
+ */
281
+ export function generateFibonacciSequence(seed, length = 24) {
282
+ if (seed < 1 || seed > 9) throw new Error('Seed must be 1-9');
283
+
284
+ const sequence = [seed, seed]; // Start with seed, seed
285
+
286
+ for (let i = 2; i < length; i++) {
287
+ const sum = sequence[i - 1] + sequence[i - 2];
288
+ sequence.push(digitalRoot(sum));
289
+ }
290
+
291
+ return sequence;
292
+ }
293
+
294
+ /**
295
+ * Generate the full Synergy Matrix - 9 Fibonacci-style sequences.
296
+ * Each row starts with digit 1-9 repeated, then follows Fibonacci addition.
297
+ * All values reduced to digital roots.
298
+ *
299
+ * @param {number} length - How many columns
300
+ * @returns {number[][]} - 9 rows of digital roots
301
+ */
302
+ export function generateSynergyMatrix(length = 24) {
303
+ const matrix = [];
304
+
305
+ for (let seed = 1; seed <= 9; seed++) {
306
+ matrix.push(generateFibonacciSequence(seed, length));
307
+ }
308
+
309
+ return matrix;
310
+ }
311
+
312
+ /**
313
+ * Get the family pattern for a Synergy Matrix row.
314
+ *
315
+ * @param {number[]} row - Digital root sequence
316
+ * @returns {Int8Array} - Trit pattern
317
+ */
318
+ export function rowToFamilyPattern(row) {
319
+ const trits = new Int8Array(row.length);
320
+ for (let i = 0; i < row.length; i++) {
321
+ trits[i] = toFamilyTrit(row[i]).value;
322
+ }
323
+ return trits;
324
+ }
325
+
326
+ /**
327
+ * Convert entire Synergy Matrix to trit patterns.
328
+ *
329
+ * @param {number[][]} matrix
330
+ * @returns {Int8Array[]}
331
+ */
332
+ export function matrixToTritPatterns(matrix) {
333
+ return matrix.map(row => rowToFamilyPattern(row));
334
+ }
335
+
336
+ // =============================================================================
337
+ // TRUST GEOMETRY FUNCTIONS
338
+ // =============================================================================
339
+
340
+ /**
341
+ * Calculate trust propagation based on hop distance.
342
+ * Uses the Synergy Triangle ratios (1/√3 decay).
343
+ *
344
+ * @param {number} baseTrust - Original trust score (0-1)
345
+ * @param {number} hops - Number of hops from source
346
+ * @returns {number} - Propagated trust score
347
+ */
348
+ export function propagateTrust(baseTrust, hops) {
349
+ if (hops < 0) throw new Error('Hops cannot be negative');
350
+ if (hops === 0) return baseTrust * TRUST_PROPAGATION.DIRECT;
351
+ if (hops === 1) return baseTrust * TRUST_PROPAGATION.ONE_HOP;
352
+ if (hops === 2) return baseTrust * TRUST_PROPAGATION.TWO_HOPS;
353
+ if (hops === 3) return baseTrust * TRUST_PROPAGATION.THREE_HOPS;
354
+
355
+ // Beyond 3 hops: general formula 1/√(3^hops) = 3^(-hops/2)
356
+ return baseTrust * Math.pow(3, -hops / 2);
357
+ }
358
+
359
+ /**
360
+ * Get trust decay half-life based on trust angle.
361
+ *
362
+ * Shallow (30°): Fast decay, low commitment
363
+ * Balanced (60°): Medium decay
364
+ * Deep (90°): Slow decay, high commitment
365
+ *
366
+ * @param {number} angle - 30, 60, or 90
367
+ * @returns {number} - Half-life in milliseconds
368
+ */
369
+ export function trustHalfLife(angle) {
370
+ const HOUR = 3600 * 1000;
371
+ const DAY = 24 * HOUR;
372
+
373
+ switch (angle) {
374
+ case SynergyAngles.BASE: return 1 * DAY; // 24 hours
375
+ case SynergyAngles.MIDDLE: return 7 * DAY; // 1 week
376
+ case SynergyAngles.APEX: return 90 * DAY; // ~3 months
377
+ default: return 7 * DAY;
378
+ }
379
+ }
380
+
381
+ /**
382
+ * Calculate decayed trust based on time elapsed and angle.
383
+ *
384
+ * @param {number} initialTrust - Starting trust (0-1)
385
+ * @param {number} elapsedMs - Time since trust was established
386
+ * @param {number} angle - Trust angle (30, 60, or 90)
387
+ * @returns {number} - Current trust level
388
+ */
389
+ export function decayTrust(initialTrust, elapsedMs, angle = SynergyAngles.MIDDLE) {
390
+ const halfLife = trustHalfLife(angle);
391
+ const decayFactor = Math.pow(0.5, elapsedMs / halfLife);
392
+ return initialTrust * decayFactor;
393
+ }
394
+
395
+ // =============================================================================
396
+ // HEXAGONAL GEOMETRY (PRAMAAN INTEGRATION)
397
+ // =============================================================================
398
+
399
+ /**
400
+ * Axial coordinates for hexagonal grid.
401
+ * Uses "pointy-top" orientation aligned with 30-60-90 triangles.
402
+ */
403
+ export class HexCoord {
404
+ /**
405
+ * @param {number} q - Column coordinate
406
+ * @param {number} r - Row coordinate
407
+ */
408
+ constructor(q, r) {
409
+ this.q = q;
410
+ this.r = r;
411
+ }
412
+
413
+ /** Get the implicit s coordinate (q + r + s = 0) */
414
+ get s() {
415
+ return -this.q - this.r;
416
+ }
417
+
418
+ /** Get the 6 neighbor cells */
419
+ neighbors() {
420
+ return [
421
+ new HexCoord(this.q + 1, this.r), // E
422
+ new HexCoord(this.q + 1, this.r - 1), // NE
423
+ new HexCoord(this.q, this.r - 1), // NW
424
+ new HexCoord(this.q - 1, this.r), // W
425
+ new HexCoord(this.q - 1, this.r + 1), // SW
426
+ new HexCoord(this.q, this.r + 1), // SE
427
+ ];
428
+ }
429
+
430
+ /** Distance to another hex cell (in cells) */
431
+ distanceTo(other) {
432
+ return Math.max(
433
+ Math.abs(this.q - other.q),
434
+ Math.abs(this.r - other.r),
435
+ Math.abs(this.s - other.s)
436
+ );
437
+ }
438
+
439
+ /** Check equality */
440
+ equals(other) {
441
+ return this.q === other.q && this.r === other.r;
442
+ }
443
+
444
+ /** String representation */
445
+ toString() {
446
+ return `Hex(${this.q}, ${this.r})`;
447
+ }
448
+
449
+ /**
450
+ * Round fractional hex coordinates to nearest integer hex.
451
+ * @param {number} q - Fractional q
452
+ * @param {number} r - Fractional r
453
+ * @returns {HexCoord}
454
+ */
455
+ static round(q, r) {
456
+ const s = -q - r;
457
+
458
+ let rq = Math.round(q);
459
+ let rr = Math.round(r);
460
+ let rs = Math.round(s);
461
+
462
+ const qDiff = Math.abs(rq - q);
463
+ const rDiff = Math.abs(rr - r);
464
+ const sDiff = Math.abs(rs - s);
465
+
466
+ if (qDiff > rDiff && qDiff > sDiff) {
467
+ rq = -rr - rs;
468
+ } else if (rDiff > sDiff) {
469
+ rr = -rq - rs;
470
+ }
471
+
472
+ return new HexCoord(rq, rr);
473
+ }
474
+
475
+ /** Origin cell */
476
+ static origin() {
477
+ return new HexCoord(0, 0);
478
+ }
479
+ }
480
+
481
+ /**
482
+ * Get all hex cells in a ring around a center.
483
+ * Ring 0 = just the center, Ring 1 = 6 cells, Ring 2 = 12 cells, etc.
484
+ *
485
+ * @param {HexCoord} center
486
+ * @param {number} radius
487
+ * @returns {HexCoord[]}
488
+ */
489
+ export function hexRing(center, radius) {
490
+ if (radius === 0) return [center];
491
+
492
+ const results = [];
493
+ let hex = new HexCoord(center.q + radius, center.r - radius);
494
+
495
+ // 6 directions, radius steps each
496
+ const directions = [
497
+ [0, 1], [-1, 1], [-1, 0], [0, -1], [1, -1], [1, 0]
498
+ ];
499
+
500
+ for (const [dq, dr] of directions) {
501
+ for (let i = 0; i < radius; i++) {
502
+ results.push(hex);
503
+ hex = new HexCoord(hex.q + dq, hex.r + dr);
504
+ }
505
+ }
506
+
507
+ return results;
508
+ }
509
+
510
+ /**
511
+ * Get all hex cells in a filled hexagon (disk) around a center.
512
+ *
513
+ * @param {HexCoord} center
514
+ * @param {number} radius
515
+ * @returns {HexCoord[]}
516
+ */
517
+ export function hexDisk(center, radius) {
518
+ const results = [];
519
+ for (let r = 0; r <= radius; r++) {
520
+ results.push(...hexRing(center, r));
521
+ }
522
+ return results;
523
+ }
524
+
525
+ /**
526
+ * Calculate number of cells in a hex disk of given radius.
527
+ * Formula: 3*r*(r+1) + 1
528
+ *
529
+ * @param {number} radius
530
+ * @returns {number}
531
+ */
532
+ export function hexDiskSize(radius) {
533
+ return 3 * radius * (radius + 1) + 1;
534
+ }
535
+
536
+ // =============================================================================
537
+ // EXPORTS
538
+ // =============================================================================
539
+
540
+ export default {
541
+ // Constants
542
+ SSTFamily,
543
+ FIBONACCI_CYCLE_24,
544
+ FAMILY_TO_TRIT,
545
+ SynergyAngles,
546
+ TRUST_PROPAGATION,
547
+ HEX_CELL_SIZES,
548
+
549
+ // Digital Root
550
+ digitalRoot,
551
+ getFamily,
552
+ getFamilyOf,
553
+ toFamilyTrit,
554
+ bytesToFamilyTrits,
555
+ analyzeBytesFamilies,
556
+
557
+ // Fibonacci Cycle
558
+ fibonacciRoot,
559
+ fibonacciFamily,
560
+ fibonacciFamilyTrit,
561
+ analyzeFibonacciCycle,
562
+
563
+ // Synergy Matrix
564
+ generateFibonacciSequence,
565
+ generateSynergyMatrix,
566
+ rowToFamilyPattern,
567
+ matrixToTritPatterns,
568
+
569
+ // Trust Geometry
570
+ propagateTrust,
571
+ trustHalfLife,
572
+ decayTrust,
573
+
574
+ // Hexagonal Geometry
575
+ HexCoord,
576
+ hexRing,
577
+ hexDisk,
578
+ hexDiskSize,
579
+ };