nyxora 26.7.2 → 26.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +95 -47
- package/README.md +23 -19
- package/bin/nyxora.mjs +4 -6
- package/dist/launcher.js +44 -8
- package/dist/packages/core/src/agent/bridgeWatcher.js +3 -2
- package/dist/packages/core/src/agent/cronManager.js +2 -2
- package/dist/packages/core/src/agent/llmProvider.js +242 -0
- package/dist/packages/core/src/agent/nyxDaemon.js +97 -0
- package/dist/packages/core/src/agent/osAgent.js +203 -29
- package/dist/packages/core/src/agent/reasoning.js +353 -60
- package/dist/packages/core/src/agent/reasoningScratchpad.js +47 -0
- package/dist/packages/core/src/agent/transactionManager.js +36 -31
- package/dist/packages/core/src/agent/web3Agent.js +263 -37
- package/dist/packages/core/src/cognitive/cognitiveManager.js +63 -10
- package/dist/packages/core/src/config/parser.js +10 -4
- package/dist/packages/core/src/gateway/chat.js +56 -13
- package/dist/packages/core/src/gateway/cli.js +3 -0
- package/dist/packages/core/src/gateway/discordAdapter.js +81 -0
- package/dist/packages/core/src/gateway/server.js +58 -9
- package/dist/packages/core/src/gateway/setup-ml.js +64 -0
- package/dist/packages/core/src/gateway/setup.js +39 -3
- package/dist/packages/core/src/gateway/telegram.js +120 -24
- package/dist/packages/core/src/memory/episodic.js +47 -3
- package/dist/packages/core/src/memory/logger.js +120 -2
- package/dist/packages/core/src/memory/promotionEngine.js +18 -5
- package/dist/packages/core/src/system/agentskills.js +10 -0
- package/dist/packages/core/src/system/plugins/GoogleWorkspacePlugin.js +1 -1
- package/dist/packages/core/src/system/plugins/SystemCorePlugin.js +1 -1
- package/dist/packages/core/src/system/plugins/SystemExternalPlugin.js +1 -1
- package/dist/packages/core/src/system/plugins/SystemPluginInstallerPlugin.js +1 -1
- package/dist/packages/core/src/system/plugins/SystemSocialPlugin.js +1 -1
- package/dist/packages/core/src/system/plugins/SystemWebPlugin.js +1 -1
- package/dist/packages/core/src/system/plugins/SystemWorkspacePlugin.js +3 -3
- package/dist/packages/core/src/system/plugins/createSkill.js +1 -1
- package/dist/packages/core/src/system/skillExtractor.js +16 -5
- package/dist/packages/core/src/system/skills/forgetMemory.js +6 -4
- package/dist/packages/core/src/system/skills/scheduleTask.js +7 -2
- package/dist/packages/core/src/test_mainnet.js +45 -0
- package/dist/packages/core/src/utils/contextSummarizer.js +82 -0
- package/dist/packages/core/src/utils/skillManager.js +1 -1
- package/dist/packages/core/src/utils/streamSimulator.js +85 -0
- package/dist/packages/core/src/web3/aggregator/providers/ArbitrumBridgeProvider.js +28 -11
- package/dist/packages/core/src/web3/aggregator/providers/OpBridgeProvider.js +41 -27
- package/dist/packages/core/src/web3/aggregator/providers/TestnetSwapProvider.js +65 -0
- package/dist/packages/core/src/web3/aggregator/routeSelector.js +7 -1
- package/dist/packages/core/src/web3/plugins/Web3DefiPlugin.js +1 -1
- package/dist/packages/core/src/web3/plugins/Web3MarketPlugin.js +5 -125
- package/dist/packages/core/src/web3/plugins/Web3SecurityPlugin.js +1 -1
- package/dist/packages/core/src/web3/plugins/Web3WalletPlugin.js +1 -1
- package/dist/packages/core/src/web3/skills/bridgeToken.js +19 -4
- package/dist/packages/core/src/web3/skills/checkAddress.js +2 -0
- package/dist/packages/core/src/web3/skills/checkPortfolio.js +22 -2
- package/dist/packages/core/src/web3/skills/checkSecurity.js +2 -0
- package/dist/packages/core/src/web3/skills/confirmPendingTx.js +1 -1
- package/dist/packages/core/src/web3/skills/createLimitOrder.js +15 -1
- package/dist/packages/core/src/web3/skills/customTx.js +3 -0
- package/dist/packages/core/src/web3/skills/defiLending.js +2 -0
- package/dist/packages/core/src/web3/skills/getBalance.js +2 -0
- package/dist/packages/core/src/web3/skills/getPrice.js +134 -27
- package/dist/packages/core/src/web3/skills/getTxHistory.js +2 -0
- package/dist/packages/core/src/web3/skills/marketAnalysis.js +28 -191
- package/dist/packages/core/src/web3/skills/mintNft.js +3 -0
- package/dist/packages/core/src/web3/skills/provideLiquidity.js +16 -12
- package/dist/packages/core/src/web3/skills/revokeApprovals.js +2 -0
- package/dist/packages/core/src/web3/skills/swapToken.js +20 -2
- package/dist/packages/core/src/web3/skills/transfer.js +2 -0
- package/dist/packages/core/src/web3/skills/yieldVault.js +2 -0
- package/dist/packages/core/src/web3/utils/chains.js +19 -0
- package/dist/packages/core/src/web3/utils/marketEngine.js +26 -33
- package/dist/packages/signer/src/NyxoraSigner.js +181 -0
- package/dist/packages/signer/src/index.js +17 -0
- package/dist/packages/signer/src/server.js +25 -161
- package/launcher.ts +38 -9
- package/package.json +6 -2
- package/packages/core/package.json +21 -10
- package/packages/core/src/agent/bridgeWatcher.ts +3 -2
- package/packages/core/src/agent/cronManager.ts +2 -2
- package/packages/core/src/agent/llmProvider.ts +219 -0
- package/packages/core/src/agent/nyxDaemon.ts +104 -0
- package/packages/core/src/agent/osAgent.ts +230 -32
- package/packages/core/src/agent/reasoning.ts +376 -64
- package/packages/core/src/agent/reasoningScratchpad.ts +45 -0
- package/packages/core/src/agent/transactionManager.ts +36 -28
- package/packages/core/src/agent/web3Agent.ts +291 -40
- package/packages/core/src/cognitive/cognitiveManager.ts +65 -10
- package/packages/core/src/cognitive/prompts/web3/market-analysis.md +24 -0
- package/packages/core/src/cognitive/prompts/web3/portfolio-review.md +29 -0
- package/packages/core/src/cognitive/prompts/web3/risk-assessment.md +28 -0
- package/packages/core/src/cognitive/prompts/web3/trade-planning.md +30 -0
- package/packages/core/src/config/parser.ts +15 -4
- package/packages/core/src/gateway/chat.ts +57 -15
- package/packages/core/src/gateway/cli.ts +4 -0
- package/packages/core/src/gateway/discordAdapter.ts +87 -0
- package/packages/core/src/gateway/server.ts +66 -10
- package/packages/core/src/gateway/setup-ml.ts +68 -0
- package/packages/core/src/gateway/setup.ts +41 -3
- package/packages/core/src/gateway/telegram.ts +138 -27
- package/packages/core/src/memory/episodic.ts +64 -3
- package/packages/core/src/memory/logger.ts +142 -2
- package/packages/core/src/memory/promotionEngine.ts +19 -5
- package/packages/core/src/system/agentskills.ts +10 -0
- package/packages/core/src/system/plugins/GoogleWorkspacePlugin.ts +1 -1
- package/packages/core/src/system/plugins/SystemCorePlugin.ts +1 -1
- package/packages/core/src/system/plugins/SystemExternalPlugin.ts +1 -1
- package/packages/core/src/system/plugins/SystemPluginInstallerPlugin.ts +1 -1
- package/packages/core/src/system/plugins/SystemSocialPlugin.ts +1 -1
- package/packages/core/src/system/plugins/SystemWebPlugin.ts +1 -1
- package/packages/core/src/system/plugins/SystemWorkspacePlugin.ts +3 -3
- package/packages/core/src/system/plugins/createSkill.ts +1 -1
- package/packages/core/src/system/skillExtractor.ts +16 -5
- package/packages/core/src/system/skills/forgetMemory.ts +7 -4
- package/packages/core/src/system/skills/scheduleTask.ts +7 -2
- package/packages/core/src/utils/contextSummarizer.ts +100 -0
- package/packages/core/src/utils/skillManager.ts +1 -1
- package/packages/core/src/utils/streamSimulator.ts +88 -0
- package/packages/core/src/web3/aggregator/providers/ArbitrumBridgeProvider.ts +30 -11
- package/packages/core/src/web3/aggregator/providers/OpBridgeProvider.ts +43 -29
- package/packages/core/src/web3/aggregator/routeSelector.ts +6 -1
- package/packages/core/src/web3/plugins/Web3DefiPlugin.ts +1 -1
- package/packages/core/src/web3/plugins/Web3MarketPlugin.ts +6 -125
- package/packages/core/src/web3/plugins/Web3SecurityPlugin.ts +1 -1
- package/packages/core/src/web3/plugins/Web3WalletPlugin.ts +1 -1
- package/packages/core/src/web3/skills/bridgeToken.ts +21 -7
- package/packages/core/src/web3/skills/checkAddress.ts +2 -0
- package/packages/core/src/web3/skills/checkPortfolio.ts +23 -2
- package/packages/core/src/web3/skills/checkSecurity.ts +2 -0
- package/packages/core/src/web3/skills/confirmPendingTx.ts +1 -1
- package/packages/core/src/web3/skills/createLimitOrder.ts +17 -2
- package/packages/core/src/web3/skills/customTx.ts +3 -0
- package/packages/core/src/web3/skills/defiLending.ts +2 -0
- package/packages/core/src/web3/skills/getBalance.ts +2 -0
- package/packages/core/src/web3/skills/getPrice.ts +134 -30
- package/packages/core/src/web3/skills/getTxHistory.ts +2 -0
- package/packages/core/src/web3/skills/marketAnalysis.ts +45 -188
- package/packages/core/src/web3/skills/mintNft.ts +3 -0
- package/packages/core/src/web3/skills/provideLiquidity.ts +16 -10
- package/packages/core/src/web3/skills/revokeApprovals.ts +2 -0
- package/packages/core/src/web3/skills/swapToken.ts +20 -3
- package/packages/core/src/web3/skills/transfer.ts +2 -0
- package/packages/core/src/web3/skills/yieldVault.ts +2 -0
- package/packages/core/src/web3/utils/chains.ts +12 -0
- package/packages/core/src/web3/utils/marketEngine.ts +27 -33
- package/packages/dashboard/dist/assets/index-BTfp141V.js +18 -0
- package/packages/dashboard/dist/assets/index-DK2sTU47.css +1 -0
- package/packages/dashboard/dist/index.html +2 -2
- package/packages/dashboard/package.json +10 -10
- package/packages/mcp-server/dist/server.js +5 -1
- package/packages/mcp-server/package.json +6 -6
- package/packages/mcp-server/src/server.ts +11 -7
- package/packages/policy/package.json +3 -3
- package/packages/signer/package.json +16 -6
- package/packages/signer/src/NyxoraSigner.ts +161 -0
- package/packages/signer/src/index.ts +1 -0
- package/packages/signer/src/server.ts +25 -135
- package/dist/packages/core/src/agent/honchoDaemon.js +0 -91
- package/dist/packages/core/src/cognitive/prompts/autonomous/binance-trading-integration.md +0 -54
- package/dist/packages/core/src/gateway/test.js +0 -15
- package/dist/packages/core/src/web3/Web3DefiPlugin.js +0 -28
- package/dist/packages/core/src/web3/aggregator/aggregatorMainnet.js +0 -260
- package/dist/packages/core/src/web3/aggregator/aggregatorTestnet.js +0 -119
- package/dist/packages/core/src/web3/skills/nativeOpBridge.js +0 -71
- package/packages/core/src/agent/honchoDaemon.ts +0 -96
- package/packages/core/src/cognitive/prompts/autonomous/binance-trading-integration.md +0 -41
- package/packages/core/src/plugin/registry.test.ts +0 -46
- package/packages/core/src/utils/formatter.test.ts +0 -41
- package/packages/dashboard/dist/assets/index-CSoNa5cx.css +0 -1
- package/packages/dashboard/dist/assets/index-DbRWEoSr.js +0 -16
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { loadConfig } from '../config/parser';
|
|
2
|
-
import { executeWithRetry } from '../utils/llmUtils';
|
|
3
|
-
import { episodicDB } from '../memory/episodic';
|
|
4
|
-
import { logger } from './reasoning';
|
|
5
|
-
import pc from 'picocolors';
|
|
6
|
-
|
|
7
|
-
export class HonchoDaemon {
|
|
8
|
-
private isRunning: boolean = false;
|
|
9
|
-
private intervalId: NodeJS.Timeout | null = null;
|
|
10
|
-
private readonly INTERVAL_MS = 60 * 60 * 1000; // Run every hour
|
|
11
|
-
|
|
12
|
-
public start() {
|
|
13
|
-
if (this.isRunning) return;
|
|
14
|
-
this.isRunning = true;
|
|
15
|
-
|
|
16
|
-
// Initial run after 5 minutes
|
|
17
|
-
setTimeout(() => this.runAnalysis(), 5 * 60 * 1000);
|
|
18
|
-
|
|
19
|
-
// Scheduled runs
|
|
20
|
-
this.intervalId = setInterval(() => {
|
|
21
|
-
this.runAnalysis();
|
|
22
|
-
}, this.INTERVAL_MS);
|
|
23
|
-
|
|
24
|
-
console.log(pc.magenta('[Honcho] Dialectic User Modeling daemon started.'));
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public stop() {
|
|
28
|
-
if (this.intervalId) {
|
|
29
|
-
clearInterval(this.intervalId);
|
|
30
|
-
}
|
|
31
|
-
this.isRunning = false;
|
|
32
|
-
console.log(pc.magenta('[Honcho] Daemon stopped.'));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public async runAnalysis() {
|
|
36
|
-
console.log(pc.magenta('[Honcho] Running dialectic user modeling...'));
|
|
37
|
-
|
|
38
|
-
const sessions = logger.getSessions();
|
|
39
|
-
if (sessions.length === 0) return;
|
|
40
|
-
|
|
41
|
-
const allHistory = logger.getHistory(undefined, 100); // Get recent 100 messages
|
|
42
|
-
if (allHistory.length < 5) return; // Not enough context
|
|
43
|
-
|
|
44
|
-
const config = loadConfig();
|
|
45
|
-
|
|
46
|
-
const prompt = `You are Honcho, Nyxora's background Persona Auditor.
|
|
47
|
-
Your task is to analyze the user's recent chat history and extract long-term persona traits, preferences, or behavioral rules.
|
|
48
|
-
Focus ONLY on facts about the user. (e.g. "User prefers high-risk trades", "User is a developer", "User wants concise answers", "User hates memecoins").
|
|
49
|
-
|
|
50
|
-
Output your findings as a strict JSON array of strings. If nothing new is found, return [].
|
|
51
|
-
Example: ["User avoids Ethereum mainnet due to gas", "User prefers dark mode"]
|
|
52
|
-
|
|
53
|
-
Chat History:
|
|
54
|
-
${allHistory.map((m: any) => `[${m.role}] ${m.content}`).join('\n')}
|
|
55
|
-
`;
|
|
56
|
-
|
|
57
|
-
try {
|
|
58
|
-
const response = await executeWithRetry(async (client) => {
|
|
59
|
-
return await client.chat({
|
|
60
|
-
model: config.llm.model,
|
|
61
|
-
messages: [{ role: 'system', content: prompt }],
|
|
62
|
-
temperature: 0.1
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
let content = response.message.content || '[]';
|
|
67
|
-
|
|
68
|
-
// Clean markdown if any
|
|
69
|
-
content = content.replace(/\`\`\`json/g, '').replace(/\`\`\`/g, '').trim();
|
|
70
|
-
|
|
71
|
-
let traits: string[] = [];
|
|
72
|
-
try {
|
|
73
|
-
const parsed = JSON.parse(content);
|
|
74
|
-
if (Array.isArray(parsed)) {
|
|
75
|
-
traits = parsed;
|
|
76
|
-
} else if (parsed.traits && Array.isArray(parsed.traits)) {
|
|
77
|
-
traits = parsed.traits;
|
|
78
|
-
}
|
|
79
|
-
} catch (e) {
|
|
80
|
-
console.error(pc.red('[Honcho] Failed to parse JSON traits'), content);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (traits.length > 0) {
|
|
84
|
-
traits.forEach(trait => {
|
|
85
|
-
episodicDB.updatePersonaTrait(trait, 0.8, 'honcho');
|
|
86
|
-
console.log(pc.magenta(`[Honcho] Discovered new trait: ${trait}`));
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
} catch (e: any) {
|
|
91
|
-
console.error(pc.red(`[Honcho] Analysis failed: ${e.message}`));
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export const honchoDaemon = new HonchoDaemon();
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Binance Trading Integration SOP
|
|
2
|
-
|
|
3
|
-
## Tujuan
|
|
4
|
-
Menjalankan integrasi Binance Spot dengan aman lewat custom skill `binance_trading`.
|
|
5
|
-
|
|
6
|
-
## Prinsip Keamanan
|
|
7
|
-
1. Jangan pernah meminta user mengirim API secret di chat.
|
|
8
|
-
2. API key/secret harus dibaca dari environment variable lokal.
|
|
9
|
-
3. Withdrawal tidak didukung.
|
|
10
|
-
4. Default live trading harus off kecuali `BINANCE_ENABLE_LIVE_TRADING=true`.
|
|
11
|
-
5. Gunakan whitelist pair `BINANCE_ALLOWED_SYMBOLS` jika user membatasi pair.
|
|
12
|
-
6. Gunakan `BINANCE_MAX_ORDER_QUOTE` untuk membatasi nominal order.
|
|
13
|
-
7. Untuk order baru, dahulukan dry-run jika user belum eksplisit meminta live order.
|
|
14
|
-
|
|
15
|
-
## Env yang Dipakai
|
|
16
|
-
- `BINANCE_BASE_URL`, default `https://api.binance.com`
|
|
17
|
-
- `BINANCE_API_KEY`
|
|
18
|
-
- `BINANCE_API_SECRET`
|
|
19
|
-
- `BINANCE_ENABLE_LIVE_TRADING`
|
|
20
|
-
- `BINANCE_ALLOWED_SYMBOLS`
|
|
21
|
-
- `BINANCE_MAX_ORDER_QUOTE`
|
|
22
|
-
|
|
23
|
-
## Action Skill
|
|
24
|
-
- `ping`
|
|
25
|
-
- `ticker`
|
|
26
|
-
- `account`
|
|
27
|
-
- `balances`
|
|
28
|
-
- `open_orders`
|
|
29
|
-
- `create_order`
|
|
30
|
-
- `cancel_order`
|
|
31
|
-
|
|
32
|
-
## Alur Aman
|
|
33
|
-
1. Cek `ping`.
|
|
34
|
-
2. Cek `ticker` untuk symbol.
|
|
35
|
-
3. Jika perlu private endpoint, pastikan env API key/secret sudah diset.
|
|
36
|
-
4. Cek `balances` sebelum order.
|
|
37
|
-
5. Buat order dry-run untuk validasi size/symbol.
|
|
38
|
-
6. Live order hanya saat env live trading aktif dan user instruksi jelas.
|
|
39
|
-
|
|
40
|
-
## Format Jawaban
|
|
41
|
-
Balas dalam bahasa Indonesia. Ringkas, sebutkan action, hasil, dan langkah berikutnya.
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll } from 'vitest';
|
|
2
|
-
import { pluginManager, initializePlugins } from './registry';
|
|
3
|
-
|
|
4
|
-
describe('Skill Schema Validation', () => {
|
|
5
|
-
beforeAll(async () => {
|
|
6
|
-
await initializePlugins();
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
it('should load plugins successfully', () => {
|
|
10
|
-
const plugins = pluginManager.getPlugins();
|
|
11
|
-
expect(plugins.length).toBeGreaterThan(0);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('all skill schemas must be strictly valid', () => {
|
|
15
|
-
const plugins = pluginManager.getPlugins();
|
|
16
|
-
let totalSkills = 0;
|
|
17
|
-
|
|
18
|
-
for (const plugin of plugins) {
|
|
19
|
-
for (const tool of plugin.tools) {
|
|
20
|
-
totalSkills++;
|
|
21
|
-
|
|
22
|
-
// Ensure it's a function tool
|
|
23
|
-
expect(tool.type).toBe('function');
|
|
24
|
-
expect(tool.function).toBeDefined();
|
|
25
|
-
|
|
26
|
-
// Basic properties
|
|
27
|
-
expect(tool.function.name).toBeTruthy();
|
|
28
|
-
expect(typeof tool.function.name).toBe('string');
|
|
29
|
-
|
|
30
|
-
expect(tool.function.description).toBeTruthy();
|
|
31
|
-
expect(typeof tool.function.description).toBe('string');
|
|
32
|
-
|
|
33
|
-
// Parameters block
|
|
34
|
-
expect(tool.function.parameters).toBeDefined();
|
|
35
|
-
expect(tool.function.parameters.type).toBe('object');
|
|
36
|
-
|
|
37
|
-
// It should have properties or be an empty object
|
|
38
|
-
if (tool.function.parameters.properties) {
|
|
39
|
-
expect(typeof tool.function.parameters.properties).toBe('object');
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
console.log(`Validated ${totalSkills} skills across ${plugins.length} plugins.`);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { formatTransactionSuccess, formatTransactionError } from './formatter';
|
|
3
|
-
import { PendingTransaction } from '../agent/transactionManager';
|
|
4
|
-
|
|
5
|
-
describe('Formatter Utilities', () => {
|
|
6
|
-
it('should format transaction success correctly for swap', () => {
|
|
7
|
-
const tx: PendingTransaction = {
|
|
8
|
-
id: 'test-1',
|
|
9
|
-
type: 'swap',
|
|
10
|
-
chainName: 'ethereum',
|
|
11
|
-
status: 'pending',
|
|
12
|
-
nonce: "0",
|
|
13
|
-
details: {
|
|
14
|
-
fromToken: 'eth',
|
|
15
|
-
toToken: 'usdc',
|
|
16
|
-
amountStr: '1'
|
|
17
|
-
},
|
|
18
|
-
createdAt: Date.now()
|
|
19
|
-
};
|
|
20
|
-
const rawResult = '{"txHash":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"}';
|
|
21
|
-
const output = formatTransactionSuccess(tx, rawResult);
|
|
22
|
-
expect(output).toContain('Network:** Ethereum');
|
|
23
|
-
expect(output).toContain('Action:** Swapped 1 ETH to USDC');
|
|
24
|
-
expect(output).toContain('Tx Hash:** `0x1234...cdef`');
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should format transaction error correctly', () => {
|
|
28
|
-
const tx: PendingTransaction = {
|
|
29
|
-
id: 'test-2',
|
|
30
|
-
type: 'bridge',
|
|
31
|
-
chainName: 'base_sepolia',
|
|
32
|
-
status: 'failed',
|
|
33
|
-
nonce: "0",
|
|
34
|
-
details: {},
|
|
35
|
-
createdAt: Date.now()
|
|
36
|
-
};
|
|
37
|
-
const output = formatTransactionError(tx, 'Insufficient funds');
|
|
38
|
-
expect(output).toContain('Transaction Failed (Base Sepolia)');
|
|
39
|
-
expect(output).toContain('Error: Insufficient funds');
|
|
40
|
-
});
|
|
41
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--bg-color:#3b4252;--bg-secondary:#434c5e;--bg-sidebar:#2e3440;--text-primary:#eceff4;--text-secondary:#d8dee9;--accent:#88c0d0;--accent-hover:#81a1c1;--glass-bg:#2e3440b3;--glass-border:#d8dee91a;--chat-user:#88c0d0;--chat-user-text:#2e3440;--chat-agent:#2e3440;--tool-bg:#4c566a;--success:#a3be8c;--danger:#bf616a;--terminal-bg:#1e222a;--btn-primary-bg:#81a1c1}body.light-theme{--bg-color:#fdfbf6;--bg-secondary:#f4f1e1;--bg-sidebar:#fdfbf6;--text-primary:#1a2b2b;--text-secondary:#5c6b6b;--accent:#8a9a86;--accent-hover:#72826e;--glass-bg:#fdfbf6cc;--glass-border:#1a2b2b14;--chat-user:#eef0e5;--chat-user-text:#1a2b2b;--chat-agent:#fff;--tool-bg:#f4f1e1;--success:#6b8e23;--danger:#cd5c5c;--terminal-bg:#eef0e5;--nav-text:var(--text-secondary);--nav-section:var(--text-secondary);--btn-primary-bg:var(--text-secondary)}*{box-sizing:border-box;margin:0;padding:0}body{background-color:var(--bg-color);color:var(--text-primary);height:100vh;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;overflow:hidden}.settings-menu-item{cursor:pointer;color:var(--text-secondary);border-radius:6px;align-items:center;gap:12px;margin-bottom:4px;padding:8px 12px;font-size:.9rem;transition:all .2s;display:flex}.settings-menu-item:hover{color:var(--text-primary);background:#ffffff0d}.settings-menu-item.active{background:var(--accent);color:var(--bg-secondary);font-weight:500}.settings-menu-item.active svg{color:var(--bg-secondary)}.settings-scroll-container::-webkit-scrollbar{width:6px}.settings-scroll-container::-webkit-scrollbar-track{background:0 0}.settings-scroll-container::-webkit-scrollbar-thumb{background:#ffffff1a;border-radius:10px}#root{width:100vw;height:100vh;display:flex}.sidebar{background-color:var(--bg-sidebar);border-right:1px solid var(--glass-border);z-index:100;flex-direction:column;width:280px;display:flex;overflow-x:hidden}.agent-identity-card{background:linear-gradient(#3b82f60d 0%,#0000 100%);border-bottom:1px solid #ffffff0d;align-items:center;gap:16px;margin-bottom:8px;padding:24px;display:flex}.agent-avatar{justify-content:center;align-items:center;display:flex}.agent-info{flex-direction:column;gap:4px;display:flex}.agent-name{color:var(--text-primary);letter-spacing:-.025em;font-size:1.1rem;font-weight:700}.agent-status{color:#4ade80;letter-spacing:.05em;align-items:center;gap:6px;font-size:.75rem;font-weight:600;display:flex}.status-dot{background-color:#4ade80;border-radius:50%;width:8px;height:8px;animation:2s infinite pulse-green;box-shadow:0 0 8px #4ade80}@keyframes pulse-green{0%{transform:scale(.95);box-shadow:0 0 #4ade80b3}70%{transform:scale(1);box-shadow:0 0 0 6px #4ade8000}to{transform:scale(.95);box-shadow:0 0 #4ade8000}}.sidebar-scroll-area{flex:1;padding-bottom:24px;overflow:hidden auto}.sidebar-scroll-area::-webkit-scrollbar{width:4px}.sidebar-scroll-area::-webkit-scrollbar-thumb{background:#ffffff0d}body.light-theme .sidebar-scroll-area::-webkit-scrollbar-thumb{background:#00000026}.sidebar-section{color:var(--nav-section,#8b9bb4);padding:24px 24px 8px;font-size:.75rem;font-weight:500}.sidebar-nav{flex-direction:column;gap:4px;padding:0 16px;display:flex}.nav-item{color:var(--nav-text,#94a3b8);cursor:pointer;border:1px solid #0000;border-radius:8px;align-items:center;gap:10px;padding:8px 12px;font-size:.8rem;font-weight:500;transition:all .25s cubic-bezier(.4,0,.2,1);display:flex}.nav-icon{transition:transform .25s cubic-bezier(.4,0,.2,1)}.nav-item:hover{color:var(--text-primary);background-color:#ffffff08;transform:translate(4px)}.nav-item:hover .nav-icon{color:var(--text-primary);transform:scale(1.1)}.sessions-list{flex:none!important;justify-content:flex-start!important;gap:0!important;height:max-content!important}.session-item{justify-content:space-between;flex:none!important;height:max-content!important;min-height:28px!important;margin-top:0!important;margin-bottom:2px!important;padding:4px 10px!important}.delete-session-btn{color:#bf616a;cursor:pointer;opacity:0;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:4px;transition:opacity .2s,transform .2s;display:flex}.delete-session-btn:hover{background:#bf616a33;transform:scale(1.1)}.session-item:hover .delete-session-btn{opacity:1}.nav-item.active{color:var(--text-primary);border-left:3px solid var(--accent);background:linear-gradient(90deg,#3b82f626 0%,#0000 100%);border-radius:4px 12px 12px 4px;font-weight:600}.nav-item.active .nav-icon{color:var(--accent)}.main-content{background-image:radial-gradient(at 0 0,#3b82f61a 0,#0000 50%),radial-gradient(at 100% 100%,#8b5cf61a 0,#0000 50%);flex-direction:column;flex:1;max-width:100vw;display:flex;overflow-x:hidden}.topbar{border-bottom:1px solid var(--glass-border);background:var(--bg-color);justify-content:space-between;align-items:center;height:64px;padding:0 24px;display:flex}.topbar-left{color:var(--text-secondary);align-items:center;gap:16px;font-size:.95rem;font-weight:500;display:flex}.topbar-right{align-items:center;gap:12px;display:flex}.custom-network-selector{position:relative}.network-selector-pill{background-color:var(--accent);color:#000;cursor:pointer;border:none;border-radius:9999px;outline:none;align-items:center;gap:8px;padding:8px 16px;font-family:inherit;font-size:.85rem;font-weight:600;transition:all .2s;display:flex}.network-selector-pill:hover{opacity:.9;box-shadow:0 0 10px #88c0d066}.network-selector-pill:focus-visible{box-shadow:0 0 0 2px #88c0d080}.network-icon{flex-shrink:0}.network-chevron{opacity:.7;margin-left:4px}.network-dropdown-menu{background:var(--bg-secondary);border:1px solid var(--glass-border);z-index:100;border-radius:12px;min-width:180px;margin:0;padding:6px;list-style:none;animation:.2s ease-out dropdownSlideIn;position:absolute;top:calc(100% + 8px);right:0;box-shadow:0 12px 32px #00000080}@keyframes dropdownSlideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.network-dropdown-item{cursor:pointer;color:var(--text-primary);border-radius:8px;padding:10px 14px;font-size:.85rem;transition:background .1s}.network-dropdown-item:hover{background:var(--glass-border)}.network-dropdown-item.active{background:var(--bg-hover);color:var(--accent);font-weight:600}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.workspace-container{width:100%;height:calc(100vh - 64px);display:flex}.chat-wrapper{flex-direction:column;height:100%;padding:24px 0;display:flex}.chat-wrapper.empty-state-wrapper{justify-content:center;padding-bottom:10vh}.resizer{background:var(--glass-border);cursor:col-resize;z-index:10;width:6px;transition:background .2s}.resizer:hover,.resizer:active{background:var(--accent)}.canvas-panel{background:var(--bg-sidebar);background-image:radial-gradient(#3b82f60d 0,#0000 80%);flex-direction:column;flex:1;padding:32px;display:flex;position:relative;overflow-y:auto}.canvas-panel::-webkit-scrollbar{width:6px}.canvas-panel::-webkit-scrollbar-thumb{background:#ffffff1a;border-radius:4px}body.light-theme .canvas-panel::-webkit-scrollbar-thumb{background:#00000026}.canvas-header{border-bottom:1px solid #ffffff0d;justify-content:space-between;align-items:center;margin-bottom:32px;padding-bottom:16px;display:flex}.canvas-title{color:#94a3b8;text-transform:uppercase;letter-spacing:.05em;align-items:center;gap:8px;font-family:monospace;font-size:.85rem;display:flex}.canvas-empty{color:#475569;flex-direction:column;justify-content:center;align-items:center;gap:16px;height:100%;display:flex}.empty-state-title{color:#fff}body.light-theme .empty-state-title{background:linear-gradient(135deg,#1e293b 0%,#475569 100%);-webkit-text-fill-color:transparent;-webkit-background-clip:text}.chat-container{flex-direction:column;flex:1;gap:20px;padding:0 24px;display:flex;overflow-y:auto}.chat-container::-webkit-scrollbar{width:6px}.chat-container::-webkit-scrollbar-thumb{background:#ffffff1a;border-radius:4px}.styled-scroll{scroll-behavior:smooth;-webkit-overflow-scrolling:touch;will-change:scroll-position}.styled-scroll::-webkit-scrollbar{width:6px}.styled-scroll::-webkit-scrollbar-track{background:0 0}.styled-scroll::-webkit-scrollbar-thumb{background:#fff3;border-radius:4px}.styled-scroll::-webkit-scrollbar-thumb:hover{background:#fff6}body.light-theme .chat-container::-webkit-scrollbar-thumb{background:#00000026}body.light-theme .styled-scroll::-webkit-scrollbar-thumb{background:#0003}body.light-theme .styled-scroll::-webkit-scrollbar-thumb:hover{background:#00000059}.message-wrapper{flex-direction:column;max-width:95%;animation:.3s ease-out forwards fadeIn;display:flex}.message-wrapper.agent{flex-direction:row;align-self:flex-start;align-items:flex-end;gap:8px}.message-wrapper.user{flex-direction:row-reverse;align-self:flex-end;align-items:flex-end;gap:8px}.copy-btn{color:var(--text-secondary);cursor:pointer;opacity:0;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:6px;transition:opacity .2s,background .2s;display:flex}.copy-btn:hover{background:var(--bg-secondary);color:var(--text-primary)}.message-wrapper:hover .copy-btn{opacity:1}.message-bubble{white-space:pre-wrap;word-break:break-word;overflow-wrap:break-word;border-radius:18px;padding:14px 18px;font-size:.95rem;line-height:1.6;box-shadow:0 4px 6px -1px #0000001a}.user .message-bubble{background-color:var(--chat-user);color:var(--chat-user-text);border-bottom-right-radius:4px}.agent .message-bubble{background-color:var(--chat-agent);border:1px solid var(--glass-border);color:var(--text-primary);border-bottom-left-radius:4px}.tool-call{color:var(--text-secondary);background:var(--tool-bg);border:1px solid var(--glass-border);border-radius:12px;align-items:center;gap:8px;margin-top:10px;padding:10px 14px;font-size:.85rem;display:flex}.tool-call code{color:var(--accent);font-family:monospace}.input-area{padding:20px 24px 0}.input-form{background:var(--bg-secondary);border:1px solid var(--glass-border);border-radius:9999px;gap:8px;width:100%;max-width:900px;margin:0 auto;padding:6px 10px;transition:all .2s;display:flex;box-shadow:0 4px 15px #0000001a}.input-form:focus-within{border-color:var(--accent);box-shadow:0 0 0 2px #3b82f633}.chat-input{color:var(--text-primary);background:0 0;border:none;outline:none;flex:1;padding:8px 12px;font-family:inherit;font-size:.95rem}.send-button{background:var(--accent);color:var(--text-primary);cursor:pointer;border:none;border-radius:50%;justify-content:center;align-items:center;width:36px;height:36px;transition:all .2s;display:flex}.voice-button{background:var(--bg-secondary);color:var(--text-secondary);border:1px solid var(--glass-border);cursor:pointer;border-radius:50%;justify-content:center;align-items:center;width:36px;height:36px;transition:all .2s;display:flex}.voice-button:hover{color:var(--text-primary);border-color:#ef4444}.action-menu-container{background:0 0;border-radius:9999px;align-items:center;margin-right:8px;padding:0;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;position:relative;overflow:hidden}.action-menu-container:hover{background:var(--bg-secondary)}.action-menu-items{opacity:0;pointer-events:none;align-items:center;gap:4px;width:0;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;transform:translate(-10px)}.action-menu-container:hover .action-menu-items{opacity:1;pointer-events:auto;width:76px;margin-left:4px;margin-right:4px;transform:translate(0)}.plus-button{z-index:2;background:0 0;border:none;transition:transform .3s}.action-menu-container:hover .plus-button{color:var(--accent);transform:rotate(45deg)}.action-menu-items .voice-button{background:0 0;border:none;width:32px;height:32px}.action-menu-items .voice-button:hover{background:#ffffff1a;border-color:#0000}.voice-button.listening{color:#ef4444;background:#ef444433;border-color:#ef4444;animation:1.5s infinite pulse-red}.voice-button.active-mode{color:#3b82f6;border-color:#3b82f6}.voice-button.speaking{color:#3b82f6;background:#3b82f633;border-color:#3b82f6;animation:1.5s infinite pulse-blue}@keyframes pulse-red{0%{box-shadow:0 0 #ef444466}70%{box-shadow:0 0 0 10px #ef444400}to{box-shadow:0 0 #ef444400}}@keyframes pulse-blue{0%{box-shadow:0 0 #3b82f666}70%{box-shadow:0 0 0 10px #3b82f600}to{box-shadow:0 0 #3b82f600}}.send-button:hover:not(:disabled){background:var(--accent-hover);transform:scale(1.05)}.send-button:disabled{opacity:.5;cursor:not-allowed}.typing-indicator{background-color:var(--chat-agent);border:1px solid var(--glass-border);border-radius:18px 18px 18px 4px;align-self:flex-start;gap:4px;width:fit-content;padding:14px 18px;display:flex}.dot{background:var(--text-secondary);border-radius:50%;width:6px;height:6px;animation:1.4s ease-in-out infinite both bounce}.dot:first-child{animation-delay:-.32s}.dot:nth-child(2){animation-delay:-.16s}@keyframes bounce{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.prompt-suggestions{gap:12px;margin-bottom:12px;display:flex;overflow-x:auto}.prompt-suggestions button{background:var(--bg-secondary);color:var(--text-secondary);border:1px solid var(--glass-border);cursor:pointer;white-space:nowrap;border-radius:20px;padding:8px 16px;font-size:.85rem;transition:all .2s}.prompt-suggestions button:hover{border-color:var(--accent);color:var(--text-primary)}.trending-tokens{color:var(--text-secondary);justify-content:center;align-items:center;gap:12px;margin-top:12px;font-size:.8rem;display:flex}.token-tag{background:var(--accent);color:var(--bg-color);cursor:pointer;border-radius:12px;padding:4px 10px;font-weight:600;transition:transform .2s,filter .2s}.token-tag:hover{filter:brightness(1.2);transform:translateY(-2px)}.nord-label{color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px;font-size:.75rem;font-weight:700;display:block}.nord-pill-input{background-color:var(--glass-bg);border:1px solid var(--glass-border);width:100%;color:var(--accent);border-radius:9999px;outline:none;padding:10px 20px;font-size:.9rem;font-weight:600;transition:all .2s}.nord-pill-input:focus{border-color:var(--accent);box-shadow:0 0 10px var(--accent)}.nord-pill-input::placeholder{color:var(--text-secondary);opacity:.7}.nord-input{background-color:var(--bg-sidebar);border:1px solid var(--glass-border);width:100%;color:var(--text-primary);border-radius:6px;outline:none;padding:10px 14px;font-size:.9rem;transition:all .2s}.nord-input:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent)}.nord-input::placeholder{color:var(--text-secondary);opacity:.7}.nord-slider{appearance:none;background:var(--tool-bg);border-radius:3px;outline:none;width:100%;height:6px;margin-top:10px}.nord-slider::-webkit-slider-thumb{appearance:none;background:var(--text-primary);cursor:pointer;border:2px solid var(--accent);border-radius:50%;width:18px;height:18px;transition:all .2s}.nord-slider::-webkit-slider-thumb:hover{background:#fff;transform:scale(1.1)}.nord-slider::-moz-range-thumb{background:var(--text-primary);cursor:pointer;border:2px solid var(--accent);border-radius:50%;width:18px;height:18px;transition:all .2s}.nord-btn-primary{background-color:var(--btn-primary-bg);color:var(--bg-sidebar);cursor:pointer;border:none;border-radius:6px;justify-content:center;align-items:center;padding:10px 20px;font-size:.9rem;font-weight:600;transition:background-color .2s;display:flex}.nord-btn-primary:hover{background-color:var(--accent)}.nord-btn-primary:disabled{background-color:var(--tool-bg);color:#8fbcbb;cursor:not-allowed}.nord-panel-header{border-bottom:1px solid var(--glass-border);align-items:center;gap:10px;margin-bottom:20px;padding-bottom:12px;display:flex}.nord-panel-header h3{color:var(--text-primary);margin:0;font-size:1.1rem;font-weight:600}.sidebar.collapsed{width:68px}.nav-label,.agent-info,.sidebar-section,.delete-session-btn,.agent-avatar,.sessions-list,.agent-identity-card,.sidebar-nav,.nav-item{white-space:nowrap;transition:all .3s cubic-bezier(.4,0,.2,1)}.sidebar.collapsed .nav-label,.sidebar.collapsed .agent-info,.sidebar.collapsed .sidebar-section,.sidebar.collapsed .delete-session-btn,.sidebar.collapsed .agent-avatar,.sidebar.collapsed .sessions-list{opacity:0!important;width:0!important;height:0!important;margin:0!important;padding:0!important;overflow:hidden!important}.sidebar.collapsed .agent-identity-card{justify-content:center;border-bottom-color:#0000!important;gap:0!important;min-height:60px!important;margin-bottom:0!important;padding:16px 0 4px!important}.sidebar.collapsed .sidebar-toggle-btn{border-radius:50%;margin-top:0;padding:8px;position:static!important}.sidebar.collapsed .sidebar-toggle-btn:hover{background-color:#ffffff0d!important}.sidebar.collapsed .sidebar-nav{align-items:center;gap:2px!important;padding:4px 0 0!important}.sidebar.collapsed .nav-item{justify-content:center;border-width:0!important;border-color:#0000!important;border-radius:50%!important;gap:0!important;width:36px!important;height:36px!important;margin:0 auto!important;padding:0!important}.sidebar.collapsed .nav-item.active{background:#3b82f633!important;border-width:0!important;border-color:#0000!important}.sidebar.collapsed .session-item{border-radius:50%}.sidebar.collapsed .nav-item .nav-icon{margin:0}.spinner{color:var(--text-secondary);animation:1s linear infinite spin}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.overview-container{height:calc(100vh - 64px);color:var(--text-primary);scroll-behavior:smooth;-webkit-overflow-scrolling:touch;will-change:scroll-position;padding:24px;font-family:Inter,sans-serif;overflow-y:auto}.settings-subpanel{width:100%;color:var(--text-primary);font-family:Inter,sans-serif}.overview-container::-webkit-scrollbar{width:6px}.overview-container::-webkit-scrollbar-thumb{background:#ffffff1a;border-radius:4px}body.light-theme .overview-container::-webkit-scrollbar-thumb{background:#00000026}.overview-header h1{margin-bottom:4px;font-size:1.5rem;font-weight:600}.overview-header p{color:var(--text-secondary);margin-bottom:24px;font-size:.9rem}.panel{background:var(--bg-secondary);border:1px solid var(--glass-border);border-radius:12px;margin-bottom:24px;padding:20px}.panel-header h3{margin-bottom:4px;font-size:1.1rem;font-weight:600}.panel-header p{color:var(--text-secondary);margin-bottom:16px;font-size:.85rem}.form-group{margin-bottom:16px}.form-row{gap:16px;display:flex}.flex-1{flex:1}label{text-transform:uppercase;color:var(--text-secondary);letter-spacing:.05em;margin-bottom:8px;font-size:.75rem;display:block}input,select{background:var(--bg-color);border:1px solid var(--glass-border);width:100%;color:var(--text-primary);border-radius:8px;padding:10px 12px;font-family:monospace;font-size:.9rem}input:read-only{color:var(--text-secondary)}.input-with-icon{align-items:center;display:flex;position:relative}.input-with-icon svg{color:var(--text-secondary);cursor:pointer;position:absolute;right:12px}.form-actions{align-items:center;gap:12px;margin-top:20px;display:flex}.btn-primary{color:var(--text-primary);cursor:pointer;background:#3b82f6;border:none;border-radius:6px;padding:8px 16px;font-size:.9rem}.btn-secondary{color:var(--text-primary);cursor:pointer;background:0 0;border:1px solid #fff3;border-radius:6px;padding:8px 16px;font-size:.9rem}.action-hint{color:var(--text-secondary);margin-left:8px;font-size:.85rem}.snapshot-grid{grid-template-columns:repeat(4,1fr);gap:20px;display:grid}.stat-val{margin-bottom:4px;font-size:1.5rem;font-weight:700}.text-green{color:#22c55e}.stat-block p{color:var(--text-secondary);margin-top:8px;font-size:.8rem;line-height:1.4}.metrics-grid{grid-template-columns:repeat(5,1fr);gap:16px;margin-bottom:32px;display:grid}.metric-card{background:var(--bg-secondary);border:1px solid var(--glass-border);border-radius:12px;padding:16px}.metric-val{margin-bottom:4px;font-size:1.5rem;font-weight:700}.metric-sub{color:var(--text-secondary);font-size:.75rem}.section-title{text-transform:uppercase;color:var(--text-secondary);letter-spacing:.05em;margin-bottom:12px;font-size:.75rem}.session-item{justify-content:space-between;margin-bottom:24px;padding:16px 20px;display:flex}.text-secondary{color:var(--text-secondary)}.attention-panel{background:#eab3081a;border:1px solid #eab30833;border-radius:12px;flex-direction:column;margin-bottom:24px;padding:16px 20px;display:flex}.attention-header{color:#eab308;align-items:center;gap:8px;margin-bottom:8px;display:flex}.attention-header h4{font-size:1rem;font-weight:600}.attention-content p{margin-bottom:4px;font-size:.95rem}.attention-content span{font-size:.85rem}.logs-grid{grid-template-columns:1fr 1fr;gap:16px;display:grid}.log-panel{background:var(--terminal-bg);border:1px solid var(--glass-border);border-radius:12px;flex-direction:column;height:300px;display:flex;overflow:hidden}.log-header{background:var(--glass-border);border-bottom:1px solid var(--glass-border);padding:12px 16px;font-size:.85rem;font-weight:600}.badge{background:#ffffff1a;border-radius:10px;margin-left:8px;padding:2px 6px;font-size:.7rem}.log-content{flex-direction:column;gap:4px;padding:12px 16px;display:flex;overflow:auto}.log-content::-webkit-scrollbar{width:6px;height:6px}.log-content::-webkit-scrollbar-thumb{background:var(--glass-border);border-radius:4px}.log-content::-webkit-scrollbar-thumb:hover{background:var(--glass-border)}.log-content::-webkit-scrollbar-corner{background:0 0}.memory-log-container::-webkit-scrollbar{width:6px;height:6px}.memory-log-container::-webkit-scrollbar-thumb{background:var(--glass-border);border-radius:4px}.memory-log-container::-webkit-scrollbar-thumb:hover{background:var(--glass-border)}.memory-log-container::-webkit-scrollbar-corner{background:0 0}.log-content code,.log-json{color:#a3a3a3;word-break:break-all;font-family:Consolas,Monaco,monospace;font-size:.75rem;line-height:1.4}.log-row{gap:12px;margin-bottom:4px;font-family:Consolas,Monaco,monospace;font-size:.75rem;display:flex}.log-time{color:#fb923c;min-width:60px}.log-msg{color:#d1d5db}.log-meta{color:#6b7280}.gateway-row{margin-bottom:2px}.search-chat-container{flex-direction:column;width:100%;max-width:800px;margin:0 auto;padding:40px 20px;animation:.3s ease-out fadeIn;display:flex}.search-chat-header{justify-content:center;margin-bottom:40px;display:flex}.search-input-wrapper{width:100%;max-width:600px;position:relative}.search-icon{color:var(--text-secondary);position:absolute;top:50%;left:20px;transform:translateY(-50%)}.search-input{border:1px solid var(--glass-border);background:var(--bg-sidebar);width:100%;color:var(--text-primary);border-radius:30px;outline:none;padding:16px 20px 16px 50px;font-size:1.1rem;transition:all .2s;box-shadow:0 4px 20px #0000000d}.search-input:focus{border-color:var(--accent);background:var(--bg-color);box-shadow:0 4px 25px #0000001a}.search-results-area{flex-direction:column;display:flex}.search-results-title{color:var(--text-secondary);margin-bottom:16px;padding-left:8px;font-size:.9rem;font-weight:500}.search-result-item{cursor:pointer;border-radius:12px;align-items:center;padding:16px;transition:background-color .2s;display:flex}.search-result-item:hover{background-color:var(--bg-sidebar)}.result-title{color:var(--text-primary);align-items:center;gap:12px;font-size:1rem;display:flex}.result-icon{color:var(--text-secondary)}.search-no-results{text-align:center;color:var(--text-secondary);padding:40px;font-style:italic}.login-container{background-color:var(--bg-color,#1e222a);background-image:linear-gradient(#ffffff08 1px,#0000 1px),linear-gradient(90deg,#ffffff08 1px,#0000 1px),radial-gradient(circle,#3b82f626,#0000 60%);background-size:40px 40px,40px 40px,100% 100%;justify-content:center;align-items:center;width:100vw;height:100vh;display:flex;overflow:hidden}.login-card{-webkit-backdrop-filter:blur(16px);background:#1e222a99;border:1px solid #ffffff14;border-radius:16px;flex-direction:column;width:420px;animation:.4s ease-out fadeInScale;display:flex;overflow:hidden;box-shadow:0 25px 50px -12px #00000080}@keyframes fadeInScale{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.login-card-header{background:#0003;border-bottom:1px solid #ffffff0d;align-items:center;gap:8px;height:38px;padding:0 16px;display:flex}.mac-dot{border-radius:50%;width:12px;height:12px}.mac-dot.red{background-color:#ff5f56}.mac-dot.yellow{background-color:#ffbd2e}.mac-dot.green{background-color:#27c93f}.login-card-body{flex-direction:column;align-items:center;padding:40px 32px 48px;display:flex}.login-logo{margin-bottom:12px;animation:4s ease-in-out infinite pulseLogo}@keyframes pulseLogo{0%{filter:drop-shadow(0 0 8px #a3be8c4d)}50%{filter:drop-shadow(0 0 16px #a3be8cb3)}to{filter:drop-shadow(0 0 8px #a3be8c4d)}}.login-title{color:var(--text-primary);margin-bottom:4px;font-size:1.5rem;font-weight:600}.login-subtitle{color:var(--text-secondary);text-align:center;margin-bottom:32px;font-size:.9rem}.login-form{flex-direction:column;gap:16px;width:100%;display:flex}.login-input-group{width:100%;position:relative}.login-input{border:1px solid var(--glass-border);width:100%;color:var(--text-primary);box-sizing:border-box;background:#0000004d;border-radius:24px;outline:none;padding:14px 16px 14px 44px;font-size:1rem;transition:all .2s}.login-input:focus{border-color:var(--accent);box-shadow:0 0 0 2px #a3be8c33}.login-input-icon{color:var(--text-secondary);pointer-events:none;position:absolute;top:50%;left:16px;transform:translateY(-50%)}.login-button{background-color:var(--accent);color:#1e222a;cursor:pointer;border:none;border-radius:24px;justify-content:center;align-items:center;gap:8px;width:100%;padding:14px;font-size:1rem;font-weight:600;transition:all .2s;display:flex}.login-button:hover:not(:disabled){background-color:#b4cf9a;transform:translateY(-1px)}.login-button:disabled{opacity:.7;cursor:not-allowed}.login-error{color:#bf616a;text-align:center;min-height:20px;margin-top:12px;font-size:.85rem}.login-hint{color:var(--text-secondary);text-align:center;opacity:.6;margin-top:24px;font-size:.75rem}
|