aieo 0.1.8 → 0.1.10

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.js CHANGED
@@ -235,7 +235,7 @@ async function callModel(provider, apiKey, messages, tools, parser) {
235
235
  throw part.error;
236
236
  case "text-delta":
237
237
  if (parser) {
238
- parser(part.textDelta);
238
+ parser(fullResponse);
239
239
  }
240
240
  fullResponse += part.textDelta;
241
241
  break;
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","../src/provider.ts","../src/stream.ts","../src/prompt.ts"],"sourcesContent":["export * from \"./store\";\nexport * from \"./provider\";\nexport * from \"./stream\";\nexport * from \"./prompt\";\n\nexport type { CoreMessage } from \"ai\";\nexport type { Tool, ToolSet } from \"ai\";\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 { 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, ToolSet } from \"ai\";\nimport { Provider, getModel, getProviderOptions } from \"./provider\";\n\nexport async function callModel(\n provider: Provider,\n apiKey: string,\n messages: CoreMessage[],\n tools?: ToolSet,\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 tools,\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","export const SYSTEM = `You are an expert dev. You are given a codebase and a task. You need to write the code for the task. You can also suggest changes to the codebase if needed.\n\nAvoid assuming that certain functions are available in the codebase. Don't use to_timestamp or to_date in SQL if you don't see examples of them being used. DO NOT make up functions like a logger or other utils. Only use utility functions that you ABSOLUTELY know exist in the code.\n\nTry to write as simple and straightforward code as possible. Make a real implementation, do NOT do a mockup or add sample data. Assume there is already mock data in the database. If you see snippets of backend code, that means you have access to the backend codebase and can add new backend endpoints or other functionality as needed.\n\nYou will be provided with code snippets to edit or create. Please preserve the EXACT file paths when you make edits. Do not truncate the file paths.\n\nYou may see multiple code snippets from the same file! In that case, please organize the code properly: if you need to add an import statement, do it in the snippet that has other imports in it! Since you won't always be able to see the whole file, try to be careful and avoid adding new code just above a snippet, since you might not know exactly what other code is there.\n\nAlways remember to add correct code that will compile!!! Make sure to properly add function signatures if needed, such as to Go interfaces or Rust traits (if you see those in the code snippets).\n\nIf asked to make further changes after already writing code, use the <content> blocks from your previous edits in order to identify code snippets to replace.\n`;\n\nexport const OUTRO = `\nPlease write all the necessary code to fully implement the feature end-to-end. Do not make mock data or example placeholders!!!\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","../src/prompt.ts"],"sourcesContent":["export * from \"./store\";\nexport * from \"./provider\";\nexport * from \"./stream\";\nexport * from \"./prompt\";\n\nexport type { CoreMessage } from \"ai\";\nexport type { Tool, ToolSet } from \"ai\";\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 { 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, ToolSet } from \"ai\";\nimport { Provider, getModel, getProviderOptions } from \"./provider\";\n\nexport async function callModel(\n provider: Provider,\n apiKey: string,\n messages: CoreMessage[],\n tools?: ToolSet,\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 tools,\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(fullResponse);\n }\n fullResponse += part.textDelta;\n break;\n }\n }\n return fullResponse;\n}\n","export const SYSTEM = `You are an expert dev. You are given a codebase and a task. You need to write the code for the task. You can also suggest changes to the codebase if needed.\n\nAvoid assuming that certain functions are available in the codebase. Don't use to_timestamp or to_date in SQL if you don't see examples of them being used. DO NOT make up functions like a logger or other utils. Only use utility functions that you ABSOLUTELY know exist in the code.\n\nTry to write as simple and straightforward code as possible. Make a real implementation, do NOT do a mockup or add sample data. Assume there is already mock data in the database. If you see snippets of backend code, that means you have access to the backend codebase and can add new backend endpoints or other functionality as needed.\n\nYou will be provided with code snippets to edit or create. Please preserve the EXACT file paths when you make edits. Do not truncate the file paths.\n\nYou may see multiple code snippets from the same file! In that case, please organize the code properly: if you need to add an import statement, do it in the snippet that has other imports in it! Since you won't always be able to see the whole file, try to be careful and avoid adding new code just above a snippet, since you might not know exactly what other code is there.\n\nAlways remember to add correct code that will compile!!! Make sure to properly add function signatures if needed, such as to Go interfaces or Rust traits (if you see those in the code snippets).\n\nIf asked to make further changes after already writing code, use the <content> blocks from your previous edits in order to identify code snippets to replace.\n`;\n\nexport const OUTRO = `\nPlease write all the necessary code to fully implement the feature end-to-end. Do not make mock data or example placeholders!!!\n`;\n"],"mappings":"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","names":["import_crypto"]}
package/dist/index.mjs CHANGED
@@ -204,7 +204,7 @@ async function callModel(provider, apiKey, messages, tools, parser) {
204
204
  throw part.error;
205
205
  case "text-delta":
206
206
  if (parser) {
207
- parser(part.textDelta);
207
+ parser(fullResponse);
208
208
  }
209
209
  fullResponse += part.textDelta;
210
210
  break;
@@ -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","../src/provider.ts","../src/stream.ts","../src/prompt.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 { 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, ToolSet } from \"ai\";\nimport { Provider, getModel, getProviderOptions } from \"./provider\";\n\nexport async function callModel(\n provider: Provider,\n apiKey: string,\n messages: CoreMessage[],\n tools?: ToolSet,\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 tools,\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","export const SYSTEM = `You are an expert dev. You are given a codebase and a task. You need to write the code for the task. You can also suggest changes to the codebase if needed.\n\nAvoid assuming that certain functions are available in the codebase. Don't use to_timestamp or to_date in SQL if you don't see examples of them being used. DO NOT make up functions like a logger or other utils. Only use utility functions that you ABSOLUTELY know exist in the code.\n\nTry to write as simple and straightforward code as possible. Make a real implementation, do NOT do a mockup or add sample data. Assume there is already mock data in the database. If you see snippets of backend code, that means you have access to the backend codebase and can add new backend endpoints or other functionality as needed.\n\nYou will be provided with code snippets to edit or create. Please preserve the EXACT file paths when you make edits. Do not truncate the file paths.\n\nYou may see multiple code snippets from the same file! In that case, please organize the code properly: if you need to add an import statement, do it in the snippet that has other imports in it! Since you won't always be able to see the whole file, try to be careful and avoid adding new code just above a snippet, since you might not know exactly what other code is there.\n\nAlways remember to add correct code that will compile!!! Make sure to properly add function signatures if needed, such as to Go interfaces or Rust traits (if you see those in the code snippets).\n\nIf asked to make further changes after already writing code, use the <content> blocks from your previous edits in order to identify code snippets to replace.\n`;\n\nexport const OUTRO = `\nPlease write all the necessary code to fully implement the feature end-to-end. Do not make mock data or example placeholders!!!\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","../src/prompt.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 { 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, ToolSet } from \"ai\";\nimport { Provider, getModel, getProviderOptions } from \"./provider\";\n\nexport async function callModel(\n provider: Provider,\n apiKey: string,\n messages: CoreMessage[],\n tools?: ToolSet,\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 tools,\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(fullResponse);\n }\n fullResponse += part.textDelta;\n break;\n }\n }\n return fullResponse;\n}\n","export const SYSTEM = `You are an expert dev. You are given a codebase and a task. You need to write the code for the task. You can also suggest changes to the codebase if needed.\n\nAvoid assuming that certain functions are available in the codebase. Don't use to_timestamp or to_date in SQL if you don't see examples of them being used. DO NOT make up functions like a logger or other utils. Only use utility functions that you ABSOLUTELY know exist in the code.\n\nTry to write as simple and straightforward code as possible. Make a real implementation, do NOT do a mockup or add sample data. Assume there is already mock data in the database. If you see snippets of backend code, that means you have access to the backend codebase and can add new backend endpoints or other functionality as needed.\n\nYou will be provided with code snippets to edit or create. Please preserve the EXACT file paths when you make edits. Do not truncate the file paths.\n\nYou may see multiple code snippets from the same file! In that case, please organize the code properly: if you need to add an import statement, do it in the snippet that has other imports in it! Since you won't always be able to see the whole file, try to be careful and avoid adding new code just above a snippet, since you might not know exactly what other code is there.\n\nAlways remember to add correct code that will compile!!! Make sure to properly add function signatures if needed, such as to Go interfaces or Rust traits (if you see those in the code snippets).\n\nIf asked to make further changes after already writing code, use the <content> blocks from your previous edits in order to identify code snippets to replace.\n`;\n\nexport const OUTRO = `\nPlease write all the necessary code to fully implement the feature end-to-end. Do not make mock data or example placeholders!!!\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.8",
3
+ "version": "0.1.10",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",