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.
Files changed (67) hide show
  1. package/README.md +59 -0
  2. package/assets/bcrow.png +0 -0
  3. package/dist/agent-store.d.ts +40 -0
  4. package/dist/agent-store.d.ts.map +1 -0
  5. package/dist/agent-store.js +206 -0
  6. package/dist/agent-store.js.map +1 -0
  7. package/dist/config-loader.d.ts +8 -0
  8. package/dist/config-loader.d.ts.map +1 -0
  9. package/dist/config-loader.js +106 -0
  10. package/dist/config-loader.js.map +1 -0
  11. package/dist/docker-gen.d.ts +6 -0
  12. package/dist/docker-gen.d.ts.map +1 -0
  13. package/dist/docker-gen.js +40 -0
  14. package/dist/docker-gen.js.map +1 -0
  15. package/dist/index.d.ts +16 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +143 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/openai-oauth.d.ts +28 -0
  20. package/dist/openai-oauth.d.ts.map +1 -0
  21. package/dist/openai-oauth.js +215 -0
  22. package/dist/openai-oauth.js.map +1 -0
  23. package/dist/runner.d.ts +6 -0
  24. package/dist/runner.d.ts.map +1 -0
  25. package/dist/runner.js +63 -0
  26. package/dist/runner.js.map +1 -0
  27. package/dist/terminal-logo.d.ts +15 -0
  28. package/dist/terminal-logo.d.ts.map +1 -0
  29. package/dist/terminal-logo.js +121 -0
  30. package/dist/terminal-logo.js.map +1 -0
  31. package/dist/tui/AgentBridge.d.ts +35 -0
  32. package/dist/tui/AgentBridge.d.ts.map +1 -0
  33. package/dist/tui/AgentBridge.js +235 -0
  34. package/dist/tui/AgentBridge.js.map +1 -0
  35. package/dist/tui/App.d.ts +8 -0
  36. package/dist/tui/App.d.ts.map +1 -0
  37. package/dist/tui/App.js +118 -0
  38. package/dist/tui/App.js.map +1 -0
  39. package/dist/tui/ChatAgent.d.ts +41 -0
  40. package/dist/tui/ChatAgent.d.ts.map +1 -0
  41. package/dist/tui/ChatAgent.js +312 -0
  42. package/dist/tui/ChatAgent.js.map +1 -0
  43. package/dist/tui/ChatPanel.d.ts +10 -0
  44. package/dist/tui/ChatPanel.d.ts.map +1 -0
  45. package/dist/tui/ChatPanel.js +43 -0
  46. package/dist/tui/ChatPanel.js.map +1 -0
  47. package/dist/tui/StatusPanel.d.ts +8 -0
  48. package/dist/tui/StatusPanel.d.ts.map +1 -0
  49. package/dist/tui/StatusPanel.js +25 -0
  50. package/dist/tui/StatusPanel.js.map +1 -0
  51. package/dist/tui/start.d.ts +3 -0
  52. package/dist/tui/start.d.ts.map +1 -0
  53. package/dist/tui/start.js +14 -0
  54. package/dist/tui/start.js.map +1 -0
  55. package/dist/tui/types.d.ts +61 -0
  56. package/dist/tui/types.d.ts.map +1 -0
  57. package/dist/tui/types.js +3 -0
  58. package/dist/tui/types.js.map +1 -0
  59. package/dist/wizard.d.ts +16 -0
  60. package/dist/wizard.d.ts.map +1 -0
  61. package/dist/wizard.js +716 -0
  62. package/dist/wizard.js.map +1 -0
  63. package/package.json +57 -0
  64. package/templates/.env.example +19 -0
  65. package/templates/Dockerfile +20 -0
  66. package/templates/agent.config.yaml +71 -0
  67. 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,8 @@
1
+ import React from "react";
2
+ import type { TuiConfig } from "./types.js";
3
+ interface AppProps {
4
+ config: TuiConfig;
5
+ }
6
+ export declare function App({ config }: AppProps): React.ReactElement;
7
+ export {};
8
+ //# sourceMappingURL=App.d.ts.map
@@ -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"}
@@ -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"}