aieo 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +30 -1
- package/dist/index.d.ts +30 -1
- package/dist/index.js +95 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +92 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as ai from 'ai';
|
|
1
2
|
import { CoreMessage } from 'ai';
|
|
2
3
|
|
|
3
4
|
interface Conversation {
|
|
@@ -28,4 +29,32 @@ declare abstract class ConversationStorage {
|
|
|
28
29
|
protected generateSummary(content: string): string;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
type Provider = "anthropic" | "google" | "openai";
|
|
33
|
+
declare const PROVIDERS: Provider[];
|
|
34
|
+
declare function getModel(provider: Provider, apiKey: string): Promise<ai.LanguageModelV1>;
|
|
35
|
+
declare function getProviderOptions(provider: Provider): {
|
|
36
|
+
anthropic: {
|
|
37
|
+
thinking: {
|
|
38
|
+
type: "enabled";
|
|
39
|
+
budgetTokens: number;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
google?: undefined;
|
|
43
|
+
openai?: undefined;
|
|
44
|
+
} | {
|
|
45
|
+
google: {
|
|
46
|
+
thinkingConfig: {
|
|
47
|
+
thinkingBudget: number;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
anthropic?: undefined;
|
|
51
|
+
openai?: undefined;
|
|
52
|
+
} | {
|
|
53
|
+
openai: {};
|
|
54
|
+
anthropic?: undefined;
|
|
55
|
+
google?: undefined;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
declare function callModel(provider: Provider, apiKey: string, messages: CoreMessage[], parser?: (fullResponse: string) => void): Promise<string>;
|
|
59
|
+
|
|
60
|
+
export { type Conversation, type ConversationData, ConversationStorage, MAX_CONVERSATIONS, PROVIDERS, type Provider, callModel, getModel, getProviderOptions };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as ai from 'ai';
|
|
1
2
|
import { CoreMessage } from 'ai';
|
|
2
3
|
|
|
3
4
|
interface Conversation {
|
|
@@ -28,4 +29,32 @@ declare abstract class ConversationStorage {
|
|
|
28
29
|
protected generateSummary(content: string): string;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
type Provider = "anthropic" | "google" | "openai";
|
|
33
|
+
declare const PROVIDERS: Provider[];
|
|
34
|
+
declare function getModel(provider: Provider, apiKey: string): Promise<ai.LanguageModelV1>;
|
|
35
|
+
declare function getProviderOptions(provider: Provider): {
|
|
36
|
+
anthropic: {
|
|
37
|
+
thinking: {
|
|
38
|
+
type: "enabled";
|
|
39
|
+
budgetTokens: number;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
google?: undefined;
|
|
43
|
+
openai?: undefined;
|
|
44
|
+
} | {
|
|
45
|
+
google: {
|
|
46
|
+
thinkingConfig: {
|
|
47
|
+
thinkingBudget: number;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
anthropic?: undefined;
|
|
51
|
+
openai?: undefined;
|
|
52
|
+
} | {
|
|
53
|
+
openai: {};
|
|
54
|
+
anthropic?: undefined;
|
|
55
|
+
google?: undefined;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
declare function callModel(provider: Provider, apiKey: string, messages: CoreMessage[], parser?: (fullResponse: string) => void): Promise<string>;
|
|
59
|
+
|
|
60
|
+
export { type Conversation, type ConversationData, ConversationStorage, MAX_CONVERSATIONS, PROVIDERS, type Provider, callModel, getModel, getProviderOptions };
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
ConversationStorage: () => ConversationStorage,
|
|
24
|
-
MAX_CONVERSATIONS: () => MAX_CONVERSATIONS
|
|
24
|
+
MAX_CONVERSATIONS: () => MAX_CONVERSATIONS,
|
|
25
|
+
PROVIDERS: () => PROVIDERS,
|
|
26
|
+
callModel: () => callModel,
|
|
27
|
+
getModel: () => getModel,
|
|
28
|
+
getProviderOptions: () => getProviderOptions
|
|
25
29
|
});
|
|
26
30
|
module.exports = __toCommonJS(index_exports);
|
|
27
31
|
|
|
@@ -151,9 +155,98 @@ var ConversationStorage = class {
|
|
|
151
155
|
return summary;
|
|
152
156
|
}
|
|
153
157
|
};
|
|
158
|
+
|
|
159
|
+
// src/provider.ts
|
|
160
|
+
var import_anthropic = require("@ai-sdk/anthropic");
|
|
161
|
+
var import_google = require("@ai-sdk/google");
|
|
162
|
+
var import_openai = require("@ai-sdk/openai");
|
|
163
|
+
var PROVIDERS = ["anthropic", "google", "openai"];
|
|
164
|
+
var SOTA = {
|
|
165
|
+
anthropic: "claude-3-7-sonnet-20250219",
|
|
166
|
+
google: "gemini-2.5-pro-preview-05-06",
|
|
167
|
+
openai: "gpt-4.1"
|
|
168
|
+
};
|
|
169
|
+
async function getModel(provider, apiKey) {
|
|
170
|
+
switch (provider) {
|
|
171
|
+
case "anthropic":
|
|
172
|
+
const anthropic = (0, import_anthropic.createAnthropic)({
|
|
173
|
+
apiKey
|
|
174
|
+
});
|
|
175
|
+
return anthropic(SOTA[provider]);
|
|
176
|
+
case "google":
|
|
177
|
+
const google = (0, import_google.createGoogleGenerativeAI)({
|
|
178
|
+
apiKey
|
|
179
|
+
});
|
|
180
|
+
return google(SOTA[provider]);
|
|
181
|
+
case "openai":
|
|
182
|
+
const openai = (0, import_openai.createOpenAI)({
|
|
183
|
+
apiKey,
|
|
184
|
+
compatibility: "strict"
|
|
185
|
+
});
|
|
186
|
+
return openai(SOTA[provider]);
|
|
187
|
+
default:
|
|
188
|
+
throw new Error(`Unsupported provider: ${provider}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function getProviderOptions(provider) {
|
|
192
|
+
switch (provider) {
|
|
193
|
+
case "anthropic":
|
|
194
|
+
return {
|
|
195
|
+
anthropic: {
|
|
196
|
+
thinking: { type: "enabled", budgetTokens: 24e3 }
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
case "google":
|
|
200
|
+
return {
|
|
201
|
+
google: {
|
|
202
|
+
thinkingConfig: {
|
|
203
|
+
thinkingBudget: 16384
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
case "openai":
|
|
208
|
+
return {
|
|
209
|
+
openai: {}
|
|
210
|
+
};
|
|
211
|
+
default:
|
|
212
|
+
throw new Error(`Unsupported provider: ${provider}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// src/stream.ts
|
|
217
|
+
var import_ai = require("ai");
|
|
218
|
+
async function callModel(provider, apiKey, messages, parser) {
|
|
219
|
+
const model = await getModel(provider, apiKey);
|
|
220
|
+
const providerOptions = getProviderOptions(provider);
|
|
221
|
+
console.log(`Calling ${provider} with options:`, providerOptions);
|
|
222
|
+
const result = (0, import_ai.streamText)({
|
|
223
|
+
model,
|
|
224
|
+
messages,
|
|
225
|
+
temperature: 0,
|
|
226
|
+
providerOptions
|
|
227
|
+
});
|
|
228
|
+
let fullResponse = "";
|
|
229
|
+
for await (const part of result.fullStream) {
|
|
230
|
+
switch (part.type) {
|
|
231
|
+
case "error":
|
|
232
|
+
throw part.error;
|
|
233
|
+
case "text-delta":
|
|
234
|
+
if (parser) {
|
|
235
|
+
parser(part.textDelta);
|
|
236
|
+
}
|
|
237
|
+
fullResponse += part.textDelta;
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return fullResponse;
|
|
242
|
+
}
|
|
154
243
|
// Annotate the CommonJS export names for ESM import in node:
|
|
155
244
|
0 && (module.exports = {
|
|
156
245
|
ConversationStorage,
|
|
157
|
-
MAX_CONVERSATIONS
|
|
246
|
+
MAX_CONVERSATIONS,
|
|
247
|
+
PROVIDERS,
|
|
248
|
+
callModel,
|
|
249
|
+
getModel,
|
|
250
|
+
getProviderOptions
|
|
158
251
|
});
|
|
159
252
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../node_modules/uuid/dist/esm/stringify.js","../../node_modules/uuid/dist/esm/rng.js","../../node_modules/uuid/dist/esm/native.js","../../node_modules/uuid/dist/esm/v4.js","../src/store.ts"],"sourcesContent":["export * from \"./store\";\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n","import { randomUUID } from 'crypto';\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import { CoreMessage } from \"ai\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport interface Conversation {\n id: string;\n summary: string;\n timestamp: number;\n}\n\nexport interface ConversationData {\n id: string;\n summary: string;\n messages: CoreMessage[];\n lastUpdated: number;\n}\n\nexport const MAX_CONVERSATIONS = 100;\n\nexport abstract class ConversationStorage {\n // Abstract methods to be implemented by platform-specific storage\n abstract currentConversationId(): Promise<string>;\n abstract selectConversation(conversationId: string): Promise<void>;\n abstract listConversations(): Promise<Conversation[]>;\n abstract getConversation(\n conversationId: string\n ): Promise<ConversationData | null>;\n abstract storeConversationData(\n conversationId: string,\n data: ConversationData\n ): Promise<void>;\n abstract deleteConversationData(conversationId: string): Promise<boolean>;\n\n // Shared functionality that works across platforms\n async createConversation(messages: CoreMessage[]): Promise<ConversationData> {\n const id = uuidv4();\n const initialMessage = messages.find((msg) => msg.role === \"user\");\n const summary = initialMessage\n ? this.generateSummary(initialMessage.content as string)\n : `New conversation ${new Date().toLocaleString()}`;\n const conversation: ConversationData = {\n id,\n summary,\n messages,\n lastUpdated: Date.now(),\n };\n await this.storeConversationData(id, conversation);\n await this.selectConversation(id);\n await this.pruneOldConversations();\n return conversation;\n }\n\n async addMessageToConversation(\n conversationId: string,\n message: CoreMessage\n ): Promise<ConversationData> {\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new Error(`Conversation with ID ${conversationId} not found`);\n }\n conversation.messages.push({ ...message });\n conversation.lastUpdated = Date.now();\n await this.storeConversationData(conversationId, conversation);\n return conversation;\n }\n\n async getCurrentConversation(): Promise<ConversationData | null> {\n const currentId = await this.currentConversationId();\n if (!currentId) return null;\n return await this.getConversation(currentId);\n }\n\n async getLatestConversation(): Promise<ConversationData | null> {\n const convos = await this.listConversations();\n if (!convos.length) return null;\n // Sort by most recent first\n const sortedConvos = [...convos].sort((a, b) => b.timestamp - a.timestamp);\n return await this.getConversation(sortedConvos[0].id);\n }\n\n async updateConversationSummary(\n conversationId: string,\n summary: string\n ): Promise<ConversationData> {\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new Error(`Conversation with ID ${conversationId} not found`);\n }\n conversation.summary = summary;\n conversation.lastUpdated = Date.now();\n await this.storeConversationData(conversationId, conversation);\n return conversation;\n }\n\n private async pruneOldConversations(): Promise<void> {\n const conversations = await this.listConversations();\n if (conversations.length <= MAX_CONVERSATIONS) return;\n // Sort by timestamp (oldest first)\n const sortedConversations = [...conversations].sort(\n (a, b) => a.timestamp - b.timestamp\n );\n // Calculate how many need to be deleted\n const deleteCount = sortedConversations.length - MAX_CONVERSATIONS;\n // Get the conversations to delete (the oldest ones)\n const conversationsToDelete = sortedConversations.slice(0, deleteCount);\n // Delete each conversation\n for (const convo of conversationsToDelete) {\n await this.deleteConversationData(convo.id);\n }\n }\n\n protected generateSummary(content: string): string {\n let summary = content.split(\"\\n\")[0].trim();\n if (summary.length > 50) {\n summary = summary.substring(0, 47) + \"...\";\n } else if (summary.length === 0 && content.length > 0) {\n summary = content.substring(0, Math.min(50, content.length));\n if (summary.length === 50) summary = summary + \"...\";\n } else if (summary.length === 0) {\n summary = `Conversation created on ${new Date().toLocaleString()}`;\n }\n return summary;\n }\n}\n"],"mappings":"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","names":["import_crypto"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../node_modules/uuid/dist/esm/stringify.js","../../node_modules/uuid/dist/esm/rng.js","../../node_modules/uuid/dist/esm/native.js","../../node_modules/uuid/dist/esm/v4.js","../src/store.ts","../src/provider.ts","../src/stream.ts"],"sourcesContent":["export * from \"./store\";\nexport * from \"./provider\";\nexport * from \"./stream\";\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n","import { randomUUID } from 'crypto';\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import { CoreMessage } from \"ai\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport interface Conversation {\n id: string;\n summary: string;\n timestamp: number;\n}\n\nexport interface ConversationData {\n id: string;\n summary: string;\n messages: CoreMessage[];\n lastUpdated: number;\n}\n\nexport const MAX_CONVERSATIONS = 100;\n\nexport abstract class ConversationStorage {\n // Abstract methods to be implemented by platform-specific storage\n abstract currentConversationId(): Promise<string>;\n abstract selectConversation(conversationId: string): Promise<void>;\n abstract listConversations(): Promise<Conversation[]>;\n abstract getConversation(\n conversationId: string\n ): Promise<ConversationData | null>;\n abstract storeConversationData(\n conversationId: string,\n data: ConversationData\n ): Promise<void>;\n abstract deleteConversationData(conversationId: string): Promise<boolean>;\n\n // Shared functionality that works across platforms\n async createConversation(messages: CoreMessage[]): Promise<ConversationData> {\n const id = uuidv4();\n const initialMessage = messages.find((msg) => msg.role === \"user\");\n const summary = initialMessage\n ? this.generateSummary(initialMessage.content as string)\n : `New conversation ${new Date().toLocaleString()}`;\n const conversation: ConversationData = {\n id,\n summary,\n messages,\n lastUpdated: Date.now(),\n };\n await this.storeConversationData(id, conversation);\n await this.selectConversation(id);\n await this.pruneOldConversations();\n return conversation;\n }\n\n async addMessageToConversation(\n conversationId: string,\n message: CoreMessage\n ): Promise<ConversationData> {\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new Error(`Conversation with ID ${conversationId} not found`);\n }\n conversation.messages.push({ ...message });\n conversation.lastUpdated = Date.now();\n await this.storeConversationData(conversationId, conversation);\n return conversation;\n }\n\n async getCurrentConversation(): Promise<ConversationData | null> {\n const currentId = await this.currentConversationId();\n if (!currentId) return null;\n return await this.getConversation(currentId);\n }\n\n async getLatestConversation(): Promise<ConversationData | null> {\n const convos = await this.listConversations();\n if (!convos.length) return null;\n // Sort by most recent first\n const sortedConvos = [...convos].sort((a, b) => b.timestamp - a.timestamp);\n return await this.getConversation(sortedConvos[0].id);\n }\n\n async updateConversationSummary(\n conversationId: string,\n summary: string\n ): Promise<ConversationData> {\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new Error(`Conversation with ID ${conversationId} not found`);\n }\n conversation.summary = summary;\n conversation.lastUpdated = Date.now();\n await this.storeConversationData(conversationId, conversation);\n return conversation;\n }\n\n private async pruneOldConversations(): Promise<void> {\n const conversations = await this.listConversations();\n if (conversations.length <= MAX_CONVERSATIONS) return;\n // Sort by timestamp (oldest first)\n const sortedConversations = [...conversations].sort(\n (a, b) => a.timestamp - b.timestamp\n );\n // Calculate how many need to be deleted\n const deleteCount = sortedConversations.length - MAX_CONVERSATIONS;\n // Get the conversations to delete (the oldest ones)\n const conversationsToDelete = sortedConversations.slice(0, deleteCount);\n // Delete each conversation\n for (const convo of conversationsToDelete) {\n await this.deleteConversationData(convo.id);\n }\n }\n\n protected generateSummary(content: string): string {\n let summary = content.split(\"\\n\")[0].trim();\n if (summary.length > 50) {\n summary = summary.substring(0, 47) + \"...\";\n } else if (summary.length === 0 && content.length > 0) {\n summary = content.substring(0, Math.min(50, content.length));\n if (summary.length === 50) summary = summary + \"...\";\n } else if (summary.length === 0) {\n summary = `Conversation created on ${new Date().toLocaleString()}`;\n }\n return summary;\n }\n}\n","import { CoreMessage, streamText } from \"ai\";\nimport { createAnthropic, AnthropicProviderOptions } from \"@ai-sdk/anthropic\";\nimport {\n createGoogleGenerativeAI,\n GoogleGenerativeAIProviderOptions,\n} from \"@ai-sdk/google\";\nimport { createOpenAI, OpenAIResponsesProviderOptions } from \"@ai-sdk/openai\";\n\nexport type Provider = \"anthropic\" | \"google\" | \"openai\";\n\nexport const PROVIDERS: Provider[] = [\"anthropic\", \"google\", \"openai\"];\n\nconst SOTA = {\n anthropic: \"claude-3-7-sonnet-20250219\",\n google: \"gemini-2.5-pro-preview-05-06\",\n openai: \"gpt-4.1\",\n};\n\nexport async function getModel(provider: Provider, apiKey: string) {\n switch (provider) {\n case \"anthropic\":\n const anthropic = createAnthropic({\n apiKey,\n });\n return anthropic(SOTA[provider]);\n case \"google\":\n const google = createGoogleGenerativeAI({\n apiKey,\n });\n return google(SOTA[provider]);\n case \"openai\":\n const openai = createOpenAI({\n apiKey,\n compatibility: \"strict\",\n });\n return openai(SOTA[provider]);\n default:\n throw new Error(`Unsupported provider: ${provider}`);\n }\n}\n\nexport function getProviderOptions(provider: Provider) {\n switch (provider) {\n case \"anthropic\":\n return {\n anthropic: {\n thinking: { type: \"enabled\", budgetTokens: 24000 },\n } satisfies AnthropicProviderOptions,\n };\n case \"google\":\n return {\n google: {\n thinkingConfig: {\n thinkingBudget: 16384,\n },\n } satisfies GoogleGenerativeAIProviderOptions,\n };\n case \"openai\":\n return {\n openai: {} satisfies OpenAIResponsesProviderOptions,\n };\n default:\n throw new Error(`Unsupported provider: ${provider}`);\n }\n}\n","import { CoreMessage, streamText } from \"ai\";\nimport { Provider, getModel, getProviderOptions } from \"./provider\";\n\nexport async function callModel(\n provider: Provider,\n apiKey: string,\n messages: CoreMessage[],\n parser?: (fullResponse: string) => void\n): Promise<string> {\n const model = await getModel(provider, apiKey);\n const providerOptions = getProviderOptions(provider);\n console.log(`Calling ${provider} with options:`, providerOptions);\n const result = streamText({\n model,\n messages,\n temperature: 0,\n providerOptions: providerOptions as any,\n });\n let fullResponse = \"\";\n for await (const part of result.fullStream) {\n switch (part.type) {\n case \"error\":\n throw part.error;\n case \"text-delta\":\n if (parser) {\n parser(part.textDelta);\n }\n fullResponse += part.textDelta;\n break;\n }\n }\n return fullResponse;\n}\n"],"mappings":"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","names":["import_crypto"]}
|
package/dist/index.mjs
CHANGED
|
@@ -124,8 +124,99 @@ var ConversationStorage = class {
|
|
|
124
124
|
return summary;
|
|
125
125
|
}
|
|
126
126
|
};
|
|
127
|
+
|
|
128
|
+
// src/provider.ts
|
|
129
|
+
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
130
|
+
import {
|
|
131
|
+
createGoogleGenerativeAI
|
|
132
|
+
} from "@ai-sdk/google";
|
|
133
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
134
|
+
var PROVIDERS = ["anthropic", "google", "openai"];
|
|
135
|
+
var SOTA = {
|
|
136
|
+
anthropic: "claude-3-7-sonnet-20250219",
|
|
137
|
+
google: "gemini-2.5-pro-preview-05-06",
|
|
138
|
+
openai: "gpt-4.1"
|
|
139
|
+
};
|
|
140
|
+
async function getModel(provider, apiKey) {
|
|
141
|
+
switch (provider) {
|
|
142
|
+
case "anthropic":
|
|
143
|
+
const anthropic = createAnthropic({
|
|
144
|
+
apiKey
|
|
145
|
+
});
|
|
146
|
+
return anthropic(SOTA[provider]);
|
|
147
|
+
case "google":
|
|
148
|
+
const google = createGoogleGenerativeAI({
|
|
149
|
+
apiKey
|
|
150
|
+
});
|
|
151
|
+
return google(SOTA[provider]);
|
|
152
|
+
case "openai":
|
|
153
|
+
const openai = createOpenAI({
|
|
154
|
+
apiKey,
|
|
155
|
+
compatibility: "strict"
|
|
156
|
+
});
|
|
157
|
+
return openai(SOTA[provider]);
|
|
158
|
+
default:
|
|
159
|
+
throw new Error(`Unsupported provider: ${provider}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function getProviderOptions(provider) {
|
|
163
|
+
switch (provider) {
|
|
164
|
+
case "anthropic":
|
|
165
|
+
return {
|
|
166
|
+
anthropic: {
|
|
167
|
+
thinking: { type: "enabled", budgetTokens: 24e3 }
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
case "google":
|
|
171
|
+
return {
|
|
172
|
+
google: {
|
|
173
|
+
thinkingConfig: {
|
|
174
|
+
thinkingBudget: 16384
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
case "openai":
|
|
179
|
+
return {
|
|
180
|
+
openai: {}
|
|
181
|
+
};
|
|
182
|
+
default:
|
|
183
|
+
throw new Error(`Unsupported provider: ${provider}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// src/stream.ts
|
|
188
|
+
import { streamText } from "ai";
|
|
189
|
+
async function callModel(provider, apiKey, messages, parser) {
|
|
190
|
+
const model = await getModel(provider, apiKey);
|
|
191
|
+
const providerOptions = getProviderOptions(provider);
|
|
192
|
+
console.log(`Calling ${provider} with options:`, providerOptions);
|
|
193
|
+
const result = streamText({
|
|
194
|
+
model,
|
|
195
|
+
messages,
|
|
196
|
+
temperature: 0,
|
|
197
|
+
providerOptions
|
|
198
|
+
});
|
|
199
|
+
let fullResponse = "";
|
|
200
|
+
for await (const part of result.fullStream) {
|
|
201
|
+
switch (part.type) {
|
|
202
|
+
case "error":
|
|
203
|
+
throw part.error;
|
|
204
|
+
case "text-delta":
|
|
205
|
+
if (parser) {
|
|
206
|
+
parser(part.textDelta);
|
|
207
|
+
}
|
|
208
|
+
fullResponse += part.textDelta;
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return fullResponse;
|
|
213
|
+
}
|
|
127
214
|
export {
|
|
128
215
|
ConversationStorage,
|
|
129
|
-
MAX_CONVERSATIONS
|
|
216
|
+
MAX_CONVERSATIONS,
|
|
217
|
+
PROVIDERS,
|
|
218
|
+
callModel,
|
|
219
|
+
getModel,
|
|
220
|
+
getProviderOptions
|
|
130
221
|
};
|
|
131
222
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node_modules/uuid/dist/esm/stringify.js","../../node_modules/uuid/dist/esm/rng.js","../../node_modules/uuid/dist/esm/native.js","../../node_modules/uuid/dist/esm/v4.js","../src/store.ts"],"sourcesContent":["import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n","import { randomUUID } from 'crypto';\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import { CoreMessage } from \"ai\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport interface Conversation {\n id: string;\n summary: string;\n timestamp: number;\n}\n\nexport interface ConversationData {\n id: string;\n summary: string;\n messages: CoreMessage[];\n lastUpdated: number;\n}\n\nexport const MAX_CONVERSATIONS = 100;\n\nexport abstract class ConversationStorage {\n // Abstract methods to be implemented by platform-specific storage\n abstract currentConversationId(): Promise<string>;\n abstract selectConversation(conversationId: string): Promise<void>;\n abstract listConversations(): Promise<Conversation[]>;\n abstract getConversation(\n conversationId: string\n ): Promise<ConversationData | null>;\n abstract storeConversationData(\n conversationId: string,\n data: ConversationData\n ): Promise<void>;\n abstract deleteConversationData(conversationId: string): Promise<boolean>;\n\n // Shared functionality that works across platforms\n async createConversation(messages: CoreMessage[]): Promise<ConversationData> {\n const id = uuidv4();\n const initialMessage = messages.find((msg) => msg.role === \"user\");\n const summary = initialMessage\n ? this.generateSummary(initialMessage.content as string)\n : `New conversation ${new Date().toLocaleString()}`;\n const conversation: ConversationData = {\n id,\n summary,\n messages,\n lastUpdated: Date.now(),\n };\n await this.storeConversationData(id, conversation);\n await this.selectConversation(id);\n await this.pruneOldConversations();\n return conversation;\n }\n\n async addMessageToConversation(\n conversationId: string,\n message: CoreMessage\n ): Promise<ConversationData> {\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new Error(`Conversation with ID ${conversationId} not found`);\n }\n conversation.messages.push({ ...message });\n conversation.lastUpdated = Date.now();\n await this.storeConversationData(conversationId, conversation);\n return conversation;\n }\n\n async getCurrentConversation(): Promise<ConversationData | null> {\n const currentId = await this.currentConversationId();\n if (!currentId) return null;\n return await this.getConversation(currentId);\n }\n\n async getLatestConversation(): Promise<ConversationData | null> {\n const convos = await this.listConversations();\n if (!convos.length) return null;\n // Sort by most recent first\n const sortedConvos = [...convos].sort((a, b) => b.timestamp - a.timestamp);\n return await this.getConversation(sortedConvos[0].id);\n }\n\n async updateConversationSummary(\n conversationId: string,\n summary: string\n ): Promise<ConversationData> {\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new Error(`Conversation with ID ${conversationId} not found`);\n }\n conversation.summary = summary;\n conversation.lastUpdated = Date.now();\n await this.storeConversationData(conversationId, conversation);\n return conversation;\n }\n\n private async pruneOldConversations(): Promise<void> {\n const conversations = await this.listConversations();\n if (conversations.length <= MAX_CONVERSATIONS) return;\n // Sort by timestamp (oldest first)\n const sortedConversations = [...conversations].sort(\n (a, b) => a.timestamp - b.timestamp\n );\n // Calculate how many need to be deleted\n const deleteCount = sortedConversations.length - MAX_CONVERSATIONS;\n // Get the conversations to delete (the oldest ones)\n const conversationsToDelete = sortedConversations.slice(0, deleteCount);\n // Delete each conversation\n for (const convo of conversationsToDelete) {\n await this.deleteConversationData(convo.id);\n }\n }\n\n protected generateSummary(content: string): string {\n let summary = content.split(\"\\n\")[0].trim();\n if (summary.length > 50) {\n summary = summary.substring(0, 47) + \"...\";\n } else if (summary.length === 0 && content.length > 0) {\n summary = content.substring(0, Math.min(50, content.length));\n if (summary.length === 50) summary = summary + \"...\";\n } else if (summary.length === 0) {\n summary = `Conversation created on ${new Date().toLocaleString()}`;\n }\n return summary;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../node_modules/uuid/dist/esm/stringify.js","../../node_modules/uuid/dist/esm/rng.js","../../node_modules/uuid/dist/esm/native.js","../../node_modules/uuid/dist/esm/v4.js","../src/store.ts","../src/provider.ts","../src/stream.ts"],"sourcesContent":["import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n","import { randomUUID } from 'crypto';\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import { CoreMessage } from \"ai\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport interface Conversation {\n id: string;\n summary: string;\n timestamp: number;\n}\n\nexport interface ConversationData {\n id: string;\n summary: string;\n messages: CoreMessage[];\n lastUpdated: number;\n}\n\nexport const MAX_CONVERSATIONS = 100;\n\nexport abstract class ConversationStorage {\n // Abstract methods to be implemented by platform-specific storage\n abstract currentConversationId(): Promise<string>;\n abstract selectConversation(conversationId: string): Promise<void>;\n abstract listConversations(): Promise<Conversation[]>;\n abstract getConversation(\n conversationId: string\n ): Promise<ConversationData | null>;\n abstract storeConversationData(\n conversationId: string,\n data: ConversationData\n ): Promise<void>;\n abstract deleteConversationData(conversationId: string): Promise<boolean>;\n\n // Shared functionality that works across platforms\n async createConversation(messages: CoreMessage[]): Promise<ConversationData> {\n const id = uuidv4();\n const initialMessage = messages.find((msg) => msg.role === \"user\");\n const summary = initialMessage\n ? this.generateSummary(initialMessage.content as string)\n : `New conversation ${new Date().toLocaleString()}`;\n const conversation: ConversationData = {\n id,\n summary,\n messages,\n lastUpdated: Date.now(),\n };\n await this.storeConversationData(id, conversation);\n await this.selectConversation(id);\n await this.pruneOldConversations();\n return conversation;\n }\n\n async addMessageToConversation(\n conversationId: string,\n message: CoreMessage\n ): Promise<ConversationData> {\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new Error(`Conversation with ID ${conversationId} not found`);\n }\n conversation.messages.push({ ...message });\n conversation.lastUpdated = Date.now();\n await this.storeConversationData(conversationId, conversation);\n return conversation;\n }\n\n async getCurrentConversation(): Promise<ConversationData | null> {\n const currentId = await this.currentConversationId();\n if (!currentId) return null;\n return await this.getConversation(currentId);\n }\n\n async getLatestConversation(): Promise<ConversationData | null> {\n const convos = await this.listConversations();\n if (!convos.length) return null;\n // Sort by most recent first\n const sortedConvos = [...convos].sort((a, b) => b.timestamp - a.timestamp);\n return await this.getConversation(sortedConvos[0].id);\n }\n\n async updateConversationSummary(\n conversationId: string,\n summary: string\n ): Promise<ConversationData> {\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new Error(`Conversation with ID ${conversationId} not found`);\n }\n conversation.summary = summary;\n conversation.lastUpdated = Date.now();\n await this.storeConversationData(conversationId, conversation);\n return conversation;\n }\n\n private async pruneOldConversations(): Promise<void> {\n const conversations = await this.listConversations();\n if (conversations.length <= MAX_CONVERSATIONS) return;\n // Sort by timestamp (oldest first)\n const sortedConversations = [...conversations].sort(\n (a, b) => a.timestamp - b.timestamp\n );\n // Calculate how many need to be deleted\n const deleteCount = sortedConversations.length - MAX_CONVERSATIONS;\n // Get the conversations to delete (the oldest ones)\n const conversationsToDelete = sortedConversations.slice(0, deleteCount);\n // Delete each conversation\n for (const convo of conversationsToDelete) {\n await this.deleteConversationData(convo.id);\n }\n }\n\n protected generateSummary(content: string): string {\n let summary = content.split(\"\\n\")[0].trim();\n if (summary.length > 50) {\n summary = summary.substring(0, 47) + \"...\";\n } else if (summary.length === 0 && content.length > 0) {\n summary = content.substring(0, Math.min(50, content.length));\n if (summary.length === 50) summary = summary + \"...\";\n } else if (summary.length === 0) {\n summary = `Conversation created on ${new Date().toLocaleString()}`;\n }\n return summary;\n }\n}\n","import { CoreMessage, streamText } from \"ai\";\nimport { createAnthropic, AnthropicProviderOptions } from \"@ai-sdk/anthropic\";\nimport {\n createGoogleGenerativeAI,\n GoogleGenerativeAIProviderOptions,\n} from \"@ai-sdk/google\";\nimport { createOpenAI, OpenAIResponsesProviderOptions } from \"@ai-sdk/openai\";\n\nexport type Provider = \"anthropic\" | \"google\" | \"openai\";\n\nexport const PROVIDERS: Provider[] = [\"anthropic\", \"google\", \"openai\"];\n\nconst SOTA = {\n anthropic: \"claude-3-7-sonnet-20250219\",\n google: \"gemini-2.5-pro-preview-05-06\",\n openai: \"gpt-4.1\",\n};\n\nexport async function getModel(provider: Provider, apiKey: string) {\n switch (provider) {\n case \"anthropic\":\n const anthropic = createAnthropic({\n apiKey,\n });\n return anthropic(SOTA[provider]);\n case \"google\":\n const google = createGoogleGenerativeAI({\n apiKey,\n });\n return google(SOTA[provider]);\n case \"openai\":\n const openai = createOpenAI({\n apiKey,\n compatibility: \"strict\",\n });\n return openai(SOTA[provider]);\n default:\n throw new Error(`Unsupported provider: ${provider}`);\n }\n}\n\nexport function getProviderOptions(provider: Provider) {\n switch (provider) {\n case \"anthropic\":\n return {\n anthropic: {\n thinking: { type: \"enabled\", budgetTokens: 24000 },\n } satisfies AnthropicProviderOptions,\n };\n case \"google\":\n return {\n google: {\n thinkingConfig: {\n thinkingBudget: 16384,\n },\n } satisfies GoogleGenerativeAIProviderOptions,\n };\n case \"openai\":\n return {\n openai: {} satisfies OpenAIResponsesProviderOptions,\n };\n default:\n throw new Error(`Unsupported provider: ${provider}`);\n }\n}\n","import { CoreMessage, streamText } from \"ai\";\nimport { Provider, getModel, getProviderOptions } from \"./provider\";\n\nexport async function callModel(\n provider: Provider,\n apiKey: string,\n messages: CoreMessage[],\n parser?: (fullResponse: string) => void\n): Promise<string> {\n const model = await getModel(provider, apiKey);\n const providerOptions = getProviderOptions(provider);\n console.log(`Calling ${provider} with options:`, providerOptions);\n const result = streamText({\n model,\n messages,\n temperature: 0,\n providerOptions: providerOptions as any,\n });\n let fullResponse = \"\";\n for await (const part of result.fullStream) {\n switch (part.type) {\n case \"error\":\n throw part.error;\n case \"text-delta\":\n if (parser) {\n parser(part.textDelta);\n }\n fullResponse += part.textDelta;\n break;\n }\n }\n return fullResponse;\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aieo",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"repository": "https://github.com/stakwork/stakgraph",
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "tsup",
|
|
14
|
+
"publish": "yarn build && npm publish",
|
|
14
15
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
15
16
|
},
|
|
16
17
|
"keywords": [
|