convo-ai-sdk 1.0.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 +114 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +298 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.js +1 -0
- package/package.json +34 -0
package/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# convo-ai-sdk
|
|
2
|
+
|
|
3
|
+
This SDK provides a client for interacting with the Convo AI chat service, enabling real-time conversational AI experiences in your applications.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
To install dependencies:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
bun install
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
### Initialization
|
|
16
|
+
|
|
17
|
+
First, import the `ChatClient` and initialize it with your `ClientOptions`. You can provide either an `apiKey` for production or a `testAgentId` for development.
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { ChatClient } from './src/index'; // Adjust path as needed
|
|
21
|
+
|
|
22
|
+
const chatClient = new ChatClient({
|
|
23
|
+
apiKey: 'YOUR_API_KEY', // Or testAgentId: 'YOUR_TEST_AGENT_ID'
|
|
24
|
+
identifier: 'user-123', // Optional: A unique identifier for the user
|
|
25
|
+
dynamicVariables: {
|
|
26
|
+
userName: 'John Doe',
|
|
27
|
+
// ... other dynamic variables
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Connecting to the Chat Service
|
|
33
|
+
|
|
34
|
+
Connect to the chat service. If you have an existing `sessionToken`, you can pass it to `connect` to resume a conversation.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
await chatClient.connect();
|
|
38
|
+
// Or to resume a session:
|
|
39
|
+
// await chatClient.connect('YOUR_SESSION_TOKEN');
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Sending Messages
|
|
43
|
+
|
|
44
|
+
Send messages to the chat service using the `sendMessage` method.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
await chatClient.sendMessage('Hello, how are you?');
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Handling Events
|
|
51
|
+
|
|
52
|
+
The `ChatClient` emits various events that you can listen to:
|
|
53
|
+
|
|
54
|
+
- `statusChange`: Notifies when the connection status changes (`disconnected`, `connecting`, `connected`, `error`).
|
|
55
|
+
- `message`: Emitted for every new message (user, assistant, system, tool).
|
|
56
|
+
- `messageStart`: When a new assistant message starts streaming.
|
|
57
|
+
- `messageData`: For streaming chunks of assistant message content.
|
|
58
|
+
- `messageDone`: When an assistant message has finished streaming.
|
|
59
|
+
- `toolCall`: When the assistant requests a tool to be called.
|
|
60
|
+
- `thought`: When the assistant provides a thought process.
|
|
61
|
+
- `historyLoaded`: When conversation history is loaded.
|
|
62
|
+
- `configLoaded`: When chat configuration is loaded.
|
|
63
|
+
- `reset`: When the chat is reset.
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
chatClient.on('statusChange', (status) => {
|
|
67
|
+
console.log('Connection status:', status);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
chatClient.on('message', (message) => {
|
|
71
|
+
console.log('New message:', message);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
chatClient.on('messageData', (chunk) => {
|
|
75
|
+
process.stdout.write(chunk); // For streaming output
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
chatClient.on('toolCall', (toolCall) => {
|
|
79
|
+
console.log('Tool call requested:', toolCall);
|
|
80
|
+
// Implement logic to execute the tool and send the result
|
|
81
|
+
// chatClient.sendToolResult(toolCall.id, toolCall.name, 'Tool execution result');
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Sending Tool Results
|
|
86
|
+
|
|
87
|
+
If the AI requests a tool call, you can execute the tool and send its result back to the chat service using `sendToolResult`.
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// Example of handling a tool call
|
|
91
|
+
chatClient.on('toolCall', async (toolCall) => {
|
|
92
|
+
console.log('Tool call requested:', toolCall);
|
|
93
|
+
// Simulate tool execution
|
|
94
|
+
const toolResult = `Executed tool ${toolCall.name} with args ${JSON.stringify(toolCall.args)}`;
|
|
95
|
+
await chatClient.sendToolResult(toolCall.id, toolCall.name, toolResult);
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Disconnecting and Resetting
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
chatClient.disconnect();
|
|
103
|
+
chatClient.resetChat(); // Disconnects, clears messages, and reconnects
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Building the SDK
|
|
107
|
+
|
|
108
|
+
To build the TypeScript source files into JavaScript:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
bun run build
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
This project was created using `bun init` in bun v1.2.16. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ConnectionStatus, ChatMessage, ChatConfig, ClientOptions, ChatEvent } from './types';
|
|
2
|
+
export declare class ChatClient {
|
|
3
|
+
private options;
|
|
4
|
+
private listeners;
|
|
5
|
+
status: ConnectionStatus;
|
|
6
|
+
messages: ChatMessage[];
|
|
7
|
+
config: Partial<ChatConfig>;
|
|
8
|
+
constructor(options: ClientOptions);
|
|
9
|
+
private _emit;
|
|
10
|
+
private _setStatus;
|
|
11
|
+
private _addMessage;
|
|
12
|
+
private _loadGreeting;
|
|
13
|
+
private _loadHistory;
|
|
14
|
+
on<T>(event: ChatEvent, callback: (data: T) => void): void;
|
|
15
|
+
connect(sessionToken?: string): Promise<void>;
|
|
16
|
+
sendToolResult(toolCallId: string, toolCallName: any, result: any): Promise<void>;
|
|
17
|
+
sendMessage(text: string): Promise<void>;
|
|
18
|
+
sendStreamMessage(message: ChatMessage): Promise<void>;
|
|
19
|
+
disconnect(): void;
|
|
20
|
+
resetChat(): Promise<void>;
|
|
21
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
const DEFAULT_HTTP_ENDPOINT = 'https://wzy5woofwf.execute-api.eu-west-1.amazonaws.com/Prod';
|
|
2
|
+
export class ChatClient {
|
|
3
|
+
options;
|
|
4
|
+
listeners = {};
|
|
5
|
+
status = 'disconnected';
|
|
6
|
+
messages = [];
|
|
7
|
+
config = {};
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = {
|
|
10
|
+
apiKey: options.apiKey || '',
|
|
11
|
+
testAgentId: options.testAgentId || '',
|
|
12
|
+
identifier: options.identifier || '',
|
|
13
|
+
dynamicVariables: options.dynamicVariables || {},
|
|
14
|
+
httpApiEndpoint: options.httpApiEndpoint || DEFAULT_HTTP_ENDPOINT
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
_emit(event, data) {
|
|
18
|
+
if (this.listeners[event]) {
|
|
19
|
+
this.listeners[event]?.forEach(callback => callback(data));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
_setStatus(newStatus) {
|
|
23
|
+
this.status = newStatus;
|
|
24
|
+
this._emit('statusChange', this.status);
|
|
25
|
+
}
|
|
26
|
+
_addMessage(message) {
|
|
27
|
+
this.messages.push(message);
|
|
28
|
+
}
|
|
29
|
+
async _loadGreeting(wlcMsg, emit = true) {
|
|
30
|
+
if (wlcMsg) {
|
|
31
|
+
const welcomeMessage = {
|
|
32
|
+
id: 'system-welcome',
|
|
33
|
+
data: { content: wlcMsg },
|
|
34
|
+
from: 'system',
|
|
35
|
+
timestamp: Date.now(),
|
|
36
|
+
};
|
|
37
|
+
this._addMessage(welcomeMessage);
|
|
38
|
+
if (emit) {
|
|
39
|
+
this._emit('message', welcomeMessage);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async _loadHistory(conversationId, sessionToken) {
|
|
44
|
+
try {
|
|
45
|
+
const response = await fetch(`${this.options.httpApiEndpoint}/conversations/${conversationId}/history`, {
|
|
46
|
+
method: 'GET',
|
|
47
|
+
headers: {
|
|
48
|
+
'Content-Type': 'application/json',
|
|
49
|
+
'Authorization': `Bearer ${sessionToken}`
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
if (response.status === 403) {
|
|
53
|
+
this.resetChat();
|
|
54
|
+
console.warn('Chat SDK Warning: Access forbidden, resetting chat.');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
console.error('Chat SDK Error: Failed to fetch history, status:', response.status);
|
|
59
|
+
throw new Error('Failed to fetch history');
|
|
60
|
+
}
|
|
61
|
+
const history = await response.json();
|
|
62
|
+
history.forEach((msg) => {
|
|
63
|
+
const chatMessage = {
|
|
64
|
+
id: msg.messageId,
|
|
65
|
+
data: msg.data,
|
|
66
|
+
from: msg.senderType,
|
|
67
|
+
timestamp: msg.timestamp,
|
|
68
|
+
};
|
|
69
|
+
this._addMessage(chatMessage);
|
|
70
|
+
});
|
|
71
|
+
this._emit('historyLoaded', this.messages);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error('Chat SDK Error:', error);
|
|
75
|
+
this._setStatus('disconnected');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
on(event, callback) {
|
|
79
|
+
if (!this.listeners[event]) {
|
|
80
|
+
this.listeners[event] = [];
|
|
81
|
+
}
|
|
82
|
+
this.listeners[event]?.push(callback);
|
|
83
|
+
}
|
|
84
|
+
async connect(sessionToken) {
|
|
85
|
+
if (this.status === 'connected' || this.status === 'connecting') {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this._setStatus('connecting');
|
|
89
|
+
let sessionInitiated = false;
|
|
90
|
+
if (sessionToken) {
|
|
91
|
+
// we need to decode the session token and extract the necessary information
|
|
92
|
+
try {
|
|
93
|
+
const decodedToken = JSON.parse(atob(sessionToken.split('.')[1]));
|
|
94
|
+
this.config = {
|
|
95
|
+
sessionToken,
|
|
96
|
+
conversationId: decodedToken.conversationId,
|
|
97
|
+
streamApiEndpoint: decodedToken.streamApiEndpoint,
|
|
98
|
+
agentSettings: decodedToken.agentSettings || {},
|
|
99
|
+
};
|
|
100
|
+
if (!this.config.streamApiEndpoint) {
|
|
101
|
+
console.error('Chat SDK Error: Stream API endpoint not available in session token.');
|
|
102
|
+
this._setStatus('error');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error('Chat SDK Error: Invalid session token format.', error);
|
|
108
|
+
this._setStatus('error');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
sessionInitiated = false;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
try {
|
|
115
|
+
const headers = {
|
|
116
|
+
'Content-Type': 'application/json',
|
|
117
|
+
'x-identifier': this.options.identifier || '',
|
|
118
|
+
};
|
|
119
|
+
if (this.options.testAgentId) {
|
|
120
|
+
headers['x-test-agent-id'] = this.options.testAgentId;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
headers['x-api-key'] = this.options.apiKey;
|
|
124
|
+
}
|
|
125
|
+
const response = await fetch(`${this.options.httpApiEndpoint}/session/initiate`, {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers,
|
|
128
|
+
body: JSON.stringify({
|
|
129
|
+
dynamicVariables: this.options.dynamicVariables,
|
|
130
|
+
}),
|
|
131
|
+
});
|
|
132
|
+
if (!response.ok)
|
|
133
|
+
throw new Error('Failed to initiate session or fetch config');
|
|
134
|
+
const responseData = await response.json();
|
|
135
|
+
sessionToken = responseData.sessionToken;
|
|
136
|
+
this.config = {
|
|
137
|
+
sessionToken,
|
|
138
|
+
conversationId: responseData.conversationId,
|
|
139
|
+
streamApiEndpoint: responseData.streamApiEndpoint,
|
|
140
|
+
agentSettings: responseData.agentSettings,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.error('Chat SDK Error:', error);
|
|
145
|
+
this._setStatus('error');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
sessionInitiated = true;
|
|
149
|
+
}
|
|
150
|
+
this._emit('configLoaded', this.config);
|
|
151
|
+
const agentSettings = this.config.agentSettings || {};
|
|
152
|
+
const conversationId = this.config.conversationId || '';
|
|
153
|
+
if (!this.config.streamApiEndpoint) {
|
|
154
|
+
console.error('Chat SDK Error: Stream API endpoint not available.');
|
|
155
|
+
this._setStatus('error');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (agentSettings?.config?.showGreeting !== false) {
|
|
159
|
+
const welcomeMsg = agentSettings?.config?.greetingMessage || null;
|
|
160
|
+
if (welcomeMsg) {
|
|
161
|
+
await this._loadGreeting(welcomeMsg, !(sessionToken && conversationId && !sessionInitiated));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (sessionToken && conversationId && !sessionInitiated) {
|
|
165
|
+
await this._loadHistory(conversationId, sessionToken);
|
|
166
|
+
}
|
|
167
|
+
this._setStatus('connected');
|
|
168
|
+
}
|
|
169
|
+
async sendToolResult(toolCallId, toolCallName, result) {
|
|
170
|
+
if (this.status !== 'connected') {
|
|
171
|
+
console.error('Cannot send tool result, not connected.');
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const toolMessage = {
|
|
175
|
+
id: `tool-${Date.now()}`,
|
|
176
|
+
data: { toolCallId: toolCallId, toolCallName: toolCallName, content: result },
|
|
177
|
+
from: 'tool',
|
|
178
|
+
timestamp: Date.now(),
|
|
179
|
+
};
|
|
180
|
+
// this._addMessage(toolMessage);
|
|
181
|
+
// this._emit('message', toolMessage);
|
|
182
|
+
await this.sendStreamMessage(toolMessage);
|
|
183
|
+
}
|
|
184
|
+
async sendMessage(text) {
|
|
185
|
+
if (this.status !== 'connected') {
|
|
186
|
+
console.error('Cannot send message, not connected.');
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const userMessage = {
|
|
190
|
+
id: `local-${Date.now()}`,
|
|
191
|
+
data: { content: text },
|
|
192
|
+
from: 'user',
|
|
193
|
+
timestamp: Date.now(),
|
|
194
|
+
};
|
|
195
|
+
this._addMessage(userMessage);
|
|
196
|
+
this._emit('message', userMessage);
|
|
197
|
+
await this.sendStreamMessage(userMessage);
|
|
198
|
+
}
|
|
199
|
+
async sendStreamMessage(message) {
|
|
200
|
+
if (this.status !== 'connected') {
|
|
201
|
+
console.error('Cannot send stream message, not connected.');
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
let input = {
|
|
205
|
+
type: message.from,
|
|
206
|
+
content: message.data.content || '',
|
|
207
|
+
};
|
|
208
|
+
if (message.from === 'tool') {
|
|
209
|
+
input.toolCallId = message.data.toolCallId;
|
|
210
|
+
input.toolName = message.data.toolCallName;
|
|
211
|
+
}
|
|
212
|
+
const response = await fetch(this.config.streamApiEndpoint + 'conversation', {
|
|
213
|
+
method: 'POST',
|
|
214
|
+
headers: {
|
|
215
|
+
'Content-Type': 'application/json',
|
|
216
|
+
'Authorization': `Bearer ${this.config.sessionToken}`,
|
|
217
|
+
'Accept': 'text/event-stream'
|
|
218
|
+
},
|
|
219
|
+
body: JSON.stringify(input)
|
|
220
|
+
});
|
|
221
|
+
if (!response.ok) {
|
|
222
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
223
|
+
}
|
|
224
|
+
if (!response.body) {
|
|
225
|
+
throw new Error('Response body is null');
|
|
226
|
+
}
|
|
227
|
+
const reader = response.body.getReader();
|
|
228
|
+
const decoder = new TextDecoder('utf-8');
|
|
229
|
+
let buffer = '';
|
|
230
|
+
let currentMessage = null;
|
|
231
|
+
while (true) {
|
|
232
|
+
const { done, value } = await reader.read();
|
|
233
|
+
if (done) {
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
buffer += decoder.decode(value, { stream: true });
|
|
237
|
+
const lines = buffer.split('\n');
|
|
238
|
+
buffer = lines.pop() || '';
|
|
239
|
+
for (const line of lines) {
|
|
240
|
+
try {
|
|
241
|
+
if (line.startsWith('thought: ')) {
|
|
242
|
+
const data = JSON.parse(line.substring(9));
|
|
243
|
+
this._emit('thought', data);
|
|
244
|
+
}
|
|
245
|
+
else if (line.startsWith('start: ')) {
|
|
246
|
+
if (currentMessage) {
|
|
247
|
+
this._addMessage(currentMessage);
|
|
248
|
+
this._emit('messageDone', currentMessage);
|
|
249
|
+
}
|
|
250
|
+
const data = JSON.parse(line.substring(7));
|
|
251
|
+
currentMessage = {
|
|
252
|
+
id: data.messageId,
|
|
253
|
+
data: { content: '' },
|
|
254
|
+
from: 'assistant',
|
|
255
|
+
timestamp: data.timestamp || Date.now(),
|
|
256
|
+
};
|
|
257
|
+
this._emit('messageStart', currentMessage);
|
|
258
|
+
}
|
|
259
|
+
else if (line.startsWith('data: ') && currentMessage) {
|
|
260
|
+
const data = JSON.parse(line.substring(6));
|
|
261
|
+
currentMessage.data.content += data.p;
|
|
262
|
+
if (data.p) {
|
|
263
|
+
this._emit('messageData', data.p);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else if (line.startsWith('tool_call: ')) {
|
|
267
|
+
const data = JSON.parse(line.substring(11));
|
|
268
|
+
this._emit('toolCall', data);
|
|
269
|
+
}
|
|
270
|
+
else if (line.startsWith('error: ')) {
|
|
271
|
+
const error = JSON.parse(line.substring(7));
|
|
272
|
+
this._emit('messageError', error);
|
|
273
|
+
currentMessage = null;
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
else if (line.startsWith('done') && currentMessage) {
|
|
277
|
+
this._addMessage(currentMessage);
|
|
278
|
+
this._emit('messageDone', currentMessage);
|
|
279
|
+
currentMessage = null;
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch (e) {
|
|
284
|
+
console.warn('Could not parse event data as JSON:', line);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
disconnect() {
|
|
290
|
+
this._setStatus('disconnected');
|
|
291
|
+
}
|
|
292
|
+
async resetChat() {
|
|
293
|
+
this.disconnect();
|
|
294
|
+
this.messages = [];
|
|
295
|
+
this._emit('reset', null);
|
|
296
|
+
await this.connect();
|
|
297
|
+
}
|
|
298
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
|
|
2
|
+
export interface ChatMessage {
|
|
3
|
+
id: string | number;
|
|
4
|
+
data: any;
|
|
5
|
+
from: 'user' | 'assistant' | 'system' | 'tool';
|
|
6
|
+
timestamp: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ChatConfig {
|
|
9
|
+
conversationId: string;
|
|
10
|
+
sessionToken: string;
|
|
11
|
+
streamApiEndpoint: string;
|
|
12
|
+
agentSettings?: any;
|
|
13
|
+
}
|
|
14
|
+
export interface ClientOptions {
|
|
15
|
+
apiKey?: string;
|
|
16
|
+
testAgentId?: string;
|
|
17
|
+
httpApiEndpoint?: string;
|
|
18
|
+
identifier?: string;
|
|
19
|
+
dynamicVariables?: Record<string, any>;
|
|
20
|
+
}
|
|
21
|
+
export type ChatEvent = 'statusChange' | 'message' | 'configLoaded' | 'historyLoaded' | 'messageStart' | 'messageData' | 'messageDone' | 'messageError' | 'toolCall' | 'thought' | 'reset';
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "convo-ai-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"module": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [],
|
|
15
|
+
"author": "",
|
|
16
|
+
"license": "ISC",
|
|
17
|
+
"description": "SDK for Convo AI",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git@gitlab.dengun.org:convoai/convo-ai-sdk.git"
|
|
21
|
+
},
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"n": "^10.2.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/bun": "latest"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"typescript": "^5.8.3"
|
|
33
|
+
}
|
|
34
|
+
}
|