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,79 @@
1
+ /**
2
+ * TERNARY-ID — Balanced ternary identifier generation for YAKMESH
3
+ *
4
+ * Generates random identifiers using balanced ternary encoding (TRIBHUJ convention).
5
+ * Output alphabet: { T, 0, 1 } — the sequence '666' is IMPOSSIBLE BY DESIGN.
6
+ *
7
+ * T = negative (-1), 0 = neutral, 1 = positive
8
+ *
9
+ * Math: Each byte maps to 5 balanced trits (3⁵ = 243 ≈ 256).
10
+ * 16 random bytes → 80-trit identifier (128 bits entropy).
11
+ * 32 random bytes → 160-trit identifier (256 bits entropy).
12
+ *
13
+ * Why balanced ternary?
14
+ * - Optimal radix economy (closest integer to e ≈ 2.718)
15
+ * - Native to YAKMESH's TRIBHUJ, YPC-27, and SST systems
16
+ * - Self-inverting negation (no complement overhead)
17
+ * - Eliminates adversarial number sequences at the encoding level
18
+ *
19
+ * @module utils/ternary-id
20
+ * @license MIT
21
+ * @copyright 2026 YAKMESH™ Contributors
22
+ */
23
+
24
+ import { randomBytes } from '@noble/hashes/utils.js';
25
+
26
+ // TRIBHUJ convention: -1 → 'T', 0 → '0', 1 → '1'
27
+ // Index maps mod-3 remainder: 0→'0', 1→'1', 2→'T' (balanced -1)
28
+ const TRIT_CHARS = ['0', '1', 'T'];
29
+
30
+ /**
31
+ * Convert raw bytes to a balanced ternary string (TRIBHUJ notation).
32
+ * Each byte → 5 trits via mod-243 decomposition.
33
+ *
34
+ * @param {Uint8Array} bytes - Raw bytes to encode
35
+ * @returns {string} Balanced ternary string using {T, 0, 1}
36
+ */
37
+ export function bytesToTernary(bytes) {
38
+ let result = '';
39
+ for (let i = 0; i < bytes.length; i++) {
40
+ let val = bytes[i] % 243; // 3⁵ = 243, handle 243-255 range
41
+ for (let k = 0; k < 5; k++) {
42
+ result += TRIT_CHARS[val % 3];
43
+ val = Math.floor(val / 3);
44
+ }
45
+ }
46
+ return result;
47
+ }
48
+
49
+ /**
50
+ * Generate a random balanced ternary identifier.
51
+ *
52
+ * Output is TRIBHUJ-notation: only chars {T, 0, 1}.
53
+ * The substring '666' cannot appear — guaranteed by alphabet.
54
+ *
55
+ * @param {number} [nBytes=16] - Bytes of randomness (16 = 128-bit, 32 = 256-bit)
56
+ * @returns {string} Random ternary identifier (nBytes × 5 chars)
57
+ *
58
+ * @example
59
+ * ternaryId(16) // → "T01100T1010T0110T01T01001T10T..." (80 chars)
60
+ * ternaryId(32) // → 160-char identifier
61
+ */
62
+ export function ternaryId(nBytes = 16) {
63
+ return bytesToTernary(randomBytes(nBytes));
64
+ }
65
+
66
+ /**
67
+ * Convert an existing hex string to balanced ternary.
68
+ * Useful for migrating hash displays or existing hex IDs.
69
+ *
70
+ * @param {string} hex - Hex string to convert
71
+ * @returns {string} Balanced ternary representation
72
+ */
73
+ export function hexToTernary(hex) {
74
+ const bytes = new Uint8Array(hex.length / 2);
75
+ for (let i = 0; i < bytes.length; i++) {
76
+ bytes[i] = parseInt(hex.substr(i * 2, 2), 16);
77
+ }
78
+ return bytesToTernary(bytes);
79
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ACCEL Verify Worker — ML-DSA-65 Batch Verification Worker Thread
3
+ *
4
+ * Receives chunks of signature/message/publicKey triples from the
5
+ * BatchVerifyQueue and verifies them using @noble/post-quantum.
6
+ * Each worker runs in its own V8 isolate for true CPU parallelism.
7
+ *
8
+ * The parent thread distributes batch chunks across a pool of these
9
+ * workers (sized to CPU core count), achieving near-linear speedup
10
+ * for large verification batches on multi-core processors.
11
+ *
12
+ * Architecture:
13
+ * BatchVerifyQueue._flush()
14
+ * → splits batch into N chunks (N = available workers)
15
+ * → postMessage({ id, items }) to each worker
16
+ * → worker verifies chunk and postMessage({ id, results }) back
17
+ * → parent resolves/rejects the original enqueue() promises
18
+ *
19
+ * Note: This worker uses @noble/post-quantum directly. If a native
20
+ * PQ addon (liboqs) is installed, the main thread's sequential
21
+ * fallback path will use it, but workers use pure JS. A future
22
+ * enhancement could probe and load native PQ in each worker.
23
+ *
24
+ * @module utils/verify-worker
25
+ * @version 1.0.0
26
+ */
27
+
28
+ import { parentPort } from 'worker_threads';
29
+ import { ml_dsa65 } from '@noble/post-quantum/ml-dsa.js';
30
+
31
+ /**
32
+ * Process a batch of ML-DSA-65 verification requests.
33
+ *
34
+ * @message {{ id: number, items: Array<{ signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array }> }}
35
+ * @response {{ id: number, results: Array<{ ok: boolean, err: string|null }> }}
36
+ */
37
+ parentPort.on('message', ({ id, items }) => {
38
+ const results = new Array(items.length);
39
+
40
+ for (let i = 0; i < items.length; i++) {
41
+ const { signature, message, publicKey } = items[i];
42
+ try {
43
+ results[i] = {
44
+ ok: ml_dsa65.verify(
45
+ new Uint8Array(signature),
46
+ new Uint8Array(message),
47
+ new Uint8Array(publicKey)
48
+ ),
49
+ err: null,
50
+ };
51
+ } catch (err) {
52
+ results[i] = { ok: false, err: err.message };
53
+ }
54
+ }
55
+
56
+ parentPort.postMessage({ id, results });
57
+ });
@@ -37,7 +37,7 @@ export class YakmeshWebServer {
37
37
  constructor(config = {}) {
38
38
  this.config = {
39
39
  port: config.port || 8080,
40
- httpsPort: config.httpsPort || 8443,
40
+ httpsPort: config.httpsPort || 443,
41
41
  root: config.root || './htdocs',
42
42
  logPath: config.logPath || './logs',
43
43
  caddyPath: config.caddyPath || join(__dirname, 'bin'),
@@ -45,6 +45,11 @@ export class YakmeshWebServer {
45
45
  domain: config.domain || null,
46
46
  phpEnabled: config.phpEnabled ?? false,
47
47
  phpPort: config.phpPort || 9000,
48
+ // Yakmesh node proxy settings
49
+ nodeProxy: config.nodeProxy ?? true,
50
+ nodeHttpPort: config.nodeHttpPort || 3080,
51
+ nodeWsPort: config.nodeWsPort || 9080,
52
+ acmeEmail: config.acmeEmail || null,
48
53
  ...config
49
54
  };
50
55
 
@@ -102,30 +107,92 @@ export class YakmeshWebServer {
102
107
  reverse_proxy localhost:${this.config.phpPort}
103
108
  }` : '';
104
109
 
110
+ // Yakmesh node reverse proxy with WebSocket support
111
+ const nodeProxyBlock = this.config.nodeProxy ? `
112
+ # Yakmesh mesh WebSocket endpoint (priority)
113
+ @meshWs {
114
+ path /mesh/ws
115
+ header Connection *Upgrade*
116
+ header Upgrade websocket
117
+ }
118
+ handle @meshWs {
119
+ reverse_proxy localhost:${this.config.nodeWsPort}
120
+ }
121
+
122
+ # Yakmesh mesh HTTP endpoints
123
+ @meshHttp {
124
+ path /mesh/*
125
+ path /health
126
+ path /beacon
127
+ path /.well-known/yakmesh/*
128
+ path /api/*
129
+ path /komm/*
130
+ path /darshan/*
131
+ path /rumors
132
+ path /gossip/*
133
+ path /dashboard
134
+ path /dashboard/*
135
+ path /docs
136
+ path /docs/*
137
+ }
138
+ handle @meshHttp {
139
+ reverse_proxy localhost:${this.config.nodeHttpPort}
140
+ }
141
+
142
+ # KOMM WebSocket
143
+ @kommWs {
144
+ path /komm/ws
145
+ header Connection *Upgrade*
146
+ header Upgrade websocket
147
+ }
148
+ handle @kommWs {
149
+ reverse_proxy localhost:${this.config.nodeHttpPort}
150
+ }` : '';
151
+
105
152
  if (this.config.domain && this.config.autoHttps) {
153
+ const acmeBlock = this.config.acmeEmail ? `
154
+ {
155
+ email ${this.config.acmeEmail}
156
+ }
157
+ ` : '';
106
158
  return `# Yakmesh Web Server - ${this.config.domain}
159
+ # Auto-HTTPS via Let's Encrypt
160
+ ${acmeBlock}
107
161
  ${this.config.domain} {
162
+ ${nodeProxyBlock}
163
+ ${phpBlock}
164
+
165
+ # Static files fallback
108
166
  root * ${this.config.root}
109
167
  file_server
110
- ${phpBlock}
111
168
 
112
169
  header {
113
170
  X-Content-Type-Options nosniff
114
171
  X-Frame-Options DENY
172
+ Strict-Transport-Security "max-age=31536000; includeSubDomains"
173
+ }
174
+
175
+ log {
176
+ output file ${this.config.logPath}/access.log
177
+ format json
115
178
  }
116
179
  }`;
117
180
  }
118
181
 
119
- return `# Yakmesh Web Server
182
+ // Local/dev mode without HTTPS
183
+ return `# Yakmesh Web Server (Local Mode)
120
184
  {
121
185
  admin off
122
186
  auto_https off
123
187
  }
124
188
 
125
189
  :${this.config.port} {
190
+ ${nodeProxyBlock}
191
+ ${phpBlock}
192
+
193
+ # Static files fallback
126
194
  root * ${this.config.root}
127
195
  file_server
128
- ${phpBlock}
129
196
 
130
197
  header {
131
198
  X-Content-Type-Options nosniff
@@ -163,7 +230,30 @@ const caddyfilePath = this.writeCaddyfile();
163
230
  });
164
231
 
165
232
  this.process.stdout.on('data', (d) => log.debug('Caddy output', { message: d.toString().trim() }));
166
- this.process.stderr.on('data', (d) => log.error('Caddy error', { message: d.toString().trim() }));
233
+
234
+ // Caddy writes JSON logs to stderr - parse level and route appropriately
235
+ this.process.stderr.on('data', (d) => {
236
+ const msg = d.toString().trim();
237
+ // Each line may be a separate JSON log entry
238
+ for (const line of msg.split('\n')) {
239
+ try {
240
+ const parsed = JSON.parse(line);
241
+ const level = parsed.level || 'info';
242
+ const logMsg = parsed.msg || line;
243
+ if (level === 'error' || level === 'fatal') {
244
+ log.error('Caddy', { level, msg: logMsg });
245
+ } else if (level === 'warn') {
246
+ log.warn('Caddy', { level, msg: logMsg });
247
+ } else {
248
+ log.debug('Caddy', { level, msg: logMsg });
249
+ }
250
+ } catch {
251
+ // Not JSON - log as debug (probably startup banner)
252
+ log.debug('Caddy', { message: line });
253
+ }
254
+ }
255
+ });
256
+
167
257
  this.process.on('close', (code) => { this.running = false; });
168
258
 
169
259
  this.running = true;
Binary file