@nekzus/liop 2.4.0-alpha.21 → 2.4.0-alpha.23
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/README.md +72 -36
- package/dist/bin/agent.js +8 -7
- package/dist/bin/agent.js.map +1 -1
- package/dist/bridge.d.ts +4 -3
- package/dist/bridge.js +3 -2
- package/dist/{chunk-FCFTYOAS.js → chunk-3WKFZQ34.js} +22 -12
- package/dist/chunk-3WKFZQ34.js.map +1 -0
- package/dist/{chunk-VRB5HUYU.js → chunk-AMSFSS2I.js} +14 -9
- package/dist/chunk-AMSFSS2I.js.map +1 -0
- package/dist/{chunk-VRDZ5IKE.js → chunk-E2CFIWD6.js} +15 -9
- package/dist/chunk-E2CFIWD6.js.map +1 -0
- package/dist/{chunk-EJ426URA.js → chunk-E7RSX476.js} +4 -4
- package/dist/{chunk-EJ426URA.js.map → chunk-E7RSX476.js.map} +1 -1
- package/dist/{chunk-UJFWPRDM.js → chunk-GFGSHQN5.js} +3 -3
- package/dist/{chunk-UJFWPRDM.js.map → chunk-GFGSHQN5.js.map} +1 -1
- package/dist/{chunk-XRDN232O.js → chunk-KB3HUVMD.js} +2 -2
- package/dist/chunk-KB3HUVMD.js.map +1 -0
- package/dist/chunk-OHMZZMMC.js +58 -0
- package/dist/chunk-OHMZZMMC.js.map +1 -0
- package/dist/chunk-P34HDRN5.js +213 -0
- package/dist/chunk-P34HDRN5.js.map +1 -0
- package/dist/{chunk-PAICJCKJ.js → chunk-Q3FKHJ3B.js} +17 -4
- package/dist/chunk-Q3FKHJ3B.js.map +1 -0
- package/dist/{chunk-5SWHE62F.js → chunk-T2QDHVUD.js} +71 -11
- package/dist/chunk-T2QDHVUD.js.map +1 -0
- package/dist/{chunk-2KSO3W4A.js → chunk-YLFNJQI2.js} +2 -2
- package/dist/{chunk-2KSO3W4A.js.map → chunk-YLFNJQI2.js.map} +1 -1
- package/dist/{chunk-2STZHJ24.js → chunk-ZRWNMP5L.js} +58 -7
- package/dist/chunk-ZRWNMP5L.js.map +1 -0
- package/dist/client.d.ts +5 -4
- package/dist/client.js +7 -6
- package/dist/gateway.d.ts +6 -5
- package/dist/gateway.js +7 -6
- package/dist/{hybrid-DWe1bMoV.d.ts → hybrid-B7EjCj3q.d.ts} +4 -4
- package/dist/{index-CdW8j8Bn.d.ts → index-D2P6Z_hP.d.ts} +25 -2
- package/dist/{index-BuEQtBHD.d.ts → index-DDwiS7tf.d.ts} +8 -4
- package/dist/index.d.ts +51 -9
- package/dist/index.js +12 -10
- package/dist/index.js.map +1 -1
- package/dist/mesh.d.ts +1 -1
- package/dist/mesh.js +1 -1
- package/dist/{node-B0b2vUFS.d.ts → node-Djzm6UYd.d.ts} +8 -0
- package/dist/protocol/liop_core.proto +22 -6
- package/dist/server.d.ts +4 -3
- package/dist/server.js +5 -4
- package/dist/{types-CzRSOlOo.d.ts → types-rxL19f0l.d.ts} +3 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.js +2 -1
- package/dist/{verifier-COnid_dg.d.ts → verifier-DTn1LXDU.d.ts} +25 -3
- package/dist/verifier-UBJTZQSA.js +6 -0
- package/dist/{verifier-XFU7ZB2W.js.map → verifier-UBJTZQSA.js.map} +1 -1
- package/dist/workers/logic-execution.d.ts +6 -0
- package/dist/workers/logic-execution.js +56 -1
- package/dist/workers/logic-execution.js.map +1 -1
- package/dist/workers/zk-verifier.d.ts +9 -0
- package/dist/workers/zk-verifier.js +119 -47
- package/dist/workers/zk-verifier.js.map +1 -1
- package/dist/zk-CYImPsa6.d.ts +91 -0
- package/package.json +2 -1
- package/dist/chunk-2STZHJ24.js.map +0 -1
- package/dist/chunk-5SWHE62F.js.map +0 -1
- package/dist/chunk-FCFTYOAS.js.map +0 -1
- package/dist/chunk-PAICJCKJ.js.map +0 -1
- package/dist/chunk-VRB5HUYU.js.map +0 -1
- package/dist/chunk-VRDZ5IKE.js.map +0 -1
- package/dist/chunk-XRDN232O.js.map +0 -1
- package/dist/verifier-XFU7ZB2W.js +0 -6
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<img alt="Logic-Injection-on-Origin Protocol Logo" src="https://raw.githubusercontent.com/Nekzus/LIOP/main/docs/logo/light.svg" width="700">
|
|
5
5
|
</picture>
|
|
6
6
|
|
|
7
|
-
<h1>Logic-Injection-on-Origin Protocol (LIOP)
|
|
7
|
+
<h1>Logic-Injection-on-Origin Protocol (LIOP), TypeScript SDK</h1>
|
|
8
8
|
<p><strong>The official TypeScript SDK and MCP Bridge for the Logic-Injection-on-Origin Protocol.</strong></p>
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Official Documentation
|
|
23
23
|
|
|
24
24
|
Comprehensive interactive guides, architectural deep dives, and API specifications are hosted on our official portal:
|
|
25
25
|
|
|
@@ -37,7 +37,7 @@ Comprehensive interactive guides, architectural deep dives, and API specificatio
|
|
|
37
37
|
|
|
38
38
|
## Overview
|
|
39
39
|
|
|
40
|
-
`@nekzus/liop` is an SDK that implements the **Logic-Injection-on-Origin (LIO)** paradigm: instead of extracting raw data from a server and sending it to an LLM, the LLM injects a micro-module of logic to be executed *at the data source*, inside a secure sandbox. The result
|
|
40
|
+
`@nekzus/liop` is an SDK that implements the **Logic-Injection-on-Origin (LIO)** paradigm: instead of extracting raw data from a server and sending it to an LLM, the LLM injects a micro-module of logic to be executed *at the data source*, inside a secure sandbox. The result, and never the raw data, is returned.
|
|
41
41
|
|
|
42
42
|
This addresses the data privacy, bandwidth, and latency bottlenecks of distributed agent data analysis.
|
|
43
43
|
|
|
@@ -52,7 +52,7 @@ This addresses the data privacy, bandwidth, and latency bottlenecks of distribut
|
|
|
52
52
|
| **Multi-Tier Sovereign Enclaves** | Physical socket isolation via `@libp2p/pnet` (256-bit Swarm Key PSK) and Border LIO Gateway (`blg`) with OAuth 2.1 authentication. |
|
|
53
53
|
| **AST Fuel Metering** | Deterministic AST instruction fuel scoring with 100-bucket quantization for NIST SP 800-53 timing side-channel elimination (`stddev = 0`).|
|
|
54
54
|
| **Differential Privacy Engine** | NIST SP 800-226 Laplace mechanism with CSPRNG entropy, query-aware sensitivity, and deterministic ZK-Receipt auditing (`DpEngine`). |
|
|
55
|
-
| **MCP Drop-in Replacement** | `LiopServer` mirrors the Anthropic MCP `Server` API
|
|
55
|
+
| **MCP Drop-in Replacement** | `LiopServer` mirrors the Anthropic MCP `Server` API (tools, resources, and prompts with `Zod` schemas). |
|
|
56
56
|
| **Guardian AST** | Pre-execution heuristic inspection blocks sandbox escapes (`require`, `fs`, `eval`, `fetch`, prototype pollution). |
|
|
57
57
|
| **IFC Taint Analyzer** | 5-pass Acorn AST information flow control tracking collection aliases, correlation guards, and extrema gates at preflight. |
|
|
58
58
|
| **WASI Sandbox** | JavaScript payloads execute inside V8 isolates with CPU fuel limits, no Node.js globals, and safe environment isolation (`allowEnv`). |
|
|
@@ -61,7 +61,7 @@ This addresses the data privacy, bandwidth, and latency bottlenecks of distribut
|
|
|
61
61
|
| **OAuth 2.1 M2M Lifecycle** | Concurrency in-flight de-duplication, 30-second preemptive refresh buffer, and reactive invalidation (`TokenManager`). |
|
|
62
62
|
| **Sliding-Window Rate Limiter**| In-memory OWASP API4:2023 rate limiting with background cleanup unreferenced intervals (`InMemoryRateLimiter`). |
|
|
63
63
|
| **PII Shield** | Multi-layer egress filter with Regional Presets, custom keys, and recursive floats sanitization (`sanitizeOutput`). |
|
|
64
|
-
| **ZK-Receipts** |
|
|
64
|
+
| **ZK-Receipts** | Sovereign Zero-Knowledge Proofs: Groth16 BN254 with 144-byte binary journal (v2) and legacy HMAC-SHA256 (v1). Enforces `ZK_BLOCKING` on Tier 1 Enclaves. |
|
|
65
65
|
| **Worker Pool** | Heavy computation (crypto, sandboxing) dispatched to OS threads via `piscina` with background async warmup. |
|
|
66
66
|
| **Post-Quantum Ready** | ML-KEM-768 (Kyber) + ML-DSA-65 (Dilithium) with 1-hour session lifetime and AES-256-GCM encryption. |
|
|
67
67
|
| **Enterprise Observability** | Immutable SOC 2 Hash-Chain audit log (`AuditLogger`), physical wire egress tracking, Prometheus metrics (`/metrics`), and K8s probes. |
|
|
@@ -121,7 +121,7 @@ npm install -g @nekzus/liop@latest
|
|
|
121
121
|
liop
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
-
###
|
|
124
|
+
### Claude Desktop Configuration
|
|
125
125
|
|
|
126
126
|
To integrate LIOP into Claude Desktop, update your `claude_desktop_config.json` (typically found in `%APPDATA%\Claude\claude_desktop_config.json` on Windows):
|
|
127
127
|
|
|
@@ -185,7 +185,7 @@ server.tool(
|
|
|
185
185
|
"Analyzes local log files without sending raw data to the LLM.",
|
|
186
186
|
{ target_error: z.string().describe("The error pattern to search for") },
|
|
187
187
|
async ({ target_error }) => {
|
|
188
|
-
// This logic runs at origin
|
|
188
|
+
// This logic runs at origin, data never leaves the server
|
|
189
189
|
return {
|
|
190
190
|
content: [{ type: "text", text: `Found 51 occurrences of ${target_error}` }],
|
|
191
191
|
};
|
|
@@ -324,13 +324,13 @@ await bridge.connect();
|
|
|
324
324
|
|
|
325
325
|
**Supported JSON-RPC methods:**
|
|
326
326
|
|
|
327
|
-
- `initialize
|
|
328
|
-
- `tools/list
|
|
329
|
-
- `tools/call
|
|
330
|
-
- `resources/list
|
|
331
|
-
- `resources/read
|
|
332
|
-
- `prompts/list
|
|
333
|
-
- `prompts/get
|
|
327
|
+
- `initialize`: Returns server capabilities and info
|
|
328
|
+
- `tools/list`: Lists available tools
|
|
329
|
+
- `tools/call`: Calls a tool (with ZK-Receipt verification)
|
|
330
|
+
- `resources/list`: Lists available resources
|
|
331
|
+
- `resources/read`: Reads a resource
|
|
332
|
+
- `prompts/list`: Lists available prompts
|
|
333
|
+
- `prompts/get`: Gets a specific prompt
|
|
334
334
|
|
|
335
335
|
---
|
|
336
336
|
|
|
@@ -343,13 +343,13 @@ await bridge.connect();
|
|
|
343
343
|
│ Layer 1: Guardian AST (Pre-Execution Static Analysis) │
|
|
344
344
|
│ 14-function WASI allowlist • 128 import cap • Blocks │
|
|
345
345
|
│ require, import(), fs, eval, fetch, __proto__ │
|
|
346
|
-
|
|
346
|
+
├───────────────────────────────────────────────────────────┤
|
|
347
347
|
│ Layer 2: WASI Sandbox (V8 Isolate) │
|
|
348
348
|
│ 25 poisoned globals (incl. Date, TypedArrays) • │
|
|
349
349
|
│ CPU Fuel limits • 5s timeout • maxHeapMb (64MB default) │
|
|
350
350
|
│ Object.freeze() on 11 core prototypes • allowEnv allowlist │
|
|
351
351
|
├───────────────────────────────────────────────────────────┤
|
|
352
|
-
│ Layer 3: Taint Analyzer (IFC
|
|
352
|
+
│ Layer 3: Taint Analyzer (IFC, Static) │
|
|
353
353
|
│ Acorn AST 3-pass analysis blocks PII side-channels: │
|
|
354
354
|
│ charCodeAt, boolean inference, arithmetic derivation │
|
|
355
355
|
├───────────────────────────────────────────────────────────┤
|
|
@@ -362,8 +362,9 @@ await bridge.connect();
|
|
|
362
362
|
│ Blocks raw row export • maxOutputRows (default: 10) • │
|
|
363
363
|
│ Conditional error: detailed (dev) vs opaque (production) │
|
|
364
364
|
├───────────────────────────────────────────────────────────┤
|
|
365
|
-
│ Layer 6: ZK-Receipt (
|
|
366
|
-
│
|
|
365
|
+
│ Layer 6: ZK-Receipt (Groth16 BN254 & Replay Mitigation) │
|
|
366
|
+
│ Version 2: 144-byte binary journal + Groth16 curve points │
|
|
367
|
+
│ Version 1: HMAC-SHA256 session commitment (Kyber768) │
|
|
367
368
|
│ output_hash cross-verification • Balanced-brace extractor │
|
|
368
369
|
└───────────────────────────────────────────────────────────┘
|
|
369
370
|
```
|
|
@@ -407,7 +408,7 @@ const server = new LiopServer(info, {
|
|
|
407
408
|
|
|
408
409
|
To avoid false positive triggers caused by HMAC-SHA256 ZK-Receipt signatures or transport wrapper frames (such as `{ content: [{ type: "text", text: "..." }] }`), the PII Shield and Aggregation-First engines scan only the unwrapped business data (via `unwrapForAggregationPolicyScan`). Cryptographic seals and protocol routing structures are isolated and excluded from compliance scans.
|
|
409
410
|
|
|
410
|
-
###
|
|
411
|
+
### 3-Tier Query Budget (NIST SP 800-226)
|
|
411
412
|
|
|
412
413
|
To prevent advanced statistical differentiation or database reconstruction attacks, the SDK implements a tiered, session-based budget engine:
|
|
413
414
|
|
|
@@ -417,27 +418,27 @@ To prevent advanced statistical differentiation or database reconstruction attac
|
|
|
417
418
|
|
|
418
419
|
If an injected payload queries a field beyond its budget limit, the preflight static analysis immediately blocks execution.
|
|
419
420
|
|
|
420
|
-
###
|
|
421
|
+
### K-Anonymity on Small Datasets
|
|
421
422
|
|
|
422
423
|
When operating on high-privacy datasets, if the source records count is **less than 10**, the SDK forces a strict K-Anonymity restriction:
|
|
423
424
|
- Rejects any output that contains nested objects or arrays.
|
|
424
425
|
- Restricts the returned structure to a maximum of **3 scalar keys** (e.g., simple aggregate counts or statistics).
|
|
425
426
|
- Prevents structural data leakage in low-entropy datasets.
|
|
426
427
|
|
|
427
|
-
###
|
|
428
|
+
### Sandbox Poisoned Globals & Date Workaround
|
|
428
429
|
|
|
429
430
|
For maximum host security, the WASI sandbox enforces a poisoned environment that strips dangerous globals and prevents timing side-channels:
|
|
430
431
|
- **Poisoned/Disabled**: `Date` (Date.now, parse, etc. throw an exception to prevent timing analysis), `eval`, `Function`, `setTimeout`, `setInterval`, `Buffer`, `ArrayBuffer`, and all `TypedArrays`.
|
|
431
432
|
- **Date Workaround**: To perform date checks, use lexicographical string comparison on ISO 8601 strings (e.g., `record.date >= "2026-01-01"`).
|
|
432
433
|
|
|
433
|
-
###
|
|
434
|
+
### Recursive In-Memory Numerical Sanitization
|
|
434
435
|
|
|
435
436
|
To mitigate timing channels, statistical differentiation, and floats side-channels, the SDK executes a recursive sanitization pipeline before the PII scanner runs:
|
|
436
437
|
- Positive floating-point numbers are recursively rounded to exactly **4 decimal places**.
|
|
437
438
|
- Negative values are safely clamped to **0** (via `sanitizeOutput()`).
|
|
438
439
|
- This operation runs entirely in-memory and recursively on all fields, preserving data structure immutability without expensive and fragile serialization-deserialization cycles.
|
|
439
440
|
|
|
440
|
-
###
|
|
441
|
+
### Environment Isolation & allowEnv Allowlist
|
|
441
442
|
|
|
442
443
|
For robust sandboxing, the WASI execution path isolates host environment variables. Propagation can be enabled explicitly:
|
|
443
444
|
```typescript
|
|
@@ -450,11 +451,46 @@ To block arbitrary command execution (e.g., Shellshock) and prevent exposure of
|
|
|
450
451
|
- **Unix/Linux Allowlist**: `HOME`, `LOGNAME`, `PATH`, `SHELL`, `TERM`, `USER`.
|
|
451
452
|
Variables starting with shell functions `()` are dropped.
|
|
452
453
|
|
|
453
|
-
###
|
|
454
|
+
### Sovereign ZK-Receipts & Groth16 Attestation
|
|
455
|
+
|
|
456
|
+
LIOP ZK-Receipts provide cryptographic evidence that a computation was executed honestly under zero-trust bounds. Version 2 receipts introduce true Zero-Knowledge Groth16 proofs over the BN254 pairing-friendly elliptic curve, packing a 144-byte binary journal:
|
|
457
|
+
|
|
458
|
+
- **144-Byte Binary Journal Layout**:
|
|
459
|
+
- `guest_image_id` (32 bytes): Sovereign enclave guest runtime image identifier
|
|
460
|
+
- `logic_digest` (32 bytes): SHA-256 fingerprint of the executed JavaScript/WASM logic
|
|
461
|
+
- `dataset_digest` (32 bytes): SHA-256 fingerprint of the origin dataset at execution time
|
|
462
|
+
- `output_digest` (32 bytes): SHA-256 fingerprint of the sanitized computation result
|
|
463
|
+
- `fuel_consumed` (8 bytes uint64 BE): AST fuel metering units consumed
|
|
464
|
+
- `execution_timestamp` (8 bytes uint64 BE): Epoch timestamp in milliseconds
|
|
465
|
+
- **Tampering & Replay Mitigation**: The client computes the local SHA-256 hash of the received output and asserts strict equality with `journal.outputDigest`. Any modified bit in either the journal or curve proof causes immediate rejection.
|
|
466
|
+
- **Enclave Policy Invariant (`ZK_BLOCKING`)**: Tier 1 Sovereign Enclaves configure `zkMode: "required"`, rejecting queries if a valid Groth16 proof cannot be synthesized.
|
|
467
|
+
|
|
468
|
+
```typescript
|
|
469
|
+
import { LiopServer } from "@nekzus/liop/server";
|
|
470
|
+
import { LiopVerifier } from "@nekzus/liop";
|
|
471
|
+
|
|
472
|
+
// 1. Enclave configuration with ZK_BLOCKING policy
|
|
473
|
+
const server = new LiopServer({ name: "bank-enclave", version: "1.0.0" });
|
|
474
|
+
server.tool(
|
|
475
|
+
"calculate_payroll_aggregate",
|
|
476
|
+
"Aggregates payroll without egressing employee identities",
|
|
477
|
+
{ payload: z.string() },
|
|
478
|
+
async () => ({ content: [{ type: "text", text: "ok" }] }),
|
|
479
|
+
{
|
|
480
|
+
zkMode: "required", // Enforces Groth16 proof generation (ZK_BLOCKING)
|
|
481
|
+
circuitName: "sum",
|
|
482
|
+
}
|
|
483
|
+
);
|
|
454
484
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
485
|
+
// 2. Client verification via LiopVerifier
|
|
486
|
+
const verifier = new LiopVerifier();
|
|
487
|
+
const isValid = await verifier.verifyZkReceipt(
|
|
488
|
+
Buffer.from(logicPayload),
|
|
489
|
+
remoteImageIdHex,
|
|
490
|
+
rawReceiptBuffer,
|
|
491
|
+
{ zkPolicy: "required" }
|
|
492
|
+
);
|
|
493
|
+
```
|
|
458
494
|
|
|
459
495
|
---
|
|
460
496
|
|
|
@@ -498,7 +534,7 @@ Node.js is single-threaded. Heavy operations like Kyber768 decryption, AES-GCM a
|
|
|
498
534
|
This SDK dispatches all heavy computation to OS-level threads via [`piscina`](https://github.com/piscinajs/piscina), achieving Rust-like concurrency. On server or verifier initialization, background warmup tasks are automatically dispatched to pre-warm the pool workers, eliminating V8/WASI cold-start overhead (~820k fuel units) for subsequent calls:
|
|
499
535
|
|
|
500
536
|
```typescript
|
|
501
|
-
// Automatic
|
|
537
|
+
// Automatic, no configuration needed
|
|
502
538
|
// When a Logic-Injection-on-Origin payload is received:
|
|
503
539
|
// 1. Main thread receives JSON-RPC request
|
|
504
540
|
// 2. Worker thread: AST inspection + PQC decryption + Sandbox execution
|
|
@@ -571,7 +607,7 @@ Navigate to **`http://localhost:16000`** in your browser:
|
|
|
571
607
|
|
|
572
608
|
* **Live 7-Phase Streaming:** Visualizes Bootstrap, DHT Discovery, ML-KEM-768 Handshake, AES-256-GCM Sealing, WASI Sandbox Execution, ZK-Receipt Verification, and Output Aggregation via real-time Server-Sent Events (SSE).
|
|
573
609
|
* **Tri-Tab Results Panel:** Switch between `Aggregated Output` (sanitized JSON), `Fuel & Telemetry` (WASI fuel metering, token economy comparison banner), and `Crypto Proofs` (ImageID, Dataset Hash, and HMAC-SHA256 signature with instant copy).
|
|
574
|
-
* **Token Economy Dashboard:** Live comparison showing **98.9%
|
|
610
|
+
* **Token Economy Dashboard:** Live comparison showing **98.9% to 99.6% token reduction** and **99.6% network bandwidth savings** over traditional MCP context-pulling.
|
|
575
611
|
* **REST Telemetry Endpoint:** Query session analytics programmatically at `GET http://localhost:16000/api/telemetry`.
|
|
576
612
|
* **Built-in Scenario Presets:** Ready-to-run micro-modules for High-Frequency Trading (HFT Level 2 order books), Banking transaction analysis, Medical Vault HIPAA records, and Edge IoT industrial sensor telemetry.
|
|
577
613
|
* **Dual Dark Modes:** Toggle between Obsidian OLED (`#000000`) and Slate Navy (`#0f172a`) interfaces.
|
|
@@ -618,7 +654,7 @@ This package is continuously tested across multiple platforms and Node.js versio
|
|
|
618
654
|
- **Multi-OS matrix:** Ubuntu, Windows, macOS
|
|
619
655
|
- **Node.js versions:** 20.x, 22.x
|
|
620
656
|
- **Code quality:** Enforced by [Biome.js](https://biomejs.dev/) (linting + formatting)
|
|
621
|
-
- **Security:** Verified 6-layer defense-in-depth architecture
|
|
657
|
+
- **Security:** Verified 6-layer defense-in-depth architecture (see [Security Architecture](https://nekzus-32.mintlify.app/typescript-sdk/security))
|
|
622
658
|
|
|
623
659
|
> To run tests locally or contribute, clone the [repository](https://github.com/Nekzus/LIOP) and follow the [Contributing Guide](https://github.com/Nekzus/LIOP/blob/main/CONTRIBUTING.md).
|
|
624
660
|
|
|
@@ -638,12 +674,12 @@ The codebase undergoes regular dependencies audits. As of June 2026, the SDK is
|
|
|
638
674
|
|
|
639
675
|
## Related
|
|
640
676
|
|
|
641
|
-
- [LIOP Documentation](https://nekzus-32.mintlify.app/)
|
|
642
|
-
- [LIOP Specification](https://github.com/Nekzus/LIOP/blob/main/protocol/SPECIFICATION.md)
|
|
643
|
-
- [LIOP Manifesto](https://github.com/Nekzus/LIOP/blob/main/MANIFESTO.md)
|
|
644
|
-
- [Contributing Guide](https://github.com/Nekzus/LIOP/blob/main/CONTRIBUTING.md)
|
|
645
|
-
- [Rust Mesh Node](https://github.com/Nekzus/LIOP/tree/main/servers/liop-node)
|
|
646
|
-
- [LIOP CLI](https://github.com/Nekzus/LIOP/tree/main/tools/liop-cli)
|
|
677
|
+
- [LIOP Documentation](https://nekzus-32.mintlify.app/): Full conceptual and API documentation
|
|
678
|
+
- [LIOP Specification](https://github.com/Nekzus/LIOP/blob/main/protocol/SPECIFICATION.md): Technical specification
|
|
679
|
+
- [LIOP Manifesto](https://github.com/Nekzus/LIOP/blob/main/MANIFESTO.md): Project philosophy
|
|
680
|
+
- [Contributing Guide](https://github.com/Nekzus/LIOP/blob/main/CONTRIBUTING.md): How to contribute
|
|
681
|
+
- [Rust Mesh Node](https://github.com/Nekzus/LIOP/tree/main/servers/liop-node): Native high-performance backend
|
|
682
|
+
- [LIOP CLI](https://github.com/Nekzus/LIOP/tree/main/tools/liop-cli): Developer diagnostics
|
|
647
683
|
|
|
648
684
|
---
|
|
649
685
|
|
package/dist/bin/agent.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { probeTopology, RoutingTable } from '../chunk-PUDETPL4.js';
|
|
3
3
|
import { TokenManager } from '../chunk-3QH44NKZ.js';
|
|
4
|
-
import { LiopServer } from '../chunk-
|
|
4
|
+
import { LiopServer } from '../chunk-T2QDHVUD.js';
|
|
5
5
|
import '../chunk-Y62GORQF.js';
|
|
6
|
-
import { LiopMcpRouter } from '../chunk-
|
|
7
|
-
import '../chunk-
|
|
6
|
+
import { LiopMcpRouter } from '../chunk-AMSFSS2I.js';
|
|
7
|
+
import '../chunk-ZRWNMP5L.js';
|
|
8
8
|
import '../chunk-IK7CGWAZ.js';
|
|
9
9
|
import '../chunk-7PITYWOV.js';
|
|
10
10
|
import '../chunk-WPTOJYN5.js';
|
|
11
|
-
import '../chunk-
|
|
12
|
-
import '../chunk-
|
|
13
|
-
import { isLegacyRequest } from '../chunk-
|
|
11
|
+
import '../chunk-GFGSHQN5.js';
|
|
12
|
+
import '../chunk-Q3FKHJ3B.js';
|
|
13
|
+
import { isLegacyRequest } from '../chunk-YLFNJQI2.js';
|
|
14
|
+
import '../chunk-P34HDRN5.js';
|
|
14
15
|
import '../chunk-FTF6AMF6.js';
|
|
15
16
|
import '../chunk-ZP3VVXOI.js';
|
|
16
|
-
import { MeshNode } from '../chunk-
|
|
17
|
+
import { MeshNode } from '../chunk-KB3HUVMD.js';
|
|
17
18
|
import { log } from '../chunk-K3DGJLUY.js';
|
|
18
19
|
import * as fs from 'fs';
|
|
19
20
|
import * as os from 'os';
|
package/dist/bin/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/agent.ts"],"names":["token"],"mappings":"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","file":"agent.js","sourcesContent":["#!/usr/bin/env node\n\n// Copyright 2026 Nekzus Solutions and contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport * as readline from \"node:readline\";\nimport { multiaddr } from \"@multiformats/multiaddr\";\nimport { isLegacyRequest } from \"../gateway/mcp-compat.js\";\nimport { LiopMcpRouter } from \"../gateway/router.js\";\nimport { MeshNode } from \"../mesh/index.js\";\nimport { RoutingTable, type ToolDefinition } from \"../runtime/routing-table.js\";\nimport { TokenManager } from \"../runtime/token-manager.js\";\nimport {\n\ttype GatewayTopologyInfo,\n\ttype MeshTopologyInfo,\n\tprobeTopology,\n\ttype TopologyProbeResult,\n} from \"../runtime/topology-probe.js\";\nimport { LiopServer } from \"../server/index.js\";\nimport type { McpRequest, McpResponse } from \"../types.js\";\nimport { log } from \"../utils/logger.js\";\n\n/**\n * Mandatory Diagnostic Tool definition.\n * Claude Desktop silently hides the connector if it receives an empty array initially.\n */\nconst LIOP_MESH_STATUS_TOOL: ToolDefinition = {\n\tname: \"LiopMeshStatus\",\n\tdescription:\n\t\t\"LiopMeshStatus: Returns the current dynamic diagnostic status of the Zero-Trust Neural Mesh.\",\n\tinputSchema: {\n\t\ttype: \"object\",\n\t\tproperties: {},\n\t\tadditionalProperties: false,\n\t},\n};\n\n/**\n * Resolves a full libp2p multiaddr (with PeerID) from a LIOP node's\n * HTTP health endpoint.\n */\nasync function resolveBootstrapFromUrl(url: string): Promise<string | null> {\n\ttry {\n\t\tconst healthUrl = url.endsWith(\"/health\") ? url : `${url}/health`;\n\t\tconst response = await fetch(healthUrl, {\n\t\t\theaders: { Accept: \"application/json\" },\n\t\t\tsignal: AbortSignal.timeout(10000),\n\t\t});\n\t\tif (!response.ok) return null;\n\n\t\tconst data = (await response.json()) as {\n\t\t\tmesh?: { multiaddrs?: string[]; peerId?: string };\n\t\t};\n\t\tif (!data.mesh?.multiaddrs?.length || !data.mesh?.peerId) return null;\n\n\t\tconst tcpAddr = data.mesh.multiaddrs.find(\n\t\t\t(a: string) =>\n\t\t\t\ta.includes(\"/tcp/\") &&\n\t\t\t\t!a.includes(\"/ws\") &&\n\t\t\t\t!a.includes(\"/ip4/127.0.0.1/\"),\n\t\t);\n\t\tif (!tcpAddr) return null;\n\n\t\tlet resolved = shouldEnableDockerMap()\n\t\t\t? industrialAddressMapper(tcpAddr)\n\t\t\t: tcpAddr;\n\t\tif (!resolved || resolved === tcpAddr) {\n\t\t\tconst urlHost = new URL(url).hostname;\n\t\t\tresolved = tcpAddr.replace(/\\/ip4\\/[^/]+/, `/ip4/${urlHost}`);\n\t\t}\n\n\t\tif (!resolved) return null;\n\t\tresolved += resolved.includes(\"/p2p/\") ? \"\" : `/p2p/${data.mesh.peerId}`;\n\t\treturn resolved;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Normalizes a bootstrap multiaddr string to 127.0.0.1 for local Docker bridge resilience.\n */\nfunction normalizeBootstrap(addr: string): string {\n\tconst trimmed = addr.trim();\n\tconst dockerIpRegex =\n\t\t/\\/ip4\\/172\\.(1[6-9]|2[0-9]|3[0-1])\\.[0-9]{1,3}\\.[0-9]{1,3}/;\n\tconst loopbackRegex = /\\/ip4\\/127\\.0\\.0\\.1/;\n\tconst physicalIpRegex = /\\/ip4\\/192\\.168\\.[0-9]{1,3}\\.[0-9]{1,3}/;\n\n\tif (\n\t\tdockerIpRegex.test(trimmed) ||\n\t\tloopbackRegex.test(trimmed) ||\n\t\tphysicalIpRegex.test(trimmed)\n\t) {\n\t\tconst targetIp = \"127.0.0.1\";\n\t\tconst normalized = trimmed\n\t\t\t.replace(dockerIpRegex, `/ip4/${targetIp}`)\n\t\t\t.replace(loopbackRegex, `/ip4/${targetIp}`)\n\t\t\t.replace(physicalIpRegex, `/ip4/${targetIp}`);\n\n\t\tif (normalized !== trimmed) {\n\t\t\tlog.info(\n\t\t\t\t`[LIOP-Agent] 🔄 Local Routing Hack → Forced 127.0.0.1: ${normalized}`,\n\t\t\t);\n\t\t}\n\t\treturn normalized;\n\t}\n\n\treturn trimmed;\n}\n\n/**\n * Maps Docker-internal IPs to host-published ports for local environments.\n * Supports both legacy demo ports (13001-13005) and production tier ports (15001-15041).\n */\nfunction industrialAddressMapper(addr: string): string | null {\n\t// Production Multi-Tier Mappings\n\tif (addr.includes(\"/ip4/172.23.0.10\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.23\\.0\\.10\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/15001\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.23.0.20\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.23\\.0\\.20\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/15011\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.21.0.13\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.21\\.0\\.13\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/15031\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.21.0.14\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.21\\.0\\.14\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/15041\",\n\t\t);\n\n\t// Legacy Demo Cluster Mappings\n\tif (addr.includes(\"/ip4/172.20.0.10\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.20\\.0\\.10\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/13001\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.20.0.11\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.20\\.0\\.11\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/13003\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.20.0.12\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.20\\.0\\.12\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/13004\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.20.0.13\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.20\\.0\\.13\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/13005\",\n\t\t);\n\n\t// Drop container-internal loopbacks\n\tif (\n\t\taddr.includes(\"/ip4/127.0.0.1/tcp/4000\") ||\n\t\taddr.includes(\"/ip4/127.0.0.1/tcp/3000\")\n\t) {\n\t\treturn null;\n\t}\n\n\treturn addr;\n}\n\nfunction isDockerDemoHost(urlStr: string): boolean {\n\ttry {\n\t\tconst u = new URL(urlStr);\n\t\treturn (\n\t\t\t(u.hostname === \"127.0.0.1\" || u.hostname === \"localhost\") &&\n\t\t\t(u.port === \"13000\" ||\n\t\t\t\tu.port === \"13001\" ||\n\t\t\t\tu.port === \"15000\" ||\n\t\t\t\tu.port === \"15018\")\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction shouldEnableDockerMap(): boolean {\n\treturn (\n\t\tprocess.env.NODE_ENV === \"development\" ||\n\t\tprocess.env.NODE_ENV === \"test\" ||\n\t\tprocess.env.LIOP_DOCKER_MAP === \"true\" ||\n\t\tprocess.env.LIOP_DEV_MODE === \"true\" ||\n\t\t(!!process.env.LIOP_NEXUS_URL &&\n\t\t\tisDockerDemoHost(process.env.LIOP_NEXUS_URL))\n\t);\n}\n\n/**\n * Discovers P2P bootstrap nodes through physical beacons, env vars, and URL discovery.\n */\nasync function resolveBootstrapNodes(liopDir: string): Promise<string[]> {\n\tlet bootstrapNodes: string[] = [];\n\tconst args = process.argv.slice(2);\n\tif (args.length > 0) {\n\t\tbootstrapNodes = args.filter((a) => a.startsWith(\"/\"));\n\t}\n\n\tif (bootstrapNodes.length === 0) {\n\t\tconst searchDirs = [\n\t\t\tprocess.cwd(),\n\t\t\tpath.join(process.cwd(), \"tests/infra/nexus-data\"),\n\t\t\tliopDir,\n\t\t\tpath.join(\n\t\t\t\tpath\n\t\t\t\t\t.dirname(new URL(import.meta.url).pathname)\n\t\t\t\t\t.replace(/^\\/([A-Z]:)/, \"$1\"),\n\t\t\t\t\"../../tests/infra/nexus-data\",\n\t\t\t),\n\t\t];\n\n\t\tfor (const dir of searchDirs) {\n\t\t\ttry {\n\t\t\t\tif (fs.existsSync(dir)) {\n\t\t\t\t\tconst files = fs.readdirSync(dir);\n\t\t\t\t\tconst multiaddrFiles = files.filter((f) => f.endsWith(\".multiaddr\"));\n\n\t\t\t\t\tfor (const file of multiaddrFiles) {\n\t\t\t\t\t\tconst filePath = path.join(dir, file);\n\t\t\t\t\t\tconst addr = fs.readFileSync(filePath, \"utf8\").trim();\n\t\t\t\t\t\tif (addr) {\n\t\t\t\t\t\t\tconst normalized = normalizeBootstrap(addr);\n\t\t\t\t\t\t\tif (!bootstrapNodes.includes(normalized)) {\n\t\t\t\t\t\t\t\tbootstrapNodes.push(normalized);\n\t\t\t\t\t\t\t\tlog.info(`[LIOP-Agent] ✅ Loaded beacon: ${file} from ${dir}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (bootstrapNodes.length > 0) break;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t}\n\t}\n\n\tif (process.env.LIOP_NEXUS_URL) {\n\t\tconst nexusUrl = process.env.LIOP_NEXUS_URL;\n\t\tconst resolved = await resolveBootstrapFromUrl(nexusUrl);\n\t\tif (resolved) {\n\t\t\tconst normalized = normalizeBootstrap(resolved);\n\t\t\tif (!bootstrapNodes.includes(normalized)) {\n\t\t\t\tbootstrapNodes.push(normalized);\n\t\t\t\tlog.info(\n\t\t\t\t\t`[LIOP-Agent] ✅ Added bootstrap from URL discovery: ${normalized}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bootstrapNodes.length === 0 && process.env.LIOP_BOOTSTRAP) {\n\t\tbootstrapNodes.push(process.env.LIOP_BOOTSTRAP.trim());\n\t}\n\n\treturn bootstrapNodes.filter((addr) => {\n\t\ttry {\n\t\t\tmultiaddr(addr);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\n/**\n * Dispatches an MCP request to an HTTP Gateway (BLG) with automatic token negotiation.\n */\nasync function forwardToGateway(\n\tmcpEndpoint: string,\n\trequest: McpRequest,\n\ttokenManager: TokenManager,\n): Promise<McpResponse> {\n\tconst send = async (token?: string) => {\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t};\n\t\tif (token) {\n\t\t\theaders.Authorization = `Bearer ${token}`;\n\t\t}\n\t\tif (request.method) {\n\t\t\theaders[\"Mcp-Method\"] = request.method;\n\t\t}\n\t\tconst params = request.params as { name?: string } | undefined;\n\t\tif (params?.name) {\n\t\t\theaders[\"Mcp-Name\"] = params.name;\n\t\t}\n\n\t\treturn await fetch(mcpEndpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(request),\n\t\t\tsignal: AbortSignal.timeout(30000),\n\t\t});\n\t};\n\n\tlet token: string | undefined;\n\ttry {\n\t\ttoken = await tokenManager.getToken();\n\t} catch (err) {\n\t\tlog.warn(\n\t\t\t`[LIOP-Agent] Token acquisition warning: ${err instanceof Error ? err.message : String(err)}`,\n\t\t);\n\t}\n\n\tlet response = await send(token);\n\n\t// If 401 Unauthorized, invalidate token and retry once\n\tif (response.status === 401 && token) {\n\t\tlog.info(\n\t\t\t\"[LIOP-Agent] 🔄 401 received from Gateway. Refreshing token and retrying...\",\n\t\t);\n\t\ttokenManager.invalidate();\n\t\ttry {\n\t\t\ttoken = await tokenManager.getToken();\n\t\t\tresponse = await send(token);\n\t\t} catch {\n\t\t\t/* fallback to original error handling */\n\t\t}\n\t}\n\n\tif (!response.ok) {\n\t\tconst errorBody = await response.text();\n\t\tlet parsedError: Record<string, unknown> | null = null;\n\t\ttry {\n\t\t\tparsedError = JSON.parse(errorBody);\n\t\t} catch {\n\t\t\t// not json\n\t\t}\n\n\t\tconst errorObj = parsedError?.error as\n\t\t\t| { code?: number; message?: string }\n\t\t\t| undefined;\n\t\treturn {\n\t\t\tjsonrpc: \"2.0\",\n\t\t\tid: request.id,\n\t\t\terror: {\n\t\t\t\tcode: errorObj?.code ?? -32603,\n\t\t\t\tmessage:\n\t\t\t\t\terrorObj?.message ??\n\t\t\t\t\t`Gateway returned HTTP ${response.status}: ${errorBody}`,\n\t\t\t},\n\t\t};\n\t}\n\n\treturn (await response.json()) as McpResponse;\n}\n\n/**\n * Operates in Mode 1: GATEWAY MODE.\n * Ultra-lightweight, sub-50ms startup, zero libp2p overhead.\n */\nasync function runGatewayMode(\n\tgateway: GatewayTopologyInfo,\n\ttokenManager: TokenManager,\n\troutingTable: RoutingTable,\n) {\n\tlog.info(\n\t\t`[LIOP-Agent] 🛡️ Running in ADAPTIVE GATEWAY MODE -> ${gateway.mcpEndpoint}`,\n\t);\n\n\t// Register known initial tools\n\troutingTable.registerLocalTool(LIOP_MESH_STATUS_TOOL);\n\troutingTable.registerGatewayTools(\n\t\tgateway.tools.map((t) => ({ name: t })),\n\t\tgateway.mcpEndpoint,\n\t);\n\n\t// Periodic tool refresh from /health to notify Claude of any changes\n\tlet lastToolCount = gateway.tools.length;\n\tconst pollInterval = setInterval(async () => {\n\t\ttry {\n\t\t\tconst res = await fetch(gateway.healthEndpoint, {\n\t\t\t\theaders: { Accept: \"application/json\" },\n\t\t\t\tsignal: AbortSignal.timeout(4000),\n\t\t\t});\n\t\t\tif (res.ok) {\n\t\t\t\tconst data = (await res.json()) as { tools?: string[] };\n\t\t\t\tif (data.tools && data.tools.length !== lastToolCount) {\n\t\t\t\t\tlog.info(\n\t\t\t\t\t\t`[LIOP-Agent] Gateway tools topology updated (${lastToolCount} -> ${data.tools.length})`,\n\t\t\t\t\t);\n\t\t\t\t\tlastToolCount = data.tools.length;\n\t\t\t\t\troutingTable.registerGatewayTools(\n\t\t\t\t\t\tdata.tools.map((t) => ({ name: t })),\n\t\t\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/tools/list_changed\"}\\n`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/resources/list_changed\"}\\n`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore polling errors\n\t\t}\n\t}, 15000);\n\n\tconst rl = readline.createInterface({\n\t\tinput: process.stdin,\n\t\tterminal: false,\n\t});\n\n\tprocess.stdout.on(\"error\", (err: Error & { code?: string }) => {\n\t\tif (err.code === \"EPIPE\") {\n\t\t\tclearInterval(pollInterval);\n\t\t\tprocess.exit(0);\n\t\t}\n\t});\n\n\trl.on(\"line\", async (line) => {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed) return;\n\n\t\tlet request: McpRequest;\n\t\ttry {\n\t\t\trequest = JSON.parse(trimmed);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { id, method } = request;\n\n\t\tif (method === \"server/discover\") {\n\t\t\tconst discoverResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\tsupportedVersions: [\"2026-07-28\", \"2025-11-25\"],\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\ttools: { listChanged: true },\n\t\t\t\t\t\tresources: { listChanged: true, subscribe: true },\n\t\t\t\t\t\tprompts: { listChanged: true },\n\t\t\t\t\t},\n\t\t\t\t\tserverInfo: {\n\t\t\t\t\t\tname: \"liop-adaptive-agent\",\n\t\t\t\t\t\tversion: \"2.5.0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(discoverResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"initialize\") {\n\t\t\tconst clientVersion =\n\t\t\t\t(\n\t\t\t\t\trequest.params as {\n\t\t\t\t\t\tprotocolVersion?: string;\n\t\t\t\t\t\t_meta?: { \"io.modelcontextprotocol/protocolVersion\"?: string };\n\t\t\t\t\t}\n\t\t\t\t)?.protocolVersion ??\n\t\t\t\t(\n\t\t\t\t\trequest.params as {\n\t\t\t\t\t\t_meta?: { \"io.modelcontextprotocol/protocolVersion\"?: string };\n\t\t\t\t\t}\n\t\t\t\t)?._meta?.[\"io.modelcontextprotocol/protocolVersion\"];\n\t\t\tconst protocolVersion =\n\t\t\t\tclientVersion === \"2026-07-28\" ? \"2026-07-28\" : \"2025-11-25\";\n\n\t\t\tconst initResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tprotocolVersion,\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\ttools: { listChanged: true },\n\t\t\t\t\t\tresources: { listChanged: true, subscribe: true },\n\t\t\t\t\t\tprompts: { listChanged: true },\n\t\t\t\t\t},\n\t\t\t\t\tserverInfo: {\n\t\t\t\t\t\tname: \"liop-adaptive-agent\",\n\t\t\t\t\t\tversion: \"2.5.0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(initResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmethod === \"notifications/initialized\" ||\n\t\t\tmethod === \"notifications/cancelled\"\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"ping\") {\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${JSON.stringify({ jsonrpc: \"2.0\", id, result: {} })}\\n`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"resources/templates/list\") {\n\t\t\tconst templatesResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\tttlMs: 300_000,\n\t\t\t\t\tcacheScope: \"public\",\n\t\t\t\t\tresourceTemplates: [],\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(templatesResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"subscriptions/listen\") {\n\t\t\tconst listenResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(listenResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"tools/call\") {\n\t\t\tconst params = request.params as\n\t\t\t\t| { name?: string; arguments?: Record<string, unknown> }\n\t\t\t\t| undefined;\n\t\t\tif (params?.name === \"LiopMeshStatus\") {\n\t\t\t\tconst statusResponse: McpResponse = {\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tid,\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: JSON.stringify({\n\t\t\t\t\t\t\t\t\tmode: \"adaptive-gateway\",\n\t\t\t\t\t\t\t\t\tgatewayUrl: gateway.baseUrl,\n\t\t\t\t\t\t\t\t\ttier: gateway.tier,\n\t\t\t\t\t\t\t\t\ttoolsAvailable: routingTable.getAllToolDefinitions().length,\n\t\t\t\t\t\t\t\t\tauthenticated: true,\n\t\t\t\t\t\t\t\t\tstatus: \"ONLINE\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tprocess.stdout.write(`${JSON.stringify(statusResponse)}\\n`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await forwardToGateway(\n\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\trequest,\n\t\t\t\ttokenManager,\n\t\t\t);\n\n\t\t\t// Inject LiopMeshStatus into tools/list if gateway does not list it\n\t\t\tif (\n\t\t\t\tmethod === \"tools/list\" &&\n\t\t\t\tresponse.result &&\n\t\t\t\ttypeof response.result === \"object\"\n\t\t\t) {\n\t\t\t\tconst resObj = response.result as Record<string, unknown>;\n\t\t\t\tconst toolsList = resObj.tools as ToolDefinition[] | undefined;\n\t\t\t\tif (Array.isArray(toolsList)) {\n\t\t\t\t\tconst hasStatus = toolsList.some((t) => t.name === \"LiopMeshStatus\");\n\t\t\t\t\tif (!hasStatus) {\n\t\t\t\t\t\ttoolsList.unshift(LIOP_MESH_STATUS_TOOL);\n\t\t\t\t\t}\n\t\t\t\t\t// Update routing table with descriptions and schemas\n\t\t\t\t\troutingTable.registerGatewayTools(toolsList, gateway.mcpEndpoint);\n\t\t\t\t}\n\n\t\t\t\tif (!isLegacyRequest(request)) {\n\t\t\t\t\tif (!resObj.resultType) {\n\t\t\t\t\t\tresObj.resultType = \"complete\";\n\t\t\t\t\t}\n\t\t\t\t\tif (!resObj.ttlMs) {\n\t\t\t\t\t\tresObj.ttlMs = 300_000;\n\t\t\t\t\t}\n\t\t\t\t\tif (!resObj.cacheScope) {\n\t\t\t\t\t\tresObj.cacheScope = \"public\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprocess.stdout.write(`${JSON.stringify(response)}\\n`);\n\t\t} catch (err) {\n\t\t\t// Fallback resilience for tools/list\n\t\t\tif (method === \"tools/list\") {\n\t\t\t\tconst isLegacy = isLegacyRequest(request);\n\t\t\t\tconst fallbackResult = isLegacy\n\t\t\t\t\t? { tools: routingTable.getAllToolDefinitions() }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\t\t\tttlMs: 300_000,\n\t\t\t\t\t\t\tcacheScope: \"public\",\n\t\t\t\t\t\t\ttools: routingTable.getAllToolDefinitions(),\n\t\t\t\t\t\t};\n\t\t\t\tconst fallbackResponse: McpResponse = {\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tid,\n\t\t\t\t\tresult: fallbackResult,\n\t\t\t\t};\n\t\t\t\tprocess.stdout.write(`${JSON.stringify(fallbackResponse)}\\n`);\n\t\t\t} else {\n\t\t\t\tconst errResponse: McpResponse = {\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tid,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: -32603,\n\t\t\t\t\t\tmessage: `Forwarding failed: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tprocess.stdout.write(`${JSON.stringify(errResponse)}\\n`);\n\t\t\t}\n\t\t}\n\t});\n\n\trl.on(\"close\", () => {\n\t\tclearInterval(pollInterval);\n\t\tprocess.exit(0);\n\t});\n}\n\n/**\n * Operates in Mode 2: MESH MODE.\n * Preserves full libp2p Kademlia DHT P2P discovery for decentralized environments.\n */\nasync function runMeshMode(mesh: MeshTopologyInfo) {\n\tlog.info(\n\t\t`[LIOP-Agent] 🌐 Running in P2P MESH MODE (${mesh.bootstrapNodes.length} bootstraps)`,\n\t);\n\n\tconst liopServer = new LiopServer({\n\t\tname: \"@nekzus/liop\",\n\t\tversion: \"2.5.0\",\n\t});\n\tliopServer.enableZeroShotAutonomy();\n\n\tconst meshNode = new MeshNode({\n\t\tidentityPath: mesh.identityPath,\n\t\tbootstrapNodes: mesh.bootstrapNodes,\n\t\taddressMapper: shouldEnableDockerMap()\n\t\t\t? industrialAddressMapper\n\t\t\t: undefined,\n\t});\n\n\tawait meshNode.start();\n\tconst router = new LiopMcpRouter(liopServer, meshNode);\n\n\trouter.onToolsChanged = () => {\n\t\tprocess.stdout.write(\n\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/tools/list_changed\"}\\n`,\n\t\t);\n\t\tprocess.stdout.write(\n\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/resources/list_changed\"}\\n`,\n\t\t);\n\t};\n\n\tsetTimeout(() => {\n\t\trouter.refreshManifestCache(true).catch(() => {});\n\t}, 2000);\n\n\tconst POLL_BASE_MS = 10_000;\n\tconst POLL_MAX_MS = 120_000;\n\tlet pollIntervalMs = POLL_BASE_MS;\n\n\tconst scheduleAdaptivePoll = () => {\n\t\tsetTimeout(async () => {\n\t\t\tconst prevSize = router.getCacheSize();\n\t\t\tawait router.refreshManifestCache(true).catch(() => {});\n\t\t\tconst newSize = router.getCacheSize();\n\n\t\t\tif (newSize !== prevSize) {\n\t\t\t\tpollIntervalMs = POLL_BASE_MS;\n\t\t\t} else {\n\t\t\t\tpollIntervalMs = Math.min(\n\t\t\t\t\tMath.round(pollIntervalMs * 1.5),\n\t\t\t\t\tPOLL_MAX_MS,\n\t\t\t\t);\n\t\t\t}\n\t\t\tscheduleAdaptivePoll();\n\t\t}, pollIntervalMs);\n\t};\n\tscheduleAdaptivePoll();\n\n\tconst rl = readline.createInterface({\n\t\tinput: process.stdin,\n\t\tterminal: false,\n\t});\n\n\tprocess.stdout.on(\"error\", (err: Error & { code?: string }) => {\n\t\tif (err.code === \"EPIPE\") process.exit(0);\n\t});\n\n\trl.on(\"line\", async (line) => {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed) return;\n\n\t\ttry {\n\t\t\tconst request = JSON.parse(trimmed) as McpRequest;\n\t\t\tif (request.method) {\n\t\t\t\tconst response = await router.dispatch(request);\n\t\t\t\tif (response) {\n\t\t\t\t\tprocess.stdout.write(`${JSON.stringify(response)}\\n`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t/* ignore malformed lines */\n\t\t}\n\t});\n\n\trl.on(\"close\", () => process.exit(0));\n\tprocess.on(\"SIGINT\", async () => {\n\t\tawait meshNode.stop();\n\t\tprocess.exit(0);\n\t});\n}\n\n/**\n * Operates in Mode 3: HYBRID MODE.\n * Serves tools via Gateway and Mesh concurrently with per-tool dynamic routing.\n */\nasync function runHybridMode(\n\ttopology: TopologyProbeResult,\n\ttokenManager: TokenManager,\n\troutingTable: RoutingTable,\n) {\n\tconst gateway = topology.gateway;\n\tconst mesh = topology.mesh;\n\tif (!gateway || !mesh) {\n\t\tif (gateway) return runGatewayMode(gateway, tokenManager, routingTable);\n\t\tif (mesh) return runMeshMode(mesh);\n\t\treturn;\n\t}\n\n\tlog.info(\n\t\t`[LIOP-Agent] ⚡ Running in HYBRID MODE (Gateway: ${gateway.baseUrl} + Mesh P2P)`,\n\t);\n\n\t// Setup Gateway tools immediately for fast startup\n\troutingTable.registerLocalTool(LIOP_MESH_STATUS_TOOL);\n\troutingTable.registerGatewayTools(\n\t\tgateway.tools.map((t) => ({ name: t })),\n\t\tgateway.mcpEndpoint,\n\t);\n\n\t// Start P2P Mesh in background (Lazy Initialization)\n\tlet meshNode: MeshNode | null = null;\n\tlet router: LiopMcpRouter | null = null;\n\n\tconst initMeshPromise = (async () => {\n\t\ttry {\n\t\t\tconst liopServer = new LiopServer({\n\t\t\t\tname: \"@nekzus/liop-hybrid\",\n\t\t\t\tversion: \"2.5.0\",\n\t\t\t});\n\t\t\tliopServer.enableZeroShotAutonomy();\n\n\t\t\tmeshNode = new MeshNode({\n\t\t\t\tidentityPath: mesh.identityPath,\n\t\t\t\tbootstrapNodes: mesh.bootstrapNodes,\n\t\t\t\taddressMapper: shouldEnableDockerMap()\n\t\t\t\t\t? industrialAddressMapper\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tawait meshNode.start();\n\t\t\trouter = new LiopMcpRouter(liopServer, meshNode);\n\n\t\t\trouter.onToolsChanged = () => {\n\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/tools/list_changed\"}\\n`,\n\t\t\t\t);\n\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/resources/list_changed\"}\\n`,\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tawait router.refreshManifestCache(true).catch(() => {});\n\t\t\tlog.info(\"[LIOP-Agent] ✅ Background P2P Mesh initialization completed.\");\n\t\t} catch (err) {\n\t\t\tlog.warn(\n\t\t\t\t`[LIOP-Agent] Background Mesh init warning: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t})();\n\n\tconst rl = readline.createInterface({\n\t\tinput: process.stdin,\n\t\tterminal: false,\n\t});\n\n\tprocess.stdout.on(\"error\", (err: Error & { code?: string }) => {\n\t\tif (err.code === \"EPIPE\") process.exit(0);\n\t});\n\n\trl.on(\"line\", async (line) => {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed) return;\n\n\t\tlet request: McpRequest;\n\t\ttry {\n\t\t\trequest = JSON.parse(trimmed);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { id, method } = request;\n\n\t\tif (method === \"server/discover\") {\n\t\t\tconst discoverResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\tsupportedVersions: [\"2026-07-28\", \"2025-11-25\"],\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\ttools: { listChanged: true },\n\t\t\t\t\t\tresources: { listChanged: true, subscribe: true },\n\t\t\t\t\t\tprompts: { listChanged: true },\n\t\t\t\t\t},\n\t\t\t\t\tserverInfo: {\n\t\t\t\t\t\tname: \"liop-hybrid-agent\",\n\t\t\t\t\t\tversion: \"2.5.0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(discoverResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"initialize\") {\n\t\t\tconst clientVersion =\n\t\t\t\t(\n\t\t\t\t\trequest.params as {\n\t\t\t\t\t\tprotocolVersion?: string;\n\t\t\t\t\t\t_meta?: { \"io.modelcontextprotocol/protocolVersion\"?: string };\n\t\t\t\t\t}\n\t\t\t\t)?.protocolVersion ??\n\t\t\t\t(\n\t\t\t\t\trequest.params as {\n\t\t\t\t\t\t_meta?: { \"io.modelcontextprotocol/protocolVersion\"?: string };\n\t\t\t\t\t}\n\t\t\t\t)?._meta?.[\"io.modelcontextprotocol/protocolVersion\"];\n\t\t\tconst protocolVersion =\n\t\t\t\tclientVersion === \"2026-07-28\" ? \"2026-07-28\" : \"2025-11-25\";\n\n\t\t\tconst initResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tprotocolVersion,\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\ttools: { listChanged: true },\n\t\t\t\t\t\tresources: { listChanged: true, subscribe: true },\n\t\t\t\t\t\tprompts: { listChanged: true },\n\t\t\t\t\t},\n\t\t\t\t\tserverInfo: {\n\t\t\t\t\t\tname: \"liop-hybrid-agent\",\n\t\t\t\t\t\tversion: \"2.5.0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(initResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmethod === \"notifications/initialized\" ||\n\t\t\tmethod === \"notifications/cancelled\"\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"ping\") {\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${JSON.stringify({ jsonrpc: \"2.0\", id, result: {} })}\\n`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"resources/templates/list\") {\n\t\t\tconst templatesResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\tttlMs: 300_000,\n\t\t\t\t\tcacheScope: \"public\",\n\t\t\t\t\tresourceTemplates: [],\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(templatesResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"subscriptions/listen\") {\n\t\t\tconst listenResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(listenResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"tools/call\") {\n\t\t\tconst params = request.params as\n\t\t\t\t| { name?: string; arguments?: Record<string, unknown> }\n\t\t\t\t| undefined;\n\t\t\tconst toolName = params?.name || \"\";\n\n\t\t\tconst route = routingTable.resolve(toolName);\n\t\t\tif (route?.provider === \"http-gateway\") {\n\t\t\t\tconst start = Date.now();\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await forwardToGateway(\n\t\t\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\ttokenManager,\n\t\t\t\t\t);\n\t\t\t\t\troutingTable.recordSuccess(toolName, Date.now() - start);\n\t\t\t\t\tprocess.stdout.write(`${JSON.stringify(res)}\\n`);\n\t\t\t\t\treturn;\n\t\t\t\t} catch (_err) {\n\t\t\t\t\troutingTable.recordFailure(toolName);\n\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t`[LIOP-Agent] Gateway call failed for '${toolName}'. Checking P2P fallback...`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// P2P fallback or native P2P route\n\t\t\tawait initMeshPromise;\n\t\t\tif (router) {\n\t\t\t\tconst res = await router.dispatch(request);\n\t\t\t\tif (res) process.stdout.write(`${JSON.stringify(res)}\\n`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// By default, query gateway for tools/list and combine with mesh\n\t\tif (method === \"tools/list\") {\n\t\t\tlet gatewayTools: ToolDefinition[] = [];\n\t\t\ttry {\n\t\t\t\tconst gwRes = await forwardToGateway(\n\t\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\t\trequest,\n\t\t\t\t\ttokenManager,\n\t\t\t\t);\n\t\t\t\tconst resObj = gwRes.result as { tools?: ToolDefinition[] } | undefined;\n\t\t\t\tif (Array.isArray(resObj?.tools)) {\n\t\t\t\t\tgatewayTools = resObj.tools;\n\t\t\t\t\troutingTable.registerGatewayTools(gatewayTools, gateway.mcpEndpoint);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tgatewayTools = routingTable.getAllToolDefinitions();\n\t\t\t}\n\n\t\t\tlet meshTools: ToolDefinition[] = [];\n\t\t\tif (router) {\n\t\t\t\tconst meshRes = await router.dispatch(request);\n\t\t\t\tconst meshObj = meshRes?.result as\n\t\t\t\t\t| { tools?: ToolDefinition[] }\n\t\t\t\t\t| undefined;\n\t\t\t\tif (Array.isArray(meshObj?.tools)) {\n\t\t\t\t\tmeshTools = meshObj.tools;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Merge distinct tools\n\t\t\tconst toolMap = new Map<string, ToolDefinition>();\n\t\t\ttoolMap.set(\"LiopMeshStatus\", LIOP_MESH_STATUS_TOOL);\n\t\t\tfor (const t of gatewayTools) toolMap.set(t.name, t);\n\t\t\tfor (const t of meshTools)\n\t\t\t\tif (!toolMap.has(t.name)) toolMap.set(t.name, t);\n\n\t\t\tconst merged = Array.from(toolMap.values()).sort((a, b) =>\n\t\t\t\ta.name.localeCompare(b.name),\n\t\t\t);\n\n\t\t\tconst isLegacy = isLegacyRequest(request);\n\t\t\tconst toolsResult = isLegacy\n\t\t\t\t? { tools: merged }\n\t\t\t\t: {\n\t\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\t\tttlMs: 300_000,\n\t\t\t\t\t\tcacheScope: \"public\",\n\t\t\t\t\t\ttools: merged,\n\t\t\t\t\t};\n\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${JSON.stringify({ jsonrpc: \"2.0\", id, result: toolsResult })}\\n`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Other methods forward to gateway first, then mesh\n\t\ttry {\n\t\t\tconst res = await forwardToGateway(\n\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\trequest,\n\t\t\t\ttokenManager,\n\t\t\t);\n\t\t\tif (\n\t\t\t\t!isLegacyRequest(request) &&\n\t\t\t\tres.result &&\n\t\t\t\ttypeof res.result === \"object\"\n\t\t\t) {\n\t\t\t\tconst resObj = res.result as Record<string, unknown>;\n\t\t\t\tif (!resObj.resultType) {\n\t\t\t\t\tresObj.resultType = \"complete\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocess.stdout.write(`${JSON.stringify(res)}\\n`);\n\t\t} catch {\n\t\t\tawait initMeshPromise;\n\t\t\tif (router) {\n\t\t\t\tconst res = await router.dispatch(request);\n\t\t\t\tif (res) process.stdout.write(`${JSON.stringify(res)}\\n`);\n\t\t\t}\n\t\t}\n\t});\n\n\trl.on(\"close\", async () => {\n\t\tif (meshNode) await meshNode.stop();\n\t\tprocess.exit(0);\n\t});\n}\n\n/**\n * Main Entry Point\n */\nasync function main() {\n\t// Auto-Relaunch: Ensure system CA certificates are loaded for TLS compatibility\n\tif (\n\t\t(process.platform === \"win32\" || process.platform === \"darwin\") &&\n\t\t!process.execArgv.includes(\"--use-system-ca\") &&\n\t\t!(process.env.NODE_OPTIONS ?? \"\").includes(\"--use-system-ca\")\n\t) {\n\t\tconst { spawn } = await import(\"node:child_process\");\n\t\tconst child = spawn(\n\t\t\tprocess.execPath,\n\t\t\t[\"--use-system-ca\", ...process.argv.slice(1)],\n\t\t\t{ stdio: \"inherit\", env: process.env },\n\t\t);\n\t\tchild.on(\"exit\", (code) => process.exit(code ?? 1));\n\t\tchild.on(\"error\", () => process.exit(1));\n\t\tawait new Promise(() => {});\n\t\treturn;\n\t}\n\n\tconst buildTime = new Date().toISOString();\n\tlog.info(\n\t\t`[LIOP-Agent] 🚀 Version 2.5.0 (Adaptive Zero-Config) | Build: ${buildTime}`,\n\t);\n\n\tconst liopDir = path.join(os.homedir(), \".liop\");\n\tconst identityPath = path.join(liopDir, \"identity.json\");\n\tif (!fs.existsSync(liopDir)) {\n\t\tfs.mkdirSync(liopDir, { recursive: true });\n\t}\n\n\t// 1. Resolve candidate P2P bootstrap nodes\n\tconst bootstrapNodes = await resolveBootstrapNodes(liopDir);\n\n\t// 2. Execute Adaptive Topology Probe\n\tconst blgUrl = process.env.LIOP_BLG_URL;\n\tconst nexusUrl = process.env.LIOP_NEXUS_URL;\n\tconst clientId =\n\t\tprocess.env.LIOP_CLIENT_ID ||\n\t\tprocess.env.LIOP_OAUTH_CLIENT_ID ||\n\t\t\"liop-agent\";\n\tconst clientSecret =\n\t\tprocess.env.LIOP_CLIENT_SECRET ||\n\t\tprocess.env.LIOP_OAUTH_CLIENT_SECRET ||\n\t\t\"dev-secret-change-me\";\n\tconst staticToken = process.env.LIOP_TOKEN || process.env.LIOP_OAUTH_TOKEN;\n\n\tconst topology = await probeTopology({\n\t\tblgUrl,\n\t\tnexusUrl,\n\t\tclientId,\n\t\tclientSecret,\n\t\tstaticToken,\n\t\tbootstrapNodes,\n\t\tidentityPath,\n\t});\n\n\tconst routingTable = new RoutingTable();\n\tconst tokenManager = new TokenManager({\n\t\ttokenEndpoint:\n\t\t\ttopology.gateway?.tokenEndpoint ||\n\t\t\t`${nexusUrl || \"http://127.0.0.1:15000\"}/oidc/token`,\n\t\tclientId,\n\t\tclientSecret,\n\t\taudience: topology.gateway?.audience,\n\t\tscopes: topology.gateway?.scopes,\n\t\tstaticToken,\n\t});\n\n\t// 3. Dispatch by Mode\n\tswitch (topology.mode) {\n\t\tcase \"gateway\":\n\t\t\tif (!topology.gateway)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Topology probe indicated gateway mode without gateway info.\",\n\t\t\t\t);\n\t\t\tawait runGatewayMode(topology.gateway, tokenManager, routingTable);\n\t\t\tbreak;\n\t\tcase \"mesh\":\n\t\t\tif (!topology.mesh)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Topology probe indicated mesh mode without mesh info.\",\n\t\t\t\t);\n\t\t\tawait runMeshMode(topology.mesh);\n\t\t\tbreak;\n\t\tcase \"hybrid\":\n\t\t\tawait runHybridMode(topology, tokenManager, routingTable);\n\t\t\tbreak;\n\t}\n}\n\nmain().catch((err) => {\n\tlog.error(`[LIOP-Agent] Fatal Error: ${err.message}`);\n\tprocess.exit(1);\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bin/agent.ts"],"names":["token"],"mappings":"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","file":"agent.js","sourcesContent":["#!/usr/bin/env node\n\n// Copyright 2026 Nekzus Solutions and contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport * as readline from \"node:readline\";\nimport { multiaddr } from \"@multiformats/multiaddr\";\nimport { isLegacyRequest } from \"../gateway/mcp-compat.js\";\nimport { LiopMcpRouter } from \"../gateway/router.js\";\nimport { MeshNode } from \"../mesh/index.js\";\nimport { RoutingTable, type ToolDefinition } from \"../runtime/routing-table.js\";\nimport { TokenManager } from \"../runtime/token-manager.js\";\nimport {\n\ttype GatewayTopologyInfo,\n\ttype MeshTopologyInfo,\n\tprobeTopology,\n\ttype TopologyProbeResult,\n} from \"../runtime/topology-probe.js\";\nimport { LiopServer } from \"../server/index.js\";\nimport type { McpRequest, McpResponse } from \"../types.js\";\nimport { log } from \"../utils/logger.js\";\n\n/**\n * Mandatory Diagnostic Tool definition.\n * Claude Desktop silently hides the connector if it receives an empty array initially.\n */\nconst LIOP_MESH_STATUS_TOOL: ToolDefinition = {\n\tname: \"LiopMeshStatus\",\n\tdescription:\n\t\t\"LiopMeshStatus: Returns the current dynamic diagnostic status of the Zero-Trust Neural Mesh.\",\n\tinputSchema: {\n\t\ttype: \"object\",\n\t\tproperties: {},\n\t\tadditionalProperties: false,\n\t},\n};\n\n/**\n * Resolves a full libp2p multiaddr (with PeerID) from a LIOP node's\n * HTTP health endpoint.\n */\nasync function resolveBootstrapFromUrl(url: string): Promise<string | null> {\n\ttry {\n\t\tconst healthUrl = url.endsWith(\"/health\") ? url : `${url}/health`;\n\t\tconst response = await fetch(healthUrl, {\n\t\t\theaders: { Accept: \"application/json\" },\n\t\t\tsignal: AbortSignal.timeout(10000),\n\t\t});\n\t\tif (!response.ok) return null;\n\n\t\tconst data = (await response.json()) as {\n\t\t\tmesh?: { multiaddrs?: string[]; peerId?: string };\n\t\t};\n\t\tif (!data.mesh?.multiaddrs?.length || !data.mesh?.peerId) return null;\n\n\t\tconst tcpAddr = data.mesh.multiaddrs.find(\n\t\t\t(a: string) =>\n\t\t\t\ta.includes(\"/tcp/\") &&\n\t\t\t\t!a.includes(\"/ws\") &&\n\t\t\t\t!a.includes(\"/ip4/127.0.0.1/\"),\n\t\t);\n\t\tif (!tcpAddr) return null;\n\n\t\tlet resolved = shouldEnableDockerMap()\n\t\t\t? industrialAddressMapper(tcpAddr)\n\t\t\t: tcpAddr;\n\t\tif (!resolved || resolved === tcpAddr) {\n\t\t\tconst urlHost = new URL(url).hostname;\n\t\t\tresolved = tcpAddr.replace(/\\/ip4\\/[^/]+/, `/ip4/${urlHost}`);\n\t\t}\n\n\t\tif (!resolved) return null;\n\t\tresolved += resolved.includes(\"/p2p/\") ? \"\" : `/p2p/${data.mesh.peerId}`;\n\t\treturn resolved;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Normalizes a bootstrap multiaddr string to 127.0.0.1 for local Docker bridge resilience.\n */\nfunction normalizeBootstrap(addr: string): string {\n\tconst trimmed = addr.trim();\n\tconst dockerIpRegex =\n\t\t/\\/ip4\\/172\\.(1[6-9]|2[0-9]|3[0-1])\\.[0-9]{1,3}\\.[0-9]{1,3}/;\n\tconst loopbackRegex = /\\/ip4\\/127\\.0\\.0\\.1/;\n\tconst physicalIpRegex = /\\/ip4\\/192\\.168\\.[0-9]{1,3}\\.[0-9]{1,3}/;\n\n\tif (\n\t\tdockerIpRegex.test(trimmed) ||\n\t\tloopbackRegex.test(trimmed) ||\n\t\tphysicalIpRegex.test(trimmed)\n\t) {\n\t\tconst targetIp = \"127.0.0.1\";\n\t\tconst normalized = trimmed\n\t\t\t.replace(dockerIpRegex, `/ip4/${targetIp}`)\n\t\t\t.replace(loopbackRegex, `/ip4/${targetIp}`)\n\t\t\t.replace(physicalIpRegex, `/ip4/${targetIp}`);\n\n\t\tif (normalized !== trimmed) {\n\t\t\tlog.info(\n\t\t\t\t`[LIOP-Agent] 🔄 Local Routing Hack → Forced 127.0.0.1: ${normalized}`,\n\t\t\t);\n\t\t}\n\t\treturn normalized;\n\t}\n\n\treturn trimmed;\n}\n\n/**\n * Maps Docker-internal IPs to host-published ports for local environments.\n * Supports both legacy demo ports (13001-13005) and production tier ports (15001-15041).\n */\nfunction industrialAddressMapper(addr: string): string | null {\n\t// Production Multi-Tier Mappings\n\tif (addr.includes(\"/ip4/172.23.0.10\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.23\\.0\\.10\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/15001\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.23.0.20\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.23\\.0\\.20\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/15011\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.21.0.13\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.21\\.0\\.13\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/15031\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.21.0.14\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.21\\.0\\.14\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/15041\",\n\t\t);\n\n\t// Legacy Demo Cluster Mappings\n\tif (addr.includes(\"/ip4/172.20.0.10\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.20\\.0\\.10\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/13001\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.20.0.11\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.20\\.0\\.11\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/13003\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.20.0.12\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.20\\.0\\.12\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/13004\",\n\t\t);\n\tif (addr.includes(\"/ip4/172.20.0.13\"))\n\t\treturn addr.replace(\n\t\t\t/\\/ip4\\/172\\.20\\.0\\.13\\/tcp\\/[0-9]+/,\n\t\t\t\"/ip4/127.0.0.1/tcp/13005\",\n\t\t);\n\n\t// Drop container-internal loopbacks\n\tif (\n\t\taddr.includes(\"/ip4/127.0.0.1/tcp/4000\") ||\n\t\taddr.includes(\"/ip4/127.0.0.1/tcp/3000\")\n\t) {\n\t\treturn null;\n\t}\n\n\treturn addr;\n}\n\nfunction isDockerDemoHost(urlStr: string): boolean {\n\ttry {\n\t\tconst u = new URL(urlStr);\n\t\treturn (\n\t\t\t(u.hostname === \"127.0.0.1\" || u.hostname === \"localhost\") &&\n\t\t\t(u.port === \"13000\" ||\n\t\t\t\tu.port === \"13001\" ||\n\t\t\t\tu.port === \"15000\" ||\n\t\t\t\tu.port === \"15018\")\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction shouldEnableDockerMap(): boolean {\n\treturn (\n\t\tprocess.env.NODE_ENV === \"development\" ||\n\t\tprocess.env.NODE_ENV === \"test\" ||\n\t\tprocess.env.LIOP_DOCKER_MAP === \"true\" ||\n\t\tprocess.env.LIOP_DEV_MODE === \"true\" ||\n\t\t(!!process.env.LIOP_NEXUS_URL &&\n\t\t\tisDockerDemoHost(process.env.LIOP_NEXUS_URL))\n\t);\n}\n\n/**\n * Discovers P2P bootstrap nodes through physical beacons, env vars, and URL discovery.\n */\nasync function resolveBootstrapNodes(liopDir: string): Promise<string[]> {\n\tlet bootstrapNodes: string[] = [];\n\tconst args = process.argv.slice(2);\n\tif (args.length > 0) {\n\t\tbootstrapNodes = args.filter((a) => a.startsWith(\"/\"));\n\t}\n\n\tif (bootstrapNodes.length === 0) {\n\t\tconst searchDirs = [\n\t\t\tprocess.cwd(),\n\t\t\tpath.join(process.cwd(), \"tests/infra/nexus-data\"),\n\t\t\tliopDir,\n\t\t\tpath.join(\n\t\t\t\tpath\n\t\t\t\t\t.dirname(new URL(import.meta.url).pathname)\n\t\t\t\t\t.replace(/^\\/([A-Z]:)/, \"$1\"),\n\t\t\t\t\"../../tests/infra/nexus-data\",\n\t\t\t),\n\t\t];\n\n\t\tfor (const dir of searchDirs) {\n\t\t\ttry {\n\t\t\t\tif (fs.existsSync(dir)) {\n\t\t\t\t\tconst files = fs.readdirSync(dir);\n\t\t\t\t\tconst multiaddrFiles = files.filter((f) => f.endsWith(\".multiaddr\"));\n\n\t\t\t\t\tfor (const file of multiaddrFiles) {\n\t\t\t\t\t\tconst filePath = path.join(dir, file);\n\t\t\t\t\t\tconst addr = fs.readFileSync(filePath, \"utf8\").trim();\n\t\t\t\t\t\tif (addr) {\n\t\t\t\t\t\t\tconst normalized = normalizeBootstrap(addr);\n\t\t\t\t\t\t\tif (!bootstrapNodes.includes(normalized)) {\n\t\t\t\t\t\t\t\tbootstrapNodes.push(normalized);\n\t\t\t\t\t\t\t\tlog.info(`[LIOP-Agent] ✅ Loaded beacon: ${file} from ${dir}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (bootstrapNodes.length > 0) break;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t}\n\t}\n\n\tif (process.env.LIOP_NEXUS_URL) {\n\t\tconst nexusUrl = process.env.LIOP_NEXUS_URL;\n\t\tconst resolved = await resolveBootstrapFromUrl(nexusUrl);\n\t\tif (resolved) {\n\t\t\tconst normalized = normalizeBootstrap(resolved);\n\t\t\tif (!bootstrapNodes.includes(normalized)) {\n\t\t\t\tbootstrapNodes.push(normalized);\n\t\t\t\tlog.info(\n\t\t\t\t\t`[LIOP-Agent] ✅ Added bootstrap from URL discovery: ${normalized}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bootstrapNodes.length === 0 && process.env.LIOP_BOOTSTRAP) {\n\t\tbootstrapNodes.push(process.env.LIOP_BOOTSTRAP.trim());\n\t}\n\n\treturn bootstrapNodes.filter((addr) => {\n\t\ttry {\n\t\t\tmultiaddr(addr);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t});\n}\n\n/**\n * Dispatches an MCP request to an HTTP Gateway (BLG) with automatic token negotiation.\n */\nasync function forwardToGateway(\n\tmcpEndpoint: string,\n\trequest: McpRequest,\n\ttokenManager: TokenManager,\n): Promise<McpResponse> {\n\tconst send = async (token?: string) => {\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t};\n\t\tif (token) {\n\t\t\theaders.Authorization = `Bearer ${token}`;\n\t\t}\n\t\tif (request.method) {\n\t\t\theaders[\"Mcp-Method\"] = request.method;\n\t\t}\n\t\tconst params = request.params as { name?: string } | undefined;\n\t\tif (params?.name) {\n\t\t\theaders[\"Mcp-Name\"] = params.name;\n\t\t}\n\n\t\treturn await fetch(mcpEndpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(request),\n\t\t\tsignal: AbortSignal.timeout(30000),\n\t\t});\n\t};\n\n\tlet token: string | undefined;\n\ttry {\n\t\ttoken = await tokenManager.getToken();\n\t} catch (err) {\n\t\tlog.warn(\n\t\t\t`[LIOP-Agent] Token acquisition warning: ${err instanceof Error ? err.message : String(err)}`,\n\t\t);\n\t}\n\n\tlet response = await send(token);\n\n\t// If 401 Unauthorized, invalidate token and retry once\n\tif (response.status === 401 && token) {\n\t\tlog.info(\n\t\t\t\"[LIOP-Agent] 🔄 401 received from Gateway. Refreshing token and retrying...\",\n\t\t);\n\t\ttokenManager.invalidate();\n\t\ttry {\n\t\t\ttoken = await tokenManager.getToken();\n\t\t\tresponse = await send(token);\n\t\t} catch {\n\t\t\t/* fallback to original error handling */\n\t\t}\n\t}\n\n\tif (!response.ok) {\n\t\tconst errorBody = await response.text();\n\t\tlet parsedError: Record<string, unknown> | null = null;\n\t\ttry {\n\t\t\tparsedError = JSON.parse(errorBody);\n\t\t} catch {\n\t\t\t// not json\n\t\t}\n\n\t\tconst errorObj = parsedError?.error as\n\t\t\t| { code?: number; message?: string }\n\t\t\t| undefined;\n\t\treturn {\n\t\t\tjsonrpc: \"2.0\",\n\t\t\tid: request.id,\n\t\t\terror: {\n\t\t\t\tcode: errorObj?.code ?? -32603,\n\t\t\t\tmessage:\n\t\t\t\t\terrorObj?.message ??\n\t\t\t\t\t`Gateway returned HTTP ${response.status}: ${errorBody}`,\n\t\t\t},\n\t\t};\n\t}\n\n\treturn (await response.json()) as McpResponse;\n}\n\n/**\n * Operates in Mode 1: GATEWAY MODE.\n * Ultra-lightweight, sub-50ms startup, zero libp2p overhead.\n */\nasync function runGatewayMode(\n\tgateway: GatewayTopologyInfo,\n\ttokenManager: TokenManager,\n\troutingTable: RoutingTable,\n) {\n\tlog.info(\n\t\t`[LIOP-Agent] 🛡️ Running in ADAPTIVE GATEWAY MODE -> ${gateway.mcpEndpoint}`,\n\t);\n\n\t// Register known initial tools\n\troutingTable.registerLocalTool(LIOP_MESH_STATUS_TOOL);\n\troutingTable.registerGatewayTools(\n\t\tgateway.tools.map((t) => ({ name: t })),\n\t\tgateway.mcpEndpoint,\n\t);\n\n\t// Periodic tool refresh from /health to notify Claude of any changes\n\tlet lastToolCount = gateway.tools.length;\n\tconst pollInterval = setInterval(async () => {\n\t\ttry {\n\t\t\tconst res = await fetch(gateway.healthEndpoint, {\n\t\t\t\theaders: { Accept: \"application/json\" },\n\t\t\t\tsignal: AbortSignal.timeout(4000),\n\t\t\t});\n\t\t\tif (res.ok) {\n\t\t\t\tconst data = (await res.json()) as { tools?: string[] };\n\t\t\t\tif (data.tools && data.tools.length !== lastToolCount) {\n\t\t\t\t\tlog.info(\n\t\t\t\t\t\t`[LIOP-Agent] Gateway tools topology updated (${lastToolCount} -> ${data.tools.length})`,\n\t\t\t\t\t);\n\t\t\t\t\tlastToolCount = data.tools.length;\n\t\t\t\t\troutingTable.registerGatewayTools(\n\t\t\t\t\t\tdata.tools.map((t) => ({ name: t })),\n\t\t\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/tools/list_changed\"}\\n`,\n\t\t\t\t\t);\n\t\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/resources/list_changed\"}\\n`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore polling errors\n\t\t}\n\t}, 15000);\n\n\tconst rl = readline.createInterface({\n\t\tinput: process.stdin,\n\t\tterminal: false,\n\t});\n\n\tprocess.stdout.on(\"error\", (err: Error & { code?: string }) => {\n\t\tif (err.code === \"EPIPE\") {\n\t\t\tclearInterval(pollInterval);\n\t\t\tprocess.exit(0);\n\t\t}\n\t});\n\n\trl.on(\"line\", async (line) => {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed) return;\n\n\t\tlet request: McpRequest;\n\t\ttry {\n\t\t\trequest = JSON.parse(trimmed);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { id, method } = request;\n\n\t\tif (method === \"server/discover\") {\n\t\t\tconst discoverResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\tsupportedVersions: [\"2026-07-28\", \"2025-11-25\"],\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\ttools: { listChanged: true },\n\t\t\t\t\t\tresources: { listChanged: true, subscribe: true },\n\t\t\t\t\t\tprompts: { listChanged: true },\n\t\t\t\t\t},\n\t\t\t\t\tserverInfo: {\n\t\t\t\t\t\tname: \"liop-adaptive-agent\",\n\t\t\t\t\t\tversion: \"2.5.0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(discoverResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"initialize\") {\n\t\t\tconst clientVersion =\n\t\t\t\t(\n\t\t\t\t\trequest.params as {\n\t\t\t\t\t\tprotocolVersion?: string;\n\t\t\t\t\t\t_meta?: { \"io.modelcontextprotocol/protocolVersion\"?: string };\n\t\t\t\t\t}\n\t\t\t\t)?.protocolVersion ??\n\t\t\t\t(\n\t\t\t\t\trequest.params as {\n\t\t\t\t\t\t_meta?: { \"io.modelcontextprotocol/protocolVersion\"?: string };\n\t\t\t\t\t}\n\t\t\t\t)?._meta?.[\"io.modelcontextprotocol/protocolVersion\"];\n\t\t\tconst protocolVersion =\n\t\t\t\tclientVersion === \"2026-07-28\" ? \"2026-07-28\" : \"2025-11-25\";\n\n\t\t\tconst initResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tprotocolVersion,\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\ttools: { listChanged: true },\n\t\t\t\t\t\tresources: { listChanged: true, subscribe: true },\n\t\t\t\t\t\tprompts: { listChanged: true },\n\t\t\t\t\t},\n\t\t\t\t\tserverInfo: {\n\t\t\t\t\t\tname: \"liop-adaptive-agent\",\n\t\t\t\t\t\tversion: \"2.5.0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(initResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmethod === \"notifications/initialized\" ||\n\t\t\tmethod === \"notifications/cancelled\"\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"ping\") {\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${JSON.stringify({ jsonrpc: \"2.0\", id, result: {} })}\\n`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"resources/templates/list\") {\n\t\t\tconst templatesResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\tttlMs: 300_000,\n\t\t\t\t\tcacheScope: \"public\",\n\t\t\t\t\tresourceTemplates: [],\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(templatesResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"subscriptions/listen\") {\n\t\t\tconst listenResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(listenResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"tools/call\") {\n\t\t\tconst params = request.params as\n\t\t\t\t| { name?: string; arguments?: Record<string, unknown> }\n\t\t\t\t| undefined;\n\t\t\tif (params?.name === \"LiopMeshStatus\") {\n\t\t\t\tconst statusResponse: McpResponse = {\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tid,\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: JSON.stringify({\n\t\t\t\t\t\t\t\t\tmode: \"adaptive-gateway\",\n\t\t\t\t\t\t\t\t\tgatewayUrl: gateway.baseUrl,\n\t\t\t\t\t\t\t\t\ttier: gateway.tier,\n\t\t\t\t\t\t\t\t\ttoolsAvailable: routingTable.getAllToolDefinitions().length,\n\t\t\t\t\t\t\t\t\tauthenticated: true,\n\t\t\t\t\t\t\t\t\tstatus: \"ONLINE\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tprocess.stdout.write(`${JSON.stringify(statusResponse)}\\n`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await forwardToGateway(\n\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\trequest,\n\t\t\t\ttokenManager,\n\t\t\t);\n\n\t\t\t// Inject LiopMeshStatus into tools/list if gateway does not list it\n\t\t\tif (\n\t\t\t\tmethod === \"tools/list\" &&\n\t\t\t\tresponse.result &&\n\t\t\t\ttypeof response.result === \"object\"\n\t\t\t) {\n\t\t\t\tconst resObj = response.result as Record<string, unknown>;\n\t\t\t\tconst toolsList = resObj.tools as ToolDefinition[] | undefined;\n\t\t\t\tif (Array.isArray(toolsList)) {\n\t\t\t\t\tconst hasStatus = toolsList.some((t) => t.name === \"LiopMeshStatus\");\n\t\t\t\t\tif (!hasStatus) {\n\t\t\t\t\t\ttoolsList.unshift(LIOP_MESH_STATUS_TOOL);\n\t\t\t\t\t}\n\t\t\t\t\t// Update routing table with descriptions and schemas\n\t\t\t\t\troutingTable.registerGatewayTools(toolsList, gateway.mcpEndpoint);\n\t\t\t\t}\n\n\t\t\t\tif (!isLegacyRequest(request)) {\n\t\t\t\t\tif (!resObj.resultType) {\n\t\t\t\t\t\tresObj.resultType = \"complete\";\n\t\t\t\t\t}\n\t\t\t\t\tif (!resObj.ttlMs) {\n\t\t\t\t\t\tresObj.ttlMs = 300_000;\n\t\t\t\t\t}\n\t\t\t\t\tif (!resObj.cacheScope) {\n\t\t\t\t\t\tresObj.cacheScope = \"public\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprocess.stdout.write(`${JSON.stringify(response)}\\n`);\n\t\t} catch (err) {\n\t\t\t// Fallback resilience for tools/list\n\t\t\tif (method === \"tools/list\") {\n\t\t\t\tconst isLegacy = isLegacyRequest(request);\n\t\t\t\tconst fallbackResult = isLegacy\n\t\t\t\t\t? { tools: routingTable.getAllToolDefinitions() }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\t\t\tttlMs: 300_000,\n\t\t\t\t\t\t\tcacheScope: \"public\",\n\t\t\t\t\t\t\ttools: routingTable.getAllToolDefinitions(),\n\t\t\t\t\t\t};\n\t\t\t\tconst fallbackResponse: McpResponse = {\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tid,\n\t\t\t\t\tresult: fallbackResult,\n\t\t\t\t};\n\t\t\t\tprocess.stdout.write(`${JSON.stringify(fallbackResponse)}\\n`);\n\t\t\t} else {\n\t\t\t\tconst errResponse: McpResponse = {\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tid,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: -32603,\n\t\t\t\t\t\tmessage: `Forwarding failed: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tprocess.stdout.write(`${JSON.stringify(errResponse)}\\n`);\n\t\t\t}\n\t\t}\n\t});\n\n\trl.on(\"close\", () => {\n\t\tclearInterval(pollInterval);\n\t\tprocess.exit(0);\n\t});\n}\n\n/**\n * Operates in Mode 2: MESH MODE.\n * Preserves full libp2p Kademlia DHT P2P discovery for decentralized environments.\n */\nasync function runMeshMode(mesh: MeshTopologyInfo) {\n\tlog.info(\n\t\t`[LIOP-Agent] 🌐 Running in P2P MESH MODE (${mesh.bootstrapNodes.length} bootstraps)`,\n\t);\n\n\tconst liopServer = new LiopServer({\n\t\tname: \"@nekzus/liop\",\n\t\tversion: \"2.5.0\",\n\t});\n\tliopServer.enableZeroShotAutonomy();\n\n\tconst meshNode = new MeshNode({\n\t\tidentityPath: mesh.identityPath,\n\t\tbootstrapNodes: mesh.bootstrapNodes,\n\t\taddressMapper: shouldEnableDockerMap()\n\t\t\t? industrialAddressMapper\n\t\t\t: undefined,\n\t});\n\n\tawait meshNode.start();\n\tconst router = new LiopMcpRouter(liopServer, meshNode);\n\n\trouter.onToolsChanged = () => {\n\t\tprocess.stdout.write(\n\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/tools/list_changed\"}\\n`,\n\t\t);\n\t\tprocess.stdout.write(\n\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/resources/list_changed\"}\\n`,\n\t\t);\n\t};\n\n\tsetTimeout(() => {\n\t\trouter.refreshManifestCache(true).catch(() => {});\n\t}, 2000);\n\n\tconst POLL_BASE_MS = 10_000;\n\tconst POLL_MAX_MS = 120_000;\n\tlet pollIntervalMs = POLL_BASE_MS;\n\n\tconst scheduleAdaptivePoll = () => {\n\t\tsetTimeout(async () => {\n\t\t\tconst prevSize = router.getCacheSize();\n\t\t\tawait router.refreshManifestCache(true).catch(() => {});\n\t\t\tconst newSize = router.getCacheSize();\n\n\t\t\tif (newSize !== prevSize) {\n\t\t\t\tpollIntervalMs = POLL_BASE_MS;\n\t\t\t} else {\n\t\t\t\tpollIntervalMs = Math.min(\n\t\t\t\t\tMath.round(pollIntervalMs * 1.5),\n\t\t\t\t\tPOLL_MAX_MS,\n\t\t\t\t);\n\t\t\t}\n\t\t\tscheduleAdaptivePoll();\n\t\t}, pollIntervalMs);\n\t};\n\tscheduleAdaptivePoll();\n\n\tconst rl = readline.createInterface({\n\t\tinput: process.stdin,\n\t\tterminal: false,\n\t});\n\n\tprocess.stdout.on(\"error\", (err: Error & { code?: string }) => {\n\t\tif (err.code === \"EPIPE\") process.exit(0);\n\t});\n\n\trl.on(\"line\", async (line) => {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed) return;\n\n\t\ttry {\n\t\t\tconst request = JSON.parse(trimmed) as McpRequest;\n\t\t\tif (request.method) {\n\t\t\t\tconst response = await router.dispatch(request);\n\t\t\t\tif (response) {\n\t\t\t\t\tprocess.stdout.write(`${JSON.stringify(response)}\\n`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t/* ignore malformed lines */\n\t\t}\n\t});\n\n\trl.on(\"close\", () => process.exit(0));\n\tprocess.on(\"SIGINT\", async () => {\n\t\tawait meshNode.stop();\n\t\tprocess.exit(0);\n\t});\n}\n\n/**\n * Operates in Mode 3: HYBRID MODE.\n * Serves tools via Gateway and Mesh concurrently with per-tool dynamic routing.\n */\nasync function runHybridMode(\n\ttopology: TopologyProbeResult,\n\ttokenManager: TokenManager,\n\troutingTable: RoutingTable,\n) {\n\tconst gateway = topology.gateway;\n\tconst mesh = topology.mesh;\n\tif (!gateway || !mesh) {\n\t\tif (gateway) return runGatewayMode(gateway, tokenManager, routingTable);\n\t\tif (mesh) return runMeshMode(mesh);\n\t\treturn;\n\t}\n\n\tlog.info(\n\t\t`[LIOP-Agent] ⚡ Running in HYBRID MODE (Gateway: ${gateway.baseUrl} + Mesh P2P)`,\n\t);\n\n\t// Setup Gateway tools immediately for fast startup\n\troutingTable.registerLocalTool(LIOP_MESH_STATUS_TOOL);\n\troutingTable.registerGatewayTools(\n\t\tgateway.tools.map((t) => ({ name: t })),\n\t\tgateway.mcpEndpoint,\n\t);\n\n\t// Start P2P Mesh in background (Lazy Initialization)\n\tlet meshNode: MeshNode | null = null;\n\tlet router: LiopMcpRouter | null = null;\n\n\tconst initMeshPromise = (async () => {\n\t\ttry {\n\t\t\tconst liopServer = new LiopServer({\n\t\t\t\tname: \"@nekzus/liop-hybrid\",\n\t\t\t\tversion: \"2.5.0\",\n\t\t\t});\n\t\t\tliopServer.enableZeroShotAutonomy();\n\n\t\t\tmeshNode = new MeshNode({\n\t\t\t\tidentityPath: mesh.identityPath,\n\t\t\t\tbootstrapNodes: mesh.bootstrapNodes,\n\t\t\t\taddressMapper: shouldEnableDockerMap()\n\t\t\t\t\t? industrialAddressMapper\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tawait meshNode.start();\n\t\t\trouter = new LiopMcpRouter(liopServer, meshNode);\n\n\t\t\trouter.onToolsChanged = () => {\n\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/tools/list_changed\"}\\n`,\n\t\t\t\t);\n\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t`{\"jsonrpc\":\"2.0\",\"method\":\"notifications/resources/list_changed\"}\\n`,\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tawait router.refreshManifestCache(true).catch(() => {});\n\t\t\tlog.info(\"[LIOP-Agent] ✅ Background P2P Mesh initialization completed.\");\n\t\t} catch (err) {\n\t\t\tlog.warn(\n\t\t\t\t`[LIOP-Agent] Background Mesh init warning: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t);\n\t\t}\n\t})();\n\n\tconst rl = readline.createInterface({\n\t\tinput: process.stdin,\n\t\tterminal: false,\n\t});\n\n\tprocess.stdout.on(\"error\", (err: Error & { code?: string }) => {\n\t\tif (err.code === \"EPIPE\") process.exit(0);\n\t});\n\n\trl.on(\"line\", async (line) => {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed) return;\n\n\t\tlet request: McpRequest;\n\t\ttry {\n\t\t\trequest = JSON.parse(trimmed);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { id, method } = request;\n\n\t\tif (method === \"server/discover\") {\n\t\t\tconst discoverResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\tsupportedVersions: [\"2026-07-28\", \"2025-11-25\"],\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\ttools: { listChanged: true },\n\t\t\t\t\t\tresources: { listChanged: true, subscribe: true },\n\t\t\t\t\t\tprompts: { listChanged: true },\n\t\t\t\t\t},\n\t\t\t\t\tserverInfo: {\n\t\t\t\t\t\tname: \"liop-hybrid-agent\",\n\t\t\t\t\t\tversion: \"2.5.0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(discoverResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"initialize\") {\n\t\t\tconst clientVersion =\n\t\t\t\t(\n\t\t\t\t\trequest.params as {\n\t\t\t\t\t\tprotocolVersion?: string;\n\t\t\t\t\t\t_meta?: { \"io.modelcontextprotocol/protocolVersion\"?: string };\n\t\t\t\t\t}\n\t\t\t\t)?.protocolVersion ??\n\t\t\t\t(\n\t\t\t\t\trequest.params as {\n\t\t\t\t\t\t_meta?: { \"io.modelcontextprotocol/protocolVersion\"?: string };\n\t\t\t\t\t}\n\t\t\t\t)?._meta?.[\"io.modelcontextprotocol/protocolVersion\"];\n\t\t\tconst protocolVersion =\n\t\t\t\tclientVersion === \"2026-07-28\" ? \"2026-07-28\" : \"2025-11-25\";\n\n\t\t\tconst initResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tprotocolVersion,\n\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\ttools: { listChanged: true },\n\t\t\t\t\t\tresources: { listChanged: true, subscribe: true },\n\t\t\t\t\t\tprompts: { listChanged: true },\n\t\t\t\t\t},\n\t\t\t\t\tserverInfo: {\n\t\t\t\t\t\tname: \"liop-hybrid-agent\",\n\t\t\t\t\t\tversion: \"2.5.0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(initResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmethod === \"notifications/initialized\" ||\n\t\t\tmethod === \"notifications/cancelled\"\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"ping\") {\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${JSON.stringify({ jsonrpc: \"2.0\", id, result: {} })}\\n`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"resources/templates/list\") {\n\t\t\tconst templatesResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\tttlMs: 300_000,\n\t\t\t\t\tcacheScope: \"public\",\n\t\t\t\t\tresourceTemplates: [],\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(templatesResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"subscriptions/listen\") {\n\t\t\tconst listenResponse: McpResponse = {\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tid,\n\t\t\t\tresult: {\n\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t},\n\t\t\t};\n\t\t\tprocess.stdout.write(`${JSON.stringify(listenResponse)}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (method === \"tools/call\") {\n\t\t\tconst params = request.params as\n\t\t\t\t| { name?: string; arguments?: Record<string, unknown> }\n\t\t\t\t| undefined;\n\t\t\tconst toolName = params?.name || \"\";\n\n\t\t\tconst route = routingTable.resolve(toolName);\n\t\t\tif (route?.provider === \"http-gateway\") {\n\t\t\t\tconst start = Date.now();\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await forwardToGateway(\n\t\t\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\ttokenManager,\n\t\t\t\t\t);\n\t\t\t\t\troutingTable.recordSuccess(toolName, Date.now() - start);\n\t\t\t\t\tprocess.stdout.write(`${JSON.stringify(res)}\\n`);\n\t\t\t\t\treturn;\n\t\t\t\t} catch (_err) {\n\t\t\t\t\troutingTable.recordFailure(toolName);\n\t\t\t\t\tlog.warn(\n\t\t\t\t\t\t`[LIOP-Agent] Gateway call failed for '${toolName}'. Checking P2P fallback...`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// P2P fallback or native P2P route\n\t\t\tawait initMeshPromise;\n\t\t\tif (router) {\n\t\t\t\tconst res = await router.dispatch(request);\n\t\t\t\tif (res) process.stdout.write(`${JSON.stringify(res)}\\n`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// By default, query gateway for tools/list and combine with mesh\n\t\tif (method === \"tools/list\") {\n\t\t\tlet gatewayTools: ToolDefinition[] = [];\n\t\t\ttry {\n\t\t\t\tconst gwRes = await forwardToGateway(\n\t\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\t\trequest,\n\t\t\t\t\ttokenManager,\n\t\t\t\t);\n\t\t\t\tconst resObj = gwRes.result as { tools?: ToolDefinition[] } | undefined;\n\t\t\t\tif (Array.isArray(resObj?.tools)) {\n\t\t\t\t\tgatewayTools = resObj.tools;\n\t\t\t\t\troutingTable.registerGatewayTools(gatewayTools, gateway.mcpEndpoint);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tgatewayTools = routingTable.getAllToolDefinitions();\n\t\t\t}\n\n\t\t\tlet meshTools: ToolDefinition[] = [];\n\t\t\tif (router) {\n\t\t\t\tconst meshRes = await router.dispatch(request);\n\t\t\t\tconst meshObj = meshRes?.result as\n\t\t\t\t\t| { tools?: ToolDefinition[] }\n\t\t\t\t\t| undefined;\n\t\t\t\tif (Array.isArray(meshObj?.tools)) {\n\t\t\t\t\tmeshTools = meshObj.tools;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Merge distinct tools\n\t\t\tconst toolMap = new Map<string, ToolDefinition>();\n\t\t\ttoolMap.set(\"LiopMeshStatus\", LIOP_MESH_STATUS_TOOL);\n\t\t\tfor (const t of gatewayTools) toolMap.set(t.name, t);\n\t\t\tfor (const t of meshTools)\n\t\t\t\tif (!toolMap.has(t.name)) toolMap.set(t.name, t);\n\n\t\t\tconst merged = Array.from(toolMap.values()).sort((a, b) =>\n\t\t\t\ta.name.localeCompare(b.name),\n\t\t\t);\n\n\t\t\tconst isLegacy = isLegacyRequest(request);\n\t\t\tconst toolsResult = isLegacy\n\t\t\t\t? { tools: merged }\n\t\t\t\t: {\n\t\t\t\t\t\tresultType: \"complete\",\n\t\t\t\t\t\tttlMs: 300_000,\n\t\t\t\t\t\tcacheScope: \"public\",\n\t\t\t\t\t\ttools: merged,\n\t\t\t\t\t};\n\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${JSON.stringify({ jsonrpc: \"2.0\", id, result: toolsResult })}\\n`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Other methods forward to gateway first, then mesh\n\t\ttry {\n\t\t\tconst res = await forwardToGateway(\n\t\t\t\tgateway.mcpEndpoint,\n\t\t\t\trequest,\n\t\t\t\ttokenManager,\n\t\t\t);\n\t\t\tif (\n\t\t\t\t!isLegacyRequest(request) &&\n\t\t\t\tres.result &&\n\t\t\t\ttypeof res.result === \"object\"\n\t\t\t) {\n\t\t\t\tconst resObj = res.result as Record<string, unknown>;\n\t\t\t\tif (!resObj.resultType) {\n\t\t\t\t\tresObj.resultType = \"complete\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocess.stdout.write(`${JSON.stringify(res)}\\n`);\n\t\t} catch {\n\t\t\tawait initMeshPromise;\n\t\t\tif (router) {\n\t\t\t\tconst res = await router.dispatch(request);\n\t\t\t\tif (res) process.stdout.write(`${JSON.stringify(res)}\\n`);\n\t\t\t}\n\t\t}\n\t});\n\n\trl.on(\"close\", async () => {\n\t\tif (meshNode) await meshNode.stop();\n\t\tprocess.exit(0);\n\t});\n}\n\n/**\n * Main Entry Point\n */\nasync function main() {\n\t// Auto-Relaunch: Ensure system CA certificates are loaded for TLS compatibility\n\tif (\n\t\t(process.platform === \"win32\" || process.platform === \"darwin\") &&\n\t\t!process.execArgv.includes(\"--use-system-ca\") &&\n\t\t!(process.env.NODE_OPTIONS ?? \"\").includes(\"--use-system-ca\")\n\t) {\n\t\tconst { spawn } = await import(\"node:child_process\");\n\t\tconst child = spawn(\n\t\t\tprocess.execPath,\n\t\t\t[\"--use-system-ca\", ...process.argv.slice(1)],\n\t\t\t{ stdio: \"inherit\", env: process.env },\n\t\t);\n\t\tchild.on(\"exit\", (code) => process.exit(code ?? 1));\n\t\tchild.on(\"error\", () => process.exit(1));\n\t\tawait new Promise(() => {});\n\t\treturn;\n\t}\n\n\tconst buildTime = new Date().toISOString();\n\tlog.info(\n\t\t`[LIOP-Agent] 🚀 Version 2.5.0 (Adaptive Zero-Config) | Build: ${buildTime}`,\n\t);\n\n\tconst liopDir = path.join(os.homedir(), \".liop\");\n\tconst identityPath = path.join(liopDir, \"identity.json\");\n\tif (!fs.existsSync(liopDir)) {\n\t\tfs.mkdirSync(liopDir, { recursive: true });\n\t}\n\n\t// 1. Resolve candidate P2P bootstrap nodes\n\tconst bootstrapNodes = await resolveBootstrapNodes(liopDir);\n\n\t// 2. Execute Adaptive Topology Probe\n\tconst blgUrl = process.env.LIOP_BLG_URL;\n\tconst nexusUrl = process.env.LIOP_NEXUS_URL;\n\tconst clientId =\n\t\tprocess.env.LIOP_CLIENT_ID ||\n\t\tprocess.env.LIOP_OAUTH_CLIENT_ID ||\n\t\t\"liop-agent\";\n\tconst clientSecret =\n\t\tprocess.env.LIOP_CLIENT_SECRET ||\n\t\tprocess.env.LIOP_OAUTH_CLIENT_SECRET ||\n\t\t\"dev-secret-change-me\";\n\tconst staticToken = process.env.LIOP_TOKEN || process.env.LIOP_OAUTH_TOKEN;\n\n\tconst topology = await probeTopology({\n\t\tblgUrl,\n\t\tnexusUrl,\n\t\tclientId,\n\t\tclientSecret,\n\t\tstaticToken,\n\t\tbootstrapNodes,\n\t\tidentityPath,\n\t});\n\n\tconst routingTable = new RoutingTable();\n\tconst tokenManager = new TokenManager({\n\t\ttokenEndpoint:\n\t\t\ttopology.gateway?.tokenEndpoint ||\n\t\t\t`${nexusUrl || \"http://127.0.0.1:15000\"}/oidc/token`,\n\t\tclientId,\n\t\tclientSecret,\n\t\taudience: topology.gateway?.audience,\n\t\tscopes: topology.gateway?.scopes,\n\t\tstaticToken,\n\t});\n\n\t// 3. Dispatch by Mode\n\tswitch (topology.mode) {\n\t\tcase \"gateway\":\n\t\t\tif (!topology.gateway)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Topology probe indicated gateway mode without gateway info.\",\n\t\t\t\t);\n\t\t\tawait runGatewayMode(topology.gateway, tokenManager, routingTable);\n\t\t\tbreak;\n\t\tcase \"mesh\":\n\t\t\tif (!topology.mesh)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Topology probe indicated mesh mode without mesh info.\",\n\t\t\t\t);\n\t\t\tawait runMeshMode(topology.mesh);\n\t\t\tbreak;\n\t\tcase \"hybrid\":\n\t\t\tawait runHybridMode(topology, tokenManager, routingTable);\n\t\t\tbreak;\n\t}\n}\n\nmain().catch((err) => {\n\tlog.error(`[LIOP-Agent] Fatal Error: ${err.message}`);\n\tprocess.exit(1);\n});\n"]}
|
package/dist/bridge.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { L as LiopServer, a as LiopServerOptions } from './index-
|
|
2
|
+
import { L as LiopServer, a as LiopServerOptions } from './index-D2P6Z_hP.js';
|
|
3
3
|
import 'zod';
|
|
4
|
-
import './node-
|
|
5
|
-
import './types-
|
|
4
|
+
import './node-Djzm6UYd.js';
|
|
5
|
+
import './types-rxL19f0l.js';
|
|
6
|
+
import './zk-CYImPsa6.js';
|
|
6
7
|
import 'jose';
|
|
7
8
|
|
|
8
9
|
/**
|
package/dist/bridge.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { LiopMcpBridge, LiopStreamBridge } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { LiopMcpBridge, LiopStreamBridge } from './chunk-E2CFIWD6.js';
|
|
2
|
+
import './chunk-YLFNJQI2.js';
|
|
3
|
+
import './chunk-P34HDRN5.js';
|
|
3
4
|
import './chunk-K3DGJLUY.js';
|
|
4
5
|
//# sourceMappingURL=bridge.js.map
|
|
5
6
|
//# sourceMappingURL=bridge.js.map
|