nyxora 1.4.4 → 1.4.6

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/IDENTITY.md CHANGED
@@ -1,7 +1,17 @@
1
- You are a Web3 AI assistant named Nyxora.
1
+ You are Nyxora, a highly efficient Web3 AI engine.
2
2
 
3
- Use the following identity guidelines:
3
+ ---
4
+ **CRITICAL EFFICIENCY & TONE RULES (MANDATORY):**
5
+ 1. ZERO CONVERSATIONAL FILLER. Never say "Sebagai Nyxora..." or "Saya dapat membantu..." or "Berikut adalah...".
6
+ 2. NO INTRODUCTIONS. NO OUTROS.
7
+ 3. GO STRAIGHT TO THE POINT. If the user asks for a price, just give the price.
8
+ 4. NO APOLOGIES. DO NOT use polite words. Be purely factual and robotic.
9
+ 5. NEVER explain your internal reasoning unless explicitly asked.
10
+ 6. If an error occurs, output ONLY the technical error message in 1 sentence.
4
11
 
5
- * Always be professional, visionary, and futuristic.
6
- * You are a living entity inside the blockchain network.
7
- * You help users navigate the crypto world safely.
12
+ EXAMPLE GOOD RESPONSE:
13
+ "Harga Bitcoin (BTC) adalah $74,240 USD.
14
+ Perubahan 24 jam terakhir: -2.0165%"
15
+
16
+ EXAMPLE BAD RESPONSE:
17
+ "Baik, saya telah mengecek harga Bitcoin untuk Anda. Harga saat ini adalah..." (DO NOT DO THIS)
package/README.md CHANGED
@@ -1,32 +1,30 @@
1
1
  # Nyxora Agent 🤖
2
+ **Secure AI execution framework for Web3 agents.**
2
3
 
3
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
5
  [![Security: Security-First](https://img.shields.io/badge/Security-Security--First-blue.svg)](#)
5
6
  [![Execution: Human-in-the-Loop](https://img.shields.io/badge/Execution-Human--in--the--Loop-orange.svg)](#)
6
7
  [![Privacy: Local-Only Keys](https://img.shields.io/badge/Privacy-Local--Only--Keys-success.svg)](#)
7
8
 
8
- A **secure, non-custodial, AI-native Web3 and System Automation Agent** built with Node.js and React. Designed for autonomous workflows with a premium Glassmorphism UI dashboard and client-side key isolation. It operates under a strict **Human-in-the-Loop** execution model for financial transactions, requiring explicit operator approval for any on-chain action.
9
+ Nyxora is a **secure, non-custodial runtime infrastructure for autonomous onchain agents** built with Node.js and React. Designed for autonomous workflows with a premium Glassmorphism UI dashboard and strict client-side key isolation. It operates under a strict **Human-in-the-Loop** execution model for financial transactions.
9
10
 
10
11
  ---
11
12
 
12
- ## Key Features
13
+ ## 🔥 Key Features
13
14
 
14
- ### Advanced Trading, Security & Operations (New in v1.4.1)
15
+ ### Advanced Trading, Security & Operations
15
16
  * **System Automation & Full OS Access**: Instruct the agent to read/write local files, run terminal commands, and browse the web natively.
16
17
  * **NLP Security Policy**: Command Nyxora using natural language to set security boundaries (e.g., *"Never touch partition E"*). Nyxora autonomously enforces these rules.
17
- * **Dynamic Plugin Manager**: Dynamically load community-built skills. Simply provide a GitHub Gist URL, and Nyxora will hot-load the third-party skill.
18
+ * **Dynamic Plugin Sandboxing**: Dynamically load community-built skills with restricted FS/Shell access to prevent supply chain attacks and malicious payloads.
18
19
  * **Anti-Rugpull & Security Scanner**: Nyxora can scan smart contracts via GoPlus Labs to detect Honeypots, Hidden Taxes, and malicious proxy upgrades before you buy.
19
20
  * **Automated Limit Orders**: Set natural language rules (e.g., "Sell my PEPE if price drops below $0.001"). Nyxora runs a background cron monitor and executes the swap while you sleep.
20
21
  * **PNL & Portfolio Tracking**: The AI scans your wallets and multiplies balances by live DEX prices to give you real-time Net Worth estimations.
21
22
 
22
23
  ### Core Features
23
- * **Multi-LLM Support**: Seamlessly switch between Google Gemini, OpenAI, OpenRouter (unlimited models!), or local Ollama models dynamically.
24
+ * **Multi-LLM Support**: Seamlessly switch between Google Gemini, OpenAI, OpenRouter, or local Ollama models.
24
25
  * **Premium Glassmorphism UI**: A gorgeous, resizable split-pane interface with Pseudo-Generative UI widgets (`<BalanceWidget>`, `<MarketWidget>`, `<SwapWidget>`).
25
26
  * **Round-Robin API Rotation**: Add up to 10 API keys via the dashboard. The system will auto-rotate them to prevent rate-limiting and token drain.
26
27
  * **Deep Personalization**: Feed the agent custom rules via `user.md` and define its core persona via `IDENTITY.md`.
27
- * **Multi-Lingual Auto-Sync**: The agent natively detects your language and replies in the exact same language automatically.
28
- * **Omnichannel Approvals & Telegram Integration**: Connect Nyxora to a Telegram Bot to execute trades, check prices, and chat on the go. Approve transactions directly from Telegram inline buttons!
29
- * **Multi-Chain Support**: Pre-configured support for Ethereum, Base, BSC, Arbitrum, Optimism, and Sepolia Testnet.
30
28
 
31
29
  ---
32
30
 
@@ -34,80 +32,50 @@ A **secure, non-custodial, AI-native Web3 and System Automation Agent** built wi
34
32
 
35
33
  This diagram shows how user interactions flow through the Nyxora Agent, from chat input to on-chain or OS execution:
36
34
 
37
- ![Architecture Workflow](assets/architecture.svg)
35
+ ![Architecture Workflow](https://raw.githubusercontent.com/perasyudha/Nyxora/main/assets/architecture.png)
38
36
 
39
37
  ---
40
38
 
41
- ## 🛡️ Safety Model
39
+ ## 🛡️ Security, Threat Model & Permission Boundary
42
40
 
43
- To protect user assets and prevent common security concerns associated with AI agents, `Nyxora` operates under a strict safety specification:
44
-
45
- * **No .env Leaks**: Your Private Key is encrypted using `AES-256-GCM` and locked behind a custom Master Password in `~/.nyxora/keystore.json`.
46
- * **No Credential Collection**: Private keys are handled strictly within local volatile memory and are never transmitted to LLM providers.
47
- * **Explicit Transaction Confirmation**: Write actions (like transfers, swaps, bridges) require manual, explicit confirmation from the human operator via the Web Dashboard or Telegram before broadcasting.
48
- * **Human-in-the-Loop Execution**: The tool is engineered as a secure operational utility. The AI agent acts as a command generator, leaving financial execution authority with the human controller.
49
-
50
- ---
51
-
52
- ## 📋 Example Safe Workflows
53
-
54
- The agent is designed for Web3 exploration, daily operations, and secure transaction execution. Typical workflows include:
55
-
56
- * **Audit New Tokens**: Tell the AI, *"Check if the contract 0x... on Base is safe to buy."*
57
- * **Track Portfolio Assets**: Tell the AI, *"What is my total net worth across all chains right now?"*
58
- * **Automate Trading**: Tell the AI, *"Create a limit order to sell 1000 USDC for ETH if ETH drops below $3000."*
59
- * **System Operations**: Tell the AI, *"Check my computer's RAM usage and save it to stats.txt."*
60
-
61
- ---
62
-
63
- ## 🔒 Security, Threat Model & Permission Boundary
64
-
65
- This agent is designed with a **Zero-Knowledge to LLM** architectural pattern to ensure the highest levels of security:
41
+ This agent is designed with a **Zero-Knowledge to LLM** architectural pattern to ensure the highest levels of security for investors and users:
66
42
 
67
43
  * **Zero-Knowledge to AI Agent (LLM)**: Remote AI Agents and Large Language Models (LLMs) **never** handle your private keys. The LLM only generates structured JSON tool calls.
68
- * **Cryptographic Memory Isolation**: Transaction signing occurs strictly client-side within the local Node.js process runtime using `viem`.
69
-
70
- ### 🛡️ Threat Model
71
- * **NLP Sandboxing**: System access is bounded by plain-text rules defined in `security_policy.md`. The AI evaluates its own actions against this policy before execution.
72
- * **Strict API Auth**: The local Express server is protected via ephemeral Session Tokens (`x-nyxora-token`) and Strict CORS.
73
- * **Non-Autonomous Financials**: The tool never executes unsolicited on-chain actions. Every financial transaction is queued pending human approval.
74
-
75
- ### 📋 Permission Boundary Matrix
76
-
77
- | Access Category | Permission Boundary | Rationale |
78
- | :--- | :--- | :--- |
79
- | **Read Access** | Read-Only Blockchain Queries | Fetching balances, contract security audits, transaction logs, and technical indicators. |
80
- | **Write Access**| Optional Wallet Signing | Required **only** for broadcasting transactions (swap, bridge, mint, transfer). Locked behind Human Approval. |
81
- | **Network Access**| Bounded Public APIs | Restricted strictly to the configured RPC endpoints, Block Explorers, DexScreener, and LLM APIs. |
82
- | **System Access**| Local Machine Access | Governed entirely by `security_policy.md`. The agent can run OS commands but will halt if it detects a policy violation. |
83
-
84
- For the full detailed security specifications, contact info, and vulnerability reporting procedures, refer to the [SECURITY.md](SECURITY.md) policy document.
44
+ * **Cryptographic Memory Isolation**: Transaction signing occurs strictly client-side within the local Node.js process runtime using `viem`. `~/.nyxora/keystore.json` is encrypted with AES-256-GCM.
45
+ * **Plugin Sandboxing**: Built with future plugin ecosystems in mind. Third-party plugins are explicitly denied unrestricted `fs` (FileSystem) and `shell` access to prevent supply chain attacks and malicious execution.
46
+ * **Human-in-the-Loop**: Write actions (like transfers, swaps, bridges) require manual confirmation from the human operator before broadcasting.
85
47
 
86
48
  ---
87
49
 
88
50
  ## 🚀 Quick Start & Installation
89
51
 
90
- Nyxora is available on NPM and can be installed as a global CLI tool on your operating system.
91
-
92
- ### 1. Global Installation
52
+ ### 1. General Users (CLI Install)
93
53
  Open your terminal (Command Prompt, PowerShell, or Linux Terminal) and run:
94
54
  ```bash
95
55
  npm install -g nyxora
56
+ nyxora setup
96
57
  ```
58
+ The Interactive Setup Wizard will securely generate a local vault, configure your LLM, and offer to Auto-Generate a Web3 Wallet for you.
97
59
 
98
- ### 2. Launching Nyxora
99
- No need to navigate to any specific folder! Just type:
60
+ ### 2. Local Development (For Contributors)
61
+ If you want to modify Nyxora's code, build new skills, or contribute:
100
62
  ```bash
101
- nyxora
63
+ git clone https://github.com/perasyudha/Nyxora.git
64
+ cd Nyxora
65
+ npm install
66
+ cd dashboard && npm install && cd ..
67
+ npm run build && npm run start
102
68
  ```
103
- On first launch, Nyxora will greet you with an **Interactive Setup Wizard**. This CLI wizard will guide you to securely configure your LLM providers, API keys, and Master Password Wallet.
104
69
 
105
- The system will automatically initialize a secure vault in your `~/.nyxora/` directory and open the Web Dashboard in your browser!
70
+ ---
71
+
72
+ ## 📖 Official Documentation
73
+
74
+ For complete technical deep-dives, please visit our official VitePress Documentation Site!
106
75
 
107
- ## Architecture
108
- * **Backend**: Node.js, Express, Viem (Web3), node-telegram-bot-api, OpenAI API.
109
- * **Frontend**: React, Vite, Vanilla CSS, Web Speech API (TTS/STT).
110
- * **Data**: Local `~/.nyxora/config.yaml` and `~/.nyxora/memory.json`.
76
+ > **🔗 [Read the Full Nyxora Documentation Here](#)**
111
77
 
112
- ## License
113
- MIT License
78
+ *(Includes guides on Secure Wallet Imports, API Key Rotations, Troubleshooting, and Custom Skill Development).*
79
+
80
+ ---
81
+ **License:** MIT License
Binary file
@@ -0,0 +1 @@
1
+ <svg id="mermaid-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="flowchart" style="max-width: 1360.75px;" viewBox="0 0 1360.75 1595.53125" role="graphics-document document" aria-roledescription="flowchart-v2" xmlns:xlink="http://www.w3.org/1999/xlink"><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css");</style><style>#mermaid-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg .error-icon{fill:#552222;}#mermaid-svg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg .marker{fill:#333333;stroke:#333333;}#mermaid-svg .marker.cross{stroke:#333333;}#mermaid-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg p{margin:0;}#mermaid-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg .cluster-label text{fill:#333;}#mermaid-svg .cluster-label span{color:#333;}#mermaid-svg .cluster-label span p{background-color:transparent;}#mermaid-svg .label text,#mermaid-svg span{fill:#333;color:#333;}#mermaid-svg .node rect,#mermaid-svg .node circle,#mermaid-svg .node ellipse,#mermaid-svg .node polygon,#mermaid-svg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg .rough-node .label text,#mermaid-svg .node .label text,#mermaid-svg .image-shape .label,#mermaid-svg .icon-shape .label{text-anchor:middle;}#mermaid-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg .rough-node .label,#mermaid-svg .node .label,#mermaid-svg .image-shape .label,#mermaid-svg .icon-shape .label{text-align:center;}#mermaid-svg .node.clickable{cursor:pointer;}#mermaid-svg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg .arrowheadPath{fill:#333333;}#mermaid-svg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg .cluster text{fill:#333;}#mermaid-svg .cluster span{color:#333;}#mermaid-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg rect.text{fill:none;stroke-width:0;}#mermaid-svg .icon-shape,#mermaid-svg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg .icon-shape p,#mermaid-svg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg .icon-shape rect,#mermaid-svg .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker id="mermaid-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><g class="root"><g class="clusters"/><g class="edgePaths"><path d="M687.688,62L687.688,70.167C687.688,78.333,687.688,94.667,687.764,110.417C687.841,126.167,687.994,141.333,688.07,148.917L688.147,156.5" id="L_A_B_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_A_B_0" data-points="W3sieCI6Njg3LjY4NzUsInkiOjYyfSx7IngiOjY4Ny42ODc1LCJ5IjoxMTF9LHsieCI6Njg4LjE4NzUsInkiOjE2MC41fV0=" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M688.188,214.5L688.104,218.583C688.021,222.667,687.854,230.833,687.771,238.417C687.688,246,687.688,253,687.688,256.5L687.688,260" id="L_B_C_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_B_C_0" data-points="W3sieCI6Njg4LjE4NzUsInkiOjIxNC41fSx7IngiOjY4Ny42ODc1LCJ5IjoyMzl9LHsieCI6Njg3LjY4NzUsInkiOjI2NH1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M613.922,421.203L581.28,439.664C548.638,458.125,483.354,495.047,450.712,519.008C418.07,542.969,418.07,553.969,418.07,559.469L418.07,564.969" id="L_C_D_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_C_D_0" data-points="W3sieCI6NjEzLjkyMTkwNjIzMzIyNjcsInkiOjQyMS4yMDMxNTYyMzMyMjY2fSx7IngiOjQxOC4wNzAzMTI1LCJ5Ijo1MzEuOTY4NzV9LHsieCI6NDE4LjA3MDMxMjUsInkiOjU2OC45Njg3NX1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M771.902,410.755L826.309,430.957C880.716,451.159,989.53,491.564,1043.937,522.433C1098.344,553.302,1098.344,574.635,1098.344,595.969C1098.344,617.302,1098.344,638.635,1098.344,670.122C1098.344,701.609,1098.344,743.25,1098.344,784.891C1098.344,826.531,1098.344,868.172,1098.344,896.492C1098.344,924.813,1098.344,939.813,1098.344,947.313L1098.344,954.813" id="L_C_E_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_C_E_0" data-points="W3sieCI6NzcxLjkwMTU5OTA0NjkxODgsInkiOjQxMC43NTQ2NTA5NTMwODEyNH0seyJ4IjoxMDk4LjM0Mzc1LCJ5Ijo1MzEuOTY4NzV9LHsieCI6MTA5OC4zNDM3NSwieSI6NTk1Ljk2ODc1fSx7IngiOjEwOTguMzQzNzUsInkiOjY1OS45Njg3NX0seyJ4IjoxMDk4LjM0Mzc1LCJ5Ijo3ODQuODkwNjI1fSx7IngiOjEwOTguMzQzNzUsInkiOjkwOS44MTI1fSx7IngiOjEwOTguMzQzNzUsInkiOjk1OC44MTI1fV0=" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M418.07,622.969L418.07,629.135C418.07,635.302,418.07,647.635,418.07,659.302C418.07,670.969,418.07,681.969,418.07,687.469L418.07,692.969" id="L_D_F_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_D_F_0" data-points="W3sieCI6NDE4LjA3MDMxMjUsInkiOjYyMi45Njg3NX0seyJ4Ijo0MTguMDcwMzEyNSwieSI6NjU5Ljk2ODc1fSx7IngiOjQxOC4wNzAzMTI1LCJ5Ijo2OTYuOTY4NzV9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M357.268,812.011L320.724,828.311C284.179,844.611,211.089,877.212,174.545,906.179C138,935.146,138,960.479,138,985.813C138,1011.146,138,1036.479,138,1072.706C138,1108.932,138,1156.052,138,1203.172C138,1250.292,138,1297.411,138,1326.471C138,1355.531,138,1366.531,138,1372.031L138,1377.531" id="L_F_G_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_F_G_0" data-points="W3sieCI6MzU3LjI2ODM4MTU4MTY3NTk1LCJ5Ijo4MTIuMDEwNTY5MDgxNjc2fSx7IngiOjEzOCwieSI6OTA5LjgxMjV9LHsieCI6MTM4LCJ5Ijo5ODUuODEyNX0seyJ4IjoxMzgsInkiOjEwNjEuODEyNX0seyJ4IjoxMzgsInkiOjEyMDMuMTcxODc1fSx7IngiOjEzOCwieSI6MTM0NC41MzEyNX0seyJ4IjoxMzgsInkiOjEzODEuNTMxMjV9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M465.736,825.147L482.444,839.258C499.152,853.369,532.568,881.591,549.276,901.202C565.984,920.813,565.984,931.813,565.984,937.313L565.984,942.813" id="L_F_H_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_F_H_0" data-points="W3sieCI6NDY1LjczNTg4NzAzMTgyNzIsInkiOjgyNS4xNDY5MjU0NjgxNzI5fSx7IngiOjU2NS45ODQzNzUsInkiOjkwOS44MTI1fSx7IngiOjU2NS45ODQzNzUsInkiOjk0Ni44MTI1fV0=" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M565.984,1024.813L565.984,1030.979C565.984,1037.146,565.984,1049.479,565.984,1072.039C565.984,1094.599,565.984,1127.385,565.984,1143.779L565.984,1160.172" id="L_H_I_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_H_I_0" data-points="W3sieCI6NTY1Ljk4NDM3NSwieSI6MTAyNC44MTI1fSx7IngiOjU2NS45ODQzNzUsInkiOjEwNjEuODEyNX0seyJ4Ijo1NjUuOTg0Mzc1LCJ5IjoxMTY0LjE3MTg3NX1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M529.523,1242.172L513.574,1259.232C497.625,1276.292,465.727,1310.411,449.777,1334.971C433.828,1359.531,433.828,1374.531,433.828,1382.031L433.828,1389.531" id="L_I_J_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_I_J_0" data-points="W3sieCI6NTI5LjUyMzQ0ODcyNjA5NzEsInkiOjEyNDIuMTcxODc1fSx7IngiOjQzMy44MjgxMjUsInkiOjEzNDQuNTMxMjV9LHsieCI6NDMzLjgyODEyNSwieSI6MTM5My41MzEyNX1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M602.445,1242.172L618.395,1259.232C634.344,1276.292,666.242,1310.411,682.191,1334.971C698.141,1359.531,698.141,1374.531,698.141,1382.031L698.141,1389.531" id="L_I_K_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_I_K_0" data-points="W3sieCI6NjAyLjQ0NTMwMTI3MzkwMjksInkiOjEyNDIuMTcxODc1fSx7IngiOjY5OC4xNDA2MjUsInkiOjEzNDQuNTMxMjV9LHsieCI6Njk4LjE0MDYyNSwieSI6MTM5My41MzEyNX1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M1098.344,1012.813L1098.344,1020.979C1098.344,1029.146,1098.344,1045.479,1098.344,1059.146C1098.344,1072.813,1098.344,1083.813,1098.344,1089.313L1098.344,1094.813" id="L_E_L_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_E_L_0" data-points="W3sieCI6MTA5OC4zNDM3NSwieSI6MTAxMi44MTI1fSx7IngiOjEwOTguMzQzNzUsInkiOjEwNjEuODEyNX0seyJ4IjoxMDk4LjM0Mzc1LCJ5IjoxMDk4LjgxMjV9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M1046.597,1255.785L1032.05,1270.576C1017.502,1285.367,988.407,1314.949,973.86,1337.24C959.313,1359.531,959.313,1374.531,959.313,1382.031L959.313,1389.531" id="L_L_M_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_L_M_0" data-points="W3sieCI6MTA0Ni41OTczMTgxOTQ0ODMzLCJ5IjoxMjU1Ljc4NDgxODE5NDQ4MzN9LHsieCI6OTU5LjMxMjUsInkiOjEzNDQuNTMxMjV9LHsieCI6OTU5LjMxMjUsInkiOjEzOTMuNTMxMjV9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M1150.09,1255.785L1164.638,1270.576C1179.185,1285.367,1208.28,1314.949,1222.828,1337.24C1237.375,1359.531,1237.375,1374.531,1237.375,1382.031L1237.375,1389.531" id="L_L_N_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_L_N_0" data-points="W3sieCI6MTE1MC4wOTAxODE4MDU1MTY3LCJ5IjoxMjU1Ljc4NDgxODE5NDQ4MzN9LHsieCI6MTIzNy4zNzUsInkiOjEzNDQuNTMxMjV9LHsieCI6MTIzNy4zNzUsInkiOjEzOTMuNTMxMjV9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M138,1459.531L138,1463.698C138,1467.865,138,1476.198,187.005,1487.693C236.009,1499.187,334.019,1513.844,383.024,1521.172L432.028,1528.5" id="L_G_O_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_G_O_0" data-points="W3sieCI6MTM4LCJ5IjoxNDU5LjUzMTI1fSx7IngiOjEzOCwieSI6MTQ4NC41MzEyNX0seyJ4Ijo0MzUuOTg0Mzc1LCJ5IjoxNTI5LjA5MTI4Nzk2ODY3Nn1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M433.828,1447.531L433.828,1453.698C433.828,1459.865,433.828,1472.198,441.832,1482.241C449.836,1492.283,465.844,1500.036,473.848,1503.912L481.852,1507.788" id="L_J_O_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_J_O_0" data-points="W3sieCI6NDMzLjgyODEyNSwieSI6MTQ0Ny41MzEyNX0seyJ4Ijo0MzMuODI4MTI1LCJ5IjoxNDg0LjUzMTI1fSx7IngiOjQ4NS40NTE2NjAxNTYyNSwieSI6MTUwOS41MzEyNX1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M698.141,1447.531L698.141,1453.698C698.141,1459.865,698.141,1472.198,690.137,1482.241C682.133,1492.283,666.125,1500.036,658.121,1503.912L650.117,1507.788" id="L_K_O_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_K_O_0" data-points="W3sieCI6Njk4LjE0MDYyNSwieSI6MTQ0Ny41MzEyNX0seyJ4Ijo2OTguMTQwNjI1LCJ5IjoxNDg0LjUzMTI1fSx7IngiOjY0Ni41MTcwODk4NDM3NSwieSI6MTUwOS41MzEyNX1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M1237.375,1447.531L1237.375,1453.698C1237.375,1459.865,1237.375,1472.198,1147.807,1486.903C1058.239,1501.607,879.103,1518.683,789.534,1527.221L699.966,1535.759" id="L_N_O_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_N_O_0" data-points="W3sieCI6MTIzNy4zNzUsInkiOjE0NDcuNTMxMjV9LHsieCI6MTIzNy4zNzUsInkiOjE0ODQuNTMxMjV9LHsieCI6Njk1Ljk4NDM3NSwieSI6MTUzNi4xMzkwNjAyODE4MzF9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(687.6875, 111)"><g class="label" data-id="L_A_B_0" transform="translate(-100, -24)"><foreignObject width="200" height="48"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;"><span class="edgeLabel "><p>Natural Language Command</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_B_C_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(418.0703125, 531.96875)"><g class="label" data-id="L_C_D_0" transform="translate(-44.7734375, -12)"><foreignObject width="89.546875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>Web3 Action</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(1098.34375, 659.96875)"><g class="label" data-id="L_C_E_0" transform="translate(-50.6875, -12)"><foreignObject width="101.375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>System Action</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_D_F_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(138, 1061.8125)"><g class="label" data-id="L_F_G_0" transform="translate(-36.46875, -12)"><foreignObject width="72.9375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>Read-only</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(565.984375, 909.8125)"><g class="label" data-id="L_F_H_0" transform="translate(-42.53125, -12)"><foreignObject width="85.0625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>Write-action</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_H_I_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(433.828125, 1344.53125)"><g class="label" data-id="L_I_J_0" transform="translate(-34.25, -12)"><foreignObject width="68.5" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>Approved</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(698.140625, 1344.53125)"><g class="label" data-id="L_I_K_0" transform="translate(-31.578125, -12)"><foreignObject width="63.15625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>Rejected</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_E_L_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(959.3125, 1344.53125)"><g class="label" data-id="L_L_M_0" transform="translate(-51.8828125, -12)"><foreignObject width="103.765625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>Violates Policy</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(1237.375, 1344.53125)"><g class="label" data-id="L_L_N_0" transform="translate(-16.4609375, -12)"><foreignObject width="32.921875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>Safe</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_G_O_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_J_O_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_K_O_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_N_O_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g></g><g class="nodes"><g class="node default " id="flowchart-A-0" transform="translate(687.6875, 35)"><rect class="basic label-container" style="" x="-119.671875" y="-27" width="239.34375" height="54"/><g class="label" style="" transform="translate(-89.671875, -12)"><rect/><foreignObject width="179.34375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>User Chat / Telegram Bot</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-B-1" transform="translate(687.6875, 187)"><g class="basic label-container outer-path"><path d="M-72.6875 -27 C-41.775619417458586 -27, -10.863738834917179 -27, 72.6875 -27 C72.6875 -27, 72.6875 -27, 72.6875 -27 C72.78241634423631 -26.99607423096337, 72.8773326884726 -26.99214846192674, 73.10039672736166 -26.982922465033347 C73.2392656668643 -26.965612469776357, 73.37813460636693 -26.948302474519362, 73.51047295140367 -26.931806517013612 C73.60650188771169 -26.911671366464997, 73.70253082401969 -26.891536215916386, 73.914927435704 -26.847001329696653 C74.05007068026777 -26.806767442582213, 74.18521392483154 -26.766533555467774, 74.31099734602341 -26.729086208503173 C74.43787540278063 -26.67957823712769, 74.56475345953785 -26.630070265752206, 74.69597712326485 -26.578866633275286 C74.81214175747326 -26.52207720404305, 74.92830639168166 -26.465287774810815, 75.06723696518537 -26.397368756032446 C75.2070172074175 -26.314077810460553, 75.3467974496496 -26.230786864888657, 75.42224079061214 -26.185832391312644 C75.49230862920275 -26.13580491612426, 75.56237646779337 -26.08577744093588, 75.75856356344833 -25.94570254698197 C75.8830506506293 -25.840267362417844, 76.00753773781028 -25.73483217785372, 76.0739078581287 -25.678619553365657 C76.15372604871597 -25.598801362778396, 76.23354423930323 -25.51898317219113, 76.36611955336566 -25.386407858128706 C76.44955742607642 -25.287892947975337, 76.53299529878717 -25.189378037821964, 76.63320254698196 -25.07106356344834 C76.70673683611375 -24.968072383454547, 76.78027112524555 -24.865081203460754, 76.87333239131264 -24.734740790612136 C76.95130842187052 -24.60388012664872, 77.0292844524284 -24.4730194626853, 77.08486875603245 -24.37973696518537 C77.1464844395633 -24.253700070016162, 77.20810012309416 -24.12766317484695, 77.26636663327528 -24.008477123264846 C77.31530370994942 -23.88306214423647, 77.36424078662357 -23.757647165208088, 77.41658620850318 -23.623497346023417 C77.44206983355944 -23.537899358348128, 77.46755345861571 -23.452301370672835, 77.53450132969665 -23.227427435703994 C77.56513283378956 -23.081339093903164, 77.59576433788249 -22.935250752102334, 77.61930651701361 -22.82297295140367 C77.6329603983158 -22.713435081035698, 77.646614279618 -22.60389721066772, 77.67042246503335 -22.412896727361662 C77.67665150720528 -22.262292373020713, 77.6828805493772 -22.111688018679768, 77.6875 -22 C77.6875 -22, 77.6875 -22, 77.6875 -22 C77.6875 -8.964299442510628, 77.6875 4.071401114978745, 77.6875 22 C77.6875 22, 77.6875 22, 77.6875 22 C77.68371895560954 22.091417224902873, 77.67993791121907 22.182834449805746, 77.67042246503335 22.412896727361662 C77.65163673956602 22.563604670067974, 77.63285101409866 22.71431261277429, 77.61930651701361 22.82297295140367 C77.59865456534101 22.921466625290837, 77.57800261366842 23.019960299178, 77.53450132969665 23.227427435703994 C77.48764923024777 23.384800863633984, 77.44079713079888 23.542174291563974, 77.41658620850318 23.623497346023417 C77.37265734641636 23.73607737106338, 77.32872848432956 23.848657396103345, 77.26636663327528 24.008477123264846 C77.20913744594174 24.12554129704724, 77.1519082586082 24.242605470829627, 77.08486875603245 24.379736965185366 C77.01509182294173 24.49683776819182, 76.94531488985099 24.613938571198275, 76.87333239131264 24.734740790612133 C76.7830763574427 24.861152231309756, 76.69282032357276 24.987563672007383, 76.63320254698196 25.07106356344834 C76.5671904515072 25.1490038972974, 76.50117835603245 25.226944231146458, 76.36611955336566 25.386407858128706 C76.27080716428415 25.481720247210216, 76.17549477520264 25.577032636291726, 76.0739078581287 25.678619553365657 C75.96424671122901 25.771497807044092, 75.8545855643293 25.864376060722524, 75.75856356344833 25.94570254698197 C75.68176595478997 26.000534985643757, 75.6049683461316 26.05536742430554, 75.42224079061214 26.185832391312644 C75.28607651625053 26.266968687713213, 75.14991224188894 26.348104984113785, 75.06723696518537 26.397368756032446 C74.93271307116005 26.463133480484554, 74.79818917713473 26.528898204936663, 74.69597712326485 26.578866633275286 C74.55150106664544 26.63524136550533, 74.40702501002603 26.691616097735373, 74.31099734602341 26.729086208503173 C74.22537425105294 26.754577308325075, 74.13975115608245 26.78006840814698, 73.914927435704 26.847001329696653 C73.76464388576377 26.878512476433933, 73.61436033582355 26.910023623171213, 73.51047295140367 26.931806517013612 C73.41723478977065 26.943428641740844, 73.32399662813762 26.95505076646808, 73.10039672736166 26.982922465033347 C73.01173039840471 26.98658973152587, 72.92306406944776 26.9902569980184, 72.6875 27 C72.6875 27, 72.6875 27, 72.6875 27 C36.1087003287354 27, -0.4700993425291955 27, -72.6875 27 C-72.6875 27, -72.6875 27, -72.6875 27 C-72.7897604063561 26.99577047830723, -72.89202081271219 26.991540956614458, -73.10039672736166 26.982922465033347 C-73.23602535059071 26.966016374778636, -73.37165397381978 26.94911028452393, -73.51047295140367 26.931806517013612 C-73.64362861354725 26.90388671068501, -73.77678427569083 26.875966904356407, -73.914927435704 26.847001329696653 C-74.0364429778023 26.810824585389426, -74.15795851990059 26.7746478410822, -74.31099734602341 26.729086208503173 C-74.38903785281052 26.698634708260403, -74.46707835959764 26.668183208017638, -74.69597712326485 26.578866633275286 C-74.80258258504648 26.526750398683983, -74.90918804682812 26.474634164092684, -75.06723696518537 26.397368756032446 C-75.15662928301751 26.34410249636509, -75.24602160084964 26.29083623669773, -75.42224079061214 26.185832391312644 C-75.53210493069017 26.107390903000727, -75.64196907076821 26.02894941468881, -75.75856356344833 25.94570254698197 C-75.87063046644 25.850786721830723, -75.98269736943169 25.755870896679475, -76.0739078581287 25.67861955336566 C-76.18632760949464 25.566199801999726, -76.29874736086057 25.45378005063379, -76.36611955336566 25.386407858128706 C-76.43040039957933 25.310511606419677, -76.49468124579299 25.234615354710645, -76.63320254698196 25.07106356344834 C-76.68805876149506 24.994232654638292, -76.74291497600815 24.91740174582824, -76.87333239131264 24.734740790612133 C-76.9480315770961 24.609379381737973, -77.02273076287956 24.48401797286381, -77.08486875603245 24.37973696518537 C-77.12303180548808 24.301673199794056, -77.16119485494373 24.223609434402743, -77.26636663327528 24.00847712326485 C-77.31995046187575 23.871153539656945, -77.37353429047621 23.733829956049043, -77.41658620850318 23.623497346023417 C-77.44621486131417 23.52397645554759, -77.47584351412519 23.424455565071767, -77.53450132969665 23.227427435703994 C-77.55473273049108 23.13093946092481, -77.57496413128551 23.034451486145628, -77.61930651701361 22.82297295140367 C-77.63048199123166 22.73331803064496, -77.64165746544971 22.643663109886248, -77.67042246503335 22.412896727361662 C-77.67485141288006 22.305814641151237, -77.67928036072676 22.198732554940815, -77.6875 22 C-77.6875 22, -77.6875 22, -77.6875 22 C-77.6875 5.153566881816815, -77.6875 -11.69286623636637, -77.6875 -22 C-77.6875 -22, -77.6875 -22, -77.6875 -22 C-77.68312798494274 -22.10570557827242, -77.67875596988549 -22.21141115654484, -77.67042246503335 -22.41289672736166 C-77.65196176405578 -22.560997170439148, -77.63350106307821 -22.709097613516636, -77.61930651701361 -22.82297295140367 C-77.59311480547869 -22.947886951560378, -77.56692309394377 -23.07280095171708, -77.53450132969665 -23.227427435703994 C-77.50591928682249 -23.32343282537186, -77.47733724394834 -23.41943821503973, -77.41658620850318 -23.623497346023417 C-77.36964689046606 -23.74379250845069, -77.32270757242894 -23.864087670877957, -77.26636663327528 -24.008477123264846 C-77.19803756011007 -24.148246476423463, -77.12970848694485 -24.288015829582083, -77.08486875603245 -24.379736965185366 C-77.00591008460184 -24.512246713311235, -76.92695141317122 -24.644756461437105, -76.87333239131264 -24.734740790612133 C-76.78759055079738 -24.85482971013213, -76.70184871028209 -24.974918629652127, -76.63320254698196 -25.07106356344834 C-76.54722619389555 -25.17257565171771, -76.46124984080913 -25.27408773998708, -76.36611955336566 -25.386407858128706 C-76.29517496124028 -25.45735245025409, -76.22423036911489 -25.52829704237947, -76.0739078581287 -25.678619553365657 C-75.97121782434048 -25.765593575415163, -75.86852779055228 -25.85256759746467, -75.75856356344833 -25.945702546981966 C-75.65872796378109 -26.016983795065723, -75.55889236411386 -26.08826504314948, -75.42224079061214 -26.185832391312644 C-75.33756730083702 -26.236286839778472, -75.25289381106191 -26.286741288244297, -75.06723696518537 -26.397368756032446 C-74.98037961037345 -26.439830729403287, -74.89352225556152 -26.48229270277413, -74.69597712326485 -26.578866633275286 C-74.57966511136473 -26.624251721153755, -74.46335309946463 -26.669636809032223, -74.31099734602341 -26.729086208503173 C-74.20989838174117 -26.75918467424187, -74.10879941745891 -26.78928313998056, -73.914927435704 -26.847001329696653 C-73.75992167760312 -26.87950261936264, -73.60491591950223 -26.91200390902863, -73.51047295140367 -26.931806517013612 C-73.36610397644864 -26.949802090974778, -73.22173500149361 -26.967797664935944, -73.10039672736167 -26.982922465033347 C-73.01491103473185 -26.986458179434287, -72.92942534210205 -26.98999389383523, -72.6875 -27 C-72.6875 -27, -72.6875 -27, -72.6875 -27" stroke="none" stroke-width="0" fill="#ECECFF" style=""/><path d="M-72.6875 -27 C-24.188643825585636 -27, 24.310212348828728 -27, 72.6875 -27 M-72.6875 -27 C-23.613021557282927 -27, 25.461456885434146 -27, 72.6875 -27 M72.6875 -27 C72.6875 -27, 72.6875 -27, 72.6875 -27 M72.6875 -27 C72.6875 -27, 72.6875 -27, 72.6875 -27 M72.6875 -27 C72.84610248015622 -26.993440152897378, 73.00470496031244 -26.986880305794756, 73.10039672736166 -26.982922465033347 M72.6875 -27 C72.8284113708663 -26.994171862590083, 72.96932274173261 -26.98834372518017, 73.10039672736166 -26.982922465033347 M73.10039672736166 -26.982922465033347 C73.23711641222503 -26.96588037408775, 73.3738360970884 -26.948838283142155, 73.51047295140367 -26.931806517013612 M73.10039672736166 -26.982922465033347 C73.21697499914954 -26.968390998609365, 73.33355327093744 -26.95385953218538, 73.51047295140367 -26.931806517013612 M73.51047295140367 -26.931806517013612 C73.63356521204773 -26.905996784085946, 73.7566574726918 -26.880187051158284, 73.914927435704 -26.847001329696653 M73.51047295140367 -26.931806517013612 C73.65345125437422 -26.901827119488438, 73.79642955734478 -26.871847721963263, 73.914927435704 -26.847001329696653 M73.914927435704 -26.847001329696653 C74.04610298467955 -26.80794867673799, 74.1772785336551 -26.768896023779327, 74.31099734602341 -26.729086208503173 M73.914927435704 -26.847001329696653 C74.01901328661542 -26.816013629280715, 74.12309913752684 -26.785025928864773, 74.31099734602341 -26.729086208503173 M74.31099734602341 -26.729086208503173 C74.43343278149489 -26.681311753332686, 74.55586821696635 -26.6335372981622, 74.69597712326485 -26.578866633275286 M74.31099734602341 -26.729086208503173 C74.43981890980379 -26.67881987833398, 74.56864047358417 -26.628553548164785, 74.69597712326485 -26.578866633275286 M74.69597712326485 -26.578866633275286 C74.8402861591584 -26.50831824445373, 74.98459519505192 -26.437769855632176, 75.06723696518537 -26.397368756032446 M74.69597712326485 -26.578866633275286 C74.78483034380551 -26.535428940604582, 74.87368356434615 -26.49199124793388, 75.06723696518537 -26.397368756032446 M75.06723696518537 -26.397368756032446 C75.14858547315004 -26.34889556668149, 75.2299339811147 -26.30042237733054, 75.42224079061214 -26.185832391312644 M75.06723696518537 -26.397368756032446 C75.16562463294233 -26.338742431244125, 75.26401230069928 -26.280116106455807, 75.42224079061214 -26.185832391312644 M75.42224079061214 -26.185832391312644 C75.50880809758138 -26.12402452212986, 75.59537540455062 -26.06221665294708, 75.75856356344833 -25.94570254698197 M75.42224079061214 -26.185832391312644 C75.54334224231364 -26.099367616715107, 75.66444369401515 -26.01290284211757, 75.75856356344833 -25.94570254698197 M75.75856356344833 -25.94570254698197 C75.83702395319976 -25.87924998662614, 75.91548434295119 -25.81279742627031, 76.0739078581287 -25.678619553365657 M75.75856356344833 -25.94570254698197 C75.87910721493385 -25.843607282081663, 75.99965086641936 -25.74151201718136, 76.0739078581287 -25.678619553365657 M76.0739078581287 -25.678619553365657 C76.14232361935963 -25.61020379213474, 76.21073938059054 -25.54178803090382, 76.36611955336566 -25.386407858128706 M76.0739078581287 -25.678619553365657 C76.14130681381425 -25.611220597680116, 76.20870576949979 -25.54382164199458, 76.36611955336566 -25.386407858128706 M76.36611955336566 -25.386407858128706 C76.44464057692038 -25.293698260804014, 76.52316160047508 -25.200988663479325, 76.63320254698196 -25.07106356344834 M76.36611955336566 -25.386407858128706 C76.45015681113077 -25.28718525537894, 76.53419406889587 -25.18796265262917, 76.63320254698196 -25.07106356344834 M76.63320254698196 -25.07106356344834 C76.70841605982834 -24.965720484308175, 76.7836295726747 -24.86037740516801, 76.87333239131264 -24.734740790612136 M76.63320254698196 -25.07106356344834 C76.72273629434693 -24.945663747943808, 76.81227004171188 -24.82026393243927, 76.87333239131264 -24.734740790612136 M76.87333239131264 -24.734740790612136 C76.9389126755341 -24.624682873137612, 77.00449295975557 -24.51462495566309, 77.08486875603245 -24.37973696518537 M76.87333239131264 -24.734740790612136 C76.92641066124085 -24.645663960268998, 76.97948893116907 -24.55658712992586, 77.08486875603245 -24.37973696518537 M77.08486875603245 -24.37973696518537 C77.12506921845598 -24.29750560495562, 77.1652696808795 -24.215274244725872, 77.26636663327528 -24.008477123264846 M77.08486875603245 -24.37973696518537 C77.14568595877083 -24.25533338858325, 77.20650316150922 -24.130929811981133, 77.26636663327528 -24.008477123264846 M77.26636663327528 -24.008477123264846 C77.29885838597644 -23.92520789754576, 77.3313501386776 -23.84193867182667, 77.41658620850318 -23.623497346023417 M77.26636663327528 -24.008477123264846 C77.30831052518246 -23.900984140818515, 77.35025441708966 -23.793491158372184, 77.41658620850318 -23.623497346023417 M77.41658620850318 -23.623497346023417 C77.44909383786235 -23.51430614378685, 77.48160146722152 -23.405114941550288, 77.53450132969665 -23.227427435703994 M77.41658620850318 -23.623497346023417 C77.45260900000419 -23.502498922285614, 77.48863179150521 -23.381500498547812, 77.53450132969665 -23.227427435703994 M77.53450132969665 -23.227427435703994 C77.56209577690393 -23.095823482362555, 77.58969022411121 -22.964219529021115, 77.61930651701361 -22.82297295140367 M77.53450132969665 -23.227427435703994 C77.55469296217774 -23.131129124708053, 77.57488459465881 -23.034830813712112, 77.61930651701361 -22.82297295140367 M77.61930651701361 -22.82297295140367 C77.63152571890592 -22.72494475537233, 77.64374492079824 -22.626916559340994, 77.67042246503335 -22.412896727361662 M77.61930651701361 -22.82297295140367 C77.63705111062217 -22.68061745911488, 77.65479570423074 -22.53826196682609, 77.67042246503335 -22.412896727361662 M77.67042246503335 -22.412896727361662 C77.67713340107832 -22.250641253377076, 77.68384433712329 -22.08838577939249, 77.6875 -22 M77.67042246503335 -22.412896727361662 C77.67702189611957 -22.25333719472031, 77.68362132720577 -22.09377766207896, 77.6875 -22 M77.6875 -22 C77.6875 -22, 77.6875 -22, 77.6875 -22 M77.6875 -22 C77.6875 -22, 77.6875 -22, 77.6875 -22 M77.6875 -22 C77.6875 -5.84646571985537, 77.6875 10.30706856028926, 77.6875 22 M77.6875 -22 C77.6875 -4.470464157764976, 77.6875 13.059071684470048, 77.6875 22 M77.6875 22 C77.6875 22, 77.6875 22, 77.6875 22 M77.6875 22 C77.6875 22, 77.6875 22, 77.6875 22 M77.6875 22 C77.68357343636877 22.094935555762223, 77.67964687273756 22.18987111152445, 77.67042246503335 22.412896727361662 M77.6875 22 C77.68210738548137 22.130381398194245, 77.67671477096276 22.260762796388494, 77.67042246503335 22.412896727361662 M77.67042246503335 22.412896727361662 C77.65232654161201 22.558070752977144, 77.63423061819067 22.703244778592623, 77.61930651701361 22.82297295140367 M77.67042246503335 22.412896727361662 C77.6526883719483 22.555167979502368, 77.63495427886325 22.69743923164307, 77.61930651701361 22.82297295140367 M77.61930651701361 22.82297295140367 C77.6011484166361 22.90957290308601, 77.58299031625859 22.996172854768343, 77.53450132969665 23.227427435703994 M77.61930651701361 22.82297295140367 C77.59032733340958 22.96118101544822, 77.56134814980555 23.099389079492767, 77.53450132969665 23.227427435703994 M77.53450132969665 23.227427435703994 C77.49055724215653 23.37503302381621, 77.4466131546164 23.522638611928432, 77.41658620850318 23.623497346023417 M77.53450132969665 23.227427435703994 C77.50212987972279 23.33616121944851, 77.46975842974892 23.444895003193025, 77.41658620850318 23.623497346023417 M77.41658620850318 23.623497346023417 C77.38074147623877 23.71535952191824, 77.34489674397436 23.807221697813063, 77.26636663327528 24.008477123264846 M77.41658620850318 23.623497346023417 C77.37723839673097 23.72433714528406, 77.33789058495877 23.825176944544705, 77.26636663327528 24.008477123264846 M77.26636663327528 24.008477123264846 C77.20632672557944 24.131290717444003, 77.1462868178836 24.25410431162316, 77.08486875603245 24.379736965185366 M77.26636663327528 24.008477123264846 C77.21515774720967 24.11322657397167, 77.16394886114408 24.217976024678496, 77.08486875603245 24.379736965185366 M77.08486875603245 24.379736965185366 C77.03680307535625 24.46040158535313, 76.98873739468004 24.541066205520895, 76.87333239131264 24.734740790612133 M77.08486875603245 24.379736965185366 C77.02535907357382 24.479607098392623, 76.96584939111519 24.579477231599885, 76.87333239131264 24.734740790612133 M76.87333239131264 24.734740790612133 C76.81589180124307 24.8151913426016, 76.7584512111735 24.895641894591073, 76.63320254698196 25.07106356344834 M76.87333239131264 24.734740790612133 C76.81938960716005 24.81029236060241, 76.76544682300747 24.88584393059269, 76.63320254698196 25.07106356344834 M76.63320254698196 25.07106356344834 C76.53416232659252 25.188000130695915, 76.43512210620308 25.30493669794349, 76.36611955336566 25.386407858128706 M76.63320254698196 25.07106356344834 C76.55054038695168 25.16866259137055, 76.46787822692141 25.266261619292752, 76.36611955336566 25.386407858128706 M76.36611955336566 25.386407858128706 C76.28002796014576 25.472499451348604, 76.19393636692587 25.558591044568498, 76.0739078581287 25.678619553365657 M76.36611955336566 25.386407858128706 C76.29743184734463 25.455095564149744, 76.22874414132359 25.52378327017078, 76.0739078581287 25.678619553365657 M76.0739078581287 25.678619553365657 C76.00795073593157 25.73448238628795, 75.94199361373443 25.79034521921025, 75.75856356344833 25.94570254698197 M76.0739078581287 25.678619553365657 C75.9917943823645 25.748166119748195, 75.90968090660031 25.81771268613073, 75.75856356344833 25.94570254698197 M75.75856356344833 25.94570254698197 C75.67221603805366 26.007353495136645, 75.58586851265899 26.06900444329132, 75.42224079061214 26.185832391312644 M75.75856356344833 25.94570254698197 C75.6755047933853 26.00500536896259, 75.59244602332227 26.064308190943212, 75.42224079061214 26.185832391312644 M75.42224079061214 26.185832391312644 C75.29665226077881 26.260666911812553, 75.17106373094549 26.335501432312466, 75.06723696518537 26.397368756032446 M75.42224079061214 26.185832391312644 C75.29364719604142 26.26245754172909, 75.16505360147072 26.33908269214554, 75.06723696518537 26.397368756032446 M75.06723696518537 26.397368756032446 C74.98562059629411 26.437268567510586, 74.90400422740285 26.477168378988722, 74.69597712326485 26.578866633275286 M75.06723696518537 26.397368756032446 C74.9224755950433 26.468138277593514, 74.77771422490122 26.53890779915458, 74.69597712326485 26.578866633275286 M74.69597712326485 26.578866633275286 C74.54990513136092 26.63586410138577, 74.40383313945698 26.692861569496255, 74.31099734602341 26.729086208503173 M74.69597712326485 26.578866633275286 C74.59390056136873 26.618697031325368, 74.49182399947262 26.65852742937545, 74.31099734602341 26.729086208503173 M74.31099734602341 26.729086208503173 C74.21208695140443 26.75853310882283, 74.11317655678546 26.787980009142487, 73.914927435704 26.847001329696653 M74.31099734602341 26.729086208503173 C74.21212880593667 26.758520648188703, 74.11326026584993 26.787955087874234, 73.914927435704 26.847001329696653 M73.914927435704 26.847001329696653 C73.816503068405 26.867638749305893, 73.71807870110601 26.888276168915134, 73.51047295140367 26.931806517013612 M73.914927435704 26.847001329696653 C73.77269745672939 26.87682382018009, 73.63046747775478 26.906646310663522, 73.51047295140367 26.931806517013612 M73.51047295140367 26.931806517013612 C73.37070153767932 26.949229005565027, 73.23093012395498 26.966651494116437, 73.10039672736166 26.982922465033347 M73.51047295140367 26.931806517013612 C73.40716955941085 26.944683271396784, 73.30386616741802 26.957560025779955, 73.10039672736166 26.982922465033347 M73.10039672736166 26.982922465033347 C73.01457626169456 26.98647202574953, 72.92875579602745 26.99002158646572, 72.6875 27 M73.10039672736166 26.982922465033347 C72.97257622020955 26.988209160314984, 72.84475571305744 26.993495855596617, 72.6875 27 M72.6875 27 C72.6875 27, 72.6875 27, 72.6875 27 M72.6875 27 C72.6875 27, 72.6875 27, 72.6875 27 M72.6875 27 C34.988978482628966 27, -2.709543034742069 27, -72.6875 27 M72.6875 27 C36.07240375226508 27, -0.5426924954698364 27, -72.6875 27 M-72.6875 27 C-72.6875 27, -72.6875 27, -72.6875 27 M-72.6875 27 C-72.6875 27, -72.6875 27, -72.6875 27 M-72.6875 27 C-72.78164853591603 26.9961059877504, -72.87579707183207 26.992211975500805, -73.10039672736166 26.982922465033347 M-72.6875 27 C-72.82697619566305 26.994231221875573, -72.96645239132611 26.988462443751146, -73.10039672736166 26.982922465033347 M-73.10039672736166 26.982922465033347 C-73.22130613845975 26.967851122657365, -73.34221554955786 26.952779780281382, -73.51047295140367 26.931806517013612 M-73.10039672736166 26.982922465033347 C-73.2412088898199 26.965370247287545, -73.38202105227815 26.94781802954174, -73.51047295140367 26.931806517013612 M-73.51047295140367 26.931806517013612 C-73.66968074115631 26.898424153963173, -73.82888853090894 26.865041790912734, -73.914927435704 26.847001329696653 M-73.51047295140367 26.931806517013612 C-73.6713438206156 26.89807544287072, -73.83221468982754 26.864344368727824, -73.914927435704 26.847001329696653 M-73.914927435704 26.847001329696653 C-74.05475993748543 26.805371390221957, -74.19459243926687 26.76374145074726, -74.31099734602341 26.729086208503173 M-73.914927435704 26.847001329696653 C-74.06290196651534 26.80294740315602, -74.21087649732667 26.758893476615384, -74.31099734602341 26.729086208503173 M-74.31099734602341 26.729086208503173 C-74.45305664510977 26.67365449798883, -74.59511594419611 26.61822278747449, -74.69597712326485 26.578866633275286 M-74.31099734602341 26.729086208503173 C-74.42665621869897 26.683955976340975, -74.5423150913745 26.63882574417878, -74.69597712326485 26.578866633275286 M-74.69597712326485 26.578866633275286 C-74.84447555347634 26.506270174369696, -74.99297398368783 26.433673715464106, -75.06723696518537 26.397368756032446 M-74.69597712326485 26.578866633275286 C-74.8129669014966 26.521673815710283, -74.92995667972833 26.46448099814528, -75.06723696518537 26.397368756032446 M-75.06723696518537 26.397368756032446 C-75.13978488885823 26.354139576675642, -75.21233281253109 26.310910397318835, -75.42224079061214 26.185832391312644 M-75.06723696518537 26.397368756032446 C-75.17402296089494 26.333738114001385, -75.28080895660452 26.270107471970324, -75.42224079061214 26.185832391312644 M-75.42224079061214 26.185832391312644 C-75.49196164882586 26.13605265535162, -75.5616825070396 26.0862729193906, -75.75856356344833 25.94570254698197 M-75.42224079061214 26.185832391312644 C-75.55009358644706 26.094547249654887, -75.67794638228199 26.003262107997134, -75.75856356344833 25.94570254698197 M-75.75856356344833 25.94570254698197 C-75.86028916993726 25.859545353188327, -75.96201477642617 25.77338815939469, -76.0739078581287 25.67861955336566 M-75.75856356344833 25.94570254698197 C-75.83824897528814 25.878212445842532, -75.91793438712794 25.810722344703095, -76.0739078581287 25.67861955336566 M-76.0739078581287 25.67861955336566 C-76.13536100642288 25.61716640507148, -76.19681415471707 25.5557132567773, -76.36611955336566 25.386407858128706 M-76.0739078581287 25.67861955336566 C-76.19014554572341 25.56238186577096, -76.30638323331812 25.446144178176258, -76.36611955336566 25.386407858128706 M-76.36611955336566 25.386407858128706 C-76.43548265185109 25.304511002501297, -76.50484575033651 25.222614146873884, -76.63320254698196 25.07106356344834 M-76.36611955336566 25.386407858128706 C-76.46966348771389 25.26415376585812, -76.57320742206213 25.141899673587528, -76.63320254698196 25.07106356344834 M-76.63320254698196 25.07106356344834 C-76.68785456341516 24.994518651843816, -76.74250657984834 24.917973740239287, -76.87333239131264 24.734740790612133 M-76.63320254698196 25.07106356344834 C-76.70256956685797 24.973909007199367, -76.77193658673397 24.876754450950394, -76.87333239131264 24.734740790612133 M-76.87333239131264 24.734740790612133 C-76.9579418099513 24.592747865075943, -77.04255122858994 24.450754939539753, -77.08486875603245 24.37973696518537 M-76.87333239131264 24.734740790612133 C-76.92072994232716 24.655197436691402, -76.96812749334167 24.575654082770676, -77.08486875603245 24.37973696518537 M-77.08486875603245 24.37973696518537 C-77.15691848129283 24.23235689652044, -77.22896820655322 24.084976827855513, -77.26636663327528 24.00847712326485 M-77.08486875603245 24.37973696518537 C-77.1481181693095 24.250358222405993, -77.21136758258655 24.12097947962662, -77.26636663327528 24.00847712326485 M-77.26636663327528 24.00847712326485 C-77.32019565940543 23.870525152243296, -77.37402468553559 23.732573181221742, -77.41658620850318 23.623497346023417 M-77.26636663327528 24.00847712326485 C-77.29808026464482 23.927202051612955, -77.32979389601438 23.845926979961057, -77.41658620850318 23.623497346023417 M-77.41658620850318 23.623497346023417 C-77.44273381861434 23.53566907186335, -77.46888142872551 23.44784079770328, -77.53450132969665 23.227427435703994 M-77.41658620850318 23.623497346023417 C-77.45868656298312 23.48208474809271, -77.50078691746305 23.340672150162003, -77.53450132969665 23.227427435703994 M-77.53450132969665 23.227427435703994 C-77.5665365697271 23.074644370235017, -77.59857180975757 22.921861304766036, -77.61930651701361 22.82297295140367 M-77.53450132969665 23.227427435703994 C-77.56683889062485 23.073202535759357, -77.59917645155305 22.918977635814716, -77.61930651701361 22.82297295140367 M-77.61930651701361 22.82297295140367 C-77.63616558393441 22.68772157151962, -77.6530246508552 22.552470191635575, -77.67042246503335 22.412896727361662 M-77.61930651701361 22.82297295140367 C-77.6348861102589 22.6979861123124, -77.65046570350421 22.572999273221125, -77.67042246503335 22.412896727361662 M-77.67042246503335 22.412896727361662 C-77.67538642190907 22.292879315437222, -77.68035037878478 22.172861903512782, -77.6875 22 M-77.67042246503335 22.412896727361662 C-77.67384570686482 22.330130370745117, -77.6772689486963 22.24736401412857, -77.6875 22 M-77.6875 22 C-77.6875 22, -77.6875 22, -77.6875 22 M-77.6875 22 C-77.6875 22, -77.6875 22, -77.6875 22 M-77.6875 22 C-77.6875 4.856872738476447, -77.6875 -12.286254523047106, -77.6875 -22 M-77.6875 22 C-77.6875 8.24028449616171, -77.6875 -5.51943100767658, -77.6875 -22 M-77.6875 -22 C-77.6875 -22, -77.6875 -22, -77.6875 -22 M-77.6875 -22 C-77.6875 -22, -77.6875 -22, -77.6875 -22 M-77.6875 -22 C-77.68252460977521 -22.120293844818583, -77.67754921955043 -22.240587689637163, -77.67042246503335 -22.41289672736166 M-77.6875 -22 C-77.68203824985308 -22.132052943573715, -77.67657649970617 -22.264105887147434, -77.67042246503335 -22.41289672736166 M-77.67042246503335 -22.41289672736166 C-77.65887699455305 -22.505519932501482, -77.64733152407275 -22.598143137641305, -77.61930651701361 -22.82297295140367 M-77.67042246503335 -22.41289672736166 C-77.65284640635598 -22.55390015300832, -77.6352703476786 -22.694903578654987, -77.61930651701361 -22.82297295140367 M-77.61930651701361 -22.82297295140367 C-77.60030427123795 -22.913598817095355, -77.58130202546228 -23.00422468278704, -77.53450132969665 -23.227427435703994 M-77.61930651701361 -22.82297295140367 C-77.60005152808162 -22.914804204480102, -77.58079653914963 -23.006635457556534, -77.53450132969665 -23.227427435703994 M-77.53450132969665 -23.227427435703994 C-77.48960946053823 -23.378216566153768, -77.44471759137983 -23.52900569660354, -77.41658620850318 -23.623497346023417 M-77.53450132969665 -23.227427435703994 C-77.49418796620664 -23.36283763670751, -77.45387460271664 -23.49824783771103, -77.41658620850318 -23.623497346023417 M-77.41658620850318 -23.623497346023417 C-77.37032306321537 -23.742059626208057, -77.32405991792757 -23.8606219063927, -77.26636663327528 -24.008477123264846 M-77.41658620850318 -23.623497346023417 C-77.35948670373563 -23.76983083546817, -77.30238719896808 -23.916164324912923, -77.26636663327528 -24.008477123264846 M-77.26636663327528 -24.008477123264846 C-77.20391277240056 -24.136228537594913, -77.14145891152583 -24.263979951924984, -77.08486875603245 -24.379736965185366 M-77.26636663327528 -24.008477123264846 C-77.20254665530734 -24.139022974773876, -77.1387266773394 -24.26956882628291, -77.08486875603245 -24.379736965185366 M-77.08486875603245 -24.379736965185366 C-77.01094421426512 -24.503798353661438, -76.93701967249781 -24.627859742137513, -76.87333239131264 -24.734740790612133 M-77.08486875603245 -24.379736965185366 C-77.00793883502057 -24.50884203080929, -76.93100891400869 -24.637947096433216, -76.87333239131264 -24.734740790612133 M-76.87333239131264 -24.734740790612133 C-76.80007120323468 -24.837349468780946, -76.72681001515673 -24.93995814694976, -76.63320254698196 -25.07106356344834 M-76.87333239131264 -24.734740790612133 C-76.7884255752758 -24.85366018558281, -76.70351875923895 -24.97257958055349, -76.63320254698196 -25.07106356344834 M-76.63320254698196 -25.07106356344834 C-76.56802052456248 -25.148023831892978, -76.50283850214302 -25.22498410033762, -76.36611955336566 -25.386407858128706 M-76.63320254698196 -25.07106356344834 C-76.53412522758182 -25.188043933415074, -76.43504790818169 -25.305024303381806, -76.36611955336566 -25.386407858128706 M-76.36611955336566 -25.386407858128706 C-76.28807602155024 -25.464451389944134, -76.2100324897348 -25.542494921759566, -76.0739078581287 -25.678619553365657 M-76.36611955336566 -25.386407858128706 C-76.30050621101826 -25.452021200476107, -76.23489286867085 -25.51763454282351, -76.0739078581287 -25.678619553365657 M-76.0739078581287 -25.678619553365657 C-75.97129683767125 -25.765526654537666, -75.86868581721379 -25.85243375570968, -75.75856356344833 -25.945702546981966 M-76.0739078581287 -25.678619553365657 C-75.96734845633164 -25.768870762948413, -75.86078905453456 -25.85912197253117, -75.75856356344833 -25.945702546981966 M-75.75856356344833 -25.945702546981966 C-75.67742312966799 -26.00363570318275, -75.59628269588764 -26.06156885938353, -75.42224079061214 -26.185832391312644 M-75.75856356344833 -25.945702546981966 C-75.68895308796121 -25.99540347119101, -75.61934261247409 -26.045104395400056, -75.42224079061214 -26.185832391312644 M-75.42224079061214 -26.185832391312644 C-75.34148421868132 -26.233952863346836, -75.26072764675048 -26.28207333538103, -75.06723696518537 -26.397368756032446 M-75.42224079061214 -26.185832391312644 C-75.33444937545906 -26.238144720039706, -75.24665796030598 -26.29045704876677, -75.06723696518537 -26.397368756032446 M-75.06723696518537 -26.397368756032446 C-74.95762101028077 -26.450956731031884, -74.84800505537616 -26.504544706031325, -74.69597712326485 -26.578866633275286 M-75.06723696518537 -26.397368756032446 C-74.98404042331403 -26.438041067008722, -74.90084388144267 -26.478713377985002, -74.69597712326485 -26.578866633275286 M-74.69597712326485 -26.578866633275286 C-74.58926552327317 -26.62050562880254, -74.48255392328149 -26.66214462432979, -74.31099734602341 -26.729086208503173 M-74.69597712326485 -26.578866633275286 C-74.60688446007707 -26.613630698327974, -74.51779179688927 -26.64839476338066, -74.31099734602341 -26.729086208503173 M-74.31099734602341 -26.729086208503173 C-74.18962884814 -26.765219175850913, -74.06826035025658 -26.801352143198653, -73.914927435704 -26.847001329696653 M-74.31099734602341 -26.729086208503173 C-74.19164429097513 -26.764619152521767, -74.07229123592687 -26.800152096540362, -73.914927435704 -26.847001329696653 M-73.914927435704 -26.847001329696653 C-73.82416525184527 -26.86603215838619, -73.73340306798656 -26.88506298707573, -73.51047295140367 -26.931806517013612 M-73.914927435704 -26.847001329696653 C-73.79849906305309 -26.87141379224791, -73.68207069040216 -26.895826254799168, -73.51047295140367 -26.931806517013612 M-73.51047295140367 -26.931806517013612 C-73.40217814180691 -26.945305450952265, -73.29388333221014 -26.958804384890918, -73.10039672736167 -26.982922465033347 M-73.51047295140367 -26.931806517013612 C-73.41724178686154 -26.943427769554376, -73.3240106223194 -26.955049022095142, -73.10039672736167 -26.982922465033347 M-73.10039672736167 -26.982922465033347 C-72.95920367904785 -26.98876225270867, -72.81801063073402 -26.99460204038399, -72.6875 -27 M-73.10039672736167 -26.982922465033347 C-72.93952625083685 -26.989576117159654, -72.77865577431203 -26.996229769285957, -72.6875 -27 M-72.6875 -27 C-72.6875 -27, -72.6875 -27, -72.6875 -27 M-72.6875 -27 C-72.6875 -27, -72.6875 -27, -72.6875 -27" stroke="#9370DB" stroke-width="1.3" fill="none" stroke-dasharray="0 0" style=""/></g><g class="label" style="" transform="translate(-62.6875, -12)"><rect/><foreignObject width="125.375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Nyxora LLM Core</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-C-3" transform="translate(687.6875, 379.484375)"><polygon points="115.484375,0 230.96875,-115.484375 115.484375,-230.96875 0,-115.484375" class="label-container" transform="translate(-114.984375, 115.484375)"/><g class="label" style="" transform="translate(-88.484375, -12)"><rect/><foreignObject width="176.96875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Determine Required Skill</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-D-5" transform="translate(418.0703125, 595.96875)"><rect class="basic label-container" style="" x="-100.109375" y="-27" width="200.21875" height="54"/><g class="label" style="" transform="translate(-70.109375, -12)"><rect/><foreignObject width="140.21875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Web3 Skill Modules</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-E-7" transform="translate(1098.34375, 985.8125)"><rect class="basic label-container" style="" x="-106.0390625" y="-27" width="212.078125" height="54"/><g class="label" style="" transform="translate(-76.0390625, -12)"><rect/><foreignObject width="152.078125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>OS &amp; Plugin Modules</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-F-9" transform="translate(418.0703125, 784.890625)"><polygon points="87.921875,0 175.84375,-87.921875 87.921875,-175.84375 0,-87.921875" class="label-container" transform="translate(-87.421875, 87.921875)"/><g class="label" style="" transform="translate(-60.921875, -12)"><rect/><foreignObject width="121.84375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Transaction Type</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-G-11" transform="translate(138, 1420.53125)"><rect class="basic label-container" style="" x="-130" y="-39" width="260" height="78"/><g class="label" style="" transform="translate(-100, -24)"><rect/><foreignObject width="200" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;"><span class="nodeLabel "><p>Fetch On-chain Data &amp; Prices</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-H-13" transform="translate(565.984375, 985.8125)"><rect class="basic label-container" style="" x="-130" y="-39" width="260" height="78"/><g class="label" style="" transform="translate(-100, -24)"><rect/><foreignObject width="200" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;"><span class="nodeLabel "><p>Queue in Transaction Manager</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-I-15" transform="translate(565.984375, 1203.171875)"><rect class="basic label-container" style="" x="-130" y="-39" width="260" height="78"/><g class="label" style="" transform="translate(-100, -24)"><rect/><foreignObject width="200" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;"><span class="nodeLabel "><p>Require Human-in-the-Loop Approval</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-J-17" transform="translate(433.828125, 1420.53125)"><rect class="basic label-container" style="" x="-115.828125" y="-27" width="231.65625" height="54"/><g class="label" style="" transform="translate(-85.828125, -12)"><rect/><foreignObject width="171.65625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Broadcast to Blockchain</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-K-19" transform="translate(698.140625, 1420.53125)"><rect class="basic label-container" style="" x="-98.484375" y="-27" width="196.96875" height="54"/><g class="label" style="" transform="translate(-68.484375, -12)"><rect/><foreignObject width="136.96875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Cancel Transaction</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-L-21" transform="translate(1098.34375, 1203.171875)"><polygon points="104.359375,0 208.71875,-104.359375 104.359375,-208.71875 0,-104.359375" class="label-container" transform="translate(-103.859375, 104.359375)"/><g class="label" style="" transform="translate(-77.359375, -12)"><rect/><foreignObject width="154.71875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Security Policy Check</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-M-23" transform="translate(959.3125, 1420.53125)"><rect class="basic label-container" style="" x="-112.6875" y="-27" width="225.375" height="54"/><g class="label" style="" transform="translate(-82.6875, -12)"><rect/><foreignObject width="165.375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Ask Explicit Permission</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-N-25" transform="translate(1237.375, 1420.53125)"><rect class="basic label-container" style="" x="-115.375" y="-27" width="230.75" height="54"/><g class="label" style="" transform="translate(-85.375, -12)"><rect/><foreignObject width="170.75" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Execute Shell / File Ops</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-O-27" transform="translate(565.984375, 1548.53125)"><rect class="basic label-container" style="" x="-130" y="-39" width="260" height="78"/><g class="label" style="" transform="translate(-100, -24)"><rect/><foreignObject width="200" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;"><span class="nodeLabel "><p>Render Dashboard UI / Chat Response</p></span></div></foreignObject></g></g></g></g></g></svg>
@@ -31,6 +31,7 @@ const browseWeb_1 = require("../system/skills/browseWeb");
31
31
  const installSkill_1 = require("../system/skills/installSkill");
32
32
  const pluginManager_1 = require("../system/pluginManager");
33
33
  const paths_1 = require("../config/paths");
34
+ const picocolors_1 = __importDefault(require("picocolors"));
34
35
  exports.logger = new logger_1.Logger();
35
36
  let currentKeyIndex = 0;
36
37
  function getOpenAI() {
@@ -91,6 +92,41 @@ function getOpenAI() {
91
92
  });
92
93
  }
93
94
  }
95
+ async function executeWithRetry(requestBuilder, maxRetries = 3) {
96
+ let retries = 0;
97
+ while (retries <= maxRetries) {
98
+ try {
99
+ const client = getOpenAI();
100
+ return await requestBuilder(client);
101
+ }
102
+ catch (error) {
103
+ const status = error?.status || error?.response?.status;
104
+ // 401 Unauthorized or 400 Bad Request - don't retry, it's fatal
105
+ if (status === 401 || status === 400) {
106
+ console.error(`[LLM] Fatal Error ${status}: ${error.message}. Aborting.`);
107
+ throw error;
108
+ }
109
+ // 429 Rate Limit - rotate provider/key immediately and retry
110
+ if (status === 429) {
111
+ console.warn(`[LLM] Rate Limit (429) hit. Rotating key...`);
112
+ // getOpenAI() automatically rotates to next key if available
113
+ retries++;
114
+ if (retries > maxRetries)
115
+ throw error;
116
+ continue; // Try next key immediately
117
+ }
118
+ // 500, 502, 503, Timeout, Network error - Exponential Backoff
119
+ retries++;
120
+ if (retries > maxRetries) {
121
+ console.error(`[LLM] Max retries reached.`);
122
+ throw error;
123
+ }
124
+ const delayMs = Math.pow(2, retries) * 1000; // 2s, 4s, 8s
125
+ console.warn(`[LLM] API Error (${status || error.message}). Retrying in ${delayMs}ms...`);
126
+ await new Promise(resolve => setTimeout(resolve, delayMs));
127
+ }
128
+ }
129
+ }
94
130
  function getSystemPrompt() {
95
131
  const config = (0, parser_1.loadConfig)();
96
132
  let basePrompt = `You are an autonomous Web3 agent operating on EVM chains.
@@ -134,7 +170,7 @@ If the user doesn't specify a chain, default to: ${config.agent.default_chain}.`
134
170
  }
135
171
  return basePrompt;
136
172
  }
137
- async function processUserInput(input, role = 'user') {
173
+ async function processUserInput(input, role = 'user', onProgress) {
138
174
  const config = (0, parser_1.loadConfig)();
139
175
  // Add input to memory
140
176
  exports.logger.addEntry({ role, content: input });
@@ -162,36 +198,37 @@ async function processUserInput(input, role = 'user') {
162
198
  if (config.llm.provider !== 'openai' && config.llm.provider !== 'ollama' && config.llm.provider !== 'gemini' && config.llm.provider !== 'openrouter') {
163
199
  return `Provider ${config.llm.provider} is configured, but currently only OpenAI, OpenRouter, Ollama, and Gemini adapters are implemented.`;
164
200
  }
165
- const openai = getOpenAI();
166
- const response = await openai.chat.completions.create({
167
- model: config.llm.model,
168
- temperature: config.llm.temperature,
169
- messages: messages,
170
- tools: [
171
- getBalance_1.getBalanceToolDefinition,
172
- transfer_1.transferToolDefinition,
173
- getPrice_1.getPriceToolDefinition,
174
- swapToken_1.swapTokenToolDefinition,
175
- bridgeToken_1.bridgeTokenToolDefinition,
176
- mintNft_1.mintNftToolDefinition,
177
- customTx_1.customTxToolDefinition,
178
- createWallet_1.createWalletToolDefinition,
179
- checkSecurity_1.checkSecurityToolDefinition,
180
- marketAnalysis_1.marketAnalysisToolDefinition,
181
- checkPortfolio_1.checkPortfolioToolDefinition,
182
- limitOrderManager_1.createLimitOrderToolDefinition,
183
- limitOrderManager_1.listLimitOrdersToolDefinition,
184
- limitOrderManager_1.cancelLimitOrderToolDefinition,
185
- updateProfile_1.updateProfileToolDefinition,
186
- updateSecurityPolicy_1.updateSecurityPolicyToolDefinition,
187
- readFile_1.readLocalFileToolDefinition,
188
- writeFile_1.writeLocalFileToolDefinition,
189
- executeShell_1.runTerminalCommandToolDefinition,
190
- browseWeb_1.browseWebsiteToolDefinition,
191
- installSkill_1.installExternalSkillToolDefinition,
192
- ...pluginManager_1.pluginManager.getToolDefinitions()
193
- ],
194
- tool_choice: "auto",
201
+ const response = await executeWithRetry(async (client) => {
202
+ return await client.chat.completions.create({
203
+ model: config.llm.model,
204
+ temperature: config.llm.temperature,
205
+ messages: messages,
206
+ tools: [
207
+ getBalance_1.getBalanceToolDefinition,
208
+ transfer_1.transferToolDefinition,
209
+ getPrice_1.getPriceToolDefinition,
210
+ swapToken_1.swapTokenToolDefinition,
211
+ bridgeToken_1.bridgeTokenToolDefinition,
212
+ mintNft_1.mintNftToolDefinition,
213
+ customTx_1.customTxToolDefinition,
214
+ createWallet_1.createWalletToolDefinition,
215
+ checkSecurity_1.checkSecurityToolDefinition,
216
+ marketAnalysis_1.marketAnalysisToolDefinition,
217
+ checkPortfolio_1.checkPortfolioToolDefinition,
218
+ limitOrderManager_1.createLimitOrderToolDefinition,
219
+ limitOrderManager_1.listLimitOrdersToolDefinition,
220
+ limitOrderManager_1.cancelLimitOrderToolDefinition,
221
+ updateProfile_1.updateProfileToolDefinition,
222
+ updateSecurityPolicy_1.updateSecurityPolicyToolDefinition,
223
+ readFile_1.readLocalFileToolDefinition,
224
+ writeFile_1.writeLocalFileToolDefinition,
225
+ executeShell_1.runTerminalCommandToolDefinition,
226
+ browseWeb_1.browseWebsiteToolDefinition,
227
+ installSkill_1.installExternalSkillToolDefinition,
228
+ ...pluginManager_1.pluginManager.getToolDefinitions()
229
+ ],
230
+ tool_choice: "auto",
231
+ });
195
232
  });
196
233
  const responseMessage = response.choices[0].message;
197
234
  // Log tracking
@@ -213,103 +250,147 @@ async function processUserInput(input, role = 'user') {
213
250
  let result = "";
214
251
  const args = JSON.parse(toolCall.function.arguments);
215
252
  const toolName = toolCall.function.name;
216
- switch (toolName) {
217
- case 'get_balance': {
218
- result = await (0, getBalance_1.getBalance)(args.chainName, args.address, args.token);
219
- break;
220
- }
221
- case 'transfer_token':
222
- case 'transfer_native': {
223
- result = await (0, transfer_1.prepareTransfer)(args.chainName, args.toAddress, args.amountStr || args.amountEth, args.token);
224
- break;
225
- }
226
- case 'get_price': {
227
- result = await (0, getPrice_1.getPrice)(args.coinId);
228
- break;
229
- }
230
- case 'swap_token': {
231
- result = await (0, swapToken_1.prepareSwapToken)(args.chainName, args.fromToken, args.toToken, args.amountStr || args.amount, args.mode, args.providerName);
232
- break;
233
- }
234
- case 'bridge_token': {
235
- result = await (0, bridgeToken_1.prepareBridgeToken)(args.fromChainName, args.toChainName, args.fromToken, args.toToken, args.amountStr, args.mode, args.providerName);
236
- break;
237
- }
238
- case 'mint_nft': {
239
- result = await (0, mintNft_1.prepareMintNft)(args.chainName, args.contractAddress, args.functionSignature, args.argsStr, args.valueEth);
240
- break;
241
- }
242
- case 'custom_tx': {
243
- result = await (0, customTx_1.prepareCustomTx)(args.chainName, args.toAddress, args.dataHex, args.valueEth, args.gasLimitStr);
244
- break;
245
- }
246
- case 'create_wallet': {
247
- result = await (0, createWallet_1.createWallet)();
248
- break;
249
- }
250
- case 'check_token_security': {
251
- result = await (0, checkSecurity_1.checkTokenSecurity)(args.chainName, args.contractAddress);
252
- break;
253
- }
254
- case 'analyze_market': {
255
- result = await (0, marketAnalysis_1.analyzeMarket)(args.chainName, args.tokenAddressOrSymbol);
256
- break;
257
- }
258
- case 'check_portfolio': {
259
- result = await (0, checkPortfolio_1.checkPortfolio)(args.chainName, args.address);
260
- break;
261
- }
262
- case 'create_limit_order': {
263
- result = limitOrderManager_1.limitOrderManager.createOrder(args.chainName, args.fromToken, args.toToken, args.amountStr, args.targetPriceUsd, args.condition);
264
- break;
265
- }
266
- case 'list_limit_orders': {
267
- result = limitOrderManager_1.limitOrderManager.listOrders();
268
- break;
269
- }
270
- case 'cancel_limit_order': {
271
- result = limitOrderManager_1.limitOrderManager.cancelOrder(args.id);
272
- break;
273
- }
274
- case 'update_profile': {
275
- result = (0, updateProfile_1.updateProfile)(args.content, args.mode);
276
- break;
277
- }
278
- case 'update_security_policy': {
279
- result = (0, updateSecurityPolicy_1.updateSecurityPolicy)(args.rule, args.action);
280
- break;
281
- }
282
- case 'read_local_file': {
283
- result = (0, readFile_1.readLocalFile)(args.filePath);
284
- break;
285
- }
286
- case 'write_local_file': {
287
- result = (0, writeFile_1.writeLocalFile)(args.filePath, args.content);
288
- break;
289
- }
290
- case 'run_terminal_command': {
291
- result = await (0, executeShell_1.runTerminalCommand)(args.command);
292
- break;
293
- }
294
- case 'browse_website': {
295
- result = await (0, browseWeb_1.browseWebsite)(args.url);
296
- break;
297
- }
298
- case 'install_external_skill': {
299
- result = await (0, installSkill_1.installExternalSkill)(args.url);
300
- break;
301
- }
302
- default: {
303
- const externalResult = await pluginManager_1.pluginManager.executeTool(toolName, args);
304
- if (externalResult !== null) {
305
- result = externalResult;
253
+ console.log(picocolors_1.default.yellow(`[⚡ Eksekusi Tool] AI memanggil ${toolName}...`));
254
+ if (onProgress)
255
+ onProgress(`_⚡ Menjalankan alat: ${toolName}..._`);
256
+ try {
257
+ switch (toolName) {
258
+ case 'get_balance': {
259
+ result = await (0, getBalance_1.getBalance)(args.chainName, args.address, args.token);
260
+ break;
261
+ }
262
+ case 'transfer_token':
263
+ case 'transfer_native': {
264
+ if (config.permissions?.web3?.allow_transfer === false) {
265
+ result = `[Security Blocked] Runtime Permission Denied: Web3 transfers are disabled. Update config.yaml to allow.`;
266
+ break;
267
+ }
268
+ result = await (0, transfer_1.prepareTransfer)(args.chainName, args.toAddress, args.amountStr || args.amountEth, args.token);
269
+ break;
270
+ }
271
+ case 'get_price': {
272
+ result = await (0, getPrice_1.getPrice)(args.coinId);
273
+ break;
274
+ }
275
+ case 'swap_token': {
276
+ if (config.permissions?.web3?.allow_swap === false) {
277
+ result = `[Security Blocked] Runtime Permission Denied: Web3 swaps are disabled. Update config.yaml to allow.`;
278
+ break;
279
+ }
280
+ // Note: max_usd_per_tx validation would ideally be calculated here before prepareSwapToken
281
+ result = await (0, swapToken_1.prepareSwapToken)(args.chainName, args.fromToken, args.toToken, args.amountStr || args.amount, args.mode, args.providerName);
282
+ break;
283
+ }
284
+ case 'bridge_token': {
285
+ if (config.permissions?.web3?.allow_transfer === false) {
286
+ result = `[Security Blocked] Runtime Permission Denied: Web3 bridging (transfer) is disabled. Update config.yaml to allow.`;
287
+ break;
288
+ }
289
+ result = await (0, bridgeToken_1.prepareBridgeToken)(args.fromChainName, args.toChainName, args.fromToken, args.toToken, args.amountStr, args.mode, args.providerName);
290
+ break;
291
+ }
292
+ case 'mint_nft': {
293
+ result = await (0, mintNft_1.prepareMintNft)(args.chainName, args.contractAddress, args.functionSignature, args.argsStr, args.valueEth);
294
+ break;
295
+ }
296
+ case 'custom_tx': {
297
+ if (config.permissions?.web3?.allow_transfer === false) {
298
+ result = `[Security Blocked] Runtime Permission Denied: Custom transactions are blocked because transfers are disabled.`;
299
+ break;
300
+ }
301
+ result = await (0, customTx_1.prepareCustomTx)(args.chainName, args.toAddress, args.dataHex, args.valueEth, args.gasLimitStr);
302
+ break;
303
+ }
304
+ case 'create_wallet': {
305
+ result = await (0, createWallet_1.createWallet)();
306
+ break;
307
+ }
308
+ case 'check_token_security': {
309
+ result = await (0, checkSecurity_1.checkTokenSecurity)(args.chainName, args.contractAddress);
310
+ break;
311
+ }
312
+ case 'analyze_market': {
313
+ result = await (0, marketAnalysis_1.analyzeMarket)(args.chainName, args.tokenAddressOrSymbol);
314
+ break;
315
+ }
316
+ case 'check_portfolio': {
317
+ result = await (0, checkPortfolio_1.checkPortfolio)(args.chainName, args.address);
318
+ break;
319
+ }
320
+ case 'create_limit_order': {
321
+ if (config.permissions?.web3?.allow_swap === false) {
322
+ result = `[Security Blocked] Runtime Permission Denied: Limit orders require swap permissions. Update config.yaml to allow.`;
323
+ break;
324
+ }
325
+ result = limitOrderManager_1.limitOrderManager.createOrder(args.chainName, args.fromToken, args.toToken, args.amountStr, args.targetPriceUsd, args.condition);
326
+ break;
327
+ }
328
+ case 'list_limit_orders': {
329
+ result = limitOrderManager_1.limitOrderManager.listOrders();
330
+ break;
306
331
  }
307
- else {
308
- result = `Error: Tool ${toolName} is not implemented.`;
332
+ case 'cancel_limit_order': {
333
+ result = limitOrderManager_1.limitOrderManager.cancelOrder(args.id);
334
+ break;
309
335
  }
310
- break;
336
+ case 'update_profile': {
337
+ result = (0, updateProfile_1.updateProfile)(args.content, args.mode);
338
+ break;
339
+ }
340
+ case 'update_security_policy': {
341
+ result = (0, updateSecurityPolicy_1.updateSecurityPolicy)(args.rule, args.action);
342
+ break;
343
+ }
344
+ case 'read_local_file': {
345
+ result = (0, readFile_1.readLocalFile)(args.filePath);
346
+ break;
347
+ }
348
+ case 'write_local_file': {
349
+ if (config.permissions?.system?.allow_file_write === false) {
350
+ result = `[Security Blocked] Runtime Permission Denied: File writing is disabled. Update config.yaml to allow.`;
351
+ break;
352
+ }
353
+ result = (0, writeFile_1.writeLocalFile)(args.filePath, args.content);
354
+ break;
355
+ }
356
+ case 'run_terminal_command': {
357
+ if (config.permissions?.system?.allow_shell_execution === false) {
358
+ result = `[Security Blocked] Runtime Permission Denied: Shell execution is disabled. Update config.yaml to allow.`;
359
+ break;
360
+ }
361
+ result = await (0, executeShell_1.runTerminalCommand)(args.command);
362
+ break;
363
+ }
364
+ case 'browse_website': {
365
+ result = await (0, browseWeb_1.browseWebsite)(args.url);
366
+ break;
367
+ }
368
+ case 'install_external_skill': {
369
+ result = await (0, installSkill_1.installExternalSkill)(args.url);
370
+ break;
371
+ }
372
+ default: {
373
+ const externalResult = await pluginManager_1.pluginManager.executeTool(toolName, args);
374
+ if (externalResult !== null) {
375
+ result = externalResult;
376
+ }
377
+ else {
378
+ result = `Error: Tool ${toolName} is not implemented.`;
379
+ }
380
+ break;
381
+ }
382
+ }
383
+ if (result.includes('[Security Blocked]') || result.startsWith('Error:')) {
384
+ console.log(picocolors_1.default.red(`[❌ Gagal] Tool ${toolName} mengembalikan error atau diblokir.`));
385
+ }
386
+ else {
387
+ console.log(picocolors_1.default.green(`[✅ Sukses] Tool ${toolName} berhasil dieksekusi.`));
311
388
  }
312
389
  }
390
+ catch (toolError) {
391
+ result = `Error executing ${toolName}: ${toolError.message}`;
392
+ console.log(picocolors_1.default.red(`[❌ Error Crash] Eksekusi ${toolName} gagal total: ${toolError.message}`));
393
+ }
313
394
  exports.logger.addEntry({
314
395
  role: 'tool',
315
396
  tool_call_id: toolCall.id,
@@ -336,10 +417,11 @@ async function processUserInput(input, role = 'user') {
336
417
  return msg;
337
418
  })
338
419
  ];
339
- const openai = getOpenAI();
340
- const secondResponse = await openai.chat.completions.create({
341
- model: config.llm.model,
342
- messages: secondMessages,
420
+ const secondResponse = await executeWithRetry(async (client) => {
421
+ return await client.chat.completions.create({
422
+ model: config.llm.model,
423
+ messages: secondMessages,
424
+ });
343
425
  });
344
426
  if (secondResponse.usage?.total_tokens) {
345
427
  tracker_1.Tracker.addTokens(secondResponse.usage.total_tokens, config.llm.provider);
@@ -30,6 +30,10 @@ function loadConfig() {
30
30
  web3: { rpc_urls: {} },
31
31
  integrations: {
32
32
  telegram: { enabled: false }
33
+ },
34
+ permissions: {
35
+ web3: { allow_transfer: false, allow_swap: true, max_usd_per_tx: 50 },
36
+ system: { allow_shell_execution: false, allow_file_write: false }
33
37
  }
34
38
  };
35
39
  }
@@ -11,6 +11,7 @@ const path_1 = __importDefault(require("path"));
11
11
  const paths_1 = require("../config/paths");
12
12
  const parser_1 = require("../config/parser");
13
13
  const crypto_1 = require("../utils/crypto");
14
+ const accounts_1 = require("viem/accounts");
14
15
  async function runSetupWizard() {
15
16
  console.clear();
16
17
  const logo = `
@@ -76,12 +77,52 @@ Provider: ${config.llm.provider}`;
76
77
  if ((0, prompts_1.isCancel)(provider))
77
78
  return process.exit(0);
78
79
  // 2. Model Name
79
- const model = await (0, prompts_1.text)({
80
- message: 'Enter AI model name (e.g. gpt-4o, gemini-2.5-flash):',
81
- initialValue: config.llm.model,
82
- });
80
+ let modelOptions = [];
81
+ if (provider === 'gemini') {
82
+ modelOptions = [
83
+ { value: 'gemini-2.5-flash', label: 'gemini-2.5-flash (Fast & Cheap)' },
84
+ { value: 'gemini-2.5-pro', label: 'gemini-2.5-pro (Advanced Reasoning)' },
85
+ { value: 'gemini-1.5-pro', label: 'gemini-1.5-pro' },
86
+ ];
87
+ }
88
+ else if (provider === 'openai') {
89
+ modelOptions = [
90
+ { value: 'gpt-4o', label: 'gpt-4o (Powerful)' },
91
+ { value: 'gpt-4o-mini', label: 'gpt-4o-mini (Fast)' },
92
+ { value: 'o1-preview', label: 'o1-preview (Reasoning)' },
93
+ { value: 'o1-mini', label: 'o1-mini' },
94
+ ];
95
+ }
96
+ else if (provider === 'openrouter') {
97
+ modelOptions = [
98
+ { value: 'anthropic/claude-3.5-sonnet', label: 'Claude 3.5 Sonnet' },
99
+ { value: 'meta-llama/llama-3.1-70b-instruct', label: 'Llama 3.1 70B' },
100
+ { value: 'liquid/lfm-40b', label: 'Liquid LFM 40B' },
101
+ { value: 'google/gemini-pro-1.5', label: 'Gemini Pro 1.5' },
102
+ ];
103
+ }
104
+ else {
105
+ modelOptions = [
106
+ { value: 'llama3', label: 'Llama 3 (8B)' },
107
+ { value: 'qwen2', label: 'Qwen 2' },
108
+ { value: 'phi3', label: 'Phi-3' },
109
+ ];
110
+ }
111
+ modelOptions.push({ value: 'custom', label: 'Type manually (Custom Model)' });
112
+ let model = (await (0, prompts_1.select)({
113
+ message: 'Select AI Model:',
114
+ options: modelOptions,
115
+ }));
83
116
  if ((0, prompts_1.isCancel)(model))
84
117
  return process.exit(0);
118
+ if (model === 'custom') {
119
+ model = (await (0, prompts_1.text)({
120
+ message: 'Enter custom model name (e.g., deepseek-coder, llama-3-8b-instruct):',
121
+ initialValue: config.llm.model,
122
+ }));
123
+ if ((0, prompts_1.isCancel)(model))
124
+ return process.exit(0);
125
+ }
85
126
  // 3. API Key for LLM (Saved to config.yaml)
86
127
  let apiKey = '';
87
128
  if (provider !== 'ollama') {
@@ -121,19 +162,44 @@ Provider: ${config.llm.provider}`;
121
162
  if ((0, prompts_1.isCancel)(telegramToken))
122
163
  return process.exit(0);
123
164
  }
124
- // 6. Wallet Private Key (keystore.json)
125
- const privateKey = await (0, prompts_1.password)({
126
- message: 'Enter Wallet Private Key (0x...)\n (Will be AES-256-GCM encrypted. Leave empty to keep current):',
165
+ // 6. Wallet Setup
166
+ const walletSetupType = await (0, prompts_1.select)({
167
+ message: 'Web3 Wallet Setup:',
168
+ options: [
169
+ { value: 'skip', label: 'Skip for now (No Web3 execution)' },
170
+ { value: 'generate', label: 'Auto-Generate New Wallet (Recommended for testing)' },
171
+ { value: 'manual', label: 'Input Manual Private Key' },
172
+ ],
127
173
  });
128
- if ((0, prompts_1.isCancel)(privateKey))
174
+ if ((0, prompts_1.isCancel)(walletSetupType))
129
175
  return process.exit(0);
176
+ let privateKey = '';
177
+ if (walletSetupType === 'manual') {
178
+ privateKey = (await (0, prompts_1.password)({
179
+ message: 'Enter Wallet Private Key (0x...)\n (Will be AES-256-GCM encrypted. See documentation for import guides):',
180
+ }));
181
+ if ((0, prompts_1.isCancel)(privateKey))
182
+ return process.exit(0);
183
+ }
184
+ else if (walletSetupType === 'generate') {
185
+ privateKey = (0, accounts_1.generatePrivateKey)();
186
+ const account = (0, accounts_1.privateKeyToAccount)(privateKey);
187
+ (0, prompts_1.note)(`New Wallet Generated!\nAddress: ${account.address}\n\nIMPORTANT: Backup this address. The Private Key is securely injected into your local vault.`, 'Wallet Created');
188
+ }
130
189
  let masterPassword = '';
131
190
  if (privateKey) {
132
191
  masterPassword = (await (0, prompts_1.password)({
133
- message: 'Enter MASTER PASSWORD to encrypt your key vault:',
192
+ message: 'Enter a strong MASTER PASSWORD to encrypt your key vault:',
134
193
  }));
135
194
  if ((0, prompts_1.isCancel)(masterPassword) || !masterPassword)
136
195
  return process.exit(0);
196
+ const masterPasswordConfirm = (await (0, prompts_1.password)({
197
+ message: 'Confirm MASTER PASSWORD:',
198
+ }));
199
+ if ((0, prompts_1.isCancel)(masterPasswordConfirm) || masterPassword !== masterPasswordConfirm) {
200
+ console.log(picocolors_1.default.red('❌ Passwords do not match. Setup cancelled.'));
201
+ return process.exit(1);
202
+ }
137
203
  }
138
204
  // --- SAVING ---
139
205
  // Update Config.yaml
@@ -38,8 +38,25 @@ function startTelegramBot() {
38
38
  // Send typing action to Telegram
39
39
  bot.sendChatAction(chatId, 'typing');
40
40
  try {
41
+ let progressMsgId = null;
42
+ const onProgress = async (progressText) => {
43
+ try {
44
+ if (!progressMsgId) {
45
+ const sent = await bot.sendMessage(chatId, progressText, { parse_mode: 'Markdown' });
46
+ progressMsgId = sent.message_id;
47
+ }
48
+ else {
49
+ await bot.editMessageText(progressText, { chat_id: chatId, message_id: progressMsgId, parse_mode: 'Markdown' });
50
+ }
51
+ }
52
+ catch (e) { }
53
+ };
41
54
  // Feed the message to the AI agent
42
- const response = await (0, reasoning_1.processUserInput)(text);
55
+ const response = await (0, reasoning_1.processUserInput)(text, 'user', onProgress);
56
+ if (progressMsgId) {
57
+ // Clean up the progress message
58
+ bot.deleteMessage(chatId, progressMsgId).catch(() => { });
59
+ }
43
60
  // Send the AI's response back to Telegram
44
61
  // Check for newly created pending transactions
45
62
  const pendingTxs = transactionManager_1.txManager.getPending();
@@ -5,46 +5,105 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Logger = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
8
10
  const parser_1 = require("../config/parser");
9
11
  const paths_1 = require("../config/paths");
10
12
  class Logger {
11
- logFilePath;
12
- memory = [];
13
+ db;
13
14
  constructor() {
14
15
  const config = (0, parser_1.loadConfig)();
15
- this.logFilePath = (0, paths_1.getPath)(config.memory.path || 'memory.json');
16
- this.loadMemory();
16
+ let dbPath = config.memory?.path || 'memory.db';
17
+ if (dbPath.endsWith('.json')) {
18
+ dbPath = dbPath.replace('.json', '.db');
19
+ }
20
+ const fullPath = (0, paths_1.getPath)(dbPath);
21
+ // Ensure directory exists
22
+ const dir = path_1.default.dirname(fullPath);
23
+ if (!fs_1.default.existsSync(dir)) {
24
+ fs_1.default.mkdirSync(dir, { recursive: true });
25
+ }
26
+ this.db = new better_sqlite3_1.default(fullPath);
27
+ this.initDb();
17
28
  }
18
- loadMemory() {
19
- if (fs_1.default.existsSync(this.logFilePath)) {
29
+ initDb() {
30
+ this.db.exec(`
31
+ CREATE TABLE IF NOT EXISTS messages (
32
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
33
+ role TEXT NOT NULL,
34
+ content TEXT NOT NULL,
35
+ name TEXT,
36
+ tool_call_id TEXT,
37
+ tool_calls TEXT,
38
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
39
+ )
40
+ `);
41
+ // Migration logic from old memory.json to SQLite
42
+ const config = (0, parser_1.loadConfig)();
43
+ const oldJsonPath = (0, paths_1.getPath)(config.memory?.path || 'memory.json');
44
+ const countRow = this.db.prepare('SELECT COUNT(*) as count FROM messages').get();
45
+ if (countRow.count === 0 && fs_1.default.existsSync(oldJsonPath)) {
20
46
  try {
21
- const data = fs_1.default.readFileSync(this.logFilePath, 'utf-8');
22
- this.memory = JSON.parse(data);
47
+ const data = fs_1.default.readFileSync(oldJsonPath, 'utf-8');
48
+ const oldMemory = JSON.parse(data);
49
+ if (Array.isArray(oldMemory) && oldMemory.length > 0) {
50
+ const insert = this.db.prepare(`
51
+ INSERT INTO messages (role, content, name, tool_call_id, tool_calls)
52
+ VALUES (@role, @content, @name, @tool_call_id, @tool_calls)
53
+ `);
54
+ const insertMany = this.db.transaction((entries) => {
55
+ for (const entry of entries) {
56
+ insert.run({
57
+ role: entry.role,
58
+ content: entry.content || '',
59
+ name: entry.name || null,
60
+ tool_call_id: entry.tool_call_id || null,
61
+ tool_calls: entry.tool_calls ? JSON.stringify(entry.tool_calls) : null
62
+ });
63
+ }
64
+ });
65
+ insertMany(oldMemory);
66
+ console.log('[Nyxora Memory] Successfully migrated memory.json to SQLite database (Atomic Storage).');
67
+ // Rename old file to prevent re-migration issues and keep as backup
68
+ fs_1.default.renameSync(oldJsonPath, oldJsonPath + '.bak');
69
+ }
23
70
  }
24
71
  catch (error) {
25
- console.error('Failed to read memory file. Starting fresh.');
26
- this.memory = [];
72
+ console.error('[Nyxora Memory] Failed to migrate old memory.json:', error);
27
73
  }
28
74
  }
29
75
  }
30
- saveMemory() {
31
- try {
32
- fs_1.default.writeFileSync(this.logFilePath, JSON.stringify(this.memory, null, 2));
33
- }
34
- catch (error) {
35
- console.error('Failed to write memory file.');
36
- }
37
- }
38
76
  getHistory() {
39
- return [...this.memory];
77
+ const rows = this.db.prepare('SELECT role, content, name, tool_call_id, tool_calls FROM messages ORDER BY id ASC').all();
78
+ return rows.map((row) => {
79
+ const entry = {
80
+ role: row.role,
81
+ content: row.content,
82
+ };
83
+ if (row.name)
84
+ entry.name = row.name;
85
+ if (row.tool_call_id)
86
+ entry.tool_call_id = row.tool_call_id;
87
+ if (row.tool_calls)
88
+ entry.tool_calls = JSON.parse(row.tool_calls);
89
+ return entry;
90
+ });
40
91
  }
41
92
  addEntry(entry) {
42
- this.memory.push(entry);
43
- this.saveMemory();
93
+ const insert = this.db.prepare(`
94
+ INSERT INTO messages (role, content, name, tool_call_id, tool_calls)
95
+ VALUES (@role, @content, @name, @tool_call_id, @tool_calls)
96
+ `);
97
+ insert.run({
98
+ role: entry.role,
99
+ content: entry.content || '',
100
+ name: entry.name || null,
101
+ tool_call_id: entry.tool_call_id || null,
102
+ tool_calls: entry.tool_calls ? JSON.stringify(entry.tool_calls) : null
103
+ });
44
104
  }
45
105
  clear() {
46
- this.memory = [];
47
- this.saveMemory();
106
+ this.db.prepare('DELETE FROM messages').run();
48
107
  }
49
108
  }
50
109
  exports.Logger = Logger;
package/package.json CHANGED
@@ -1,16 +1,21 @@
1
1
  {
2
2
  "name": "nyxora",
3
- "version": "1.4.4",
3
+ "version": "1.4.6",
4
4
  "description": "",
5
5
  "main": "dist/gateway/cli.js",
6
6
  "files": [
7
7
  "dist",
8
8
  "dashboard/dist",
9
+ "assets",
9
10
  "user.md",
10
11
  "IDENTITY.md",
11
12
  "SECURITY.md",
12
13
  "README.md"
13
14
  ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/perasyudha/Nyxora.git"
18
+ },
14
19
  "bin": {
15
20
  "nyxora": "./dist/gateway/cli.js"
16
21
  },
@@ -27,6 +32,7 @@
27
32
  "type": "commonjs",
28
33
  "dependencies": {
29
34
  "@clack/prompts": "^1.4.0",
35
+ "better-sqlite3": "^12.10.0",
30
36
  "concurrently": "^9.2.1",
31
37
  "cors": "^2.8.6",
32
38
  "express": "^5.2.1",
@@ -38,11 +44,14 @@
38
44
  "yaml": "^2.9.0"
39
45
  },
40
46
  "devDependencies": {
47
+ "@types/better-sqlite3": "^7.6.13",
41
48
  "@types/cors": "^2.8.19",
42
49
  "@types/express": "^5.0.6",
43
50
  "@types/node": "^25.9.1",
44
51
  "@types/node-telegram-bot-api": "^0.64.14",
45
52
  "ts-node": "^10.9.2",
46
- "typescript": "^6.0.3"
53
+ "typescript": "^6.0.3",
54
+ "vitepress": "^1.6.4",
55
+ "vue": "^3.5.35"
47
56
  }
48
57
  }