From abc68aced353a84a5e5b5004e5a692cdfddee05e Mon Sep 17 00:00:00 2001 From: Kewin Wereszczynski Date: Mon, 4 Nov 2024 14:36:38 +0100 Subject: [PATCH 01/10] chore: move to byorg framework --- package.json | 4 + src/commands/chat/providers.tsx | 12 +- src/commands/chat/state/actions.ts | 35 +- src/commands/chat/state/init.ts | 54 +-- src/commands/chat/state/state.ts | 31 +- ...Loader.tsx => AssistantResponseLoader.tsx} | 4 +- src/commands/chat/ui/ChatUi.tsx | 32 +- src/commands/chat/ui/StatusBar.tsx | 48 ++- ...sageItem.tsx => AssistantResponseItem.tsx} | 18 +- src/commands/chat/ui/list/ChatMessageList.tsx | 18 +- .../chat/ui/list/ProgramChatMessageItem.tsx | 16 +- .../chat/ui/list/UserChatMessageItem.tsx | 8 +- src/commands/chat/utils.ts | 17 +- src/commands/init/ui/InitUi.tsx | 6 +- src/commands/init/ui/SelectProviderStep.tsx | 8 +- src/config-file.ts | 2 +- src/engine/inference.ts | 34 -- src/engine/providers/anthropic.ts | 107 +---- src/engine/providers/mistral.ts | 112 +----- src/engine/providers/open-ai.ts | 30 +- src/engine/providers/perplexity.ts | 32 +- .../{provider.ts => provider-info.ts} | 15 +- src/engine/providers/utils/open-ai-api.ts | 93 ----- src/engine/session.ts | 4 +- src/engine/tokenizer.ts | 2 +- src/file-utils.ts | 2 +- tsconfig.json | 5 +- yarn.lock | 369 +++++++++++++++++- 28 files changed, 574 insertions(+), 544 deletions(-) rename src/commands/chat/ui/{AiResponseLoader.tsx => AssistantResponseLoader.tsx} (81%) rename src/commands/chat/ui/list/{AiChatMessageItem.tsx => AssistantResponseItem.tsx} (50%) delete mode 100644 src/engine/inference.ts rename src/engine/providers/{provider.ts => provider-info.ts} (70%) delete mode 100644 src/engine/providers/utils/open-ai-api.ts diff --git a/package.json b/package.json index e752b86..7dbc927 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,11 @@ "registry": "https://registry.npmjs.org/" }, "dependencies": { + "@ai-sdk/anthropic": "^0.0.54", + "@ai-sdk/mistral": "^0.0.46", + "@ai-sdk/openai": "^0.0.71", "@anthropic-ai/sdk": "^0.26.1", + "@callstack/byorg-core": "0.1.2", "@inkjs/ui": "^1.0.0", "@mistralai/mistralai": "^1.0.2", "chalk": "^5.3.0", diff --git a/src/commands/chat/providers.tsx b/src/commands/chat/providers.tsx index a01ff99..44d587e 100644 --- a/src/commands/chat/providers.tsx +++ b/src/commands/chat/providers.tsx @@ -2,10 +2,14 @@ import openAi from '../../engine/providers/open-ai.js'; import anthropic from '../../engine/providers/anthropic.js'; import perplexity from '../../engine/providers/perplexity.js'; import mistral from '../../engine/providers/mistral.js'; -import { getProvider, type Provider, type ProviderName } from '../../engine/providers/provider.js'; +import { + getProvider, + type ProviderInfo, + type ProviderName, +} from '../../engine/providers/provider-info.js'; import type { ConfigFile } from '../../config-file.js'; -export const providerOptionMapping: Record = { +export const providerOptionMapping: Record = { openai: openAi, anthropic, anth: anthropic, @@ -16,7 +20,7 @@ export const providerOptionMapping: Record = { export const providerOptions = Object.keys(providerOptionMapping); -export function resolveProviderFromOption(providerOption: string): Provider { +export function resolveProviderInfoFromOption(providerOption: string): ProviderInfo { const provider = providerOptionMapping[providerOption]; if (!provider) { throw new Error(`Provider not found: ${providerOption}.`); @@ -25,7 +29,7 @@ export function resolveProviderFromOption(providerOption: string): Provider { return provider; } -export function getDefaultProvider(config: ConfigFile): Provider { +export function getDefaultProviderInfo(config: ConfigFile): ProviderInfo { const providerNames = Object.keys(config.providers) as ProviderName[]; const providerName = providerNames ? providerNames[0] : undefined; diff --git a/src/commands/chat/state/actions.ts b/src/commands/chat/state/actions.ts index a5f46a7..46aa30b 100644 --- a/src/commands/chat/state/actions.ts +++ b/src/commands/chat/state/actions.ts @@ -1,39 +1,36 @@ -import type { ModelResponse } from '../../../engine/inference.js'; +import { type AssistantMessage, type AssistantResponse } from '@callstack/byorg-core'; import { useChatState, type MessageLevel } from './state.js'; -export function addUserMessage(text: string) { +export function addUserMessage(content: string) { useChatState.setState((state) => { return { activeView: null, - contextMessages: [...state.contextMessages, { role: 'user', content: text }], - chatMessages: [...state.chatMessages, { type: 'user', text }], + contextMessages: [...state.contextMessages, { role: 'user', content }], + chatMessages: [...state.chatMessages, { role: 'user', content }], }; }); } -export function addAiResponse(response: ModelResponse) { +export function addAssistantResponse(response: AssistantResponse) { useChatState.setState((state) => { - const outputMessages = { - type: 'ai', - text: response.message.content, - responseTime: response.responseTime, - usage: response.usage, - data: response.data, - } as const; + const message: AssistantMessage = { + role: 'assistant', + content: response.content, + }; return { activeView: null, - contextMessages: [...state.contextMessages, response.message], - chatMessages: [...state.chatMessages, outputMessages], + contextMessages: [...state.contextMessages, message], + chatMessages: [...state.chatMessages, response], }; }); } -export function addProgramMessage(text: string, level: MessageLevel = 'info') { +export function addProgramMessage(content: string, level: MessageLevel = 'info') { useChatState.setState((state) => { return { activeView: null, - chatMessages: [...state.chatMessages, { type: 'program', level, text }], + chatMessages: [...state.chatMessages, { role: 'program', level, content }], }; }); } @@ -57,7 +54,7 @@ export function forgetContextMessages() { contextMessages: [], chatMessages: [ ...state.chatMessages, - { type: 'program', level: 'info', text: 'AI will forget previous messages.' }, + { role: 'program', level: 'info', content: 'AI will forget previous messages.' }, ], }; }); @@ -92,7 +89,7 @@ export function triggerExit() { return { activeView: null, shouldExit: true, - chatMessages: [...state.chatMessages, { type: 'program', level: 'info', text: 'Bye! 👋' }], + chatMessages: [...state.chatMessages, { role: 'program', level: 'info', content: 'Bye! 👋' }], }; }); } @@ -103,7 +100,7 @@ export function setVerbose(verbose: boolean) { verbose, chatMessages: [ ...state.chatMessages, - { type: 'program', level: 'info', text: `Verbose mode: ${verbose ? 'on' : 'off'}` }, + { role: 'program', level: 'info', content: `Verbose mode: ${verbose ? 'on' : 'off'}` }, ], }; }); diff --git a/src/commands/chat/state/init.ts b/src/commands/chat/state/init.ts index edd6856..31936d5 100644 --- a/src/commands/chat/state/init.ts +++ b/src/commands/chat/state/init.ts @@ -1,9 +1,9 @@ +import { createApp, loggingPlugin, type Message } from '@callstack/byorg-core'; import { type ConfigFile } from '../../../config-file.js'; import { DEFAULT_SYSTEM_PROMPT } from '../../../default-config.js'; import type { ResponseStyle } from '../../../engine/providers/config.js'; -import type { Message } from '../../../engine/inference.js'; import type { PromptOptions } from '../prompt-options.js'; -import { getDefaultProvider, resolveProviderFromOption } from '../providers.js'; +import { getDefaultProviderInfo, resolveProviderInfoFromOption } from '../providers.js'; import { filterOutApiKey, handleInputFile } from '../utils.js'; import { useChatState, type ChatMessage, type ChatState } from './state.js'; @@ -12,19 +12,19 @@ export function initChatState( configFile: ConfigFile, initialPrompt: string, ) { - const provider = options.provider - ? resolveProviderFromOption(options.provider) - : getDefaultProvider(configFile); + const providerInfo = options.provider + ? resolveProviderInfoFromOption(options.provider) + : getDefaultProviderInfo(configFile); - const providerFileConfig = configFile.providers[provider.name]; + const providerFileConfig = configFile.providers[providerInfo.name]; if (!providerFileConfig) { - throw new Error(`Provider config not found: ${provider.name}.`); + throw new Error(`Provider config not found: ${providerInfo.name}.`); } const modelOrAlias = options.model ?? providerFileConfig.model; const model = modelOrAlias - ? (provider.modelAliases[modelOrAlias] ?? modelOrAlias) - : provider.defaultModel; + ? (providerInfo.modelAliases[modelOrAlias] ?? modelOrAlias) + : providerInfo.defaultModel; const systemPrompt = providerFileConfig.systemPrompt ?? DEFAULT_SYSTEM_PROMPT; @@ -40,47 +40,55 @@ export function initChatState( if (modelOrAlias != null && modelOrAlias !== model) { outputMessages.push({ - type: 'program', + role: 'program', level: 'debug', - text: `Resolved model alias "${modelOrAlias}" to "${model}".`, + content: `Resolved model alias "${modelOrAlias}" to "${model}".`, }); } outputMessages.push({ - type: 'program', + role: 'program', level: 'debug', - text: `Loaded config: ${JSON.stringify(providerConfig, filterOutApiKey, 2)}`, + content: `Loaded config: ${JSON.stringify(providerConfig, filterOutApiKey, 2)}`, }); if (options.file) { - const { systemMessage, costWarning, costInfo } = handleInputFile( - options.file, - providerConfig, - provider, - ); + const { + systemPrompt: fileSystemPrompt, + costWarning, + costInfo, + } = handleInputFile(options.file, providerConfig, providerInfo); + + providerConfig.systemPrompt += `\n\n${fileSystemPrompt}`; - contextMessages.push(systemMessage); if (costWarning) { - outputMessages.push({ type: 'program', level: 'warning', text: costWarning }); + outputMessages.push({ role: 'program', level: 'warning', content: costWarning }); } else if (costInfo) { - outputMessages.push({ type: 'program', level: 'info', text: costInfo }); + outputMessages.push({ role: 'program', level: 'info', content: costInfo }); } } if (initialPrompt) { contextMessages.push({ role: 'user', content: initialPrompt }); - outputMessages.push({ type: 'user', text: initialPrompt }); + outputMessages.push({ role: 'user', content: initialPrompt }); } + const app = createApp({ + chatModel: providerInfo.getChatModel(providerConfig), + systemPrompt: () => providerConfig.systemPrompt, + plugins: [loggingPlugin], + }); + const state: ChatState = { activeView: null, - provider, + provider: providerInfo, providerConfig, contextMessages, chatMessages: outputMessages, verbose: options.verbose ?? false, shouldExit: false, stream: options.stream ?? true, + app, }; useChatState.setState(state); diff --git a/src/commands/chat/state/state.ts b/src/commands/chat/state/state.ts index fe5b820..b1059d7 100644 --- a/src/commands/chat/state/state.ts +++ b/src/commands/chat/state/state.ts @@ -1,10 +1,10 @@ import { create } from 'zustand'; +import type { Application, AssistantResponse, Message, UserMessage } from '@callstack/byorg-core'; import type { ProviderConfig } from '../../../engine/providers/config.js'; -import type { Provider } from '../../../engine/providers/provider.js'; -import type { Message, ModelUsage } from '../../../engine/inference.js'; +import type { ProviderInfo } from '../../../engine/providers/provider-info.js'; export interface ChatState { - provider: Provider; + provider: ProviderInfo; providerConfig: ProviderConfig; contextMessages: Message[]; chatMessages: ChatMessage[]; @@ -12,32 +12,19 @@ export interface ChatState { verbose: boolean; shouldExit: boolean; stream: boolean; + app: Application; } -export type ChatMessage = UserChatMessage | AiChatMessage | ProgramChatMessage; +export type ChatMessage = UserMessage | AssistantResponse | ProgramOutput; -export interface UserChatMessage { - type: 'user'; - text: string; -} - -export interface AiChatMessage { - type: 'ai'; - text: string; - responseTime: number; - usage: ModelUsage; - cost?: number; - data?: unknown; +export interface ProgramOutput { + role: 'program'; + content: string; + level: MessageLevel; } export type MessageLevel = 'debug' | 'info' | 'warning' | 'error'; -export interface ProgramChatMessage { - type: 'program'; - level: MessageLevel; - text: string; -} - type ActiveView = 'info' | 'help' | null; // @ts-expect-error lazy init diff --git a/src/commands/chat/ui/AiResponseLoader.tsx b/src/commands/chat/ui/AssistantResponseLoader.tsx similarity index 81% rename from src/commands/chat/ui/AiResponseLoader.tsx rename to src/commands/chat/ui/AssistantResponseLoader.tsx index 5ea9290..2e97e0f 100644 --- a/src/commands/chat/ui/AiResponseLoader.tsx +++ b/src/commands/chat/ui/AssistantResponseLoader.tsx @@ -4,11 +4,11 @@ import { TextSpinner } from '../../../components/TextSpinner.js'; import { colors } from '../../../theme/colors.js'; import { texts } from '../texts.js'; -interface AiResponseLoaderProps { +interface AssistantResponseLoaderProps { text?: string; } -export function AiResponseLoader({ text }: AiResponseLoaderProps) { +export function AssistantResponseLoader({ text }: AssistantResponseLoaderProps) { return ( {texts.assistantLabel} diff --git a/src/commands/chat/ui/ChatUi.tsx b/src/commands/chat/ui/ChatUi.tsx index 40e696d..6497b2f 100644 --- a/src/commands/chat/ui/ChatUi.tsx +++ b/src/commands/chat/ui/ChatUi.tsx @@ -1,11 +1,10 @@ import React, { useEffect, useState } from 'react'; import { Box } from 'ink'; import { ExitApp } from '../../../components/ExitApp.js'; -import type { ModelResponseUpdate } from '../../../engine/inference.js'; import { extractErrorMessage } from '../../../output.js'; import { processChatCommand } from '../chat-commands.js'; import { - addAiResponse, + addAssistantResponse, addProgramMessage, addUserMessage, hideActiveView, @@ -18,7 +17,7 @@ import { HelpOutput } from './HelpOutput.js'; import { StatusBar } from './StatusBar.js'; import { InfoOutput } from './InfoOutput.js'; import { ChatMessageList } from './list/ChatMessageList.js'; -import { AiResponseLoader } from './AiResponseLoader.js'; +import { AssistantResponseLoader } from './AssistantResponseLoader.js'; export function ChatUi() { const contextMessages = useChatState((state) => state.contextMessages); @@ -59,7 +58,7 @@ export function ChatUi() { {activeView === 'help' && } {activeView === 'info' && } - {isLoading ? : null} + {isLoading ? : null} {showInput && } @@ -69,8 +68,7 @@ export function ChatUi() { } function useAiResponse() { - const provider = useChatState((state) => state.provider); - const providerConfig = useChatState((state) => state.providerConfig); + const app = useChatState((state) => state.app); const stream = useChatState((state) => state.stream); const [isLoading, setLoading] = useState(false); @@ -82,16 +80,20 @@ function useAiResponse() { setLoadedResponse(undefined); const messages = useChatState.getState().contextMessages; - if (stream && provider.getChatCompletionStream != null) { - const response = await provider.getChatCompletionStream( - providerConfig, - messages, - (update: ModelResponseUpdate) => setLoadedResponse(update.content), - ); - addAiResponse(response); + if (stream) { + const { response } = await app.processMessages(messages, { + onPartialResponse: (update) => setLoadedResponse(update), + }); + + if (response.role == 'assistant') { + addAssistantResponse(response); + } else { + addProgramMessage(response.content); + } } else { - const response = await provider.getChatCompletion(providerConfig, messages); - addAiResponse(response); + throw new Error('Non-Stream mode is not supported yet'); + // const response = await provider.getChatCompletion(providerConfig, messages); + // addAiResponse(response); } } catch (error) { // We cannot leave unanswered user message in context, as there is no AI response for it. diff --git a/src/commands/chat/ui/StatusBar.tsx b/src/commands/chat/ui/StatusBar.tsx index a57547c..22355c4 100644 --- a/src/commands/chat/ui/StatusBar.tsx +++ b/src/commands/chat/ui/StatusBar.tsx @@ -1,10 +1,17 @@ import React, { useMemo } from 'react'; import { Box, Text } from 'ink'; -import type { ModelUsage } from '../../../engine/inference.js'; import { formatCost, formatSpeed, formatTokenCount } from '../../../format.js'; import { calculateUsageCost } from '../../../engine/session.js'; import { useChatState, type ChatMessage } from '../state/state.js'; +type TotalUsage = { + inputTokens: number; + outputTokens: number; + requests: number; + responseTime: number; + model: string | undefined; +}; + export function StatusBar() { const verbose = useChatState((state) => state.verbose); const items = useChatState((state) => state.chatMessages); @@ -12,46 +19,47 @@ export function StatusBar() { const providerConfig = useChatState((state) => state.providerConfig); const totalUsage = useMemo(() => calculateTotalUsage(items), [items]); - const totalTime = useMemo(() => calculateTotalResponseTime(items), [items]); - const modelPricing = provider.modelPricing[providerConfig.model]; + const model = totalUsage.model || providerConfig.model; + const modelPricing = provider.modelPricing[model] ?? provider.modelPricing[providerConfig.model]; const totalCost = calculateUsageCost(totalUsage, modelPricing) ?? 0; return ( - LLM: {provider.label}/{providerConfig.model} - Total Cost:{' '} - {verbose ? formatVerboseStats(totalCost, totalUsage, totalTime) : formatCost(totalCost)} + LLM: {provider.label}/{model} - Total Cost:{' '} + {verbose ? formatVerboseStats(totalCost, totalUsage) : formatCost(totalCost)} ); } -function formatVerboseStats(cost: number, usage: ModelUsage, time: number) { +function formatVerboseStats(cost: number, usage: TotalUsage) { const usageOutput = usage - ? ` (tokens: ${formatTokenCount(usage.inputTokens)} in + ${formatTokenCount(usage.outputTokens)} out, requests: ${usage.requests}, speed: ${formatSpeed(usage.outputTokens, time)})` + ? ` (tokens: ${formatTokenCount(usage.inputTokens)} in + ${formatTokenCount( + usage.outputTokens, + )} out, requests: ${usage.requests}, speed: ${formatSpeed(usage.outputTokens, usage.responseTime)})` : ''; return `${formatCost(cost)}${usageOutput}`; } -function calculateTotalUsage(messages: ChatMessage[]) { - const usage: ModelUsage = { inputTokens: 0, outputTokens: 0, requests: 0 }; +function calculateTotalUsage(messages: ChatMessage[]): TotalUsage { + const usage: TotalUsage = { + inputTokens: 0, + outputTokens: 0, + requests: 0, + responseTime: 0, + model: undefined, + }; messages.forEach((message) => { - if (message.type === 'ai') { + if (message.role === 'assistant') { usage.inputTokens += message.usage?.inputTokens ?? 0; usage.outputTokens += message.usage?.outputTokens ?? 0; usage.requests += message.usage?.requests ?? 0; + usage.responseTime += message.usage?.responseTime ?? 0; + usage.model = message.usage?.model ?? usage.model; } }); - return usage; -} -function calculateTotalResponseTime(messages: ChatMessage[]) { - let total = 0; - messages.forEach((message) => { - if (message.type === 'ai') { - total += message.responseTime ?? 0; - } - }); - return total; + return usage; } diff --git a/src/commands/chat/ui/list/AiChatMessageItem.tsx b/src/commands/chat/ui/list/AssistantResponseItem.tsx similarity index 50% rename from src/commands/chat/ui/list/AiChatMessageItem.tsx rename to src/commands/chat/ui/list/AssistantResponseItem.tsx index 583b20f..f3474f8 100644 --- a/src/commands/chat/ui/list/AiChatMessageItem.tsx +++ b/src/commands/chat/ui/list/AssistantResponseItem.tsx @@ -1,32 +1,32 @@ import React from 'react'; import { Text } from 'ink'; +import type { AssistantResponse } from '@callstack/byorg-core'; import { formatSpeed, formatTime } from '../../../../format.js'; import { colors } from '../../../../theme/colors.js'; -import { useChatState, type AiChatMessage } from '../../state/state.js'; +import { useChatState } from '../../state/state.js'; import { texts } from '../../texts.js'; -interface AiChatMessageItemProps { - message: AiChatMessage; +interface AssistantResponseItemProps { + message: AssistantResponse; } -export function AiChatMessageItem({ message }: AiChatMessageItemProps) { +export function AssistantResponseItem({ message }: AssistantResponseItemProps) { const verbose = useChatState((state) => state.verbose); return ( <> {texts.assistantLabel} - {message.text} + {message.content} - {verbose && message.responseTime != null ? ( + {verbose && message.usage.responseTime != null ? ( {' '} - ({formatTime(message.responseTime)},{' '} - {formatSpeed(message.usage?.outputTokens, message.responseTime)}) + ({formatTime(message.usage.responseTime)},{' '} + {formatSpeed(message.usage?.outputTokens, message.usage.responseTime)}) ) : null} - {verbose ? {JSON.stringify(message.data, null, 2)} : null} {/* Add a newline */} ); diff --git a/src/commands/chat/ui/list/ChatMessageList.tsx b/src/commands/chat/ui/list/ChatMessageList.tsx index 4010efd..0ab84c0 100644 --- a/src/commands/chat/ui/list/ChatMessageList.tsx +++ b/src/commands/chat/ui/list/ChatMessageList.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; import { Box, Static } from 'ink'; import { useChatState, type ChatMessage } from '../../state/state.js'; -import { ProgramChatMessageItem } from './ProgramChatMessageItem.js'; -import { UserChatMessageItem } from './UserChatMessageItem.js'; -import { AiChatMessageItem } from './AiChatMessageItem.js'; +import { UserMessageItem } from './UserChatMessageItem.js'; +import { AssistantResponseItem } from './AssistantResponseItem.js'; +import { ProgramOutputItem } from './ProgramChatMessageItem.js'; export function ChatMessageList() { const messages = useChatState((state) => state.chatMessages); @@ -21,16 +21,16 @@ export function ChatMessageList() { } function renderMessage(message: ChatMessage, index: number): React.ReactNode { - if (message.type === 'user') { - return ; + if (message.role === 'user') { + return ; } - if (message.type === 'ai') { - return ; + if (message.role === 'assistant') { + return ; } - if (message.type === 'program') { - return ; + if (message.role === 'program') { + return ; } return null; diff --git a/src/commands/chat/ui/list/ProgramChatMessageItem.tsx b/src/commands/chat/ui/list/ProgramChatMessageItem.tsx index 691efce..b02d371 100644 --- a/src/commands/chat/ui/list/ProgramChatMessageItem.tsx +++ b/src/commands/chat/ui/list/ProgramChatMessageItem.tsx @@ -1,29 +1,29 @@ import React from 'react'; import { Text } from 'ink'; import { colors } from '../../../../theme/colors.js'; -import { useChatState, type ProgramChatMessage } from '../../state/state.js'; +import { useChatState, type ProgramOutput } from '../../state/state.js'; -interface ProgramChatMessageItemProps { - output: ProgramChatMessage; +interface ProgramOutputItemProps { + output: ProgramOutput; } -export function ProgramChatMessageItem({ output }: ProgramChatMessageItemProps) { +export function ProgramOutputItem({ output }: ProgramOutputItemProps) { const verbose = useChatState((state) => state.verbose); if (output.level === 'error') { - return {output.text}; + return {output.content}; } if (output.level === 'warning') { - return {output.text}; + return {output.content}; } if (output.level === 'info') { - return {output.text}; + return {output.content}; } if (verbose && output.level === 'debug') { - return {output.text}; + return {output.content}; } return null; diff --git a/src/commands/chat/ui/list/UserChatMessageItem.tsx b/src/commands/chat/ui/list/UserChatMessageItem.tsx index 16100a3..ba7d3b9 100644 --- a/src/commands/chat/ui/list/UserChatMessageItem.tsx +++ b/src/commands/chat/ui/list/UserChatMessageItem.tsx @@ -1,18 +1,18 @@ import React from 'react'; import { Text } from 'ink'; +import type { UserMessage } from '@callstack/byorg-core'; import { colors } from '../../../../theme/colors.js'; -import { type UserChatMessage } from '../../state/state.js'; import { texts } from '../../texts.js'; interface UserChatMessageItemProps { - message: UserChatMessage; + message: UserMessage; } -export function UserChatMessageItem({ message }: UserChatMessageItemProps) { +export function UserMessageItem({ message }: UserChatMessageItemProps) { return ( {texts.userLabel} - {message.text} + {message.content} ); } diff --git a/src/commands/chat/utils.ts b/src/commands/chat/utils.ts index b6b8ded..5ee8461 100644 --- a/src/commands/chat/utils.ts +++ b/src/commands/chat/utils.ts @@ -1,6 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; +import type { Message } from '@callstack/byorg-core'; import { DEFAULT_FILE_PROMPT, FILE_COST_WARNING, @@ -8,18 +9,18 @@ import { } from '../../default-config.js'; import { calculateUsageCost } from '../../engine/session.js'; import { getTokensCount } from '../../engine/tokenizer.js'; -import type { Message, SystemMessage } from '../../engine/inference.js'; import type { ProviderConfig } from '../../engine/providers/config.js'; -import type { Provider } from '../../engine/providers/provider.js'; +import type { ProviderInfo } from '../../engine/providers/provider-info.js'; import { formatCost, formatTokenCount } from '../../format.js'; import { getConversationStoragePath, getDefaultFilename, getUniqueFilename, } from '../../file-utils.js'; +import { texts } from './texts.js'; interface HandleInputFileResult { - systemMessage: SystemMessage; + systemPrompt: string; costWarning: string | null; costInfo: string | null; } @@ -27,7 +28,7 @@ interface HandleInputFileResult { export function handleInputFile( inputFile: string, config: ProviderConfig, - provider: Provider, + provider: ProviderInfo, ): HandleInputFileResult { const filePath = path.resolve(inputFile.replace('~', os.homedir())); @@ -59,7 +60,7 @@ export function handleInputFile( ); return { - systemMessage: { role: 'system', content }, + systemPrompt: content, costWarning, costInfo, }; @@ -92,11 +93,9 @@ export function saveConversation(messages: Message[]) { function roleToLabel(role: Message['role']): string { switch (role) { case 'user': - return 'me'; + return texts.userLabel; case 'assistant': - return 'ai'; - case 'system': - return 'system'; + return texts.assistantLabel; default: return role; } diff --git a/src/commands/init/ui/InitUi.tsx b/src/commands/init/ui/InitUi.tsx index 7683aaf..10c8082 100644 --- a/src/commands/init/ui/InitUi.tsx +++ b/src/commands/init/ui/InitUi.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { Box, Newline, Text } from 'ink'; -import { type Provider } from '../../../engine/providers/provider.js'; +import { type ProviderInfo } from '../../../engine/providers/provider-info.js'; import { writeConfigFile } from '../../../config-file.js'; import { colors } from '../../../theme/colors.js'; import { ExitApp } from '../../../components/ExitApp.js'; @@ -17,10 +17,10 @@ export function InitUi({ hasConfig }: InitUiProps) { const [step, setStep] = useState(0); const [overwriteConfig, setOverwriteConfig] = useState(true); - const [provider, setProvider] = useState(); + const [provider, setProvider] = useState(); const [hasKey, setHasKey] = useState(); - const writeConfig = (provider?: Provider, apiKey?: string) => { + const writeConfig = (provider?: ProviderInfo, apiKey?: string) => { if (!provider || !apiKey) { return; } diff --git a/src/commands/init/ui/SelectProviderStep.tsx b/src/commands/init/ui/SelectProviderStep.tsx index ef1d55b..f94cd05 100644 --- a/src/commands/init/ui/SelectProviderStep.tsx +++ b/src/commands/init/ui/SelectProviderStep.tsx @@ -4,20 +4,20 @@ import { Select } from '@inkjs/ui'; import { getProvider, providers, - type Provider, + type ProviderInfo, type ProviderName, -} from '../../../engine/providers/provider.js'; +} from '../../../engine/providers/provider-info.js'; import { colors } from '../../../theme/colors.js'; interface SelectProviderStepProps { label: string; - onSelect: (provider: Provider) => void; + onSelect: (provider: ProviderInfo) => void; } const providerItems = providers.map((p) => ({ label: p.label, value: p.name })); export function SelectProviderStep({ label, onSelect }: SelectProviderStepProps) { - const [value, setValue] = useState(); + const [value, setValue] = useState(); const handleSelect = (name: ProviderName) => { const provider = getProvider(name); diff --git a/src/config-file.ts b/src/config-file.ts index c9fb911..ce9ba43 100644 --- a/src/config-file.ts +++ b/src/config-file.ts @@ -2,7 +2,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import { z } from 'zod'; -import { providerNames } from './engine/providers/provider.js'; +import { providerNames } from './engine/providers/provider-info.js'; const LEGACY_CONFIG_FILENAME = '.airc'; const CONFIG_FILENAME = '.airc.json'; diff --git a/src/engine/inference.ts b/src/engine/inference.ts deleted file mode 100644 index 080b758..0000000 --- a/src/engine/inference.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type Message = SystemMessage | UserMessage | AiMessage; - -export interface SystemMessage { - role: 'system'; - content: string; -} - -export interface UserMessage { - role: 'user'; - content: string; -} - -export interface AiMessage { - role: 'assistant'; - content: string; -} - -export interface ModelResponse { - message: AiMessage; - usage: ModelUsage; - responseTime: number; - responseModel: string; - data: unknown; -} - -export interface ModelResponseUpdate { - content: string; -} - -export interface ModelUsage { - inputTokens: number; - outputTokens: number; - requests: number; -} diff --git a/src/engine/providers/anthropic.ts b/src/engine/providers/anthropic.ts index e2e7bc7..586385b 100644 --- a/src/engine/providers/anthropic.ts +++ b/src/engine/providers/anthropic.ts @@ -1,16 +1,9 @@ -import AnthropicAPI from '@anthropic-ai/sdk'; -import { - type AiMessage, - type Message, - type ModelResponseUpdate, - type UserMessage, -} from '../inference.js'; -import { responseStyles, type ProviderConfig } from './config.js'; -import type { Provider } from './provider.js'; +import { createAnthropic } from '@ai-sdk/anthropic'; +import { VercelChatModelAdapter } from '@callstack/byorg-core'; +import { type ProviderConfig } from './config.js'; +import type { ProviderInfo } from './provider-info.js'; -type ModelMessage = UserMessage | AiMessage; - -const Anthropic: Provider = { +const Anthropic: ProviderInfo = { label: 'Anthropic', name: 'anthropic', apiKeyUrl: 'https://console.anthropic.com/settings/keys', @@ -39,93 +32,11 @@ const Anthropic: Provider = { opus: 'claude-3-opus-20240229', }, - getChatCompletion: async (config: ProviderConfig, messages: Message[]) => { - const api = new AnthropicAPI({ - apiKey: config.apiKey, - }); - - const nonSystemMessages = messages.filter((m) => m.role !== 'system') as ModelMessage[]; - - const systemMessagesContent = messages.filter((m) => m.role === 'system').map((m) => m.content); - const systemPrompt = [config.systemPrompt, ...systemMessagesContent].join('\n\n'); - - const startTime = performance.now(); - const response = await api.messages.create({ - messages: nonSystemMessages, - model: config.model, - max_tokens: 1024, - system: systemPrompt, - ...responseStyles[config.responseStyle], + getChatModel: (config: ProviderConfig) => { + const client = createAnthropic({ apiKey: config.apiKey }); + return new VercelChatModelAdapter({ + languageModel: client.languageModel(config.model), }); - const responseTime = performance.now() - startTime; - - const firstContent = response.content[0]; - if (firstContent?.type !== 'text') { - throw new Error(`Received unexpected content type from Anthropic API: ${firstContent?.type}`); - } - - return { - message: { - role: 'assistant', - content: firstContent.text, - }, - usage: { - inputTokens: response.usage.input_tokens, - outputTokens: response.usage.output_tokens, - requests: 1, - }, - responseTime, - responseModel: response.model, - data: response, - }; - }, - - getChatCompletionStream: async function ( - config: ProviderConfig, - messages: Message[], - onResponseUpdate: (update: ModelResponseUpdate) => void, - ) { - const api = new AnthropicAPI({ - apiKey: config.apiKey, - }); - - const nonSystemMessages = messages.filter((m) => m.role !== 'system') as ModelMessage[]; - - const systemMessagesContent = messages.filter((m) => m.role === 'system').map((m) => m.content); - const systemPrompt = [config.systemPrompt, ...systemMessagesContent].join('\n\n'); - - const startTime = performance.now(); - let content = ''; - const stream = api.messages - .stream({ - messages: nonSystemMessages, - model: config.model, - max_tokens: 1024, - system: systemPrompt, - ...responseStyles[config.responseStyle], - }) - .on('text', (text) => { - content += text; - onResponseUpdate({ content }); - }); - - const response = await stream.finalMessage(); - const responseTime = performance.now() - startTime; - - return { - message: { - role: 'assistant', - content, - }, - usage: { - inputTokens: response.usage.input_tokens, - outputTokens: response.usage.output_tokens, - requests: 1, - }, - responseTime, - responseModel: response.model, - data: response, - }; }, }; diff --git a/src/engine/providers/mistral.ts b/src/engine/providers/mistral.ts index ff14fa5..290a2c2 100644 --- a/src/engine/providers/mistral.ts +++ b/src/engine/providers/mistral.ts @@ -1,11 +1,8 @@ -import { Mistral as MistralClient } from '@mistralai/mistralai'; -import type { CompletionEvent } from '@mistralai/mistralai/models/components/completionevent.js'; -import { type Message, type ModelResponseUpdate } from '../inference.js'; -import { estimateInputTokens, estimateOutputTokens } from '../tokenizer.js'; -import { responseStyles, type ProviderConfig } from './config.js'; -import type { Provider } from './provider.js'; +import { createMistral } from '@ai-sdk/mistral'; +import { VercelChatModelAdapter } from '@callstack/byorg-core'; +import type { ProviderInfo } from './provider-info.js'; -const Mistral: Provider = { +const Mistral: ProviderInfo = { label: 'Mistral', name: 'mistral', apiKeyUrl: 'https://console.mistral.ai/api-keys/', @@ -40,105 +37,12 @@ const Mistral: Provider = { codestral: 'codestral-latest', }, - getChatCompletion: async (config: ProviderConfig, messages: Message[]) => { - const api = new MistralClient({ apiKey: config.apiKey }); - const allMessages = getMessages(config, messages); - - const startTime = performance.now(); - const response = await api.chat.complete({ - model: config.model, - messages: allMessages, - ...getMistralResponseStyle(config), + getChatModel(config) { + const client = createMistral({ apiKey: config.apiKey }); + return new VercelChatModelAdapter({ + languageModel: client.languageModel(config.model), }); - const responseTime = performance.now() - startTime; - - return { - message: { - role: 'assistant', - content: response.choices?.[0]?.message?.content ?? '', - }, - usage: { - inputTokens: response.usage.promptTokens, - outputTokens: response.usage.completionTokens, - requests: 1, - }, - responseTime, - responseModel: response.model, - data: response, - }; - }, - - getChatCompletionStream: async function ( - config: ProviderConfig, - messages: Message[], - onResponseUpdate: (update: ModelResponseUpdate) => void, - ) { - const api = new MistralClient({ apiKey: config.apiKey }); - const allMessages = getMessages(config, messages); - - const startTime = performance.now(); - const stream = await api.chat.stream({ - messages: allMessages, - model: config.model, - ...getMistralResponseStyle(config), - }); - - let lastChunk: CompletionEvent | null = null; - let content = ''; - for await (const chunk of stream) { - lastChunk = chunk; - content += chunk.data.choices[0]?.delta?.content || ''; - onResponseUpdate({ content }); - } - - const responseTime = performance.now() - startTime; - - return { - message: { - role: 'assistant', - content, - }, - usage: { - inputTokens: lastChunk?.data.usage?.promptTokens ?? estimateInputTokens(allMessages), - outputTokens: lastChunk?.data.usage?.completionTokens ?? estimateOutputTokens(content), - requests: 1, - }, - responseTime, - responseModel: lastChunk?.data.model || 'unknown', - data: lastChunk, - }; }, }; -function getMessages(config: ProviderConfig, messages: Message[]): Message[] { - if (!config.systemPrompt) { - return messages; - } - - const systemMessage: Message = { - role: 'system', - content: config.systemPrompt, - }; - return [systemMessage, ...messages]; -} - -interface MistralResponseStyle { - temperature?: number; - topP?: number; -} - -function getMistralResponseStyle(config: ProviderConfig): MistralResponseStyle { - const style = responseStyles[config.responseStyle]; - - const result: MistralResponseStyle = {}; - if ('temperature' in style) { - result.temperature = style.temperature; - } - if ('top_p' in style) { - result.topP = style.top_p; - } - - return result; -} - export default Mistral; diff --git a/src/engine/providers/open-ai.ts b/src/engine/providers/open-ai.ts index 96d0b64..2917c60 100644 --- a/src/engine/providers/open-ai.ts +++ b/src/engine/providers/open-ai.ts @@ -1,10 +1,9 @@ -import OpenAI from 'openai'; -import { type Message, type ModelResponseUpdate } from '../inference.js'; +import { createOpenAI } from '@ai-sdk/openai'; +import { VercelChatModelAdapter } from '@callstack/byorg-core'; import { type ProviderConfig } from './config.js'; -import type { Provider } from './provider.js'; -import { getChatCompletion, getChatCompletionStream } from './utils/open-ai-api.js'; +import type { ProviderInfo } from './provider-info.js'; -const OpenAi: Provider = { +const OpenAi: ProviderInfo = { label: 'OpenAI', name: 'openAi', apiKeyUrl: 'https://platform.openai.com/api-keys', @@ -31,24 +30,11 @@ const OpenAi: Provider = { modelAliases: {}, - getChatCompletion: async (config: ProviderConfig, messages: Message[]) => { - const api = new OpenAI({ - apiKey: config.apiKey, + getChatModel: (config: ProviderConfig) => { + const client = createOpenAI({ apiKey: config.apiKey, compatibility: 'strict' }); + return new VercelChatModelAdapter({ + languageModel: client.languageModel(config.model), }); - - return await getChatCompletion(api, config, messages); - }, - - getChatCompletionStream: async function ( - config: ProviderConfig, - messages: Message[], - onResponseUpdate: (update: ModelResponseUpdate) => void, - ) { - const api = new OpenAI({ - apiKey: config.apiKey, - }); - - return await getChatCompletionStream(api, config, messages, onResponseUpdate); }, }; diff --git a/src/engine/providers/perplexity.ts b/src/engine/providers/perplexity.ts index be5bdea..818abe9 100644 --- a/src/engine/providers/perplexity.ts +++ b/src/engine/providers/perplexity.ts @@ -1,10 +1,8 @@ -import OpenAI from 'openai'; -import { type Message, type ModelResponseUpdate } from '../inference.js'; -import { type ProviderConfig } from './config.js'; -import type { Provider } from './provider.js'; -import { getChatCompletion, getChatCompletionStream } from './utils/open-ai-api.js'; +import { createOpenAI } from '@ai-sdk/openai'; +import { VercelChatModelAdapter } from '@callstack/byorg-core'; +import type { ProviderInfo } from './provider-info.js'; -const Perplexity: Provider = { +const Perplexity: ProviderInfo = { label: 'Perplexity', name: 'perplexity', apiKeyUrl: 'https://perplexity.ai/settings/api', @@ -43,26 +41,14 @@ const Perplexity: Provider = { huge: 'llama-3.1-sonar-huge-128k-online', }, - getChatCompletion: async (config: ProviderConfig, messages: Message[]) => { - const api = new OpenAI({ + getChatModel(config) { + const client = createOpenAI({ apiKey: config.apiKey, - baseURL: 'https://api.perplexity.ai', + baseURL: 'https://api.perplexity.ai/', }); - - return await getChatCompletion(api, config, messages); - }, - - getChatCompletionStream: async function ( - config: ProviderConfig, - messages: Message[], - onResponseUpdate: (update: ModelResponseUpdate) => void, - ) { - const api = new OpenAI({ - apiKey: config.apiKey, - baseURL: 'https://api.perplexity.ai', + return new VercelChatModelAdapter({ + languageModel: client.languageModel(config.model), }); - - return await getChatCompletionStream(api, config, messages, onResponseUpdate); }, }; diff --git a/src/engine/providers/provider.ts b/src/engine/providers/provider-info.ts similarity index 70% rename from src/engine/providers/provider.ts rename to src/engine/providers/provider-info.ts index 7a586c6..6760af4 100644 --- a/src/engine/providers/provider.ts +++ b/src/engine/providers/provider-info.ts @@ -1,4 +1,4 @@ -import type { Message, ModelResponse, ModelResponseUpdate } from '../inference.js'; +import type { ChatModel } from '@callstack/byorg-core'; import type { ProviderConfig } from './config.js'; import openAi from './open-ai.js'; import perplexity from './perplexity.js'; @@ -8,7 +8,7 @@ import mistral from './mistral.js'; export const providerNames = ['openAi', 'anthropic', 'perplexity', 'mistral'] as const; export type ProviderName = (typeof providerNames)[number]; -export interface Provider { +export interface ProviderInfo { name: ProviderName; label: string; apiKeyUrl: string; @@ -17,12 +17,7 @@ export interface Provider { modelPricing: Record; modelAliases: Record; - getChatCompletion: (config: ProviderConfig, messages: Message[]) => Promise; - getChatCompletionStream?: ( - config: ProviderConfig, - messages: Message[], - onStreamUpdate: (update: ModelResponseUpdate) => void, - ) => Promise; + getChatModel: (config: ProviderConfig) => ChatModel; } export interface ModelPricing { @@ -36,7 +31,7 @@ export interface ModelPricing { requestsCost?: number; } -const providersMap: Record = { +const providersMap: Record = { openAi, anthropic, perplexity, @@ -45,7 +40,7 @@ const providersMap: Record = { export const providers = Object.values(providersMap); -export function getProvider(providerName: ProviderName): Provider { +export function getProvider(providerName: ProviderName): ProviderInfo { const provider = providersMap[providerName]; if (!provider) { throw new Error(`Provider not found: ${providerName}.`); diff --git a/src/engine/providers/utils/open-ai-api.ts b/src/engine/providers/utils/open-ai-api.ts deleted file mode 100644 index 55c8056..0000000 --- a/src/engine/providers/utils/open-ai-api.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type OpenAI from 'openai'; -import type { ChatCompletionChunk } from 'openai/resources/index.mjs'; -import type { Message, ModelResponse, ModelResponseUpdate } from '../../inference.js'; -import { estimateInputTokens, estimateOutputTokens } from '../../tokenizer.js'; -import { responseStyles, type ProviderConfig } from '../config.js'; - -export async function getChatCompletion( - api: OpenAI, - config: ProviderConfig, - messages: Message[], -): Promise { - const allMessages = getMessages(config, messages); - - const startTime = performance.now(); - const response = await api.chat.completions.create({ - messages: allMessages, - model: config.model, - ...responseStyles[config.responseStyle], - }); - const responseTime = performance.now() - startTime; - - return { - message: { - role: 'assistant', - content: response.choices[0]?.message.content ?? '', - }, - usage: { - inputTokens: response.usage?.prompt_tokens ?? 0, - outputTokens: response.usage?.completion_tokens ?? 0, - requests: 1, - }, - responseTime, - responseModel: response.model, - data: response, - }; -} - -export async function getChatCompletionStream( - api: OpenAI, - config: ProviderConfig, - messages: Message[], - onResponseUpdate: (response: ModelResponseUpdate) => void, -): Promise { - const allMessages = getMessages(config, messages); - - const startTime = performance.now(); - const stream = await api.chat.completions.create({ - messages: allMessages, - model: config.model, - stream: true, - stream_options: { include_usage: true }, - ...responseStyles[config.responseStyle], - }); - - const chunks: ChatCompletionChunk[] = []; - let content = ''; - - for await (const chunk of stream) { - chunks.push(chunk); - content += chunk.choices[0]?.delta?.content || ''; - onResponseUpdate({ content }); - } - - const responseTime = performance.now() - startTime; - const lastChunk = chunks[chunks.length - 1]; - - return { - message: { - role: 'assistant', - content, - }, - usage: { - inputTokens: lastChunk?.usage?.prompt_tokens ?? estimateInputTokens(allMessages), - outputTokens: lastChunk?.usage?.completion_tokens ?? estimateOutputTokens(content), - requests: 1, - }, - responseTime, - responseModel: lastChunk?.model || 'unknown', - data: lastChunk, - }; -} - -function getMessages(config: ProviderConfig, messages: Message[]): Message[] { - if (!config.systemPrompt) { - return messages; - } - - const systemMessage: Message = { - role: 'system', - content: config.systemPrompt, - }; - return [systemMessage, ...messages]; -} diff --git a/src/engine/session.ts b/src/engine/session.ts index aa4a799..646a998 100644 --- a/src/engine/session.ts +++ b/src/engine/session.ts @@ -1,5 +1,5 @@ -import type { ModelUsage } from './inference.js'; -import type { ModelPricing } from './providers/provider.js'; +import type { ModelUsage } from '@callstack/byorg-core'; +import type { ModelPricing } from './providers/provider-info.js'; export interface SessionUsage { total: ModelUsage; diff --git a/src/engine/tokenizer.ts b/src/engine/tokenizer.ts index 7f99a69..b040a72 100644 --- a/src/engine/tokenizer.ts +++ b/src/engine/tokenizer.ts @@ -1,6 +1,6 @@ import { createRequire } from 'module'; import { Tiktoken } from 'tiktoken/lite'; -import type { Message } from './inference.js'; +import type { Message } from '@callstack/byorg-core'; // Workaround for JSON loading in ESM // See: https://www.stefanjudis.com/snippets/how-to-import-json-files-in-es-modules-node-js/#option-2%3A-leverage-the-commonjs-%60require%60-function-to-load-json-files diff --git a/src/file-utils.ts b/src/file-utils.ts index 3397ccb..9606614 100644 --- a/src/file-utils.ts +++ b/src/file-utils.ts @@ -2,7 +2,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import { format } from 'date-fns'; -import type { Message } from './engine/inference.js'; +import type { Message } from '@callstack/byorg-core'; export const CHATS_SAVE_DIRECTORY = '~/ai-chats'; diff --git a/tsconfig.json b/tsconfig.json index 99d418a..fe37fb9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,9 +4,8 @@ "ai-cli": ["./src/index.js"] }, "target": "ES2020", - "lib": ["ES2020"], - "module": "Node16", - "moduleResolution": "Node16", + "module": "ESNext", + "moduleResolution": "Bundler", "outDir": "build", "jsx": "react", "esModuleInterop": true, diff --git a/yarn.lock b/yarn.lock index 804b4ce..2122181 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,153 @@ __metadata: version: 8 cacheKey: 10 +"@ai-sdk/anthropic@npm:^0.0.54": + version: 0.0.54 + resolution: "@ai-sdk/anthropic@npm:0.0.54" + dependencies: + "@ai-sdk/provider": "npm:0.0.26" + "@ai-sdk/provider-utils": "npm:1.0.22" + peerDependencies: + zod: ^3.0.0 + checksum: 10/55e8e65ca49272f37b14faa0e3fc5179bff70b25f666c5be10e4a1c99c13a8161d5803caaed86da373c53f61e3296145a9035ef558c7775add7a5790d32306de + languageName: node + linkType: hard + +"@ai-sdk/mistral@npm:^0.0.46": + version: 0.0.46 + resolution: "@ai-sdk/mistral@npm:0.0.46" + dependencies: + "@ai-sdk/provider": "npm:0.0.26" + "@ai-sdk/provider-utils": "npm:1.0.22" + peerDependencies: + zod: ^3.0.0 + checksum: 10/52846471ce350c5b8154590b910757e0f31e20d0f65b1dca5bb65ae3e9a054ce8c2f07ce3e8178cc1e27729d1f84b60e6293506d81b00bb38fda665e0a3d3847 + languageName: node + linkType: hard + +"@ai-sdk/openai@npm:^0.0.71": + version: 0.0.71 + resolution: "@ai-sdk/openai@npm:0.0.71" + dependencies: + "@ai-sdk/provider": "npm:0.0.26" + "@ai-sdk/provider-utils": "npm:1.0.22" + peerDependencies: + zod: ^3.0.0 + checksum: 10/5f27ee53cea43e7983db7afd6a2c83bb54ae8f6c87daaa13bc37ea4ecab8b4d907d7cb8e27d1b5b894efccf08440753dfeb8fbf032de996cc02b51cbc4fc2c16 + languageName: node + linkType: hard + +"@ai-sdk/provider-utils@npm:1.0.22": + version: 1.0.22 + resolution: "@ai-sdk/provider-utils@npm:1.0.22" + dependencies: + "@ai-sdk/provider": "npm:0.0.26" + eventsource-parser: "npm:^1.1.2" + nanoid: "npm:^3.3.7" + secure-json-parse: "npm:^2.7.0" + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + checksum: 10/026515d2710f7682e2b017a1e2983f9883a8b0fbb518e009b841460fda4187e6e44abab749b9fdf3156a1b7203ac777ec5dbf086e485cb5e0c01f8ee78620196 + languageName: node + linkType: hard + +"@ai-sdk/provider@npm:0.0.26": + version: 0.0.26 + resolution: "@ai-sdk/provider@npm:0.0.26" + dependencies: + json-schema: "npm:^0.4.0" + checksum: 10/e04c6754cd6074d2c5be5d6ab283c1aa5b58684e3e91f3a87b44b25678d5933c9bc59b966778f195b33cbb60537dafaab1e1442661a8890c88305cc7bbb904e7 + languageName: node + linkType: hard + +"@ai-sdk/react@npm:0.0.70": + version: 0.0.70 + resolution: "@ai-sdk/react@npm:0.0.70" + dependencies: + "@ai-sdk/provider-utils": "npm:1.0.22" + "@ai-sdk/ui-utils": "npm:0.0.50" + swr: "npm:^2.2.5" + throttleit: "npm:2.1.0" + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true + checksum: 10/5aaa563651321e413da85f6eb91ccbad59766b2b36280ab849811f249ed0a910a2337acd4e07f669783a8e8e765b661647bb0106fcc61fa13a25c2f02d13f4af + languageName: node + linkType: hard + +"@ai-sdk/solid@npm:0.0.54": + version: 0.0.54 + resolution: "@ai-sdk/solid@npm:0.0.54" + dependencies: + "@ai-sdk/provider-utils": "npm:1.0.22" + "@ai-sdk/ui-utils": "npm:0.0.50" + peerDependencies: + solid-js: ^1.7.7 + peerDependenciesMeta: + solid-js: + optional: true + checksum: 10/7687b9bb9c064dce5bb8a5409ee36ca935b813cb64703014701bb2420e2789e66fd9e0f91cf0e817b2fd7b1d8b48bfd5e6f5eb8dd0c9088342e3882a7b58ac41 + languageName: node + linkType: hard + +"@ai-sdk/svelte@npm:0.0.57": + version: 0.0.57 + resolution: "@ai-sdk/svelte@npm:0.0.57" + dependencies: + "@ai-sdk/provider-utils": "npm:1.0.22" + "@ai-sdk/ui-utils": "npm:0.0.50" + sswr: "npm:^2.1.0" + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + checksum: 10/69ec3b7ebb413fd566c0981e1c9ea463a4c3d0f4a17ef1014fa823b56112d78c48887e85b0f0d4185f1cded1c1198b8b7337b014a89c8e7297b70282c6e65d94 + languageName: node + linkType: hard + +"@ai-sdk/ui-utils@npm:0.0.50": + version: 0.0.50 + resolution: "@ai-sdk/ui-utils@npm:0.0.50" + dependencies: + "@ai-sdk/provider": "npm:0.0.26" + "@ai-sdk/provider-utils": "npm:1.0.22" + json-schema: "npm:^0.4.0" + secure-json-parse: "npm:^2.7.0" + zod-to-json-schema: "npm:^3.23.3" + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + checksum: 10/638cef6030559b04fdd9f65ef50618063e741e29b6dd39250cf769d86e04dd7aed0e071c97fe88039155b6375cd6573f2c86c00309d0502e901a7948b2aca4af + languageName: node + linkType: hard + +"@ai-sdk/vue@npm:0.0.59": + version: 0.0.59 + resolution: "@ai-sdk/vue@npm:0.0.59" + dependencies: + "@ai-sdk/provider-utils": "npm:1.0.22" + "@ai-sdk/ui-utils": "npm:0.0.50" + swrv: "npm:^1.0.4" + peerDependencies: + vue: ^3.3.4 + peerDependenciesMeta: + vue: + optional: true + checksum: 10/6b77438bf3e68215d5312c9f2ef7bca7e3d18d53eb940687d04996157f6994703e4b5ab8957d9c7c5d7d4b9797c813c166c3ee88f24c70527522ff9886ded673 + languageName: node + linkType: hard + "@alcalzone/ansi-tokenize@npm:^0.1.3": version: 0.1.3 resolution: "@alcalzone/ansi-tokenize@npm:0.1.3" @@ -493,7 +640,11 @@ __metadata: version: 0.0.0-use.local resolution: "@callstack/ai-cli@workspace:." dependencies: + "@ai-sdk/anthropic": "npm:^0.0.54" + "@ai-sdk/mistral": "npm:^0.0.46" + "@ai-sdk/openai": "npm:^0.0.71" "@anthropic-ai/sdk": "npm:^0.26.1" + "@callstack/byorg-core": "npm:0.1.2" "@callstack/eslint-config": "npm:^14.1.1" "@inkjs/ui": "npm:^1.0.0" "@mistralai/mistralai": "npm:^1.0.2" @@ -534,6 +685,29 @@ __metadata: languageName: unknown linkType: soft +"@callstack/byorg-core@npm:0.1.2": + version: 0.1.2 + resolution: "@callstack/byorg-core@npm:0.1.2" + dependencies: + "@anthropic-ai/sdk": "npm:^0.26.1" + "@callstack/byorg-utils": "npm:0.1.2" + ai: "npm:^3.4.7" + openai: "npm:^4.56.1" + tiktoken: "npm:^1.0.16" + ts-regex-builder: "npm:^1.7.1" + peerDependencies: + zod: ^3.23.8 + checksum: 10/71903af6b8c81c8f97a28c9540b6de61a55576f7c6224620d3e89e929d5eba5be0a51fe5ee9ed73ddaffb492af90ee264ad58543032a95d9312408c4a1c5d7e4 + languageName: node + linkType: hard + +"@callstack/byorg-utils@npm:0.1.2": + version: 0.1.2 + resolution: "@callstack/byorg-utils@npm:0.1.2" + checksum: 10/eb9b3dab4042d2910d240a7561fc202fe4624bf6b0633f9bc5410bf0c7c1b8b25218551a269953e6cf181574f314966f122b9019920c2d4bd75047da936169df + languageName: node + linkType: hard + "@callstack/eslint-config@npm:^14.1.1": version: 14.2.0 resolution: "@callstack/eslint-config@npm:14.2.0" @@ -1176,6 +1350,13 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api@npm:1.9.0": + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10/a607f0eef971893c4f2ee2a4c2069aade6ec3e84e2a1f5c2aac19f65c5d9eeea41aa72db917c1029faafdd71789a1a040bdc18f40d63690e22ccae5d7070f194 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -1327,6 +1508,13 @@ __metadata: languageName: node linkType: hard +"@types/diff-match-patch@npm:^1.0.36": + version: 1.0.36 + resolution: "@types/diff-match-patch@npm:1.0.36" + checksum: 10/7d7ce03422fcc3e79d0cda26e4748aeb176b75ca4b4e5f38459b112bf24660d628424bdb08d330faefa69039d19a5316e7a102a8ab68b8e294c8346790e55113 + languageName: node + linkType: hard + "@types/graceful-fs@npm:^4.1.3": version: 4.1.9 resolution: "@types/graceful-fs@npm:4.1.9" @@ -1803,6 +1991,44 @@ __metadata: languageName: node linkType: hard +"ai@npm:^3.4.7": + version: 3.4.32 + resolution: "ai@npm:3.4.32" + dependencies: + "@ai-sdk/provider": "npm:0.0.26" + "@ai-sdk/provider-utils": "npm:1.0.22" + "@ai-sdk/react": "npm:0.0.70" + "@ai-sdk/solid": "npm:0.0.54" + "@ai-sdk/svelte": "npm:0.0.57" + "@ai-sdk/ui-utils": "npm:0.0.50" + "@ai-sdk/vue": "npm:0.0.59" + "@opentelemetry/api": "npm:1.9.0" + eventsource-parser: "npm:1.1.2" + json-schema: "npm:^0.4.0" + jsondiffpatch: "npm:0.6.0" + secure-json-parse: "npm:^2.7.0" + zod-to-json-schema: "npm:^3.23.3" + peerDependencies: + openai: ^4.42.0 + react: ^18 || ^19 || ^19.0.0-rc + sswr: ^2.1.0 + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + zod: ^3.0.0 + peerDependenciesMeta: + openai: + optional: true + react: + optional: true + sswr: + optional: true + svelte: + optional: true + zod: + optional: true + checksum: 10/c3ff185f6339f67bcabc8074800197bd03a1bf13fb4fe289e356f03222d18d0998835c41493030821837ba17c201a9b6a8de7bcc16a27eafff76760c14110639 + languageName: node + linkType: hard + "ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -2638,6 +2864,13 @@ __metadata: languageName: node linkType: hard +"client-only@npm:^0.0.1": + version: 0.0.1 + resolution: "client-only@npm:0.0.1" + checksum: 10/0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 + languageName: node + linkType: hard + "cliui@npm:^7.0.2": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -3352,6 +3585,13 @@ __metadata: languageName: node linkType: hard +"diff-match-patch@npm:^1.0.5": + version: 1.0.5 + resolution: "diff-match-patch@npm:1.0.5" + checksum: 10/fd1ab417eba9559bda752a4dfc9a8ac73fa2ca8b146d29d153964b437168e301c09d8a688fae0cd81d32dc6508a4918a94614213c85df760793f44e245173bb6 + languageName: node + linkType: hard + "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -4085,6 +4325,13 @@ __metadata: languageName: node linkType: hard +"eventsource-parser@npm:1.1.2, eventsource-parser@npm:^1.1.2": + version: 1.1.2 + resolution: "eventsource-parser@npm:1.1.2" + checksum: 10/14e94997dff896fb7bc85b29e89d6a62e747650d905b006249bcf48ba13efcbf3ee2b67948f4fa2638836b5a77ea079e25e941c0e41a720323e7867b1ebdda14 + languageName: node + linkType: hard + "execa@npm:7.1.1": version: 7.1.1 resolution: "execa@npm:7.1.1" @@ -6365,6 +6612,13 @@ __metadata: languageName: node linkType: hard +"json-schema@npm:^0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: 10/8b3b64eff4a807dc2a3045b104ed1b9335cd8d57aa74c58718f07f0f48b8baa3293b00af4dcfbdc9144c3aafea1e97982cc27cc8e150fc5d93c540649507a458 + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -6399,6 +6653,19 @@ __metadata: languageName: node linkType: hard +"jsondiffpatch@npm:0.6.0": + version: 0.6.0 + resolution: "jsondiffpatch@npm:0.6.0" + dependencies: + "@types/diff-match-patch": "npm:^1.0.36" + chalk: "npm:^5.3.0" + diff-match-patch: "npm:^1.0.5" + bin: + jsondiffpatch: bin/jsondiffpatch.js + checksum: 10/124b9797c266c693e69f8d23216e64d5ca4b21a4ec10e3a769a7b8cb19602ba62522f9a3d0c55299c1bfbe5ad955ca9ad2852439ca2c6b6316b8f91a5c218e94 + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -7025,6 +7292,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" + bin: + nanoid: bin/nanoid.cjs + checksum: 10/ac1eb60f615b272bccb0e2b9cd933720dad30bf9708424f691b8113826bb91aca7e9d14ef5d9415a6ba15c266b37817256f58d8ce980c82b0ba3185352565679 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -7334,6 +7610,28 @@ __metadata: languageName: node linkType: hard +"openai@npm:^4.56.1": + version: 4.70.2 + resolution: "openai@npm:4.70.2" + dependencies: + "@types/node": "npm:^18.11.18" + "@types/node-fetch": "npm:^2.6.4" + abort-controller: "npm:^3.0.0" + agentkeepalive: "npm:^4.2.1" + form-data-encoder: "npm:1.7.2" + formdata-node: "npm:^4.3.2" + node-fetch: "npm:^2.6.7" + peerDependencies: + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + bin: + openai: bin/cli + checksum: 10/28a1e65b4996fb34c1db02ac5eb94c1b09002cab6aa5dbbb1268155357f22c93abb34d859768b64ccb3bc8f9073be882565d87b1013f27617a2480b63faf9bc9 + languageName: node + linkType: hard + "optionator@npm:^0.8.1": version: 0.8.3 resolution: "optionator@npm:0.8.3" @@ -8439,6 +8737,13 @@ __metadata: languageName: node linkType: hard +"secure-json-parse@npm:^2.7.0": + version: 2.7.0 + resolution: "secure-json-parse@npm:2.7.0" + checksum: 10/974386587060b6fc5b1ac06481b2f9dbbb0d63c860cc73dc7533f27835fdb67b0ef08762dbfef25625c15bc0a0c366899e00076cb0d556af06b71e22f1dede4c + languageName: node + linkType: hard + "semver-diff@npm:^4.0.0": version: 4.0.0 resolution: "semver-diff@npm:4.0.0" @@ -8739,6 +9044,17 @@ __metadata: languageName: node linkType: hard +"sswr@npm:^2.1.0": + version: 2.1.0 + resolution: "sswr@npm:2.1.0" + dependencies: + swrev: "npm:^4.0.0" + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + checksum: 10/1a55fa374208e8c186a62294b73a6729c6647fd074396e6a5d95c60aa70a3a5ac36cd46a595163703a2fc3d41c0bafa1d7cf2d127b8d82b000ed27ad594edf96 + languageName: node + linkType: hard + "stack-utils@npm:^2.0.3, stack-utils@npm:^2.0.6": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -9027,6 +9343,34 @@ __metadata: languageName: node linkType: hard +"swr@npm:^2.2.5": + version: 2.2.5 + resolution: "swr@npm:2.2.5" + dependencies: + client-only: "npm:^0.0.1" + use-sync-external-store: "npm:^1.2.0" + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + checksum: 10/f02b3bd5a198a0f62f9a53d7c0528c4a58aa61a43310bea169614b6e873dadb52599e856ef0775405b6aa7409835343da0cf328948aa892aa309bf4b7e7d6902 + languageName: node + linkType: hard + +"swrev@npm:^4.0.0": + version: 4.0.0 + resolution: "swrev@npm:4.0.0" + checksum: 10/07808a4cc83747a5a0dceeb20cd63073d6d376a75d7ba6a1bb0263078d7dbb5efa555bba4d991b98f4f89792f8cfc0d21221e011b0ee78419dc10f2817e89b09 + languageName: node + linkType: hard + +"swrv@npm:^1.0.4": + version: 1.0.4 + resolution: "swrv@npm:1.0.4" + peerDependencies: + vue: ">=3.2.26 < 4" + checksum: 10/0085f89ba48e9b25969cc928b2b4fc4ae4755497419c2d4f5955dbda158d0e71f4747a7b981040459e81ff34e9553c2627cfe422a9a8d77f8eb28362ff1375c0 + languageName: node + linkType: hard + "synckit@npm:^0.9.1": version: 0.9.1 resolution: "synckit@npm:0.9.1" @@ -9093,6 +9437,13 @@ __metadata: languageName: node linkType: hard +"throttleit@npm:2.1.0": + version: 2.1.0 + resolution: "throttleit@npm:2.1.0" + checksum: 10/a2003947aafc721c4a17e6f07db72dc88a64fa9bba0f9c659f7997d30f9590b3af22dadd6a41851e0e8497d539c33b2935c2c7919cf4255922509af6913c619b + languageName: node + linkType: hard + "through2@npm:^2.0.0": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -9195,6 +9546,13 @@ __metadata: languageName: node linkType: hard +"ts-regex-builder@npm:^1.7.1": + version: 1.8.2 + resolution: "ts-regex-builder@npm:1.8.2" + checksum: 10/d154172ba954a0014c573ab8b0308439d4267653a2be7e06c85449bc506a2aafb7fdeec59f289f8a39c89b49b66c101222b6292382b5be7d91122f7c4662c652 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" @@ -9570,7 +9928,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:1.2.2": +"use-sync-external-store@npm:1.2.2, use-sync-external-store@npm:^1.2.0": version: 1.2.2 resolution: "use-sync-external-store@npm:1.2.2" peerDependencies: @@ -9984,6 +10342,15 @@ __metadata: languageName: node linkType: hard +"zod-to-json-schema@npm:^3.23.3": + version: 3.23.5 + resolution: "zod-to-json-schema@npm:3.23.5" + peerDependencies: + zod: ^3.23.3 + checksum: 10/53d07a419f0f194e0b96711dc11e7e6fa52a366b0ed5fceb405dc55f13252a1bf433712e4fb496c2a5fdc851018ee1acba7b39c2265c43d6fbb180e12c110c3b + languageName: node + linkType: hard + "zod@npm:^3.23.6": version: 3.23.8 resolution: "zod@npm:3.23.8" From ba4ffe5c63b492efa82a81b7d840a9c1c64ff61d Mon Sep 17 00:00:00 2001 From: Kewin Wereszczynski Date: Mon, 4 Nov 2024 15:12:35 +0100 Subject: [PATCH 02/10] chore: fix building and running --- .eslintignore | 1 + bin.js | 3 + lefthook.yml | 35 + package.json | 23 +- rsbuild.config.ts | 34 + src/__tests__/file-utils.test.ts | 142 ++-- src/__tests__/index.test.ts | 1 - tsconfig.build.json | 8 + tsconfig.json | 37 +- yarn.lock | 1135 +++++++++++++++++++++++++++++- 10 files changed, 1273 insertions(+), 146 deletions(-) create mode 100755 bin.js create mode 100644 lefthook.yml create mode 100644 rsbuild.config.ts delete mode 100644 src/__tests__/index.test.ts create mode 100644 tsconfig.build.json diff --git a/.eslintignore b/.eslintignore index 56efbe9..fd892ee 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,4 @@ node_modules/ build/ dist/ website/ +rsbuild.config.ts diff --git a/bin.js b/bin.js new file mode 100755 index 0000000..8f6818d --- /dev/null +++ b/bin.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +import './dist/bin.cjs'; diff --git a/lefthook.yml b/lefthook.yml new file mode 100644 index 0000000..f6e5dfe --- /dev/null +++ b/lefthook.yml @@ -0,0 +1,35 @@ +# EXAMPLE USAGE: +# +# Refer for explanation to following link: +# https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md +# +# pre-push: +# commands: +# packages-audit: +# tags: frontend security +# run: yarn audit +# gems-audit: +# tags: backend security +# run: bundle audit +# +# pre-commit: +# parallel: true +# commands: +# eslint: +# glob: "*.{js,ts,jsx,tsx}" +# run: yarn eslint {staged_files} +# rubocop: +# tags: backend style +# glob: "*.rb" +# exclude: '(^|/)(application|routes)\.rb$' +# run: bundle exec rubocop --force-exclusion {all_files} +# govet: +# tags: backend style +# files: git ls-files -m +# glob: "*.go" +# run: go vet {files} +# scripts: +# "hello.js": +# runner: node +# "any.go": +# runner: go run diff --git a/package.json b/package.json index 7dbc927..527b8f3 100644 --- a/package.json +++ b/package.json @@ -13,22 +13,22 @@ "main": "build/index.js", "source": "src/index.js", "bin": { - "ai": "build/bin.js" + "ai": "./bin.js" }, "files": [ - "build", + "bin.js", + "dist", "!**/__tests__", "!**/__mocks__" ], "scripts": { - "build": "tsc", - "build:watch": "tsc --watch", - "test": "jest", + "build": "rsbuild build", + "test": "vitest run", "typecheck": "tsc --noEmit", "lint": "eslint \"**/*.{js,ts,tsx}\"", "clean": "del-cli build", "release": "release-it", - "ai": "chmod +x ./build/bin.js && ./build/bin.js" + "ai": "./bin.js" }, "repository": { "type": "git", @@ -54,7 +54,6 @@ "ink": "^4.4.1", "ink-link": "^3.0.0", "ink-text-input": "^5.0.1", - "openai": "^4.56.0", "prompts": "^2.4.2", "react": "^18.2.0", "redent": "^4.0.0", @@ -67,6 +66,7 @@ "devDependencies": { "@callstack/eslint-config": "^14.1.1", "@release-it/conventional-changelog": "^5.1.1", + "@rsbuild/core": "^1.0.3", "@types/jest": "^29.5.12", "@types/mock-fs": "^4.13.4", "@types/prompts": "^2.4.9", @@ -79,20 +79,17 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-prettier": "^5.1.3", "jest": "^29.7.0", + "memfs": "^4.14.0", "mock-fs": "^5.2.0", "prettier": "^3.2.5", "release-it": "^15.11.0", - "typescript": "^5.4.5" + "typescript": "^5.4.5", + "vitest": "^2.1.3" }, "packageManager": "yarn@4.4.0", "engines": { "node": ">= 18.0.0" }, - "jest": { - "modulePathIgnorePatterns": [ - "/build/" - ] - }, "prettier": { "quoteProps": "consistent", "singleQuote": true, diff --git a/rsbuild.config.ts b/rsbuild.config.ts new file mode 100644 index 0000000..988aa06 --- /dev/null +++ b/rsbuild.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from '@rsbuild/core'; + +export default defineConfig({ + dev: { progressBar: false }, + source: { + entry: { + bin: './src/bin.ts', + }, + tsconfigPath: './tsconfig.build.json', + }, + output: { + target: 'node', + minify: false, + filename: { + js: '[name].cjs', + }, + externals: ['react-devtools-core'], + }, + tools: { + rspack: { + resolve: { + extensionAlias: { + '.js': ['.js', '.ts', '.tsx'], + }, + }, + ignoreWarnings: [ + /require function is used in a way in which dependencies cannot be statically extracted/, + /the request of a dependency is an expression/, + /Can't resolve 'bufferutil'/, + /Can't resolve 'utf-8-validate'/, + ], + }, + }, +}); diff --git a/src/__tests__/file-utils.test.ts b/src/__tests__/file-utils.test.ts index 458b4d0..550e893 100644 --- a/src/__tests__/file-utils.test.ts +++ b/src/__tests__/file-utils.test.ts @@ -1,81 +1,61 @@ -/* eslint-disable jest/no-commented-out-tests */ -it.todo('Move tests to AVA'); - -// import type { SessionContext } from '../commands/prompt/types.js'; -// import { DEFAULT_SYSTEM_PROMPT } from '../default-config.js'; -// import { getDefaultFilename, getUniqueFilename } from '../file-utils.js'; -// import openAi from '../engine/providers/openAi.js'; - -// const mockFs = require('mock-fs'); - -// const mockContext: SessionContext = { -// config: { -// model: 'gpt-4', -// systemPrompt: DEFAULT_SYSTEM_PROMPT, -// apiKey: '***', -// }, -// provider: openAi, -// messages: [], -// totalUsage: { inputTokens: 0, outputTokens: 0, requests: 0 }, -// }; - -// // Allows for mocking the time on CLI -// Object.defineProperty(global, 'performance', { -// writable: true, -// }); - -// beforeAll(() => { -// jest.useFakeTimers(); -// jest.setSystemTime(new Date(2020, 3, 1, 12, 0)); -// }); - -// beforeEach(() => { -// mockFs({ -// '/path/to/': { -// 'file.txt': 'Content', -// 'incr.txt': 'Content', -// 'incr-1.txt': 'Content', -// }, -// }); -// }); - -// // Restores the filesystem functions -// afterEach(() => { -// mockFs.restore(); -// }); - -// afterAll(() => { -// jest.useRealTimers(); -// }); - -// describe('getDefaultFilename', () => { -// it('should return the default file name', () => { -// // Test case 1 -// const context = mockContext; -// context.messages.push({ role: 'user', content: 'Hi How Are You Doing Today?' }); - -// const defaultFilename = getDefaultFilename(context); - -// expect(defaultFilename).toBe('2020-04-01 12-00 Hi How Are You Doing'); -// }); -// }); - -// describe('getUniqueFilename', () => { -// it('should return a unique file name', () => { -// const filePath = '/path/to/file.txt'; -// const uniqueFilename = getUniqueFilename(filePath); -// expect(uniqueFilename).toMatch(`/path/to/file-1.txt`); -// }); - -// it('should properly increment the name', () => { -// const filePath = '/path/to/incr.txt'; -// const uniqueFilename = getUniqueFilename(filePath); -// expect(uniqueFilename).toMatch(`/path/to/incr-2.txt`); -// }); - -// it('should not modify already unique name', () => { -// const filePath = '/path/to/another/file.txt'; -// const uniqueFilename = getUniqueFilename(filePath); -// expect(uniqueFilename).toMatch(`/path/to/another/file.txt`); -// }); -// }); +import { Message } from '@callstack/byorg-core'; +import { beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'; +import { fs, vol } from 'memfs'; +import { getDefaultFilename, getUniqueFilename } from '../file-utils.js'; + +vi.mock('node:fs', () => fs); + +beforeAll(() => { + vi.useFakeTimers(); + vi.setSystemTime(new Date(2020, 3, 1, 12, 0)); + return () => { + vi.useRealTimers(); + }; +}); + +beforeEach(() => { + vol.fromJSON( + { + 'file.txt': 'Content', + 'incr.txt': 'Content', + 'incr-1.txt': 'Content', + }, + '/path/to/', + ); + + return () => { + // // Restores the filesystem functions + vol.reset(); + }; +}); + +describe('getDefaultFilename', () => { + test('should return the default file name', () => { + // Test case 1 + const messages: Message[] = [{ role: 'user', content: 'Hi How Are You Doing Today?' }]; + + const defaultFilename = getDefaultFilename(messages); + + expect(defaultFilename).toBe('2020-04-01 12-00 Hi How Are You Doing'); + }); +}); + +describe('getUniqueFilename', () => { + test('should return a unique file name', () => { + const filePath = '/path/to/file.txt'; + const uniqueFilename = getUniqueFilename(filePath); + expect(uniqueFilename).toMatch(`/path/to/file-1.txt`); + }); + + test('should properly increment the name', () => { + const filePath = '/path/to/incr.txt'; + const uniqueFilename = getUniqueFilename(filePath); + expect(uniqueFilename).toMatch(`/path/to/incr-2.txt`); + }); + + test('should not modify already unique name', () => { + const filePath = '/path/to/another/file.txt'; + const uniqueFilename = getUniqueFilename(filePath); + expect(uniqueFilename).toMatch(`/path/to/another/file.txt`); + }); +}); diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts deleted file mode 100644 index bf84291..0000000 --- a/src/__tests__/index.test.ts +++ /dev/null @@ -1 +0,0 @@ -it.todo('write a test'); diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..ea27e3f --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "noEmit": false, + "paths": {} + } +} diff --git a/tsconfig.json b/tsconfig.json index fe37fb9..204fc06 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,30 +1,21 @@ { + "paths": { + "ai-cli": ["./src/index.js"] + }, "compilerOptions": { - "paths": { - "ai-cli": ["./src/index.js"] - }, - "target": "ES2020", - "module": "ESNext", - "moduleResolution": "Bundler", - "outDir": "build", - "jsx": "react", + "target": "esnext", + "module": "node16", + "moduleResolution": "node16", + "noEmit": true, "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "declaration": true, - "allowUnreachableCode": false, - "allowUnusedLabels": false, "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - "noImplicitUseStrict": false, + "strict": true, "noStrictGenericChecks": false, - "noUncheckedIndexedAccess": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "verbatimModuleSyntax": true + "skipLibCheck": true, + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react" }, - "include": ["src/**/*.ts", "src/**/*.tsx"] + "outDir": "build", + "include": ["src"] } diff --git a/yarn.lock b/yarn.lock index 2122181..2e35e9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -649,6 +649,7 @@ __metadata: "@inkjs/ui": "npm:^1.0.0" "@mistralai/mistralai": "npm:^1.0.2" "@release-it/conventional-changelog": "npm:^5.1.1" + "@rsbuild/core": "npm:^1.0.3" "@types/jest": "npm:^29.5.12" "@types/mock-fs": "npm:^4.13.4" "@types/prompts": "npm:^2.4.9" @@ -667,8 +668,8 @@ __metadata: ink-link: "npm:^3.0.0" ink-text-input: "npm:^5.0.1" jest: "npm:^29.7.0" + memfs: "npm:^4.14.0" mock-fs: "npm:^5.2.0" - openai: "npm:^4.56.0" prettier: "npm:^3.2.5" prompts: "npm:^2.4.2" react: "npm:^18.2.0" @@ -677,11 +678,12 @@ __metadata: tiktoken: "npm:^1.0.16" typescript: "npm:^5.4.5" update-notifier: "npm:^7.0.0" + vitest: "npm:^2.1.3" yargs: "npm:^17.7.2" zod: "npm:^3.23.6" zustand: "npm:^4.5.2" bin: - ai: build/bin.js + ai: ./bin.js languageName: unknown linkType: soft @@ -737,6 +739,167 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -1121,7 +1284,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": version: 1.5.0 resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd @@ -1138,6 +1301,38 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/base64@npm:^1.1.1": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 10/d76bb58eff841c090d9bf69a073611ffa73c40a664ccbcea689f65961f57d7b24051269d06b437e4f6204285d6ba92f50f587c5e95c5f9e4f10b36a2ed4cd0c8 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^1.0.3": + version: 1.1.0 + resolution: "@jsonjoy.com/json-pack@npm:1.1.0" + dependencies: + "@jsonjoy.com/base64": "npm:^1.1.1" + "@jsonjoy.com/util": "npm:^1.1.2" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^1.20.0" + peerDependencies: + tslib: 2 + checksum: 10/cd2776085ad56b470cd53137880b87c2503b07781756c50f1e9f40dd909abeba130a6144d203fcf605ec03dee4cd19bb3424169c8cb588f90a3f06939994c64e + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:^1.1.2, @jsonjoy.com/util@npm:^1.3.0": + version: 1.5.0 + resolution: "@jsonjoy.com/util@npm:1.5.0" + peerDependencies: + tslib: 2 + checksum: 10/5b370183700cb40af52841294ba99c3dfb3dcb7fe2a122e15c737eb908d11392d314b75518874c7d631092bb29658ebe298d174b05baeb1adeb33884b9aa33cf + languageName: node + linkType: hard + "@mistralai/mistralai@npm:^1.0.2": version: 1.0.2 resolution: "@mistralai/mistralai@npm:1.0.2" @@ -1147,6 +1342,42 @@ __metadata: languageName: node linkType: hard +"@module-federation/runtime-tools@npm:0.5.1": + version: 0.5.1 + resolution: "@module-federation/runtime-tools@npm:0.5.1" + dependencies: + "@module-federation/runtime": "npm:0.5.1" + "@module-federation/webpack-bundler-runtime": "npm:0.5.1" + checksum: 10/3c88a7ac45b369e82ccea104db952ab81709a11733b602cf5f1d35b299d1d2f0ce679afc0fd4105386345e727a8f67e141480f708f244fa8c40f898a917c694b + languageName: node + linkType: hard + +"@module-federation/runtime@npm:0.5.1": + version: 0.5.1 + resolution: "@module-federation/runtime@npm:0.5.1" + dependencies: + "@module-federation/sdk": "npm:0.5.1" + checksum: 10/c5b998fdbf6c8ceee2f204d501f8cbe8b4356e4d0a03e767c49107ff6b2a11a077bb4fd17d042dfb050d483eca1baf9b50663e53d3ee9bd8148865be3bb63dcc + languageName: node + linkType: hard + +"@module-federation/sdk@npm:0.5.1": + version: 0.5.1 + resolution: "@module-federation/sdk@npm:0.5.1" + checksum: 10/7569f53f7e0d64ecfb57750d44dac93ba267f35b18921ff84ef2cc12a600690a28460cb2a5b9f2a3e0218b5e45879c16ab980c48930f82065f2c27f476ac3c6e + languageName: node + linkType: hard + +"@module-federation/webpack-bundler-runtime@npm:0.5.1": + version: 0.5.1 + resolution: "@module-federation/webpack-bundler-runtime@npm:0.5.1" + dependencies: + "@module-federation/runtime": "npm:0.5.1" + "@module-federation/sdk": "npm:0.5.1" + checksum: 10/ba09e67a6d8f49a88a1660fbd2553de0d6a3524064cd12870688c79a04ac139ed8faf1657f8f805008b29c56db7c0254b64c0793ffc96d522ab1177d28a365bf + languageName: node + linkType: hard + "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": version: 5.1.1-v1 resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" @@ -1419,6 +1650,273 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.24.4" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-android-arm64@npm:4.24.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-darwin-arm64@npm:4.24.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-darwin-x64@npm:4.24.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.24.4" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-freebsd-x64@npm:4.24.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.24.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.24.4" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.24.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.24.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.24.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.24.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.24.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.24.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.24.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.24.4" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.24.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rsbuild/core@npm:^1.0.3": + version: 1.0.19 + resolution: "@rsbuild/core@npm:1.0.19" + dependencies: + "@rspack/core": "npm:~1.0.14" + "@rspack/lite-tapable": "npm:~1.0.1" + "@swc/helpers": "npm:^0.5.13" + core-js: "npm:~3.38.1" + fsevents: "npm:~2.3.3" + dependenciesMeta: + fsevents: + optional: true + bin: + rsbuild: bin/rsbuild.js + checksum: 10/bf6b584ad5121d5f5d5db54e1f0bdcd10f3a0c2e9175d8bbf9b913813da0542240908cc8bfe9d1eb3db0732fdc2c4b2af7134a3cabc041e19ac22b2a0d750fc0 + languageName: node + linkType: hard + +"@rspack/binding-darwin-arm64@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding-darwin-arm64@npm:1.0.14" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rspack/binding-darwin-x64@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding-darwin-x64@npm:1.0.14" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rspack/binding-linux-arm64-gnu@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.0.14" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rspack/binding-linux-arm64-musl@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.0.14" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rspack/binding-linux-x64-gnu@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.0.14" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rspack/binding-linux-x64-musl@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding-linux-x64-musl@npm:1.0.14" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rspack/binding-win32-arm64-msvc@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.0.14" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rspack/binding-win32-ia32-msvc@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.0.14" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rspack/binding-win32-x64-msvc@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.0.14" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rspack/binding@npm:1.0.14": + version: 1.0.14 + resolution: "@rspack/binding@npm:1.0.14" + dependencies: + "@rspack/binding-darwin-arm64": "npm:1.0.14" + "@rspack/binding-darwin-x64": "npm:1.0.14" + "@rspack/binding-linux-arm64-gnu": "npm:1.0.14" + "@rspack/binding-linux-arm64-musl": "npm:1.0.14" + "@rspack/binding-linux-x64-gnu": "npm:1.0.14" + "@rspack/binding-linux-x64-musl": "npm:1.0.14" + "@rspack/binding-win32-arm64-msvc": "npm:1.0.14" + "@rspack/binding-win32-ia32-msvc": "npm:1.0.14" + "@rspack/binding-win32-x64-msvc": "npm:1.0.14" + dependenciesMeta: + "@rspack/binding-darwin-arm64": + optional: true + "@rspack/binding-darwin-x64": + optional: true + "@rspack/binding-linux-arm64-gnu": + optional: true + "@rspack/binding-linux-arm64-musl": + optional: true + "@rspack/binding-linux-x64-gnu": + optional: true + "@rspack/binding-linux-x64-musl": + optional: true + "@rspack/binding-win32-arm64-msvc": + optional: true + "@rspack/binding-win32-ia32-msvc": + optional: true + "@rspack/binding-win32-x64-msvc": + optional: true + checksum: 10/5a01ff4334920b981032a8e1bd0819393041e859e97bc889113a9de89caecfc4b7dd62e9c56354c427ae3ecfde6e7c43b107dfff02e5d945dacb130da238c73b + languageName: node + linkType: hard + +"@rspack/core@npm:~1.0.14": + version: 1.0.14 + resolution: "@rspack/core@npm:1.0.14" + dependencies: + "@module-federation/runtime-tools": "npm:0.5.1" + "@rspack/binding": "npm:1.0.14" + "@rspack/lite-tapable": "npm:1.0.1" + caniuse-lite: "npm:^1.0.30001616" + peerDependencies: + "@swc/helpers": ">=0.5.1" + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 10/3743c2dd9e7337f06091bf3d6c4462294f379aefb1069a1cf561b178b6dc7d8a294856323aab61e2c15f520bf693377e11bc415322ca8ea045adf84e4daeeba3 + languageName: node + linkType: hard + +"@rspack/lite-tapable@npm:1.0.1, @rspack/lite-tapable@npm:~1.0.1": + version: 1.0.1 + resolution: "@rspack/lite-tapable@npm:1.0.1" + checksum: 10/240b7832965bca5a52d1f03a8539dab5810958ce24b5a670405b2505d81350f10d668f4055648f5918bc18ac033e637bcb7f92189345f0f2f671b546019c2f9e + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -1451,6 +1949,15 @@ __metadata: languageName: node linkType: hard +"@swc/helpers@npm:^0.5.13": + version: 0.5.13 + resolution: "@swc/helpers@npm:0.5.13" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/6ba2f7e215d32d71fce139e2cfc426b3ed7eaa709febdeb07b97260a4c9eea4784cf047cc1271be273990b08220b576b94a42b5780947c0b3be84973a847a24d + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^5.0.1": version: 5.0.1 resolution: "@szmarczak/http-timer@npm:5.0.1" @@ -1515,6 +2022,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:1.0.6, @types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + "@types/graceful-fs@npm:^4.1.3": version: 4.1.9 resolution: "@types/graceful-fs@npm:4.1.9" @@ -1891,6 +2405,87 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/expect@npm:2.1.4" + dependencies: + "@vitest/spy": "npm:2.1.4" + "@vitest/utils": "npm:2.1.4" + chai: "npm:^5.1.2" + tinyrainbow: "npm:^1.2.0" + checksum: 10/0b3806d39233843a9661f6d5ccde489c9b6d278426f889198a862d601dcc186f107398487374195eb0dae90c9f69628f3f216200d644f817fa25d64ae1bc537e + languageName: node + linkType: hard + +"@vitest/mocker@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/mocker@npm:2.1.4" + dependencies: + "@vitest/spy": "npm:2.1.4" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.12" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10/00f323cc184977b247a1f0b9c51fdcceb97377031d728c69ef0bd14ebf0256742a94c68c6caa90eb073ed3de4277febd7d54715508bff05bb2fb7767ce11afbe + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.1.4, @vitest/pretty-format@npm:^2.1.4": + version: 2.1.4 + resolution: "@vitest/pretty-format@npm:2.1.4" + dependencies: + tinyrainbow: "npm:^1.2.0" + checksum: 10/434e6a7903f72a3796f26516ad728aca92724909e18fd3f2cd4b9b8b0ae2cc7b4cd86e92ab9f2ac7bc005c7a7ef0bcb9d768c0264b4b0625f1f0748cc615f1f6 + languageName: node + linkType: hard + +"@vitest/runner@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/runner@npm:2.1.4" + dependencies: + "@vitest/utils": "npm:2.1.4" + pathe: "npm:^1.1.2" + checksum: 10/51dbea968ace6edefb058d88c9736fa524a64f4dc750ec163b43f5015a31b31f2d80a7b20de4c2a819fbfb172162ad4d0f8428c78fa7ca832c1a1b135161ac4b + languageName: node + linkType: hard + +"@vitest/snapshot@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/snapshot@npm:2.1.4" + dependencies: + "@vitest/pretty-format": "npm:2.1.4" + magic-string: "npm:^0.30.12" + pathe: "npm:^1.1.2" + checksum: 10/785f74cf5f7745eb0dcb73fe3c628bc1f687c6341e8ba63d722fa83609d21465302ebd208405b9f91ce87fb36720a0f361c949983d5caccbcb8ec2119f995483 + languageName: node + linkType: hard + +"@vitest/spy@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/spy@npm:2.1.4" + dependencies: + tinyspy: "npm:^3.0.2" + checksum: 10/4dd3e7c28928abb047c567b3711d1cbccd59aaae294c57efaab83cdd723b568882de5376fc086c919a4cb6d1df5e6cc0502b3171cce06dfce87863c731fd5d36 + languageName: node + linkType: hard + +"@vitest/utils@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/utils@npm:2.1.4" + dependencies: + "@vitest/pretty-format": "npm:2.1.4" + loupe: "npm:^3.1.2" + tinyrainbow: "npm:^1.2.0" + checksum: 10/aaaf5310943abca0f0080d9638e67838f7e519d5670ec32e61184915efdfa5ec61d9b495cad6cb7dc492e8caeed14593e78dda77c8ea59c1671a231661f57142 + languageName: node + linkType: hard + "JSONStream@npm:^1.0.4": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -2287,6 +2882,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10/a0789dd882211b87116e81e2648ccb7f60340b34f19877dd020b39ebb4714e475eb943e14ba3e22201c221ef6645b7bfe10297e76b6ac95b48a9898c1211ce66 + languageName: node + linkType: hard + "ast-types-flow@npm:^0.0.7": version: 0.0.7 resolution: "ast-types-flow@npm:0.0.7" @@ -2609,6 +3211,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10/002769a0fbfc51c062acd2a59df465a2a947916b02ac50b56c69ec6c018ee99ac3e7f4dd7366334ea847f1ecacf4defaa61bcd2ac283db50156ce1f1d8c8ad42 + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.4 resolution: "cacache@npm:18.0.4" @@ -2722,6 +3331,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001616": + version: 1.0.30001677 + resolution: "caniuse-lite@npm:1.0.30001677" + checksum: 10/e07439bdeade5ffdd974691f44f8549ae0730fcf510acaa32d0b657c10370cd5aad09eeca37248966205fb37fce5f464dbce73ce177b4a1fdc3a34adbcfd7192 + languageName: node + linkType: hard + "caniuse-lite@npm:^1.0.30001646": version: 1.0.30001651 resolution: "caniuse-lite@npm:1.0.30001651" @@ -2729,6 +3345,19 @@ __metadata: languageName: node linkType: hard +"chai@npm:^5.1.2": + version: 5.1.2 + resolution: "chai@npm:5.1.2" + dependencies: + assertion-error: "npm:^2.0.1" + check-error: "npm:^2.1.1" + deep-eql: "npm:^5.0.1" + loupe: "npm:^3.1.0" + pathval: "npm:^2.0.0" + checksum: 10/e8c2bbc83cb5a2f87130d93056d4cfbbe04106e12aa798b504816dbe3fa538a9f68541b472e56cbf0f54558b501d7e31867d74b8218abcd5a8cc8ba536fba46c + languageName: node + linkType: hard + "chalk@npm:5.2.0": version: 5.2.0 resolution: "chalk@npm:5.2.0" @@ -2778,6 +3407,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: 10/d785ed17b1d4a4796b6e75c765a9a290098cf52ff9728ce0756e8ffd4293d2e419dd30c67200aee34202463b474306913f2fcfaf1890641026d9fc6966fea27a + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -3238,6 +3874,13 @@ __metadata: languageName: node linkType: hard +"core-js@npm:~3.38.1": + version: 3.38.1 + resolution: "core-js@npm:3.38.1" + checksum: 10/3c25fdf0b2595ed37ceb305213a61e2cf26185f628455e99d1c736dda5f69e2de4de7126e6a1da136f54260c4fcc982c4215e37b5a618790a597930f854c0a37 + languageName: node + linkType: hard + "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -3390,6 +4033,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.7": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/71168908b9a78227ab29d5d25fe03c5867750e31ce24bf2c44a86efc5af041758bb56569b0a3d48a9b5344c00a24a777e6f4100ed6dfd9534a42c1dde285125a + languageName: node + linkType: hard + "decamelize-keys@npm:^1.1.0": version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" @@ -3435,6 +4090,13 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 10/a529b81e2ef8821621d20a36959a0328873a3e49d393ad11f8efe8559f31239494c2eb889b80342808674c475802ba95b9d6c4c27641b9a029405104c1b59fcf + languageName: node + linkType: hard + "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -3900,6 +4562,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10/d2ff2ca84d30cce8e871517374d6c2290835380dc7cd413b2d49189ed170d45e407be14de2cb4794cf76f75cf89955c4714726ebd3de7444b3046f5cab23ab6b + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.1.2": version: 3.1.2 resolution: "escalade@npm:3.1.2" @@ -4311,6 +5053,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10/a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -4390,6 +5141,13 @@ __metadata: languageName: node linkType: hard +"expect-type@npm:^1.1.0": + version: 1.1.0 + resolution: "expect-type@npm:1.1.0" + checksum: 10/05fca80ddc7d493a89361f783c6b000750fa04a8226bc24701f3b90adb0efc2fb467f2a0baaed4015a02d8b9034ef5bb87521df9dba980f50b1105bd596ef833 + languageName: node + linkType: hard + "expect@npm:^29.0.0, expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" @@ -4664,7 +5422,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -4674,7 +5432,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin": +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -5226,6 +5984,13 @@ __metadata: languageName: node linkType: hard +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 10/64abb5568ff17aa08ac0175ae55e46e22831c5552be98acdd1692081db0209f36fff58b31432017b4e1772c178962676a2cc3c54e4d5d7f020d7710cec7ad7a6 + languageName: node + linkType: hard + "iconv-lite@npm:^0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -6907,6 +7672,13 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^3.1.0, loupe@npm:^3.1.2": + version: 3.1.2 + resolution: "loupe@npm:3.1.2" + checksum: 10/8f5734e53fb64cd914aa7d986e01b6d4c2e3c6c56dcbd5428d71c2703f0ab46b5ab9f9eeaaf2b485e8a1c43f865bdd16ec08ae1a661c8f55acdbd9f4d59c607a + languageName: node + linkType: hard + "lowercase-keys@npm:^3.0.0": version: 3.0.0 resolution: "lowercase-keys@npm:3.0.0" @@ -6953,6 +7725,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.12": + version: 0.30.12 + resolution: "magic-string@npm:0.30.12" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10/98016180a52b28efc1362152b45671067facccdaead6b70c1c14c566cba98491bc2e1336474b0996397730dca24400e85649da84d3da62b2560ed03c067573e6 + languageName: node + linkType: hard + "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -7005,6 +7786,18 @@ __metadata: languageName: node linkType: hard +"memfs@npm:^4.14.0": + version: 4.14.0 + resolution: "memfs@npm:4.14.0" + dependencies: + "@jsonjoy.com/json-pack": "npm:^1.0.3" + "@jsonjoy.com/util": "npm:^1.3.0" + tree-dump: "npm:^1.0.1" + tslib: "npm:^2.0.0" + checksum: 10/d1a5a38fb8e97cbdff012e47d05c92852484f37a03e9c57b252fdc180c4ffe35ee7ec83acea3be8950e1f13f9152db4d5478124b43f9673f4653e741ba26d584 + languageName: node + linkType: hard + "meow@npm:^10.1.3": version: 10.1.5 resolution: "meow@npm:10.1.5" @@ -7278,7 +8071,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -7588,28 +8381,6 @@ __metadata: languageName: node linkType: hard -"openai@npm:^4.56.0": - version: 4.56.0 - resolution: "openai@npm:4.56.0" - dependencies: - "@types/node": "npm:^18.11.18" - "@types/node-fetch": "npm:^2.6.4" - abort-controller: "npm:^3.0.0" - agentkeepalive: "npm:^4.2.1" - form-data-encoder: "npm:1.7.2" - formdata-node: "npm:^4.3.2" - node-fetch: "npm:^2.6.7" - peerDependencies: - zod: ^3.23.8 - peerDependenciesMeta: - zod: - optional: true - bin: - openai: bin/cli - checksum: 10/aa56629db58a94e2c27e09a0de72e511f207e4cae5aa15b65eaf9c905105fee8356a631bae88e7737c655b19f2e5bb3ad37ca1c1b33fe3f6932ff961f26b46ca - languageName: node - linkType: hard - "openai@npm:^4.56.1": version: 4.70.2 resolution: "openai@npm:4.70.2" @@ -7985,6 +8756,20 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: 10/f201d796351bf7433d147b92c20eb154a4e0ea83512017bf4ec4e492a5d6e738fb45798be4259a61aa81270179fce11026f6ff0d3fa04173041de044defe9d80 + languageName: node + linkType: hard + +"pathval@npm:^2.0.0": + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 10/b91575bf9cdf01757afd7b5e521eb8a0b874a49bc972d08e0047cfea0cd3c019f5614521d4bc83d2855e3fcc331db6817dfd533dd8f3d90b16bc76fad2450fc1 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": version: 1.0.1 resolution: "picocolors@npm:1.0.1" @@ -7992,6 +8777,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.1.0": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -8036,6 +8828,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.43": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.1.0" + source-map-js: "npm:^1.2.1" + checksum: 10/f2b50ba9b6fcb795232b6bb20de7cdc538c0025989a8ed9c4438d1960196ba3b7eaff41fdb1a5c701b3504651ea87aeb685577707f0ae4d6ce6f3eae5df79a81 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -8650,6 +9453,75 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.20.0": + version: 4.24.4 + resolution: "rollup@npm:4.24.4" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.24.4" + "@rollup/rollup-android-arm64": "npm:4.24.4" + "@rollup/rollup-darwin-arm64": "npm:4.24.4" + "@rollup/rollup-darwin-x64": "npm:4.24.4" + "@rollup/rollup-freebsd-arm64": "npm:4.24.4" + "@rollup/rollup-freebsd-x64": "npm:4.24.4" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.24.4" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.24.4" + "@rollup/rollup-linux-arm64-gnu": "npm:4.24.4" + "@rollup/rollup-linux-arm64-musl": "npm:4.24.4" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.24.4" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.24.4" + "@rollup/rollup-linux-s390x-gnu": "npm:4.24.4" + "@rollup/rollup-linux-x64-gnu": "npm:4.24.4" + "@rollup/rollup-linux-x64-musl": "npm:4.24.4" + "@rollup/rollup-win32-arm64-msvc": "npm:4.24.4" + "@rollup/rollup-win32-ia32-msvc": "npm:4.24.4" + "@rollup/rollup-win32-x64-msvc": "npm:4.24.4" + "@types/estree": "npm:1.0.6" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10/a8ffde17d7cd5d9eaaf91bb025de83329b034771254d34b977df3f294e0992f6d89a444a0c8e9d73c8721d60cedf5be32fa8bd6f157874700bb8043c61ca660a + languageName: node + linkType: hard + "run-applescript@npm:^5.0.0": version: 5.0.0 resolution: "run-applescript@npm:5.0.0" @@ -8869,6 +9741,13 @@ __metadata: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10/e93ff66c6531a079af8fb217240df01f980155b5dc408d2d7bebc398dd284e383eb318153bf8acd4db3c4fe799aa5b9a641e38b0ba3b1975700b1c89547ea4e7 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -8952,6 +9831,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 + languageName: node + linkType: hard + "source-map-support@npm:0.5.13": version: 0.5.13 resolution: "source-map-support@npm:0.5.13" @@ -9064,6 +9950,20 @@ __metadata: languageName: node linkType: hard +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10/2d4dc4e64e2db796de4a3c856d5943daccdfa3dd092e452a1ce059c81e9a9c29e0b9badba91b43ef0d5ff5c04ee62feb3bcc559a804e16faf447bac2d883aa99 + languageName: node + linkType: hard + +"std-env@npm:^3.7.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 10/6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 + languageName: node + linkType: hard + "stdin-discarder@npm:^0.1.0": version: 0.1.0 resolution: "stdin-discarder@npm:0.1.0" @@ -9437,6 +10337,15 @@ __metadata: languageName: node linkType: hard +"thingies@npm:^1.20.0": + version: 1.21.0 + resolution: "thingies@npm:1.21.0" + peerDependencies: + tslib: ^2 + checksum: 10/5c3954b67391d1432c252cb7089f29480e2164f06987a63d83c9747aa6999bfc313d6edfce71ed967316a3378dfcaf38f35ea77aaa5d423edaf776b8ff854f83 + languageName: node + linkType: hard + "throttleit@npm:2.1.0": version: 2.1.0 resolution: "throttleit@npm:2.1.0" @@ -9477,6 +10386,41 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10/cfa1e1418e91289219501703c4693c70708c91ffb7f040fd318d24aef419fb5a43e0c0160df9471499191968b2451d8da7f8087b08c3133c251c40d24aced06c + languageName: node + linkType: hard + +"tinyexec@npm:^0.3.1": + version: 0.3.1 + resolution: "tinyexec@npm:0.3.1" + checksum: 10/0537c70590d52d354f40c0255ff0f654a3d18ddb3812b440ddf9d436edf516c8057838ad5a38744c0c59670ec03e3cf23fbe04ae3d49f031d948274e99002569 + languageName: node + linkType: hard + +"tinypool@npm:^1.0.1": + version: 1.0.1 + resolution: "tinypool@npm:1.0.1" + checksum: 10/eaceb93784b8e27e60c0e3e2c7d11c29e1e79b2a025b2c232215db73b90fe22bd4753ad53fc8e801c2b5a63b94a823af549555d8361272bc98271de7dd4a9925 + languageName: node + linkType: hard + +"tinyrainbow@npm:^1.2.0": + version: 1.2.0 + resolution: "tinyrainbow@npm:1.2.0" + checksum: 10/2924444db6804355e5ba2b6e586c7f77329d93abdd7257a069a0f4530dff9f16de484e80479094e3f39273462541b003a65ee3a6afc2d12555aa745132deba5d + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.2": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 10/5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 + languageName: node + linkType: hard + "titleize@npm:^3.0.0": version: 3.0.0 resolution: "titleize@npm:3.0.0" @@ -9523,6 +10467,15 @@ __metadata: languageName: node linkType: hard +"tree-dump@npm:^1.0.1": + version: 1.0.2 + resolution: "tree-dump@npm:1.0.2" + peerDependencies: + tslib: 2 + checksum: 10/ddcde4da9ded8edc2fa77fc9153ef8d7fba9cd5f813db27c30c7039191b50e1512b7106f0f4fe7ccaa3aa69f85b4671eda7ed0b9f9d34781eb26ebe4593ad4eb + languageName: node + linkType: hard + "trim-newlines@npm:^3.0.0": version: 3.0.1 resolution: "trim-newlines@npm:3.0.1" @@ -9572,6 +10525,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.0.0, tslib@npm:^2.4.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 + languageName: node + linkType: hard + "tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.6.2": version: 2.6.3 resolution: "tslib@npm:2.6.3" @@ -9965,6 +10925,113 @@ __metadata: languageName: node linkType: hard +"vite-node@npm:2.1.4": + version: 2.1.4 + resolution: "vite-node@npm:2.1.4" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.3.7" + pathe: "npm:^1.1.2" + vite: "npm:^5.0.0" + bin: + vite-node: vite-node.mjs + checksum: 10/3c3fbe6e41ab1716f4e6e0b52dcb80e027cb481df03e31d9bb5d16bb0ffabc5c884cca705ef8a5dea60f787e5eb78a428977d0d40e61e1f331bfb8c3d486d3e2 + languageName: node + linkType: hard + +"vite@npm:^5.0.0": + version: 5.4.10 + resolution: "vite@npm:5.4.10" + dependencies: + esbuild: "npm:^0.21.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10/5d4a427d585d6f9114fc383114f707dca46408f54b221709e5eb6b0c16e0b4dec4baf908a7db9a8f1e5b16e64b655900ac14629abe61c698cbe296115c65ed8a + languageName: node + linkType: hard + +"vitest@npm:^2.1.3": + version: 2.1.4 + resolution: "vitest@npm:2.1.4" + dependencies: + "@vitest/expect": "npm:2.1.4" + "@vitest/mocker": "npm:2.1.4" + "@vitest/pretty-format": "npm:^2.1.4" + "@vitest/runner": "npm:2.1.4" + "@vitest/snapshot": "npm:2.1.4" + "@vitest/spy": "npm:2.1.4" + "@vitest/utils": "npm:2.1.4" + chai: "npm:^5.1.2" + debug: "npm:^4.3.7" + expect-type: "npm:^1.1.0" + magic-string: "npm:^0.30.12" + pathe: "npm:^1.1.2" + std-env: "npm:^3.7.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.1" + tinypool: "npm:^1.0.1" + tinyrainbow: "npm:^1.2.0" + vite: "npm:^5.0.0" + vite-node: "npm:2.1.4" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 2.1.4 + "@vitest/ui": 2.1.4 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10/bf0bb39e6148678ccc0d856a6a08e99458e80266558f97757bd20980812cd439f51599bcb64c807805594bf6fdb2111fdca688bc8884524819cc4a84a4598109 + languageName: node + linkType: hard + "vm2@npm:^3.9.19": version: 3.9.19 resolution: "vm2@npm:3.9.19" @@ -10113,6 +11180,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10/0de6e6cd8f2f94a8b5ca44e84cf1751eadcac3ebedcdc6e5fbbe6c8011904afcbc1a2777c53496ec02ced7b81f2e7eda61e76bf8262a8bc3ceaa1f6040508051 + languageName: node + linkType: hard + "widest-line@npm:^4.0.1": version: 4.0.1 resolution: "widest-line@npm:4.0.1" From 37dbc967f01b5246d1debb99b9b49721a757f28d Mon Sep 17 00:00:00 2001 From: Kewin Wereszczynski Date: Mon, 4 Nov 2024 15:23:37 +0100 Subject: [PATCH 03/10] chore: pipeline fix --- .eslintignore | 1 + package.json | 3 +- yarn.lock | 113 ++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 107 insertions(+), 10 deletions(-) diff --git a/.eslintignore b/.eslintignore index fd892ee..3a2280f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,3 +3,4 @@ build/ dist/ website/ rsbuild.config.ts +bin.js diff --git a/package.json b/package.json index 527b8f3..3856031 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "@types/prompts": "^2.4.9", "@types/react": "^18.2.63", "@types/update-notifier": "^6.0.8", + "@vitest/coverage-v8": "^2.1.4", "del-cli": "^5.1.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", @@ -84,7 +85,7 @@ "prettier": "^3.2.5", "release-it": "^15.11.0", "typescript": "^5.4.5", - "vitest": "^2.1.3" + "vitest": "^2.1.4" }, "packageManager": "yarn@4.4.0", "engines": { diff --git a/yarn.lock b/yarn.lock index 2e35e9d..81cb424 100644 --- a/yarn.lock +++ b/yarn.lock @@ -162,7 +162,7 @@ __metadata: languageName: node linkType: hard -"@ampproject/remapping@npm:^2.2.0": +"@ampproject/remapping@npm:^2.2.0, @ampproject/remapping@npm:^2.3.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" dependencies: @@ -323,6 +323,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-validator-identifier@npm:7.24.7" @@ -330,6 +337,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.24.8": version: 7.24.8 resolution: "@babel/helper-validator-option@npm:7.24.8" @@ -370,6 +384,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.25.4": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" + dependencies: + "@babel/types": "npm:^7.26.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/8baee43752a3678ad9f9e360ec845065eeee806f1fdc8e0f348a8a0e13eef0959dabed4a197c978896c493ea205c804d0a1187cc52e4a1ba017c7935bab4983d + languageName: node + linkType: hard + "@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" @@ -629,6 +654,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.25.4, @babel/types@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/40780741ecec886ed9edae234b5eb4976968cc70d72b4e5a40d55f83ff2cc457de20f9b0f4fe9d858350e43dab0ea496e7ef62e2b2f08df699481a76df02cd6e + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -655,6 +690,7 @@ __metadata: "@types/prompts": "npm:^2.4.9" "@types/react": "npm:^18.2.63" "@types/update-notifier": "npm:^6.0.8" + "@vitest/coverage-v8": "npm:^2.1.4" chalk: "npm:^5.3.0" date-fns: "npm:^3.6.0" del-cli: "npm:^5.1.0" @@ -678,7 +714,7 @@ __metadata: tiktoken: "npm:^1.0.16" typescript: "npm:^5.4.5" update-notifier: "npm:^7.0.0" - vitest: "npm:^2.1.3" + vitest: "npm:^2.1.4" yargs: "npm:^17.7.2" zod: "npm:^3.23.6" zustand: "npm:^4.5.2" @@ -1291,7 +1327,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -2405,6 +2441,32 @@ __metadata: languageName: node linkType: hard +"@vitest/coverage-v8@npm:^2.1.4": + version: 2.1.4 + resolution: "@vitest/coverage-v8@npm:2.1.4" + dependencies: + "@ampproject/remapping": "npm:^2.3.0" + "@bcoe/v8-coverage": "npm:^0.2.3" + debug: "npm:^4.3.7" + istanbul-lib-coverage: "npm:^3.2.2" + istanbul-lib-report: "npm:^3.0.1" + istanbul-lib-source-maps: "npm:^5.0.6" + istanbul-reports: "npm:^3.1.7" + magic-string: "npm:^0.30.12" + magicast: "npm:^0.3.5" + std-env: "npm:^3.7.0" + test-exclude: "npm:^7.0.1" + tinyrainbow: "npm:^1.2.0" + peerDependencies: + "@vitest/browser": 2.1.4 + vitest: 2.1.4 + peerDependenciesMeta: + "@vitest/browser": + optional: true + checksum: 10/9f3ad103c63a1d0377a404ccdbdbd42a018f19d5bf57c2031bfd6fd6df4acd464a38e1a38ee4a2e6d3c282d6e1664dbb168f3986c01c294186f584af89b9eee9 + languageName: node + linkType: hard + "@vitest/expect@npm:2.1.4": version: 2.1.4 resolution: "@vitest/expect@npm:2.1.4" @@ -5644,7 +5706,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.1": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -6756,7 +6818,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0, istanbul-lib-coverage@npm:^3.2.2": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" checksum: 10/40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 @@ -6789,7 +6851,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-report@npm:^3.0.0": +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": version: 3.0.1 resolution: "istanbul-lib-report@npm:3.0.1" dependencies: @@ -6811,7 +6873,18 @@ __metadata: languageName: node linkType: hard -"istanbul-reports@npm:^3.1.3": +"istanbul-lib-source-maps@npm:^5.0.6": + version: 5.0.6 + resolution: "istanbul-lib-source-maps@npm:5.0.6" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.23" + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + checksum: 10/569dd0a392ee3464b1fe1accbaef5cc26de3479eacb5b91d8c67ebb7b425d39fd02247d85649c3a0e9c29b600809fa60b5af5a281a75a89c01f385b1e24823a2 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3, istanbul-reports@npm:^3.1.7": version: 3.1.7 resolution: "istanbul-reports@npm:3.1.7" dependencies: @@ -7734,6 +7807,17 @@ __metadata: languageName: node linkType: hard +"magicast@npm:^0.3.5": + version: 0.3.5 + resolution: "magicast@npm:0.3.5" + dependencies: + "@babel/parser": "npm:^7.25.4" + "@babel/types": "npm:^7.25.4" + source-map-js: "npm:^1.2.0" + checksum: 10/3a2dba6b0bdde957797361d09c7931ebdc1b30231705360eeb40ed458d28e1c3112841c3ed4e1b87ceb28f741e333c7673cd961193aa9fdb4f4946b202e6205a + languageName: node + linkType: hard + "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -9831,7 +9915,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.2.1": +"source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 @@ -10323,6 +10407,17 @@ __metadata: languageName: node linkType: hard +"test-exclude@npm:^7.0.1": + version: 7.0.1 + resolution: "test-exclude@npm:7.0.1" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^10.4.1" + minimatch: "npm:^9.0.4" + checksum: 10/e6f6f4e1df2e7810e082e8d7dfc53be51a931e6e87925f5e1c2ef92cc1165246ba3bf2dae6b5d86251c16925683dba906bd41e40169ebc77120a2d1b5a0dbbe0 + languageName: node + linkType: hard + "text-extensions@npm:^1.0.0": version: 1.9.0 resolution: "text-extensions@npm:1.9.0" @@ -10982,7 +11077,7 @@ __metadata: languageName: node linkType: hard -"vitest@npm:^2.1.3": +"vitest@npm:^2.1.4": version: 2.1.4 resolution: "vitest@npm:2.1.4" dependencies: From 554f98b040c336733625c38313e94b697ef81acd Mon Sep 17 00:00:00 2001 From: Kewin Wereszczynski Date: Mon, 4 Nov 2024 15:34:09 +0100 Subject: [PATCH 04/10] chore: fixing the pipeline --- .eslintignore | 1 + .github/workflows/ci.yml | 2 +- tsconfig.json | 6 +++--- vitest.config.ts | 11 +++++++++++ 4 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 vitest.config.ts diff --git a/.eslintignore b/.eslintignore index 3a2280f..9931605 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,4 +3,5 @@ build/ dist/ website/ rsbuild.config.ts +vitest.config.ts bin.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 09a8889..8e622e2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: uses: ./.github/actions/setup - name: Run unit tests - run: yarn test --maxWorkers=2 --coverage + run: yarn test --coverage build-library: runs-on: ubuntu-latest diff --git a/tsconfig.json b/tsconfig.json index 204fc06..eff5686 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,8 @@ { - "paths": { - "ai-cli": ["./src/index.js"] - }, "compilerOptions": { + "paths": { + "ai-cli": ["./src/index.js"] + }, "target": "esnext", "module": "node16", "moduleResolution": "node16", diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..e3b7de1 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + poolOptions: { + threads: { + maxThreads: 2, + }, + }, + }, +}); From 942b5adea411fba1dbdd087d6ce1832b39684cf6 Mon Sep 17 00:00:00 2001 From: Kewin Wereszczynski Date: Mon, 4 Nov 2024 15:58:38 +0100 Subject: [PATCH 05/10] chore: brought back non-streaming response --- src/commands/chat/ui/ChatUi.tsx | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/commands/chat/ui/ChatUi.tsx b/src/commands/chat/ui/ChatUi.tsx index 6497b2f..dae73fb 100644 --- a/src/commands/chat/ui/ChatUi.tsx +++ b/src/commands/chat/ui/ChatUi.tsx @@ -80,20 +80,15 @@ function useAiResponse() { setLoadedResponse(undefined); const messages = useChatState.getState().contextMessages; - if (stream) { - const { response } = await app.processMessages(messages, { - onPartialResponse: (update) => setLoadedResponse(update), - }); - - if (response.role == 'assistant') { - addAssistantResponse(response); - } else { - addProgramMessage(response.content); - } + + const { response } = await app.processMessages(messages, { + onPartialResponse: stream ? (update) => setLoadedResponse(update) : undefined, + }); + + if (response.role == 'assistant') { + addAssistantResponse(response); } else { - throw new Error('Non-Stream mode is not supported yet'); - // const response = await provider.getChatCompletion(providerConfig, messages); - // addAiResponse(response); + addProgramMessage(response.content); } } catch (error) { // We cannot leave unanswered user message in context, as there is no AI response for it. From 144129bb6ac0224315c263973fd333c96db8cfb4 Mon Sep 17 00:00:00 2001 From: Kewin Wereszczynski Date: Mon, 4 Nov 2024 16:00:18 +0100 Subject: [PATCH 06/10] chore: add typing for update --- src/commands/chat/ui/ChatUi.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/chat/ui/ChatUi.tsx b/src/commands/chat/ui/ChatUi.tsx index dae73fb..a707e77 100644 --- a/src/commands/chat/ui/ChatUi.tsx +++ b/src/commands/chat/ui/ChatUi.tsx @@ -82,7 +82,7 @@ function useAiResponse() { const messages = useChatState.getState().contextMessages; const { response } = await app.processMessages(messages, { - onPartialResponse: stream ? (update) => setLoadedResponse(update) : undefined, + onPartialResponse: stream ? (update: string) => setLoadedResponse(update) : undefined, }); if (response.role == 'assistant') { From 14295671526b1b9cb802ad7f22594dd62842d985 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Tue, 5 Nov 2024 16:10:25 +0100 Subject: [PATCH 07/10] chore: code review changes --- package.json | 2 +- src/commands/chat/state/init.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 3856031..bc5f7d7 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "lint": "eslint \"**/*.{js,ts,tsx}\"", "clean": "del-cli build", "release": "release-it", - "ai": "./bin.js" + "ai": "yarn build && ./bin.js" }, "repository": { "type": "git", diff --git a/src/commands/chat/state/init.ts b/src/commands/chat/state/init.ts index 31936d5..4bdd80c 100644 --- a/src/commands/chat/state/init.ts +++ b/src/commands/chat/state/init.ts @@ -1,4 +1,4 @@ -import { createApp, loggingPlugin, type Message } from '@callstack/byorg-core'; +import { createApp, type Message } from '@callstack/byorg-core'; import { type ConfigFile } from '../../../config-file.js'; import { DEFAULT_SYSTEM_PROMPT } from '../../../default-config.js'; import type { ResponseStyle } from '../../../engine/providers/config.js'; @@ -76,7 +76,6 @@ export function initChatState( const app = createApp({ chatModel: providerInfo.getChatModel(providerConfig), systemPrompt: () => providerConfig.systemPrompt, - plugins: [loggingPlugin], }); const state: ChatState = { From 9951ced4ad3e6ca793c046cb5c145a7383329b71 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Tue, 5 Nov 2024 16:12:57 +0100 Subject: [PATCH 08/10] refactor: revert provider info naming --- src/commands/chat/providers.tsx | 12 ++++-------- src/commands/chat/state/init.ts | 16 ++++++++-------- src/commands/chat/state/state.ts | 4 ++-- src/commands/chat/utils.ts | 4 ++-- src/commands/init/ui/InitUi.tsx | 6 +++--- src/commands/init/ui/SelectProviderStep.tsx | 8 ++++---- src/config-file.ts | 2 +- src/engine/providers/anthropic.ts | 4 ++-- src/engine/providers/mistral.ts | 4 ++-- src/engine/providers/open-ai.ts | 4 ++-- src/engine/providers/perplexity.ts | 4 ++-- .../providers/{provider-info.ts => provider.ts} | 6 +++--- src/engine/session.ts | 2 +- 13 files changed, 36 insertions(+), 40 deletions(-) rename src/engine/providers/{provider-info.ts => provider.ts} (92%) diff --git a/src/commands/chat/providers.tsx b/src/commands/chat/providers.tsx index 44d587e..c27708d 100644 --- a/src/commands/chat/providers.tsx +++ b/src/commands/chat/providers.tsx @@ -2,14 +2,10 @@ import openAi from '../../engine/providers/open-ai.js'; import anthropic from '../../engine/providers/anthropic.js'; import perplexity from '../../engine/providers/perplexity.js'; import mistral from '../../engine/providers/mistral.js'; -import { - getProvider, - type ProviderInfo, - type ProviderName, -} from '../../engine/providers/provider-info.js'; +import { getProvider, type Provider, type ProviderName } from '../../engine/providers/provider.js'; import type { ConfigFile } from '../../config-file.js'; -export const providerOptionMapping: Record = { +export const providerOptionMapping: Record = { openai: openAi, anthropic, anth: anthropic, @@ -20,7 +16,7 @@ export const providerOptionMapping: Record = { export const providerOptions = Object.keys(providerOptionMapping); -export function resolveProviderInfoFromOption(providerOption: string): ProviderInfo { +export function resolveProviderInfoFromOption(providerOption: string): Provider { const provider = providerOptionMapping[providerOption]; if (!provider) { throw new Error(`Provider not found: ${providerOption}.`); @@ -29,7 +25,7 @@ export function resolveProviderInfoFromOption(providerOption: string): ProviderI return provider; } -export function getDefaultProviderInfo(config: ConfigFile): ProviderInfo { +export function getDefaultProviderInfo(config: ConfigFile): Provider { const providerNames = Object.keys(config.providers) as ProviderName[]; const providerName = providerNames ? providerNames[0] : undefined; diff --git a/src/commands/chat/state/init.ts b/src/commands/chat/state/init.ts index 4bdd80c..66a1cae 100644 --- a/src/commands/chat/state/init.ts +++ b/src/commands/chat/state/init.ts @@ -12,19 +12,19 @@ export function initChatState( configFile: ConfigFile, initialPrompt: string, ) { - const providerInfo = options.provider + const provider = options.provider ? resolveProviderInfoFromOption(options.provider) : getDefaultProviderInfo(configFile); - const providerFileConfig = configFile.providers[providerInfo.name]; + const providerFileConfig = configFile.providers[provider.name]; if (!providerFileConfig) { - throw new Error(`Provider config not found: ${providerInfo.name}.`); + throw new Error(`Provider config not found: ${provider.name}.`); } const modelOrAlias = options.model ?? providerFileConfig.model; const model = modelOrAlias - ? (providerInfo.modelAliases[modelOrAlias] ?? modelOrAlias) - : providerInfo.defaultModel; + ? (provider.modelAliases[modelOrAlias] ?? modelOrAlias) + : provider.defaultModel; const systemPrompt = providerFileConfig.systemPrompt ?? DEFAULT_SYSTEM_PROMPT; @@ -57,7 +57,7 @@ export function initChatState( systemPrompt: fileSystemPrompt, costWarning, costInfo, - } = handleInputFile(options.file, providerConfig, providerInfo); + } = handleInputFile(options.file, providerConfig, provider); providerConfig.systemPrompt += `\n\n${fileSystemPrompt}`; @@ -74,13 +74,13 @@ export function initChatState( } const app = createApp({ - chatModel: providerInfo.getChatModel(providerConfig), + chatModel: provider.getChatModel(providerConfig), systemPrompt: () => providerConfig.systemPrompt, }); const state: ChatState = { activeView: null, - provider: providerInfo, + provider: provider, providerConfig, contextMessages, chatMessages: outputMessages, diff --git a/src/commands/chat/state/state.ts b/src/commands/chat/state/state.ts index b1059d7..e66359e 100644 --- a/src/commands/chat/state/state.ts +++ b/src/commands/chat/state/state.ts @@ -1,10 +1,10 @@ import { create } from 'zustand'; import type { Application, AssistantResponse, Message, UserMessage } from '@callstack/byorg-core'; import type { ProviderConfig } from '../../../engine/providers/config.js'; -import type { ProviderInfo } from '../../../engine/providers/provider-info.js'; +import type { Provider } from '../../../engine/providers/provider.js'; export interface ChatState { - provider: ProviderInfo; + provider: Provider; providerConfig: ProviderConfig; contextMessages: Message[]; chatMessages: ChatMessage[]; diff --git a/src/commands/chat/utils.ts b/src/commands/chat/utils.ts index 5ee8461..b1ad542 100644 --- a/src/commands/chat/utils.ts +++ b/src/commands/chat/utils.ts @@ -10,7 +10,7 @@ import { import { calculateUsageCost } from '../../engine/session.js'; import { getTokensCount } from '../../engine/tokenizer.js'; import type { ProviderConfig } from '../../engine/providers/config.js'; -import type { ProviderInfo } from '../../engine/providers/provider-info.js'; +import type { Provider } from '../../engine/providers/provider.js'; import { formatCost, formatTokenCount } from '../../format.js'; import { getConversationStoragePath, @@ -28,7 +28,7 @@ interface HandleInputFileResult { export function handleInputFile( inputFile: string, config: ProviderConfig, - provider: ProviderInfo, + provider: Provider, ): HandleInputFileResult { const filePath = path.resolve(inputFile.replace('~', os.homedir())); diff --git a/src/commands/init/ui/InitUi.tsx b/src/commands/init/ui/InitUi.tsx index 10c8082..7683aaf 100644 --- a/src/commands/init/ui/InitUi.tsx +++ b/src/commands/init/ui/InitUi.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { Box, Newline, Text } from 'ink'; -import { type ProviderInfo } from '../../../engine/providers/provider-info.js'; +import { type Provider } from '../../../engine/providers/provider.js'; import { writeConfigFile } from '../../../config-file.js'; import { colors } from '../../../theme/colors.js'; import { ExitApp } from '../../../components/ExitApp.js'; @@ -17,10 +17,10 @@ export function InitUi({ hasConfig }: InitUiProps) { const [step, setStep] = useState(0); const [overwriteConfig, setOverwriteConfig] = useState(true); - const [provider, setProvider] = useState(); + const [provider, setProvider] = useState(); const [hasKey, setHasKey] = useState(); - const writeConfig = (provider?: ProviderInfo, apiKey?: string) => { + const writeConfig = (provider?: Provider, apiKey?: string) => { if (!provider || !apiKey) { return; } diff --git a/src/commands/init/ui/SelectProviderStep.tsx b/src/commands/init/ui/SelectProviderStep.tsx index f94cd05..ef1d55b 100644 --- a/src/commands/init/ui/SelectProviderStep.tsx +++ b/src/commands/init/ui/SelectProviderStep.tsx @@ -4,20 +4,20 @@ import { Select } from '@inkjs/ui'; import { getProvider, providers, - type ProviderInfo, + type Provider, type ProviderName, -} from '../../../engine/providers/provider-info.js'; +} from '../../../engine/providers/provider.js'; import { colors } from '../../../theme/colors.js'; interface SelectProviderStepProps { label: string; - onSelect: (provider: ProviderInfo) => void; + onSelect: (provider: Provider) => void; } const providerItems = providers.map((p) => ({ label: p.label, value: p.name })); export function SelectProviderStep({ label, onSelect }: SelectProviderStepProps) { - const [value, setValue] = useState(); + const [value, setValue] = useState(); const handleSelect = (name: ProviderName) => { const provider = getProvider(name); diff --git a/src/config-file.ts b/src/config-file.ts index ce9ba43..c9fb911 100644 --- a/src/config-file.ts +++ b/src/config-file.ts @@ -2,7 +2,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import { z } from 'zod'; -import { providerNames } from './engine/providers/provider-info.js'; +import { providerNames } from './engine/providers/provider.js'; const LEGACY_CONFIG_FILENAME = '.airc'; const CONFIG_FILENAME = '.airc.json'; diff --git a/src/engine/providers/anthropic.ts b/src/engine/providers/anthropic.ts index 586385b..b700173 100644 --- a/src/engine/providers/anthropic.ts +++ b/src/engine/providers/anthropic.ts @@ -1,9 +1,9 @@ import { createAnthropic } from '@ai-sdk/anthropic'; import { VercelChatModelAdapter } from '@callstack/byorg-core'; import { type ProviderConfig } from './config.js'; -import type { ProviderInfo } from './provider-info.js'; +import type { Provider } from './provider.js'; -const Anthropic: ProviderInfo = { +const Anthropic: Provider = { label: 'Anthropic', name: 'anthropic', apiKeyUrl: 'https://console.anthropic.com/settings/keys', diff --git a/src/engine/providers/mistral.ts b/src/engine/providers/mistral.ts index 290a2c2..32d6214 100644 --- a/src/engine/providers/mistral.ts +++ b/src/engine/providers/mistral.ts @@ -1,8 +1,8 @@ import { createMistral } from '@ai-sdk/mistral'; import { VercelChatModelAdapter } from '@callstack/byorg-core'; -import type { ProviderInfo } from './provider-info.js'; +import type { Provider } from './provider.js'; -const Mistral: ProviderInfo = { +const Mistral: Provider = { label: 'Mistral', name: 'mistral', apiKeyUrl: 'https://console.mistral.ai/api-keys/', diff --git a/src/engine/providers/open-ai.ts b/src/engine/providers/open-ai.ts index 2917c60..35c5e5e 100644 --- a/src/engine/providers/open-ai.ts +++ b/src/engine/providers/open-ai.ts @@ -1,9 +1,9 @@ import { createOpenAI } from '@ai-sdk/openai'; import { VercelChatModelAdapter } from '@callstack/byorg-core'; import { type ProviderConfig } from './config.js'; -import type { ProviderInfo } from './provider-info.js'; +import type { Provider } from './provider.js'; -const OpenAi: ProviderInfo = { +const OpenAi: Provider = { label: 'OpenAI', name: 'openAi', apiKeyUrl: 'https://platform.openai.com/api-keys', diff --git a/src/engine/providers/perplexity.ts b/src/engine/providers/perplexity.ts index 818abe9..da795f9 100644 --- a/src/engine/providers/perplexity.ts +++ b/src/engine/providers/perplexity.ts @@ -1,8 +1,8 @@ import { createOpenAI } from '@ai-sdk/openai'; import { VercelChatModelAdapter } from '@callstack/byorg-core'; -import type { ProviderInfo } from './provider-info.js'; +import type { Provider } from './provider.js'; -const Perplexity: ProviderInfo = { +const Perplexity: Provider = { label: 'Perplexity', name: 'perplexity', apiKeyUrl: 'https://perplexity.ai/settings/api', diff --git a/src/engine/providers/provider-info.ts b/src/engine/providers/provider.ts similarity index 92% rename from src/engine/providers/provider-info.ts rename to src/engine/providers/provider.ts index 6760af4..c8b9cec 100644 --- a/src/engine/providers/provider-info.ts +++ b/src/engine/providers/provider.ts @@ -8,7 +8,7 @@ import mistral from './mistral.js'; export const providerNames = ['openAi', 'anthropic', 'perplexity', 'mistral'] as const; export type ProviderName = (typeof providerNames)[number]; -export interface ProviderInfo { +export interface Provider { name: ProviderName; label: string; apiKeyUrl: string; @@ -31,7 +31,7 @@ export interface ModelPricing { requestsCost?: number; } -const providersMap: Record = { +const providersMap: Record = { openAi, anthropic, perplexity, @@ -40,7 +40,7 @@ const providersMap: Record = { export const providers = Object.values(providersMap); -export function getProvider(providerName: ProviderName): ProviderInfo { +export function getProvider(providerName: ProviderName): Provider { const provider = providersMap[providerName]; if (!provider) { throw new Error(`Provider not found: ${providerName}.`); diff --git a/src/engine/session.ts b/src/engine/session.ts index 646a998..3b358bc 100644 --- a/src/engine/session.ts +++ b/src/engine/session.ts @@ -1,5 +1,5 @@ import type { ModelUsage } from '@callstack/byorg-core'; -import type { ModelPricing } from './providers/provider-info.js'; +import type { ModelPricing } from './providers/provider.js'; export interface SessionUsage { total: ModelUsage; From bd21077a5f3a482c7764d662fe65cef05777403e Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Tue, 5 Nov 2024 16:15:56 +0100 Subject: [PATCH 09/10] refactor: code review changes --- lefthook.yml | 35 --------------------------------- src/commands/chat/providers.tsx | 4 ++-- src/commands/chat/state/init.ts | 6 +++--- 3 files changed, 5 insertions(+), 40 deletions(-) delete mode 100644 lefthook.yml diff --git a/lefthook.yml b/lefthook.yml deleted file mode 100644 index f6e5dfe..0000000 --- a/lefthook.yml +++ /dev/null @@ -1,35 +0,0 @@ -# EXAMPLE USAGE: -# -# Refer for explanation to following link: -# https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md -# -# pre-push: -# commands: -# packages-audit: -# tags: frontend security -# run: yarn audit -# gems-audit: -# tags: backend security -# run: bundle audit -# -# pre-commit: -# parallel: true -# commands: -# eslint: -# glob: "*.{js,ts,jsx,tsx}" -# run: yarn eslint {staged_files} -# rubocop: -# tags: backend style -# glob: "*.rb" -# exclude: '(^|/)(application|routes)\.rb$' -# run: bundle exec rubocop --force-exclusion {all_files} -# govet: -# tags: backend style -# files: git ls-files -m -# glob: "*.go" -# run: go vet {files} -# scripts: -# "hello.js": -# runner: node -# "any.go": -# runner: go run diff --git a/src/commands/chat/providers.tsx b/src/commands/chat/providers.tsx index c27708d..a01ff99 100644 --- a/src/commands/chat/providers.tsx +++ b/src/commands/chat/providers.tsx @@ -16,7 +16,7 @@ export const providerOptionMapping: Record = { export const providerOptions = Object.keys(providerOptionMapping); -export function resolveProviderInfoFromOption(providerOption: string): Provider { +export function resolveProviderFromOption(providerOption: string): Provider { const provider = providerOptionMapping[providerOption]; if (!provider) { throw new Error(`Provider not found: ${providerOption}.`); @@ -25,7 +25,7 @@ export function resolveProviderInfoFromOption(providerOption: string): Provider return provider; } -export function getDefaultProviderInfo(config: ConfigFile): Provider { +export function getDefaultProvider(config: ConfigFile): Provider { const providerNames = Object.keys(config.providers) as ProviderName[]; const providerName = providerNames ? providerNames[0] : undefined; diff --git a/src/commands/chat/state/init.ts b/src/commands/chat/state/init.ts index 66a1cae..caa7d94 100644 --- a/src/commands/chat/state/init.ts +++ b/src/commands/chat/state/init.ts @@ -3,7 +3,7 @@ import { type ConfigFile } from '../../../config-file.js'; import { DEFAULT_SYSTEM_PROMPT } from '../../../default-config.js'; import type { ResponseStyle } from '../../../engine/providers/config.js'; import type { PromptOptions } from '../prompt-options.js'; -import { getDefaultProviderInfo, resolveProviderInfoFromOption } from '../providers.js'; +import { getDefaultProvider, resolveProviderFromOption } from '../providers.js'; import { filterOutApiKey, handleInputFile } from '../utils.js'; import { useChatState, type ChatMessage, type ChatState } from './state.js'; @@ -13,8 +13,8 @@ export function initChatState( initialPrompt: string, ) { const provider = options.provider - ? resolveProviderInfoFromOption(options.provider) - : getDefaultProviderInfo(configFile); + ? resolveProviderFromOption(options.provider) + : getDefaultProvider(configFile); const providerFileConfig = configFile.providers[provider.name]; if (!providerFileConfig) { From 9665dbbf401c4ab5ae4aeb065e70c4c91dbc01b5 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Tue, 5 Nov 2024 16:37:35 +0100 Subject: [PATCH 10/10] chore: fix rsbuild output --- rsbuild.config.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rsbuild.config.ts b/rsbuild.config.ts index 988aa06..57c58c5 100644 --- a/rsbuild.config.ts +++ b/rsbuild.config.ts @@ -18,6 +18,13 @@ export default defineConfig({ }, tools: { rspack: { + module: { + parser: { + javascript: { + dynamicImportMode: 'eager', + }, + }, + }, resolve: { extensionAlias: { '.js': ['.js', '.ts', '.tsx'],