@chainai/core 1.0.4 → 1.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/dist/index.cjs +267 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +173 -0
- package/dist/index.d.ts +171 -8
- package/dist/index.js +238 -19
- package/dist/index.js.map +1 -0
- package/package.json +21 -33
- package/README.md +0 -162
- package/dist/client.d.ts +0 -57
- package/dist/client.js +0 -104
- package/dist/services/ic-service.d.ts +0 -47
- package/dist/services/ic-service.js +0 -165
- package/dist/services/nlp-service.d.ts +0 -21
- package/dist/services/nlp-service.js +0 -104
- package/dist/types/chat.d.ts +0 -66
- package/dist/types/chat.js +0 -5
- package/dist/types/customization.d.ts +0 -55
- package/dist/types/customization.js +0 -35
- package/dist/types/index.d.ts +0 -39
- package/dist/types/index.js +0 -8
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
ChainAIClient: () => ChainAIClient,
|
|
24
|
+
dispatchSSEEvent: () => dispatchSSEEvent,
|
|
25
|
+
parseSSEStream: () => parseSSEStream
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(index_exports);
|
|
28
|
+
|
|
29
|
+
// src/stream.ts
|
|
30
|
+
async function* parseSSEStream(body) {
|
|
31
|
+
const reader = body.getReader();
|
|
32
|
+
const decoder = new TextDecoder();
|
|
33
|
+
let buffer = "";
|
|
34
|
+
try {
|
|
35
|
+
while (true) {
|
|
36
|
+
const { done, value } = await reader.read();
|
|
37
|
+
if (done) break;
|
|
38
|
+
buffer += decoder.decode(value, { stream: true });
|
|
39
|
+
const parts = buffer.split("\n\n");
|
|
40
|
+
buffer = parts.pop() || "";
|
|
41
|
+
for (const part of parts) {
|
|
42
|
+
const lines = part.split("\n");
|
|
43
|
+
let eventType = "";
|
|
44
|
+
const dataLines = [];
|
|
45
|
+
for (const line of lines) {
|
|
46
|
+
if (line.startsWith("event: ")) {
|
|
47
|
+
eventType = line.slice(7).trim();
|
|
48
|
+
} else if (line.startsWith("data: ")) {
|
|
49
|
+
dataLines.push(line.slice(6));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (eventType && dataLines.length > 0) {
|
|
53
|
+
yield {
|
|
54
|
+
event: eventType,
|
|
55
|
+
data: dataLines.join("\n")
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
} finally {
|
|
61
|
+
reader.releaseLock();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function dispatchSSEEvent(event, callbacks) {
|
|
65
|
+
const { event: eventType, data } = event;
|
|
66
|
+
switch (eventType) {
|
|
67
|
+
case "text":
|
|
68
|
+
callbacks.onText?.(data);
|
|
69
|
+
break;
|
|
70
|
+
case "tool_call":
|
|
71
|
+
try {
|
|
72
|
+
const parsed = JSON.parse(data);
|
|
73
|
+
callbacks.onToolCall?.(parsed.name, parsed.input || {});
|
|
74
|
+
} catch {
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
case "tool_done":
|
|
78
|
+
try {
|
|
79
|
+
const parsed = JSON.parse(data);
|
|
80
|
+
callbacks.onToolDone?.(parsed.name, parsed.success ?? true);
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
case "transaction":
|
|
85
|
+
try {
|
|
86
|
+
callbacks.onTransaction?.(JSON.parse(data));
|
|
87
|
+
} catch {
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
case "chart":
|
|
91
|
+
try {
|
|
92
|
+
callbacks.onChart?.(JSON.parse(data));
|
|
93
|
+
} catch {
|
|
94
|
+
}
|
|
95
|
+
break;
|
|
96
|
+
case "sign_typed_data":
|
|
97
|
+
try {
|
|
98
|
+
callbacks.onSignRequest?.(
|
|
99
|
+
JSON.parse(data)
|
|
100
|
+
);
|
|
101
|
+
} catch {
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case "hl_deposit":
|
|
105
|
+
try {
|
|
106
|
+
callbacks.onDepositRequest?.(
|
|
107
|
+
JSON.parse(data)
|
|
108
|
+
);
|
|
109
|
+
} catch {
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case "moonpay_onramp":
|
|
113
|
+
try {
|
|
114
|
+
callbacks.onOnrampRequest?.(JSON.parse(data));
|
|
115
|
+
} catch {
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
case "error":
|
|
119
|
+
callbacks.onError?.(data);
|
|
120
|
+
break;
|
|
121
|
+
case "done":
|
|
122
|
+
try {
|
|
123
|
+
callbacks.onDone?.(JSON.parse(data));
|
|
124
|
+
} catch {
|
|
125
|
+
callbacks.onDone?.({ conversationId: "" });
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// src/client.ts
|
|
132
|
+
var DEFAULT_BASE_URL = "http://localhost:3000";
|
|
133
|
+
var ChainAIClient = class {
|
|
134
|
+
apiKey;
|
|
135
|
+
baseUrl;
|
|
136
|
+
constructor(config) {
|
|
137
|
+
if (!config.apiKey) {
|
|
138
|
+
throw new Error("ChainAIClient requires an apiKey");
|
|
139
|
+
}
|
|
140
|
+
this.apiKey = config.apiKey;
|
|
141
|
+
this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
142
|
+
}
|
|
143
|
+
headers(json = false) {
|
|
144
|
+
const h = {
|
|
145
|
+
"X-API-Key": this.apiKey
|
|
146
|
+
};
|
|
147
|
+
if (json) h["Content-Type"] = "application/json";
|
|
148
|
+
return h;
|
|
149
|
+
}
|
|
150
|
+
// ===== Non-streaming Chat =====
|
|
151
|
+
async chat(message, options) {
|
|
152
|
+
const res = await fetch(`${this.baseUrl}/chat`, {
|
|
153
|
+
method: "POST",
|
|
154
|
+
headers: this.headers(true),
|
|
155
|
+
body: JSON.stringify({
|
|
156
|
+
message,
|
|
157
|
+
conversationId: options?.conversationId,
|
|
158
|
+
walletContext: options?.walletContext,
|
|
159
|
+
walletAddress: options?.walletAddress
|
|
160
|
+
})
|
|
161
|
+
});
|
|
162
|
+
if (!res.ok) {
|
|
163
|
+
const err = await res.json().catch(() => ({ error: res.statusText }));
|
|
164
|
+
throw new Error(
|
|
165
|
+
err.error || `API error: ${res.status}`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
return res.json();
|
|
169
|
+
}
|
|
170
|
+
// ===== Streaming Chat =====
|
|
171
|
+
async chatStream(message, options, callbacks) {
|
|
172
|
+
const controller = new AbortController();
|
|
173
|
+
const res = await fetch(`${this.baseUrl}/chat/stream`, {
|
|
174
|
+
method: "POST",
|
|
175
|
+
headers: this.headers(true),
|
|
176
|
+
body: JSON.stringify({
|
|
177
|
+
message,
|
|
178
|
+
conversationId: options?.conversationId,
|
|
179
|
+
walletContext: options?.walletContext,
|
|
180
|
+
walletAddress: options?.walletAddress
|
|
181
|
+
}),
|
|
182
|
+
signal: controller.signal
|
|
183
|
+
});
|
|
184
|
+
if (!res.ok) {
|
|
185
|
+
const err = await res.json().catch(() => ({ error: res.statusText }));
|
|
186
|
+
throw new Error(
|
|
187
|
+
err.error || `API error: ${res.status}`
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
if (!res.body) {
|
|
191
|
+
throw new Error("No response body");
|
|
192
|
+
}
|
|
193
|
+
const process = async () => {
|
|
194
|
+
try {
|
|
195
|
+
for await (const event of parseSSEStream(res.body)) {
|
|
196
|
+
if (callbacks) {
|
|
197
|
+
dispatchSSEEvent(event, callbacks);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
} catch (err) {
|
|
201
|
+
if (err.name !== "AbortError") {
|
|
202
|
+
callbacks?.onError?.(
|
|
203
|
+
err instanceof Error ? err.message : String(err)
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
process();
|
|
209
|
+
return { abort: () => controller.abort() };
|
|
210
|
+
}
|
|
211
|
+
// ===== Conversations =====
|
|
212
|
+
async getConversations(walletAddress) {
|
|
213
|
+
const res = await fetch(
|
|
214
|
+
`${this.baseUrl}/conversations?walletAddress=${encodeURIComponent(walletAddress)}`,
|
|
215
|
+
{ headers: this.headers() }
|
|
216
|
+
);
|
|
217
|
+
if (!res.ok) return [];
|
|
218
|
+
const data = await res.json();
|
|
219
|
+
return data.conversations || [];
|
|
220
|
+
}
|
|
221
|
+
async getMessages(conversationId) {
|
|
222
|
+
const res = await fetch(
|
|
223
|
+
`${this.baseUrl}/conversations/${conversationId}/messages`,
|
|
224
|
+
{ headers: this.headers() }
|
|
225
|
+
);
|
|
226
|
+
if (!res.ok) return [];
|
|
227
|
+
const data = await res.json();
|
|
228
|
+
return data.messages || [];
|
|
229
|
+
}
|
|
230
|
+
async renameConversation(id, title, walletAddress) {
|
|
231
|
+
await fetch(`${this.baseUrl}/conversations/${id}`, {
|
|
232
|
+
method: "PATCH",
|
|
233
|
+
headers: this.headers(true),
|
|
234
|
+
body: JSON.stringify({ title, walletAddress })
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
async deleteConversation(id, walletAddress) {
|
|
238
|
+
await fetch(
|
|
239
|
+
`${this.baseUrl}/conversations/${id}?walletAddress=${encodeURIComponent(walletAddress)}`,
|
|
240
|
+
{ method: "DELETE", headers: this.headers() }
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
// ===== Tools =====
|
|
244
|
+
async listTools() {
|
|
245
|
+
const res = await fetch(`${this.baseUrl}/tools/list`, {
|
|
246
|
+
headers: this.headers()
|
|
247
|
+
});
|
|
248
|
+
if (!res.ok) return [];
|
|
249
|
+
const data = await res.json();
|
|
250
|
+
return data.tools || [];
|
|
251
|
+
}
|
|
252
|
+
async callTool(name, params) {
|
|
253
|
+
const res = await fetch(`${this.baseUrl}/tools/call`, {
|
|
254
|
+
method: "POST",
|
|
255
|
+
headers: this.headers(true),
|
|
256
|
+
body: JSON.stringify({ tool: name, params })
|
|
257
|
+
});
|
|
258
|
+
return res.json();
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
262
|
+
0 && (module.exports = {
|
|
263
|
+
ChainAIClient,
|
|
264
|
+
dispatchSSEEvent,
|
|
265
|
+
parseSSEStream
|
|
266
|
+
});
|
|
267
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/stream.ts","../src/client.ts"],"sourcesContent":["export { ChainAIClient } from \"./client.js\";\nexport type {\n // Config\n ClientConfig,\n ChatOptions,\n StreamCallbacks,\n // Messages\n Message,\n ToolCallInfo,\n ConversationSummary,\n ConversationMessage,\n ChatResponse,\n // Wallet\n WalletContext,\n // Transactions & Actions\n UnsignedTransaction,\n ChartData,\n CandleData,\n HyperliquidSignRequest,\n HyperliquidDepositRequest,\n OnrampRequest,\n // Tools\n ToolDefinitionInfo,\n ToolResult,\n // SSE\n SSEEventType,\n} from \"./types.js\";\n\nexport { parseSSEStream, dispatchSSEEvent } from \"./stream.js\";\nexport type { SSEEvent } from \"./stream.js\";\n","import type {\n SSEEventType,\n StreamCallbacks,\n UnsignedTransaction,\n ChartData,\n HyperliquidSignRequest,\n HyperliquidDepositRequest,\n OnrampRequest,\n} from \"./types.js\";\n\nexport interface SSEEvent {\n event: SSEEventType;\n data: string;\n}\n\n/**\n * Parses an SSE response body into a stream of typed events.\n * Uses the same buffer-splitting approach as the frontend's streamChat.\n */\nexport async function* parseSSEStream(\n body: ReadableStream<Uint8Array>\n): AsyncGenerator<SSEEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() || \"\";\n\n for (const part of parts) {\n const lines = part.split(\"\\n\");\n let eventType = \"\";\n const dataLines: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith(\"event: \")) {\n eventType = line.slice(7).trim();\n } else if (line.startsWith(\"data: \")) {\n dataLines.push(line.slice(6));\n }\n }\n\n if (eventType && dataLines.length > 0) {\n yield {\n event: eventType as SSEEventType,\n data: dataLines.join(\"\\n\"),\n };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Dispatches SSE events to the appropriate callbacks.\n */\nexport function dispatchSSEEvent(\n event: SSEEvent,\n callbacks: StreamCallbacks\n): void {\n const { event: eventType, data } = event;\n\n switch (eventType) {\n case \"text\":\n callbacks.onText?.(data);\n break;\n case \"tool_call\":\n try {\n const parsed = JSON.parse(data);\n callbacks.onToolCall?.(parsed.name, parsed.input || {});\n } catch {\n /* ignore */\n }\n break;\n case \"tool_done\":\n try {\n const parsed = JSON.parse(data);\n callbacks.onToolDone?.(parsed.name, parsed.success ?? true);\n } catch {\n /* ignore */\n }\n break;\n case \"transaction\":\n try {\n callbacks.onTransaction?.(JSON.parse(data) as UnsignedTransaction);\n } catch {\n /* ignore */\n }\n break;\n case \"chart\":\n try {\n callbacks.onChart?.(JSON.parse(data) as ChartData);\n } catch {\n /* ignore */\n }\n break;\n case \"sign_typed_data\":\n try {\n callbacks.onSignRequest?.(\n JSON.parse(data) as HyperliquidSignRequest\n );\n } catch {\n /* ignore */\n }\n break;\n case \"hl_deposit\":\n try {\n callbacks.onDepositRequest?.(\n JSON.parse(data) as HyperliquidDepositRequest\n );\n } catch {\n /* ignore */\n }\n break;\n case \"moonpay_onramp\":\n try {\n callbacks.onOnrampRequest?.(JSON.parse(data) as OnrampRequest);\n } catch {\n /* ignore */\n }\n break;\n case \"error\":\n callbacks.onError?.(data);\n break;\n case \"done\":\n try {\n callbacks.onDone?.(JSON.parse(data));\n } catch {\n callbacks.onDone?.({ conversationId: \"\" });\n }\n break;\n }\n}\n","import type {\n ClientConfig,\n ChatOptions,\n ChatResponse,\n ConversationSummary,\n ConversationMessage,\n ToolDefinitionInfo,\n ToolResult,\n StreamCallbacks,\n} from \"./types.js\";\nimport { parseSSEStream, dispatchSSEEvent } from \"./stream.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:3000\";\n\nexport class ChainAIClient {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: ClientConfig) {\n if (!config.apiKey) {\n throw new Error(\"ChainAIClient requires an apiKey\");\n }\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n }\n\n private headers(json = false): Record<string, string> {\n const h: Record<string, string> = {\n \"X-API-Key\": this.apiKey,\n };\n if (json) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n // ===== Non-streaming Chat =====\n async chat(message: string, options?: ChatOptions): Promise<ChatResponse> {\n const res = await fetch(`${this.baseUrl}/chat`, {\n method: \"POST\",\n headers: this.headers(true),\n body: JSON.stringify({\n message,\n conversationId: options?.conversationId,\n walletContext: options?.walletContext,\n walletAddress: options?.walletAddress,\n }),\n });\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: res.statusText }));\n throw new Error(\n (err as { error?: string }).error || `API error: ${res.status}`\n );\n }\n return res.json();\n }\n\n // ===== Streaming Chat =====\n async chatStream(\n message: string,\n options?: ChatOptions,\n callbacks?: StreamCallbacks\n ): Promise<{ abort: () => void }> {\n const controller = new AbortController();\n\n const res = await fetch(`${this.baseUrl}/chat/stream`, {\n method: \"POST\",\n headers: this.headers(true),\n body: JSON.stringify({\n message,\n conversationId: options?.conversationId,\n walletContext: options?.walletContext,\n walletAddress: options?.walletAddress,\n }),\n signal: controller.signal,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: res.statusText }));\n throw new Error(\n (err as { error?: string }).error || `API error: ${res.status}`\n );\n }\n\n if (!res.body) {\n throw new Error(\"No response body\");\n }\n\n // Process stream in background (non-blocking)\n const process = async () => {\n try {\n for await (const event of parseSSEStream(res.body!)) {\n if (callbacks) {\n dispatchSSEEvent(event, callbacks);\n }\n }\n } catch (err) {\n if ((err as Error).name !== \"AbortError\") {\n callbacks?.onError?.(\n err instanceof Error ? err.message : String(err)\n );\n }\n }\n };\n\n process();\n\n return { abort: () => controller.abort() };\n }\n\n // ===== Conversations =====\n async getConversations(\n walletAddress: string\n ): Promise<ConversationSummary[]> {\n const res = await fetch(\n `${this.baseUrl}/conversations?walletAddress=${encodeURIComponent(walletAddress)}`,\n { headers: this.headers() }\n );\n if (!res.ok) return [];\n const data = (await res.json()) as {\n conversations?: ConversationSummary[];\n };\n return data.conversations || [];\n }\n\n async getMessages(conversationId: string): Promise<ConversationMessage[]> {\n const res = await fetch(\n `${this.baseUrl}/conversations/${conversationId}/messages`,\n { headers: this.headers() }\n );\n if (!res.ok) return [];\n const data = (await res.json()) as {\n messages?: ConversationMessage[];\n };\n return data.messages || [];\n }\n\n async renameConversation(\n id: string,\n title: string,\n walletAddress: string\n ): Promise<void> {\n await fetch(`${this.baseUrl}/conversations/${id}`, {\n method: \"PATCH\",\n headers: this.headers(true),\n body: JSON.stringify({ title, walletAddress }),\n });\n }\n\n async deleteConversation(\n id: string,\n walletAddress: string\n ): Promise<void> {\n await fetch(\n `${this.baseUrl}/conversations/${id}?walletAddress=${encodeURIComponent(walletAddress)}`,\n { method: \"DELETE\", headers: this.headers() }\n );\n }\n\n // ===== Tools =====\n async listTools(): Promise<ToolDefinitionInfo[]> {\n const res = await fetch(`${this.baseUrl}/tools/list`, {\n headers: this.headers(),\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { tools?: ToolDefinitionInfo[] };\n return data.tools || [];\n }\n\n async callTool(\n name: string,\n params: Record<string, unknown>\n ): Promise<ToolResult> {\n const res = await fetch(`${this.baseUrl}/tools/call`, {\n method: \"POST\",\n headers: this.headers(true),\n body: JSON.stringify({ tool: name, params }),\n });\n return res.json();\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
interface WalletContext {
|
|
2
|
+
ethereum?: string;
|
|
3
|
+
solana?: string;
|
|
4
|
+
bitcoin?: string;
|
|
5
|
+
icp?: string;
|
|
6
|
+
}
|
|
7
|
+
interface CandleData {
|
|
8
|
+
time: number;
|
|
9
|
+
open: number;
|
|
10
|
+
high: number;
|
|
11
|
+
low: number;
|
|
12
|
+
close: number;
|
|
13
|
+
volume: number;
|
|
14
|
+
}
|
|
15
|
+
interface ChartData {
|
|
16
|
+
coin: string;
|
|
17
|
+
interval: string;
|
|
18
|
+
data: CandleData[];
|
|
19
|
+
}
|
|
20
|
+
interface UnsignedTransaction {
|
|
21
|
+
chain: string;
|
|
22
|
+
type?: "transfer" | "swap";
|
|
23
|
+
to: string;
|
|
24
|
+
from?: string;
|
|
25
|
+
amount: string;
|
|
26
|
+
symbol?: string;
|
|
27
|
+
estimatedFee?: string;
|
|
28
|
+
platformFee?: string;
|
|
29
|
+
value?: string;
|
|
30
|
+
gas?: string;
|
|
31
|
+
gasPrice?: string;
|
|
32
|
+
nonce?: number;
|
|
33
|
+
chainId?: number;
|
|
34
|
+
data?: string;
|
|
35
|
+
serializedTransaction?: string;
|
|
36
|
+
}
|
|
37
|
+
interface HyperliquidSignRequest {
|
|
38
|
+
requestId: string;
|
|
39
|
+
action: string;
|
|
40
|
+
coin: string;
|
|
41
|
+
side?: string;
|
|
42
|
+
size?: string;
|
|
43
|
+
price?: string;
|
|
44
|
+
orderType?: string;
|
|
45
|
+
leverage?: string;
|
|
46
|
+
typedData: {
|
|
47
|
+
domain: Record<string, unknown>;
|
|
48
|
+
types: Record<string, unknown>;
|
|
49
|
+
primaryType: string;
|
|
50
|
+
message: Record<string, unknown>;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
interface HyperliquidDepositRequest {
|
|
54
|
+
address: string;
|
|
55
|
+
amount: string;
|
|
56
|
+
amountRaw: string;
|
|
57
|
+
usdcAddress: string;
|
|
58
|
+
bridgeAddress: string;
|
|
59
|
+
chainId: number;
|
|
60
|
+
}
|
|
61
|
+
interface OnrampRequest {
|
|
62
|
+
url: string;
|
|
63
|
+
}
|
|
64
|
+
interface ToolCallInfo {
|
|
65
|
+
tool: string;
|
|
66
|
+
params: Record<string, unknown>;
|
|
67
|
+
status: "running" | "done";
|
|
68
|
+
}
|
|
69
|
+
interface Message {
|
|
70
|
+
id: string;
|
|
71
|
+
role: "user" | "assistant";
|
|
72
|
+
content: string;
|
|
73
|
+
toolCalls?: ToolCallInfo[];
|
|
74
|
+
transaction?: UnsignedTransaction;
|
|
75
|
+
chartData?: ChartData;
|
|
76
|
+
signRequest?: HyperliquidSignRequest;
|
|
77
|
+
depositRequest?: HyperliquidDepositRequest;
|
|
78
|
+
onrampRequest?: OnrampRequest;
|
|
79
|
+
timestamp: number;
|
|
80
|
+
}
|
|
81
|
+
interface ConversationSummary {
|
|
82
|
+
id: string;
|
|
83
|
+
title: string | null;
|
|
84
|
+
createdAt: string;
|
|
85
|
+
updatedAt: string;
|
|
86
|
+
}
|
|
87
|
+
interface ConversationMessage {
|
|
88
|
+
id: string;
|
|
89
|
+
role: string;
|
|
90
|
+
content: string;
|
|
91
|
+
createdAt: string;
|
|
92
|
+
}
|
|
93
|
+
interface ChatResponse {
|
|
94
|
+
conversationId: string;
|
|
95
|
+
response: string;
|
|
96
|
+
toolCalls?: Array<{
|
|
97
|
+
name: string;
|
|
98
|
+
input: Record<string, unknown>;
|
|
99
|
+
result: unknown;
|
|
100
|
+
}>;
|
|
101
|
+
}
|
|
102
|
+
interface ToolDefinitionInfo {
|
|
103
|
+
name: string;
|
|
104
|
+
description: string;
|
|
105
|
+
parameters: {
|
|
106
|
+
type: "object";
|
|
107
|
+
properties: Record<string, unknown>;
|
|
108
|
+
required: string[];
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
interface ToolResult {
|
|
112
|
+
success: boolean;
|
|
113
|
+
data?: unknown;
|
|
114
|
+
error?: string;
|
|
115
|
+
}
|
|
116
|
+
interface ClientConfig {
|
|
117
|
+
apiKey: string;
|
|
118
|
+
baseUrl?: string;
|
|
119
|
+
}
|
|
120
|
+
interface ChatOptions {
|
|
121
|
+
conversationId?: string;
|
|
122
|
+
walletContext?: WalletContext;
|
|
123
|
+
walletAddress?: string;
|
|
124
|
+
}
|
|
125
|
+
interface StreamCallbacks {
|
|
126
|
+
onText?: (text: string) => void;
|
|
127
|
+
onToolCall?: (name: string, input: Record<string, unknown>) => void;
|
|
128
|
+
onToolDone?: (name: string, success: boolean) => void;
|
|
129
|
+
onTransaction?: (tx: UnsignedTransaction) => void;
|
|
130
|
+
onChart?: (chart: ChartData) => void;
|
|
131
|
+
onSignRequest?: (req: HyperliquidSignRequest) => void;
|
|
132
|
+
onDepositRequest?: (req: HyperliquidDepositRequest) => void;
|
|
133
|
+
onOnrampRequest?: (req: OnrampRequest) => void;
|
|
134
|
+
onError?: (error: string) => void;
|
|
135
|
+
onDone?: (data: {
|
|
136
|
+
conversationId: string;
|
|
137
|
+
toolCalls?: unknown[];
|
|
138
|
+
}) => void;
|
|
139
|
+
}
|
|
140
|
+
type SSEEventType = "text" | "tool_call" | "tool_done" | "transaction" | "chart" | "sign_typed_data" | "hl_deposit" | "moonpay_onramp" | "error" | "done";
|
|
141
|
+
|
|
142
|
+
declare class ChainAIClient {
|
|
143
|
+
private apiKey;
|
|
144
|
+
private baseUrl;
|
|
145
|
+
constructor(config: ClientConfig);
|
|
146
|
+
private headers;
|
|
147
|
+
chat(message: string, options?: ChatOptions): Promise<ChatResponse>;
|
|
148
|
+
chatStream(message: string, options?: ChatOptions, callbacks?: StreamCallbacks): Promise<{
|
|
149
|
+
abort: () => void;
|
|
150
|
+
}>;
|
|
151
|
+
getConversations(walletAddress: string): Promise<ConversationSummary[]>;
|
|
152
|
+
getMessages(conversationId: string): Promise<ConversationMessage[]>;
|
|
153
|
+
renameConversation(id: string, title: string, walletAddress: string): Promise<void>;
|
|
154
|
+
deleteConversation(id: string, walletAddress: string): Promise<void>;
|
|
155
|
+
listTools(): Promise<ToolDefinitionInfo[]>;
|
|
156
|
+
callTool(name: string, params: Record<string, unknown>): Promise<ToolResult>;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
interface SSEEvent {
|
|
160
|
+
event: SSEEventType;
|
|
161
|
+
data: string;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Parses an SSE response body into a stream of typed events.
|
|
165
|
+
* Uses the same buffer-splitting approach as the frontend's streamChat.
|
|
166
|
+
*/
|
|
167
|
+
declare function parseSSEStream(body: ReadableStream<Uint8Array>): AsyncGenerator<SSEEvent>;
|
|
168
|
+
/**
|
|
169
|
+
* Dispatches SSE events to the appropriate callbacks.
|
|
170
|
+
*/
|
|
171
|
+
declare function dispatchSSEEvent(event: SSEEvent, callbacks: StreamCallbacks): void;
|
|
172
|
+
|
|
173
|
+
export { type CandleData, ChainAIClient, type ChartData, type ChatOptions, type ChatResponse, type ClientConfig, type ConversationMessage, type ConversationSummary, type HyperliquidDepositRequest, type HyperliquidSignRequest, type Message, type OnrampRequest, type SSEEvent, type SSEEventType, type StreamCallbacks, type ToolCallInfo, type ToolDefinitionInfo, type ToolResult, type UnsignedTransaction, type WalletContext, dispatchSSEEvent, parseSSEStream };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,173 @@
|
|
|
1
|
+
interface WalletContext {
|
|
2
|
+
ethereum?: string;
|
|
3
|
+
solana?: string;
|
|
4
|
+
bitcoin?: string;
|
|
5
|
+
icp?: string;
|
|
6
|
+
}
|
|
7
|
+
interface CandleData {
|
|
8
|
+
time: number;
|
|
9
|
+
open: number;
|
|
10
|
+
high: number;
|
|
11
|
+
low: number;
|
|
12
|
+
close: number;
|
|
13
|
+
volume: number;
|
|
14
|
+
}
|
|
15
|
+
interface ChartData {
|
|
16
|
+
coin: string;
|
|
17
|
+
interval: string;
|
|
18
|
+
data: CandleData[];
|
|
19
|
+
}
|
|
20
|
+
interface UnsignedTransaction {
|
|
21
|
+
chain: string;
|
|
22
|
+
type?: "transfer" | "swap";
|
|
23
|
+
to: string;
|
|
24
|
+
from?: string;
|
|
25
|
+
amount: string;
|
|
26
|
+
symbol?: string;
|
|
27
|
+
estimatedFee?: string;
|
|
28
|
+
platformFee?: string;
|
|
29
|
+
value?: string;
|
|
30
|
+
gas?: string;
|
|
31
|
+
gasPrice?: string;
|
|
32
|
+
nonce?: number;
|
|
33
|
+
chainId?: number;
|
|
34
|
+
data?: string;
|
|
35
|
+
serializedTransaction?: string;
|
|
36
|
+
}
|
|
37
|
+
interface HyperliquidSignRequest {
|
|
38
|
+
requestId: string;
|
|
39
|
+
action: string;
|
|
40
|
+
coin: string;
|
|
41
|
+
side?: string;
|
|
42
|
+
size?: string;
|
|
43
|
+
price?: string;
|
|
44
|
+
orderType?: string;
|
|
45
|
+
leverage?: string;
|
|
46
|
+
typedData: {
|
|
47
|
+
domain: Record<string, unknown>;
|
|
48
|
+
types: Record<string, unknown>;
|
|
49
|
+
primaryType: string;
|
|
50
|
+
message: Record<string, unknown>;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
interface HyperliquidDepositRequest {
|
|
54
|
+
address: string;
|
|
55
|
+
amount: string;
|
|
56
|
+
amountRaw: string;
|
|
57
|
+
usdcAddress: string;
|
|
58
|
+
bridgeAddress: string;
|
|
59
|
+
chainId: number;
|
|
60
|
+
}
|
|
61
|
+
interface OnrampRequest {
|
|
62
|
+
url: string;
|
|
63
|
+
}
|
|
64
|
+
interface ToolCallInfo {
|
|
65
|
+
tool: string;
|
|
66
|
+
params: Record<string, unknown>;
|
|
67
|
+
status: "running" | "done";
|
|
68
|
+
}
|
|
69
|
+
interface Message {
|
|
70
|
+
id: string;
|
|
71
|
+
role: "user" | "assistant";
|
|
72
|
+
content: string;
|
|
73
|
+
toolCalls?: ToolCallInfo[];
|
|
74
|
+
transaction?: UnsignedTransaction;
|
|
75
|
+
chartData?: ChartData;
|
|
76
|
+
signRequest?: HyperliquidSignRequest;
|
|
77
|
+
depositRequest?: HyperliquidDepositRequest;
|
|
78
|
+
onrampRequest?: OnrampRequest;
|
|
79
|
+
timestamp: number;
|
|
80
|
+
}
|
|
81
|
+
interface ConversationSummary {
|
|
82
|
+
id: string;
|
|
83
|
+
title: string | null;
|
|
84
|
+
createdAt: string;
|
|
85
|
+
updatedAt: string;
|
|
86
|
+
}
|
|
87
|
+
interface ConversationMessage {
|
|
88
|
+
id: string;
|
|
89
|
+
role: string;
|
|
90
|
+
content: string;
|
|
91
|
+
createdAt: string;
|
|
92
|
+
}
|
|
93
|
+
interface ChatResponse {
|
|
94
|
+
conversationId: string;
|
|
95
|
+
response: string;
|
|
96
|
+
toolCalls?: Array<{
|
|
97
|
+
name: string;
|
|
98
|
+
input: Record<string, unknown>;
|
|
99
|
+
result: unknown;
|
|
100
|
+
}>;
|
|
101
|
+
}
|
|
102
|
+
interface ToolDefinitionInfo {
|
|
103
|
+
name: string;
|
|
104
|
+
description: string;
|
|
105
|
+
parameters: {
|
|
106
|
+
type: "object";
|
|
107
|
+
properties: Record<string, unknown>;
|
|
108
|
+
required: string[];
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
interface ToolResult {
|
|
112
|
+
success: boolean;
|
|
113
|
+
data?: unknown;
|
|
114
|
+
error?: string;
|
|
115
|
+
}
|
|
116
|
+
interface ClientConfig {
|
|
117
|
+
apiKey: string;
|
|
118
|
+
baseUrl?: string;
|
|
119
|
+
}
|
|
120
|
+
interface ChatOptions {
|
|
121
|
+
conversationId?: string;
|
|
122
|
+
walletContext?: WalletContext;
|
|
123
|
+
walletAddress?: string;
|
|
124
|
+
}
|
|
125
|
+
interface StreamCallbacks {
|
|
126
|
+
onText?: (text: string) => void;
|
|
127
|
+
onToolCall?: (name: string, input: Record<string, unknown>) => void;
|
|
128
|
+
onToolDone?: (name: string, success: boolean) => void;
|
|
129
|
+
onTransaction?: (tx: UnsignedTransaction) => void;
|
|
130
|
+
onChart?: (chart: ChartData) => void;
|
|
131
|
+
onSignRequest?: (req: HyperliquidSignRequest) => void;
|
|
132
|
+
onDepositRequest?: (req: HyperliquidDepositRequest) => void;
|
|
133
|
+
onOnrampRequest?: (req: OnrampRequest) => void;
|
|
134
|
+
onError?: (error: string) => void;
|
|
135
|
+
onDone?: (data: {
|
|
136
|
+
conversationId: string;
|
|
137
|
+
toolCalls?: unknown[];
|
|
138
|
+
}) => void;
|
|
139
|
+
}
|
|
140
|
+
type SSEEventType = "text" | "tool_call" | "tool_done" | "transaction" | "chart" | "sign_typed_data" | "hl_deposit" | "moonpay_onramp" | "error" | "done";
|
|
141
|
+
|
|
142
|
+
declare class ChainAIClient {
|
|
143
|
+
private apiKey;
|
|
144
|
+
private baseUrl;
|
|
145
|
+
constructor(config: ClientConfig);
|
|
146
|
+
private headers;
|
|
147
|
+
chat(message: string, options?: ChatOptions): Promise<ChatResponse>;
|
|
148
|
+
chatStream(message: string, options?: ChatOptions, callbacks?: StreamCallbacks): Promise<{
|
|
149
|
+
abort: () => void;
|
|
150
|
+
}>;
|
|
151
|
+
getConversations(walletAddress: string): Promise<ConversationSummary[]>;
|
|
152
|
+
getMessages(conversationId: string): Promise<ConversationMessage[]>;
|
|
153
|
+
renameConversation(id: string, title: string, walletAddress: string): Promise<void>;
|
|
154
|
+
deleteConversation(id: string, walletAddress: string): Promise<void>;
|
|
155
|
+
listTools(): Promise<ToolDefinitionInfo[]>;
|
|
156
|
+
callTool(name: string, params: Record<string, unknown>): Promise<ToolResult>;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
interface SSEEvent {
|
|
160
|
+
event: SSEEventType;
|
|
161
|
+
data: string;
|
|
162
|
+
}
|
|
1
163
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Natural language blockchain assistant powered by the Internet Computer
|
|
164
|
+
* Parses an SSE response body into a stream of typed events.
|
|
165
|
+
* Uses the same buffer-splitting approach as the frontend's streamChat.
|
|
5
166
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
167
|
+
declare function parseSSEStream(body: ReadableStream<Uint8Array>): AsyncGenerator<SSEEvent>;
|
|
168
|
+
/**
|
|
169
|
+
* Dispatches SSE events to the appropriate callbacks.
|
|
170
|
+
*/
|
|
171
|
+
declare function dispatchSSEEvent(event: SSEEvent, callbacks: StreamCallbacks): void;
|
|
172
|
+
|
|
173
|
+
export { type CandleData, ChainAIClient, type ChartData, type ChatOptions, type ChatResponse, type ClientConfig, type ConversationMessage, type ConversationSummary, type HyperliquidDepositRequest, type HyperliquidSignRequest, type Message, type OnrampRequest, type SSEEvent, type SSEEventType, type StreamCallbacks, type ToolCallInfo, type ToolDefinitionInfo, type ToolResult, type UnsignedTransaction, type WalletContext, dispatchSSEEvent, parseSSEStream };
|