balchemy 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -0
- package/assets/bcrow.png +0 -0
- package/dist/agent-store.d.ts +40 -0
- package/dist/agent-store.d.ts.map +1 -0
- package/dist/agent-store.js +206 -0
- package/dist/agent-store.js.map +1 -0
- package/dist/config-loader.d.ts +8 -0
- package/dist/config-loader.d.ts.map +1 -0
- package/dist/config-loader.js +106 -0
- package/dist/config-loader.js.map +1 -0
- package/dist/docker-gen.d.ts +6 -0
- package/dist/docker-gen.d.ts.map +1 -0
- package/dist/docker-gen.js +40 -0
- package/dist/docker-gen.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +143 -0
- package/dist/index.js.map +1 -0
- package/dist/openai-oauth.d.ts +28 -0
- package/dist/openai-oauth.d.ts.map +1 -0
- package/dist/openai-oauth.js +215 -0
- package/dist/openai-oauth.js.map +1 -0
- package/dist/runner.d.ts +6 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +63 -0
- package/dist/runner.js.map +1 -0
- package/dist/terminal-logo.d.ts +15 -0
- package/dist/terminal-logo.d.ts.map +1 -0
- package/dist/terminal-logo.js +121 -0
- package/dist/terminal-logo.js.map +1 -0
- package/dist/tui/AgentBridge.d.ts +35 -0
- package/dist/tui/AgentBridge.d.ts.map +1 -0
- package/dist/tui/AgentBridge.js +235 -0
- package/dist/tui/AgentBridge.js.map +1 -0
- package/dist/tui/App.d.ts +8 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +118 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/ChatAgent.d.ts +41 -0
- package/dist/tui/ChatAgent.d.ts.map +1 -0
- package/dist/tui/ChatAgent.js +312 -0
- package/dist/tui/ChatAgent.js.map +1 -0
- package/dist/tui/ChatPanel.d.ts +10 -0
- package/dist/tui/ChatPanel.d.ts.map +1 -0
- package/dist/tui/ChatPanel.js +43 -0
- package/dist/tui/ChatPanel.js.map +1 -0
- package/dist/tui/StatusPanel.d.ts +8 -0
- package/dist/tui/StatusPanel.d.ts.map +1 -0
- package/dist/tui/StatusPanel.js +25 -0
- package/dist/tui/StatusPanel.js.map +1 -0
- package/dist/tui/start.d.ts +3 -0
- package/dist/tui/start.d.ts.map +1 -0
- package/dist/tui/start.js +14 -0
- package/dist/tui/start.js.map +1 -0
- package/dist/tui/types.d.ts +61 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +3 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/wizard.d.ts +16 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +716 -0
- package/dist/wizard.js.map +1 -0
- package/package.json +57 -0
- package/templates/.env.example +19 -0
- package/templates/Dockerfile +20 -0
- package/templates/agent.config.yaml +71 -0
- package/templates/docker-compose.yml +27 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ChatMessage, StatusData, TuiConfig } from "./types.js";
|
|
2
|
+
type StateSetters = {
|
|
3
|
+
addMessage: (msg: ChatMessage) => void;
|
|
4
|
+
setStatus: (updater: (prev: StatusData) => StatusData) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare class AgentBridge {
|
|
7
|
+
private loop;
|
|
8
|
+
private readonly mcp;
|
|
9
|
+
private readonly config;
|
|
10
|
+
private chatAgent;
|
|
11
|
+
private readonly setters;
|
|
12
|
+
private readonly replayFetch;
|
|
13
|
+
private lowBalanceWarned;
|
|
14
|
+
constructor(config: TuiConfig, setters: StateSetters);
|
|
15
|
+
/**
|
|
16
|
+
* Start the bridge: init ChatAgent, start AgentLoop + SSE.
|
|
17
|
+
* Returns as soon as the input is ready — the greeting runs in the background.
|
|
18
|
+
*/
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
/** Background greeting after start — does not block input activation. */
|
|
21
|
+
private greet;
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
sendUserMessage(text: string): Promise<void>;
|
|
24
|
+
/** Check if setup is complete. Returns true if ready to trade, false if needs setup. */
|
|
25
|
+
private checkSetupStatus;
|
|
26
|
+
/** Silent balance refresh — updates status panel only, no chat messages. */
|
|
27
|
+
refreshBalance(): Promise<void>;
|
|
28
|
+
checkBalance(): Promise<void>;
|
|
29
|
+
private addAgentMessage;
|
|
30
|
+
private addSystemMessage;
|
|
31
|
+
private addTradeMessage;
|
|
32
|
+
private addErrorMessage;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=AgentBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentBridge.d.ts","sourceRoot":"","sources":["../../src/tui/AgentBridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAa,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhF,KAAK,YAAY,GAAG;IAClB,UAAU,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY;IAmBpD;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0F5B,yEAAyE;YAC3D,KAAK;IAqBb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBlD,wFAAwF;YAC1E,gBAAgB;IAa9B,4EAA4E;IACtE,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAc/B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBnC,OAAO,CAAC,eAAe;IAGvB,OAAO,CAAC,gBAAgB;IAGxB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,eAAe;CAGxB"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
// src/tui/AgentBridge.ts
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { AgentLoop, connectMcp } from "@balchemyai/agent-sdk";
|
|
4
|
+
import { ChatAgent } from "./ChatAgent.js";
|
|
5
|
+
export class AgentBridge {
|
|
6
|
+
loop = null;
|
|
7
|
+
mcp;
|
|
8
|
+
config;
|
|
9
|
+
chatAgent = null;
|
|
10
|
+
setters;
|
|
11
|
+
replayFetch;
|
|
12
|
+
lowBalanceWarned = false;
|
|
13
|
+
constructor(config, setters) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.setters = setters;
|
|
16
|
+
// Replay-protected fetch for MCP calls
|
|
17
|
+
this.replayFetch = async (url, init) => {
|
|
18
|
+
const headers = new Headers(init?.headers);
|
|
19
|
+
headers.set("x-request-nonce", `nonce-${Date.now()}-${randomUUID().replace(/-/g, "").slice(0, 16)}`);
|
|
20
|
+
headers.set("x-request-timestamp", String(Math.floor(Date.now() / 1000)));
|
|
21
|
+
return fetch(url, { ...init, headers });
|
|
22
|
+
};
|
|
23
|
+
this.mcp = connectMcp({
|
|
24
|
+
endpoint: config.mcpEndpoint,
|
|
25
|
+
apiKey: config.apiKey,
|
|
26
|
+
fetchFn: this.replayFetch,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start the bridge: init ChatAgent, start AgentLoop + SSE.
|
|
31
|
+
* Returns as soon as the input is ready — the greeting runs in the background.
|
|
32
|
+
*/
|
|
33
|
+
async start() {
|
|
34
|
+
// Init the ChatAgent (external LLM with tool-calling)
|
|
35
|
+
this.chatAgent = new ChatAgent({
|
|
36
|
+
llmProvider: this.config.llmProvider,
|
|
37
|
+
llmApiKey: this.config.llmApiKey,
|
|
38
|
+
llmModel: this.config.llmModel,
|
|
39
|
+
llmBaseUrl: this.config.llmBaseUrl,
|
|
40
|
+
llmTimeoutMs: this.config.llmTimeoutMs ?? 30_000,
|
|
41
|
+
}, this.mcp, this.replayFetch);
|
|
42
|
+
await this.chatAgent.init();
|
|
43
|
+
// Check setup status
|
|
44
|
+
const setupComplete = await this.checkSetupStatus();
|
|
45
|
+
const loopConfig = {
|
|
46
|
+
mcpEndpoint: this.config.mcpEndpoint,
|
|
47
|
+
apiKey: this.config.apiKey,
|
|
48
|
+
llmProvider: this.config.llmProvider,
|
|
49
|
+
llmApiKey: this.config.llmApiKey,
|
|
50
|
+
llmModel: this.config.llmModel,
|
|
51
|
+
llmBaseUrl: this.config.llmBaseUrl,
|
|
52
|
+
maxDailyLlmCost: this.config.maxDailyLlmCost ?? 5,
|
|
53
|
+
llmTimeoutMs: this.config.llmTimeoutMs ?? 15_000,
|
|
54
|
+
mcpFetchFn: this.replayFetch,
|
|
55
|
+
onEvent: (event) => {
|
|
56
|
+
const data = event.data;
|
|
57
|
+
const eventType = data?.subscription_type ?? data?.event_type ?? event.type;
|
|
58
|
+
// Only show subscription events in chat, skip heartbeats/internal
|
|
59
|
+
if (eventType === "subscription_event" || eventType === "subscription_digest") {
|
|
60
|
+
const delta = data?.delta;
|
|
61
|
+
const events = (delta?.events ?? []);
|
|
62
|
+
for (const evt of events) {
|
|
63
|
+
const evtData = evt.data;
|
|
64
|
+
const mint = String(evtData?.mint ?? evt.key ?? "unknown").slice(0, 8);
|
|
65
|
+
this.addSystemMessage(`New token: ${mint}... (${String(evtData?.launchpad ?? "unknown")})`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
this.setters.setStatus((prev) => ({ ...prev, eventsReceived: prev.eventsReceived + 1 }));
|
|
69
|
+
},
|
|
70
|
+
onDecision: (decision) => {
|
|
71
|
+
const reasoning = decision.reasoning ?? `${decision.action} ${decision.token ?? ""} ${decision.amount ?? ""}`;
|
|
72
|
+
this.addAgentMessage(reasoning);
|
|
73
|
+
this.setters.setStatus((prev) => ({ ...prev, decisionsExecuted: prev.decisionsExecuted + 1 }));
|
|
74
|
+
},
|
|
75
|
+
onTradeResult: (result) => {
|
|
76
|
+
const trade = {
|
|
77
|
+
token: result.token ?? "unknown",
|
|
78
|
+
action: result.action,
|
|
79
|
+
amount: result.amount ?? "?",
|
|
80
|
+
timestamp: Date.now(),
|
|
81
|
+
};
|
|
82
|
+
this.addTradeMessage(trade);
|
|
83
|
+
this.setters.setStatus((prev) => ({
|
|
84
|
+
...prev,
|
|
85
|
+
tradesExecuted: prev.tradesExecuted + 1,
|
|
86
|
+
activeTrades: result.action === "buy"
|
|
87
|
+
? [...prev.activeTrades, trade]
|
|
88
|
+
: prev.activeTrades.filter((t) => t.token !== trade.token),
|
|
89
|
+
}));
|
|
90
|
+
},
|
|
91
|
+
onError: (err) => {
|
|
92
|
+
this.addErrorMessage(err.message);
|
|
93
|
+
},
|
|
94
|
+
onStatusChange: (status) => {
|
|
95
|
+
this.setters.setStatus((prev) => ({
|
|
96
|
+
...prev,
|
|
97
|
+
status: status.status,
|
|
98
|
+
llmCostToday: status.llmCostToday,
|
|
99
|
+
sseConnected: status.sseConnected,
|
|
100
|
+
uptime: status.uptime,
|
|
101
|
+
}));
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
this.loop = new AgentLoop(loopConfig);
|
|
105
|
+
await this.loop.start();
|
|
106
|
+
// Input is ready now — kick off greeting + balance check in the background
|
|
107
|
+
void this.greet(setupComplete);
|
|
108
|
+
}
|
|
109
|
+
/** Background greeting after start — does not block input activation. */
|
|
110
|
+
async greet(setupComplete) {
|
|
111
|
+
if (!this.chatAgent)
|
|
112
|
+
return;
|
|
113
|
+
if (setupComplete) {
|
|
114
|
+
await this.checkBalance();
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const prompt = setupComplete
|
|
118
|
+
? "Check my portfolio and status, then greet me. Tell me my balance, wallets, and current strategy. Keep it brief."
|
|
119
|
+
: "Agent setup is incomplete. Check setup status with setup_agent get_status, then guide me through the setup. Start by greeting me.";
|
|
120
|
+
const reply = await this.chatAgent.chat(prompt, (name, _result) => this.addSystemMessage(`Tool: ${name}`));
|
|
121
|
+
this.addAgentMessage(reply);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
this.addErrorMessage(`Greeting failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async stop() {
|
|
128
|
+
await this.loop?.stop();
|
|
129
|
+
}
|
|
130
|
+
async sendUserMessage(text) {
|
|
131
|
+
if (!this.chatAgent)
|
|
132
|
+
return;
|
|
133
|
+
this.setters.addMessage({
|
|
134
|
+
id: randomUUID(),
|
|
135
|
+
type: "user",
|
|
136
|
+
text,
|
|
137
|
+
timestamp: Date.now(),
|
|
138
|
+
});
|
|
139
|
+
try {
|
|
140
|
+
const reply = await this.chatAgent.chat(text, (name, _result) => this.addSystemMessage(`Tool: ${name}`));
|
|
141
|
+
this.addAgentMessage(reply);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
this.addErrorMessage(`LLM error: ${err instanceof Error ? err.message : String(err)}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Check if setup is complete. Returns true if ready to trade, false if needs setup. */
|
|
148
|
+
async checkSetupStatus() {
|
|
149
|
+
try {
|
|
150
|
+
const resp = await this.mcp.callTool("setup_agent", { action: "get_status" });
|
|
151
|
+
const text = resp.content?.find((c) => c.type === "text")?.text ?? "{}";
|
|
152
|
+
let parsed;
|
|
153
|
+
try {
|
|
154
|
+
parsed = JSON.parse(text);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
parsed = {};
|
|
158
|
+
}
|
|
159
|
+
const structured = parsed.structured;
|
|
160
|
+
return structured?.tradingConfigured === true && structured?.walletsConfigured === true;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Silent balance refresh — updates status panel only, no chat messages. */
|
|
167
|
+
async refreshBalance() {
|
|
168
|
+
try {
|
|
169
|
+
const response = await this.mcp.agentPortfolio();
|
|
170
|
+
const text = response.content?.find((c) => c.type === "text")?.text ?? "{}";
|
|
171
|
+
let parsed;
|
|
172
|
+
try {
|
|
173
|
+
parsed = JSON.parse(text);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
parsed = {};
|
|
177
|
+
}
|
|
178
|
+
const sol = Number(parsed.totalValueSol ?? 0);
|
|
179
|
+
const usd = Number(parsed.totalValueUsd ?? 0);
|
|
180
|
+
this.setters.setStatus((prev) => ({ ...prev, balanceSol: sol, balanceUsd: usd }));
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Silent — don't spam chat
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async checkBalance() {
|
|
187
|
+
try {
|
|
188
|
+
const response = await this.mcp.agentPortfolio();
|
|
189
|
+
const text = response.content?.find((c) => c.type === "text")?.text ?? "{}";
|
|
190
|
+
let parsed;
|
|
191
|
+
try {
|
|
192
|
+
parsed = JSON.parse(text);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
parsed = {};
|
|
196
|
+
}
|
|
197
|
+
const sol = Number(parsed.totalValueSol ?? 0);
|
|
198
|
+
const usd = Number(parsed.totalValueUsd ?? 0);
|
|
199
|
+
this.setters.setStatus((prev) => ({ ...prev, balanceSol: sol, balanceUsd: usd }));
|
|
200
|
+
if (sol < 0.01 && !this.lowBalanceWarned) {
|
|
201
|
+
this.lowBalanceWarned = true;
|
|
202
|
+
this.addErrorMessage(`Wallet balance too low (${sol} SOL). Fund your Solana wallet to start trading.`);
|
|
203
|
+
}
|
|
204
|
+
if (sol >= 0.01) {
|
|
205
|
+
this.lowBalanceWarned = false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
this.addErrorMessage("Could not check wallet balance.");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Convenience helpers
|
|
213
|
+
addAgentMessage(text) {
|
|
214
|
+
this.setters.addMessage({ id: randomUUID(), type: "agent", text, timestamp: Date.now() });
|
|
215
|
+
}
|
|
216
|
+
addSystemMessage(text) {
|
|
217
|
+
this.setters.addMessage({ id: randomUUID(), type: "system", text, timestamp: Date.now() });
|
|
218
|
+
}
|
|
219
|
+
addTradeMessage(trade) {
|
|
220
|
+
const icon = trade.action === "buy" ? "BUY" : "SELL";
|
|
221
|
+
this.setters.addMessage({
|
|
222
|
+
id: randomUUID(),
|
|
223
|
+
type: "trade",
|
|
224
|
+
text: `${icon} ${trade.amount} SOL ${trade.action === "buy" ? "->" : "<-"} ${trade.token.slice(0, 8)}...`,
|
|
225
|
+
token: trade.token,
|
|
226
|
+
action: trade.action,
|
|
227
|
+
amount: trade.amount,
|
|
228
|
+
timestamp: Date.now(),
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
addErrorMessage(text) {
|
|
232
|
+
this.setters.addMessage({ id: randomUUID(), type: "error", text, timestamp: Date.now() });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=AgentBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentBridge.js","sourceRoot":"","sources":["../../src/tui/AgentBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,OAAO,KAAK,EAA2B,SAAS,EAAE,MAAM,YAAY,CAAC;AAmBrE,UAAU,QAAQ;IAChB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,YAAY,CA4G5D"}
|
package/dist/tui/App.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// src/tui/App.tsx
|
|
3
|
+
import { useState, useEffect, useRef, useCallback } from "react";
|
|
4
|
+
import { Box, useApp } from "ink";
|
|
5
|
+
import { ChatPanel } from "./ChatPanel.js";
|
|
6
|
+
import { StatusPanel } from "./StatusPanel.js";
|
|
7
|
+
import { AgentBridge } from "./AgentBridge.js";
|
|
8
|
+
import { clearAgent } from "../agent-store.js";
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
10
|
+
const INITIAL_STATUS = {
|
|
11
|
+
balanceSol: 0,
|
|
12
|
+
balanceUsd: 0,
|
|
13
|
+
wallets: [],
|
|
14
|
+
activeTrades: [],
|
|
15
|
+
recentTools: [],
|
|
16
|
+
eventsReceived: 0,
|
|
17
|
+
decisionsExecuted: 0,
|
|
18
|
+
tradesExecuted: 0,
|
|
19
|
+
llmCostToday: 0,
|
|
20
|
+
maxDailyLlmCost: 5,
|
|
21
|
+
uptime: 0,
|
|
22
|
+
sseConnected: false,
|
|
23
|
+
status: "starting",
|
|
24
|
+
};
|
|
25
|
+
export function App({ config }) {
|
|
26
|
+
const { exit } = useApp();
|
|
27
|
+
const [messages, setMessages] = useState([]);
|
|
28
|
+
const [status, setStatus] = useState({
|
|
29
|
+
...INITIAL_STATUS,
|
|
30
|
+
maxDailyLlmCost: config.maxDailyLlmCost ?? 5,
|
|
31
|
+
});
|
|
32
|
+
const [inputActive, setInputActive] = useState(false);
|
|
33
|
+
const bridgeRef = useRef(null);
|
|
34
|
+
const addMessage = useCallback((msg) => {
|
|
35
|
+
setMessages((prev) => {
|
|
36
|
+
const next = [...prev, msg];
|
|
37
|
+
return next.length > 500 ? next.slice(-500) : next;
|
|
38
|
+
});
|
|
39
|
+
}, []);
|
|
40
|
+
const addSystemMsg = useCallback((text) => {
|
|
41
|
+
addMessage({ id: randomUUID(), type: "system", text, timestamp: Date.now() });
|
|
42
|
+
}, [addMessage]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
const bridge = new AgentBridge(config, { addMessage, setStatus });
|
|
45
|
+
bridgeRef.current = bridge;
|
|
46
|
+
bridge.start().then(() => {
|
|
47
|
+
setInputActive(true);
|
|
48
|
+
}).catch((err) => {
|
|
49
|
+
addMessage({
|
|
50
|
+
id: "boot-error",
|
|
51
|
+
type: "error",
|
|
52
|
+
text: `Failed to start: ${err instanceof Error ? err.message : String(err)}`,
|
|
53
|
+
timestamp: Date.now(),
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
// Balance updates silently via status panel — no spam messages
|
|
57
|
+
const balanceInterval = setInterval(() => {
|
|
58
|
+
bridge.refreshBalance().catch(() => { });
|
|
59
|
+
}, 60_000);
|
|
60
|
+
return () => {
|
|
61
|
+
clearInterval(balanceInterval);
|
|
62
|
+
bridge.stop().catch(() => { });
|
|
63
|
+
};
|
|
64
|
+
}, [config, addMessage]);
|
|
65
|
+
const handleSend = useCallback(async (text) => {
|
|
66
|
+
if (!bridgeRef.current)
|
|
67
|
+
return;
|
|
68
|
+
// Slash commands
|
|
69
|
+
if (text.startsWith("/")) {
|
|
70
|
+
const cmd = text.split(" ")[0].toLowerCase();
|
|
71
|
+
switch (cmd) {
|
|
72
|
+
case "/stop":
|
|
73
|
+
case "/exit":
|
|
74
|
+
case "/quit": {
|
|
75
|
+
addSystemMsg("Shutting down...");
|
|
76
|
+
await bridgeRef.current.stop();
|
|
77
|
+
exit();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
case "/new": {
|
|
81
|
+
addSystemMsg("Creating new agent... Restarting wizard.");
|
|
82
|
+
clearAgent();
|
|
83
|
+
await bridgeRef.current.stop();
|
|
84
|
+
exit();
|
|
85
|
+
// After exit, index.ts will re-run and hit the wizard
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
case "/switch": {
|
|
89
|
+
addSystemMsg("Switching agent... Clearing cache.");
|
|
90
|
+
clearAgent();
|
|
91
|
+
await bridgeRef.current.stop();
|
|
92
|
+
exit();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
case "/help": {
|
|
96
|
+
addSystemMsg("Commands:\n" +
|
|
97
|
+
" /stop — Stop agent and exit\n" +
|
|
98
|
+
" /new — Create a new agent (same LLM)\n" +
|
|
99
|
+
" /switch — Switch to different agent\n" +
|
|
100
|
+
" /clear — Clear chat history\n" +
|
|
101
|
+
" /help — Show this help");
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
case "/clear": {
|
|
105
|
+
setMessages([]);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
default: {
|
|
109
|
+
addSystemMsg(`Unknown command: ${cmd}. Type /help for commands.`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
await bridgeRef.current.sendUserMessage(text);
|
|
115
|
+
}, [exit, addSystemMsg]);
|
|
116
|
+
return (_jsxs(Box, { flexDirection: "row", height: "100%", children: [_jsx(ChatPanel, { messages: messages, onSend: handleSend, inputActive: inputActive }), _jsx(StatusPanel, { status: status })] }));
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatAgent — External LLM with MCP tool-calling capability.
|
|
3
|
+
*
|
|
4
|
+
* Instead of ask_bot (which uses the internal servant LLM),
|
|
5
|
+
* this calls the user's chosen LLM directly with the MCP tool
|
|
6
|
+
* definitions. The LLM can then call setup_agent, trade_command,
|
|
7
|
+
* etc. — exactly like Claude Desktop or OpenCode.
|
|
8
|
+
*
|
|
9
|
+
* Flow:
|
|
10
|
+
* User message → External LLM (with tools) → tool call?
|
|
11
|
+
* → Execute via MCP → feed result back → repeat until text response
|
|
12
|
+
*/
|
|
13
|
+
import type { BalchemyMcpClient } from "@balchemyai/agent-sdk";
|
|
14
|
+
interface ChatAgentConfig {
|
|
15
|
+
llmProvider: "anthropic" | "openai";
|
|
16
|
+
llmApiKey: string;
|
|
17
|
+
llmModel?: string;
|
|
18
|
+
llmBaseUrl?: string;
|
|
19
|
+
llmTimeoutMs?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class ChatAgent {
|
|
22
|
+
private readonly config;
|
|
23
|
+
private readonly mcp;
|
|
24
|
+
private tools;
|
|
25
|
+
private history;
|
|
26
|
+
private readonly replayFetch;
|
|
27
|
+
constructor(config: ChatAgentConfig, mcp: BalchemyMcpClient, replayFetch: typeof fetch);
|
|
28
|
+
/** Fetch MCP tools and prepare system prompt. Call once on start. */
|
|
29
|
+
init(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Send a user message, let the LLM respond and call tools as needed.
|
|
32
|
+
* Returns the final text response.
|
|
33
|
+
* onToolCall is fired each time the LLM calls a tool (for UI display).
|
|
34
|
+
*/
|
|
35
|
+
chat(userMessage: string, onToolCall?: (name: string, result: string) => void): Promise<string>;
|
|
36
|
+
private callLlm;
|
|
37
|
+
private callOpenAi;
|
|
38
|
+
private callAnthropic;
|
|
39
|
+
}
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=ChatAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatAgent.d.ts","sourceRoot":"","sources":["../../src/tui/ChatAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAqB/D,UAAU,eAAe;IACvB,WAAW,EAAE,WAAW,GAAG,QAAQ,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAaD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;gBAE/B,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,KAAK;IAgBtF,qEAAqE;IAC/D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B;;;;OAIG;IACG,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAClD,OAAO,CAAC,MAAM,CAAC;YAuDJ,OAAO;YAUP,UAAU;YA6DV,aAAa;CAiI5B"}
|