@nekzus/liop 2.4.6 → 2.5.0-beta.2

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 (95) hide show
  1. package/NOTICE +19 -0
  2. package/README.md +66 -34
  3. package/dist/bin/agent.js +673 -82
  4. package/dist/bin/agent.js.map +1 -1
  5. package/dist/bridge.d.ts +3 -3
  6. package/dist/bridge.js +3 -3
  7. package/dist/{chunk-PYKRQAER.js → chunk-2KSO3W4A.js} +2 -2
  8. package/dist/chunk-2KSO3W4A.js.map +1 -0
  9. package/dist/{chunk-32ADSAJS.js → chunk-2STZHJ24.js} +14 -4
  10. package/dist/chunk-2STZHJ24.js.map +1 -0
  11. package/dist/chunk-3QH44NKZ.js +115 -0
  12. package/dist/chunk-3QH44NKZ.js.map +1 -0
  13. package/dist/{chunk-WCCGE4QR.js → chunk-5SWHE62F.js} +196 -33
  14. package/dist/chunk-5SWHE62F.js.map +1 -0
  15. package/dist/{chunk-SONUORBT.js → chunk-7BSCUYUE.js} +2 -2
  16. package/dist/chunk-7BSCUYUE.js.map +1 -0
  17. package/dist/{chunk-QLCOEP5J.js → chunk-7PITYWOV.js} +2 -2
  18. package/dist/chunk-7PITYWOV.js.map +1 -0
  19. package/dist/{chunk-T5IUZF47.js → chunk-EJ426URA.js} +109 -7
  20. package/dist/chunk-EJ426URA.js.map +1 -0
  21. package/dist/{chunk-CRZBVFDV.js → chunk-FCFTYOAS.js} +243 -66
  22. package/dist/chunk-FCFTYOAS.js.map +1 -0
  23. package/dist/chunk-FTF6AMF6.js +3 -0
  24. package/dist/{chunk-RWRRBYG4.js.map → chunk-FTF6AMF6.js.map} +1 -1
  25. package/dist/{chunk-OUUTDSOW.js → chunk-IK7CGWAZ.js} +3 -3
  26. package/dist/chunk-IK7CGWAZ.js.map +1 -0
  27. package/dist/chunk-K3DGJLUY.js +106 -0
  28. package/dist/chunk-K3DGJLUY.js.map +1 -0
  29. package/dist/{chunk-U5BZ66VX.js → chunk-PAICJCKJ.js} +60 -175
  30. package/dist/chunk-PAICJCKJ.js.map +1 -0
  31. package/dist/chunk-PUDETPL4.js +279 -0
  32. package/dist/chunk-PUDETPL4.js.map +1 -0
  33. package/dist/{chunk-547TYL27.js → chunk-UJFWPRDM.js} +164 -1389
  34. package/dist/chunk-UJFWPRDM.js.map +1 -0
  35. package/dist/chunk-VRB5HUYU.js +1492 -0
  36. package/dist/chunk-VRB5HUYU.js.map +1 -0
  37. package/dist/{chunk-GA3Q2S7O.js → chunk-VRDZ5IKE.js} +5 -5
  38. package/dist/chunk-VRDZ5IKE.js.map +1 -0
  39. package/dist/chunk-WPTOJYN5.js +181 -0
  40. package/dist/chunk-WPTOJYN5.js.map +1 -0
  41. package/dist/{chunk-74CISO2I.js → chunk-XRDN232O.js} +28 -4
  42. package/dist/chunk-XRDN232O.js.map +1 -0
  43. package/dist/{chunk-JIJPZFR2.js → chunk-Y62GORQF.js} +2 -2
  44. package/dist/chunk-Y62GORQF.js.map +1 -0
  45. package/dist/chunk-ZP3VVXOI.js +66 -0
  46. package/dist/chunk-ZP3VVXOI.js.map +1 -0
  47. package/dist/client.d.ts +4 -3
  48. package/dist/client.js +10 -8
  49. package/dist/gateway.d.ts +4 -4
  50. package/dist/gateway.js +10 -9
  51. package/dist/{hybrid-CF__0YnC.d.ts → hybrid-DWe1bMoV.d.ts} +5 -4
  52. package/dist/{index-cMV0_yD9.d.ts → index-BuEQtBHD.d.ts} +39 -34
  53. package/dist/{index-BW95kAL4.d.ts → index-CdW8j8Bn.d.ts} +9 -72
  54. package/dist/index.d.ts +172 -48
  55. package/dist/index.js +20 -15
  56. package/dist/index.js.map +1 -1
  57. package/dist/kyber-CGOA7Q6A.js +3 -0
  58. package/dist/{kyber-3ULIJSE3.js.map → kyber-CGOA7Q6A.js.map} +1 -1
  59. package/dist/mesh.d.ts +27 -143
  60. package/dist/mesh.js +4 -3
  61. package/dist/node-B0b2vUFS.d.ts +164 -0
  62. package/dist/protocol/liop_core.proto +3 -0
  63. package/dist/server.d.ts +3 -3
  64. package/dist/server.js +7 -6
  65. package/dist/types-CzRSOlOo.d.ts +452 -0
  66. package/dist/types.d.ts +1 -1
  67. package/dist/types.js +1 -1
  68. package/dist/verifier-XFU7ZB2W.js +6 -0
  69. package/dist/{verifier-3FAKCFNN.js.map → verifier-XFU7ZB2W.js.map} +1 -1
  70. package/dist/workers/logic-execution.js +3 -3
  71. package/dist/workers/logic-execution.js.map +1 -1
  72. package/dist/workers/zk-verifier.js +1 -1
  73. package/dist/workers/zk-verifier.js.map +1 -1
  74. package/package.json +50 -38
  75. package/dist/chunk-32ADSAJS.js.map +0 -1
  76. package/dist/chunk-547TYL27.js.map +0 -1
  77. package/dist/chunk-72MNYFR6.js +0 -64
  78. package/dist/chunk-72MNYFR6.js.map +0 -1
  79. package/dist/chunk-74CISO2I.js.map +0 -1
  80. package/dist/chunk-CRZBVFDV.js.map +0 -1
  81. package/dist/chunk-GA3Q2S7O.js.map +0 -1
  82. package/dist/chunk-JIJPZFR2.js.map +0 -1
  83. package/dist/chunk-OUUTDSOW.js.map +0 -1
  84. package/dist/chunk-PYKRQAER.js.map +0 -1
  85. package/dist/chunk-QLCOEP5J.js.map +0 -1
  86. package/dist/chunk-RWRRBYG4.js +0 -3
  87. package/dist/chunk-SONUORBT.js.map +0 -1
  88. package/dist/chunk-T5IUZF47.js.map +0 -1
  89. package/dist/chunk-U5BZ66VX.js.map +0 -1
  90. package/dist/chunk-WCCGE4QR.js.map +0 -1
  91. package/dist/chunk-WSW6YJNY.js +0 -168
  92. package/dist/chunk-WSW6YJNY.js.map +0 -1
  93. package/dist/kyber-3ULIJSE3.js +0 -3
  94. package/dist/types-lJIxBlWF.d.ts +0 -256
  95. package/dist/verifier-3FAKCFNN.js +0 -5
@@ -0,0 +1,106 @@
1
+ // src/utils/logger.ts
2
+ var LiopLogger = class _LiopLogger {
3
+ static instance;
4
+ level = "info";
5
+ interceptor;
6
+ _isIntercepting = false;
7
+ constructor() {
8
+ this.setLevelFromEnv();
9
+ }
10
+ static getInstance() {
11
+ if (!_LiopLogger.instance) {
12
+ _LiopLogger.instance = new _LiopLogger();
13
+ }
14
+ return _LiopLogger.instance;
15
+ }
16
+ setLevelFromEnv() {
17
+ const envLevel = process.env.LIOP_LOG_LEVEL?.toLowerCase();
18
+ if (envLevel === "silent" || envLevel === "error" || envLevel === "warn" || envLevel === "info" || envLevel === "debug") {
19
+ this.level = envLevel;
20
+ } else {
21
+ this.level = "info";
22
+ }
23
+ }
24
+ setLevel(level) {
25
+ this.level = level;
26
+ }
27
+ /**
28
+ * Registers a technology-agnostic log interceptor.
29
+ * Pass `undefined` to disable interception (zero overhead).
30
+ */
31
+ setInterceptor(interceptor) {
32
+ this.interceptor = interceptor;
33
+ }
34
+ shouldLog(targetLevel) {
35
+ const levels = {
36
+ silent: 0,
37
+ error: 1,
38
+ warn: 2,
39
+ info: 3,
40
+ debug: 4
41
+ };
42
+ return levels[this.level] >= levels[targetLevel];
43
+ }
44
+ formatMessage(level, message) {
45
+ const ts = (/* @__PURE__ */ new Date()).toISOString();
46
+ return `[${ts}] [${level}] ${message}`;
47
+ }
48
+ /**
49
+ * Fire-and-forget async dispatch to the registered interceptor.
50
+ * Recursion guard prevents infinite loops when the interceptor
51
+ * itself triggers logging (directly or transitively).
52
+ */
53
+ emitToInterceptor(level, formattedMessage, args) {
54
+ if (!this.interceptor || this._isIntercepting) return;
55
+ this._isIntercepting = true;
56
+ const event = Object.freeze({
57
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
58
+ level,
59
+ message: formattedMessage,
60
+ args: Object.freeze([...args])
61
+ });
62
+ try {
63
+ const result = this.interceptor(event);
64
+ if (result && typeof result === "object" && "catch" in result) {
65
+ result.catch(() => {
66
+ });
67
+ }
68
+ } catch {
69
+ } finally {
70
+ this._isIntercepting = false;
71
+ }
72
+ }
73
+ error(message, ...args) {
74
+ if (this.shouldLog("error")) {
75
+ const formatted = this.formatMessage("ERROR", message);
76
+ console.error(formatted, ...args);
77
+ this.emitToInterceptor("error", formatted, args);
78
+ }
79
+ }
80
+ warn(message, ...args) {
81
+ if (this.shouldLog("warn")) {
82
+ const formatted = this.formatMessage("WARN", message);
83
+ console.error(formatted, ...args);
84
+ this.emitToInterceptor("warn", formatted, args);
85
+ }
86
+ }
87
+ info(message, ...args) {
88
+ if (this.shouldLog("info")) {
89
+ const formatted = this.formatMessage("INFO", message);
90
+ console.error(formatted, ...args);
91
+ this.emitToInterceptor("info", formatted, args);
92
+ }
93
+ }
94
+ debug(message, ...args) {
95
+ if (this.shouldLog("debug")) {
96
+ const formatted = this.formatMessage("DEBUG", message);
97
+ console.error(formatted, ...args);
98
+ this.emitToInterceptor("debug", formatted, args);
99
+ }
100
+ }
101
+ };
102
+ var log = LiopLogger.getInstance();
103
+
104
+ export { LiopLogger, log };
105
+ //# sourceMappingURL=chunk-K3DGJLUY.js.map
106
+ //# sourceMappingURL=chunk-K3DGJLUY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/logger.ts"],"names":[],"mappings":"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","file":"chunk-K3DGJLUY.js","sourcesContent":["// Copyright 2026 Nekzus Solutions and contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { LogInterceptor } from \"../interceptors/log-interceptor.js\";\n\nexport type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\n/**\n * LiopLogger - Structured Logging Abstraction\n * Configurable via `process.env.LIOP_LOG_LEVEL`.\n * Emits strictly to stderr to comply with MCP stdio protocols.\n */\nexport class LiopLogger {\n\tprivate static instance: LiopLogger;\n\tprivate level: LogLevel = \"info\";\n\tprivate interceptor?: LogInterceptor;\n\tprivate _isIntercepting = false;\n\n\tprivate constructor() {\n\t\tthis.setLevelFromEnv();\n\t}\n\n\tpublic static getInstance(): LiopLogger {\n\t\tif (!LiopLogger.instance) {\n\t\t\tLiopLogger.instance = new LiopLogger();\n\t\t}\n\t\treturn LiopLogger.instance;\n\t}\n\n\tprivate setLevelFromEnv() {\n\t\tconst envLevel = process.env.LIOP_LOG_LEVEL?.toLowerCase();\n\t\tif (\n\t\t\tenvLevel === \"silent\" ||\n\t\t\tenvLevel === \"error\" ||\n\t\t\tenvLevel === \"warn\" ||\n\t\t\tenvLevel === \"info\" ||\n\t\t\tenvLevel === \"debug\"\n\t\t) {\n\t\t\tthis.level = envLevel as LogLevel;\n\t\t} else {\n\t\t\t// Default level: info\n\t\t\tthis.level = \"info\";\n\t\t}\n\t}\n\n\tpublic setLevel(level: LogLevel) {\n\t\tthis.level = level;\n\t}\n\n\t/**\n\t * Registers a technology-agnostic log interceptor.\n\t * Pass `undefined` to disable interception (zero overhead).\n\t */\n\tpublic setInterceptor(interceptor: LogInterceptor | undefined) {\n\t\tthis.interceptor = interceptor;\n\t}\n\n\tprivate shouldLog(targetLevel: LogLevel): boolean {\n\t\tconst levels: Record<LogLevel, number> = {\n\t\t\tsilent: 0,\n\t\t\terror: 1,\n\t\t\twarn: 2,\n\t\t\tinfo: 3,\n\t\t\tdebug: 4,\n\t\t};\n\t\treturn levels[this.level] >= levels[targetLevel];\n\t}\n\n\tprivate formatMessage(level: string, message: string): string {\n\t\tconst ts = new Date().toISOString();\n\t\treturn `[${ts}] [${level}] ${message}`;\n\t}\n\n\t/**\n\t * Fire-and-forget async dispatch to the registered interceptor.\n\t * Recursion guard prevents infinite loops when the interceptor\n\t * itself triggers logging (directly or transitively).\n\t */\n\tprivate emitToInterceptor(\n\t\tlevel: LogLevel,\n\t\tformattedMessage: string,\n\t\targs: unknown[],\n\t): void {\n\t\tif (!this.interceptor || this._isIntercepting) return;\n\t\tthis._isIntercepting = true;\n\t\tconst event: Readonly<{\n\t\t\ttimestamp: string;\n\t\t\tlevel: LogLevel;\n\t\t\tmessage: string;\n\t\t\targs: readonly unknown[];\n\t\t}> = Object.freeze({\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tlevel,\n\t\t\tmessage: formattedMessage,\n\t\t\targs: Object.freeze([...args]),\n\t\t});\n\t\ttry {\n\t\t\tconst result = this.interceptor(event);\n\t\t\tif (result && typeof result === \"object\" && \"catch\" in result) {\n\t\t\t\t(result as Promise<void>).catch(() => {});\n\t\t\t}\n\t\t} catch {\n\t\t\t// Interceptor errors are silenced to protect protocol throughput\n\t\t} finally {\n\t\t\tthis._isIntercepting = false;\n\t\t}\n\t}\n\n\tpublic error(message: string, ...args: unknown[]) {\n\t\tif (this.shouldLog(\"error\")) {\n\t\t\tconst formatted = this.formatMessage(\"ERROR\", message);\n\t\t\tconsole.error(formatted, ...args);\n\t\t\tthis.emitToInterceptor(\"error\", formatted, args);\n\t\t}\n\t}\n\n\tpublic warn(message: string, ...args: unknown[]) {\n\t\tif (this.shouldLog(\"warn\")) {\n\t\t\tconst formatted = this.formatMessage(\"WARN\", message);\n\t\t\tconsole.error(formatted, ...args);\n\t\t\tthis.emitToInterceptor(\"warn\", formatted, args);\n\t\t}\n\t}\n\n\tpublic info(message: string, ...args: unknown[]) {\n\t\tif (this.shouldLog(\"info\")) {\n\t\t\tconst formatted = this.formatMessage(\"INFO\", message);\n\t\t\tconsole.error(formatted, ...args);\n\t\t\tthis.emitToInterceptor(\"info\", formatted, args);\n\t\t}\n\t}\n\n\tpublic debug(message: string, ...args: unknown[]) {\n\t\tif (this.shouldLog(\"debug\")) {\n\t\t\tconst formatted = this.formatMessage(\"DEBUG\", message);\n\t\t\tconsole.error(formatted, ...args);\n\t\t\tthis.emitToInterceptor(\"debug\", formatted, args);\n\t\t}\n\t}\n}\n\nexport const log = LiopLogger.getInstance();\n"]}
@@ -1,5 +1,3 @@
1
- import { ml_dsa65 } from '@noble/post-quantum/ml-dsa.js';
2
-
3
1
  // src/observability/metrics.ts
4
2
  function formatLabels(labels) {
5
3
  if (!labels || Object.keys(labels).length === 0) {
@@ -209,6 +207,11 @@ var MetricsRegistry = class {
209
207
  "Process uptime in seconds"
210
208
  );
211
209
  uptime.set(Math.floor(process.uptime()));
210
+ const health = this.gauge(
211
+ "liop_node_health_status",
212
+ "Operational health status of the LIOP node (1 = healthy, 0 = degraded)"
213
+ );
214
+ health.set(1);
212
215
  if (typeof process.memoryUsage === "function") {
213
216
  const mem = process.memoryUsage();
214
217
  const rss = this.gauge(
@@ -221,6 +224,16 @@ var MetricsRegistry = class {
221
224
  "Heap memory used in bytes"
222
225
  );
223
226
  heapUsed.set(mem.heapUsed);
227
+ const heapTotal = this.gauge(
228
+ "liop_process_memory_heap_total_bytes",
229
+ "Total V8 allocated heap memory in bytes"
230
+ );
231
+ heapTotal.set(mem.heapTotal);
232
+ const external = this.gauge(
233
+ "liop_process_memory_external_bytes",
234
+ "External memory bound to C++ objects and buffers in bytes"
235
+ );
236
+ external.set(mem.external);
224
237
  }
225
238
  }
226
239
  exportPrometheusText() {
@@ -249,6 +262,10 @@ var toolCallsTotal = protocolMetrics.counter(
249
262
  "liop_tool_calls_total",
250
263
  "Total number of tool logic-injection executions"
251
264
  );
265
+ var toolCallErrorsTotal = protocolMetrics.counter(
266
+ "liop_tool_call_errors_total",
267
+ "Total number of failed tool logic-injection executions or policy rejections"
268
+ );
252
269
  var fuelConsumed = protocolMetrics.histogram(
253
270
  "liop_fuel_consumed_total",
254
271
  "Deterministic fuel units consumed by injected logic",
@@ -271,177 +288,45 @@ var zkVerificationDurationMs = protocolMetrics.histogram(
271
288
  "Duration of ZK-Receipt and HMAC cryptographic attestation in ms",
272
289
  [1, 2, 5, 10, 25, 50, 100]
273
290
  );
274
- var DILITHIUM65_CONSTANTS = {
275
- PUBLIC_KEY_BYTES: 1952,
276
- SECRET_KEY_BYTES: 4032,
277
- SIGNATURE_BYTES: 3309,
278
- DEFAULT_CONTEXT: new TextEncoder().encode("LIOP-FIPS204-ML-DSA-65")
279
- };
280
- function normalizeMessage(message) {
281
- if (typeof message === "string") {
282
- return new TextEncoder().encode(message);
283
- }
284
- return message;
285
- }
286
- function canonicalizeJson(obj) {
287
- if (obj === null || typeof obj !== "object") {
288
- return JSON.stringify(obj);
289
- }
290
- if (Array.isArray(obj)) {
291
- return `[${obj.map(canonicalizeJson).join(",")}]`;
292
- }
293
- const sortedKeys = Object.keys(obj).sort();
294
- const entries = sortedKeys.map(
295
- (key) => `${JSON.stringify(key)}:${canonicalizeJson(obj[key])}`
296
- );
297
- return `{${entries.join(",")}}`;
298
- }
299
- var Dilithium65Wrapper = {
300
- /** Constants */
301
- PUBLIC_KEY_BYTES: DILITHIUM65_CONSTANTS.PUBLIC_KEY_BYTES,
302
- SECRET_KEY_BYTES: DILITHIUM65_CONSTANTS.SECRET_KEY_BYTES,
303
- SIGNATURE_BYTES: DILITHIUM65_CONSTANTS.SIGNATURE_BYTES,
304
- /**
305
- * Generates a new ML-DSA-65 (FIPS 204) key pair.
306
- * Optionally accepts a 32-byte seed for deterministic key generation.
307
- */
308
- generateKeyPair(seed) {
309
- if (seed && seed.length !== 32) {
310
- throw new Error(
311
- `ML-DSA-65 seed must be exactly 32 bytes (Received: ${seed.length})`
312
- );
313
- }
314
- const keys = ml_dsa65.keygen(seed);
315
- return {
316
- publicKey: keys.publicKey,
317
- secretKey: keys.secretKey
318
- };
319
- },
320
- /**
321
- * Validates and imports a raw ML-DSA-65 public key.
322
- */
323
- importPublicKey(buffer) {
324
- if (buffer.length !== DILITHIUM65_CONSTANTS.PUBLIC_KEY_BYTES) {
325
- throw new Error(
326
- `ML-DSA-65 Public Key must be exactly ${DILITHIUM65_CONSTANTS.PUBLIC_KEY_BYTES} bytes (Received: ${buffer.length})`
327
- );
328
- }
329
- return buffer;
330
- },
331
- /**
332
- * Signs a message using the post-quantum secret key.
333
- * Supports optional domain separation context (up to 255 bytes).
334
- */
335
- sign(message, secretKey, context) {
336
- if (secretKey.length !== DILITHIUM65_CONSTANTS.SECRET_KEY_BYTES) {
337
- throw new Error(
338
- `ML-DSA-65 Secret Key must be exactly ${DILITHIUM65_CONSTANTS.SECRET_KEY_BYTES} bytes (Received: ${secretKey.length})`
339
- );
340
- }
341
- const msgBytes = normalizeMessage(message);
342
- const ctx = context ?? DILITHIUM65_CONSTANTS.DEFAULT_CONTEXT;
343
- return ml_dsa65.sign(msgBytes, secretKey, { context: ctx });
344
- },
345
- /**
346
- * Verifies an ML-DSA-65 post-quantum digital signature.
347
- */
348
- verify(signature, message, publicKey, context) {
349
- if (signature.length !== DILITHIUM65_CONSTANTS.SIGNATURE_BYTES) {
350
- return false;
351
- }
352
- if (publicKey.length !== DILITHIUM65_CONSTANTS.PUBLIC_KEY_BYTES) {
353
- return false;
354
- }
355
- try {
356
- const msgBytes = normalizeMessage(message);
357
- const ctx = context ?? DILITHIUM65_CONSTANTS.DEFAULT_CONTEXT;
358
- return ml_dsa65.verify(signature, msgBytes, publicKey, { context: ctx });
359
- } catch {
360
- return false;
361
- }
362
- },
363
- /**
364
- * Signs a structured manifest (LiopManifest) using canonical JSON serialization.
365
- * Returns base64-encoded signature and public key for transport over gRPC/MCP.
366
- */
367
- signManifest(manifest, secretKey, publicKey) {
368
- const { pqcSignature: _sig, pqcPublicKey: _pub, ...unsigned } = manifest;
369
- const canonicalStr = canonicalizeJson(unsigned);
370
- const sig = this.sign(canonicalStr, secretKey);
371
- return {
372
- signature: Buffer.from(sig).toString("base64"),
373
- publicKey: Buffer.from(publicKey).toString("base64")
374
- };
375
- },
376
- /**
377
- * Verifies the post-quantum signature of a structured manifest.
378
- */
379
- verifyManifest(manifest, signatureBase64, publicKeyBase64) {
380
- try {
381
- const sig = Buffer.from(signatureBase64, "base64");
382
- const pub = Buffer.from(publicKeyBase64, "base64");
383
- const { pqcSignature: _sig, pqcPublicKey: _pub, ...unsigned } = manifest;
384
- const canonicalStr = canonicalizeJson(unsigned);
385
- return this.verify(sig, canonicalStr, pub);
386
- } catch {
387
- return false;
388
- }
389
- }
390
- };
391
-
392
- // src/security/rbac.ts
393
- var SCOPE_MAP = {
394
- // Protocol lifecycle — unauthenticated (MCP spec compliance)
395
- initialize: [],
396
- "notifications/initialized": [],
397
- "notifications/cancelled": [],
398
- ping: [],
399
- // Tool operations — require explicit authorization
400
- "tools/list": ["liop:tools:list"],
401
- "tools/call": ["liop:tools:call"],
402
- // Resource operations — read-level access
403
- "resources/list": ["liop:resources:read"],
404
- "resources/read": ["liop:resources:read"],
405
- // Prompt/schema operations — schema-level access
406
- "prompts/list": ["liop:schema:read"],
407
- "prompts/get": ["liop:schema:read"]
408
- };
409
- function authorizeRequest(method, auth, additionalScopes) {
410
- const methodScopes = SCOPE_MAP[method];
411
- if (methodScopes !== void 0 && methodScopes.length === 0) {
412
- return { allowed: true };
413
- }
414
- if (!auth) {
415
- return {
416
- allowed: false,
417
- reason: `Authentication required for method: ${method}`
418
- };
419
- }
420
- const needed = [...methodScopes ?? [], ...additionalScopes ?? []];
421
- if (needed.length === 0) {
422
- return {
423
- allowed: false,
424
- reason: `Unknown method: ${method}. Access denied (fail-closed).`
425
- };
426
- }
427
- const clientScopes = new Set(auth.scopes);
428
- const missing = needed.filter((s) => !clientScopes.has(s));
429
- if (missing.length > 0) {
430
- return {
431
- allowed: false,
432
- reason: `Insufficient scopes for ${method}. Missing: ${missing.join(", ")}`
433
- };
434
- }
435
- return { allowed: true };
436
- }
437
- var LIOP_SCOPES = [
438
- "liop:tools:list",
439
- "liop:tools:call",
440
- "liop:resources:read",
441
- "liop:schema:read",
442
- "liop:mesh:query"
443
- ];
291
+ var zkVerificationsTotal = protocolMetrics.counter(
292
+ "liop_zk_verifications_total",
293
+ "Total number of ZK-Receipt cryptographic attestation checks"
294
+ );
295
+ var tokensInputTotal = protocolMetrics.counter(
296
+ "liop_tokens_input_total",
297
+ "Total BPE input tokens processed by LIOP"
298
+ );
299
+ var tokensOutputTotal = protocolMetrics.counter(
300
+ "liop_tokens_output_total",
301
+ "Total BPE output tokens emitted by LIOP"
302
+ );
303
+ var tokensSavedTotal = protocolMetrics.counter(
304
+ "liop_tokens_saved_total",
305
+ "Estimated tokens saved compared to MCP context-pulling baseline"
306
+ );
307
+ var operationDurationMs = protocolMetrics.histogram(
308
+ "liop_operation_duration_ms",
309
+ "End-to-end operation duration in ms",
310
+ [5, 15, 30, 50, 100, 250, 500, 1e3, 2500, 5e3]
311
+ );
312
+ var pqcHandshakeDurationMs = protocolMetrics.histogram(
313
+ "liop_pqc_handshake_duration_ms",
314
+ "Duration of ML-KEM-768 post-quantum cryptographic key encapsulation in ms",
315
+ [1, 5, 10, 25, 50, 100, 250, 500]
316
+ );
317
+ var pqcHandshakesTotal = protocolMetrics.counter(
318
+ "liop_pqc_handshakes_total",
319
+ "Total number of ML-KEM-768 key encapsulation operations"
320
+ );
321
+ var wireEgressBytesTotal = protocolMetrics.counter(
322
+ "liop_wire_egress_bytes_total",
323
+ "Total wire egress bytes emitted by logic executions"
324
+ );
325
+ var wireSavedBytesTotal = protocolMetrics.counter(
326
+ "liop_wire_saved_bytes_total",
327
+ "Estimated wire egress bytes saved compared to MCP context extraction baseline"
328
+ );
444
329
 
445
- export { Counter, DILITHIUM65_CONSTANTS, Dilithium65Wrapper, Gauge, Histogram, LIOP_SCOPES, MetricsRegistry, authorizeRequest, egressBlocksTotal, fuelConsumed, manifestCacheSize, meshPeersConnected, protocolMetrics, toolCallsTotal, zkVerificationDurationMs };
446
- //# sourceMappingURL=chunk-U5BZ66VX.js.map
447
- //# sourceMappingURL=chunk-U5BZ66VX.js.map
330
+ export { Counter, Gauge, Histogram, MetricsRegistry, egressBlocksTotal, fuelConsumed, manifestCacheSize, meshPeersConnected, operationDurationMs, pqcHandshakeDurationMs, pqcHandshakesTotal, protocolMetrics, tokensInputTotal, tokensOutputTotal, tokensSavedTotal, toolCallErrorsTotal, toolCallsTotal, wireEgressBytesTotal, wireSavedBytesTotal, zkVerificationDurationMs, zkVerificationsTotal };
331
+ //# sourceMappingURL=chunk-PAICJCKJ.js.map
332
+ //# sourceMappingURL=chunk-PAICJCKJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/observability/metrics.ts"],"names":[],"mappings":"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","file":"chunk-PAICJCKJ.js","sourcesContent":["// Copyright 2026 Nekzus Solutions and contributors\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * LIOP Prometheus Metrics Registry (Phase Beta-3)\n * Lightweight, zero-dependency, high-performance metrics collector\n * complying with Prometheus and OpenMetrics exposition format.\n */\n\nexport type MetricLabels = Record<string, string | number>;\n\nexport interface MetricDefinition {\n\tname: string;\n\thelp: string;\n\ttype: \"counter\" | \"gauge\" | \"histogram\";\n\tbuckets?: number[];\n}\n\nfunction formatLabels(labels?: MetricLabels): string {\n\tif (!labels || Object.keys(labels).length === 0) {\n\t\treturn \"\";\n\t}\n\tconst entries = Object.entries(labels)\n\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t.map(([k, v]) => `${k}=\"${String(v).replace(/\"/g, '\\\\\"')}\"`);\n\treturn `{${entries.join(\",\")}}`;\n}\n\nfunction labelsToKey(labels?: MetricLabels): string {\n\tif (!labels) return \"\";\n\treturn Object.entries(labels)\n\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t.map(([k, v]) => `${k}:${v}`)\n\t\t.join(\"|\");\n}\n\nexport class Counter {\n\tprivate values = new Map<string, { value: number; labels?: MetricLabels }>();\n\n\tconstructor(\n\t\tpublic readonly name: string,\n\t\tpublic readonly help: string,\n\t) {}\n\n\tinc(labels?: MetricLabels, value = 1): void {\n\t\tif (value < 0) {\n\t\t\tthrow new Error(\"Counter increments must be non-negative\");\n\t\t}\n\t\tconst key = labelsToKey(labels);\n\t\tconst current = this.values.get(key) || { value: 0, labels };\n\t\tcurrent.value += value;\n\t\tthis.values.set(key, current);\n\t}\n\n\tget(labels?: MetricLabels): number {\n\t\tconst key = labelsToKey(labels);\n\t\treturn this.values.get(key)?.value || 0;\n\t}\n\n\treset(): void {\n\t\tthis.values.clear();\n\t}\n\n\ttoPrometheus(): string[] {\n\t\tconst lines: string[] = [\n\t\t\t`# HELP ${this.name} ${this.help}`,\n\t\t\t`# TYPE ${this.name} counter`,\n\t\t];\n\t\tif (this.values.size === 0) {\n\t\t\tlines.push(`${this.name} 0`);\n\t\t\treturn lines;\n\t\t}\n\t\tfor (const entry of this.values.values()) {\n\t\t\tlines.push(`${this.name}${formatLabels(entry.labels)} ${entry.value}`);\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class Gauge {\n\tprivate values = new Map<string, { value: number; labels?: MetricLabels }>();\n\n\tconstructor(\n\t\tpublic readonly name: string,\n\t\tpublic readonly help: string,\n\t) {}\n\n\tset(labelsOrValue: MetricLabels | number, maybeValue?: number): void {\n\t\tif (typeof labelsOrValue === \"number\") {\n\t\t\tthis.values.set(\"\", { value: labelsOrValue });\n\t\t\treturn;\n\t\t}\n\t\tconst labels = labelsOrValue;\n\t\tconst val = typeof maybeValue === \"number\" ? maybeValue : 0;\n\t\tconst key = labelsToKey(labels);\n\t\tthis.values.set(key, { value: val, labels });\n\t}\n\n\tinc(labels?: MetricLabels, value = 1): void {\n\t\tconst key = labelsToKey(labels);\n\t\tconst current = this.values.get(key) || { value: 0, labels };\n\t\tcurrent.value += value;\n\t\tthis.values.set(key, current);\n\t}\n\n\tdec(labels?: MetricLabels, value = 1): void {\n\t\tconst key = labelsToKey(labels);\n\t\tconst current = this.values.get(key) || { value: 0, labels };\n\t\tcurrent.value -= value;\n\t\tthis.values.set(key, current);\n\t}\n\n\tget(labels?: MetricLabels): number {\n\t\tconst key = labelsToKey(labels);\n\t\treturn this.values.get(key)?.value || 0;\n\t}\n\n\treset(): void {\n\t\tthis.values.clear();\n\t}\n\n\ttoPrometheus(): string[] {\n\t\tconst lines: string[] = [\n\t\t\t`# HELP ${this.name} ${this.help}`,\n\t\t\t`# TYPE ${this.name} gauge`,\n\t\t];\n\t\tif (this.values.size === 0) {\n\t\t\tlines.push(`${this.name} 0`);\n\t\t\treturn lines;\n\t\t}\n\t\tfor (const entry of this.values.values()) {\n\t\t\tlines.push(`${this.name}${formatLabels(entry.labels)} ${entry.value}`);\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class Histogram {\n\tpublic readonly buckets: number[];\n\tprivate observations = new Map<\n\t\tstring,\n\t\t{\n\t\t\tcount: number;\n\t\t\tsum: number;\n\t\t\tbucketCounts: Map<number, number>;\n\t\t\tlabels?: MetricLabels;\n\t\t}\n\t>();\n\n\tconstructor(\n\t\tpublic readonly name: string,\n\t\tpublic readonly help: string,\n\t\tbuckets: number[] = [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],\n\t) {\n\t\tthis.buckets = [...buckets].sort((a, b) => a - b);\n\t}\n\n\tobserve(labelsOrValue: MetricLabels | number, maybeValue?: number): void {\n\t\tlet labels: MetricLabels | undefined;\n\t\tlet val: number;\n\n\t\tif (typeof labelsOrValue === \"number\") {\n\t\t\tval = labelsOrValue;\n\t\t} else {\n\t\t\tlabels = labelsOrValue;\n\t\t\tval = typeof maybeValue === \"number\" ? maybeValue : 0;\n\t\t}\n\n\t\tconst key = labelsToKey(labels);\n\t\tlet state = this.observations.get(key);\n\t\tif (!state) {\n\t\t\tstate = {\n\t\t\t\tcount: 0,\n\t\t\t\tsum: 0,\n\t\t\t\tbucketCounts: new Map(this.buckets.map((b) => [b, 0])),\n\t\t\t\tlabels,\n\t\t\t};\n\t\t\tthis.observations.set(key, state);\n\t\t}\n\n\t\tstate.count += 1;\n\t\tstate.sum += val;\n\n\t\tfor (const bound of this.buckets) {\n\t\t\tif (val <= bound) {\n\t\t\t\tconst cur = state.bucketCounts.get(bound) || 0;\n\t\t\t\tstate.bucketCounts.set(bound, cur + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\treset(): void {\n\t\tthis.observations.clear();\n\t}\n\n\ttoPrometheus(): string[] {\n\t\tconst lines: string[] = [\n\t\t\t`# HELP ${this.name} ${this.help}`,\n\t\t\t`# TYPE ${this.name} histogram`,\n\t\t];\n\t\tif (this.observations.size === 0) {\n\t\t\tlines.push(`${this.name}_count 0`);\n\t\t\tlines.push(`${this.name}_sum 0`);\n\t\t\treturn lines;\n\t\t}\n\n\t\tfor (const state of this.observations.values()) {\n\t\t\tconst baseLabels = state.labels || {};\n\t\t\tfor (const bound of this.buckets) {\n\t\t\t\tconst bucketLabels = { ...baseLabels, le: String(bound) };\n\t\t\t\tlines.push(\n\t\t\t\t\t`${this.name}_bucket${formatLabels(bucketLabels)} ${state.bucketCounts.get(bound) || 0}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst infLabels = { ...baseLabels, le: \"+Inf\" };\n\t\t\tlines.push(\n\t\t\t\t`${this.name}_bucket${formatLabels(infLabels)} ${state.count}`,\n\t\t\t);\n\t\t\tlines.push(`${this.name}_sum${formatLabels(baseLabels)} ${state.sum}`);\n\t\t\tlines.push(\n\t\t\t\t`${this.name}_count${formatLabels(baseLabels)} ${state.count}`,\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n}\n\nexport class MetricsRegistry {\n\tprivate counters = new Map<string, Counter>();\n\tprivate gauges = new Map<string, Gauge>();\n\tprivate histograms = new Map<string, Histogram>();\n\n\tcounter(name: string, help: string): Counter {\n\t\tlet c = this.counters.get(name);\n\t\tif (!c) {\n\t\t\tc = new Counter(name, help);\n\t\t\tthis.counters.set(name, c);\n\t\t}\n\t\treturn c;\n\t}\n\n\tgauge(name: string, help: string): Gauge {\n\t\tlet g = this.gauges.get(name);\n\t\tif (!g) {\n\t\t\tg = new Gauge(name, help);\n\t\t\tthis.gauges.set(name, g);\n\t\t}\n\t\treturn g;\n\t}\n\n\thistogram(name: string, help: string, buckets?: number[]): Histogram {\n\t\tlet h = this.histograms.get(name);\n\t\tif (!h) {\n\t\t\th = new Histogram(name, help, buckets);\n\t\t\tthis.histograms.set(name, h);\n\t\t}\n\t\treturn h;\n\t}\n\n\tcollectProcessMetrics(): void {\n\t\tconst uptime = this.gauge(\n\t\t\t\"liop_process_uptime_seconds\",\n\t\t\t\"Process uptime in seconds\",\n\t\t);\n\t\tuptime.set(Math.floor(process.uptime()));\n\n\t\tconst health = this.gauge(\n\t\t\t\"liop_node_health_status\",\n\t\t\t\"Operational health status of the LIOP node (1 = healthy, 0 = degraded)\",\n\t\t);\n\t\thealth.set(1);\n\n\t\tif (typeof process.memoryUsage === \"function\") {\n\t\t\tconst mem = process.memoryUsage();\n\t\t\tconst rss = this.gauge(\n\t\t\t\t\"liop_process_memory_rss_bytes\",\n\t\t\t\t\"Resident set size memory in bytes\",\n\t\t\t);\n\t\t\trss.set(mem.rss);\n\n\t\t\tconst heapUsed = this.gauge(\n\t\t\t\t\"liop_process_memory_heap_used_bytes\",\n\t\t\t\t\"Heap memory used in bytes\",\n\t\t\t);\n\t\t\theapUsed.set(mem.heapUsed);\n\n\t\t\tconst heapTotal = this.gauge(\n\t\t\t\t\"liop_process_memory_heap_total_bytes\",\n\t\t\t\t\"Total V8 allocated heap memory in bytes\",\n\t\t\t);\n\t\t\theapTotal.set(mem.heapTotal);\n\n\t\t\tconst external = this.gauge(\n\t\t\t\t\"liop_process_memory_external_bytes\",\n\t\t\t\t\"External memory bound to C++ objects and buffers in bytes\",\n\t\t\t);\n\t\t\texternal.set(mem.external);\n\t\t}\n\t}\n\n\texportPrometheusText(): string {\n\t\tthis.collectProcessMetrics();\n\n\t\tconst lines: string[] = [];\n\t\tfor (const c of this.counters.values()) {\n\t\t\tlines.push(...c.toPrometheus());\n\t\t}\n\t\tfor (const g of this.gauges.values()) {\n\t\t\tlines.push(...g.toPrometheus());\n\t\t}\n\t\tfor (const h of this.histograms.values()) {\n\t\t\tlines.push(...h.toPrometheus());\n\t\t}\n\t\tlines.push(\"\"); // Trailing newline\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tresetAll(): void {\n\t\tfor (const c of this.counters.values()) c.reset();\n\t\tfor (const g of this.gauges.values()) g.reset();\n\t\tfor (const h of this.histograms.values()) h.reset();\n\t}\n}\n\n// ── Global Standard Protocol Metrics Instance ──────────────────────────────────\n\nexport const protocolMetrics = new MetricsRegistry();\n\nexport const toolCallsTotal = protocolMetrics.counter(\n\t\"liop_tool_calls_total\",\n\t\"Total number of tool logic-injection executions\",\n);\n\nexport const toolCallErrorsTotal = protocolMetrics.counter(\n\t\"liop_tool_call_errors_total\",\n\t\"Total number of failed tool logic-injection executions or policy rejections\",\n);\n\nexport const fuelConsumed = protocolMetrics.histogram(\n\t\"liop_fuel_consumed_total\",\n\t\"Deterministic fuel units consumed by injected logic\",\n\t[100, 500, 1000, 2500, 5000, 10000, 50000, 100000],\n);\n\nexport const meshPeersConnected = protocolMetrics.gauge(\n\t\"liop_mesh_peers_connected\",\n\t\"Active peer connections in the P2P mesh\",\n);\n\nexport const manifestCacheSize = protocolMetrics.gauge(\n\t\"liop_manifest_cache_size\",\n\t\"Number of verified remote tool manifests in cache\",\n);\n\nexport const egressBlocksTotal = protocolMetrics.counter(\n\t\"liop_egress_blocks_total\",\n\t\"Total number of outputs blocked by Egress Shield\",\n);\n\nexport const zkVerificationDurationMs = protocolMetrics.histogram(\n\t\"liop_zk_verification_duration_ms\",\n\t\"Duration of ZK-Receipt and HMAC cryptographic attestation in ms\",\n\t[1, 2, 5, 10, 25, 50, 100],\n);\n\nexport const zkVerificationsTotal = protocolMetrics.counter(\n\t\"liop_zk_verifications_total\",\n\t\"Total number of ZK-Receipt cryptographic attestation checks\",\n);\n\nexport const tokensInputTotal = protocolMetrics.counter(\n\t\"liop_tokens_input_total\",\n\t\"Total BPE input tokens processed by LIOP\",\n);\n\nexport const tokensOutputTotal = protocolMetrics.counter(\n\t\"liop_tokens_output_total\",\n\t\"Total BPE output tokens emitted by LIOP\",\n);\n\nexport const tokensSavedTotal = protocolMetrics.counter(\n\t\"liop_tokens_saved_total\",\n\t\"Estimated tokens saved compared to MCP context-pulling baseline\",\n);\n\nexport const operationDurationMs = protocolMetrics.histogram(\n\t\"liop_operation_duration_ms\",\n\t\"End-to-end operation duration in ms\",\n\t[5, 15, 30, 50, 100, 250, 500, 1000, 2500, 5000],\n);\n\nexport const pqcHandshakeDurationMs = protocolMetrics.histogram(\n\t\"liop_pqc_handshake_duration_ms\",\n\t\"Duration of ML-KEM-768 post-quantum cryptographic key encapsulation in ms\",\n\t[1, 5, 10, 25, 50, 100, 250, 500],\n);\n\nexport const pqcHandshakesTotal = protocolMetrics.counter(\n\t\"liop_pqc_handshakes_total\",\n\t\"Total number of ML-KEM-768 key encapsulation operations\",\n);\n\nexport const wireEgressBytesTotal = protocolMetrics.counter(\n\t\"liop_wire_egress_bytes_total\",\n\t\"Total wire egress bytes emitted by logic executions\",\n);\n\nexport const wireSavedBytesTotal = protocolMetrics.counter(\n\t\"liop_wire_saved_bytes_total\",\n\t\"Estimated wire egress bytes saved compared to MCP context extraction baseline\",\n);\n"]}