diff --git a/.gitignore b/.gitignore index cdeece2..36a9598 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ packages/docs/.env.local packages/docs/.env.development.local packages/docs/.env.test.local packages/docs/.env.production.local +mcp.server.setup.json diff --git a/mycoder.config.js b/mycoder.config.js index b21d865..01663a5 100644 --- a/mycoder.config.js +++ b/mycoder.config.js @@ -16,6 +16,8 @@ export default { //provider: 'ollama', //model: 'medragondot/Sky-T1-32B-Preview:latest', //model: 'llama3.2:3b', + //provider: 'xai', + //model: 'grok-2-latest', maxTokens: 4096, temperature: 0.7, diff --git a/packages/agent/CHANGELOG.md b/packages/agent/CHANGELOG.md index 0307488..1dd90e4 100644 --- a/packages/agent/CHANGELOG.md +++ b/packages/agent/CHANGELOG.md @@ -1,10 +1,9 @@ # [mycoder-agent-v1.3.1](https://github.com/drivecore/mycoder/compare/mycoder-agent-v1.3.0...mycoder-agent-v1.3.1) (2025-03-13) - ### Bug Fixes -* redo ollama llm provider using ollama sdk ([586fe82](https://github.com/drivecore/mycoder/commit/586fe827d048aa6c13675ba838bd50309b3980e2)) -* update Ollama provider to use official npm package API correctly ([738a84a](https://github.com/drivecore/mycoder/commit/738a84aff560076e4ad24129f5dc9bf09d304ffa)) +- redo ollama llm provider using ollama sdk ([586fe82](https://github.com/drivecore/mycoder/commit/586fe827d048aa6c13675ba838bd50309b3980e2)) +- update Ollama provider to use official npm package API correctly ([738a84a](https://github.com/drivecore/mycoder/commit/738a84aff560076e4ad24129f5dc9bf09d304ffa)) # [mycoder-agent-v1.3.0](https://github.com/drivecore/mycoder/compare/mycoder-agent-v1.2.0...mycoder-agent-v1.3.0) (2025-03-12) diff --git a/packages/agent/src/core/llm/__tests__/openai.test.ts b/packages/agent/src/core/llm/__tests__/openai.test.ts index 2eaf476..0f144b9 100644 --- a/packages/agent/src/core/llm/__tests__/openai.test.ts +++ b/packages/agent/src/core/llm/__tests__/openai.test.ts @@ -69,19 +69,6 @@ describe('OpenAIProvider', () => { expect(provider.model).toBe('gpt-4'); }); - it('should throw error if API key is missing', () => { - // Clear environment variable - const originalKey = process.env.OPENAI_API_KEY; - delete process.env.OPENAI_API_KEY; - - expect(() => new OpenAIProvider('gpt-4')).toThrow( - 'OpenAI API key is required', - ); - - // Restore environment variable - process.env.OPENAI_API_KEY = originalKey; - }); - it('should generate text and handle tool calls', async () => { const response = await provider.generateText({ messages: [ diff --git a/packages/agent/src/core/llm/provider.ts b/packages/agent/src/core/llm/provider.ts index 2bb2b29..1b6e49e 100644 --- a/packages/agent/src/core/llm/provider.ts +++ b/packages/agent/src/core/llm/provider.ts @@ -35,41 +35,67 @@ export interface LLMProvider { generateText(options: GenerateOptions): Promise; } +export type ProviderConfig = { + keyName?: string; + docsUrl?: string; + baseUrl?: string; + model: string; + factory: (model: string, options: ProviderOptions) => LLMProvider; +}; + // Provider factory registry -const providerFactories: Record< - string, - (model: string, options: ProviderOptions) => LLMProvider -> = { - anthropic: (model, options) => new AnthropicProvider(model, options), - openai: (model, options) => new OpenAIProvider(model, options), - ollama: (model, options) => new OllamaProvider(model, options), +export const providerConfig: Record = { + anthropic: { + keyName: 'ANTHROPIC_API_KEY', + docsUrl: 'https://mycoder.ai/docs/provider/anthropic', + model: 'claude-3-7-sonnet-20250219', + factory: (model, options) => new AnthropicProvider(model, options), + }, + openai: { + keyName: 'OPENAI_API_KEY', + docsUrl: 'https://mycoder.ai/docs/provider/openai', + model: 'gpt-4o-2024-05-13', + factory: (model, options) => new OpenAIProvider(model, options), + }, + gpustack: { + docsUrl: 'https://mycoder.ai/docs/provider/local-openai', + model: 'llama3.2', + baseUrl: 'http://localhost:80', + factory: (model, options) => new OpenAIProvider(model, options), + }, + ollama: { + docsUrl: 'https://mycoder.ai/docs/provider/ollama', + model: 'llama3.2', + baseUrl: 'http://localhost:11434', + factory: (model, options) => new OllamaProvider(model, options), + }, + xai: { + keyName: 'XAI_API_KEY', + docsUrl: 'https://mycoder.ai/docs/provider/xai', + baseUrl: 'https://api.x.ai/v1', + model: 'grok-2-latest', + factory: (model, options) => new OpenAIProvider(model, options), + }, }; /** * Create a provider instance */ export function createProvider( - providerType: string, - model: string, + provider: string, + model?: string, options: ProviderOptions = {}, ): LLMProvider { - const factory = providerFactories[providerType.toLowerCase()]; + const config = providerConfig[provider]; - if (!factory) { + if (!config) { throw new Error( - `Provider '${providerType}' not found. Available providers: ${Object.keys(providerFactories).join(', ')}`, + `Provider '${provider}' not found. Available providers: ${Object.keys(providerConfig).join(', ')}`, ); } - return factory(model, options); -} - -/** - * Register a new provider implementation - */ -export function registerProvider( - providerType: string, - factory: (model: string, options: ProviderOptions) => LLMProvider, -): void { - providerFactories[providerType.toLowerCase()] = factory; + return config.factory(model ?? config.model, { + ...options, + baseUrl: options.baseUrl ?? config.baseUrl, + }); } diff --git a/packages/agent/src/core/llm/providers/anthropic.ts b/packages/agent/src/core/llm/providers/anthropic.ts index 718b51c..c2ad257 100644 --- a/packages/agent/src/core/llm/providers/anthropic.ts +++ b/packages/agent/src/core/llm/providers/anthropic.ts @@ -103,7 +103,7 @@ export class AnthropicProvider implements LLMProvider { constructor(model: string, options: AnthropicOptions = {}) { this.model = model; - this.apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY || ''; + this.apiKey = options.apiKey ?? ''; this.baseUrl = options.baseUrl; if (!this.apiKey) { diff --git a/packages/agent/src/core/llm/providers/ollama.ts b/packages/agent/src/core/llm/providers/ollama.ts index df9ebcb..a123527 100644 --- a/packages/agent/src/core/llm/providers/ollama.ts +++ b/packages/agent/src/core/llm/providers/ollama.ts @@ -170,7 +170,6 @@ export class OllamaProvider implements LLMProvider { } return response.message.tool_calls.map((toolCall: OllamaTooCall) => { - //console.log('ollama tool call', toolCall); return { id: `tool-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`, name: toolCall.function?.name, diff --git a/packages/agent/src/core/llm/providers/openai.ts b/packages/agent/src/core/llm/providers/openai.ts index 676f8a8..f216672 100644 --- a/packages/agent/src/core/llm/providers/openai.ts +++ b/packages/agent/src/core/llm/providers/openai.ts @@ -42,19 +42,13 @@ export class OpenAIProvider implements LLMProvider { constructor(model: string, options: OpenAIOptions = {}) { this.model = model; - this.apiKey = options.apiKey || process.env.OPENAI_API_KEY || ''; + this.apiKey = options.apiKey ?? ''; this.baseUrl = options.baseUrl; - this.organization = options.organization || process.env.OPENAI_ORGANIZATION; - - if (!this.apiKey) { - throw new Error('OpenAI API key is required'); - } // Initialize OpenAI client this.client = new OpenAI({ apiKey: this.apiKey, ...(this.baseUrl && { baseURL: this.baseUrl }), - ...(this.organization && { organization: this.organization }), }); } diff --git a/packages/agent/src/core/toolAgent/config.test.ts b/packages/agent/src/core/toolAgent/config.test.ts index 1bb5951..0a72c17 100644 --- a/packages/agent/src/core/toolAgent/config.test.ts +++ b/packages/agent/src/core/toolAgent/config.test.ts @@ -2,8 +2,6 @@ import { describe, expect, it } from 'vitest'; import { createProvider } from '../llm/provider.js'; -import { getModel } from './config.js'; - describe('createProvider', () => { it('should return the correct model for anthropic', () => { const model = createProvider('anthropic', 'claude-3-7-sonnet-20250219', { @@ -27,7 +25,7 @@ describe('createProvider', () => { }); it('should return the correct model for ollama with custom base URL', () => { - const model = getModel('ollama', 'llama3', { + const model = createProvider('ollama', 'llama3', { ollamaBaseUrl: 'http://custom-ollama:11434', }); expect(model).toBeDefined(); diff --git a/packages/agent/src/core/toolAgent/config.ts b/packages/agent/src/core/toolAgent/config.ts index 4861ed3..010ae90 100644 --- a/packages/agent/src/core/toolAgent/config.ts +++ b/packages/agent/src/core/toolAgent/config.ts @@ -2,7 +2,6 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; -import { createProvider, LLMProvider } from '../llm/provider.js'; import { ToolContext } from '../types'; /** @@ -18,34 +17,6 @@ export type AgentConfig = { getSystemPrompt: (toolContext: ToolContext) => string; }; -/** - * Get the model instance based on provider and model name - */ -export function getModel( - provider: ModelProvider, - model: string, - options?: { ollamaBaseUrl?: string }, -): LLMProvider { - switch (provider) { - case 'anthropic': - return createProvider('anthropic', model); - case 'openai': - return createProvider('openai', model); - case 'ollama': - if (options?.ollamaBaseUrl) { - return createProvider('ollama', model, { - baseUrl: options.ollamaBaseUrl, - }); - } - return createProvider('ollama', model); - /*case 'xai': - return createProvider('xai', model); - case 'mistral': - return createProvider('mistral', model);*/ - default: - throw new Error(`Unknown model provider: ${provider}`); - } -} /** * Default configuration for the tool agent */ diff --git a/packages/agent/src/core/toolAgent/toolAgentCore.ts b/packages/agent/src/core/toolAgent/toolAgentCore.ts index 057bb5a..e0773dc 100644 --- a/packages/agent/src/core/toolAgent/toolAgentCore.ts +++ b/packages/agent/src/core/toolAgent/toolAgentCore.ts @@ -47,7 +47,10 @@ export const toolAgent = async ( const systemPrompt = config.getSystemPrompt(localContext); // Create the LLM provider - const provider = createProvider(localContext.provider, localContext.model); + const provider = createProvider(localContext.provider, localContext.model, { + baseUrl: context.baseUrl, + apiKey: context.apiKey, + }); for (let i = 0; i < config.maxIterations; i++) { logger.verbose( diff --git a/packages/agent/src/core/types.ts b/packages/agent/src/core/types.ts index 0ceac3c..a0a411e 100644 --- a/packages/agent/src/core/types.ts +++ b/packages/agent/src/core/types.ts @@ -24,7 +24,9 @@ export type ToolContext = { userPrompt?: boolean; agentId?: string; // Unique identifier for the agent, used for background tool tracking provider: ModelProvider; - model: string; + model?: string; + baseUrl?: string; + apiKey?: string; maxTokens: number; temperature: number; backgroundTools: BackgroundTools; diff --git a/packages/agent/src/utils/errors.ts b/packages/agent/src/utils/errors.ts index b41d63f..aa6632f 100644 --- a/packages/agent/src/utils/errors.ts +++ b/packages/agent/src/utils/errors.ts @@ -1,27 +1,6 @@ // Provider configuration map -export const providerConfig: Record< - string, - { keyName: string; docsUrl: string } | undefined -> = { - anthropic: { - keyName: 'ANTHROPIC_API_KEY', - docsUrl: 'https://mycoder.ai/docs/getting-started/anthropic', - }, - openai: { - keyName: 'OPENAI_API_KEY', - docsUrl: 'https://mycoder.ai/docs/getting-started/openai', - }, - /*xai: { - keyName: 'XAI_API_KEY', - docsUrl: 'https://mycoder.ai/docs/getting-started/xai', - }, - mistral: { - keyName: 'MISTRAL_API_KEY', - docsUrl: 'https://mycoder.ai/docs/getting-started/mistral', - },*/ - // No API key needed for ollama as it uses a local server - ollama: undefined, -}; + +import { providerConfig } from '../core/llm/provider'; /** * Generates a provider-specific API key error message diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index f23be76..59d220c 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,9 +1,8 @@ # [mycoder-v1.3.1](https://github.com/drivecore/mycoder/compare/mycoder-v1.3.0...mycoder-v1.3.1) (2025-03-13) - ### Bug Fixes -* redo ollama llm provider using ollama sdk ([586fe82](https://github.com/drivecore/mycoder/commit/586fe827d048aa6c13675ba838bd50309b3980e2)) +- redo ollama llm provider using ollama sdk ([586fe82](https://github.com/drivecore/mycoder/commit/586fe827d048aa6c13675ba838bd50309b3980e2)) # [mycoder-v1.3.0](https://github.com/drivecore/mycoder/compare/mycoder-v1.2.0...mycoder-v1.3.0) (2025-03-12) diff --git a/packages/cli/mycoder.config.js b/packages/cli/mycoder.config.js new file mode 100644 index 0000000..0cd1cb4 --- /dev/null +++ b/packages/cli/mycoder.config.js @@ -0,0 +1,6 @@ +// mycoder.config.js +import config from '../../mycoder.config.js'; + +export default { + ...config, +}; diff --git a/packages/cli/package.json b/packages/cli/package.json index ca46f03..0e2709b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -46,8 +46,8 @@ "license": "MIT", "dependencies": { "@sentry/node": "^9.3.0", + "c12": "^3.0.2", "chalk": "^5", - "cosmiconfig": "^9.0.0", "deepmerge": "^4.3.1", "dotenv": "^16", "mycoder-agent": "workspace:*", diff --git a/packages/cli/src/commands/$default.ts b/packages/cli/src/commands/$default.ts index a74c897..d6135aa 100644 --- a/packages/cli/src/commands/$default.ts +++ b/packages/cli/src/commands/$default.ts @@ -108,35 +108,29 @@ export async function executePrompt( const providerSettings = providerConfig[config.provider as keyof typeof providerConfig]; - if (providerSettings) { - const { keyName } = providerSettings; + if (!providerSettings) { + // Unknown provider + logger.info(`Unknown provider: ${config.provider}`); + throw new Error(`Unknown provider: ${config.provider}`); + } - // First check if the API key is in the config - const configApiKey = config[keyName as keyof typeof config] as string; + const { keyName } = providerSettings; + let apiKey: string | undefined = undefined; + if (keyName) { // Then fall back to environment variable - const envApiKey = process.env[keyName]; - // Use config key if available, otherwise use env key - const apiKey = configApiKey || envApiKey; - + apiKey = process.env[keyName]; if (!apiKey) { logger.error(getProviderApiKeyError(config.provider)); throw new Error(`${config.provider} API key not found`); } + } - // If we're using a key from config, set it as an environment variable - // This ensures it's available to the provider libraries - if (configApiKey && !envApiKey) { - process.env[keyName] = configApiKey; - logger.info(`Using ${keyName} from configuration`); - } - } else if (config.provider === 'ollama') { + logger.info(`LLM: ${config.provider}/${config.model}`); + if (config.baseUrl) { // For Ollama, we check if the base URL is set - logger.info(`Using Ollama with base URL: ${config.ollamaBaseUrl}`); - } else { - // Unknown provider - logger.info(`Unknown provider: ${config.provider}`); - throw new Error(`Unknown provider: ${config.provider}`); + logger.info(`Using base url: ${config.baseUrl}`); } + console.log(); // Add the standard suffix to all prompts prompt += [ @@ -176,10 +170,12 @@ export async function executePrompt( tokenCache: config.tokenCache, userPrompt: config.userPrompt, provider: config.provider as ModelProvider, + baseUrl: config.baseUrl, model: config.model, maxTokens: config.maxTokens, temperature: config.temperature, backgroundTools, + apiKey, }); const output = @@ -216,8 +212,8 @@ export const command: CommandModule = { }, handler: async (argv) => { // Get configuration for model provider and name - const config = await loadConfig(getConfigFromArgv(argv)); - + const argvConfig = getConfigFromArgv(argv); + const config = await loadConfig(argvConfig); let prompt: string | undefined; // If promptFile is specified, read from file diff --git a/packages/cli/src/settings/config.ts b/packages/cli/src/settings/config.ts index 8e3d5ad..af564a1 100644 --- a/packages/cli/src/settings/config.ts +++ b/packages/cli/src/settings/config.ts @@ -1,4 +1,4 @@ -import { cosmiconfig } from 'cosmiconfig'; +import { loadConfig as loadC12Config, watchConfig } from 'c12'; import { ArgumentsCamelCase } from 'yargs'; import { SharedOptions } from '../options'; @@ -10,7 +10,7 @@ export type Config = { userSession: boolean; pageFilter: 'simple' | 'none' | 'readability'; provider: string; - model: string; + model?: string; maxTokens: number; temperature: number; customPrompt: string | string[]; @@ -20,7 +20,7 @@ export type Config = { upgradeCheck: boolean; tokenUsage: boolean; - ollamaBaseUrl: string; + baseUrl?: string; // MCP configuration mcp?: { @@ -65,7 +65,6 @@ const defaultConfig: Config = { // Model settings provider: 'anthropic', - model: 'claude-3-7-sonnet-20250219', maxTokens: 4096, temperature: 0.7, @@ -77,9 +76,6 @@ const defaultConfig: Config = { upgradeCheck: true, tokenUsage: false, - // Ollama configuration - ollamaBaseUrl: 'http://localhost:11434', - // MCP configuration mcp: { servers: [], @@ -107,12 +103,6 @@ export const getConfigFromArgv = (argv: ArgumentsCamelCase) => { }; }; -function removeUndefined(obj: any) { - return Object.fromEntries( - Object.entries(obj).filter(([_, value]) => value !== undefined), - ); -} - /** * Validates custom commands configuration * @param config The configuration object @@ -138,32 +128,51 @@ function validateCustomCommands(config: Config): void { }); } /** - * Load configuration using cosmiconfig + * Load configuration using c12 * @returns Merged configuration with default values */ export async function loadConfig( cliOptions: Partial = {}, ): Promise { - // Initialize cosmiconfig - const explorer = cosmiconfig('mycoder', { - searchStrategy: 'global', + const { config } = await loadC12Config({ + name: 'mycoder', + defaults: defaultConfig, + overrides: cliOptions, + globalRc: true, }); - // Search for configuration file - const result = await explorer.search(); + // Convert to Config type and validate custom commands + const typedConfig = config as unknown as Config; + validateCustomCommands(typedConfig); - // Merge configurations with precedence: default < file < cli - const fileConfig = result?.config || {}; - - // Return merged configuration - const mergedConfig = { - ...defaultConfig, - ...removeUndefined(fileConfig), - ...removeUndefined(cliOptions), - }; + return typedConfig; +} - // Validate custom commands if present - validateCustomCommands(mergedConfig); +/** + * Watch configuration for changes + * @param cliOptions CLI options to override configuration + * @param onUpdate Callback when configuration is updated + */ +export async function watchConfigForChanges( + cliOptions: Partial = {}, + onUpdate?: (config: Config) => void, +) { + const { config, watchingFiles, unwatch } = await watchConfig({ + name: 'mycoder', + defaults: defaultConfig, + overrides: cliOptions, + onUpdate: ({ newConfig }) => { + const typedConfig = newConfig as unknown as Config; + validateCustomCommands(typedConfig); + if (onUpdate) { + onUpdate(typedConfig); + } + }, + }); - return mergedConfig; + return { + config: config as unknown as Config, + watchingFiles, + unwatch, + }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 94fa961..2146e50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -154,12 +154,12 @@ importers: '@sentry/node': specifier: ^9.3.0 version: 9.5.0 + c12: + specifier: ^3.0.2 + version: 3.0.2 chalk: specifier: ^5 version: 5.4.1 - cosmiconfig: - specifier: ^9.0.0 - version: 9.0.0(typescript@5.8.2) deepmerge: specifier: ^4.3.1 version: 4.3.1 @@ -3009,6 +3009,14 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c12@3.0.2: + resolution: {integrity: sha512-6Tzk1/TNeI3WBPpK0j/Ss4+gPj3PUJYbWl/MWDJBThFvwNGNkXtd7Cz8BJtD4aRwoGHtzQD0SnxamgUiBH0/Nw==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -3111,6 +3119,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -3119,6 +3131,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} @@ -3268,6 +3283,12 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.1: + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -3657,6 +3678,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + del@6.1.1: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} @@ -3677,6 +3701,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4135,6 +4162,9 @@ packages: resolution: {integrity: sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==} engines: {node: '>= 18'} + exsolve@1.0.4: + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -4444,6 +4474,10 @@ packages: get-tsconfig@4.10.0: resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + git-log-parser@1.2.1: resolution: {integrity: sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==} @@ -5846,6 +5880,9 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -5986,6 +6023,11 @@ packages: nwsapi@2.2.18: resolution: {integrity: sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==} + nypm@0.6.0: + resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -6017,6 +6059,9 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + ollama@0.5.14: resolution: {integrity: sha512-pvOuEYa2WkkAumxzJP0RdEYHkbZ64AYyyUszXVX7ruLvk5L+EiO2G71da2GqEQ4IAk4j6eLoUbGk5arzFT1wJA==} @@ -6296,6 +6341,9 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -6339,6 +6387,9 @@ packages: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} @@ -6881,6 +6932,9 @@ packages: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -6968,6 +7022,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + reading-time@1.5.0: resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} @@ -12277,6 +12335,21 @@ snapshots: bytes@3.1.2: {} + c12@3.0.2: + dependencies: + chokidar: 4.0.3 + confbox: 0.1.8 + defu: 6.1.4 + dotenv: 16.4.7 + exsolve: 1.0.4 + giget: 2.0.0 + jiti: 2.4.2 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.1.0 + rc9: 2.1.2 + cac@6.7.14: {} cacheable-lookup@7.0.0: {} @@ -12398,10 +12471,18 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chrome-trace-event@1.0.4: {} ci-info@3.9.0: {} + citty@0.1.6: + dependencies: + consola: 3.4.0 + cjs-module-lexer@1.4.3: {} clean-css@5.3.3: @@ -12555,6 +12636,10 @@ snapshots: concat-map@0.0.1: {} + confbox@0.1.8: {} + + confbox@0.2.1: {} + config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -12946,6 +13031,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defu@6.1.4: {} + del@6.1.1: dependencies: globby: 11.1.0 @@ -12965,6 +13052,8 @@ snapshots: dequal@2.0.3: {} + destr@2.0.3: {} + destroy@1.2.0: {} detect-file@1.0.0: {} @@ -13603,6 +13692,8 @@ snapshots: transitivePeerDependencies: - supports-color + exsolve@1.0.4: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -13922,6 +14013,15 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + giget@2.0.0: + dependencies: + citty: 0.1.6 + consola: 3.4.0 + defu: 6.1.4 + node-fetch-native: 1.6.6 + nypm: 0.6.0 + pathe: 2.0.3 + git-log-parser@1.2.1: dependencies: argv-formatter: 1.0.0 @@ -15677,6 +15777,8 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 + node-fetch-native@1.6.6: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -15739,6 +15841,14 @@ snapshots: nwsapi@2.2.18: {} + nypm@0.6.0: + dependencies: + citty: 0.1.6 + consola: 3.4.0 + pathe: 2.0.3 + pkg-types: 2.1.0 + tinyexec: 0.3.2 + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -15776,6 +15886,8 @@ snapshots: obuf@1.1.2: {} + ohash@2.0.11: {} + ollama@0.5.14: dependencies: whatwg-fetch: 3.6.20 @@ -16045,6 +16157,8 @@ snapshots: pathval@2.0.0: {} + perfect-debounce@1.0.0: {} + pg-int8@1.0.1: {} pg-protocol@1.8.0: {} @@ -16078,6 +16192,12 @@ snapshots: dependencies: find-up: 6.3.0 + pkg-types@2.1.0: + dependencies: + confbox: 0.2.1 + exsolve: 1.0.4 + pathe: 2.0.3 + pkg-up@3.1.0: dependencies: find-up: 3.0.0 @@ -16646,6 +16766,11 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.3 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -16783,6 +16908,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + reading-time@1.5.0: {} rechoir@0.6.2: