yakmesh 2.8.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +637 -0
- package/CONTRIBUTING.md +42 -0
- package/Caddyfile +77 -0
- package/README.md +119 -29
- package/adapters/adapter-mlv-bible/README.md +124 -0
- package/adapters/adapter-mlv-bible/index.js +400 -0
- package/adapters/chat-mod-adapter.js +532 -0
- package/adapters/content-adapter.js +273 -0
- package/content/api.js +50 -41
- package/content/index.js +2 -2
- package/content/store.js +355 -173
- package/dashboard/index.html +19 -3
- package/database/replication.js +117 -37
- package/docs/CRYPTO-AGILITY.md +204 -0
- package/docs/MTLS-RESEARCH.md +367 -0
- package/docs/NAMCHE-SPEC.md +681 -0
- package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
- package/docs/PRECISION-DISCLOSURE.md +96 -0
- package/docs/README.md +76 -0
- package/docs/ROADMAP-2.4.0.md +447 -0
- package/docs/ROADMAP-2.5.0.md +244 -0
- package/docs/SECURITY-AUDIT-REPORT.md +306 -0
- package/docs/SST-INTEGRATION.md +712 -0
- package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
- package/docs/TERNARY-AUDIT-REPORT.md +247 -0
- package/docs/TME-FAQ.md +221 -0
- package/docs/WHITEPAPER.md +623 -0
- package/docs/adapters.html +1001 -0
- package/docs/advanced-systems.html +1045 -0
- package/docs/annex.html +1046 -0
- package/docs/api.html +970 -0
- package/docs/business/response-templates.md +160 -0
- package/docs/c2c.html +1225 -0
- package/docs/cli.html +1332 -0
- package/docs/configuration.html +1248 -0
- package/docs/darshan.html +1085 -0
- package/docs/dharma.html +966 -0
- package/docs/docs-bundle.html +1075 -0
- package/docs/docs.css +3120 -0
- package/docs/docs.js +556 -0
- package/docs/doko.html +969 -0
- package/docs/geo-proof.html +858 -0
- package/docs/getting-started.html +840 -0
- package/docs/gumba-tutorial.html +1144 -0
- package/docs/gumba.html +1098 -0
- package/docs/index.html +914 -0
- package/docs/jhilke.html +1312 -0
- package/docs/karma.html +1100 -0
- package/docs/katha.html +1037 -0
- package/docs/lama.html +978 -0
- package/docs/mandala.html +1067 -0
- package/docs/mani.html +964 -0
- package/docs/mantra.html +967 -0
- package/docs/mesh.html +1409 -0
- package/docs/nakpak.html +869 -0
- package/docs/namche.html +928 -0
- package/docs/nav-order.json +53 -0
- package/docs/prahari.html +1043 -0
- package/docs/prism-bash.min.js +1 -0
- package/docs/prism-javascript.min.js +1 -0
- package/docs/prism-json.min.js +1 -0
- package/docs/prism-tomorrow.min.css +1 -0
- package/docs/prism.min.js +1 -0
- package/docs/privacy.html +699 -0
- package/docs/quick-reference.html +1181 -0
- package/docs/sakshi.html +1402 -0
- package/docs/sandboxing.md +386 -0
- package/docs/seva.html +911 -0
- package/docs/sherpa.html +871 -0
- package/docs/studio.html +860 -0
- package/docs/stupa.html +995 -0
- package/docs/tailwind.min.css +2 -0
- package/docs/tattva.html +1332 -0
- package/docs/terms.html +686 -0
- package/docs/time-server-deployment.md +166 -0
- package/docs/time-sources.html +1392 -0
- package/docs/tivra.html +1127 -0
- package/docs/trademark-policy.html +686 -0
- package/docs/tribhuj.html +1183 -0
- package/docs/trust-security.html +1029 -0
- package/docs/tutorials/backup-recovery.html +654 -0
- package/docs/tutorials/dashboard.html +604 -0
- package/docs/tutorials/domain-setup.html +605 -0
- package/docs/tutorials/host-website.html +456 -0
- package/docs/tutorials/mesh-network.html +505 -0
- package/docs/tutorials/mobile-access.html +445 -0
- package/docs/tutorials/privacy.html +467 -0
- package/docs/tutorials/raspberry-pi.html +600 -0
- package/docs/tutorials/security-basics.html +539 -0
- package/docs/tutorials/share-files.html +431 -0
- package/docs/tutorials/troubleshooting.html +637 -0
- package/docs/tutorials/trust-karma.html +419 -0
- package/docs/tutorials/yak-protocol.html +456 -0
- package/docs/tutorials.html +1034 -0
- package/docs/vani.html +1270 -0
- package/docs/webserver.html +809 -0
- package/docs/yak-protocol.html +940 -0
- package/docs/yak-timeserver-design.md +475 -0
- package/docs/yakapp.html +1015 -0
- package/docs/ypc27.html +1069 -0
- package/docs/yurt.html +1344 -0
- package/embedded-docs/bundle.js +334 -74
- package/gossip/protocol.js +247 -27
- package/identity/key-resolver.js +262 -0
- package/identity/machine-seed.js +632 -0
- package/identity/node-key.js +669 -368
- package/identity/tribhuj-ratchet.js +506 -0
- package/knowledge-base.js +37 -8
- package/launcher/yakmesh.bat +62 -0
- package/launcher/yakmesh.sh +70 -0
- package/mesh/annex.js +462 -108
- package/mesh/beacon-broadcast.js +113 -1
- package/mesh/darshan.js +1718 -0
- package/mesh/gumba.js +1567 -0
- package/mesh/jhilke.js +651 -0
- package/mesh/katha.js +1012 -0
- package/mesh/nakpak-routing.js +8 -5
- package/mesh/network.js +724 -34
- package/mesh/pulse-sync.js +4 -1
- package/mesh/rate-limiter.js +127 -15
- package/mesh/seva.js +526 -0
- package/mesh/sherpa-discovery.js +89 -8
- package/mesh/sybil-defense.js +19 -5
- package/mesh/temporal-encoder.js +4 -3
- package/mesh/vani.js +1364 -0
- package/mesh/yurt.js +1340 -0
- package/models/entropy-sentinel.onnx +0 -0
- package/models/karma-trust.onnx +0 -0
- package/models/manifest.json +43 -0
- package/models/sakshi-anomaly.onnx +0 -0
- package/oracle/code-proof-protocol.js +7 -6
- package/oracle/codebase-lock.js +257 -28
- package/oracle/index.js +74 -15
- package/oracle/ma902-snmp.js +678 -0
- package/oracle/module-sealer.js +5 -3
- package/oracle/network-identity.js +16 -0
- package/oracle/packet-checksum.js +201 -0
- package/oracle/sst.js +579 -0
- package/oracle/ternary-144t.js +714 -0
- package/oracle/ternary-ml.js +481 -0
- package/oracle/time-api.js +239 -0
- package/oracle/time-source.js +137 -47
- package/oracle/validation-oracle-hardened.js +1111 -1071
- package/oracle/validation-oracle.js +4 -2
- package/oracle/ypc27.js +211 -0
- package/package.json +20 -3
- package/protocol/yak-handler.js +35 -9
- package/protocol/yak-protocol.js +28 -13
- package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
- package/reference/cpp/yakmesh_ypc27.cpp +179 -0
- package/sbom.json +87 -0
- package/scripts/security-audit.mjs +264 -0
- package/scripts/update-docs-nav.js +194 -0
- package/scripts/update-docs-sidebar.cjs +164 -0
- package/security/crypto-config.js +4 -3
- package/security/dharma-moderation.js +517 -0
- package/security/doko-identity.js +193 -143
- package/security/domain-consensus.js +86 -85
- package/security/fs-hardening.js +620 -0
- package/security/hardware-attestation.js +5 -3
- package/security/hybrid-trust.js +227 -87
- package/security/karma-rate-limiter.js +692 -0
- package/security/khata-protocol.js +22 -21
- package/security/khata-trust-integration.js +277 -150
- package/security/memory-safety.js +635 -0
- package/security/mesh-auth.js +11 -10
- package/security/mesh-revocation.js +373 -5
- package/security/namche-gateway.js +298 -69
- package/security/sakshi.js +460 -3
- package/security/sangha.js +770 -0
- package/security/secure-config.js +473 -0
- package/security/silicon-parity.js +13 -10
- package/security/steadywatch.js +1142 -0
- package/security/strike-system.js +32 -3
- package/security/temporal-signing.js +488 -0
- package/security/trit-commitment.js +464 -0
- package/server/crypto/annex.js +247 -0
- package/server/darshan-api.js +343 -0
- package/server/index.js +3259 -362
- package/server/komm-api.js +668 -0
- package/utils/accel.js +2273 -0
- package/utils/ternary-id.js +79 -0
- package/utils/verify-worker.js +57 -0
- package/webserver/index.js +95 -5
- package/assets/yakmesh-logo.png +0 -0
- package/assets/yakmesh-logo.svg +0 -80
- package/assets/yakmesh-logo2.png +0 -0
- package/assets/yakmesh-logo2sm.png +0 -0
- package/assets/ymsm.png +0 -0
- package/website/assets/silhouettes/adapters.svg +0 -107
- package/website/assets/silhouettes/api-endpoints.svg +0 -115
- package/website/assets/silhouettes/atomic-clock.svg +0 -83
- package/website/assets/silhouettes/base-camp.svg +0 -81
- package/website/assets/silhouettes/bridge.svg +0 -69
- package/website/assets/silhouettes/docs-bundle.svg +0 -113
- package/website/assets/silhouettes/doko-basket.svg +0 -70
- package/website/assets/silhouettes/fortress.svg +0 -93
- package/website/assets/silhouettes/gateway.svg +0 -54
- package/website/assets/silhouettes/gears.svg +0 -93
- package/website/assets/silhouettes/globe-satellite.svg +0 -67
- package/website/assets/silhouettes/karma-wheel.svg +0 -137
- package/website/assets/silhouettes/lama-council.svg +0 -141
- package/website/assets/silhouettes/mandala-network.svg +0 -169
- package/website/assets/silhouettes/mani-stones.svg +0 -149
- package/website/assets/silhouettes/mantra-wheel.svg +0 -116
- package/website/assets/silhouettes/mesh-nodes.svg +0 -113
- package/website/assets/silhouettes/nakpak.svg +0 -56
- package/website/assets/silhouettes/peak-lightning.svg +0 -73
- package/website/assets/silhouettes/sherpa.svg +0 -69
- package/website/assets/silhouettes/stupa-tower.svg +0 -119
- package/website/assets/silhouettes/tattva-eye.svg +0 -78
- package/website/assets/silhouettes/terminal.svg +0 -74
- package/website/assets/silhouettes/webserver.svg +0 -145
- package/website/assets/silhouettes/yak.svg +0 -78
- package/website/assets/yakmesh-logo.png +0 -0
- package/website/assets/yakmesh-logo.webp +0 -0
- package/website/assets/yakmesh-logo128x140.webp +0 -0
- package/website/assets/yakmesh-logo2.png +0 -0
- package/website/assets/yakmesh-logo2.svg +0 -51
- package/website/assets/yakmesh-logo40x44.webp +0 -0
- package/website/assets/yakmesh.gif +0 -0
- package/website/assets/yakmesh.ico +0 -0
- package/website/assets/yakmesh.jpg +0 -0
- package/website/assets/yakmesh.pdf +0 -0
- package/website/assets/yakmesh.png +0 -0
- package/website/assets/yakmesh.svg +0 -70
- package/website/assets/yakmesh128.webp +0 -0
- package/website/assets/yakmesh32.png +0 -0
- package/website/assets/yakmesh32.svg +0 -65
- package/website/assets/yakmesh32o.ico +0 -2
- package/website/assets/yakmesh32o.svg +0 -65
- package/website/assets/yakmesh32o.svgz +0 -0
|
@@ -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
|
+
});
|
package/webserver/index.js
CHANGED
|
@@ -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 ||
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/assets/yakmesh-logo.png
DELETED
|
Binary file
|